func (b *backend) DB(s logical.Storage) (*sql.DB, error) {
	b.logger.Trace("postgres/db: enter")
	defer b.logger.Trace("postgres/db: exit")
	b.lock.Lock()
	defer b.lock.Unlock()
	if b.db != nil {
		if err := b.db.Ping(); err == nil {
			return b.db, nil
		}
		b.db.Close()
	}
	entry, err := s.Get("config/connection")
	if err != nil {
		return nil, err
	}
	if entry == nil {
		return nil,
			fmt.Errorf("configure the DB connection with config/connection first")
	}
	var connConfig connectionConfig
	if err := entry.DecodeJSON(&connConfig); err != nil {
		return nil, err
	}
	conn := connConfig.ConnectionURL
	if len(conn) == 0 {
		conn = connConfig.ConnectionString
	}
	if strings.HasPrefix(conn, "postgres://") || strings.HasPrefix(conn, "postgresql://") {
		if strings.Contains(conn, "?") {
			conn += "&timezone=utc"
		} else {
			conn += "?timezone=utc"
		}
	} else {
		conn += " timezone=utc"
	}
	b.db, err = sql.Open("postgres", conn)
	if err != nil {
		return nil, err
	}
	b.db.SetMaxOpenConns(connConfig.MaxOpenConnections)
	b.db.SetMaxIdleConns(connConfig.MaxIdleConnections)
	return b.db, nil
}
DB returns the database connection.
package postgresql
import (
	"database/sql"
	"fmt"
	"strings"
	"sync"
	log "github.com/mgutz/logxi/v1"
	"github.com/hashicorp/vault/logical"
	"github.com/hashicorp/vault/logical/framework"
)
func Factory(conf *logical.BackendConfig) (logical.Backend, error) {
	return Backend(conf).Setup(conf)
}
func Backend(conf *logical.BackendConfig) *backend {
	var b backend
	b.Backend = &framework.Backend{
		Help: strings.TrimSpace(backendHelp),
		Paths: []*framework.Path{
			pathConfigConnection(&b),
			pathConfigLease(&b),
			pathListRoles(&b),
			pathRoles(&b),
			pathRoleCreate(&b),
		},
		Secrets: []*framework.Secret{
			secretCreds(&b),
		},
		Clean: b.ResetDB,
	}
	b.logger = conf.Logger
	return &b
}
type backend struct {
	*framework.Backend
	db   *sql.DB
	lock sync.Mutex
	logger log.Logger
}