aboutsummaryrefslogtreecommitdiff
path: root/backend/internal/database/database.go
diff options
context:
space:
mode:
authorGravatar Anshul Gupta <ansg191@anshulg.com> 2024-08-07 18:56:01 -0700
committerGravatar GitHub <noreply@github.com> 2024-08-07 18:56:01 -0700
commit08993e2f8497341079010d3d06361c99492c4c07 (patch)
treec65d6d571c928410faace1fa51c2ea3f49fce003 /backend/internal/database/database.go
parent3de4ebb7560851ccbefe296c197456fe80c22901 (diff)
parentb8aef1a7fb24815c7d93bc30c7b289b4f5896779 (diff)
downloadibd-trader-08993e2f8497341079010d3d06361c99492c4c07.tar.gz
ibd-trader-08993e2f8497341079010d3d06361c99492c4c07.tar.zst
ibd-trader-08993e2f8497341079010d3d06361c99492c4c07.zip
Merge pull request #1 from ansg191/refactor-database
Diffstat (limited to 'backend/internal/database/database.go')
-rw-r--r--backend/internal/database/database.go124
1 files changed, 56 insertions, 68 deletions
diff --git a/backend/internal/database/database.go b/backend/internal/database/database.go
index 3c822bc..409dd3c 100644
--- a/backend/internal/database/database.go
+++ b/backend/internal/database/database.go
@@ -5,7 +5,6 @@ import (
"database/sql"
"database/sql/driver"
"errors"
- "fmt"
"io"
"log/slog"
"sync"
@@ -22,12 +21,7 @@ import (
type Database interface {
io.Closer
- UserStore
- CookieStore
- KeyStore
- SessionStore
- StockStore
-
+ TransactionExecutor
driver.Pinger
Migrate(ctx context.Context) error
@@ -70,24 +64,7 @@ func (d *database) Close() error {
}
func (d *database) Migrate(ctx context.Context) error {
- fs, err := iofs.New(db.Migrations, "migrations")
- if err != nil {
- return err
- }
-
- m, err := migrate.NewWithSourceInstance("iofs", fs, d.url)
- if err != nil {
- return err
- }
-
- d.logger.InfoContext(ctx, "Running DB migration")
- err = m.Up()
- if err != nil && !errors.Is(err, migrate.ErrNoChange) {
- d.logger.ErrorContext(ctx, "DB migration failed", "error", err)
- return err
- }
-
- return nil
+ return Migrate(ctx, d.url)
}
func (d *database) Maintenance(ctx context.Context) {
@@ -101,11 +78,9 @@ func (d *database) Maintenance(ctx context.Context) {
var wg sync.WaitGroup
wg.Add(1)
- ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute)
+ _, cancel := context.WithTimeout(context.Background(), 10*time.Minute)
defer cancel()
- go d.cleanupSessions(ctx, &wg)
-
wg.Wait()
}()
case <-ctx.Done():
@@ -114,65 +89,78 @@ func (d *database) Maintenance(ctx context.Context) {
}
}
-func (d *database) Ping(ctx context.Context) error {
- return d.db.PingContext(ctx)
-}
-
-func (d *database) execInternal(ctx context.Context, queryName string, fn func(string) (any, error)) (any, error) {
- query, err := db.GetQuery(queryName)
+func Migrate(ctx context.Context, url string) error {
+ fs, err := iofs.New(db.Migrations, "migrations")
if err != nil {
- return nil, fmt.Errorf("unable to get query: %w", err)
+ return err
}
- d.logger.DebugContext(ctx, "Executing query", "name", queryName, "query", query)
-
- now := time.Now()
- // Execute the query
- result, err := fn(query)
+ m, err := migrate.NewWithSourceInstance("iofs", fs, url)
if err != nil {
- return nil, fmt.Errorf("unable to execute query: %w", err)
+ return err
}
- d.logger.DebugContext(ctx, "Query executed successfully", "name", queryName, "duration", time.Since(now))
+ slog.InfoContext(ctx, "Running DB migration")
+ err = m.Up()
+ if err != nil && !errors.Is(err, migrate.ErrNoChange) {
+ slog.ErrorContext(ctx, "DB migration failed", "error", err)
+ return err
+ }
- return result, nil
+ return nil
}
-func (d *database) exec(ctx context.Context, exec executor, queryName string, args ...any) (sql.Result, error) {
- ret, err := d.execInternal(ctx, queryName, func(query string) (any, error) {
- return exec.ExecContext(ctx, query, args...)
- })
- if err != nil {
- return nil, err
- } else {
- return ret.(sql.Result), nil
- }
+func (d *database) Ping(ctx context.Context) error {
+ return d.db.PingContext(ctx)
+}
+
+type Executor interface {
+ ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
+ QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error)
+ QueryRowContext(ctx context.Context, query string, args ...any) *sql.Row
+}
+
+type TransactionExecutor interface {
+ Executor
+ BeginTx(ctx context.Context, opts *sql.TxOptions) (*sql.Tx, error)
}
-func (d *database) query(ctx context.Context, exec executor, queryName string, args ...any) (*sql.Rows, error) {
- ret, err := d.execInternal(ctx, queryName, func(query string) (any, error) {
- return exec.QueryContext(ctx, query, args...)
- })
+func (d *database) ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error) {
+ d.logger.DebugContext(ctx, "Executing query", "query", query)
+
+ now := time.Now()
+ ret, err := d.db.ExecContext(ctx, query, args...)
if err != nil {
return nil, err
- } else {
- return ret.(*sql.Rows), nil
}
+
+ d.logger.DebugContext(ctx, "Query executed successfully", "duration", time.Since(now))
+ return ret, nil
}
-func (d *database) queryRow(ctx context.Context, exec executor, queryName string, args ...any) (*sql.Row, error) {
- ret, err := d.execInternal(ctx, queryName, func(query string) (any, error) {
- return exec.QueryRowContext(ctx, query, args...), nil
- })
+func (d *database) QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error) {
+ d.logger.DebugContext(ctx, "Executing query", "query", query)
+
+ now := time.Now()
+ ret, err := d.db.QueryContext(ctx, query, args...)
if err != nil {
return nil, err
- } else {
- return ret.(*sql.Row), nil
}
+
+ d.logger.DebugContext(ctx, "Query executed successfully", "duration", time.Since(now))
+ return ret, nil
}
-type executor interface {
- ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
- QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error)
- QueryRowContext(ctx context.Context, query string, args ...any) *sql.Row
+func (d *database) QueryRowContext(ctx context.Context, query string, args ...any) *sql.Row {
+ d.logger.DebugContext(ctx, "Executing query", "query", query)
+
+ now := time.Now()
+ ret := d.db.QueryRowContext(ctx, query, args...)
+
+ d.logger.DebugContext(ctx, "Query executed successfully", "duration", time.Since(now))
+ return ret
+}
+
+func (d *database) BeginTx(ctx context.Context, opts *sql.TxOptions) (*sql.Tx, error) {
+ return d.db.BeginTx(ctx, opts)
}