// Copyright (c) 2015, Facebook, Inc. All rights reserved. // This source code is licensed under the BSD-style license found in the // LICENSE file in the root directory of this source tree. An additional grant // of patent rights can be found in the PATENTS file in the same directory. #pragma once #ifndef ROCKSDB_LITE #include #include #include "rocksdb/db.h" #include "rocksdb/slice.h" #include "rocksdb/status.h" #include "rocksdb/types.h" namespace rocksdb { using TransactionKeyMap = std::unordered_map>; class DBImpl; struct SuperVersion; class WriteBatchWithIndex; class TransactionUtil { public: // Verifies there have been no writes to this key in the db since this // sequence number. // // Returns OK on success, BUSY if there is a conflicting write, or other error // status for any unexpected errors. static Status CheckKeyForConflicts(DBImpl* db_impl, ColumnFamilyHandle* column_family, const std::string& key, SequenceNumber key_seq); // For each key,SequenceNumber pair in the TransactionKeyMap, this function // will verify there have been no writes to the key in the db since that // sequence number. // // Returns OK on success, BUSY if there is a conflicting write, or other error // status for any unexpected errors. // // REQUIRED: this function should only be called on the write thread or if the // mutex is held. static Status CheckKeysForConflicts(DBImpl* db_impl, TransactionKeyMap* keys); // Copies the first num entries from batch into new_batch (including Put, // Merge, Delete, and PutLogData). // Returns non-OK on error. static Status CopyFirstN(size_t num, WriteBatchWithIndex* batch, WriteBatchWithIndex* new_batch, DBImpl* db_impl); private: static Status CheckKey(DBImpl* db_impl, SuperVersion* sv, SequenceNumber earliest_seq, SequenceNumber key_seq, const std::string& key); }; } // namespace rocksdb #endif // ROCKSDB_LITE