diff --git a/src/storage/backend/sqlite/SQLite.cc b/src/storage/backend/sqlite/SQLite.cc index f861c82657..38e528e67a 100644 --- a/src/storage/backend/sqlite/SQLite.cc +++ b/src/storage/backend/sqlite/SQLite.cc @@ -291,6 +291,8 @@ OperationResult SQLite::Step(sqlite3_stmt* stmt, bool parse_value) { else if ( step_status == SQLITE_BUSY ) // TODO: this could retry a number of times instead of just failing ret = {ReturnCode::TIMEOUT}; + else if ( step_status == SQLITE_CONSTRAINT ) + ret = {ReturnCode::KEY_EXISTS}; else ret = {ReturnCode::OPERATION_FAILED}; diff --git a/testing/btest/Baseline/scripts.base.frameworks.storage.overwriting/out b/testing/btest/Baseline/scripts.base.frameworks.storage.overwriting/out index c65062e83a..7755737a76 100644 --- a/testing/btest/Baseline/scripts.base.frameworks.storage.overwriting/out +++ b/testing/btest/Baseline/scripts.base.frameworks.storage.overwriting/out @@ -3,3 +3,9 @@ open result, [code=Storage::SUCCESS, error_str=, value=, value=] get result, [code=Storage::SUCCESS, error_str=, value=value7890] get result same as inserted, T +put result, [code=Storage::KEY_EXISTS, error_str=, value=] +get result, [code=Storage::SUCCESS, error_str=, value=value7890] +get result same as originally inserted, T +put result, [code=Storage::SUCCESS, error_str=, value=] +get result, [code=Storage::SUCCESS, error_str=, value=value2345] +get result same as overwritten, T diff --git a/testing/btest/scripts/base/frameworks/storage/overwriting.zeek b/testing/btest/scripts/base/frameworks/storage/overwriting.zeek index ec0485d9b2..8e801a9d7c 100644 --- a/testing/btest/scripts/base/frameworks/storage/overwriting.zeek +++ b/testing/btest/scripts/base/frameworks/storage/overwriting.zeek @@ -7,24 +7,50 @@ @load base/frameworks/storage/sync @load policy/frameworks/storage/backend/sqlite +# Create a typename here that can be passed down into get(). +type str: string; + event zeek_init() { local opts : Storage::BackendOptions; - opts$sqlite = [$database_path = "storage-test.sqlite", $table_name = "testing"]; + opts$sqlite = [$database_path = "testing.sqlite", $table_name = "testing"]; - local key = "key1234"; + local key = "key1111"; local value = "value7890"; + local value2 = "value2345"; - local open_res = Storage::Sync::open_backend(Storage::SQLITE, opts, string, string); - print "open result", open_res; - local b = open_res$value; + local res = Storage::Sync::open_backend(Storage::SQLITE, opts, str, str); + print "open result", res; + local b = res$value; - local res = Storage::Sync::put(b, [$key=key, $value=value]); + # Put a first value. This should return Storage::SUCCESS. + res = Storage::Sync::put(b, [$key=key, $value=value]); print "put result", res; - local res2 = Storage::Sync::get(b, key); - print "get result", res2; - if ( res2$code == Storage::SUCCESS && res2?$value ) - print "get result same as inserted", value == (res2$value as string); + # Get the first value, validate that it's what we inserted. + res = Storage::Sync::get(b, key); + print "get result", res; + if ( res$code == Storage::SUCCESS && res?$value ) + print "get result same as inserted", value == (res$value as string); + + # This will return a Storage::KEY_EXISTS since we don't want overwriting. + res = Storage::Sync::put(b, [$key=key, $value=value2, $overwrite=F]); + print "put result", res; + + # Verify that the overwrite didn't actually happen. + res = Storage::Sync::get(b, key); + print "get result", res; + if ( res$code == Storage::SUCCESS && res?$value ) + print "get result same as originally inserted", value == (res$value as string); + + # This will return a Storage::SUCESSS since we're asking for an overwrite. + res = Storage::Sync::put(b, [$key=key, $value=value2, $overwrite=T]); + print "put result", res; + + # Verify that the overwrite happened. + res = Storage::Sync::get(b, key); + print "get result", res; + if ( res$code == Storage::SUCCESS && res?$value ) + print "get result same as overwritten", value2 == (res$value as string); Storage::Sync::close_backend(b); }