Some refactoring of the DataStore API.

This commit is contained in:
Tomeu Vizoso
2007-05-29 15:53:58 +02:00
parent 53d64a0536
commit c35db7acf8
2 changed files with 76 additions and 50 deletions
+30 -21
View File
@@ -19,38 +19,48 @@ import gobject
from sugar.datastore import dbus_helpers
class DSObject(gobject.GObject):
class DSMetadata(gobject.GObject):
__gsignals__ = {
'updated': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
([]))
}
def __init__(self, object_id, metadata=None, file_path=None):
def __init__(self, props={}):
gobject.GObject.__init__(self)
self._props = props
def __getitem__(self, key):
return self._props[key]
def __setitem__(self, key, value):
if not self._props.has_key(key) or self._props[key] != value:
self._props[key] = value
self.emit('updated')
def __delitem__(self, key):
del self._props[key]
def has_key(self, key):
return self._props.has_key(key)
def get_dictionary(self):
return self._props
class DSObject:
def __init__(self, object_id, metadata=None, file_path=None):
self.object_id = object_id
self._metadata = metadata
self._file_path = file_path
def __getitem__(self, key):
return self.metadata[key]
def __setitem__(self, key, value):
if not self.metadata.has_key(key) or self.metadata[key] != value:
self.metadata[key] = value
self.emit('updated')
def __delitem__(self, key):
del self.metadata[key]
def get_metadata(self):
if self._metadata is None and not self.object_id is None:
self.set_metadata(dbus_helpers.get_properties(self.object_id))
metadata = DSMetadata(dbus_helpers.get_properties(self.object_id))
self._metadata = metadata
return self._metadata
def set_metadata(self, metadata):
if self._metadata != metadata:
self._metadata = metadata
self.emit('updated')
metadata = property(get_metadata, set_metadata)
@@ -62,7 +72,6 @@ class DSObject(gobject.GObject):
def set_file_path(self, file_path):
if self._file_path != file_path:
self._file_path = file_path
self.emit('updated')
file_path = property(get_file_path, set_file_path)
@@ -71,23 +80,23 @@ def get(object_id):
metadata = dbus_helpers.get_properties(object_id)
file_path = dbus_helpers.get_filename(object_id)
ds_object = DSObject(object_id, metadata, file_path)
ds_object = DSObject(object_id, DSMetadata(metadata), file_path)
# TODO: register the object for updates
return ds_object
def create():
return DSObject(object_id=None, metadata={}, file_path=None)
return DSObject(object_id=None, metadata=DSMetadata(), file_path=None)
def write(ds_object, reply_handler=None, error_handler=None):
logging.debug('datastore.write')
if ds_object.object_id:
dbus_helpers.update(ds_object.object_id,
ds_object.metadata,
ds_object.metadata.get_dictionary(),
ds_object.file_path,
reply_handler=reply_handler,
error_handler=error_handler)
else:
ds_object.object_id = dbus_helpers.create(ds_object.metadata,
ds_object.object_id = dbus_helpers.create(ds_object.metadata.get_dictionary(),
ds_object.file_path)
# TODO: register the object for updates
logging.debug('Written object %s to the datastore.' % ds_object.object_id)
@@ -114,7 +123,7 @@ def find(query, sorting=None, limit=None, offset=None, reply_handler=None,
object_id = props['uid']
del props['uid']
ds_object = DSObject(object_id, props, file_path)
ds_object = DSObject(object_id, DSMetadata(props), file_path)
objects.append(ds_object)
return objects, total_count