91 lines
2.1 KiB
Go
91 lines
2.1 KiB
Go
package db
|
|
|
|
//nolint:golint,revive
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"errors"
|
|
"fmt"
|
|
"runtime"
|
|
"strings"
|
|
|
|
"github.com/golang-migrate/migrate/v4"
|
|
_ "github.com/golang-migrate/migrate/v4/database/pgx"
|
|
_ "github.com/golang-migrate/migrate/v4/source/file"
|
|
_ "github.com/jackc/pgx/v4/stdlib"
|
|
"github.com/jmoiron/sqlx"
|
|
_ "github.com/lib/pq"
|
|
|
|
"github.com/poanetwork/tokenbridge-monitor/config"
|
|
)
|
|
|
|
type DB struct {
|
|
cfg *config.DBConfig
|
|
db *sqlx.DB
|
|
}
|
|
|
|
func (db *DB) Migrate() error {
|
|
m, err := migrate.New("file://db/migrations", db.dbURL("pgx"))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = m.Up()
|
|
if err != nil && !errors.Is(err, migrate.ErrNoChange) {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (db *DB) dbURL(prefix string) string {
|
|
return fmt.Sprintf("%s://%s:%s@%s:%d/%s", prefix, db.cfg.User, db.cfg.Password, db.cfg.Host, db.cfg.Port, db.cfg.DB)
|
|
}
|
|
|
|
func NewDB(cfg *config.DBConfig) (*DB, error) {
|
|
db := &DB{
|
|
cfg: cfg,
|
|
}
|
|
conn, err := sqlx.ConnectContext(context.Background(), "pgx", db.dbURL("postgres"))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
conn.SetMaxIdleConns(3)
|
|
conn.SetMaxOpenConns(10)
|
|
db.db = conn
|
|
return db, nil
|
|
}
|
|
|
|
func (db *DB) Close() error {
|
|
return db.db.Close()
|
|
}
|
|
|
|
func (db *DB) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error) {
|
|
defer ObserveDuration(getCurrentFuncName(2))()
|
|
return db.db.ExecContext(ctx, query, args...)
|
|
}
|
|
|
|
func (db *DB) GetContext(ctx context.Context, dest interface{}, query string, args ...interface{}) error {
|
|
defer ObserveDuration(getCurrentFuncName(2))()
|
|
return db.db.GetContext(ctx, dest, query, args...)
|
|
}
|
|
|
|
func (db *DB) SelectContext(ctx context.Context, dest interface{}, query string, args ...interface{}) error {
|
|
defer ObserveDuration(getCurrentFuncName(2))()
|
|
return db.db.SelectContext(ctx, dest, query, args...)
|
|
}
|
|
|
|
func getCurrentFuncName(skip int) string {
|
|
pc, _, _, ok := runtime.Caller(skip)
|
|
if !ok {
|
|
return "unknown"
|
|
}
|
|
details := runtime.FuncForPC(pc)
|
|
if details == nil {
|
|
return "unknown"
|
|
}
|
|
name := details.Name()
|
|
name = name[strings.LastIndex(name, ".")+1:]
|
|
name = strings.TrimPrefix(name, "(*")
|
|
name = strings.Replace(name, ")", "", 1)
|
|
return name
|
|
}
|