diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2021-08-13 15:48:25 +0200 |
---|---|---|
committer | Karen Arutyunov <karen@codesynthesis.com> | 2021-08-13 17:23:50 +0300 |
commit | 97f312a1b536c92440b04ec3dd743fc2802ab150 (patch) | |
tree | c232649f6bfb1f566032ad5c5e6e185b3df7d100 /bpkg/package.cxx | |
parent | d1fa0047be1db658b165514dc429ce494517b39c (diff) |
Optimize query_dependents() using prepared queries
Diffstat (limited to 'bpkg/package.cxx')
-rw-r--r-- | bpkg/package.cxx | 45 |
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; } } |