...

Source file src/edge-infra.dev/pkg/f8n/devinfra/database/psql/psql.go

Documentation: edge-infra.dev/pkg/f8n/devinfra/database/psql

     1  package psql
     2  
     3  import (
     4  	"context"
     5  	"database/sql"
     6  	"fmt"
     7  
     8  	// needed for the postgres driver
     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