From 391dd3097bc24a1015c7f4b038cf4474b3cbb074 Mon Sep 17 00:00:00 2001 From: Sascha Silbe Date: Sat, 11 Jul 2009 19:24:30 +0000 Subject: fix some bugs introduced by the API adaptions --- diff --git a/src/carquinyol/__init__.py b/src/carquinyol/__init__.py index 68d961b..2ced987 100644 --- a/src/carquinyol/__init__.py +++ b/src/carquinyol/__init__.py @@ -1,15 +1,60 @@ import logging import decorator -# TODO: skip positional arguments by name as well -def trace(skip_args=[], skip_kwargs=[]) : + +def filter_maxsize(val, maxsize_list, maxsize_dict, maxsize_string) : + if isinstance(val, (list, tuple)) : + if len(val) > maxsize_list : + return "[...]" + + return [filter_maxsize(child, maxsize_list, maxsize_dict, maxsize_string) + for child in val] + + elif isinstance(val, dict) : + if len(val) > maxsize_dict : + return "{...}" + + return dict([ + (key, filter_maxsize(child, maxsize_list, maxsize_dict, maxsize_string)) + for (key, child) in val.items()]) + + elif isinstance(val, (basestring, buffer)) : + if len(val) > maxsize_string : + return "'...'" + + return val + + else : + val = repr(val) + if len(val) > maxsize_string : + return "<...>" + + return val + + +TRACE=9 +logging.addLevelName(TRACE, 'TRACE') + +# TODO: lazy evaluation of parameters +def trace(skip_args=[], skip_kwargs=[], maxsize_list=30, maxsize_dict=30, maxsize_string=300) : def _trace(f, *args, **kwargs) : - logging.debug("%s(%s)" % (f.__name__, - ", ".join( - [repr(a) for (idx, a) in enumerate(args) if idx not in skip_args]+\ - ['%s=%r' % (k,v) for (k,v) in kwargs.items() if k not in skip_kwargs]))) + params_formatted = ", ".join( + [repr(filter_maxsize(a, maxsize_list, maxsize_dict, maxsize_string)) + for (idx, a) in enumerate(args) if idx not in skip_args]+\ + ['%s=%r' % (k,filter_maxsize(v, maxsize_list, maxsize_dict, maxsize_string)) + for (k,v) in kwargs.items() if k not in skip_kwargs]) + + logging.log(TRACE, "%s(%s) invoked", f.__name__, params_formatted) + + try : + res=f(*args, **kwargs) + except : + logging.exception("Exception occured in %s", f.__name__, exc_info=True) + raise - return f(*args, **kwargs) + logging.log(TRACE, "%s(%s) returned %r", f.__name__, params_formatted, + filter_maxsize(res, maxsize_list, maxsize_dict, maxsize_string)) + return res return decorator.decorator(_trace) diff --git a/src/carquinyol/datastore.py b/src/carquinyol/datastore.py index 0d81063..ccad08a 100644 --- a/src/carquinyol/datastore.py +++ b/src/carquinyol/datastore.py @@ -115,59 +115,35 @@ class DataStore(dbus.service.Object): else: return True - @trace() - def _create_completion_cb(self, async_cb, async_err_cb, tree_id, version_id, exc=None): - if exc is not None: - async_err_cb(exc) - return - - self.Created(tree_id, version_id) - self._optimizer.optimize(tree_id, version_id) - logger.debug("created (%s,%s)" % (tree_id,version_id)) - async_cb(tree_id,version_id) - @dbus.service.method(DS_DBUS_INTERFACE, in_signature='a{sv}sb', out_signature='ss', - async_callbacks=('async_cb', 'async_err_cb'), byte_arrays=True) - def create(self, props, file_path, transfer_ownership, - async_cb, async_err_cb): + @trace() + def create(self, props, file_path, transfer_ownership): """ Short-term compatibility wrapper for save(). """ - tree_id, child_id = self.save('', '', props, file_path, transfer_ownership) + tree_id, child_id = self._save('', '', props, file_path, transfer_ownership) self.Created(tree_id, child_id) return (tree_id, child_id) + @trace() @dbus.service.signal(DS_DBUS_INTERFACE, signature="ss") def Created(self, tree_id, version_id): pass - @trace() - def _update_completion_cb(self, async_cb, async_err_cb, tree_id, version_id, exc=None): - if exc is not None: - async_err_cb(exc) - return - - self.Updated(tree_id,version_id) - self._optimizer.optimize(tree_id,version_id) - logger.debug("updated %s %s" % (tree_id, version_id)) - async_cb(tree_id, version_id) - @dbus.service.method(DS_DBUS_INTERFACE, in_signature='ssa{sv}sb', out_signature='ss', - async_callbacks=('async_cb', 'async_err_cb'), byte_arrays=True) - @trace(skip_args=[3], skip_kwargs=["props"]) # "preview" metadata will clutter logfile otherwise - def update(self, tree_id, version_id, props, file_path, transfer_ownership, - async_cb, async_err_cb): + @trace() + def update(self, tree_id, version_id, props, file_path, transfer_ownership): """ Short-term compatibility wrapper for save() / change_metadata(). """ if file_path : - tree_id, child_id = self.save(tree_id, version_id, props, file_path, transfer_ownership) + tree_id, child_id = self._save(tree_id, version_id, props, file_path, transfer_ownership) else : self.change_metadata(tree_id, version_id, props) child_id = version_id @@ -183,19 +159,22 @@ class DataStore(dbus.service.Object): in_signature='ssa{sv}sb', out_signature='ss', byte_arrays=True) - @trace(skip_args=[3], skip_kwargs=["metadata"]) # "preview" metadata will clutter logfile otherwise + @trace() def save(self, tree_id, parent_id, metadata, path, delete_after): + return self._save(self, tree_id, parent_id, metadata, path, delete_after) + + def _save(self, tree_id, parent_id, metadata, path, delete_after): # TODO: copy docstring from datastore-redesign.html if (not tree_id) and parent_id : raise sugar.datastore.InvalidArgumentError("tree_id is empty but parent_id is not") if tree_id and not parent_id : - # TODO: check tree_id does not exist yet - pass + if self._find({'tree_id': tree_id}, {'limit': 1})[1] : + raise sugar.datastore.InvalidArgumentError("no parent_id given but tree_id already exists") elif parent_id : - # TODO: check parent_id does exist - pass + if not self._find({'tree_id': tree_id, 'version_id': parent_id}, {'limit': 1})[1] : + raise sugar.datastore.InvalidArgumentError("given parent_id does not exist") if not tree_id : tree_id = self._gen_uuid() @@ -244,17 +223,26 @@ class DataStore(dbus.service.Object): in_signature='ssa{sv}', out_signature='', byte_arrays=True) - @trace(skip_args=[3], skip_kwargs=["metadata"]) # "preview" metadata will clutter logfile otherwise + @trace() def change_metadata(self, tree_id, version_id, metadata) : # TODO: copy docstring from datastore-redesign.html - # TODO - pass + self._metadata_store.store(tree_id, version_id, metadata) @dbus.service.method(DS_DBUS_INTERFACE, in_signature='a{sv}a{sv}', out_signature='aa{sv}u') @trace() - def find(self, query, options, querystring = None): + def find(self, query, options): + return self._find(query, options) + + @dbus.service.method(DS_DBUS_INTERFACE, + in_signature='sa{sv}a{sv}', + out_signature='aa{sv}u') + @trace() + def textsearch(self, querystring, query, options) : + return self._find(query, options, querystring = querystring) + + def _find(self, query, options, querystring = None) : t = time.time() # don't expose internal details @@ -303,19 +291,9 @@ class DataStore(dbus.service.Object): metadata = self._metadata_store.retrieve(tree_id, version_id, options.get('metadata')) entries.append(metadata) - logger.debug('find(): %r' % (time.time() - t)) -# logger.debug('count=%r, entries=%r' % (count, entries)) - logger.debug('count=%r' % (count,)) return entries, count @dbus.service.method(DS_DBUS_INTERFACE, - in_signature='sa{sv}a{sv}', - out_signature='aa{sv}u') - @trace() - def textsearch(self, querystring, query, options) : - return self.find(query, options, querystring = querystring) - - @dbus.service.method(DS_DBUS_INTERFACE, in_signature='ss', out_signature='s', sender_keyword='sender') @@ -324,7 +302,7 @@ class DataStore(dbus.service.Object): """ Short-term compatibility wrapper for get_filename(). """ - return self.get_data(uid, vid, sender) + return self.get_data(tree_id, version_id, sender) @dbus.service.method(DS_DBUS_INTERFACE, in_signature='ss', diff --git a/src/carquinyol/indexstore.py b/src/carquinyol/indexstore.py index 387f7bb..313e6df 100644 --- a/src/carquinyol/indexstore.py +++ b/src/carquinyol/indexstore.py @@ -141,34 +141,24 @@ class IndexStore(object): enquire.set_sort_by_value(_VALUE_TIMESTAMP, True) + if not all_versions : + # only select newest entry (sort order) for each tree_id + enquire.set_collapse_key(_VALUE_TID) + query_result = enquire.get_mset(offset, limit, check_at_least) total_count = query_result.get_matches_estimated() - tvids = [] - timestamps = [] - for hit in query_result: - tvids.append((hit.document.get_value(_VALUE_TID), hit.document.get_value(_VALUE_VID))) + tvids = [(hit.document.get_value(_VALUE_TID), + hit.document.get_value(_VALUE_VID)) + for hit in query_result] - if not all_versions : - # only return latest version for each entry - # result set is already sorted by time so we only need to take the first entry for each tree_id - tids_vid = {} - tvids_new = [] - for (tree_id, version_id) in tvids : - if tree_id not in tids_vid : - tids_vid[tree_id] = version_id - tvids_new.append((tree_id,version_id)) - - tvids = tvids_new - - # TODO: total_count will be totally off if all_versions is not set return (tvids, total_count) _queryTermMap = { 'tree_id': _PREFIX_TID, 'version_id': _PREFIX_VID, 'bundle_id': _PREFIX_BUNDLE_ID, - 'activitiy_id': _PREFIX_ACTIVITY_ID, + 'activity_id': _PREFIX_ACTIVITY_ID, 'keep': _PREFIX_KEEP, } def _parse_query(self, query_dict): diff --git a/src/carquinyol/metadatareader.c b/src/carquinyol/metadatareader.c index 511b94a..edc338a 100644 --- a/src/carquinyol/metadatareader.c +++ b/src/carquinyol/metadatareader.c @@ -209,8 +209,6 @@ metadatareader_retrieve(PyObject *unused, PyObject *args) dict = read_all_properties(metadata_path); } - PyMem_Free(metadata_path); - return dict; } diff --git a/src/carquinyol/metadatastore.py b/src/carquinyol/metadatastore.py index bc7bb12..ff3d6bf 100644 --- a/src/carquinyol/metadatastore.py +++ b/src/carquinyol/metadatastore.py @@ -12,7 +12,8 @@ class MetadataStore(object): os.makedirs(metadata_path) else: for key in os.listdir(metadata_path): - os.remove(os.path.join(metadata_path, key)) + if key not in metadata : + os.remove(os.path.join(metadata_path, key)) metadata['tree_id'] = tree_id metadata['version_id'] = version_id diff --git a/src/carquinyol/migration.py b/src/carquinyol/migration.py index f66dc2f..d979b5e 100644 --- a/src/carquinyol/migration.py +++ b/src/carquinyol/migration.py @@ -145,7 +145,7 @@ def migrate_from_1(): try : os.rename(os.path.join(entries_path, tree_id), - layoutmanager.get_instance().get_entry_path(tree_id, version_ids[tree_id])) + os.path.join(entries_path, "%s-%s" % (tree_id, version_ids[tree_id]))) except Exception: logging.error('Error while migrating checksum entry %r / %r: %s\n' % \ -- cgit v0.9.1