80 lines
1.5 KiB
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
|
|
}
|