diff options
author | 2024-08-07 18:56:01 -0700 | |
---|---|---|
committer | 2024-08-07 18:56:01 -0700 | |
commit | 08993e2f8497341079010d3d06361c99492c4c07 (patch) | |
tree | c65d6d571c928410faace1fa51c2ea3f49fce003 /backend/internal/database/database.go | |
parent | 3de4ebb7560851ccbefe296c197456fe80c22901 (diff) | |
parent | b8aef1a7fb24815c7d93bc30c7b289b4f5896779 (diff) | |
download | ibd-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.go | 124 |
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) } |