Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/gdatastore
diff options
context:
space:
mode:
authorSascha Silbe <sascha-pgp@silbe.org>2011-05-22 22:33:55 (GMT)
committer Sascha Silbe <sascha-pgp@silbe.org>2011-08-22 14:12:11 (GMT)
commit028e410af82b407a48f6c6b676d026f6c24077f9 (patch)
tree9057f7e23688b0b6995a5ec188ff85d2f7e5757e /gdatastore
parentb0e6e213cb5179ff3c3cd1bb0f6d08dda4b1d5d3 (diff)
start implementing native API
Diffstat (limited to 'gdatastore')
-rw-r--r--gdatastore/datastore.py154
1 files changed, 154 insertions, 0 deletions
diff --git a/gdatastore/datastore.py b/gdatastore/datastore.py
index d1457aa..2378abc 100644
--- a/gdatastore/datastore.py
+++ b/gdatastore/datastore.py
@@ -63,6 +63,157 @@ class GitError(DataStoreError):
return self.__unicode__()
+class DBusApiNativeV1(dbus.service.Object):
+ """Native gdatastore D-Bus API
+ """
+
+ def __init__(self, internal_api):
+ self._internal_api = internal_api
+ bus_name = dbus.service.BusName(DBUS_SERVICE_NATIVE_V1,
+ bus=dbus.SessionBus(),
+ replace_existing=False,
+ allow_replacement=False,
+ do_not_queue=True)
+ dbus.service.Object.__init__(self, bus_name, DBUS_PATH_NATIVE_V1)
+ self._internal_api.add_callback('change_metadata',
+ self.__change_metadata_cb)
+ self._internal_api.add_callback('delete', self.__delete_cb)
+ self._internal_api.add_callback('save', self.__save_cb)
+
+ @dbus.service.signal(DBUS_INTERFACE_NATIVE_V1, signature='sssa{sv}')
+ def AddedNewVersion(self, tree_id, child_id, parent_id, metadata):
+ # pylint: disable-msg=C0103
+ pass
+
+ @dbus.service.signal(DBUS_INTERFACE_NATIVE_V1, signature='ssa{sv}')
+ def Created(self, tree_id, child_id, metadata):
+ # pylint: disable-msg=C0103
+ pass
+
+ @dbus.service.signal(DBUS_INTERFACE_NATIVE_V1, signature='ssa{sv}')
+ def ChangedMetadata(self, tree_id, version_id, metadata):
+ # pylint: disable-msg=C0103
+ pass
+
+ @dbus.service.signal(DBUS_INTERFACE_NATIVE_V1, signature='ss')
+ def Deleted(self, tree_id, version_id):
+ # pylint: disable-msg=C0103
+ pass
+
+ @dbus.service.method(DBUS_INTERFACE_NATIVE_V1,
+ in_signature='a{sv}s', out_signature='ss',
+ async_callbacks=('async_cb', 'async_err_cb'),
+ byte_arrays=True)
+ def create(self, metadata, data_path, async_cb, async_err_cb):
+ """
+ - add new entry, assign ids
+ - data='' indicates no data to store
+ - bad design? (data OOB)
+ """
+ # TODO: what about transfer_ownership/delete_after?
+ self._internal_api.save(tree_id='', parent_id='', metadata=metadata,
+ path=data_path, delete_after=True,
+ async_cb=async_cb,
+ async_err_cb=async_err_cb)
+
+ @dbus.service.method(DBUS_INTERFACE_NATIVE_V1,
+ in_signature='ssa{sv}s', out_signature='s',
+ async_callbacks=('async_cb', 'async_err_cb'),
+ byte_arrays=True)
+ def add_version(self, tree_id, parent_id, metadata, data_path, async_cb,
+ async_err_cb):
+ """
+ - add new version to existing object
+ """
+ def success_cb(tree_id, child_id):
+ async_cb(child_id)
+
+ if not tree_id:
+ raise ValueError('No tree_id given')
+
+ if not parent_id:
+ raise ValueError('No parent_id given')
+
+ self._internal_api.save(tree_id, parent_id, metadata, data_path,
+ delete_after=True,
+ async_cb=success_cb,
+ async_err_cb=async_err_cb)
+
+ @dbus.service.method(DBUS_INTERFACE_NATIVE_V1,
+ in_signature='ssa{sv}', out_signature='',
+ byte_arrays=True)
+ def change_metadata(self, tree_id, version_id, metadata):
+ """
+ - change the metadata of an existing version
+ """
+ object_id = (tree_id, version_id)
+ self._internal_api.change_metadata(object_id, metadata)
+
+ @dbus.service.method(DBUS_INTERFACE_NATIVE_V1,
+ in_signature='ss', out_signature='')
+ def delete(self, tree_id, version_id):
+ object_id = (tree_id, version_id)
+ self._internal_api.delete(object_id)
+
+ @dbus.service.method(DBUS_INTERFACE_NATIVE_V1,
+ in_signature='a{sv}a{sv}', out_signature='aa{sv}u',
+ byte_arrays=True)
+ def find(self, query_dict, options):
+ return self._internal_api.find(query_dict, options)
+
+ @dbus.service.method(DBUS_INTERFACE_NATIVE_V1,
+ in_signature='ss', out_signature='s',
+ sender_keyword='sender')
+ def get_data_path(self, tree_id, version_id, sender=None):
+ object_id = (tree_id, version_id)
+ return self._internal_api.get_data_path(object_id, sender=sender)
+
+ @dbus.service.method(DBUS_INTERFACE_NATIVE_V1,
+ in_signature='ss', out_signature='a{sv}')
+ def get_metadata(self, tree_id, version_id):
+ object_id = (tree_id, version_id)
+ return self._internal_api.get_properties(object_id)
+
+ @dbus.service.method(DBUS_INTERFACE_NATIVE_V1,
+ in_signature='a{sv}sa{sv}', out_signature='aa{sv}u',
+ byte_arrays=True)
+ def text_search(self, query_dict, query_string, options):
+ return self._internal_api.find(query_dict, options, query_string)
+
+ @dbus.service.method(DBUS_INTERFACE_NATIVE_V1,
+ in_signature='sssa{sv}s', out_signature='',
+ async_callbacks=('async_cb', 'async_err_cb'),
+ byte_arrays=True)
+ def restore(self, tree_id, parent_id, version_id, metadata, data_path,
+ async_cb, async_err_cb):
+ """
+ - add a new version with the given ids
+ - there must be no existing entry with the same (tree_id, version_id)
+ - if parent_id != '' there must be an existing entry (tree_id, parent_id)
+ - if parent_id = '', there must be no existing entry with the same tree_id and no parent_id
+ """
+ if not tree_id:
+ raise ValueError('No tree_id given')
+
+ metadata['version_id'] = version_id
+ self._internal_api.save(tree_id, parent_id, metadata, data_path,
+ delete_after=True,
+ async_cb=async_cb,
+ async_err_cb=async_err_cb)
+
+ def __change_metadata_cb(self, (tree_id, version_id), metadata):
+ self.ChangedMetadata(tree_id, version_id, metadata)
+
+ def __delete_cb(self, (tree_id, version_id)):
+ self.Deleted(tree_id, version_id)
+
+ def __save_cb(self, tree_id, child_id, parent_id, metadata):
+ if parent_id:
+ self.AddedNewVersion(tree_id, child_id, parent_id, metadata)
+ else:
+ self.Created(tree_id, child_id, metadata)
+
+
class DBusApiSugarV2(dbus.service.Object):
"""Compatibility layer for the Sugar 0.84+ data store D-Bus API
"""
@@ -320,6 +471,9 @@ class InternalApi(object):
return self._index.find_unique_values(name)
+ def get_properties(self, object_id):
+ return self._index.retrieve(object_id)
+
def save(self, tree_id, parent_id, metadata, path, delete_after, async_cb,
async_err_cb):
logging.debug('save(%r, %r, %r, %r, %r)', tree_id, parent_id,