sapling/eden/scm/lib/revisionstore/RevisionStore.cpp
Adam Simpkins 46890ae1ec Merge fb-mercurial sources into the eden repository
Summary:
Merge the fb-mercurial code into the Eden repository, under the
`eden/scm` subdirectory.

Reviewed By: quark-zju

Differential Revision: D18445774

fbshipit-source-id: fc3307f9937e0c7e1c8f7d03c5102c4fe5dedb10
2019-11-13 20:20:32 -08:00

104 lines
3.0 KiB
C++

/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This software may be used and distributed according to the terms of the
* GNU General Public License version 2.
*/
#include "RevisionStore.h"
using namespace facebook::eden;
// The following functions are exported from this rust library:
// @dep=//eden/scm/lib/revisionstore:revisionstore
namespace {
struct ByteData {
const uint8_t* ptr;
size_t len;
};
struct GetData {
RevisionStoreByteVecStruct* value;
RevisionStoreStringStruct* error;
bool is_key_error;
};
} // namespace
extern "C" DataPackUnionStruct* revisionstore_datapackunion_new(
const char* const paths[],
size_t num_paths) noexcept;
extern "C" void revisionstore_datapackunion_free(
DataPackUnionStruct* store) noexcept;
extern "C" GetData revisionstore_datapackunion_get(
DataPackUnionStruct* store,
const uint8_t* name,
size_t name_len,
const uint8_t* hgid,
size_t hgid_len) noexcept;
extern "C" void revisionstore_string_free(
RevisionStoreStringStruct* str) noexcept;
extern "C" ByteData revisionstore_string_data(
RevisionStoreStringStruct* str) noexcept;
extern "C" void revisionstore_bytevec_free(
RevisionStoreByteVecStruct* bytes) noexcept;
extern "C" ByteData revisionstore_bytevec_data(
RevisionStoreByteVecStruct* bytes) noexcept;
namespace facebook {
namespace eden {
void DataPackUnion::Deleter::operator()(DataPackUnionStruct* ptr) const
noexcept {
revisionstore_datapackunion_free(ptr);
}
DataPackUnion::DataPackUnion(const char* const paths[], size_t num_paths)
: store_(revisionstore_datapackunion_new(paths, num_paths)) {}
folly::Optional<RevisionStoreByteVec> DataPackUnion::get(
folly::ByteRange name,
folly::ByteRange hgid) {
// This implementation is strongly coupled to that of
// revisionstore_datapackunion_get in eden/scm/lib/revisionstore/src/c_api.rs
auto got = revisionstore_datapackunion_get(
store_.get(), name.data(), name.size(), hgid.data(), hgid.size());
if (got.value) {
return RevisionStoreByteVec(got.value);
}
if (got.is_key_error) {
return folly::none;
}
RevisionStoreString error(got.error);
throw DataPackUnionGetError(error.stringPiece().str());
}
RevisionStoreString::RevisionStoreString(RevisionStoreStringStruct* ptr)
: ptr_(ptr) {}
void RevisionStoreString::Deleter::operator()(
RevisionStoreStringStruct* ptr) const noexcept {
revisionstore_string_free(ptr);
}
folly::StringPiece RevisionStoreString::stringPiece() const noexcept {
auto data = revisionstore_string_data(ptr_.get());
return folly::StringPiece(reinterpret_cast<const char*>(data.ptr), data.len);
}
RevisionStoreByteVec::RevisionStoreByteVec(RevisionStoreByteVecStruct* ptr)
: ptr_(ptr) {}
void RevisionStoreByteVec::Deleter::operator()(
RevisionStoreByteVecStruct* ptr) const noexcept {
revisionstore_bytevec_free(ptr);
}
folly::ByteRange RevisionStoreByteVec::bytes() const noexcept {
auto data = revisionstore_bytevec_data(ptr_.get());
return folly::ByteRange(data.ptr, data.len);
}
} // namespace eden
} // namespace facebook