diff options
author | Lars Wirzenius <liw@liw.fi> | 2011-02-23 15:01:26 +0000 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2011-02-23 15:01:26 +0000 |
commit | 678c1be35b6cb7a33def6389351157b1aa010822 (patch) | |
tree | e17210a5daf74548333af402b4231e105cf2be23 | |
parent | 6849f2a2ce7c12cb55a64b93775704a2f491817e (diff) | |
download | larch-678c1be35b6cb7a33def6389351157b1aa010822.tar.gz |
Change the forest factory to be a function, instead.
No point in a class, since every call needs all parameters
anyway.
-rw-r--r-- | btree/__init__.py | 2 | ||||
-rw-r--r-- | btree/forest.py | 55 | ||||
-rw-r--r-- | btree/forest_tests.py | 33 | ||||
-rw-r--r-- | btree/nodestore_disk.py | 3 | ||||
-rw-r--r-- | btree/nodestore_disk_tests.py | 4 | ||||
-rw-r--r-- | example.py | 2 | ||||
-rwxr-xr-x | fsck-btree | 2 | ||||
-rwxr-xr-x | insert-remove-test | 2 | ||||
-rwxr-xr-x | speed-test | 2 |
9 files changed, 80 insertions, 25 deletions
diff --git a/btree/__init__.py b/btree/__init__.py index 7da1e5a..313c84d 100644 --- a/btree/__init__.py +++ b/btree/__init__.py @@ -20,7 +20,7 @@ version = '0.18' from nodes import FrozenNode, LeafNode, IndexNode from codec import NodeCodec, CodecError from tree import BTree, KeySizeMismatch, ValueTooLarge -from forest import Forest, ForestFactory +from forest import Forest, open_forest, BadKeySize, BadNodeSize from nodestore import (NodeStore, NodeStoreTests, NodeMissing, NodeTooBig, NodeExists, NodeCannotBeModified) from refcountstore import RefcountStore diff --git a/btree/forest.py b/btree/forest.py index 055ce98..8fcf4fe 100644 --- a/btree/forest.py +++ b/btree/forest.py @@ -17,6 +17,26 @@ import btree +class BadKeySize(Exception): + + def __init__(self, store_key_size, wanted_key_size): + self.msg = ('Node store has key size %s, program wanted %s' % + (store_key_size, wanted_key_size)) + + def __str__(self): + return self.msg + + +class BadNodeSize(Exception): + + def __init__(self, store_node_size, wanted_node_size): + self.msg = ('Node store has node size %s, program wanted %s' % + (store_node_size, wanted_node_size)) + + def __str__(self): + return self.msg + + class Forest(object): '''A collection of BTrees in the same node store.''' @@ -85,20 +105,27 @@ class Forest(object): self.node_store.save_refcounts() +def open_forest(key_size=None, node_size=None, codec=None, node_store=None, + **kwargs): + '''Create a new Factory instance. + + key_size, node_size must be given with every call. + codec is the class to be used for the node codec, defaults to + btree.NodeCodec. Similarly, node_store is the node store class, + defaults to btree.NodeStoreDisk. + + All other keyword arguments are given the thoe node_store + class initializer. + + ''' -class ForestFactory(object): + assert key_size is not None + assert node_size is not None - '''Create new Forest objects.''' - - def __init__(self, codec=None, node_store=None): - assert codec != None - assert node_store != None - - self.codec = codec - self.node_store = node_store - - def new(self, key_size, node_size): - codec = self.codec(key_size) - ns = self.node_store(node_size, codec) - return Forest(ns) + codec = codec or btree.NodeCodec + node_store = node_store or btree.NodeStoreDisk + + c = codec(key_size) + ns = node_store(node_size, c, **kwargs) + return Forest(ns) diff --git a/btree/forest_tests.py b/btree/forest_tests.py index 90e7e07..c2127cb 100644 --- a/btree/forest_tests.py +++ b/btree/forest_tests.py @@ -14,6 +14,8 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. +import shutil +import tempfile import unittest import btree @@ -123,11 +125,36 @@ class ForestFactoryTests(unittest.TestCase): def setUp(self): self.key_size = 3 self.node_size = 64 - self.factory = btree.ForestFactory(codec=btree.NodeCodec, - node_store=btree.NodeStoreMemory) + self.tempdir = tempfile.mkdtemp() + + def tearDown(self): + shutil.rmtree(self.tempdir) def test_creates_new_forest(self): - f = self.factory.new(self.key_size, self.node_size) + f = btree.open_forest(key_size=self.key_size, node_size=self.node_size, + dirname=self.tempdir) self.assertEqual(f.node_store.codec.key_bytes, self.key_size) self.assertEqual(f.node_store.node_size, self.node_size) + def test_fail_if_existing_tree_has_incompatible_key_size(self): + f = btree.open_forest(key_size=self.key_size, node_size=self.node_size, + dirname=self.tempdir) + f.commit() + + self.assertRaises(btree.BadNodeSize, + btree.open_forest, + key_size=self.key_size + 1, + node_size=self.node_size, + dirname=self.tempdir) + + def test_fail_if_existing_tree_has_incompatible_node_size(self): + f = btree.open_forest(key_size=self.key_size, node_size=self.node_size, + dirname=self.tempdir) + f.commit() + + self.assertRaises(btree.BadNodeSize, + btree.open_forest, + key_size=self.key_size, + node_size=self.node_size + 1, + dirname=self.tempdir) + diff --git a/btree/nodestore_disk.py b/btree/nodestore_disk.py index 801f10f..01ce88f 100644 --- a/btree/nodestore_disk.py +++ b/btree/nodestore_disk.py @@ -74,8 +74,9 @@ class NodeStoreDisk(btree.NodeStore): nodedir = 'nodes' - def __init__(self, dirname, node_size, codec, upload_max=1024, + def __init__(self, node_size, codec, dirname=None, upload_max=1024, lru_size=100, vfs=None): + assert dirname is not None btree.NodeStore.__init__(self, node_size, codec) self.dirname = dirname self.metadata_name = os.path.join(dirname, 'metadata') diff --git a/btree/nodestore_disk_tests.py b/btree/nodestore_disk_tests.py index 9aabfe4..63d54bc 100644 --- a/btree/nodestore_disk_tests.py +++ b/btree/nodestore_disk_tests.py @@ -36,8 +36,8 @@ class NodeStoreDiskTests(unittest.TestCase, btree.NodeStoreTests): shutil.rmtree(self.tempdir) def new_ns(self): - return nodestore_disk.NodeStoreDisk(self.tempdir, self.node_size, - self.codec) + return nodestore_disk.NodeStoreDisk(self.node_size, self.codec, + dirname=self.tempdir) def test_has_persistent_metadata(self): self.ns.set_metadata('foo', 'bar') @@ -38,7 +38,7 @@ def open_tree(dirname): node_size = 4096 codec = btree.NodeCodec(key_size) - ns = btree.NodeStoreDisk(dirname, node_size, codec) + ns = btree.NodeStoreDisk(node_size, codec, dirname=dirname) forest = btree.Forest(ns) if forest.trees: tree = forest.trees[0] @@ -32,7 +32,7 @@ class BtreeFsck(object): self.node_size = node_size self.key_size = key_size codec = btree.NodeCodec(key_size) - self.ns = btree.NodeStoreDisk(dirname, node_size, codec) + self.ns = btree.NodeStoreDisk(node_size, codec, dirname=dirname) self.minkey = '\x00' * key_size self.maxkey = '\xff' * key_size diff --git a/insert-remove-test b/insert-remove-test index 3f81c73..b88b016 100755 --- a/insert-remove-test +++ b/insert-remove-test @@ -95,7 +95,7 @@ def main(): if os.path.exists(location): raise Exception('%s exists already' % location) os.mkdir(location) - ns = btree.NodeStoreDisk(location, node_size, codec) + ns = btree.NodeStoreDisk(node_size, codec, dirname=location) forest = btree.Forest(ns) tree = forest.new_tree() @@ -74,7 +74,7 @@ class SpeedTest(cliapp.Application): if os.path.exists(location): raise Exception('%s exists already' % location) os.mkdir(location) - ns = btree.NodeStoreDisk(location, node_size, codec) + ns = btree.NodeStoreDisk(node_size, codec, dirname=location) forest = btree.Forest(ns) tree = forest.new_tree() |