From 8b39bc9cfb8d6f38fbbdd749f0deda40ae8dc8c2 Mon Sep 17 00:00:00 2001 From: lbenedar Date: Tue, 17 Mar 2026 16:59:48 +0300 Subject: [PATCH] ch5 --- .env | 1 + cmd/api/main.go | 50 ++++++++++++++++++++++++++++++++++++++++++++++++- go.mod | 5 ++++- go.sum | 2 ++ 4 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 .env diff --git a/.env b/.env new file mode 100644 index 0000000..bf89bbd --- /dev/null +++ b/.env @@ -0,0 +1 @@ +GREENLIGHT_DB_DSN="postgres://greenlight:paSSword@localhost/greenlight?sslmode=disable" \ No newline at end of file diff --git a/cmd/api/main.go b/cmd/api/main.go index cc66c16..85cbdea 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -1,12 +1,16 @@ package main import ( + "context" + "database/sql" "flag" "fmt" "log" "net/http" "os" "time" + + _ "github.com/lib/pq" ) const version = "1.0.0" @@ -19,6 +23,37 @@ type application struct { type config struct { port int env string + db struct { + dsn string + maxOpenConns int + maxIdleConns int + maxIdleTime string + } +} + +func openDB(cfg config) (*sql.DB, error) { + db, err := sql.Open("postgres", cfg.db.dsn) + if err != nil { + return nil, err + } + + db.SetMaxIdleConns(cfg.db.maxIdleConns) + db.SetMaxOpenConns(cfg.db.maxOpenConns) + + duration, err := time.ParseDuration(cfg.db.maxIdleTime) + if err != nil { + return nil, err + } + db.SetConnMaxIdleTime(duration) + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + err = db.PingContext(ctx) + if err != nil { + return nil, err + } + return db, nil } func main() { @@ -26,10 +61,23 @@ func main() { flag.IntVar(&cfg.port, "port", 4000, "API server port") flag.StringVar(&cfg.env, "env", "development", "Enivornment (development|staging|production)") + flag.StringVar(&cfg.db.dsn, "db-dsn", os.Getenv("GREENLIGHT_DB_DSN"), "PostgreSQL DSN") + + flag.IntVar(&cfg.db.maxOpenConns, "db-max-open-conns", 25, "PostgreSQL max open connections") + flag.IntVar(&cfg.db.maxIdleConns, "db-max-idle-conns", 25, "PostgreSQL max idle connections") + flag.StringVar(&cfg.db.maxIdleTime, "db-max-idle-time", "15m", "PostgreSQL max connection idle time") flag.Parse() logger := log.New(os.Stdout, "", log.Ldate|log.Ltime) + db, err := openDB(cfg) + if err != nil { + logger.Fatal(err) + } + defer db.Close() + + logger.Printf("database connection pool established") + app := &application{ config: cfg, logger: logger, @@ -43,6 +91,6 @@ func main() { WriteTimeout: 10 * time.Second, } logger.Printf("starting %s server on %s", cfg.env, srv.Addr) - err := srv.ListenAndServe() + err = srv.ListenAndServe() logger.Fatal(err) } diff --git a/go.mod b/go.mod index c3aec90..683af40 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,7 @@ module gitea.local.lab/Lbenedar/greenlight go 1.25.0 -require github.com/julienschmidt/httprouter v1.3.0 // indirect +require ( + github.com/julienschmidt/httprouter v1.3.0 // indirect + github.com/lib/pq v1.11.2 // indirect +) diff --git a/go.sum b/go.sum index 096c54e..7fd2db1 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,4 @@ github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/lib/pq v1.11.2 h1:x6gxUeu39V0BHZiugWe8LXZYZ+Utk7hSJGThs8sdzfs= +github.com/lib/pq v1.11.2/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA=