split the import phase to a yaml stream
[~helmut/debian-dedup.git] / readyaml.py
1 #!/usr/bin/python
2 """This tool reads a yaml file as generated by importpkg.py on stdin and
3 updates the database with the contents."""
4
5 import sqlite3
6 import sys
7
8 from debian.debian_support import version_compare
9 import yaml
10
11 def main():
12     db = sqlite3.connect("test.sqlite3")
13     cur = db.cursor()
14     cur.execute("PRAGMA foreign_keys = ON;")
15     gen = yaml.safe_load_all(sys.stdin)
16     metadata = next(gen)
17     package = metadata["package"]
18     cur.execute("SELECT version FROM package WHERE package = ?;",
19                     (package,))
20     row = cur.fetchone()
21     if row and version_compare(row[0], metadata["version"]) > 0:
22         return
23
24     cur.execute("BEGIN;")
25     cur.execute("DELETE FROM content WHERE package = ?;",
26                 (package,))
27     cur.execute("INSERT OR REPLACE INTO package (package, version, architecture, source) VALUES (?, ?, ?, ?);",
28                 (package, metadata["version"], metadata["architecture"],
29                  metadata["source"]))
30     cur.execute("DELETE FROM dependency WHERE package = ?;",
31                 (package,))
32     cur.executemany("INSERT INTO dependency (package, required) VALUES (?, ?);",
33                     ((package, dep) for dep in metadata["depends"]))
34     for entry in gen:
35         if entry == "commit":
36             db.commit()
37             return
38
39         cur.execute("INSERT INTO content (package, filename, size) VALUES (?, ?, ?);",
40                     (package, entry["name"], entry["size"]))
41         cid = cur.lastrowid
42         cur.executemany("INSERT INTO hash (cid, function, hash) VALUES (?, ?, ?);",
43                         ((cid, func, hexhash)
44                          for func, hexhash in entry["hashes"].items()))
45     raise ValueError("missing commit block")
46
47 if __name__ == "__main__":
48     main()