aboutsummaryrefslogtreecommitdiff
path: root/bpkg/package.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2021-08-13 15:48:25 +0200
committerKaren Arutyunov <karen@codesynthesis.com>2021-08-13 17:23:50 +0300
commit97f312a1b536c92440b04ec3dd743fc2802ab150 (patch)
treec232649f6bfb1f566032ad5c5e6e185b3df7d100 /bpkg/package.cxx
parentd1fa0047be1db658b165514dc429ce494517b39c (diff)
Optimize query_dependents() using prepared queries
Diffstat (limited to 'bpkg/package.cxx')
-rw-r--r--bpkg/package.cxx45
1 files changed, 42 insertions, 3 deletions
diff --git a/bpkg/package.cxx b/bpkg/package.cxx
index 7995c34..8ad178d 100644
--- a/bpkg/package.cxx
+++ b/bpkg/package.cxx
@@ -684,10 +684,49 @@ namespace bpkg
const package_name& dep,
database& dep_db)
{
+ // Prepare and cache this query since it's executed a lot. Note that we
+ // have to cache one per database.
+ //
using query = query<package_dependent>;
+ using prep_query = prepared_query<package_dependent>;
+
+ struct params
+ {
+ string name;
+ string config; // Configuration UUID.
+ string query_name;
+ };
+
+ params* qp;
+ string qn (db.uuid.string () + "-package-dependent-query");
+ prep_query pq (db.lookup_query<package_dependent> (qn.c_str (), qp));
+
+ if (!pq)
+ {
+ unique_ptr<params> p (qp = new params ());
+ p->query_name = move (qn);
+
+ query q ("prerequisite = " + query::_ref (p->name) + "AND" +
+ "configuration = " + query::_ref (p->config));
- return db.query<package_dependent> (
- "prerequisite = " + query::_val (dep.string ()) + "AND" +
- "configuration = " + query::_val (dep_db.uuid.string ()));
+ pq = db.prepare_query<package_dependent> (p->query_name.c_str (), q);
+ db.cache_query (pq, move (p));
+ }
+
+ qp->name = dep.string ();
+ qp->config = dep_db.uuid.string ();
+
+ return pq.execute ();
+ }
+
+ vector<package_dependent>
+ query_dependents_cache (database& db,
+ const package_name& dep,
+ database& dep_db)
+ {
+ vector<package_dependent> r;
+ for (package_dependent& pd: query_dependents (db, dep, dep_db))
+ r.push_back (move (pd));
+ return r;
}
}