summaryrefslogtreecommitdiff
path: root/larch
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2012-05-05 12:28:26 +0100
committerLars Wirzenius <liw@liw.fi>2012-05-05 12:28:26 +0100
commit045fafc02508d1c7ff1c7a8f37f254ccf024f149 (patch)
tree6f06dc1767c100cc0fc63ff2a6dbbd5a8f330107 /larch
parente179c9bef79e1dea2cbe29f8f9ec3ff441f68e7d (diff)
downloadlarch-045fafc02508d1c7ff1c7a8f37f254ccf024f149.tar.gz
Raise exceptions if key or node size is missing from metadata
Diffstat (limited to 'larch')
-rw-r--r--larch/__init__.py3
-rw-r--r--larch/forest.py17
-rw-r--r--larch/forest_tests.py19
3 files changed, 35 insertions, 4 deletions
diff --git a/larch/__init__.py b/larch/__init__.py
index 91fa40f..1c8d274 100644
--- a/larch/__init__.py
+++ b/larch/__init__.py
@@ -20,7 +20,8 @@ __version__ = '0.30'
from nodes import FrozenNode, Node, LeafNode, IndexNode
from codec import NodeCodec, CodecError
from tree import BTree, KeySizeMismatch, ValueTooLarge
-from forest import Forest, open_forest, BadKeySize, BadNodeSize
+from forest import (Forest, open_forest, BadKeySize, BadNodeSize,
+ MetadataMissingKey)
from nodestore import (NodeStore, NodeStoreTests, NodeMissing, NodeTooBig,
NodeExists, NodeCannotBeModified)
from refcountstore import RefcountStore
diff --git a/larch/forest.py b/larch/forest.py
index 881fb86..2443da1 100644
--- a/larch/forest.py
+++ b/larch/forest.py
@@ -19,6 +19,15 @@ import tracing
import larch
+class MetadataMissingKey(Exception):
+
+ def __init__(self, key_name):
+ self.msg = 'larch forest metadata missing "%s"' % key_name
+
+ def __str__(self): # pragma: no cover
+ return self.msg
+
+
class BadKeySize(Exception):
'''Exception for a bad key size.'''
@@ -179,9 +188,11 @@ def open_forest(allow_writes=None, key_size=None, node_size=None, codec=None,
# since we won't be accessing nodes or keys.
c_temp = codec(42)
ns_temp = node_store(False, 42, c_temp, **kwargs)
-
- assert 'key_size' in ns_temp.get_metadata_keys()
- assert 'node_size' in ns_temp.get_metadata_keys()
+
+ if 'key_size' not in ns_temp.get_metadata_keys():
+ raise MetadataMissingKey('key_size')
+ if 'node_size' not in ns_temp.get_metadata_keys():
+ raise MetadataMissingKey('node_size')
if key_size is None:
key_size = int(ns_temp.get_metadata('key_size'))
diff --git a/larch/forest_tests.py b/larch/forest_tests.py
index 7603b86..9a786bd 100644
--- a/larch/forest_tests.py
+++ b/larch/forest_tests.py
@@ -14,6 +14,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+import os
import shutil
import tempfile
import unittest
@@ -136,6 +137,24 @@ class OpenForestTests(unittest.TestCase):
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_metadata_missing_key_size(self):
+ with open(os.path.join(self.tempdir, 'metadata'), 'w') as f:
+ f.write('[metadata]\n')
+ f.write('format=1/1\n')
+ f.write('node_size=%s\n' % self.node_size)
+ self.assertRaises(larch.MetadataMissingKey, larch.open_forest,
+ key_size=self.key_size, node_size=None,
+ dirname=self.tempdir, allow_writes=False)
+
+ def test_fail_if_metadata_missing_node_size(self):
+ with open(os.path.join(self.tempdir, 'metadata'), 'w') as f:
+ f.write('[metadata]\n')
+ f.write('format=1/1\n')
+ f.write('key_size=%s\n' % self.key_size)
+ self.assertRaises(larch.MetadataMissingKey, larch.open_forest,
+ key_size=self.key_size, node_size=None,
+ dirname=self.tempdir, allow_writes=False)
+
def test_fail_if_existing_tree_has_incompatible_key_size(self):
f = larch.open_forest(key_size=self.key_size, node_size=self.node_size,
dirname=self.tempdir, allow_writes=True)