1
0
mirror of https://github.com/mikf/gallery-dl.git synced 2024-11-22 10:42:34 +01:00

[archive] implement DownloadArchiveMemory class (#5255)

keeps archive IDs in memory
and only writes them to disk in a 'finalize' step
This commit is contained in:
Mike Fährmann 2024-05-10 01:15:44 +02:00
parent 88f94190f4
commit 215abbc3e4
No known key found for this signature in database
GPG Key ID: 5680CA389D365A88

View File

@ -54,3 +54,45 @@ class DownloadArchive():
self.cursor.execute( self.cursor.execute(
"SELECT 1 FROM archive WHERE entry=? LIMIT 1", (key,)) "SELECT 1 FROM archive WHERE entry=? LIMIT 1", (key,))
return self.cursor.fetchone() return self.cursor.fetchone()
def finalize(self):
pass
class DownloadArchiveMemory(DownloadArchive):
def __init__(self, path, format_string, pragma=None,
cache_key="_archive_key"):
DownloadArchive.__init__(self, path, format_string, pragma, cache_key)
self.keys = set()
def add(self, kwdict):
self.keys.add(
kwdict.get(self._cache_key) or
self.keygen(kwdict))
def check(self, kwdict):
key = kwdict[self._cache_key] = self.keygen(kwdict)
if key in self.keys:
return True
self.cursor.execute(
"SELECT 1 FROM archive WHERE entry=? LIMIT 1", (key,))
return self.cursor.fetchone()
def finalize(self):
if not self.keys:
return
cursor = self.cursor
with self.connection:
try:
cursor.execute("BEGIN")
except sqlite3.OperationalError:
pass
stmt = "INSERT OR IGNORE INTO archive (entry) VALUES (?)"
if len(self.keys) < 100:
for key in self.keys:
cursor.execute(stmt, (key,))
else:
cursor.executemany(stmt, ((key,) for key in self.keys))