#include "sqlite_statement.hpp" #include "sqlite_prepared_result_reader.hpp" #include "sqlite_error.hpp" namespace matador::backends::sqlite { sqlite_statement::sqlite_statement(sqlite3 *db, sqlite3_stmt *stmt, const sql::query_context &query) : statement_impl(query) , db_(db) , stmt_(stmt) , binder_(db, stmt) {} sqlite_statement::~sqlite_statement() { sqlite3_finalize(stmt_); } size_t sqlite_statement::execute() { // get next row int ret = sqlite3_reset(stmt_); throw_sqlite_error(ret, db_, "sqlite3_reset"); if (ret = sqlite3_step(stmt_); ret != SQLITE_DONE) { throw_sqlite_error(ret, db_, "sqlite3_step"); } return sqlite3_changes(db_); } std::unique_ptr sqlite_statement::fetch() { int ret = sqlite3_reset(stmt_); throw_sqlite_error(ret, db_, "sqlite3_reset"); auto reader = std::make_unique(db_, stmt_); return std::move(std::make_unique(std::move(reader), query_.prototype)); } void sqlite_statement::reset() { if (stmt_) { sqlite3_reset(stmt_); sqlite3_clear_bindings(stmt_); } } sql::parameter_binder& sqlite_statement::binder() { return binder_; } }