Make SQLite::Step take a callback function for parsing result data

This commit is contained in:
Tim Wojtulewicz 2025-07-02 17:37:57 -07:00
parent 784c4537e6
commit b44f7ca9ad
2 changed files with 23 additions and 19 deletions

View file

@ -341,7 +341,7 @@ OperationResult SQLite::DoPut(ResultCallback* cb, ValPtr key, ValPtr value, bool
return res; return res;
} }
auto step_result = Step(stmt.get(), false); auto step_result = Step(stmt.get(), nullptr);
if ( ! overwrite ) if ( ! overwrite )
if ( step_result.code == ReturnCode::SUCCESS ) { if ( step_result.code == ReturnCode::SUCCESS ) {
int changed = sqlite3_changes(db); int changed = sqlite3_changes(db);
@ -375,7 +375,19 @@ OperationResult SQLite::DoGet(ResultCallback* cb, ValPtr key) {
return res; return res;
} }
return Step(stmt.get(), true); auto value_parser = [this](sqlite3_stmt* stmt) -> OperationResult {
auto blob = static_cast<const std::byte*>(sqlite3_column_blob(stmt, 0));
size_t blob_size = sqlite3_column_bytes(stmt, 0);
auto val = serializer->Unserialize({blob, blob_size}, val_type);
if ( val )
return {ReturnCode::SUCCESS, "", val.value()};
return {ReturnCode::OPERATION_FAILED, val.error()};
};
return Step(stmt.get(), value_parser);
} }
/** /**
@ -396,7 +408,7 @@ OperationResult SQLite::DoErase(ResultCallback* cb, ValPtr key) {
return res; return res;
} }
return Step(stmt.get(), false); return Step(stmt.get(), nullptr);
} }
/** /**
@ -518,28 +530,18 @@ OperationResult SQLite::CheckError(int code) {
return {ReturnCode::SUCCESS}; return {ReturnCode::SUCCESS};
} }
OperationResult SQLite::Step(sqlite3_stmt* stmt, bool parse_value) { OperationResult SQLite::Step(sqlite3_stmt* stmt, StepResultParser parser) {
OperationResult ret; OperationResult ret;
int step_status = sqlite3_step(stmt); int step_status = sqlite3_step(stmt);
if ( step_status == SQLITE_ROW ) { if ( step_status == SQLITE_ROW ) {
if ( parse_value ) { if ( parser )
auto blob = static_cast<const std::byte*>(sqlite3_column_blob(stmt, 0)); ret = parser(stmt);
size_t blob_size = sqlite3_column_bytes(stmt, 0); else
auto val = serializer->Unserialize({blob, blob_size}, val_type);
if ( val )
ret = {ReturnCode::SUCCESS, "", val.value()};
else
ret = {ReturnCode::OPERATION_FAILED, val.error()};
}
else {
ret = {ReturnCode::OPERATION_FAILED, "sqlite3_step should not have returned a value"}; ret = {ReturnCode::OPERATION_FAILED, "sqlite3_step should not have returned a value"};
}
} }
else if ( step_status == SQLITE_DONE ) { else if ( step_status == SQLITE_DONE ) {
if ( parse_value ) if ( parser )
ret = {ReturnCode::KEY_NOT_FOUND}; ret = {ReturnCode::KEY_NOT_FOUND};
else else
ret = {ReturnCode::SUCCESS}; ret = {ReturnCode::SUCCESS};

View file

@ -25,6 +25,8 @@ public:
bool IsOpen() override { return db != nullptr; } bool IsOpen() override { return db != nullptr; }
private: private:
using StepResultParser = std::function<OperationResult(sqlite3_stmt*)>;
OperationResult DoOpen(OpenResultCallback* cb, RecordValPtr options) override; OperationResult DoOpen(OpenResultCallback* cb, RecordValPtr options) override;
OperationResult DoClose(ResultCallback* cb) override; OperationResult DoClose(ResultCallback* cb) override;
OperationResult DoPut(ResultCallback* cb, ValPtr key, ValPtr value, bool overwrite, OperationResult DoPut(ResultCallback* cb, ValPtr key, ValPtr value, bool overwrite,
@ -45,7 +47,7 @@ private:
* Abstracts calls to sqlite3_step to properly create an OperationResult * Abstracts calls to sqlite3_step to properly create an OperationResult
* structure based on the result. * structure based on the result.
*/ */
OperationResult Step(sqlite3_stmt* stmt, bool parse_value = false); OperationResult Step(sqlite3_stmt* stmt, StepResultParser parser);
/** /**
* Helper utility for running pragmas on the database. * Helper utility for running pragmas on the database.