diff --git a/rocksdb/_rocksdb.pyx b/rocksdb/_rocksdb.pyx index c72e826388b0e29a4d80c7e5d0cd2b70c5cf6c43..95422fcd1cd61503d3ee90543ded7e7c62f501b5 100644 --- a/rocksdb/_rocksdb.pyx +++ b/rocksdb/_rocksdb.pyx @@ -708,6 +708,7 @@ cdef class Options(object): cdef PySliceTransform py_prefix_extractor cdef PyTableFactory py_table_factory cdef PyMemtableFactory py_memtable_factory + cdef PyCache py_row_cache # Used to protect sharing of Options with many DB-objects cdef cpp_bool in_use @@ -727,6 +728,7 @@ cdef class Options(object): self.py_prefix_extractor = None self.py_table_factory = None self.py_memtable_factory = None + self.py_row_cache = None for key, value in kwargs.items(): setattr(self, key, value) @@ -1210,6 +1212,21 @@ cdef class Options(object): self.py_prefix_extractor = PySliceTransform(value) self.opts.prefix_extractor = self.py_prefix_extractor.get_transformer() + property row_cache: + def __get__(self): + return self.py_row_cache + + def __set__(self, value): + if value is None: + self.py_row_cache = None + self.opts.row_cache.reset() + elif not isinstance(value, PyCache): + raise Exception("row_cache must be a Cache object") + else: + self.py_row_cache = value + self.opts.row_cache = self.py_row_cache.get_cache() + + # Forward declaration cdef class Snapshot diff --git a/rocksdb/options.pxd b/rocksdb/options.pxd index ea1daafa848fff944e4a6df04a78b50353de4af3..aa404d18342b359162e16e55ce6d5b745c1cf2d2 100644 --- a/rocksdb/options.pxd +++ b/rocksdb/options.pxd @@ -13,6 +13,7 @@ from slice_transform cimport SliceTransform from table_factory cimport TableFactory from memtablerep cimport MemTableRepFactory from universal_compaction cimport CompactionOptionsUniversal +from cache cimport Cache cdef extern from "rocksdb/options.h" namespace "rocksdb": ctypedef enum CompactionStyle: @@ -105,6 +106,7 @@ cdef extern from "rocksdb/options.h" namespace "rocksdb": # TODO: table_properties_collectors cpp_bool inplace_update_support size_t inplace_update_num_locks + shared_ptr[Cache] row_cache cdef cppclass WriteOptions: cpp_bool sync diff --git a/rocksdb/tests/test_options.py b/rocksdb/tests/test_options.py index ce2ae527149bcd8a46cf9897ac127b9728be6e88..0f2c6d8d215e7b51ff518c435bd4ec3dc09904c2 100644 --- a/rocksdb/tests/test_options.py +++ b/rocksdb/tests/test_options.py @@ -96,3 +96,9 @@ class TestOptions(unittest.TestCase): self.assertEqual(1, uopts['size_ratio']) self.assertEqual(2, uopts['min_merge_width']) self.assertEqual(30, uopts['max_merge_width']) + + def test_row_cache(self): + opts = rocksdb.Options() + self.assertIsNone(opts.row_cache) + opts.row_cache = cache = rocksdb.LRUCache(2*1024*1024) + self.assertEqual(cache, opts.row_cache)