· 8 years ago · Jan 28, 2018, 02:34 PM
1import (
2 "database/sql"
3 "log"
4
5 "github.com/go-gorp/gorp"
6)
7
8// go abstract db manipulation layer using gorp
9var (
10 g_dbMap *gorp.DbMap
11 g_logPrefix string
12 g_logger *log.Logger
13)
14
15type ModelMap struct {
16 Model interface{}
17 TableName string
18 PrimaryKeys []string
19 Autoincr bool
20}
21
22var g_modelMap = make([]*ModelMap, 0, 10)
23
24// InitializeDatabase try to connect to data source, and
25// create tables if not exists.
26// It should be called after all RegisterModelsToDb.
27func InitializeDatabase(datasrc, driverName string) error {
28 err := initDb(datasrc, driverName)
29 return err
30}
31
32// CloseDatabase close underneath db connection.
33// It returns error if failed.
34func CloseDatabase() error {
35 return GetDbMap().Db.Close()
36}
37
38// RegisterModelsToDb allowes to register a type of object to database persistance
39// layer.
40// keys being nil indicates the table doesn't have a primary key
41// example: RegisterModelsToDb(Solution{}, "solutions", []string{"Id"}, true)
42// autoincr indicates the key is auto incremental. When it's true, there can only one key
43func RegisterModelsToDb(model interface{}, tableName string, keys []string, autoincr bool) {
44 g_modelMap = append(g_modelMap, &ModelMap{model, tableName, keys, autoincr})
45}
46
47// GetDbMap return current gorp.DbMap.
48func GetDbMap() *gorp.DbMap {
49 return g_dbMap
50}
51
52// SetTrace turn on db trace logging to the logger with prefix.
53// If logger is nil, turn it off.
54func SetTrace(prefix string, logger *log.Logger) {
55 if GetDbMap() != nil {
56 if logger == nil {
57 GetDbMap().TraceOff()
58 } else {
59 GetDbMap().TraceOn(prefix, logger)
60 }
61 }
62 g_logPrefix = prefix
63 g_logger = logger
64}
65
66func initDb(datasrc, driverName string) error {
67 db, err := sql.Open(driverName, datasrc)
68 if err != nil {
69 return err
70 }
71
72 g_dbMap = &gorp.DbMap{Db: db, Dialect: gorp.SqliteDialect{}}
73
74 for _, mmap := range g_modelMap {
75 tabMap := g_dbMap.AddTableWithName(mmap.Model, mmap.TableName)
76 if len(mmap.PrimaryKeys) > 0 {
77 tabMap.SetKeys(mmap.Autoincr, mmap.PrimaryKeys...)
78 }
79 }
80
81 SetTrace(g_logPrefix, g_logger)
82
83 err = g_dbMap.CreateTablesIfNotExists()
84
85 return err
86}