mirror of
https://github.com/zeek/zeek.git
synced 2025-10-06 00:28:21 +00:00
Make SQLite::Step take a callback function for parsing result data
This commit is contained in:
parent
784c4537e6
commit
b44f7ca9ad
2 changed files with 23 additions and 19 deletions
|
@ -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);
|
|
||||||
|
|
||||||
auto val = serializer->Unserialize({blob, blob_size}, val_type);
|
|
||||||
|
|
||||||
if ( val )
|
|
||||||
ret = {ReturnCode::SUCCESS, "", val.value()};
|
|
||||||
else
|
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};
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue