package psql import ( "context" "database/sql" "fmt" // needed for the postgres driver _ "github.com/lib/pq" ) const ( DefaultHost = "127.0.0.1" DefaultPort = "5432" DefaultSSLMode = "disable" DefaultUser = "overlook-iam@ret-edge-dev-infra.iam" DefaultDatabase = "milestone-database" Driver = "postgres" ) type Client struct { port string host string dbName string user string sslMode string dsn string DB *sql.DB } type Opts func(*Client) func New(opts ...Opts) (*Client, error) { psql := &Client{ host: DefaultHost, port: DefaultPort, sslMode: DefaultSSLMode, user: DefaultUser, dbName: DefaultDatabase, } for _, opt := range opts { opt(psql) } if psql.dsn == "" { psql.dsn = fmt.Sprintf("host=%s port=%s user=%s dbname=%s sslmode=%s", psql.host, psql.port, psql.user, psql.dbName, psql.sslMode) } if psql.DB == nil { c, err := sql.Open(Driver, psql.dsn) if err != nil { return nil, fmt.Errorf("failed to open %w", err) } psql.DB = c } return psql, nil } func WithDatabaseName(name string) Opts { return func(p *Client) { p.dbName = name } } func WithSSLMode(mode string) Opts { return func(p *Client) { p.sslMode = mode } } func WithPort(port string) Opts { return func(p *Client) { p.port = port } } func WithHost(host string) Opts { return func(p *Client) { p.host = host } } func WithUser(user string) Opts { return func(p *Client) { p.user = user } } func WithDSN(dsn string) Opts { return func(p *Client) { p.dsn = dsn } } func WithDatabase(db *sql.DB) Opts { return func(p *Client) { p.DB = db } } func (psql *Client) Query(query string) (*sql.Rows, error) { rows, err := psql.DB.QueryContext(context.Background(), query) if err != nil { return nil, err } return rows, nil }