From 10e02bac31acfbd1397a2bc2e93ca7d2a53c971e Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Thu, 14 Mar 2019 11:12:08 -0600 Subject: [PATCH] Add new --- db.go | 31 ++++++++++++++++++++++++++++--- db_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/db.go b/db.go index 28ff4ee..5bb05e0 100644 --- a/db.go +++ b/db.go @@ -1,6 +1,9 @@ package storage -import "strings" +import ( + "fmt" + "strings" +) type DB interface { Get(string) ([]byte, error) @@ -53,6 +56,28 @@ func TypeFromString(key string) Type { return Type(-1) } -func New(key Type) (DB, error) { - return nil, ErrNotImpl +func New(key Type, params ...string) (db DB, err error) { + defer func() { + if i := recover(); i != nil { + err = fmt.Errorf("panic making %s: %v", key, i) + } + }() + err = ErrNotImpl + switch key { + case MAP: + db = NewMap() + case BOLT: + db, err = NewBolt(params[0]) + case CACHE: + db, err = NewCache(params...) + case LEVELDB: + db, err = NewLevelDB(params[0]) + case MEMCACHE: + db, err = NewMemcache(params[0], params[1:]...) + case MEMCACHECLUSTER: + db, err = NewMemcacheCluster(params[0], params[1:]...) + case MONGO: + db, err = NewMongo(params[0], params[1:]...) + } + return } diff --git a/db_test.go b/db_test.go index 70c3bde..5db0fde 100644 --- a/db_test.go +++ b/db_test.go @@ -3,9 +3,11 @@ package storage import ( "bytes" "io/ioutil" + "log" "net" "os" "path" + "sync" "testing" ) @@ -180,3 +182,33 @@ func TestToFromString(t *testing.T) { } } } + +func TestNew(t *testing.T) { + dir, err := ioutil.TempDir("", "storage_tests_") + if err != nil { + t.Fatalf("cannot create temp dir: %v", err) + return + } + defer os.RemoveAll(dir) + + if b, err := New(BOLT); err == nil { + t.Errorf("can create bolt without path") + b.Close() + } + + if b, err := New(BOLT, path.Join(dir, "bolt")); err != nil { + t.Errorf("cannot create bolt with path") + } else { + b.Close() + } +} + +func recoverDeferred(c Type, t *testing.T, wg *sync.WaitGroup) { + if err := recover(); err != nil { + log.Printf("recover deferre fail: %s", c) + t.Errorf("[%s] panic: %v", c, err) + } else { + log.Printf("recover deferre ok: %s", c) + } + defer wg.Done() +}