summaryrefslogtreecommitdiffstats
path: root/custodia/store/sqlite.py
diff options
context:
space:
mode:
Diffstat (limited to 'custodia/store/sqlite.py')
-rw-r--r--custodia/store/sqlite.py56
1 files changed, 31 insertions, 25 deletions
diff --git a/custodia/store/sqlite.py b/custodia/store/sqlite.py
index 44d139f..482787a 100644
--- a/custodia/store/sqlite.py
+++ b/custodia/store/sqlite.py
@@ -74,23 +74,36 @@ class SqliteStore(CSStore):
log_error("Error storing key %s: [%r]" % (key, repr(err)))
raise CSStoreError('Error occurred while trying to store key')
- def list(self, keyfilter='/'):
+ def list(self, keyfilter=''):
+ path = keyfilter.rstrip('/')
+ child_prefix = path if path == '' else path + '/'
search = "SELECT key FROM %s WHERE key LIKE ?" % self.table
- key = "%s%%" % (keyfilter,)
+ key = "%s%%" % (path,)
try:
conn = sqlite3.connect(self.dburi)
r = conn.execute(search, (key,))
rows = r.fetchall()
except sqlite3.Error as err:
- log_error("Error listing (filter: %s): [%r]" % (key, repr(err)))
+ log_error("Error listing %s: [%r]" % (keyfilter, repr(err)))
raise CSStoreError('Error occurred while trying to list keys')
if len(rows) > 0:
+ parent_exists = False
value = list()
for row in rows:
- value.append(row[0])
- return sorted(value)
- else:
- return None
+ if row[0] == path or row[0] == child_prefix:
+ parent_exists = True
+ continue
+ if not row[0].startswith(child_prefix):
+ continue
+ value.append(row[0][len(child_prefix):].lstrip('/'))
+
+ if value:
+ return sorted(value)
+ elif parent_exists:
+ return []
+ elif keyfilter == '':
+ return []
+ return None
def cut(self, key):
query = "DELETE from %s WHERE key=?" % self.table
@@ -124,7 +137,7 @@ class SqliteStoreTests(unittest.TestCase):
value = self.store.get('test')
self.assertEqual(value, None)
- def test_1_list_empty(self):
+ def test_1_list_none(self):
value = self.store.list('test')
self.assertEqual(value, None)
@@ -134,13 +147,10 @@ class SqliteStoreTests(unittest.TestCase):
self.assertEqual(value, 'value')
def test_3_list_key(self):
- value = self.store.list('key')
+ value = self.store.list()
self.assertEqual(value, ['key'])
value = self.store.list('k')
- self.assertEqual(value, ['key'])
-
- value = self.store.list('none')
self.assertEqual(value, None)
def test_4_multiple_keys(self):
@@ -153,27 +163,23 @@ class SqliteStoreTests(unittest.TestCase):
value = self.store.list()
self.assertEqual(value,
- sorted(['/sub1/key1', '/sub1/key2',
- '/sub1/key3', '/sub2/key1',
- '/sub2/key2', '/oth3/key1']))
+ sorted(['key',
+ 'sub1/key1', 'sub1/key2',
+ 'sub1/key3', 'sub2/key1',
+ 'sub2/key2', 'oth3/key1']))
value = self.store.list('/sub')
- self.assertEqual(value,
- sorted(['/sub1/key1', '/sub1/key2',
- '/sub1/key3', '/sub2/key1',
- '/sub2/key2']))
+ self.assertEqual(value, None)
value = self.store.list('/sub2')
- self.assertEqual(value, sorted(['/sub2/key1', '/sub2/key2']))
-
- value = self.store.list('/o')
- self.assertEqual(value, ['/oth3/key1'])
+ self.assertEqual(value, sorted(['key1', 'key2']))
+ self.store.set('/x', '')
value = self.store.list('/x')
- self.assertEqual(value, None)
+ self.assertEqual(value, [])
value = self.store.list('/sub1/key1/')
- self.assertEqual(value, None)
+ self.assertEqual(value, [])
value = self.store.get('/sub1')
self.assertEqual(value, None)