summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2011-02-23 15:01:26 +0000
committerLars Wirzenius <liw@liw.fi>2011-02-23 15:01:26 +0000
commit678c1be35b6cb7a33def6389351157b1aa010822 (patch)
treee17210a5daf74548333af402b4231e105cf2be23
parent6849f2a2ce7c12cb55a64b93775704a2f491817e (diff)
downloadlarch-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__.py2
-rw-r--r--btree/forest.py55
-rw-r--r--btree/forest_tests.py33
-rw-r--r--btree/nodestore_disk.py3
-rw-r--r--btree/nodestore_disk_tests.py4
-rw-r--r--example.py2
-rwxr-xr-xfsck-btree2
-rwxr-xr-xinsert-remove-test2
-rwxr-xr-xspeed-test2
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')
diff --git a/example.py b/example.py
index 9feb5e3..eae007f 100644
--- a/example.py
+++ b/example.py
@@ -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]
diff --git a/fsck-btree b/fsck-btree
index 9e4c144..c7b50b0 100755
--- a/fsck-btree
+++ b/fsck-btree
@@ -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()
diff --git a/speed-test b/speed-test
index b14b95c..599ed18 100755
--- a/speed-test
+++ b/speed-test
@@ -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()