Some refactoring of the DataStore API.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user