github.com/fragmenta/query@v1.5.3/adapters/database_sqlite.go (about)

     1  package adapters
     2  
     3  // FIXME: Sqlite drivers are broken compiling with cgo at present
     4  // therefore we don't use this adapter
     5  
     6  import (
     7  	"database/sql"
     8  	"fmt"
     9  	// Unfortunately can't cross compile with sqlite support enabled -
    10  	// see https://github.com/mattn/go-sqlite3/issues/106
    11  	// For now for we just turn off sqlite as we don't use it in production...
    12  	// pure go version of sqlite, or ditch sqlite and find some other pure go simple db
    13  	// would be nice not to require a db at all for very simple usage
    14  	//_ "github.com/mattn/go-sqlite3"
    15  )
    16  
    17  // SqliteAdapter conforms to the query.Database interface
    18  type SqliteAdapter struct {
    19  	*Adapter
    20  	options map[string]string
    21  	sqlDB   *sql.DB
    22  	debug   bool
    23  }
    24  
    25  // Open this database
    26  func (db *SqliteAdapter) Open(opts map[string]string) error {
    27  
    28  	db.debug = false
    29  	db.options = map[string]string{
    30  		"adapter": "sqlite3",
    31  		"db":      "./tests/query_test.sqlite",
    32  	}
    33  
    34  	if opts["debug"] == "true" {
    35  		db.debug = true
    36  	}
    37  
    38  	for k, v := range opts {
    39  		db.options[k] = v
    40  	}
    41  
    42  	var err error
    43  	db.sqlDB, err = sql.Open(db.options["adapter"], db.options["db"])
    44  	if err != nil {
    45  		return err
    46  	}
    47  
    48  	if db.sqlDB != nil && db.debug {
    49  		fmt.Printf("Database %s opened using %s\n", db.options["db"], db.options["adapter"])
    50  	}
    51  
    52  	// Call ping on the db to check it does actually exist!
    53  	err = db.sqlDB.Ping()
    54  	if err != nil {
    55  		return err
    56  	}
    57  
    58  	return err
    59  
    60  }
    61  
    62  // Close the database
    63  func (db *SqliteAdapter) Close() error {
    64  	if db.sqlDB != nil {
    65  		return db.sqlDB.Close()
    66  	}
    67  	return nil
    68  }
    69  
    70  // SQLDB returns the internal db.sqlDB pointer
    71  func (db *SqliteAdapter) SQLDB() *sql.DB {
    72  	return db.sqlDB
    73  }
    74  
    75  // Query execute Query SQL - NB caller must call use defer rows.Close() with rows returned
    76  func (db *SqliteAdapter) Query(query string, args ...interface{}) (*sql.Rows, error) {
    77  	return db.performQuery(db.sqlDB, db.debug, query, args...)
    78  }
    79  
    80  // Exec - use this for non-select statements
    81  func (db *SqliteAdapter) Exec(query string, args ...interface{}) (sql.Result, error) {
    82  	return db.performExec(db.sqlDB, db.debug, query, args...)
    83  }
    84  
    85  // Insert a record with params and return the id - psql behaves differently
    86  func (db *SqliteAdapter) Insert(query string, args ...interface{}) (id int64, err error) {
    87  
    88  	// Execute the sql using db
    89  	result, err := db.Exec(query, args...)
    90  	if err != nil {
    91  		return 0, err
    92  	}
    93  
    94  	id, err = result.LastInsertId()
    95  	if err != nil {
    96  		return 0, err
    97  	}
    98  
    99  	return id, nil
   100  
   101  }