Newer
Older
// Copyright (c) 2012-2014 José Carlos Nieto, https://menteslibres.net/xiam
//
// 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 (
"fmt"
"reflect"
)
// This map holds a copy of all registered adapters.
var wrappers = make(map[string]Database)
// Register associates an adapter's name with a type. Panics if the adapter
// name is empty or the adapter is nil.
func Register(name string, adapter Database) {
if name == `` {
panic(`Missing adapter name.`)
}
if _, ok := wrappers[name]; ok != false {
panic(`db.Register() called twice for adapter: ` + name)
wrappers[name] = adapter
// Open configures a database session using the given adapter's name and the
// provided settings.
func Open(adapter string, conn ConnectionURL) (Database, error) {
if ok == false {
// Using panic instead of returning error because attemping to use an
// adapter that does not exists will never result in success.
panic(fmt.Sprintf(`Open: Unknown adapter %s. (see: https://upper.io/db#database-adapters)`, adapter))
}
// Creating a new connection everytime Open() is called.
driverType := reflect.ValueOf(driver).Elem().Type()
newAdapter := reflect.New(driverType).Interface().(Database)
// Setting up the connection.
if err := newAdapter.Setup(conn); err != nil {
return nil, err
}
return newAdapter, nil
}