[dak/master] dakweb: add /binary/by_metadata query
This query will replace a heuristic in dh-make-golang(1) and help us resolve
Go build dependencies into Debian build dependencies accurately.
Signed-off-by: Michael Stapelberg <stapelberg@debian.org>
---
dakweb/dakwebserver.py | 1 +
dakweb/queries/binary.py | 50 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 51 insertions(+)
create mode 100644 dakweb/queries/binary.py
diff --git a/dakweb/dakwebserver.py b/dakweb/dakwebserver.py
index 0ddc10cf..7b957344 100755
--- a/dakweb/dakwebserver.py
+++ b/dakweb/dakwebserver.py
@@ -45,6 +45,7 @@ from queries.archive import *
from queries.madison import *
from queries.source import *
from queries.suite import *
+from queries.binary import *
# Set up our initial database connection
d = DBConn()
diff --git a/dakweb/queries/binary.py b/dakweb/queries/binary.py
new file mode 100644
index 00000000..7a5692a2
--- /dev/null
+++ b/dakweb/queries/binary.py
@@ -0,0 +1,50 @@
+"""Debian binary package related queries.
+
+@copyright: 2017 Michael Stapelberg <stapelberg@debian.org>
+@license: GNU General Public License version 2 or later
+"""
+
+import bottle
+import json
+
+from daklib.dbconn import DBConn, DBBinary, DBSource, SourceMetadata, MetadataKey
+from dakweb.webregister import QueryRegister
+
+
+@bottle.route('/binary/by_metadata/<key>')
+def binary_by_metadata(key=None):
+ """
+
+ Finds all Debian binary packages which have the specified metadata set.
+
+ E.g., to find out the Go import paths of all Debian Go packages, query
+ /binary/by_metadata/Go-Import-Path.
+
+ @type key: string
+ @param key: Metadata key to search for.
+
+ @rtype: dictionary
+ @return: A list of dictionaries of
+ - binary
+ - source
+ - metadata value
+ """
+
+ if not key:
+ return bottle.HTTPError(503, 'Metadata key not specified.')
+
+ s = DBConn().session()
+ q = s.query(DBBinary.package, DBSource.source, SourceMetadata.value)
+ q = q.join(DBSource).join(SourceMetadata).join(MetadataKey)
+ q = q.filter(MetadataKey.key == key)
+ q = q.group_by(DBBinary.package, DBSource.source, SourceMetadata.value)
+ ret = []
+ for p in q:
+ ret.append({'binary': p.package,
+ 'source': p.source,
+ 'metadata_value': p.value})
+ s.close()
+
+ return json.dumps(ret)
+
+QueryRegister().register_path('/binary/by_metadata', binary_by_metadata)
--
2.11.0
Reply to: