METANOIA/database/database.go
2022-01-30 04:39:04 +01:00

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()
}