diff --git a/postgres/README.md b/postgres/README.md index ebf367d8..28e6fa4c 100644 --- a/postgres/README.md +++ b/postgres/README.md @@ -17,7 +17,6 @@ func (s *Storage) Set(key string, val []byte, exp time.Duration) error func (s *Storage) Delete(key string) error func (s *Storage) Reset() error func (s *Storage) Close() error -func (s *Storage) DB() pgxpool.Pool ``` ### Installation Postgres is tested on the 2 last [Go versions](https://golang.org/dl/) with support for modules. So make sure to initialize one first if you didn't do that yet: @@ -42,13 +41,10 @@ store := postgres.New() // Initialize custom config store := postgres.New(postgres.Config{ - Host: "127.0.0.1", - Port: 5432, - Database: "fiber", + Db: dbPool, Table: "fiber_storage", Reset: false, GCInterval: 10 * time.Second, - SslMode: "disable", }) ``` @@ -56,30 +52,10 @@ store := postgres.New(postgres.Config{ ```go // Config defines the config for storage. type Config struct { - // Host name where the DB is hosted - // - // Optional. Default is "127.0.0.1" - Host string - - // Port where the DB is listening on - // - // Optional. Default is 5432 - Port int - - // Server username - // - // Optional. Default is "" - Username string - - // Server password - // - // Optional. Default is "" - Password string - - // Database name - // - // Optional. Default is "fiber" - Database string + // Db pgxpool.Pool object + // + // Required + Db pgxpool.Pool // Table name // @@ -95,23 +71,16 @@ type Config struct { // // Optional. Default is 10 * time.Second GCInterval time.Duration - - // The SSL mode for the connection - // - // Optional. Default is "disable" - SslMode string } ``` ### Default Config ```go +// ConfigDefault is the default config var ConfigDefault = Config{ - Host: "127.0.0.1", - Port: 5432, - Database: "fiber", + Db: pgxpool.Pool{}, Table: "fiber_storage", Reset: false, GCInterval: 10 * time.Second, - SslMode: "disable", } ``` diff --git a/postgres/config.go b/postgres/config.go index f1695ac2..ffb4fffc 100644 --- a/postgres/config.go +++ b/postgres/config.go @@ -1,46 +1,22 @@ package postgres import ( + "github.com/jackc/pgx/pgxpool" "time" ) // Config defines the config for storage. type Config struct { - // Host name where the DB is hosted + // Db pgxpool.Pool object // - // Optional. Default is "127.0.0.1" - Host string - - // Port where the DB is listening on - // - // Optional. Default is 5432 - Port int - - // Server username - // - // Optional. Default is "" - Username string - - // Server password - // - // Optional. Default is "" - Password string - - // Database name - // - // Optional. Default is "fiber" - Database string + // Required + Db pgxpool.Pool // Table name // // Optional. Default is "fiber_storage" Table string - // The SSL mode for the connection - // - // Optional. Default is "disable" - SslMode string - // Reset clears any existing keys in existing Table // // Optional. Default is false @@ -50,44 +26,13 @@ type Config struct { // // Optional. Default is 10 * time.Second GCInterval time.Duration - - //////////////////////////////////// - // Adaptor related config options // - //////////////////////////////////// - - // Maximum wait for connection, in seconds. Zero or - // n < 0 means wait indefinitely. - timeout time.Duration - - // The maximum number of open connections to the database. - // - // If MaxIdleConns is greater than 0 and the new MaxOpenConns is less than - // MaxIdleConns, then MaxIdleConns will be reduced to match the new - // MaxOpenConns limit. - // - // If n <= 0, then there is no limit on the number of open connections. - // The default is 0 (unlimited). - maxOpenConns int32 - - // The maximum amount of time a connection may be reused. - // - // Expired connections may be closed lazily before reuse. - // - // If d <= 0, connections are reused forever. - connMaxLifetime time.Duration } // ConfigDefault is the default config var ConfigDefault = Config{ - Host: "127.0.0.1", - Port: 5432, - Database: "fiber", Table: "fiber_storage", - SslMode: "disable", Reset: false, GCInterval: 10 * time.Second, - maxOpenConns: 100, - connMaxLifetime: 1 * time.Second, } // Helper function to set default values @@ -96,26 +41,13 @@ func configDefault(config ...Config) Config { if len(config) < 1 { return ConfigDefault } - // Override default config cfg := config[0] // Set default values - if cfg.Host == "" { - cfg.Host = ConfigDefault.Host - } - if cfg.Port <= 0 { - cfg.Port = ConfigDefault.Port - } - if cfg.Database == "" { - cfg.Database = ConfigDefault.Database - } if cfg.Table == "" { cfg.Table = ConfigDefault.Table } - if cfg.SslMode == "" { - cfg.SslMode = ConfigDefault.SslMode - } if int(cfg.GCInterval.Seconds()) <= 0 { cfg.GCInterval = ConfigDefault.GCInterval } diff --git a/postgres/postgres.go b/postgres/postgres.go index 96077862..84ced67d 100644 --- a/postgres/postgres.go +++ b/postgres/postgres.go @@ -4,16 +4,14 @@ import ( "context" "database/sql" "fmt" - "net/url" + "github.com/jackc/pgx/v4/pgxpool" "strings" "time" - - "github.com/jackc/pgx/v4/pgxpool" ) // Storage interface that is implemented by storage providers type Storage struct { - db *pgxpool.Pool + db pgxpool.Pool gcInterval time.Duration done chan struct{} @@ -45,34 +43,7 @@ func New(config ...Config) *Storage { // Set default config cfg := configDefault(config...) - // Create data source name - var dsn = "postgresql://" - if cfg.Username != "" { - dsn += url.QueryEscape(cfg.Username) - } - if cfg.Password != "" { - dsn += ":" + cfg.Password - } - if cfg.Username != "" || cfg.Password != "" { - dsn += "@" - } - dsn += fmt.Sprintf("%s:%d", url.QueryEscape(cfg.Host), cfg.Port) - dsn += fmt.Sprintf("/%s?connect_timeout=%d&sslmode=%s", - url.QueryEscape(cfg.Database), - int64(cfg.timeout.Seconds()), - cfg.SslMode, - ) - - cnf, _ := pgxpool.ParseConfig(dsn) - cnf.MaxConns = cfg.maxOpenConns - cnf.MaxConnLifetime = cfg.connMaxLifetime - cnf.MaxConnIdleTime = cfg.connMaxLifetime - - db, err := pgxpool.ConnectConfig(context.Background(), cnf) - if err != nil { - panic(err) - } - defer db.Close() + db := cfg.Db // Ping database if err := db.Ping(context.Background()); err != nil { @@ -81,7 +52,7 @@ func New(config ...Config) *Storage { // Drop table if set to true if cfg.Reset { - if _, err = db.Exec(context.Background(), fmt.Sprintf(dropQuery, cfg.Table)); err != nil { + if _, err := db.Exec(context.Background(), fmt.Sprintf(dropQuery, cfg.Table)); err != nil { db.Close() panic(err) } @@ -209,8 +180,4 @@ func (s *Storage) checkSchema(tableName string) { if strings.ToLower(string(data)) != "bytea" { fmt.Printf(checkSchemaMsg, string(data)) } -} - -func (s *Storage) DB() *pgxpool.Pool { - return s.db -} +} \ No newline at end of file diff --git a/postgres/postgres_test.go b/postgres/postgres_test.go index 9c3107f5..fb7953d7 100644 --- a/postgres/postgres_test.go +++ b/postgres/postgres_test.go @@ -3,7 +3,6 @@ package postgres import ( "context" "database/sql" - "os" "testing" "time" @@ -11,9 +10,6 @@ import ( ) var testStore = New(Config{ - Database: os.Getenv("POSTGRES_DATABASE"), - Username: os.Getenv("POSTGRES_USERNAME"), - Password: os.Getenv("POSTGRES_PASSWORD"), Reset: true, }) @@ -167,18 +163,10 @@ func Test_SslRequiredMode(t *testing.T) { } }() _ = New(Config{ - Database: "fiber", - Username: "username", - Password: "password", Reset: true, - SslMode: "require", }) } func Test_Postgres_Close(t *testing.T) { utils.AssertEqual(t, nil, testStore.Close()) } - -func Test_Postgres_DB(t *testing.T) { - utils.AssertEqual(t, true, testStore.DB() != nil) -}