Fix tests and linters
This commit is contained in:
@@ -19,6 +19,7 @@ import (
|
||||
"embed"
|
||||
|
||||
migrate "github.com/rubenv/sql-migrate"
|
||||
|
||||
"github.com/safing/portmaster/base/database/record"
|
||||
"github.com/safing/portmaster/base/database/storage/sqlite/models"
|
||||
)
|
||||
@@ -48,12 +49,3 @@ func getMeta(r *models.Record) *record.Meta {
|
||||
}
|
||||
return meta
|
||||
}
|
||||
|
||||
func setMeta(r *models.Record, m *record.Meta) {
|
||||
r.Created = m.Created
|
||||
r.Modified = m.Modified
|
||||
r.Expires = m.Expires
|
||||
r.Deleted = m.Deleted
|
||||
r.Secret = m.IsSecret()
|
||||
r.Crownjewel = m.IsCrownJewel()
|
||||
}
|
||||
|
||||
@@ -29,6 +29,11 @@ import (
|
||||
"github.com/safing/structures/dsd"
|
||||
)
|
||||
|
||||
// Errors.
|
||||
var (
|
||||
ErrQueryTimeout = errors.New("query timeout")
|
||||
)
|
||||
|
||||
// SQLite storage.
|
||||
type SQLite struct {
|
||||
name string
|
||||
@@ -108,7 +113,7 @@ func (db *SQLite) Get(key string) (record.Record, error) {
|
||||
// Get record from database.
|
||||
r, err := models.FindRecord(db.ctx, db.bob, key)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%w: %s", storage.ErrNotFound, err)
|
||||
return nil, fmt.Errorf("%w: %w", storage.ErrNotFound, err)
|
||||
}
|
||||
|
||||
// Return data in wrapper.
|
||||
@@ -116,7 +121,7 @@ func (db *SQLite) Get(key string) (record.Record, error) {
|
||||
db.name,
|
||||
key,
|
||||
getMeta(r),
|
||||
uint8(r.Format.GetOrZero()),
|
||||
uint8(r.Format.GetOrZero()), //nolint:gosec // Values are within uint8.
|
||||
r.Value.GetOrZero(),
|
||||
)
|
||||
}
|
||||
@@ -285,7 +290,9 @@ func (db *SQLite) queryExecutor(queryIter *iterator.Iterator, q *query.Query, lo
|
||||
queryIter.Finish(err)
|
||||
return
|
||||
}
|
||||
defer cursor.Close()
|
||||
defer func() {
|
||||
_ = cursor.Close()
|
||||
}()
|
||||
|
||||
recordsLoop:
|
||||
for cursor.Next() {
|
||||
@@ -326,7 +333,7 @@ recordsLoop:
|
||||
db.name,
|
||||
r.Key,
|
||||
m,
|
||||
uint8(r.Format.GetOrZero()),
|
||||
uint8(r.Format.GetOrZero()), //nolint:gosec // Values are within uint8.
|
||||
r.Value.GetOrZero(),
|
||||
)
|
||||
|
||||
@@ -340,7 +347,7 @@ recordsLoop:
|
||||
break recordsLoop
|
||||
case queryIter.Next <- matched:
|
||||
case <-time.After(1 * time.Second):
|
||||
err = errors.New("query timeout")
|
||||
err = ErrQueryTimeout
|
||||
break recordsLoop
|
||||
}
|
||||
}
|
||||
@@ -435,7 +442,7 @@ func (db *SQLite) MaintainRecordStates(ctx context.Context, purgeDeletedBefore t
|
||||
// Option 1: Using shadow delete.
|
||||
if shadowDelete {
|
||||
// Mark expired records as deleted.
|
||||
models.Records.Update(
|
||||
_, err := models.Records.Update(
|
||||
um.SetCol("format").ToArg(nil),
|
||||
um.SetCol("value").ToArg(nil),
|
||||
um.SetCol("deleted").ToArg(now),
|
||||
@@ -443,26 +450,39 @@ func (db *SQLite) MaintainRecordStates(ctx context.Context, purgeDeletedBefore t
|
||||
models.UpdateWhere.Records.Expires.GT(0),
|
||||
models.UpdateWhere.Records.Expires.LT(now),
|
||||
).Exec(db.ctx, db.bob)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to shadow delete expired records: %w", err)
|
||||
}
|
||||
|
||||
// Purge deleted records before threshold.
|
||||
models.Records.Delete(
|
||||
_, err = models.Records.Delete(
|
||||
models.DeleteWhere.Records.Deleted.GT(0),
|
||||
models.DeleteWhere.Records.Deleted.LT(purgeThreshold),
|
||||
).Exec(db.ctx, db.bob)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to purge deleted records (before threshold): %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Option 2: Immediate delete.
|
||||
|
||||
// Delete expired record.
|
||||
models.Records.Delete(
|
||||
_, err := models.Records.Delete(
|
||||
models.DeleteWhere.Records.Expires.GT(0),
|
||||
models.DeleteWhere.Records.Expires.LT(now),
|
||||
).Exec(db.ctx, db.bob)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to delete expired records: %w", err)
|
||||
}
|
||||
|
||||
// Delete shadow deleted records.
|
||||
models.Records.Delete(
|
||||
_, err = models.Records.Delete(
|
||||
models.DeleteWhere.Records.Deleted.GT(0),
|
||||
).Exec(db.ctx, db.bob)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to purge deleted records: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
package sqlite
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
@@ -43,15 +41,8 @@ type TestRecord struct { //nolint:maligned
|
||||
func TestSQLite(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
testDir, err := os.MkdirTemp("", "testing-")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer func() {
|
||||
_ = os.RemoveAll(testDir) // clean up
|
||||
}()
|
||||
|
||||
// start
|
||||
testDir := t.TempDir()
|
||||
db, err := openSQLite("test", testDir, true)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@@ -160,19 +151,19 @@ func TestSQLite(t *testing.T) {
|
||||
}
|
||||
|
||||
// maintenance
|
||||
err = db.MaintainRecordStates(context.TODO(), time.Now().Add(-time.Minute), true)
|
||||
err = db.MaintainRecordStates(t.Context(), time.Now().Add(-time.Minute), true)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// maintenance
|
||||
err = db.MaintainRecordStates(context.TODO(), time.Now(), false)
|
||||
err = db.MaintainRecordStates(t.Context(), time.Now(), false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// purging
|
||||
n, err := db.Purge(context.TODO(), query.New("test:path/to/").MustBeValid(), true, true, true)
|
||||
n, err := db.Purge(t.Context(), query.New("test:path/to/").MustBeValid(), true, true, true)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user