relynolli-server/internal/database.go

98 lines
1.6 KiB
Go

package internal
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
"log"
"os"
"sync"
"time"
)
type database struct {
instance *sqlx.DB
}
type Database interface {
GetInstance() *sqlx.DB
Close()
Query(stmt string) *sqlx.Rows
Execute(stmt string) sql.Result
FetchRows(stmt string, dest interface{})
}
var (
instance *database = nil
once sync.Once
)
func initialize() {
db, err := sqlx.Open("mysql", fmt.Sprintf(
"%s:%s@tcp(%s)/%s",
os.Getenv("MYSQL_USER"),
os.Getenv("MYSQL_PASSWORD"),
os.Getenv("MYSQL_HOST"),
os.Getenv("MYSQL_DATABASE")))
db.SetConnMaxLifetime(time.Minute * 3)
db.SetMaxOpenConns(3)
db.SetMaxIdleConns(3)
if err != nil {
panic(err)
}
if db.Ping() != nil {
panic(err)
}
log.Println("Connection to db succeded")
instance = &database{instance: db}
}
func InitDatabase() Database {
if instance == nil {
once.Do(initialize)
}
return instance
}
func (db *database) GetInstance() *sqlx.DB {
return db.instance
}
func (db *database) Close() {
defer log.Println("Connection to database was closed")
err := db.instance.Close()
if err != nil {
return
}
}
func (db *database) Query(stmt string) *sqlx.Rows {
rows, err := db.instance.Queryx(stmt)
if err != nil {
return nil
}
return rows
}
func (db *database) Execute(stmt string) sql.Result {
result, err := db.instance.Exec(stmt)
if err != nil {
log.Println(err)
}
return result
}
type FetchRowStruct []interface{}
func (db *database) FetchRows(stmt string, dest interface{}) {
err := db.instance.Select(dest, stmt)
if err != nil {
log.Println(err)
}
}