diff options
author | Sascha 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) |
commit | 028e410af82b407a48f6c6b676d026f6c24077f9 (patch) | |
tree | 9057f7e23688b0b6995a5ec188ff85d2f7e5757e /gdatastore | |
parent | b0e6e213cb5179ff3c3cd1bb0f6d08dda4b1d5d3 (diff) |
start implementing native API
Diffstat (limited to 'gdatastore')
-rw-r--r-- | gdatastore/datastore.py | 154 |
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, |