Store object hash as binary in sqlite (inventory)

This commit is contained in:
Peter Šurda 2018-02-01 21:24:50 +01:00
parent 167d946435
commit 8a5ec29540
Signed by untrusted user: PeterSurda
GPG Key ID: 0C5F50C0B5F37D87

View File

@ -18,13 +18,13 @@ class SqliteInventory(InventoryStorage):
with self.lock: with self.lock:
if hash in self._inventory: if hash in self._inventory:
return True return True
return bool(sqlQuery('SELECT 1 FROM inventory WHERE hash=?', hash)) return bool(sqlQuery('SELECT 1 FROM inventory WHERE hash=?', sqlite3.Binary(hash)))
def __getitem__(self, hash): def __getitem__(self, hash):
with self.lock: with self.lock:
if hash in self._inventory: if hash in self._inventory:
return self._inventory[hash] return self._inventory[hash]
rows = sqlQuery('SELECT objecttype, streamnumber, payload, expirestime, tag FROM inventory WHERE hash=?', hash) rows = sqlQuery('SELECT objecttype, streamnumber, payload, expirestime, tag FROM inventory WHERE hash=?', sqlite3.Binary(hash))
if not rows: if not rows:
raise KeyError(hash) raise KeyError(hash)
return InventoryItem(*rows[0]) return InventoryItem(*rows[0])
@ -62,14 +62,14 @@ class SqliteInventory(InventoryStorage):
with self.lock: with self.lock:
t = int(time.time()) t = int(time.time())
hashes = [x for x, value in self._inventory.items() if value.stream == stream and value.expires > t] hashes = [x for x, value in self._inventory.items() if value.stream == stream and value.expires > t]
hashes += (payload for payload, in sqlQuery('SELECT hash FROM inventory WHERE streamnumber=? AND expirestime>?', stream, t)) hashes += (str(payload) for payload, in sqlQuery('SELECT hash FROM inventory WHERE streamnumber=? AND expirestime>?', stream, t))
return hashes return hashes
def flush(self): def flush(self):
with self.lock: # If you use both the inventoryLock and the sqlLock, always use the inventoryLock OUTSIDE of the sqlLock. with self.lock: # If you use both the inventoryLock and the sqlLock, always use the inventoryLock OUTSIDE of the sqlLock.
with SqlBulkExecute() as sql: with SqlBulkExecute() as sql:
for objectHash, value in self._inventory.items(): for objectHash, value in self._inventory.items():
sql.execute('INSERT INTO inventory VALUES (?, ?, ?, ?, ?, ?)', objectHash, *value) sql.execute('INSERT INTO inventory VALUES (?, ?, ?, ?, ?, ?)', sqlite3.Binary(objectHash), *value)
self._inventory.clear() self._inventory.clear()
def clean(self): def clean(self):