github.com/fragmenta/query@v1.5.3/database.go (about) 1 package query 2 3 import ( 4 "database/sql" 5 "fmt" 6 "time" 7 8 "github.com/fragmenta/query/adapters" 9 ) 10 11 // database is the package global db - this reference is not exported outside the package. 12 var database adapters.Database 13 14 // OpenDatabase opens the database with the given options 15 func OpenDatabase(opts map[string]string) error { 16 17 // If we already have a db, return it 18 if database != nil { 19 return fmt.Errorf("query: database already open - %s", database) 20 } 21 22 // Assign the db global in query package 23 switch opts["adapter"] { 24 case "sqlite3": 25 database = &adapters.SqliteAdapter{} 26 case "mysql": 27 database = &adapters.MysqlAdapter{} 28 case "postgres": 29 database = &adapters.PostgresqlAdapter{} 30 default: 31 database = nil // fail 32 } 33 34 if database == nil { 35 return fmt.Errorf("query: database adapter not recognised - %s", opts) 36 } 37 38 // Ask the db adapter to open 39 return database.Open(opts) 40 } 41 42 // CloseDatabase closes the database opened by OpenDatabase 43 func CloseDatabase() error { 44 var err error 45 if database != nil { 46 err = database.Close() 47 database = nil 48 } 49 50 return err 51 } 52 53 // SetMaxOpenConns sets the maximum number of open connections 54 func SetMaxOpenConns(max int) { 55 database.SQLDB().SetMaxOpenConns(max) 56 } 57 58 // QuerySQL executes the given sql Query against our database, with arbitrary args 59 func QuerySQL(query string, args ...interface{}) (*sql.Rows, error) { 60 if database == nil { 61 return nil, fmt.Errorf("query: QuerySQL called with nil database") 62 } 63 results, err := database.Query(query, args...) 64 return results, err 65 } 66 67 // ExecSQL executes the given sql against our database with arbitrary args 68 // NB returns sql.Result - not to be used when rows expected 69 func ExecSQL(query string, args ...interface{}) (sql.Result, error) { 70 if database == nil { 71 return nil, fmt.Errorf("query: ExecSQL called with nil database") 72 } 73 results, err := database.Exec(query, args...) 74 return results, err 75 } 76 77 // TimeString returns a string formatted as a time for this db 78 // if the database is nil, an empty string is returned. 79 func TimeString(t time.Time) string { 80 if database != nil { 81 return database.TimeString(t) 82 } 83 return "" 84 }