Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Silbe <sascha@silbe.org>2009-07-11 19:24:30 (GMT)
committer Sascha Silbe <sascha@silbe.org>2009-07-11 19:24:30 (GMT)
commit391dd3097bc24a1015c7f4b038cf4474b3cbb074 (patch)
tree574434fcfd839abc4c1ff2f9ccbd2c598009c9e9
parent5aeb9953c1b547f8a4af76641de3659f17366540 (diff)
fix some bugs introduced by the API adaptions
-rw-r--r--src/carquinyol/__init__.py59
-rw-r--r--src/carquinyol/datastore.py80
-rw-r--r--src/carquinyol/indexstore.py26
-rw-r--r--src/carquinyol/metadatareader.c2
-rw-r--r--src/carquinyol/metadatastore.py3
-rw-r--r--src/carquinyol/migration.py2
6 files changed, 92 insertions, 80 deletions
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' % \