Compare commits

...

2 commits

Author SHA1 Message Date
1e0bc86b21
feat: improve sqlite database reliability
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/tag/release Pipeline was successful
2025-06-13 09:27:06 +02:00
8fa74fd046
fix: database tests for cache 2025-06-13 09:26:49 +02:00
2 changed files with 40 additions and 3 deletions

View file

@ -1,6 +1,8 @@
package cache
import (
"fmt"
"os"
"testing"
"time"
@ -8,15 +10,16 @@ import (
)
func TestCache(t *testing.T) {
// Create temporary database for testing
database, err := db.New("test_cache.db")
// Create temporary database for testing with unique name
dbFile := fmt.Sprintf("test_cache_%d.db", time.Now().UnixNano())
database, err := db.New(dbFile)
if err != nil {
t.Fatalf("Failed to create test database: %v", err)
}
defer func() {
_ = database.Close()
// Clean up test database file
// os.Remove("test_cache.db")
_ = os.Remove(dbFile)
}()
// Create cache instance
@ -76,6 +79,9 @@ func TestCache(t *testing.T) {
t.Run("Exists", func(t *testing.T) {
existsKey := "exists_key"
// Make sure the key doesn't exist initially by deleting it
_ = cache.Delete(existsKey)
// Should not exist initially
exists, err := cache.Exists(existsKey)
if err != nil {

View file

@ -35,6 +35,11 @@ func New(dbPath string) (*Database, error) {
return nil, err
}
// Configure SQLite for better reliability
if err := configureSQLite(db); err != nil {
return nil, err
}
// Initialize database
if err := initDatabase(db); err != nil {
return nil, err
@ -794,6 +799,32 @@ func initDatabase(db *sql.DB) error {
return nil
}
// Configure SQLite for better reliability
func configureSQLite(db *sql.DB) error {
pragmas := []string{
// Enable Write-Ahead Logging for better concurrency and crash recovery
"PRAGMA journal_mode = WAL",
// Set 5-second timeout when database is locked by another connection
"PRAGMA busy_timeout = 5000",
// Balance between safety and performance for disk writes
"PRAGMA synchronous = NORMAL",
// Set large cache size (1GB) for better read performance
"PRAGMA cache_size = 1000000000",
// Enable foreign key constraint enforcement
"PRAGMA foreign_keys = true",
// Store temporary tables and indices in memory for speed
"PRAGMA temp_store = memory",
}
for _, pragma := range pragmas {
if _, err := db.Exec(pragma); err != nil {
return fmt.Errorf("failed to execute %s: %w", pragma, err)
}
}
return nil
}
// CacheGet retrieves a value from the cache
func (d *Database) CacheGet(key string) (string, error) {
query := `