From 886f5c6c11f370e6539708b0a9ce3a504992362d Mon Sep 17 00:00:00 2001 From: Sascha Silbe Date: Sat, 18 Feb 2012 20:14:05 +0000 Subject: WIP gdatastore support --- diff --git a/restore.py b/restore.py index b744827..246576f 100644 --- a/restore.py +++ b/restore.py @@ -62,6 +62,9 @@ DS_DBUS_INTERFACE1 = "org.laptop.sugar.DataStore" DS_DBUS_PATH1 = "/org/laptop/sugar/DataStore" DS_DBUS_INTERFACE2 = "org.laptop.sugar.DataStore2" DS_DBUS_PATH2 = "/org/laptop/sugar/DataStore2" +GDS_DBUS_SERVICE = "org.silbe.GDataStore" +GDS_DBUS_INTERFACE = "org.silbe.GDataStore1" +GDS_DBUS_PATH = "/org/silbe/GDataStore1" DS_DBUS_SIMPLE_FIND_TIMEOUT = 60 DS_DBUS_SAVE_TIMEOUT = 5*60 @@ -411,6 +414,19 @@ class AsyncRestore(gobject.GObject): # http://lists.freedesktop.org/archives/dbus/2007-April/007498.html # http://lists.freedesktop.org/archives/dbus/2007-August/008359.html bus = dbus.SessionBus(private=True) + + try: + self._data_store = dbus.Interface(bus.get_object(GDS_DBUS_SERVICE, + GDS_DBUS_PATH), GDS_DBUS_INTERFACE) + self._data_store.find({'tree_id': 'invalid'}, + {'metadata': ['tree_id']}, timeout=DS_DBUS_SIMPLE_FIND_TIMEOUT) + self._data_store_version = 1 + logging.info('gdatastore found') + return + + except dbus.DBusException: + logging.debug('No data store with version support found') + try: self._data_store = dbus.Interface(bus.get_object(DS_DBUS_SERVICE, DS_DBUS_PATH2), DS_DBUS_INTERFACE2) @@ -433,9 +449,9 @@ class AsyncRestore(gobject.GObject): self._data_store_mount_id = [mount['id'] for mount in self._data_store.mounts() if mount['uri'] == data_store_path][0] - logging.info('0.82 data store found') + logging.info('Sugar 0.82 data store found') else: - logging.info('0.84+ data store without version support found') + logging.info('Sugar 0.84+ data store (no version support) found') self._data_store_version = 84 def _get_timestamp(self, metadata): @@ -455,45 +471,72 @@ class AsyncRestore(gobject.GObject): # workaround for SL#1590 metadata['timestamp'] = str(int(timestamp)) - if self._data_store.dbus_interface == DS_DBUS_INTERFACE2: - tree_id = metadata.get('tree_id') or metadata['uid'] - version_id = metadata.get('version_id', '') - parent_id = metadata.get('parent_id', '') - if self._find_entry_v2(tree_id, version_id): - logging.info('Skipping existing entry %r / %r', tree_id, - version_id) - return + if self._data_store.dbus_interface == DS_DBUS_INTERFACE1: + return self._save_entry_sd_no_vs(metadata, data_path) - self._data_store.save(tree_id, parent_id, metadata, data_path, - True, timeout=DS_DBUS_SAVE_TIMEOUT) - else: - uid = metadata.get('uid') or metadata['tree_id'] - entry = self._find_entry_v1(uid) - if entry: - ds_timestamp = self._get_timestamp(entry) - - if ds_timestamp >= int(timestamp): - logging.info('Skipping outdated entry for %r', uid) - return - else: - logging.info('Overwriting older entry for %r', uid) - else: - logging.info('Restoring entry %r', uid) + tree_id = metadata.get('tree_id') or metadata['uid'] + version_id = metadata.get('version_id', '') + parent_id = metadata.get('parent_id', '') - if self._data_store_version == 82: - metadata['uid'] = uid - metadata.pop('mountpoint', None) - metadata['mtime'] = time.strftime(CTIME_FORMAT, time.localtime(timestamp)) + if self._find_entry((tree_id, version_id)): + logging.info('Skipping existing entry %r / %r', tree_id, + version_id) + return - if self._data_store_version == 82 and not entry: - self._data_store.create(metadata, data_path, True, - timeout=DS_DBUS_SAVE_TIMEOUT) + if self._data_store.dbus_interface == GDS_DBUS_INTERFACE: + return self._save_entry_gds_v1(metadata, data_path, tree_id, + version_id, parent_id) + elif self._data_store.dbus_interface == DS_DBUS_INTERFACE2: + return self._save_entry_sd_vs(metadata, data_path, tree_id, + version_id, parent_id) + + def _save_entry_gds_v1(self, metadata, data_path, tree_id, version_id, + parent_id): + self._data_store.restore(tree_id, parent_id, version_id, metadata, + data_path, timeout=DS_DBUS_SAVE_TIMEOUT) + + def _save_entry_sd_vs(self, metadata, data_path, tree_id, version_id, + parent_id): + self._data_store.save(tree_id, parent_id, metadata, data_path, + True, timeout=DS_DBUS_SAVE_TIMEOUT) + + def _save_entry_sd_no_vs(self, metadata, data_path): + uid = metadata.get('uid') or metadata['tree_id'] + entry = self._find_entry(uid) + if entry: + ds_timestamp = self._get_timestamp(entry) + + if ds_timestamp >= int(timestamp): + logging.info('Skipping outdated entry for %r', uid) + return else: - self._data_store.update(uid, metadata, data_path, True, - timeout=DS_DBUS_SAVE_TIMEOUT) + logging.info('Overwriting older entry for %r', uid) + else: + logging.info('Restoring entry %r', uid) - def _find_entry_v1(self, uid): - """Retrieve given entry from v1 data store if it exists. + if self._data_store_version == 82: + metadata['uid'] = uid + metadata.pop('mountpoint', None) + metadata['mtime'] = time.strftime(CTIME_FORMAT, time.localtime(timestamp)) + + if self._data_store_version == 82 and not entry: + self._data_store.create(metadata, data_path, True, + timeout=DS_DBUS_SAVE_TIMEOUT) + else: + self._data_store.update(uid, metadata, data_path, True, + timeout=DS_DBUS_SAVE_TIMEOUT) + + def _find_entry(self, object_id): + if self._data_store.dbus_interface == GDS_DBUS_INTERFACE: + return self._find_entry_gds_v1(object_id) + elif self._data_store.dbus_interface == DS_DBUS_INTERFACE2: + return self._find_entry_sd_vs(object_id) + else: + return self._find_entry_sd_no_vs(object_id) + + def _find_entry_sd_no_vs(self, uid): + """Retrieve given entry from sugar-datastore (no version support) if + the entry exists. """ try: entry = self._data_store.get_properties(uid, byte_arrays=True, @@ -512,8 +555,9 @@ class AsyncRestore(gobject.GObject): return entry - def _find_entry_v2(self, tree_id, version_id): - """Retrieve given entry from v2 data store if it exists. + def _find_entry_sd_vs(self, (tree_id, version_id)): + """Retrieve given entry from sugar-datastore (with version support) + if the entry exists. """ query = {'tree_id': tree_id} if version_id: @@ -525,6 +569,20 @@ class AsyncRestore(gobject.GObject): return entries[0] return None + def _find_entry_gds_v1(self, (tree_id, version_id)): + """Retrieve given entry from sugar-datastore (with version support) + if the entry exists. + """ + query = {'tree_id': tree_id} + if version_id: + query['version_id'] = version_id + + entries = self._data_store.find(query, {}, byte_arrays=True, + timeout=DS_DBUS_SIMPLE_FIND_TIMEOUT)[0] + if entries: + return entries[0] + return None + class RestoreActivity(activity.Activity): -- cgit v0.9.1