From 9e2a9c4c025b492169fe244c4a443d1b63b50968 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Fri, 7 Sep 2007 21:53:32 -0400 Subject: [PATCH] Support moving of files to datastore when using write_file() Using the transfer_ownership argument, activities using the default activity datastore integration methods (namely write_file) will now tell the datastore that it can move the files by default. This reduces the copies required, which is slow on flash. For activities not using the standard APIs (Record, etc), the datastore bindings allow the activity to specify when ownership should transfer. --- NEWS | 3 +++ sugar/activity/activity.py | 1 + sugar/datastore/datastore.py | 6 ++++-- sugar/datastore/dbus_helpers.py | 16 +++++++++++----- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/NEWS b/NEWS index 7e7d1f47..bd6cbf84 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,6 @@ +* Support moving of data files written to the datastore using standard Activity + write_file() API (dcbw) + Snapshot c8700feccf * Removing activity from donut when not the active and the last one (erikos) diff --git a/sugar/activity/activity.py b/sugar/activity/activity.py index b0196271..a5661cd8 100644 --- a/sugar/activity/activity.py +++ b/sugar/activity/activity.py @@ -487,6 +487,7 @@ class Activity(Window, gtk.Container): pass self._updating_jobject = True datastore.write(self._jobject, + transfer_ownership=True, reply_handler=self._internal_save_cb, error_handler=self._internal_save_error_cb) diff --git a/sugar/datastore/datastore.py b/sugar/datastore/datastore.py index 6409a8a6..0be6a2fa 100644 --- a/sugar/datastore/datastore.py +++ b/sugar/datastore/datastore.py @@ -186,7 +186,7 @@ def create(): metadata['mtime'] = metadata['ctime'] return DSObject(object_id=None, metadata=metadata, file_path=None) -def write(ds_object, update_mtime=True, reply_handler=None, error_handler=None, timeout=-1): +def write(ds_object, update_mtime=True, transfer_ownership=False, reply_handler=None, error_handler=None, timeout=-1): logging.debug('datastore.write') properties = ds_object.metadata.get_dictionary().copy() @@ -198,12 +198,14 @@ def write(ds_object, update_mtime=True, reply_handler=None, error_handler=None, dbus_helpers.update(ds_object.object_id, properties, ds_object.file_path, + transfer_ownership, reply_handler=reply_handler, error_handler=error_handler, timeout=timeout) else: ds_object.object_id = dbus_helpers.create(properties, - ds_object.file_path) + ds_object.file_path, + transfer_ownership) # TODO: register the object for updates logging.debug('Written object %s to the datastore.' % ds_object.object_id) diff --git a/sugar/datastore/dbus_helpers.py b/sugar/datastore/dbus_helpers.py index 6625d22a..88dfb6d2 100644 --- a/sugar/datastore/dbus_helpers.py +++ b/sugar/datastore/dbus_helpers.py @@ -40,20 +40,26 @@ def _get_data_store(): DS_DBUS_INTERFACE) return _data_store -def create(properties, filename): - object_id = _get_data_store().create(dbus.Dictionary(properties), filename) +def create(properties, filename, transfer_ownership=False): + object_id = _get_data_store().create(dbus.Dictionary(properties), filename, + transfer_ownership) logging.debug('dbus_helpers.create: ' + object_id) return object_id -def update(uid, properties, filename, reply_handler=None, error_handler=None, timeout=-1): - logging.debug('dbus_helpers.update: %s, %s, %s' % (uid, filename, properties)) +def update(uid, properties, filename, transfer_ownership=False, + reply_handler=None, error_handler=None, timeout=-1): + debug_props = properties.copy() + if debug_props.has_key("preview"): + debug_props["preview"] = "" + logging.debug('dbus_helpers.update: %s, %s, %s, %s' % (uid, filename, debug_props, transfer_ownership)) if reply_handler and error_handler: _get_data_store().update(uid, dbus.Dictionary(properties), filename, + transfer_ownership, reply_handler=reply_handler, error_handler=error_handler, timeout=timeout) else: - _get_data_store().update(uid, dbus.Dictionary(properties), filename) + _get_data_store().update(uid, dbus.Dictionary(properties), filename, transfer_ownership) def delete(uid): logging.debug('dbus_helpers.delete: %r' % uid)