diff --git a/db.go b/db.go index 8b9ad403e5ec11ae3137c29ff5ed46d5fe4d5eea..ac2a03ed1a227d6a5fcde8b988f8b7a4ad8d1f28 100644 --- a/db.go +++ b/db.go @@ -31,6 +31,7 @@ package db import ( "fmt" + "reflect" ) /* @@ -416,12 +417,15 @@ var wrappers = make(map[string]Database) Registers a database wrapper with an unique name. */ func Register(name string, driver Database) { + if name == "" { panic("Missing wrapper name.") } + if _, ok := wrappers[name]; ok != false { - panic("A wrapper with the same name was already registered.") + panic("Register called twice for driver " + name) } + wrappers[name] = driver } @@ -429,12 +433,21 @@ func Register(name string, driver Database) { Opens a database using the named driver and the db.DataSource settings. */ func Open(name string, settings DataSource) (Database, error) { - if _, ok := wrappers[name]; ok == false { + + driver, ok := wrappers[name] + + if ok == false { panic(fmt.Sprintf("Unknown wrapper: %s.", name)) } - err := wrappers[name].Setup(settings) + + // Creating a new connection everytime Open() is called. + conn := reflect.New(reflect.ValueOf(driver).Elem().Type()).Interface().(Database) + + err := conn.Setup(settings) + if err != nil { return nil, err } - return wrappers[name], nil + + return conn, nil } diff --git a/mysql/mysql.go b/mysql/mysql.go index 6325b4b3957e7e8bb384332778e2eab818078da2..0ea251d93381457855ee5807384202e6c77fbca5 100644 --- a/mysql/mysql.go +++ b/mysql/mysql.go @@ -179,6 +179,7 @@ func (self *Source) Close() error { */ func (self *Source) Setup(config db.DataSource) error { self.config = config + self.session = nil self.collections = make(map[string]db.Collection) return self.Open() } diff --git a/mysql/mysql_test.go b/mysql/mysql_test.go index 9c6a3cace75a833b1d830e409eaca9454a1f5e64..9f2d2b3187789734813cc9f9e08a698a1963cdd1 100644 --- a/mysql/mysql_test.go +++ b/mysql/mysql_test.go @@ -216,6 +216,21 @@ func TestFind(t *testing.T) { defer sess.Close() + /* + // Testing simultaneous connection. + sess2, err := db.Open(wrapperName, db.DataSource { + Database: "mysql", + Socket: socket, + User: "root", + }) + + if err != nil { + t.Fatalf(err.Error()) + } + + defer sess2.Close() + */ + people, _ := sess.Collection("people") // Testing Find()