You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gojobs/vendor/github.com/upper/db/v4/settings.go

201 lines
5.3 KiB

// Copyright (c) 2012-present The upper.io/db authors. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package db
import (
"sync"
"sync/atomic"
"time"
)
// Settings defines methods to get or set configuration values.
type Settings interface {
// SetPreparedStatementCache enables or disables the prepared statement
// cache.
SetPreparedStatementCache(bool)
// PreparedStatementCacheEnabled returns true if the prepared statement cache
// is enabled, false otherwise.
PreparedStatementCacheEnabled() bool
// SetConnMaxLifetime sets the default maximum amount of time a connection
// may be reused.
SetConnMaxLifetime(time.Duration)
// ConnMaxLifetime returns the default maximum amount of time a connection
// may be reused.
ConnMaxLifetime() time.Duration
// SetConnMaxIdleTime sets the default maximum amount of time a connection
// may remain idle.
SetConnMaxIdleTime(time.Duration)
// ConnMaxIdleTime returns the default maximum amount of time a connection
// may remain idle.
ConnMaxIdleTime() time.Duration
// SetMaxIdleConns sets the default maximum number of connections in the idle
// connection pool.
SetMaxIdleConns(int)
// MaxIdleConns returns the default maximum number of connections in the idle
// connection pool.
MaxIdleConns() int
// SetMaxOpenConns sets the default maximum number of open connections to the
// database.
SetMaxOpenConns(int)
// MaxOpenConns returns the default maximum number of open connections to the
// database.
MaxOpenConns() int
// SetMaxTransactionRetries sets the number of times a transaction can
// be retried.
SetMaxTransactionRetries(int)
// MaxTransactionRetries returns the maximum number of times a
// transaction can be retried.
MaxTransactionRetries() int
}
type settings struct {
sync.RWMutex
preparedStatementCacheEnabled uint32
connMaxLifetime time.Duration
connMaxIdleTime time.Duration
maxOpenConns int
maxIdleConns int
maxTransactionRetries int
}
func (c *settings) binaryOption(opt *uint32) bool {
return atomic.LoadUint32(opt) == 1
}
func (c *settings) setBinaryOption(opt *uint32, value bool) {
if value {
atomic.StoreUint32(opt, 1)
return
}
atomic.StoreUint32(opt, 0)
}
func (c *settings) SetPreparedStatementCache(value bool) {
c.setBinaryOption(&c.preparedStatementCacheEnabled, value)
}
func (c *settings) PreparedStatementCacheEnabled() bool {
return c.binaryOption(&c.preparedStatementCacheEnabled)
}
func (c *settings) SetConnMaxLifetime(t time.Duration) {
c.Lock()
c.connMaxLifetime = t
c.Unlock()
}
func (c *settings) ConnMaxLifetime() time.Duration {
c.RLock()
defer c.RUnlock()
return c.connMaxLifetime
}
func (c *settings) SetConnMaxIdleTime(t time.Duration) {
c.Lock()
c.connMaxIdleTime = t
c.Unlock()
}
func (c *settings) ConnMaxIdleTime() time.Duration {
c.RLock()
defer c.RUnlock()
return c.connMaxIdleTime
}
func (c *settings) SetMaxIdleConns(n int) {
c.Lock()
c.maxIdleConns = n
c.Unlock()
}
func (c *settings) MaxIdleConns() int {
c.RLock()
defer c.RUnlock()
return c.maxIdleConns
}
func (c *settings) SetMaxTransactionRetries(n int) {
c.Lock()
c.maxTransactionRetries = n
c.Unlock()
}
func (c *settings) MaxTransactionRetries() int {
c.RLock()
defer c.RUnlock()
if c.maxTransactionRetries < 1 {
return 1
}
return c.maxTransactionRetries
}
func (c *settings) SetMaxOpenConns(n int) {
c.Lock()
c.maxOpenConns = n
c.Unlock()
}
func (c *settings) MaxOpenConns() int {
c.RLock()
defer c.RUnlock()
return c.maxOpenConns
}
// NewSettings returns a new settings value prefilled with the current default
// settings.
func NewSettings() Settings {
def := DefaultSettings.(*settings)
return &settings{
preparedStatementCacheEnabled: def.preparedStatementCacheEnabled,
connMaxLifetime: def.connMaxLifetime,
connMaxIdleTime: def.connMaxIdleTime,
maxIdleConns: def.maxIdleConns,
maxOpenConns: def.maxOpenConns,
maxTransactionRetries: def.maxTransactionRetries,
}
}
// DefaultSettings provides default global configuration settings for database
// sessions.
var DefaultSettings Settings = &settings{
preparedStatementCacheEnabled: 0,
connMaxLifetime: time.Duration(0),
connMaxIdleTime: time.Duration(0),
maxIdleConns: 10,
maxOpenConns: 0,
maxTransactionRetries: 1,
}