diff options
author | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2008-08-26 17:46:21 (GMT) |
---|---|---|
committer | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2008-08-26 17:46:21 (GMT) |
commit | 745213c3875429084e37a1b3a7c8024f1f574abd (patch) | |
tree | 84104ad27a840b727b915192767746dcf393939f /src | |
parent | 352afe95bb8db2d4234b70dad9312e458ed06166 (diff) |
Implement a simpler format than JSON for the metadata. Should be much faster.
Diffstat (limited to 'src')
-rw-r--r-- | src/olpc/datastore/metadatastore.py | 54 |
1 files changed, 31 insertions, 23 deletions
diff --git a/src/olpc/datastore/metadatastore.py b/src/olpc/datastore/metadatastore.py index f15f1af..112b693 100644 --- a/src/olpc/datastore/metadatastore.py +++ b/src/olpc/datastore/metadatastore.py @@ -1,12 +1,6 @@ import os import logging - -try: - import cjson - has_cjson = True -except ImportError: - import simplejson - has_cjson = False +import urllib from olpc.datastore import layoutmanager @@ -16,15 +10,18 @@ class MetadataStore(object): def store(self, uid, metadata): metadata = metadata.copy() + for key in metadata.keys(): + if ' ' in key: + raise ValueError('Property names cannot include spaces. ' + 'Wrong name: %r' % key) + dir_path = layoutmanager.get_instance().get_entry_path(uid) if not os.path.exists(dir_path): os.makedirs(dir_path) for key, value in metadata.items(): - if isinstance(value, str) and len(value) > MAX_SIZE: - self._write_external(key, value, dir_path) - del metadata[key] - elif isinstance(value, str) and not self._is_unicode(value): + if isinstance(value, str) and \ + (len(value) > MAX_SIZE or not self._is_unicode(value)): self._write_external(key, value, dir_path) del metadata[key] @@ -96,19 +93,30 @@ class MetadataStore(object): return False def _encode(self, metadata, file_path): - if has_cjson: - f = open(file_path, 'w') - f.write(cjson.encode(metadata)) - f.close() - else: - simplejson.dump(metadata, open(file_path, 'w')) + f = open(file_path, 'w') + for key, value in metadata.items(): + if value is None: + value = '' + f.write('%s %s\n' % (key, urllib.quote(str(value)))) + f.close() def _decode(self, file_path): - if has_cjson: - f = open(file_path, 'r') - metadata = cjson.decode(f.read()) - f.close() - return metadata + f = open(file_path, 'r') + metadata = {} + for line in f.readlines(): + logging.debug(line) + key, value = line.split(' ', 1) + value = value[:-1] # Take out the trailing '\n' + value = self._cast_for_journal(key, urllib.unquote(value)) + metadata[key] = value + f.close() + return metadata + + def _cast_for_journal(self, key, value): + # Hack because the current journal expects these properties to have some + # predefined types + if key in ['timestamp', 'keep']: + return int(value) else: - return simplejson.load(open(file_path)) + return value |