int insert( std::string table, std::vector<boost::optional<const char*>> fields, const CONTAINER& values, connection& conn ) { std::string query_str = detail::insert_query_string(table, fields); sqlite3_stmt *stmt = nullptr; if( sqlite3_prepare(conn.handle(), query_str.c_str(), -1, &stmt, nullptr) != SQLITE_OK ) { std::ostringstream oss; oss << "error in SQLite insert (preparing); query: " << query_str << " SQLite error: " << sqlite3_errmsg(conn.handle()); throw std::runtime_error(oss.str()); } bind_values(fields, values, stmt); sqlite::step(stmt, conn); if(sqlite3_finalize(stmt) != SQLITE_OK) { std::ostringstream oss; oss << "error in SQLite insert (finalising); query: " << query_str << " SQLite error: " << sqlite3_errmsg(conn.handle()); throw std::runtime_error(oss.str()); } return detail::last_insert_rowid(conn); }
void insert( std::string table, std::vector<boost::optional<const char*>> fields, json::list& values, connection& conn ) { std::string query_str = detail::insert_query_string(table, fields); sqlite3_stmt *stmt = nullptr; sqlite3_prepare(conn.handle(), query_str.c_str(), -1, &stmt, nullptr); for(json::object& obj : values.objects) { sqlite3_reset(stmt); sqlite3_clear_bindings(stmt); bind_values(fields, CONTAINER(obj), stmt); sqlite::step(stmt); } }
void update( std::string table, std::vector<boost::optional<const char*>> fields, T& values, connection& db ) { std::ostringstream query; query << "UPDATE " << table << " SET "; auto query_fields = fields; query_fields.erase( std::remove_if( query_fields.begin(), query_fields.end(), [](const boost::optional<const char*>& field) -> bool { return !field; } ), query_fields.end() ); json::serialise( query_fields, [](const boost::optional<const char*>& field, std::ostream& os) { os << field.get() << " = ?"; }, ", ", query ); // ID field query << " WHERE " << T::id_field() << " = " << values.id(); sqlite3_stmt *stmt = nullptr; if( sqlite3_prepare( db.handle(), query.str().c_str(), -1, &stmt, nullptr ) != SQLITE_OK ) { std::cerr << "Query: " << query.str() << std::endl; throw std::runtime_error("Preparing SQLite statement for update"); } bind_values(fields, values, stmt); int step_ret = sqlite3_step(stmt); if( step_ret != SQLITE_OK && step_ret != SQLITE_DONE ) { std::ostringstream oss; oss << "Stepping SQLite update " << sqlite3_errmsg(db.handle()); throw std::runtime_error(oss.str()); } int finalise_ret = sqlite3_finalize(stmt); if( finalise_ret != SQLITE_OK && finalise_ret != SQLITE_DONE) { std::ostringstream oss; oss << "SQLite finalise " << sqlite3_errmsg(db.handle()); throw std::runtime_error(oss.str()); } }