diff options
author | Helmut Grohne <helmut@subdivi.de> | 2013-06-23 13:04:30 +0200 |
---|---|---|
committer | Helmut Grohne <helmut@subdivi.de> | 2013-06-23 13:04:30 +0200 |
commit | 75cc8a9998d32e714a05760e968e38b71c2ac157 (patch) | |
tree | a7fb707901b00d992fbc915849521dd5964e64de /readyaml.py | |
parent | 523fb675368d180ab9c5a16b6f48a4d29693c8ae (diff) | |
parent | f2bd48d342518c11ec7deaeee5b437ac524514de (diff) | |
download | debian-dedup-75cc8a9998d32e714a05760e968e38b71c2ac157.tar.gz |
Merge master into sqlalchemy
This is necessary to avoid severe merge conflicts when converting
importpkg.py to sqlalchemy. The actual sql invocation has moved to a
different file in master.
Conflicts:
README (diverged set of dependencies)
Diffstat (limited to 'readyaml.py')
-rwxr-xr-x | readyaml.py | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/readyaml.py b/readyaml.py new file mode 100755 index 0000000..e2f3bb3 --- /dev/null +++ b/readyaml.py @@ -0,0 +1,51 @@ +#!/usr/bin/python +"""This tool reads a yaml file as generated by importpkg.py on stdin and +updates the database with the contents.""" + +import sqlite3 +import sys + +from debian.debian_support import version_compare +import yaml + +def readyaml(db, stream): + cur = db.cursor() + cur.execute("PRAGMA foreign_keys = ON;") + gen = yaml.safe_load_all(stream) + metadata = next(gen) + package = metadata["package"] + cur.execute("SELECT version FROM package WHERE package = ?;", + (package,)) + row = cur.fetchone() + if row and version_compare(row[0], metadata["version"]) > 0: + return + + cur.execute("BEGIN;") + cur.execute("DELETE FROM content WHERE package = ?;", + (package,)) + cur.execute("INSERT OR REPLACE INTO package (package, version, architecture, source) VALUES (?, ?, ?, ?);", + (package, metadata["version"], metadata["architecture"], + metadata["source"])) + cur.execute("DELETE FROM dependency WHERE package = ?;", + (package,)) + cur.executemany("INSERT INTO dependency (package, required) VALUES (?, ?);", + ((package, dep) for dep in metadata["depends"])) + for entry in gen: + if entry == "commit": + db.commit() + return + + cur.execute("INSERT INTO content (package, filename, size) VALUES (?, ?, ?);", + (package, entry["name"], entry["size"])) + cid = cur.lastrowid + cur.executemany("INSERT INTO hash (cid, function, hash) VALUES (?, ?, ?);", + ((cid, func, hexhash) + for func, hexhash in entry["hashes"].items())) + raise ValueError("missing commit block") + +def main(): + db = sqlite3.connect("test.sqlite3") + readyaml(db, sys.stdin) + +if __name__ == "__main__": + main() |