32 #include <boost/variant.hpp> 47 BindVisitor(sqlite3_stmt* stmt,
int start_idx = 1) : stmt_(stmt), idx_(start_idx)
52 return sqlite3_bind_int64(stmt_, idx_++, i);
56 return sqlite3_bind_double(stmt_, idx_++, d);
60 return sqlite3_bind_blob64(stmt_, idx_++, s.data(), s.size(), SQLITE_STATIC);
64 return sqlite3_bind_null(stmt_, idx_++);
81 return sqlite3_table_column_metadata(db_,
schema::DB_NAME, unescaped_tablename_.c_str(), colname.c_str(),
nullptr,
82 nullptr,
nullptr,
nullptr,
nullptr) == SQLITE_OK;
86 std::ostringstream query_builder;
87 query_builder <<
"ALTER TABLE " << escaped_tablename_ <<
" ADD " 89 if (sqlite3_exec(db_, query_builder.str().c_str(),
nullptr,
nullptr,
nullptr) != SQLITE_OK)
98 , unescaped_tablename_(unescaped_tablename)
105 addColumn(
"INTEGER");
120 throw std::runtime_error(
"not implemented");
124 unescaped_colname_ = unescaped_column;
131 template <
typename R,
typename T>
136 throw boost::bad_get();
140 template <
typename R>
141 struct NullValueGet<R, typename
std::enable_if<!std::is_same<R, NullValue>::value, R>::type>
145 return std::forward<R>(r);
149 template <
typename R>
160 template <
typename R>
163 template <
typename T>
BindVisitor(sqlite3_stmt *stmt, int start_idx=1)
std::string unescaped_colname_
EnsureColumnVisitor & setColumnName(const std::string &unescaped_column)
int operator()(const std::string &s)
std::string escaped_tablename
int operator()(NullValue)
constexpr const char * DB_NAME
void operator()(const std::string &)
schema::escaped_tablename escaped_tablename_
escaped_columnname escape_columnname_with_prefix(const std::string &c)
std::string unescaped_tablename_
EnsureColumnVisitor(sqlite3 *db, const std::string &unescaped_tablename)
std::string escape_identifier(const std::string &s)
void addColumn(const char *datatype)
constexpr const char * METADATA_COLUMN_PREFIX
int getTotalBinds() const
void operator()(NullValue)