bridge multiget

main
Ziyang Hu 2 years ago
parent aa93ec2e30
commit 517756e087

@ -17,4 +17,52 @@ BridgeStatus IteratorBridge::status() const {
BridgeStatus s; BridgeStatus s;
write_status(inner->status(), s); write_status(inner->status(), s);
return s; return s;
}
unique_ptr<vector<PinnableSlice>> TransactionBridge::multiget_txn(
const ColumnFamilyHandle &cf,
rust::Slice<const rust::Slice<const uint8_t>> keys,
rust::Slice<BridgeStatus> statuses) const {
auto cpp_keys = vector<Slice>();
cpp_keys.reserve(keys.size());
for (auto key: keys) {
auto cpp_key = convert_slice(key);
cpp_keys.push_back(cpp_key);
}
auto ret = make_unique<vector<PinnableSlice>>(keys.size());
auto cpp_statuses = vector<Status>(keys.size());
inner->MultiGet(*r_ops,
const_cast<ColumnFamilyHandle *>(&cf),
keys.size(),
cpp_keys.data(),
ret->data(),
cpp_statuses.data());
for (size_t i = 0; i < cpp_statuses.size(); ++i) {
write_status(std::move(cpp_statuses[i]), statuses[i]);
}
return ret;
}
unique_ptr<vector<PinnableSlice>> TransactionBridge::multiget_raw(
const ColumnFamilyHandle &cf,
rust::Slice<const rust::Slice<const uint8_t>> keys,
rust::Slice<BridgeStatus> statuses) const {
auto cpp_keys = vector<Slice>();
cpp_keys.reserve(keys.size());
for (auto key: keys) {
auto cpp_key = convert_slice(key);
cpp_keys.push_back(cpp_key);
}
auto ret = make_unique<vector<PinnableSlice>>(keys.size());
auto cpp_statuses = vector<Status>(keys.size());
raw_db->MultiGet(*r_ops,
const_cast<ColumnFamilyHandle *>(&cf),
keys.size(),
cpp_keys.data(),
ret->data(),
cpp_statuses.data());
for (size_t i = 0; i < cpp_statuses.size(); ++i) {
write_status(std::move(cpp_statuses[i]), statuses[i]);
}
return ret;
} }

@ -251,7 +251,18 @@ struct TransactionBridge {
write_status(inner->PopSavePoint(), status); write_status(inner->PopSavePoint(), status);
} }
inline std::unique_ptr<PinnableSlice> get_txn( unique_ptr<vector<PinnableSlice>> multiget_txn(
const ColumnFamilyHandle &cf,
rust::Slice<const rust::Slice<const uint8_t>> keys,
rust::Slice<BridgeStatus> statuses) const;
unique_ptr<vector<PinnableSlice>> multiget_raw(
const ColumnFamilyHandle &cf,
rust::Slice<const rust::Slice<const uint8_t>> keys,
rust::Slice<BridgeStatus> statuses) const;
inline unique_ptr<PinnableSlice> get_txn(
const ColumnFamilyHandle &cf, const ColumnFamilyHandle &cf,
rust::Slice<const uint8_t> key, rust::Slice<const uint8_t> key,
BridgeStatus &status BridgeStatus &status
@ -267,7 +278,7 @@ struct TransactionBridge {
return pinnable_val; return pinnable_val;
} }
inline std::unique_ptr<PinnableSlice> get_for_update_txn( inline unique_ptr<PinnableSlice> get_for_update_txn(
const ColumnFamilyHandle &cf, const ColumnFamilyHandle &cf,
rust::Slice<const uint8_t> key, rust::Slice<const uint8_t> key,
BridgeStatus &status BridgeStatus &status

@ -150,6 +150,10 @@ mod ffi {
fn flush_raw(self: &TransactionBridge, cf: &ColumnFamilyHandle, options: &FlushOptions, status: &mut BridgeStatus); fn flush_raw(self: &TransactionBridge, cf: &ColumnFamilyHandle, options: &FlushOptions, status: &mut BridgeStatus);
fn iterator_txn(self: &TransactionBridge, cf: &ColumnFamilyHandle) -> UniquePtr<IteratorBridge>; fn iterator_txn(self: &TransactionBridge, cf: &ColumnFamilyHandle) -> UniquePtr<IteratorBridge>;
fn iterator_raw(self: &TransactionBridge, cf: &ColumnFamilyHandle) -> UniquePtr<IteratorBridge>; fn iterator_raw(self: &TransactionBridge, cf: &ColumnFamilyHandle) -> UniquePtr<IteratorBridge>;
fn multiget_txn(self: &TransactionBridge, cf: &ColumnFamilyHandle,
keys: &[&[u8]], statuses: &mut [BridgeStatus]) -> UniquePtr<CxxVector<PinnableSlice>>;
fn multiget_raw(self: &TransactionBridge, cf: &ColumnFamilyHandle,
keys: &[&[u8]], statuses: &mut [BridgeStatus]) -> UniquePtr<CxxVector<PinnableSlice>>;
pub type ColumnFamilyHandle; pub type ColumnFamilyHandle;

Loading…
Cancel
Save