Skip to content

Commit

Permalink
[archive] implement DownloadArchiveMemory class (#5255)
Browse files Browse the repository at this point in the history
keeps archive IDs in memory
and only writes them to disk in a 'finalize' step
  • Loading branch information
mikf committed May 9, 2024
1 parent 88f9419 commit 215abbc
Showing 1 changed file with 42 additions and 0 deletions.
42 changes: 42 additions & 0 deletions gallery_dl/archive.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,45 @@ def check(self, kwdict):
self.cursor.execute(
"SELECT 1 FROM archive WHERE entry=? LIMIT 1", (key,))
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))

0 comments on commit 215abbc

Please sign in to comment.