autoimport: avoid hard coded temporary directory
[~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 id, version FROM package WHERE name = ?;",
18                     (package,))
19     row = cur.fetchone()
20     if row:
21         pid, version = row
22         if version_compare(version, metadata["version"]) > 0:
23             return
24     else:
25         pid = None
26
27     cur.execute("BEGIN;")
28     cur.execute("SELECT name, id FROM function;")
29     funcmapping = dict(cur.fetchall())
30     if pid is not None:
31         cur.execute("DELETE FROM content WHERE pid = ?;", (pid,))
32         cur.execute("DELETE FROM dependency WHERE pid = ?;", (pid,))
33         cur.execute("UPDATE package SET version = ?, architecture = ?, source = ? WHERE id = ?;",
34                     (metadata["version"], metadata["architecture"], metadata["source"], pid))
35     else:
36         cur.execute("INSERT INTO package (name, version, architecture, source) VALUES (?, ?, ?, ?);",
37                     (package, metadata["version"], metadata["architecture"],
38                      metadata["source"]))
39         pid = cur.lastrowid
40     cur.executemany("INSERT INTO dependency (pid, required) VALUES (?, ?);",
41                     ((pid, dep) for dep in metadata["depends"]))
42     for entry in gen:
43         if entry == "commit":
44             db.commit()
45             return
46
47         cur.execute("INSERT INTO content (pid, filename, size) VALUES (?, ?, ?);",
48                     (pid, entry["name"], entry["size"]))
49         cid = cur.lastrowid
50         cur.executemany("INSERT INTO hash (cid, fid, hash) VALUES (?, ?, ?);",
51                         ((cid, funcmapping[func], hexhash)
52                          for func, hexhash in entry["hashes"].items()))
53     raise ValueError("missing commit block")
54
55 def main():
56     db = sqlite3.connect("test.sqlite3")
57     readyaml(db, sys.stdin)
58
59 if __name__ == "__main__":
60     main()