Skip to content

Commit

Permalink
db: add mongodb client factory support
Browse files Browse the repository at this point in the history
  • Loading branch information
adipurnama committed Dec 30, 2020
1 parent cbeb3d3 commit 834f386
Show file tree
Hide file tree
Showing 5 changed files with 144 additions and 10 deletions.
42 changes: 42 additions & 0 deletions db/mongokit/mongo_db.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package mongokit

import (
"context"
"fmt"
"log"
"net/url"

"github.com/adipurnama/go-toolkit/db"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)

// NewMongoDBClient returns new mongodb client using the go mongo-driver
func NewMongoDBClient(opt *db.Option) (*mongo.Client, error) {
connURL := &url.URL{
Scheme: "mongodb",
User: url.UserPassword(opt.Username, opt.Password),
Host: fmt.Sprintf("%s:%d", opt.Host, opt.Port),
}
q := connURL.Query()
q.Add("authSource", opt.DatabaseName)
connURL.RawQuery = q.Encode()

clientOptions := options.Client()
clientOptions.ApplyURI(connURL.String())
clientOptions.SetConnectTimeout(opt.ConnectionOption.ConnectTimeout)
clientOptions.SetMaxConnIdleTime(opt.ConnectionOption.MaxLifetime)
clientOptions.SetMaxPoolSize(uint64(opt.ConnectionOption.MaxOpen))

client, err := mongo.NewClient(clientOptions)
if err != nil {
log.Fatalf("Cannot create MongoDB client: %s", err)
}

ctx, cancel := context.WithTimeout(context.Background(), opt.ConnectionOption.ConnectTimeout)
defer cancel()

err = client.Connect(ctx)

return client, err
}
21 changes: 12 additions & 9 deletions db/option.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ import (
)

const (
defaultMaxOpen = 100
defaultMaxLifetime = 10 * time.Minute
defaultMaxIdle = 5
defaultMaxOpen = 100
defaultMaxLifetime = 10 * time.Minute
defaultMaxIdle = 5
defaultConnectTimeout = 10 * time.Second
)

// Option - database option.
Expand All @@ -24,17 +25,19 @@ type Option struct {

// ConnectionOption is db connection option
type ConnectionOption struct {
MaxIdle int
MaxLifetime time.Duration
MaxOpen int
MaxIdle int
MaxLifetime time.Duration
MaxOpen int
ConnectTimeout time.Duration
}

// DefaultConnectionOption returns sensible conn setting
func DefaultConnectionOption() *ConnectionOption {
return &ConnectionOption{
MaxIdle: defaultMaxIdle,
MaxOpen: defaultMaxOpen,
MaxLifetime: defaultMaxLifetime,
MaxIdle: defaultMaxIdle,
MaxOpen: defaultMaxOpen,
MaxLifetime: defaultMaxLifetime,
ConnectTimeout: defaultConnectTimeout,
}
}

Expand Down
6 changes: 5 additions & 1 deletion db/postgres/postgres.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
package postgres

import (
"context"
"fmt"
"log"
"net/url"
Expand Down Expand Up @@ -35,7 +36,10 @@ func NewPostgresDatabase(opt *db.Option) (*sqlx.DB, error) {
db.SetConnMaxLifetime(opt.ConnectionOption.MaxLifetime)
db.SetMaxOpenConns(opt.ConnectionOption.MaxOpen)

_ = db.QueryRow("SELECT 1")
ctx, cancel := context.WithTimeout(context.Background(), opt.ConnectionOption.ConnectTimeout)
defer cancel()

_ = db.QueryRowContext(ctx, "SELECT 1")

go doKeepAliveConnection(db, opt.DatabaseName, intervalKeepAlive)

Expand Down
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ require (
github.com/satori/go.uuid v1.2.0
github.com/sethvargo/go-signalcontext v0.1.0
github.com/stretchr/testify v1.6.1
go.mongodb.org/mongo-driver v1.4.4
google.golang.org/grpc v1.29.1
google.golang.org/protobuf v1.25.0
gopkg.in/natefinch/lumberjack.v2 v2.0.0
Expand Down
Loading

0 comments on commit 834f386

Please sign in to comment.