summaryrefslogtreecommitdiff
path: root/src/mongo/db/fle_crud.h
diff options
context:
space:
mode:
authorDavis Haupt <davis.haupt@mongodb.com>2022-03-25 13:43:47 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-03-25 21:25:59 +0000
commit813a7505005437427abe011a530f003acd2e3b76 (patch)
tree468014200b8119e067f28018848ccc0c51a92b37 /src/mongo/db/fle_crud.h
parent9895fb7f4a6d4bd442d8a30e86984bcefa45e3cf (diff)
downloadmongo-813a7505005437427abe011a530f003acd2e3b76.tar.gz
SERVER-64356 Server-side rewrite for find command on mongos
Diffstat (limited to 'src/mongo/db/fle_crud.h')
-rw-r--r--src/mongo/db/fle_crud.h60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/mongo/db/fle_crud.h b/src/mongo/db/fle_crud.h
index 37eeaaf96b9..6a683e860e6 100644
--- a/src/mongo/db/fle_crud.h
+++ b/src/mongo/db/fle_crud.h
@@ -166,6 +166,66 @@ public:
const EncryptionInformation& ei,
const write_ops::FindAndModifyCommandRequest& findAndModifyRequest) = 0;
};
+/**
+ * Implementation of the FLE Query interface that exposes the DB operations needed for FLE 2
+ * server-side work.
+ */
+class FLEQueryInterfaceImpl : public FLEQueryInterface {
+public:
+ FLEQueryInterfaceImpl(const txn_api::TransactionClient& txnClient) : _txnClient(txnClient) {}
+
+ BSONObj getById(const NamespaceString& nss, BSONElement element) final;
+
+ uint64_t countDocuments(const NamespaceString& nss) final;
+
+ StatusWith<write_ops::InsertCommandReply> insertDocument(const NamespaceString& nss,
+ BSONObj obj,
+ bool translateDuplicateKey) final;
+
+ std::pair<write_ops::DeleteCommandReply, BSONObj> deleteWithPreimage(
+ const NamespaceString& nss,
+ const EncryptionInformation& ei,
+ const write_ops::DeleteCommandRequest& deleteRequest) final;
+
+ std::pair<write_ops::UpdateCommandReply, BSONObj> updateWithPreimage(
+ const NamespaceString& nss,
+ const EncryptionInformation& ei,
+ const write_ops::UpdateCommandRequest& updateRequest) final;
+
+ write_ops::FindAndModifyCommandReply findAndModify(
+ const NamespaceString& nss,
+ const EncryptionInformation& ei,
+ const write_ops::FindAndModifyCommandRequest& findAndModifyRequest) final;
+
+private:
+ const txn_api::TransactionClient& _txnClient;
+};
+
+/**
+ * Implementation of FLEStateCollectionReader for txn_api::TransactionClient
+ *
+ * Document count is cached since we only need it once per esc or ecc collection.
+ */
+class TxnCollectionReader : public FLEStateCollectionReader {
+public:
+ TxnCollectionReader(uint64_t count, FLEQueryInterface* queryImpl, const NamespaceString& nss)
+ : _count(count), _queryImpl(queryImpl), _nss(nss) {}
+
+ uint64_t getDocumentCount() const override {
+ return _count;
+ }
+
+ BSONObj getById(PrfBlock block) const override {
+ auto doc = BSON("v" << BSONBinData(block.data(), block.size(), BinDataGeneral));
+ BSONElement element = doc.firstElement();
+ return _queryImpl->getById(_nss, element);
+ }
+
+private:
+ uint64_t _count;
+ FLEQueryInterface* _queryImpl;
+ NamespaceString _nss;
+};
/**
* Process a FLE insert with the query interface