server/database/connector.go

80 lines
1.5 KiB
Go

/**
* file: database/connector.go
* author: Theo Technicguy
* license: Apache 2.0
*
* Database connector
*/
package database
import (
"database/sql"
"errors"
"os"
hlogger "git.licolas.net/hoffman/server/logger"
_ "github.com/mattn/go-sqlite3"
"github.com/rs/zerolog"
)
var (
/* *** Errors *** */
ErrInvalidOperator = errors.New("invalid sql constraint joining operator - must be AND/OR")
sqlSelectLastId = "SELECT last_insert_rowid();"
logger zerolog.Logger = hlogger.GetLogger("database")
)
// Database Repository structure
type R struct {
db *sql.DB
}
func Connect(path string) (*R, error) {
logger.Info().Str("path", path).Msg("connecting to database")
_, errStat := os.Stat(path)
db, errSql := sql.Open("sqlite3", path)
if errSql != nil {
return nil, errSql
}
r := &R{db}
if os.IsNotExist(errStat) {
logger.Debug().Err(errStat).Msg("creating hoffman database")
if err := r.CreateHoffmanDatabase(); err != nil {
return nil, err
}
} else if errStat != nil {
return nil, errStat
}
logger.Debug().Str("path", path).Msg("done connecting to database")
return r, nil
}
func Use(db *sql.DB) *R {
return &R{db}
}
func (r *R) Disconnect() error {
logger.Info().Msg("disconnecting from database")
return r.db.Close()
}
func (r *R) CreateHoffmanDatabase() error {
if err := r.CreateProductTagTable(); err != nil {
return err
}
if err := r.CreateProductTable(); err != nil {
return err
}
if err := r.CreateProductTaggingTable(); err != nil {
return err
}
return nil
}