root/software/sqlite_poc/DBManager.h @ 6e4119a4
| 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;
|
||||
};
|