diff options
Diffstat (limited to 'autoimport.py')
-rwxr-xr-x | autoimport.py | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/autoimport.py b/autoimport.py index d44c012..8c61a18 100755 --- a/autoimport.py +++ b/autoimport.py @@ -9,7 +9,6 @@ import io import multiprocessing import optparse import os -import sqlite3 import subprocess import tempfile import urllib @@ -17,6 +16,9 @@ import urllib import concurrent.futures from debian import deb822 from debian.debian_support import version_compare +import sqlalchemy + +from dedup.utils import enable_sqlite_foreign_keys from readyaml import readyaml @@ -84,13 +86,12 @@ def main(): parser.add_option("-p", "--prune", action="store_true", help="prune packages old packages") parser.add_option("-d", "--database", action="store", - default="test.sqlite3", - help="path to the sqlite3 database file") + default="sqlite:///test.sqlite3", + help="location of the database") options, args = parser.parse_args() tmpdir = tempfile.mkdtemp(prefix=b"debian-dedup") - db = sqlite3.connect(options.database) - cur = db.cursor() - cur.execute("PRAGMA foreign_keys = ON;") + db = sqlalchemy.create_engine("sqlite:///test.sqlite3") + enable_sqlite_foreign_keys(db) e = concurrent.futures.ThreadPoolExecutor(multiprocessing.cpu_count()) pkgs = {} for d in args: @@ -103,8 +104,9 @@ def main(): process_file(pkgs, d) print("reading database") - cur.execute("SELECT name, version FROM package;") - knownpkgs = dict((row[0], row[1]) for row in cur.fetchall()) + with db.begin() as conn: + cur = conn.execute("SELECT name, version FROM package;") + knownpkgs = dict((row[0], row[1]) for row in cur.fetchall()) distpkgs = set(pkgs.keys()) if options.new: for name in distpkgs: @@ -128,7 +130,8 @@ def main(): print("sqlimporting %s" % name) with open(inf) as inp: try: - readyaml(db, inp) + with db.begin() as conn: + readyaml(conn, inp) except Exception as exc: print("%s failed sql with exception %r" % (name, exc)) else: @@ -136,12 +139,13 @@ def main(): if options.prune: delpkgs = knownpkgs - distpkgs - print("clearing packages %s" % " ".join(delpkgs)) - cur.executemany("DELETE FROM package WHERE name = ?;", - ((pkg,) for pkg in delpkgs)) - # Tables content, dependency and sharing will also be pruned - # due to ON DELETE CASCADE clauses. - db.commit() + if delpkgs: + print("clearing packages %s" % " ".join(delpkgs)) + with db.begin() as conn: + conn.execute(sqlalchemy.text("DELETE FROM package WHERE name = :name;"), + [dict(name=pkg) for pkg in delpkgs]) + # Tables content, dependency and sharing will also be pruned + # due to ON DELETE CASCADE clauses. try: os.rmdir(tmpdir) except OSError as err: |