# # # delete "query_args.hh" # # patch "ChangeLog" # from [4714a67c78c948868a09ed8add6e3a610eaa70a1] # to [2bcdb958aeb132d5aa2313a369517139188930e0] # # patch "database.cc" # from [e4f0c515bff3ad55a7880aeb3c8eeeb2686348a3] # to [bfb031cff2341ac7363ac7731326c98aacaa819a] # # patch "database.hh" # from [8aac44bf6fb3bdb0477933e06a915671cb448029] # to [dd9695e867200e94e2d10b9e9bd74bd423c0ac10] # ============================================================ --- ChangeLog 4714a67c78c948868a09ed8add6e3a610eaa70a1 +++ ChangeLog 2bcdb958aeb132d5aa2313a369517139188930e0 @@ -1,3 +1,8 @@ +2006-01-23 Nathaniel Smith + + * database.{cc,hh}: Clean up code formatting a bit, rename some + variables, rely more on automatic conversion. + 2006-01-24 Vinzenz Feenstra * query_args.hh: Introduced struct query_args and struct ============================================================ --- database.cc e4f0c515bff3ad55a7880aeb3c8eeeb2686348a3 +++ database.cc bfb031cff2341ac7363ac7731326c98aacaa819a @@ -38,8 +38,6 @@ #include "xdelta.hh" #include "epoch.hh" -#include "query_args.hh" - // defined in schema.sql, converted to header: #include "schema.h" @@ -62,57 +60,53 @@ namespace { - query_args_param - text(std::string const & txt) - { - query_args_param q = { - query_args_param::text, - txt, - txt.size() - }; - return q; - } + struct query_param + { + enum arg_type { text, blob }; + arg_type type; + std::string data; + }; - query_args_param - text(char const * txt) - { - query_args_param q = { - query_args_param::text, - std::string(txt), - strlen(txt) - }; - return q; - } + query_param + text(std::string const & txt) + { + query_param q = { + query_param::text, + txt, + }; + return q; + } + + query_param + blob(std::string const & blb) + { + query_param q = { + query_param::blob, + blb, + }; + return q; + } + + // track all open databases for close_all_databases() handler + set sql_contexts; +} - query_args_param - blob(void const * data, - size_t const size) - { - char const * ptr = reinterpret_cast(data); - query_args_param q = { - query_args_param::blob, - std::string(ptr,ptr+size), - size - }; - return q; - } +struct query +{ + query(std::string const & cmd) + : sql_cmd(cmd) + {} + + query & operator %(query_param const & qp) + { + args.push_back(qp); + return *this; + } + + std::vector args; + std::string sql_cmd; +}; - query_args_param - blob(char const * data, - size_t const size) - { - query_args_param q = { - query_args_param::blob, - std::string(data,data+size), - size - }; - return q; - } - - // track all open databases for close_all_databases() handler - set sql_contexts; -} - extern "C" { // some wrappers to ease migration const char *sqlite3_value_text_s(sqlite3_value *v); @@ -152,14 +146,14 @@ string revisions_query = "SELECT 1 FROM revisions LIMIT 1"; string rosters_query = "SELECT 1 FROM rosters LIMIT 1"; - fetch(res_revisions, one_col, any_rows, query_args(revisions_query)); + fetch(res_revisions, one_col, any_rows, query(revisions_query)); if (res_revisions.size() > 0) { // they have revisions, so they can't be _ancient_, but they still might // not have rosters results res_rosters; - fetch(res_rosters, one_col, any_rows, query_args(rosters_query)); + fetch(res_rosters, one_col, any_rows, query(rosters_query)); N(res_rosters.size() != 0, F("database %s contains revisions but no rosters\n" "if you are a project leader or doing local testing:\n" @@ -178,7 +172,7 @@ // init; commit; db kill_rev_locally", and then upgrading to a // rosterified monotone.) results res_manifests; - fetch(res_manifests, one_col, any_rows, query_args(manifests_query)); + fetch(res_manifests, one_col, any_rows, query(manifests_query)); N(res_manifests.size() == 0, F("database %s contains manifests but no revisions\n" "this is a very old database; it needs to be upgraded\n" @@ -482,7 +476,7 @@ database::debug(string const & sql, ostream & out) { results res; - fetch(res, any_cols, any_rows, query_args(sql)); + fetch(res, any_cols, any_rows, query(sql)); out << "'" << sql << "' -> " << res.size() << " rows\n" << endl; for (size_t i = 0; i < res.size(); ++i) { @@ -616,7 +610,7 @@ } void -database::execute(query_args const & query) +database::execute(query const & query) { results res; fetch(res, 0, 0, query ); @@ -626,7 +620,7 @@ database::fetch(results & res, int const want_cols, int const want_rows, - query_args const & query) + query const & query) { int nrow; int ncol; @@ -661,8 +655,8 @@ int params = sqlite3_bind_parameter_count(i->second.stmt()); - // Ensure that not to less or to much parameters are given - I( params == int(query.args.size())); + // Ensure that exactly the right number of parameters were given + I(params == int(query.args.size())); // profiling finds this logging to be quite expensive if (global_sanity.debug) @@ -681,9 +675,25 @@ L(FL("binding %d with value '%s'\n") % param % log); } - sqlite3_bind_text(i->second.stmt(), param , - query.args[param-1].data.c_str(), - -1, SQLITE_TRANSIENT); + switch (idx(query.args, param - 1).type) + { + case query_param::text: + sqlite3_bind_text(i->second.stmt(), param, + idx(query.args, param - 1).data.c_str(), -1, + SQLITE_STATIC); + break; + case query_param::blob: + { + std::string const & data = idx(query.args, param - 1).data; + sqlite3_bind_blob(i->second.stmt(), param, + data.data(), data.size(), + SQLITE_STATIC); + } + break; + default: + I(false); + } + assert_sqlite3_ok(sql()); } @@ -733,9 +743,9 @@ if (transaction_level == 0) { if (exclusive) - execute(query_args("BEGIN EXCLUSIVE")); + execute(query("BEGIN EXCLUSIVE")); else - execute(query_args("BEGIN DEFERRED")); + execute(query("BEGIN DEFERRED")); transaction_exclusive = exclusive; } else @@ -751,7 +761,7 @@ database::commit_transaction() { if (transaction_level == 1) - execute(query_args("COMMIT")); + execute(query("COMMIT")); transaction_level--; } @@ -759,7 +769,7 @@ database::rollback_transaction() { if (transaction_level == 1) - execute(query_args("ROLLBACK")); + execute(query("ROLLBACK")); transaction_level--; } @@ -769,8 +779,8 @@ string const & table) { results res; - string query = "SELECT id FROM " + table + " WHERE id = ?"; - fetch(res, one_col, any_rows, query_args(query) % text(ident())); + query q("SELECT id FROM " + table + " WHERE id = ?"); + fetch(res, one_col, any_rows, q % text(ident())); I((res.size() == 1) || (res.size() == 0)); return res.size() == 1; } @@ -781,8 +791,8 @@ string const & table) { results res; - string query = "SELECT id FROM " + table + " WHERE id = ?"; - fetch(res, one_col, any_rows, query_args(query) % text(ident())); + query q("SELECT id FROM " + table + " WHERE id = ?"); + fetch(res, one_col, any_rows, q % text(ident())); return res.size() > 0; } @@ -790,8 +800,8 @@ database::count(string const & table) { results res; - string query = "SELECT COUNT(*) FROM " + table; - fetch(res, one_col, one_row, query_args(query)); + query q("SELECT COUNT(*) FROM " + table); + fetch(res, one_col, one_row, q); return lexical_cast(res[0][0]); } @@ -801,8 +811,8 @@ results res; // COALESCE is required since SUM({empty set}) is NULL. // the sqlite docs for SUM suggest this as a workaround - string query = "SELECT COALESCE(SUM(LENGTH(" + concatenated_columns + ")), 0) FROM " + table; - fetch(res, one_col, one_row, query_args(query)); + query q("SELECT COALESCE(SUM(LENGTH(" + concatenated_columns + ")), 0) FROM " + table); + fetch(res, one_col, one_row, q); return lexical_cast(res[0][0]); } @@ -810,8 +820,8 @@ database::get_ids(string const & table, set< hexenc > & ids) { results res; - string query = "SELECT id FROM " + table; - fetch(res, one_col, any_rows, query_args(query)); + query q("SELECT id FROM " + table); + fetch(res, one_col, any_rows, q); for (size_t i = 0; i < res.size(); ++i) { @@ -825,8 +835,8 @@ string const & table) { results res; - string query = "SELECT data FROM " + table + " WHERE id = ?"; - fetch(res, one_col, one_row, query_args(query) % text(ident())); + query q("SELECT data FROM " + table + " WHERE id = ?"); + fetch(res, one_col, one_row, q % text(ident())); // consistency check base64 > rdata(res[0][0]); @@ -849,10 +859,8 @@ I(ident() != ""); I(base() != ""); results res; - string query = "SELECT delta FROM " + table + " WHERE id = ? AND base = ?"; - fetch(res, one_col, one_row, query_args(query) - % text(ident()) - % text(base())); + query q("SELECT delta FROM " + table + " WHERE id = ? AND base = ?"); + fetch(res, one_col, one_row, q % text(ident()) % text(base())); base64 > del_packed = res[0][0]; unpack(del_packed, del); @@ -875,7 +883,7 @@ pack(dat, dat_packed); string insert = "INSERT INTO " + table + " VALUES(?, ?)"; - execute(query_args(insert) + execute(query(insert) % text(ident()) % text(dat_packed())); } @@ -893,7 +901,7 @@ pack(del, del_packed); string insert = "INSERT INTO "+table+" VALUES(?, ?, ?)"; - execute(query_args(insert) + execute(query(insert) % text(ident()) % text(base()) % text(del_packed())); @@ -1069,7 +1077,7 @@ // This tip is not a root, so extend the path. results res; fetch(res, one_col, any_rows, - query_args(delta_query) + query(delta_query) % text(tip())); I(res.size() != 0); @@ -1154,7 +1162,7 @@ string const & table) { string drop = "DELETE FROM " + table + " WHERE id = ?"; - execute(query_args(drop) % text(ident())); + execute(query(drop) % text(ident())); } void @@ -1209,10 +1217,8 @@ { results res; - string query = "SELECT id FROM " + delta_table + " WHERE base = ?"; - fetch(res, one_col, any_rows, - query_args(query) - % text(target_id())); + query q("SELECT id FROM " + delta_table + " WHERE base = ?"); + fetch(res, one_col, any_rows, q % text(target_id())); for (size_t i = 0; i < res.size(); ++i) { hexenc old_id(res[i][0]); @@ -1233,10 +1239,8 @@ hexenc newer_id; data newer_data; results res; - string query = "SELECT base FROM " + delta_table + " WHERE id = ?"; - fetch(res, one_col, any_rows, - query_args(query) - % text(target_id())); + query q("SELECT base FROM " + delta_table + " WHERE id = ?"); + fetch(res, one_col, any_rows, q % text(target_id())); I(res.size() > 0); newer_id = hexenc(res[0][0]); get_version(newer_id, newer_data, data_table, delta_table); @@ -1248,8 +1252,8 @@ put_delta(i->first, newer_id, bypass_delta, delta_table); } } - string query = "DELETE from " + delta_table + " WHERE id = ?"; - execute(query_args(query) % text(target_id())); + execute(query("DELETE from " + delta_table + " WHERE id = ?") + % text(target_id())); } else { @@ -1258,8 +1262,8 @@ for (map, data>::const_iterator i = older.begin(); i != older.end(); ++i) put(i->first, i->second, data_table); - string query = "DELETE from " + data_table + " WHERE id = ?"; - execute(query_args(query) % text(target_id())); + execute(query("DELETE from " + data_table + " WHERE id = ?") + % text(target_id())); } guard.commit(); @@ -1296,9 +1300,8 @@ database::roster_link_exists_for_revision(revision_id const & rev_id) { results res; - string query = ("SELECT roster_id FROM revision_roster WHERE rev_id = ? "); fetch(res, one_col, any_rows, - query_args(query.c_str()) + query("SELECT roster_id FROM revision_roster WHERE rev_id = ? ") % text(rev_id.inner()())); I((res.size() == 1) || (res.size() == 0)); return res.size() == 1; @@ -1308,9 +1311,8 @@ database::roster_exists_for_revision(revision_id const & rev_id) { results res; - string query = ("SELECT roster_id FROM revision_roster WHERE rev_id = ? "); fetch(res, one_col, any_rows, - query_args(query) + query("SELECT roster_id FROM revision_roster WHERE rev_id = ? ") % text(rev_id.inner()())); I((res.size() == 1) || (res.size() == 0)); return (res.size() == 1) && roster_version_exists(hexenc(res[0][0])); @@ -1321,8 +1323,7 @@ { links.clear(); results res; - string query = ("SELECT rev_id, roster_id FROM revision_roster"); - fetch(res, 2, any_rows, query_args(query)); + fetch(res, 2, any_rows, query("SELECT rev_id, roster_id FROM revision_roster")); for (size_t i = 0; i < res.size(); ++i) { links.insert(make_pair(revision_id(res[i][0]), @@ -1399,7 +1400,7 @@ results res; graph.clear(); fetch(res, 2, any_rows, - query_args("SELECT parent,child FROM revision_ancestry")); + query("SELECT parent,child FROM revision_ancestry")); for (size_t i = 0; i < res.size(); ++i) graph.insert(std::make_pair(revision_id(res[i][0]), revision_id(res[i][1]))); @@ -1413,7 +1414,7 @@ results res; parents.clear(); fetch(res, one_col, any_rows, - query_args("SELECT parent FROM revision_ancestry WHERE child = ?") + query("SELECT parent FROM revision_ancestry WHERE child = ?") % text(id.inner()())); for (size_t i = 0; i < res.size(); ++i) parents.insert(revision_id(res[i][0])); @@ -1426,7 +1427,7 @@ results res; children.clear(); fetch(res, one_col, any_rows, - query_args("SELECT child FROM revision_ancestry WHERE parent = ?") + query("SELECT child FROM revision_ancestry WHERE parent = ?") % text(id.inner()())); for (size_t i = 0; i < res.size(); ++i) children.insert(revision_id(res[i][0])); @@ -1457,7 +1458,7 @@ I(!null_id(id)); results res; fetch(res, one_col, one_row, - query_args("SELECT data FROM revisions WHERE id = ?") + query("SELECT data FROM revisions WHERE id = ?") % text(id.inner()())); base64 > rdat_packed; @@ -1556,14 +1557,14 @@ base64 > d_packed; pack(d.inner(), d_packed); - execute(query_args("INSERT INTO revisions VALUES(?, ?)") + execute(query("INSERT INTO revisions VALUES(?, ?)") % text(new_id.inner()()) % text(d_packed())); for (edge_map::const_iterator e = rev.edges.begin(); e != rev.edges.end(); ++e) { - execute(query_args("INSERT INTO revision_ancestry VALUES(?, ?)") + execute(query("INSERT INTO revision_ancestry VALUES(?, ?)") % text(edge_old_revision(e).inner()()) % text(new_id.inner()())); } @@ -1590,16 +1591,16 @@ void database::delete_existing_revs_and_certs() { - execute(query_args("DELETE FROM revisions")); - execute(query_args("DELETE FROM revision_ancestry")); - execute(query_args("DELETE FROM revision_certs")); + execute(query("DELETE FROM revisions")); + execute(query("DELETE FROM revision_ancestry")); + execute(query("DELETE FROM revision_certs")); } void database::delete_existing_manifests() { - execute(query_args("DELETE FROM manifests")); - execute(query_args("DELETE FROM manifest_deltas")); + execute(query("DELETE FROM manifests")); + execute(query("DELETE FROM manifest_deltas")); } /// Deletes one revision from the local database. @@ -1619,13 +1620,13 @@ L(FL("Killing revision %s locally\n") % rid); // Kill the certs, ancestry, and rev itself. - execute(query_args("DELETE from revision_certs WHERE id = ?") + execute(query("DELETE from revision_certs WHERE id = ?") % text(rid.inner()())); - execute(query_args("DELETE from revision_ancestry WHERE child = ?") + execute(query("DELETE from revision_ancestry WHERE child = ?") % text(rid.inner()())); - execute(query_args("DELETE from revisions WHERE id = ?") + execute(query("DELETE from revisions WHERE id = ?") % text(rid.inner()())); // Find the associated roster and count the number of links to it @@ -1634,15 +1635,15 @@ get_roster_id_for_revision(rid, roster_id); { results res; - string query = ("SELECT rev_id, roster_id FROM revision_roster " - "WHERE roster_id = ?"); - fetch(res, 2, any_rows, query_args(query) % text(roster_id())); + fetch(res, 2, any_rows, + query("SELECT rev_id, roster_id FROM revision_roster " + "WHERE roster_id = ?") % text(roster_id())); I(res.size() > 0); link_count = res.size(); } // Delete our link. - execute(query_args("DELETE from revision_roster WHERE rev_id = ?") + execute(query("DELETE from revision_roster WHERE rev_id = ?") % text(rid.inner()())); // If that was the last link to the roster, kill the roster too. @@ -1659,9 +1660,9 @@ base64 encoded; encode_base64(branch, encoded); L(FL("Deleting all references to branch %s\n") % branch); - execute(query_args("DELETE FROM revision_certs WHERE name='branch' AND value =?") + execute(query("DELETE FROM revision_certs WHERE name='branch' AND value =?") % text(encoded())); - execute(query_args("DELETE FROM branch_epochs WHERE branch=?") + execute(query("DELETE FROM branch_epochs WHERE branch=?") % text(encoded())); } @@ -1672,7 +1673,7 @@ base64 encoded; encode_base64(tag, encoded); L(FL("Deleting all references to tag %s\n") % tag); - execute(query_args("DELETE FROM revision_certs WHERE name='tag' AND value =?") + execute(query("DELETE FROM revision_certs WHERE name='tag' AND value =?") % text(encoded())); } @@ -1687,11 +1688,11 @@ if (pattern != "") fetch(res, one_col, any_rows, - query_args("SELECT id FROM public_keys WHERE id GLOB ?") + query("SELECT id FROM public_keys WHERE id GLOB ?") % text(pattern)); else fetch(res, one_col, any_rows, - query_args("SELECT id FROM public_keys")); + query("SELECT id FROM public_keys")); for (size_t i = 0; i < res.size(); ++i) pubkeys.push_back(res[i][0]); @@ -1702,8 +1703,7 @@ { keys.clear(); results res; - string query = "SELECT id FROM " + table; - fetch(res, one_col, any_rows, query_args(query)); + fetch(res, one_col, any_rows, query("SELECT id FROM " + table)); for (size_t i = 0; i < res.size(); ++i) keys.push_back(res[i][0]); } @@ -1719,7 +1719,7 @@ { results res; fetch(res, one_col, any_rows, - query_args("SELECT id FROM public_keys WHERE hash = ?") + query("SELECT id FROM public_keys WHERE hash = ?") % text(hash())); I((res.size() == 1) || (res.size() == 0)); if (res.size() == 1) @@ -1732,7 +1732,7 @@ { results res; fetch(res, one_col, any_rows, - query_args("SELECT id FROM public_keys WHERE id = ?") + query("SELECT id FROM public_keys WHERE id = ?") % text(id())); I((res.size() == 1) || (res.size() == 0)); if (res.size() == 1) @@ -1747,7 +1747,7 @@ { results res; fetch(res, 2, one_row, - query_args("SELECT id, keydata FROM public_keys WHERE hash = ?") + query("SELECT id, keydata FROM public_keys WHERE hash = ?") % text(hash())); id = res[0][0]; pub_encoded = res[0][1]; @@ -1759,7 +1759,7 @@ { results res; fetch(res, one_col, one_row, - query_args("SELECT keydata FROM public_keys WHERE id = ?") + query("SELECT keydata FROM public_keys WHERE id = ?") % text(pub_id())); pub_encoded = res[0][0]; } @@ -1773,7 +1773,7 @@ I(!public_key_exists(thash)); E(!public_key_exists(pub_id), F("another key with name '%s' already exists") % pub_id); - execute(query_args("INSERT INTO public_keys VALUES(?, ?, ?)") + execute(query("INSERT INTO public_keys VALUES(?, ?, ?)") % text(thash()) % text(pub_id()) % text(pub_encoded())); @@ -1782,7 +1782,7 @@ void database::delete_public_key(rsa_keypair_id const & pub_id) { - execute(query_args("DELETE FROM public_keys WHERE id = ?") + execute(query("DELETE FROM public_keys WHERE id = ?") % text(pub_id())); } @@ -1793,20 +1793,19 @@ string const & table) { results res; - string query = - "SELECT id FROM " + table + " WHERE id = ? " - "AND name = ? " - "AND value = ? " - "AND keypair = ? " - "AND signature = ?"; + query q = query("SELECT id FROM " + table + " WHERE id = ? " + "AND name = ? " + "AND value = ? " + "AND keypair = ? " + "AND signature = ?") + % text(t.ident()) + % text(t.name()) + % text(t.value()) + % text(t.key()) + % text(t.sig()); - fetch(res, 1, any_rows, - query_args(query) - % text(t.ident()) - % text(t.name()) - % text(t.value()) - % text(t.key()) - % text(t.sig())); + fetch(res, 1, any_rows, q); + I(res.size() == 0 || res.size() == 1); return res.size() == 1; } @@ -1820,7 +1819,7 @@ string insert = "INSERT INTO " + table + " VALUES(?, ?, ?, ?, ?, ?)"; - execute(query_args(insert) + execute(query(insert) % text(thash()) % text(t.ident()) % text(t.name()) @@ -1887,8 +1886,8 @@ string const & table) { results res; - string query = "SELECT id, name, value, keypair, signature FROM " + table; - fetch(res, 5, any_rows, query_args(query)); + query q("SELECT id, name, value, keypair, signature FROM " + table); + fetch(res, 5, any_rows, q); results_to_certs(res, certs); } @@ -1899,11 +1898,10 @@ string const & table) { results res; - string query = - "SELECT id, name, value, keypair, signature FROM " + table + - " WHERE id = ?"; + query q("SELECT id, name, value, keypair, signature FROM " + table + + " WHERE id = ?"); - fetch(res, 5, any_rows, query_args(query) % text(ident())); + fetch(res, 5, any_rows, q % text(ident())); results_to_certs(res, certs); } @@ -1914,10 +1912,9 @@ string const & table) { results res; - string query = - "SELECT id, name, value, keypair, signature FROM " + table + - " WHERE name = ?"; - fetch(res, 5, any_rows, query_args(query) % text(name())); + query q("SELECT id, name, value, keypair, signature FROM " + table + + " WHERE name = ?"); + fetch(res, 5, any_rows, q % text(name())); results_to_certs(res, certs); } @@ -1929,14 +1926,12 @@ string const & table) { results res; - string query = - "SELECT id, name, value, keypair, signature FROM " + table + - " WHERE id = ? AND name = ?"; + query q("SELECT id, name, value, keypair, signature FROM " + table + + " WHERE id = ? AND name = ?"); fetch(res, 5, any_rows, - query_args(query) - % text(ident()) - % text(name())); + q % text(ident()) + % text(name())); results_to_certs(res, certs); } @@ -1947,14 +1942,12 @@ string const & table) { results res; - string query = - "SELECT id, name, value, keypair, signature FROM " + table + - " WHERE name = ? AND value = ?"; + query q("SELECT id, name, value, keypair, signature FROM " + table + + " WHERE name = ? AND value = ?"); fetch(res, 5, any_rows, - query_args(query) - % text(name()) - % text(val())); + q % text(name()) + % text(val())); results_to_certs(res, certs); } @@ -1967,15 +1960,13 @@ string const & table) { results res; - string query = - "SELECT id, name, value, keypair, signature FROM " + table + - " WHERE id = ? AND name = ? AND value = ?"; + query q("SELECT id, name, value, keypair, signature FROM " + table + + " WHERE id = ? AND name = ? AND value = ?"); fetch(res, 5, any_rows, - query_args(query) - % text(ident()) - % text(name()) - % text(value())); + q % text(ident()) + % text(name()) + % text(value())); results_to_certs(res, certs); } @@ -1998,7 +1989,7 @@ { results res; fetch(res, 3, any_rows, - query_args("SELECT hash, id, keypair " + query("SELECT hash, id, keypair " "FROM 'revision_certs' WHERE name != 'branch'")); idx.clear(); @@ -2081,7 +2072,7 @@ results res; vector certs; fetch(res, one_col, any_rows, - query_args("SELECT hash " + query("SELECT hash " "FROM revision_certs " "WHERE id = ?") % text(ident.inner()())); @@ -2097,7 +2088,7 @@ results res; vector certs; fetch(res, 5, one_row, - query_args("SELECT id, name, value, keypair, signature " + query("SELECT id, name, value, keypair, signature " "FROM revision_certs " "WHERE hash = ?") % text(hash())); @@ -2112,7 +2103,7 @@ results res; vector certs; fetch(res, one_col, any_rows, - query_args("SELECT id " + query("SELECT id " "FROM revision_certs " "WHERE hash = ?") % text(hash())); @@ -2153,7 +2144,7 @@ string pattern = partial + "*"; fetch(res, 1, any_rows, - query_args("SELECT id FROM revisions WHERE id GLOB ?") + query("SELECT id FROM revisions WHERE id GLOB ?") % text(pattern)); for (size_t i = 0; i < res.size(); ++i) @@ -2171,7 +2162,7 @@ string pattern = partial + "*"; fetch(res, 1, any_rows, - query_args("SELECT id FROM files WHERE id GLOB ?") + query("SELECT id FROM files WHERE id GLOB ?") % text(pattern)); for (size_t i = 0; i < res.size(); ++i) @@ -2180,7 +2171,7 @@ res.clear(); fetch(res, 1, any_rows, - query_args("SELECT id FROM file_deltas WHERE id GLOB ?") + query("SELECT id FROM file_deltas WHERE id GLOB ?") % text(pattern)); for (size_t i = 0; i < res.size(); ++i) @@ -2197,7 +2188,7 @@ string pattern = partial + "*"; fetch(res, 2, any_rows, - query_args("SELECT hash, id FROM public_keys WHERE hash GLOB ?") + query("SELECT hash, id FROM public_keys WHERE hash GLOB ?") % text(pattern)); for (size_t i = 0; i < res.size(); ++i) @@ -2328,7 +2319,7 @@ string subquery = (boost::format("SELECT DISTINCT value FROM revision_certs WHERE name='%s' and unbase64(value) glob '%s'") % branch_cert_name % i->second).str(); results res; - fetch(res, one_col, any_rows, query_args(subquery)); + fetch(res, one_col, any_rows, query(subquery)); for (size_t i = 0; i < res.size(); ++i) { base64 row_encoded(res[i][0]); @@ -2404,19 +2395,19 @@ // will complete either some idents, or cert values, or "unknown" // which generally means "author, tag or branch" - string query; + string query_str; if (ty == selectors::sel_ident) { - query = (boost::format("SELECT id FROM %s") % lim).str(); + query_str = (boost::format("SELECT id FROM %s") % lim).str(); } else { string prefix = "*"; string suffix = "*"; - query = "SELECT value FROM revision_certs WHERE"; + query_str = "SELECT value FROM revision_certs WHERE"; if (ty == selectors::sel_unknown) { - query += + query_str += (boost::format(" (name='%s' OR name='%s' OR name='%s')") % author_cert_name % tag_cert_name @@ -2426,19 +2417,17 @@ { string certname; selector_to_certname(ty, certname, prefix, suffix); - query += + query_str += (boost::format(" (name='%s')") % certname).str(); } - query += (boost::format(" AND (unbase64(value) GLOB '%s%s%s')") + query_str += (boost::format(" AND (unbase64(value) GLOB '%s%s%s')") % prefix % partial % suffix).str(); - query += (boost::format(" AND (id IN %s)") % lim).str(); + query_str += (boost::format(" AND (id IN %s)") % lim).str(); } - // std::cerr << query << std::endl; // debug expr - results res; - fetch(res, one_col, any_rows, query_args(query)); + fetch(res, one_col, any_rows, query(query_str)); for (size_t i = 0; i < res.size(); ++i) { if (ty == selectors::sel_ident) @@ -2460,7 +2449,7 @@ { epochs.clear(); results res; - fetch(res, 2, any_rows, query_args("SELECT branch, epoch FROM branch_epochs")); + fetch(res, 2, any_rows, query("SELECT branch, epoch FROM branch_epochs")); for (results::const_iterator i = res.begin(); i != res.end(); ++i) { base64 encoded(idx(*i, 0)); @@ -2478,7 +2467,7 @@ I(epoch_exists(eid)); results res; fetch(res, 2, any_rows, - query_args("SELECT branch, epoch FROM branch_epochs" + query("SELECT branch, epoch FROM branch_epochs" " WHERE hash = ?") % text(eid.inner()())); I(res.size() == 1); @@ -2492,7 +2481,7 @@ { results res; fetch(res, one_col, any_rows, - query_args("SELECT hash FROM branch_epochs WHERE hash = ?") + query("SELECT hash FROM branch_epochs WHERE hash = ?") % text(eid.inner()())); I(res.size() == 1 || res.size() == 0); return res.size() == 1; @@ -2506,7 +2495,7 @@ encode_base64(branch, encoded); epoch_hash_code(branch, epo, eid); I(epo.inner()().size() == constants::epochlen); - execute(query_args("INSERT OR REPLACE INTO branch_epochs VALUES(?, ?, ?)") + execute(query("INSERT OR REPLACE INTO branch_epochs VALUES(?, ?, ?)") % text(eid.inner()()) % text(encoded()) % text(epo.inner()())); @@ -2517,7 +2506,7 @@ { base64 encoded; encode_base64(branch, encoded); - execute(query_args("DELETE FROM branch_epochs WHERE branch = ?") + execute(query("DELETE FROM branch_epochs WHERE branch = ?") % text(encoded())); } @@ -2528,7 +2517,7 @@ { vars.clear(); results res; - fetch(res, 3, any_rows, query_args("SELECT domain, name, value FROM db_vars")); + fetch(res, 3, any_rows, query("SELECT domain, name, value FROM db_vars")); for (results::const_iterator i = res.begin(); i != res.end(); ++i) { var_domain domain(idx(*i, 0)); @@ -2571,7 +2560,7 @@ encode_base64(key.second, name_encoded); base64 value_encoded; encode_base64(value, value_encoded); - execute(query_args("INSERT OR REPLACE INTO db_vars VALUES(?, ?, ?)") + execute(query("INSERT OR REPLACE INTO db_vars VALUES(?, ?, ?)") % text(key.first()) % text(name_encoded()) % text(value_encoded())); @@ -2582,7 +2571,7 @@ { base64 name_encoded; encode_base64(key.second, name_encoded); - execute(query_args("DELETE FROM db_vars WHERE domain = ? AND name = ?") + execute(query("DELETE FROM db_vars WHERE domain = ? AND name = ?") % text(key.first()) % text(name_encoded())); } @@ -2593,9 +2582,9 @@ database::get_branches(vector & names) { results res; - string query="SELECT DISTINCT value FROM revision_certs WHERE name= ?"; - string cert_name="branch"; - fetch(res, one_col, any_rows, query_args(query) % text(cert_name)); + query q("SELECT DISTINCT value FROM revision_certs WHERE name = ?"); + string cert_name = "branch"; + fetch(res, one_col, any_rows, q % text(cert_name)); for (size_t i = 0; i < res.size(); ++i) { base64 row_encoded(res[i][0]); @@ -2616,10 +2605,8 @@ } results res; - string query = ("SELECT roster_id FROM revision_roster WHERE rev_id = ? "); - fetch(res, one_col, any_rows, - query_args(query) - % text(rev_id.inner()())); + query q("SELECT roster_id FROM revision_roster WHERE rev_id = ? "); + fetch(res, one_col, any_rows, q % text(rev_id.inner()())); I(res.size() == 1); roster_id = hexenc(res[0][0]); } @@ -2685,7 +2672,7 @@ transaction_guard guard(*this); - execute(query_args("INSERT into revision_roster VALUES (?, ?)") + execute(query("INSERT into revision_roster VALUES (?, ?)") % text(rev_id.inner()()) % text(new_id())); @@ -2774,7 +2761,7 @@ b_uncommon_ancs.clear(); fetch(res, 2, any_rows, - query_args("SELECT parent,child FROM revision_ancestry")); + query("SELECT parent,child FROM revision_ancestry")); set a_ancs, b_ancs; @@ -2803,13 +2790,13 @@ // We implement this as a fixed db var. fetch(res, one_col, any_rows, - query_args("SELECT node FROM next_roster_node_number")); + query("SELECT node FROM next_roster_node_number")); node_id n; if (res.empty()) { n = 1; - execute (query_args("INSERT INTO next_roster_node_number VALUES(?)") + execute (query("INSERT INTO next_roster_node_number VALUES(?)") % text(lexical_cast(n))); } else @@ -2817,7 +2804,7 @@ I(res.size() == 1); n = lexical_cast(res[0][0]); ++n; - execute (query_args("UPDATE next_roster_node_number SET node = ?") + execute (query("UPDATE next_roster_node_number SET node = ?") % text(lexical_cast(n))); } ============================================================ --- database.hh 8aac44bf6fb3bdb0477933e06a915671cb448029 +++ database.hh dd9695e867200e94e2d10b9e9bd74bd423c0ac10 @@ -71,7 +71,7 @@ struct posting; struct app_state; struct revision_set; -struct query_args; +struct query; class database { @@ -99,12 +99,12 @@ typedef std::vector< std::vector > results; - void execute(query_args const & query); + void execute(query const & q); void fetch(results & res, int const want_cols, int const want_rows, - query_args const & query); + query const & q); bool exists(hexenc const & ident, std::string const & table);