summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sync/util/query_helpers.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/sync/util/query_helpers.h')
-rw-r--r--chrome/browser/sync/util/query_helpers.h698
1 files changed, 698 insertions, 0 deletions
diff --git a/chrome/browser/sync/util/query_helpers.h b/chrome/browser/sync/util/query_helpers.h
new file mode 100644
index 0000000..73aa422
--- /dev/null
+++ b/chrome/browser/sync/util/query_helpers.h
@@ -0,0 +1,698 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Typesafe composition of SQL query strings.
+
+#ifndef CHROME_BROWSER_SYNC_UTIL_QUERY_HELPERS_H_
+#define CHROME_BROWSER_SYNC_UTIL_QUERY_HELPERS_H_
+
+#include <limits>
+#include <string>
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/logging.h"
+#include "chrome/browser/sync/util/sync_types.h"
+#include "third_party/sqlite/preprocessed/sqlite3.h"
+
+// Sometimes threads contend on the DB lock itself, especially when one thread
+// is calling SaveChanges. In the worst case scenario, the user can put his
+// laptop to sleep during db contention, and wake up the laptop days later, so
+// infinity seems like the best choice here.
+const int kDirectoryBackingStoreBusyTimeoutMs = std::numeric_limits<int>::max();
+
+enum SqliteNullType {
+ SQLITE_NULL_VALUE
+};
+
+int SqliteOpen(PathString filename, sqlite3** ppDb);
+
+sqlite3_stmt* PrepareQuery(sqlite3* dbhandle, const char* query);
+#if !PATHSTRING_IS_STD_STRING
+sqlite3_stmt* BindArg(sqlite3_stmt*, const PathString&, int index);
+sqlite3_stmt* BindArg(sqlite3_stmt*, const PathChar*, int index);
+#endif
+sqlite3_stmt* BindArg(sqlite3_stmt*, const std::string&, int index);
+sqlite3_stmt* BindArg(sqlite3_stmt*, const char*, int index);
+sqlite3_stmt* BindArg(sqlite3_stmt*, int32, int index);
+sqlite3_stmt* BindArg(sqlite3_stmt*, int64, int index);
+sqlite3_stmt* BindArg(sqlite3_stmt*, double, int index);
+sqlite3_stmt* BindArg(sqlite3_stmt*, bool, int index);
+sqlite3_stmt* BindArg(sqlite3_stmt*, const std::vector<uint8>&, int index);
+sqlite3_stmt* BindArg(sqlite3_stmt*, SqliteNullType, int index);
+
+#if !PATHSTRING_IS_STD_STRING
+void GetColumn(sqlite3_stmt*, int index, PathString* value);
+#endif
+void GetColumn(sqlite3_stmt*, int index, std::string* value);
+void GetColumn(sqlite3_stmt*, int index, int32* value);
+void GetColumn(sqlite3_stmt*, int index, int64* value);
+void GetColumn(sqlite3_stmt*, int index, double* value);
+void GetColumn(sqlite3_stmt*, int index, bool* value);
+void GetColumn(sqlite3_stmt*, int index, std::vector<uint8>* value);
+
+bool DoesTableExist(sqlite3* dbhandle, const std::string& tablename);
+
+// Prepares a query with a WHERE clause that filters the values by the items
+// passed inside of the Vector.
+// Example:
+//
+// vector<PathString> v;
+// v.push_back("abc");
+// v.push_back("123");
+// PrepareQuery(dbhandle, "SELECT * FROM table", "column_name", v.begin(),
+// v.end(), "ORDER BY id");
+//
+// will produce the following query.
+//
+// SELECT * FROM table WHERE column_name = 'abc' OR column_name = '123' ORDER BY
+// id.
+//
+template<typename ItemIterator>
+sqlite3_stmt* PrepareQueryWhereColumnIn(sqlite3* dbhandle,
+ const std::string& query_head,
+ const std::string& filtername,
+ ItemIterator begin, ItemIterator end,
+ const std::string& query_options) {
+ std::string query;
+ query.reserve(512);
+ query += query_head;
+ const char* joiner = " WHERE ";
+ for (ItemIterator it = begin; it != end; ++it) {
+ query += joiner;
+ query += filtername;
+ query += " = ?";
+ joiner = " OR ";
+ }
+ query += " ";
+ query += query_options;
+ sqlite3_stmt* statement = NULL;
+ const char* query_tail;
+ if (SQLITE_OK != sqlite3_prepare(dbhandle, query.data(),
+ CountBytes(query), &statement,
+ &query_tail)) {
+ LOG(ERROR) << query << "\n" << sqlite3_errmsg(dbhandle);
+ }
+ int index = 1;
+ for (ItemIterator it = begin; it != end; ++it) {
+ BindArg(statement, *it, index);
+ ++index;
+ }
+ return statement;
+}
+
+template <typename Type1>
+inline sqlite3_stmt* PrepareQuery(sqlite3* dbhandle, const char* query,
+ const Type1& arg1) {
+ return BindArg(PrepareQuery(dbhandle, query), arg1, 1);
+}
+
+template <typename Type1, typename Type2>
+inline sqlite3_stmt* PrepareQuery(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2) {
+ return BindArg(PrepareQuery(dbhandle, query, arg1), arg2, 2);
+}
+
+template <typename Type1, typename Type2, typename Type3>
+inline sqlite3_stmt* PrepareQuery(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3) {
+ return BindArg(PrepareQuery(dbhandle, query, arg1, arg2), arg3, 3);
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4>
+inline sqlite3_stmt* PrepareQuery(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4) {
+ return BindArg(PrepareQuery(dbhandle, query, arg1, arg2, arg3), arg4, 4);
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5>
+inline sqlite3_stmt* PrepareQuery(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5) {
+ return BindArg(PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4),
+ arg5, 5);
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6>
+inline sqlite3_stmt* PrepareQuery(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6) {
+ return BindArg(PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5),
+ arg6, 6);
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7>
+inline sqlite3_stmt* PrepareQuery(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7) {
+ return BindArg(PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6),
+ arg7, 7);
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8>
+inline sqlite3_stmt* PrepareQuery(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8) {
+ return BindArg(PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7),
+ arg8, 8);
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9>
+inline sqlite3_stmt* PrepareQuery(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9) {
+ return BindArg(PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8),
+ arg9, 9);
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9, typename Type10>
+inline sqlite3_stmt* PrepareQuery(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9, const Type10& arg10) {
+ return BindArg(PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9),
+ arg10, 10);
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9, typename Type10, typename Type11>
+inline sqlite3_stmt* PrepareQuery(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9, const Type10& arg10,
+ const Type11& arg11) {
+ return BindArg(PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9, arg10),
+ arg11, 11);
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9, typename Type10, typename Type11, typename Type12>
+inline sqlite3_stmt* PrepareQuery(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9, const Type10& arg10,
+ const Type11& arg11, const Type12& arg12) {
+ return BindArg(PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9, arg10, arg11),
+ arg12, 12);
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9, typename Type10, typename Type11, typename Type12,
+ typename Type13>
+inline sqlite3_stmt* PrepareQuery(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9, const Type10& arg10,
+ const Type11& arg11, const Type12& arg12,
+ const Type13& arg13) {
+ return BindArg(PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9, arg10, arg11, arg12),
+ arg13, 13);
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9, typename Type10, typename Type11, typename Type12,
+ typename Type13, typename Type14>
+inline sqlite3_stmt* PrepareQuery(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9, const Type10& arg10,
+ const Type11& arg11, const Type12& arg12,
+ const Type13& arg13, const Type14& arg14) {
+ return BindArg(PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9, arg10, arg11, arg12,
+ arg13),
+ arg14, 14);
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9, typename Type10, typename Type11, typename Type12,
+ typename Type13, typename Type14, typename Type15>
+inline sqlite3_stmt* PrepareQuery(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9, const Type10& arg10,
+ const Type11& arg11, const Type12& arg12,
+ const Type13& arg13, const Type14& arg14,
+ const Type15& arg15) {
+ return BindArg(PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9, arg10, arg11, arg12,
+ arg13, arg14),
+ arg15, 15);
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9, typename Type10, typename Type11, typename Type12,
+ typename Type13, typename Type14, typename Type15, typename Type16>
+inline sqlite3_stmt* PrepareQuery(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9, const Type10& arg10,
+ const Type11& arg11, const Type12& arg12,
+ const Type13& arg13, const Type14& arg14,
+ const Type15& arg15, const Type16& arg16) {
+ return BindArg(PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9, arg10, arg11, arg12,
+ arg13, arg14, arg15),
+ arg16, 16);
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9, typename Type10, typename Type11, typename Type12,
+ typename Type13, typename Type14, typename Type15, typename Type16,
+ typename Type17>
+inline sqlite3_stmt* PrepareQuery(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9, const Type10& arg10,
+ const Type11& arg11, const Type12& arg12,
+ const Type13& arg13, const Type14& arg14,
+ const Type15& arg15, const Type16& arg16,
+ const Type17& arg17) {
+ return BindArg(PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9, arg10, arg11, arg12,
+ arg13, arg14, arg15, arg16),
+ arg17, 17);
+}
+
+void ExecOrDie(sqlite3* dbhandle, const char* query);
+
+// Finalizes (deletes) the query before returning.
+void ExecOrDie(sqlite3* dbhandle, const char* query, sqlite3_stmt* statement);
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9, typename Type10>
+inline void ExecOrDie(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9, const Type10& arg10) {
+ return ExecOrDie(dbhandle, query,
+ PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9, arg10));
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9>
+inline void ExecOrDie(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9) {
+ return ExecOrDie(dbhandle, query,
+ PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9));
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8>
+inline void ExecOrDie(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8) {
+ return ExecOrDie(dbhandle, query,
+ PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8));
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7>
+inline void ExecOrDie(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7) {
+ return ExecOrDie(dbhandle, query,
+ PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7));
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6>
+inline void ExecOrDie(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6) {
+ return ExecOrDie(dbhandle, query, PrepareQuery(dbhandle, query, arg1, arg2,
+ arg3, arg4, arg5, arg6));
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5>
+inline void ExecOrDie(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5) {
+ return ExecOrDie(dbhandle, query, PrepareQuery(dbhandle, query, arg1, arg2,
+ arg3, arg4, arg5));
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4>
+inline void ExecOrDie(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4) {
+ return ExecOrDie(dbhandle, query, PrepareQuery(dbhandle, query, arg1, arg2,
+ arg3, arg4));
+}
+
+template <typename Type1, typename Type2, typename Type3>
+inline void ExecOrDie(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3) {
+ return ExecOrDie(dbhandle, query, PrepareQuery(dbhandle, query, arg1, arg2,
+ arg3));
+}
+
+template <typename Type1, typename Type2>
+inline void ExecOrDie(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2) {
+ return ExecOrDie(dbhandle, query, PrepareQuery(dbhandle, query, arg1, arg2));
+}
+
+template <typename Type1>
+inline void ExecOrDie(sqlite3* dbhandle, const char* query,
+ const Type1& arg1) {
+ return ExecOrDie(dbhandle, query, PrepareQuery(dbhandle, query, arg1));
+}
+
+
+int Exec(sqlite3* dbhandle, const char* query);
+// Finalizes (deletes) the query before returning.
+int Exec(sqlite3* dbhandle, const char* query, sqlite3_stmt* statement);
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9, typename Type10, typename Type11, typename Type12,
+ typename Type13, typename Type14, typename Type15, typename Type16,
+ typename Type17>
+inline int Exec(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9, const Type10& arg10,
+ const Type11& arg11, const Type12& arg12,
+ const Type13& arg13, const Type14& arg14,
+ const Type15& arg15, const Type16& arg16,
+ const Type17& arg17) {
+ return Exec(dbhandle, query,
+ PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13,
+ arg14, arg15, arg16, arg17));
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9, typename Type10, typename Type11, typename Type12,
+ typename Type13, typename Type14, typename Type15, typename Type16>
+inline int Exec(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9, const Type10& arg10,
+ const Type11& arg11, const Type12& arg12,
+ const Type13& arg13, const Type14& arg14,
+ const Type15& arg15, const Type16& arg16) {
+ return Exec(dbhandle, query,
+ PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13,
+ arg14, arg15, arg16));
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9, typename Type10, typename Type11, typename Type12,
+ typename Type13, typename Type14, typename Type15>
+inline int Exec(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9, const Type10& arg10,
+ const Type11& arg11, const Type12& arg12,
+ const Type13& arg13, const Type14& arg14,
+ const Type15& arg15) {
+ return Exec(dbhandle, query,
+ PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13,
+ arg14, arg15));
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9, typename Type10, typename Type11, typename Type12,
+ typename Type13, typename Type14>
+inline int Exec(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9, const Type10& arg10,
+ const Type11& arg11, const Type12& arg12,
+ const Type13& arg13, const Type14& arg14) {
+ return Exec(dbhandle, query,
+ PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13,
+ arg14));
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9, typename Type10, typename Type11, typename Type12,
+ typename Type13>
+inline int Exec(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9, const Type10& arg10,
+ const Type11& arg11, const Type12& arg12,
+ const Type13& arg13) {
+ return Exec(dbhandle, query,
+ PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13));
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9, typename Type10, typename Type11, typename Type12>
+inline int Exec(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9, const Type10& arg10,
+ const Type11& arg11, const Type12& arg12) {
+ return Exec(dbhandle, query,
+ PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9, arg10, arg11, arg12));
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9, typename Type10, typename Type11>
+inline int Exec(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9, const Type10& arg10,
+ const Type11& arg11) {
+ return Exec(dbhandle, query,
+ PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9, arg10, arg11));
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9, typename Type10>
+inline int Exec(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9, const Type10& arg10) {
+ return Exec(dbhandle, query,
+ PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9, arg10));
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8,
+ typename Type9>
+inline int Exec(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8,
+ const Type9& arg9) {
+ return Exec(dbhandle, query,
+ PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9));
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7, typename Type8>
+inline int Exec(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7, const Type8& arg8) {
+ return Exec(dbhandle, query,
+ PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8));
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6, typename Type7>
+inline int Exec(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6,
+ const Type7& arg7) {
+ return Exec(dbhandle, query,
+ PrepareQuery(dbhandle, query, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7));
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5, typename Type6>
+inline int Exec(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5, const Type6& arg6) {
+ return Exec(dbhandle, query, PrepareQuery(dbhandle, query, arg1, arg2,
+ arg3, arg4, arg5, arg6));
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4,
+ typename Type5>
+inline int Exec(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4,
+ const Type5& arg5) {
+ return Exec(dbhandle, query, PrepareQuery(dbhandle, query, arg1, arg2,
+ arg3, arg4, arg5));
+}
+
+template <typename Type1, typename Type2, typename Type3, typename Type4>
+inline int Exec(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3, const Type4& arg4) {
+ return Exec(dbhandle, query, PrepareQuery(dbhandle, query, arg1, arg2,
+ arg3, arg4));
+}
+
+template <typename Type1, typename Type2, typename Type3>
+inline int Exec(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2,
+ const Type3& arg3) {
+ return Exec(dbhandle, query, PrepareQuery(dbhandle, query, arg1, arg2,
+ arg3));
+}
+
+template <typename Type1, typename Type2>
+inline int Exec(sqlite3* dbhandle, const char* query,
+ const Type1& arg1, const Type2& arg2) {
+ return Exec(dbhandle, query, PrepareQuery(dbhandle, query, arg1, arg2));
+}
+
+template <typename Type1>
+inline int Exec(sqlite3* dbhandle, const char* query,
+ const Type1& arg1) {
+ return Exec(dbhandle, query, PrepareQuery(dbhandle, query, arg1));
+}
+
+
+// Holds an sqlite3_stmt* and automatically finalizes when passes out of scope.
+class ScopedStatement {
+ public:
+ explicit ScopedStatement(sqlite3_stmt* statement = 0)
+ : statement_(statement) { }
+ ~ScopedStatement();
+
+ sqlite3_stmt* get() const { return statement_; }
+
+ // Finalizes currently held statement and sets to new one.
+ void reset(sqlite3_stmt* statement);
+ protected:
+ sqlite3_stmt* statement_;
+
+ DISALLOW_COPY_AND_ASSIGN(ScopedStatement);
+};
+
+
+// Holds an sqlite3_stmt* and automatically resets when passes out of scope.
+class ScopedStatementResetter {
+ public:
+ explicit ScopedStatementResetter(sqlite3_stmt* statement)
+ : statement_(statement) { }
+ ~ScopedStatementResetter();
+
+ protected:
+ sqlite3_stmt* const statement_;
+
+ DISALLOW_COPY_AND_ASSIGN(ScopedStatementResetter);
+};
+
+// Useful for encoding any sequence of bytes into a string that can be used in
+// a table name. Kind of like hex encoding, except that A is zero and P is 15.
+std::string APEncode(const std::string& in);
+std::string APDecode(const std::string& in);
+
+#endif // CHROME_BROWSER_SYNC_UTIL_QUERY_HELPERS_H_