...
1 package psql
2
3 import (
4 "context"
5 "database/sql"
6 "fmt"
7
8
9 _ "github.com/lib/pq"
10 )
11
12 const (
13 DefaultHost = "127.0.0.1"
14 DefaultPort = "5432"
15 DefaultSSLMode = "disable"
16 DefaultUser = "overlook-iam@ret-edge-dev-infra.iam"
17 DefaultDatabase = "milestone-database"
18
19 Driver = "postgres"
20 )
21
22 type Client struct {
23 port string
24 host string
25 dbName string
26 user string
27 sslMode string
28 dsn string
29 DB *sql.DB
30 }
31
32 type Opts func(*Client)
33
34 func New(opts ...Opts) (*Client, error) {
35 psql := &Client{
36 host: DefaultHost,
37 port: DefaultPort,
38 sslMode: DefaultSSLMode,
39 user: DefaultUser,
40 dbName: DefaultDatabase,
41 }
42
43 for _, opt := range opts {
44 opt(psql)
45 }
46
47 if psql.dsn == "" {
48 psql.dsn = fmt.Sprintf("host=%s port=%s user=%s dbname=%s sslmode=%s", psql.host, psql.port, psql.user, psql.dbName, psql.sslMode)
49 }
50
51 if psql.DB == nil {
52 c, err := sql.Open(Driver, psql.dsn)
53 if err != nil {
54 return nil, fmt.Errorf("failed to open %w", err)
55 }
56 psql.DB = c
57 }
58
59 return psql, nil
60 }
61
62 func WithDatabaseName(name string) Opts {
63 return func(p *Client) {
64 p.dbName = name
65 }
66 }
67
68 func WithSSLMode(mode string) Opts {
69 return func(p *Client) {
70 p.sslMode = mode
71 }
72 }
73
74 func WithPort(port string) Opts {
75 return func(p *Client) {
76 p.port = port
77 }
78 }
79
80 func WithHost(host string) Opts {
81 return func(p *Client) {
82 p.host = host
83 }
84 }
85
86 func WithUser(user string) Opts {
87 return func(p *Client) {
88 p.user = user
89 }
90 }
91
92 func WithDSN(dsn string) Opts {
93 return func(p *Client) {
94 p.dsn = dsn
95 }
96 }
97
98 func WithDatabase(db *sql.DB) Opts {
99 return func(p *Client) {
100 p.DB = db
101 }
102 }
103
104 func (psql *Client) Query(query string) (*sql.Rows, error) {
105 rows, err := psql.DB.QueryContext(context.Background(), query)
106 if err != nil {
107 return nil, err
108 }
109 return rows, nil
110 }
111
View as plain text