autoimport: don't fork for readyaml
[~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 readyaml(db, stream):
12     cur = db.cursor()
13     cur.execute("PRAGMA foreign_keys = ON;")
14     gen = yaml.safe_load_all(stream)
15     metadata = next(gen)
16     package = metadata["package"]
17     cur.execute("SELECT version FROM package WHERE package = ?;",
18                     (package,))
19     row = cur.fetchone()
20     if row and version_compare(row[0], metadata["version"]) > 0:
21         return
22
23     cur.execute("BEGIN;")
24     cur.execute("DELETE FROM content WHERE package = ?;",
25                 (package,))
26     cur.execute("INSERT OR REPLACE INTO package (package, version, architecture, source) VALUES (?, ?, ?, ?);",
27                 (package, metadata["version"], metadata["architecture"],
28                  metadata["source"]))
29     cur.execute("DELETE FROM dependency WHERE package = ?;",
30                 (package,))
31     cur.executemany("INSERT INTO dependency (package, required) VALUES (?, ?);",
32                     ((package, dep) for dep in metadata["depends"]))
33     for entry in gen:
34         if entry == "commit":
35             db.commit()
36             return
37
38         cur.execute("INSERT INTO content (package, filename, size) VALUES (?, ?, ?);",
39                     (package, entry["name"], entry["size"]))
40         cid = cur.lastrowid
41         cur.executemany("INSERT INTO hash (cid, function, hash) VALUES (?, ?, ?);",
42                         ((cid, func, hexhash)
43                          for func, hexhash in entry["hashes"].items()))
44     raise ValueError("missing commit block")
45
46 def main():
47     db = sqlite3.connect("test.sqlite3")
48     readyaml(db, sys.stdin)
49
50 if __name__ == "__main__":
51     main()