diff --git a/go.mod b/go.mod index 19ebabb..79ed427 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.26.4 require ( github.com/coreos/go-oidc/v3 v3.11.0 github.com/mmcdole/gofeed v1.3.0 + github.com/samber/slog-zerolog v1.0.0 github.com/scmhub/ibapi v0.10.47 golang.org/x/oauth2 v0.21.0 golang.org/x/sync v0.20.0 @@ -15,7 +16,7 @@ require ( require ( github.com/mattn/go-colorable v0.1.14 // indirect github.com/robaho/fixed v0.0.0-20251201003256-beee5759f86a // indirect - github.com/rs/zerolog v1.34.0 // indirect + github.com/rs/zerolog v1.34.0 google.golang.org/protobuf v1.36.11 // indirect ) @@ -34,9 +35,6 @@ require ( github.com/ncruces/go-strftime v1.0.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/samber/lo v1.53.0 // indirect - github.com/samber/slog-common v0.21.0 // indirect - github.com/samber/slog-zerolog v1.0.0 // indirect - github.com/samber/slog-zerolog/v2 v2.9.2 // indirect golang.org/x/crypto v0.25.0 // indirect golang.org/x/net v0.27.0 // indirect golang.org/x/sys v0.44.0 // indirect diff --git a/go.sum b/go.sum index af00704..80a8e5f 100644 --- a/go.sum +++ b/go.sum @@ -61,12 +61,8 @@ github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/samber/lo v1.53.0 h1:t975lj2py4kJPQ6haz1QMgtId2gtmfktACxIXArw3HM= github.com/samber/lo v1.53.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= -github.com/samber/slog-common v0.21.0 h1:Wo2hTly1Br5RjYqX/BTWJJeDnTE85oWk/7vqlpZuAUc= -github.com/samber/slog-common v0.21.0/go.mod h1:d/6OaSlzdkl9PFpfRLgn8FwY1OW6EFmPtBpsHX4MrU0= github.com/samber/slog-zerolog v1.0.0 h1:YpRy0xux1uJr0Ng3wrEjv9nyvb4RAoNqkS611UjzeG8= github.com/samber/slog-zerolog v1.0.0/go.mod h1:N2/g/mNGRY1zqsydIYE0uKipSSFsPDjytoVkRnZ0Jp0= -github.com/samber/slog-zerolog/v2 v2.9.2 h1:DIFzfzDTxHeRyGlfg/D7b2by7VVzcsBTybRPrzjWF4c= -github.com/samber/slog-zerolog/v2 v2.9.2/go.mod h1:2q6cYK2OcN6YfQE/WyCnUtigc+yYf3ozqGsGmRwZR6I= github.com/scmhub/ibapi v0.10.47 h1:NxMlxZWxzfNoGU3GkAxJmg5p8S85cr5OH2nKKDBO64k= github.com/scmhub/ibapi v0.10.47/go.mod h1:codoOOEwT48pn9R4pBQny41OLqqgwqLRC5Mm+OEEIhQ= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= @@ -95,8 +91,6 @@ golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/pkg/db/db.go b/pkg/db/db.go index dce78be..775cfab 100644 --- a/pkg/db/db.go +++ b/pkg/db/db.go @@ -39,11 +39,16 @@ func New(dbPath string, logger *slog.Logger) (Database, error) { // Open database // Note: Using modernc.org/sqlite (pure Go, no CGO) instead of mattn/go-sqlite3 - db, err := sql.Open("sqlite", dbPath+"?_pragma=busy_timeout(5000)") + db, err := sql.Open("sqlite", dbPath+"?_pragma=busy_timeout(10000)&_pragma=journal_mode(WAL)&_pragma=synchronous(NORMAL)") if err != nil { return nil, fmt.Errorf("failed to open database: %w", err) } + // Set connection pool limits to prevent "database is locked" errors + db.SetMaxOpenConns(1) // SQLite works best with single writer + db.SetMaxIdleConns(1) + db.SetConnMaxLifetime(0) // connections don't expire + // Test connection if err := db.Ping(); err != nil { db.Close()