Project

General

Profile

Download (3.82 KB) Statistics
| Branch: | Tag: | Revision:
88cf406f David Sorber
#include <cassert>
#include <string>
#include <tuple>
#include <type_traits>
#include <vector>

#include <sqlite3.h>

6e4119a4 David Sorber
template<size_t I>
struct builder_impl
88cf406f David Sorber
{
6e4119a4 David Sorber
template<typename T, typename G>
static void set_value(T& tup, size_t idx, G& val)
88cf406f David Sorber
{
6e4119a4 David Sorber
if (idx == I - 1)
88cf406f David Sorber
{
6e4119a4 David Sorber
std::get<I - 1>(tup) = val;
88cf406f David Sorber
}
else
{
6e4119a4 David Sorber
builder_impl<I - 1>::set_value(tup, idx, val);
88cf406f David Sorber
}
}
};
template <>
6e4119a4 David Sorber
struct builder_impl<0>
88cf406f David Sorber
{
6e4119a4 David Sorber
template<typename T, typename G>
static void set_value(T& tup, size_t idx, G& val)
{
assert(false);
}
88cf406f David Sorber
};
6e4119a4 David Sorber
template <typename G, typename... Ts>
void set_value_at(std::tuple<Ts...>& tup, size_t idx, G const& val)
{
builder_impl<sizeof...(Ts)>::set_value(tup, idx, val);
}
88cf406f David Sorber
6e4119a4 David Sorber
template <typename G, typename... Ts>
void set_value_at(std::tuple<Ts...>& tup, size_t idx, G& val)
88cf406f David Sorber
{
6e4119a4 David Sorber
builder_impl<sizeof...(Ts)>::set_value(tup, idx, val);
88cf406f David Sorber
}

6e4119a4 David Sorber

88cf406f David Sorber
class DBManager
{
public:
// Constructor
DBManager(const std::string& db_path);
// Destructor
~DBManager();
// execute query
6e4119a4 David Sorber
template<typename... T>
std::vector<std::tuple<T...>*>* execute_query(
88cf406f David Sorber
const std::string& sql_statement,
int& return_code)
{
sqlite3_stmt* sqlite_statement;
// Prepare the sqlite statement
return_code = sqlite3_prepare_v2(db, sql_statement.c_str(), -1,
&sqlite_statement, nullptr);
if (return_code != SQLITE_OK)
{
return nullptr;
}
6e4119a4 David Sorber
auto output_vector = new std::vector<std::tuple<T...>*>();
88cf406f David Sorber
// Iterate until we've collected all the output
6e4119a4 David Sorber
int step_return = 0;
while ((step_return = sqlite3_step(sqlite_statement)) != SQLITE_DONE)
88cf406f David Sorber
{
// Create a new result row to be populated below
6e4119a4 David Sorber
auto result_row = new std::tuple<T...>();
88cf406f David Sorber
// Iterate over the columns in the row
int num_cols = sqlite3_data_count(sqlite_statement);
for (int col_idx = 0; col_idx < num_cols; col_idx++)
{
switch(sqlite3_column_type(sqlite_statement, col_idx))
{
6e4119a4 David Sorber
case SQLITE_INTEGER:
set_value_at(*result_row, col_idx,
sqlite3_column_int64(sqlite_statement,
col_idx));
88cf406f David Sorber
break;
case SQLITE_FLOAT:
6e4119a4 David Sorber
set_value_at(*result_row, col_idx,
sqlite3_column_double(sqlite_statement,
col_idx));
88cf406f David Sorber
break;
case SQLITE_TEXT:
6e4119a4 David Sorber
//~ set_value_at(*result_row, col_idx,
//~ std::string(reinterpret_cast<const char*>(sqlite3_column_text(sqlite_statement, col_idx))));
88cf406f David Sorber
break;
case SQLITE_BLOB:
break;
case SQLITE_NULL:
6e4119a4 David Sorber
//~ set_value_at(*result_row, col_idx, std::string(""));
88cf406f David Sorber
break;
}
}
6e4119a4 David Sorber
output_vector->push_back(result_row);
88cf406f David Sorber
}
return output_vector;
}
private:
sqlite3 *db;
};