Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTomeu Vizoso <tomeu@tomeuvizoso.net>2008-08-26 17:46:21 (GMT)
committer Tomeu Vizoso <tomeu@tomeuvizoso.net>2008-08-26 17:46:21 (GMT)
commit745213c3875429084e37a1b3a7c8024f1f574abd (patch)
tree84104ad27a840b727b915192767746dcf393939f /src
parent352afe95bb8db2d4234b70dad9312e458ed06166 (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.py54
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