diff options
Diffstat (limited to 'datastore/src/carquinyol/metadatastore.py')
-rw-r--r-- | datastore/src/carquinyol/metadatastore.py | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/datastore/src/carquinyol/metadatastore.py b/datastore/src/carquinyol/metadatastore.py new file mode 100644 index 0000000..5967017 --- /dev/null +++ b/datastore/src/carquinyol/metadatastore.py @@ -0,0 +1,60 @@ +import os + +from carquinyol import layoutmanager +from carquinyol import metadatareader + +MAX_SIZE = 256 +_INTERNAL_KEYS = ['checksum'] + + +class MetadataStore(object): + + def store(self, uid, metadata): + metadata_path = layoutmanager.get_instance().get_metadata_path(uid) + if not os.path.exists(metadata_path): + os.makedirs(metadata_path) + else: + for key in os.listdir(metadata_path): + if key not in _INTERNAL_KEYS: + os.remove(os.path.join(metadata_path, key)) + + metadata['uid'] = uid + for key, value in metadata.items(): + + # Hack to support activities that still pass properties named as + # for example title:text. + if ':' in key: + key = key.split(':', 1)[0] + + f = open(os.path.join(metadata_path, key), 'w') + try: + if isinstance(value, unicode): + value = value.encode('utf-8') + elif not isinstance(value, basestring): + value = str(value) + f.write(value) + finally: + f.close() + + def retrieve(self, uid, properties=None): + metadata_path = layoutmanager.get_instance().get_metadata_path(uid) + return metadatareader.retrieve(metadata_path, properties) + + def delete(self, uid): + metadata_path = layoutmanager.get_instance().get_metadata_path(uid) + for key in os.listdir(metadata_path): + os.remove(os.path.join(metadata_path, key)) + os.rmdir(metadata_path) + + def get_property(self, uid, key): + metadata_path = layoutmanager.get_instance().get_metadata_path(uid) + property_path = os.path.join(metadata_path, key) + if os.path.exists(property_path): + return open(property_path, 'r').read() + else: + return None + + def set_property(self, uid, key, value): + metadata_path = layoutmanager.get_instance().get_metadata_path(uid) + property_path = os.path.join(metadata_path, key) + open(property_path, 'w').write(value) |