Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Silbe <sascha-pgp@silbe.org>2012-02-18 20:14:05 (GMT)
committer Sascha Silbe <sascha-pgp@silbe.org>2012-02-18 20:14:05 (GMT)
commit886f5c6c11f370e6539708b0a9ce3a504992362d (patch)
tree6fc92ba25530d3038507fa031118c9491e8268a0
parent81d3e1803d05ed961cedeffc058aa8dda3b6782b (diff)
WIP gdatastore supportgdatastore-wip
-rw-r--r--restore.py134
1 files changed, 96 insertions, 38 deletions
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):