diff --git a/config.toml.sample b/config.toml.sample index 829e542..4d62299 100644 --- a/config.toml.sample +++ b/config.toml.sample @@ -68,6 +68,9 @@ password = "listmonk" database = "listmonk" ssl_mode = "disable" +# Maximum active and idle connections to pool. +max_open = 50 +max_idle = 10 # SMTP servers. [smtp] diff --git a/main.go b/main.go index 371262e..b4d9ca8 100644 --- a/main.go +++ b/main.go @@ -227,12 +227,11 @@ func initMediaStore() media.Store { func main() { // Connect to the DB. - db, err := connectDB(ko.String("db.host"), - ko.Int("db.port"), - ko.String("db.user"), - ko.String("db.password"), - ko.String("db.database"), - ko.String("db.ssl_mode")) + var dbCfg dbConf + if err := ko.Unmarshal("db", &dbCfg); err != nil { + log.Fatalf("error loading db config: %v", err) + } + db, err := connectDB(dbCfg) if err != nil { logger.Fatalf("error connecting to DB: %v", err) } diff --git a/queries.go b/queries.go index dace61b..b92d4ac 100644 --- a/queries.go +++ b/queries.go @@ -75,14 +75,28 @@ type Queries struct { // GetStats *sqlx.Stmt `query:"get-stats"` } +// dbConf contains database config required for connecting to a DB. +type dbConf struct { + Host string `koanf:"host"` + Port int `koanf:"port"` + User string `koanf:"user"` + Password string `koanf:"password"` + DBName string `koanf:"database"` + SSLMode string `koanf:"ssl_mode"` + MaxOpen int `koanf:"max_open"` + MaxIdle int `koanf:"max_idle"` +} + // connectDB initializes a database connection. -func connectDB(host string, port int, user, pwd, dbName string, sslMode string) (*sqlx.DB, error) { +func connectDB(c dbConf) (*sqlx.DB, error) { db, err := sqlx.Connect("postgres", - fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=%s", host, port, user, pwd, dbName, sslMode)) + fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=%s", + c.Host, c.Port, c.User, c.Password, c.DBName, c.SSLMode)) if err != nil { return nil, err } - + db.SetMaxOpenConns(c.MaxOpen) + db.SetMaxIdleConns(c.MaxIdle) return db, nil }