From 97f312a1b536c92440b04ec3dd743fc2802ab150 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 13 Aug 2021 15:48:25 +0200 Subject: Optimize query_dependents() using prepared queries --- bpkg/package.cxx | 45 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) (limited to 'bpkg/package.cxx') 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; + using prep_query = prepared_query; + + 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 (qn.c_str (), qp)); + + if (!pq) + { + unique_ptr 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 ( - "prerequisite = " + query::_val (dep.string ()) + "AND" + - "configuration = " + query::_val (dep_db.uuid.string ())); + pq = db.prepare_query (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 + query_dependents_cache (database& db, + const package_name& dep, + database& dep_db) + { + vector r; + for (package_dependent& pd: query_dependents (db, dep, dep_db)) + r.push_back (move (pd)); + return r; } } -- cgit v1.1