diff --git a/memcache/README.md b/memcache/README.md index 21d39dee..6d2daeec 100644 --- a/memcache/README.md +++ b/memcache/README.md @@ -73,6 +73,11 @@ type Config struct { // // Optional. Default is false Reset bool + + // DisableStartupCheck skips the initial connection validation during New. + // + // Optional. Default is false + DisableStartupCheck bool } ``` @@ -80,5 +85,6 @@ type Config struct { ```go var ConfigDefault = Config{ Servers: "127.0.0.1:11211", + DisableStartupCheck: false, } ``` diff --git a/memcache/config.go b/memcache/config.go index 7e34e06c..cb96483b 100644 --- a/memcache/config.go +++ b/memcache/config.go @@ -15,6 +15,11 @@ type Config struct { // Optional. Default is false Reset bool + // DisableStartupCheck skips the initial connection validation during New. + // + // Optional. Default is false + DisableStartupCheck bool + // The socket read/write timeout. // // Optional. Default is 100 * time.Millisecond @@ -31,9 +36,10 @@ type Config struct { // ConfigDefault is the default config var ConfigDefault = Config{ - Servers: "127.0.0.1:11211", - timeout: 100 * time.Millisecond, - maxIdleConns: 2, + Servers: "127.0.0.1:11211", + timeout: 100 * time.Millisecond, + maxIdleConns: 2, + DisableStartupCheck: false, } // Helper function to set default values diff --git a/memcache/memcache.go b/memcache/memcache.go index 139da935..5547c734 100644 --- a/memcache/memcache.go +++ b/memcache/memcache.go @@ -30,15 +30,17 @@ func New(config ...Config) *Storage { db.Timeout = cfg.timeout db.MaxIdleConns = cfg.maxIdleConns - // Ping database to ensure a connection has been made - if err := db.Ping(); err != nil { - panic(err) - } - - if cfg.Reset { - if err := db.DeleteAll(); err != nil { + if !cfg.DisableStartupCheck { + // Ping database to ensure a connection has been made + if err := db.Ping(); err != nil { panic(err) } + + if cfg.Reset { + if err := db.DeleteAll(); err != nil { + panic(err) + } + } } // Create storage diff --git a/memcache/memcache_test.go b/memcache/memcache_test.go index a6449f28..4af3cf5c 100644 --- a/memcache/memcache_test.go +++ b/memcache/memcache_test.go @@ -178,6 +178,16 @@ func Test_Memcache_Reset(t *testing.T) { require.Zero(t, len(result)) } +func Test_Memcache_New_DisableStartupCheck(t *testing.T) { + require.NotPanics(t, func() { + store := New(Config{ + Servers: "127.0.0.1:11210", + DisableStartupCheck: true, + }) + require.NotNil(t, store) + }) +} + func Test_Memcache_Close(t *testing.T) { testStore := newTestStore(t) require.Nil(t, testStore.Close()) diff --git a/mysql/README.md b/mysql/README.md index 4c9bcdd6..06da231d 100644 --- a/mysql/README.md +++ b/mysql/README.md @@ -127,6 +127,11 @@ type Config struct { // Optional. Default is false Reset bool + // DisableStartupCheck skips the initial connection validation during New. + // + // Optional. Default is false + DisableStartupCheck bool + // Time before deleting expired keys // // Optional. Default is 10 * time.Second @@ -143,6 +148,7 @@ var ConfigDefault = Config{ Database: "fiber", Table: "fiber_storage", Reset: false, + DisableStartupCheck: false, GCInterval: 10 * time.Second, } ``` diff --git a/mysql/config.go b/mysql/config.go index d16349de..7ae38af9 100644 --- a/mysql/config.go +++ b/mysql/config.go @@ -53,6 +53,11 @@ type Config struct { // Optional. Default is false Reset bool + // DisableStartupCheck skips the initial connection validation during New. + // + // Optional. Default is false + DisableStartupCheck bool + // Time before deleting expired keys // // Optional. Default is 10 * time.Second @@ -69,17 +74,18 @@ type Config struct { // ConfigDefault is the default config var ConfigDefault = Config{ - Db: nil, - ConnectionURI: "", - Host: "127.0.0.1", - Port: 3306, - Database: "fiber", - Table: "fiber_storage", - Reset: false, - GCInterval: 10 * time.Second, - maxOpenConns: 100, - maxIdleConns: 100, - connMaxLifetime: 1 * time.Second, + Db: nil, + ConnectionURI: "", + Host: "127.0.0.1", + Port: 3306, + Database: "fiber", + Table: "fiber_storage", + Reset: false, + DisableStartupCheck: false, + GCInterval: 10 * time.Second, + maxOpenConns: 100, + maxIdleConns: 100, + connMaxLifetime: 1 * time.Second, } func (c Config) dsn() string { diff --git a/mysql/mysql.go b/mysql/mysql.go index ae0bfcd2..f1db737c 100644 --- a/mysql/mysql.go +++ b/mysql/mysql.go @@ -63,26 +63,28 @@ func New(config ...Config) *Storage { db.SetConnMaxLifetime(cfg.connMaxLifetime) } - // Ping database to ensure a connection has been made - if err := db.Ping(); err != nil { - panic(err) - } - - // Drop table if Clear set to true - if cfg.Reset { - query := fmt.Sprintf(dropQuery, cfg.Table) - if _, err = db.Exec(query); err != nil { - _ = db.Close() + if !cfg.DisableStartupCheck { + // Ping database to ensure a connection has been made + if err := db.Ping(); err != nil { panic(err) } - } - // Init database queries - for _, query := range initQuery { - query = fmt.Sprintf(query, cfg.Table) - if _, err := db.Exec(query); err != nil { - _ = db.Close() - panic(err) + // Drop table if Clear set to true + if cfg.Reset { + query := fmt.Sprintf(dropQuery, cfg.Table) + if _, err = db.Exec(query); err != nil { + _ = db.Close() + panic(err) + } + } + + // Init database queries + for _, query := range initQuery { + query = fmt.Sprintf(query, cfg.Table) + if _, err := db.Exec(query); err != nil { + _ = db.Close() + panic(err) + } } } @@ -98,7 +100,9 @@ func New(config ...Config) *Storage { sqlGC: fmt.Sprintf("DELETE FROM %s WHERE e <= ? AND e != 0", cfg.Table), } - store.checkSchema(cfg.Table) + if !cfg.DisableStartupCheck { + store.checkSchema(cfg.Table) + } // Start garbage collector go store.gcTicker() diff --git a/mysql/mysql_test.go b/mysql/mysql_test.go index 19ee758d..14364620 100644 --- a/mysql/mysql_test.go +++ b/mysql/mysql_test.go @@ -108,6 +108,18 @@ func Test_MYSQL_New(t *testing.T) { defer newConfigStore.Close() } +func Test_MYSQL_New_DisableStartupCheck(t *testing.T) { + require.NotPanics(t, func() { + store := New(Config{ + Host: "127.0.0.1", + Port: 3308, + DisableStartupCheck: true, + }) + require.NotNil(t, store) + defer store.Close() + }) +} + func Test_MYSQL_GC(t *testing.T) { testVal := []byte("doe") diff --git a/postgres/README.md b/postgres/README.md index a49479f2..11ccd6f0 100644 --- a/postgres/README.md +++ b/postgres/README.md @@ -117,6 +117,11 @@ type Config struct { // Optional. Default is false Reset bool + // DisableStartupCheck skips the initial connection validation during New. + // + // Optional. Default is false + DisableStartupCheck bool + // Time before deleting expired keys // // Optional. Default is 10 * time.Second @@ -135,6 +140,7 @@ var ConfigDefault = Config{ Table: "fiber_storage", SSLMode: "disable", Reset: false, + DisableStartupCheck: false, GCInterval: 10 * time.Second, } ``` diff --git a/postgres/config.go b/postgres/config.go index aecbfe97..d817b57e 100644 --- a/postgres/config.go +++ b/postgres/config.go @@ -61,6 +61,11 @@ type Config struct { // Optional. Default is false Reset bool + // DisableStartupCheck skips the initial connection validation during New. + // + // Optional. Default is false + DisableStartupCheck bool + // Time before deleting expired keys // // Optional. Default is 10 * time.Second @@ -69,14 +74,15 @@ type Config struct { // ConfigDefault is the default config var ConfigDefault = Config{ - ConnectionURI: "", - Host: "127.0.0.1", - Port: 5432, - Database: "fiber", - Table: "fiber_storage", - SSLMode: "disable", - Reset: false, - GCInterval: 10 * time.Second, + ConnectionURI: "", + Host: "127.0.0.1", + Port: 5432, + Database: "fiber", + Table: "fiber_storage", + SSLMode: "disable", + Reset: false, + DisableStartupCheck: false, + GCInterval: 10 * time.Second, } func (c *Config) getDSN() string { diff --git a/postgres/postgres.go b/postgres/postgres.go index 3175906d..0585b39d 100644 --- a/postgres/postgres.go +++ b/postgres/postgres.go @@ -68,43 +68,45 @@ func New(config ...Config) *Storage { } } - // Ping database - if err := db.Ping(context.Background()); err != nil { - panic(err) - } + if !cfg.DisableStartupCheck { + // Ping database + if err := db.Ping(context.Background()); err != nil { + panic(err) + } - // Parse out schema in config, if provided - schema := "public" - tableName := cfg.Table - if strings.Contains(cfg.Table, ".") { - schema = strings.Split(cfg.Table, ".")[0] - tableName = strings.Split(cfg.Table, ".")[1] - } + // Parse out schema in config, if provided + schema := "public" + tableName := cfg.Table + if strings.Contains(cfg.Table, ".") { + schema = strings.Split(cfg.Table, ".")[0] + tableName = strings.Split(cfg.Table, ".")[1] + } - // Drop table if set to true - if cfg.Reset { - if _, err := db.Exec(context.Background(), fmt.Sprintf(dropQuery, cfg.Table)); err != nil { + // Drop table if set to true + if cfg.Reset { + if _, err := db.Exec(context.Background(), fmt.Sprintf(dropQuery, cfg.Table)); err != nil { + db.Close() + panic(err) + } + } + + // Determine if table exists + tableExists := false + row := db.QueryRow(context.Background(), fmt.Sprintf(checkTableExistsQuery, schema, tableName)) + var count int + if err := row.Scan(&count); err != nil { db.Close() panic(err) } - } + tableExists = count > 0 - // Determine if table exists - tableExists := false - row := db.QueryRow(context.Background(), fmt.Sprintf(checkTableExistsQuery, schema, tableName)) - var count int - if err := row.Scan(&count); err != nil { - db.Close() - panic(err) - } - tableExists = count > 0 - - // Init database queries - if !tableExists { - for _, query := range initQuery { - if _, err := db.Exec(context.Background(), fmt.Sprintf(query, cfg.Table)); err != nil { - db.Close() - panic(err) + // Init database queries + if !tableExists { + for _, query := range initQuery { + if _, err := db.Exec(context.Background(), fmt.Sprintf(query, cfg.Table)); err != nil { + db.Close() + panic(err) + } } } } @@ -121,7 +123,9 @@ func New(config ...Config) *Storage { sqlGC: fmt.Sprintf("DELETE FROM %s WHERE e <= $1 AND e != 0", cfg.Table), } - store.checkSchema(cfg.Table) + if !cfg.DisableStartupCheck { + store.checkSchema(cfg.Table) + } // Start garbage collector go store.gcTicker() diff --git a/postgres/postgres_test.go b/postgres/postgres_test.go index f20f8f1f..4a711d0e 100644 --- a/postgres/postgres_test.go +++ b/postgres/postgres_test.go @@ -202,6 +202,18 @@ func TestNoCreateUser(t *testing.T) { }) } + +func Test_Postgres_New_DisableStartupCheck(t *testing.T) { + require.NotPanics(t, func() { + store := New(Config{ + Host: "127.0.0.1", + Port: 65432, + DisableStartupCheck: true, + }) + require.NotNil(t, store) + defer store.Close() + }) +} func Test_Should_Panic_On_Wrong_Schema(t *testing.T) { testStore := newTestStore(t) defer testStore.Close() diff --git a/redis/README.md b/redis/README.md index 308262be..974e8f4d 100644 --- a/redis/README.md +++ b/redis/README.md @@ -180,6 +180,11 @@ type Config struct { // Optional. Default is false Reset bool + // DisableStartupCheck skips the initial connection validation during New. + // + // Optional. Default is false + DisableStartupCheck bool + // TLS Config to use. When set TLS will be negotiated. // // Optional. Default is nil @@ -208,6 +213,7 @@ var ConfigDefault = Config{ URL: "", Database: 0, Reset: false, + DisableStartupCheck: false, TLSConfig: nil, PoolSize: 10 * runtime.GOMAXPROCS(0), Addrs: []string{}, diff --git a/redis/config.go b/redis/config.go index 2f9f549e..a7711b22 100644 --- a/redis/config.go +++ b/redis/config.go @@ -68,6 +68,11 @@ type Config struct { // Optional. Default is false Reset bool + // DisableStartupCheck skips the initial connection validation during New. + // + // Optional. Default is false + DisableStartupCheck bool + // TLS Config to use. When set TLS will be negotiated. // // Optional. Default is nil @@ -87,21 +92,22 @@ type Config struct { // ConfigDefault is the default config var ConfigDefault = Config{ - Host: "127.0.0.1", - Port: 6379, - Username: "", - Password: "", - URL: "", - Database: 0, - Reset: false, - TLSConfig: nil, - PoolSize: 10 * runtime.GOMAXPROCS(0), - Addrs: []string{}, - MasterName: "", - ClientName: "", - SentinelUsername: "", - SentinelPassword: "", - IsClusterMode: false, + Host: "127.0.0.1", + Port: 6379, + Username: "", + Password: "", + URL: "", + Database: 0, + Reset: false, + DisableStartupCheck: false, + TLSConfig: nil, + PoolSize: 10 * runtime.GOMAXPROCS(0), + Addrs: []string{}, + MasterName: "", + ClientName: "", + SentinelUsername: "", + SentinelPassword: "", + IsClusterMode: false, } // Helper function to set default values diff --git a/redis/redis.go b/redis/redis.go index e2fc4b0f..65f6d7c3 100644 --- a/redis/redis.go +++ b/redis/redis.go @@ -65,16 +65,18 @@ func New(config ...Config) *Storage { IsClusterMode: cfg.IsClusterMode, }) - // Test connection - if err := db.Ping(context.Background()).Err(); err != nil { - panic(err) - } - - // Empty collection if Clear is true - if cfg.Reset { - if err := db.FlushDB(context.Background()).Err(); err != nil { + if !cfg.DisableStartupCheck { + // Test connection + if err := db.Ping(context.Background()).Err(); err != nil { panic(err) } + + // Empty collection if Clear is true + if cfg.Reset { + if err := db.FlushDB(context.Background()).Err(); err != nil { + panic(err) + } + } } // Create new store diff --git a/redis/redis_test.go b/redis/redis_test.go index d97126a7..7f295aea 100644 --- a/redis/redis_test.go +++ b/redis/redis_test.go @@ -198,6 +198,19 @@ func Test_Redis_Delete(t *testing.T) { require.Nil(t, keys) } +func Test_Redis_New_DisableStartupCheck(t *testing.T) { + require.NotPanics(t, func() { + store := New(Config{ + Host: "127.0.0.1", + Port: 6390, + Addrs: []string{"127.0.0.1:6390"}, + DisableStartupCheck: true, + }) + require.NotNil(t, store) + _ = store.Close() + }) +} + func Test_Redis_DeleteWithContext(t *testing.T) { var ( key = "john"