80 lines
1.4 KiB
Go
80 lines
1.4 KiB
Go
package database
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
)
|
|
|
|
type Database struct {
|
|
handle *sql.DB
|
|
stmtRelease []func()
|
|
}
|
|
|
|
func OpenDatabase(connStr string) (*Database, error) {
|
|
handle, err := sql.Open("postgres", connStr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
db := &Database{
|
|
handle: handle,
|
|
}
|
|
|
|
err = db.fillPreparedStatements()
|
|
if err != nil {
|
|
db.Close()
|
|
return nil, err
|
|
}
|
|
|
|
return db, nil
|
|
}
|
|
|
|
func (db *Database) Query(query string, args ...interface{}) (*sql.Rows, error) {
|
|
//TODO: cache prepared statements
|
|
return db.handle.Query(query, args...)
|
|
}
|
|
|
|
func (db *Database) GetTx() (*sql.Tx, error) {
|
|
return db.handle.BeginTx(context.Background(), nil)
|
|
}
|
|
|
|
func (db *Database) Exec(query string, args ...interface{}) (sql.Result, error) {
|
|
//TODO: cache prepared statements
|
|
return db.handle.Exec(query, args...)
|
|
}
|
|
|
|
func (db *Database) createStatement(query string) (*sql.Stmt, error) {
|
|
stmt, err := db.handle.Prepare(query)
|
|
|
|
if err == nil {
|
|
db.stmtRelease = append(db.stmtRelease, func() {
|
|
stmt.Close()
|
|
})
|
|
}
|
|
|
|
return stmt, err
|
|
}
|
|
|
|
func (db *Database) fillPreparedStatements() error {
|
|
var err error
|
|
|
|
return err
|
|
}
|
|
|
|
func (db *Database) closeStmt(stmt *sql.Stmt) error {
|
|
if stmt == nil {
|
|
return nil
|
|
}
|
|
return stmt.Close()
|
|
}
|
|
|
|
func (db *Database) Close() error {
|
|
|
|
//Close all statements
|
|
for _, f := range db.stmtRelease {
|
|
f()
|
|
}
|
|
db.stmtRelease = nil
|
|
return db.handle.Close()
|
|
}
|