github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/go-xorm/xorm/xorm.go (about)

     1  // Copyright 2015 The Xorm Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package xorm
     6  
     7  import (
     8  	"fmt"
     9  	"os"
    10  	"reflect"
    11  	"runtime"
    12  	"sync"
    13  	"time"
    14  
    15  	"github.com/insionng/yougam/libraries/go-xorm/core"
    16  )
    17  
    18  const (
    19  	// Version show the xorm's version
    20  	Version string = "0.6.0.1022"
    21  )
    22  
    23  func regDrvsNDialects() bool {
    24  	providedDrvsNDialects := map[string]struct {
    25  		dbType     core.DbType
    26  		getDriver  func() core.Driver
    27  		getDialect func() core.Dialect
    28  	}{
    29  		"mssql":    {"mssql", func() core.Driver { return &odbcDriver{} }, func() core.Dialect { return &mssql{} }},
    30  		"odbc":     {"mssql", func() core.Driver { return &odbcDriver{} }, func() core.Dialect { return &mssql{} }}, // !nashtsai! TODO change this when supporting MS Access
    31  		"mysql":    {"mysql", func() core.Driver { return &mysqlDriver{} }, func() core.Dialect { return &mysql{} }},
    32  		"mymysql":  {"mysql", func() core.Driver { return &mymysqlDriver{} }, func() core.Dialect { return &mysql{} }},
    33  		"postgres": {"postgres", func() core.Driver { return &pqDriver{} }, func() core.Dialect { return &postgres{} }},
    34  		"pgx":      {"postgres", func() core.Driver { return &pqDriver{} }, func() core.Dialect { return &postgres{} }},
    35  		"sqlite3":  {"sqlite3", func() core.Driver { return &sqlite3Driver{} }, func() core.Dialect { return &sqlite3{} }},
    36  		"oci8":     {"oracle", func() core.Driver { return &oci8Driver{} }, func() core.Dialect { return &oracle{} }},
    37  		"goracle":  {"oracle", func() core.Driver { return &goracleDriver{} }, func() core.Dialect { return &oracle{} }},
    38  	}
    39  
    40  	for driverName, v := range providedDrvsNDialects {
    41  		if driver := core.QueryDriver(driverName); driver == nil {
    42  			core.RegisterDriver(driverName, v.getDriver())
    43  			core.RegisterDialect(v.dbType, v.getDialect)
    44  		}
    45  	}
    46  	return true
    47  }
    48  
    49  func close(engine *Engine) {
    50  	engine.Close()
    51  }
    52  
    53  // NewEngine new a db manager according to the parameter. Currently support four
    54  // drivers
    55  func NewEngine(driverName string, dataSourceName string) (*Engine, error) {
    56  	regDrvsNDialects()
    57  	driver := core.QueryDriver(driverName)
    58  	if driver == nil {
    59  		return nil, fmt.Errorf("Unsupported driver name: %v", driverName)
    60  	}
    61  
    62  	uri, err := driver.Parse(driverName, dataSourceName)
    63  	if err != nil {
    64  		return nil, err
    65  	}
    66  
    67  	dialect := core.QueryDialect(uri.DbType)
    68  	if dialect == nil {
    69  		return nil, fmt.Errorf("Unsupported dialect type: %v", uri.DbType)
    70  	}
    71  
    72  	db, err := core.Open(driverName, dataSourceName)
    73  	if err != nil {
    74  		return nil, err
    75  	}
    76  
    77  	err = dialect.Init(db, uri, driverName, dataSourceName)
    78  	if err != nil {
    79  		return nil, err
    80  	}
    81  
    82  	engine := &Engine{
    83  		db:            db,
    84  		dialect:       dialect,
    85  		Tables:        make(map[reflect.Type]*core.Table),
    86  		mutex:         &sync.RWMutex{},
    87  		TagIdentifier: "xorm",
    88  		TZLocation:    time.Local,
    89  	}
    90  
    91  	logger := NewSimpleLogger(os.Stdout)
    92  	logger.SetLevel(core.LOG_INFO)
    93  	engine.SetLogger(logger)
    94  	engine.SetMapper(core.NewCacheMapper(new(core.SnakeMapper)))
    95  
    96  	runtime.SetFinalizer(engine, close)
    97  
    98  	return engine, nil
    99  }
   100  
   101  // Clone clone an engine
   102  func (engine *Engine) Clone() (*Engine, error) {
   103  	return NewEngine(engine.DriverName(), engine.DataSourceName())
   104  }