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  }