diff --git a/surrealdb/README.md b/surrealdb/README.md index 84a252d8..a4b2cad9 100644 --- a/surrealdb/README.md +++ b/surrealdb/README.md @@ -1,6 +1,6 @@ --- -id: surrealdb -title: SurrealDB +id: surrealdb +title: SurrealDB --- ![Release](https://img.shields.io/github/v/tag/gofiber/storage?filter=surrealdb*) @@ -16,7 +16,7 @@ title: SurrealDB ### Signatures ```go -func New(config ...Config) (*Storage, error) +func New(config ...Config) (*Storage, error) func (s *Storage) Get(key string) ([]byte, error) func (s *Storage) Set(key string, val []byte, exp time.Duration) error func (s *Storage) Delete(key string) error diff --git a/surrealdb/surrealdb.go b/surrealdb/surrealdb.go index 44addfe2..5f5382fa 100644 --- a/surrealdb/surrealdb.go +++ b/surrealdb/surrealdb.go @@ -89,7 +89,8 @@ func (s *Storage) Set(key string, val []byte, exp time.Duration) error { expiresAt = time.Now().Add(exp).Unix() } - _, err := surrealdb.Create[model](s.db, models.NewRecordID(s.table, key), &model{ + // Upsert is used instead of Create to allow overriding the same key if it already exists. + _, err := surrealdb.Upsert[model](s.db, models.NewRecordID(s.table, key), &model{ Key: key, Body: val, Exp: expiresAt, diff --git a/surrealdb/surrealdb_test.go b/surrealdb/surrealdb_test.go index e611736b..204c7301 100644 --- a/surrealdb/surrealdb_test.go +++ b/surrealdb/surrealdb_test.go @@ -63,7 +63,7 @@ func Test_Surrealdb_Create(t *testing.T) { require.NoError(t, err) defer testStore.Close() - err = testStore.Set("create", []byte("test12345"), 0) + err = testStore.Set("test", []byte("test12345"), 0) require.NoError(t, err) } @@ -72,10 +72,10 @@ func Test_Surrealdb_CreateAndGet(t *testing.T) { require.NoError(t, err) defer testStore.Close() - err = testStore.Set("createandget", []byte("test1234"), 0) + err = testStore.Set("test", []byte("test12345"), 0) require.NoError(t, err) - get, err := testStore.Get("createandget") + get, err := testStore.Get("test") require.NoError(t, err) require.NotEmpty(t, get) @@ -96,10 +96,10 @@ func Test_Surrealdb_Get_WithNoErr(t *testing.T) { require.NoError(t, err) defer testStore.Close() - err = testStore.Set("create2", []byte("test1234"), 0) + err = testStore.Set("test", []byte("test1234"), 0) require.NoError(t, err) - get, err := testStore.Get("create2") + get, err := testStore.Get("test") require.NoError(t, err) require.NotEmpty(t, get) } @@ -109,10 +109,10 @@ func Test_Surrealdb_Delete(t *testing.T) { require.NoError(t, err) defer testStore.Close() - err = testStore.Set("delete", []byte("delete1234"), 0) + err = testStore.Set("test", []byte("delete1234"), 0) require.NoError(t, err) - err = testStore.Delete("delete") + err = testStore.Delete("test") require.NoError(t, err) } @@ -121,7 +121,6 @@ func Test_Surrealdb_Flush(t *testing.T) { require.NoError(t, err) defer testStore.Close() - err = testStore.Reset() require.NoError(t, err) } @@ -155,8 +154,6 @@ func Test_Surrealdb_ListSkipsExpired(t *testing.T) { require.NoError(t, err) defer testStore.Close() - _ = testStore.Reset() - _ = testStore.Set("valid", []byte("123"), 0) _ = testStore.Set("expired", []byte("456"), 1*time.Second) @@ -173,33 +170,51 @@ func Test_Surrealdb_ListSkipsExpired(t *testing.T) { require.NotContains(t, result, "expired") } -func BenchmarkSet(b *testing.B) { +func Benchmark_SurrealDB_Set(b *testing.B) { testStore, err := newTestStore(b) require.NoError(b, err) defer testStore.Close() - for i := 0; i < b.N; i++ { - key := fmt.Sprintf("bench-key-%d-%d", i, time.Now().UnixNano()) - testStore.Set(fmt.Sprintf("bench-key-%s", key), []byte("value"), 0) - } -} - -func BenchmarkGet(b *testing.B) { - testStore, err := newTestStore(b) - require.NoError(b, err) - defer testStore.Close() - testStore.Reset() - - key := "bench-get-key" - value := []byte("some-value") - - err = testStore.Set(key, value, 0) - if err != nil { - b.Fatalf("failed to prepare test value: %v", err) - } - + b.ReportAllocs() b.ResetTimer() + for i := 0; i < b.N; i++ { - testStore.Get(key) + err = testStore.Set("john", []byte("doe"), 0) } + + require.NoError(b, err) +} + +func Benchmark_SurrealDB_Get(b *testing.B) { + testStore, err := newTestStore(b) + require.NoError(b, err) + defer testStore.Close() + + err = testStore.Set("john", []byte("doe"), 0) + require.NoError(b, err) + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _, err = testStore.Get("john") + } + + require.NoError(b, err) +} + +func Benchmark_SurrealDB_SetAndDelete(b *testing.B) { + testStore, err := newTestStore(b) + require.NoError(b, err) + defer testStore.Close() + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + testStore.Set("john", []byte("doe"), 0) + err = testStore.Delete("john") + } + + require.NoError(b, err) }