[TASK] add database
This commit is contained in:
parent
17890122cf
commit
0208dc30b5
|
@ -0,0 +1,79 @@
|
||||||
|
// Package that provides the functionality to open, close and use a database
|
||||||
|
package database
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/jinzhu/gorm"
|
||||||
|
_ "github.com/jinzhu/gorm/dialects/postgres"
|
||||||
|
_ "github.com/jinzhu/gorm/dialects/sqlite"
|
||||||
|
_ "github.com/jinzhu/gorm/dialects/mysql"
|
||||||
|
|
||||||
|
"github.com/genofire/golang-lib/lib/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Database connection for writing purposes
|
||||||
|
var Write *gorm.DB
|
||||||
|
|
||||||
|
// Database connection for reading purposes
|
||||||
|
var Read *gorm.DB
|
||||||
|
|
||||||
|
// Configuration files
|
||||||
|
var (
|
||||||
|
config *Config
|
||||||
|
runtime []interface{}
|
||||||
|
)
|
||||||
|
|
||||||
|
// Configuration of the database connection
|
||||||
|
type Config struct {
|
||||||
|
// type of the database, currently supports sqlite and postgres
|
||||||
|
Type string
|
||||||
|
// connection configuration
|
||||||
|
Connection string
|
||||||
|
// create another connection for reading only
|
||||||
|
ReadConnection string
|
||||||
|
// enable logging of the generated sql string
|
||||||
|
Logging bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to open a database and set the given configuration
|
||||||
|
func Open(c Config) (err error) {
|
||||||
|
writeLog := log.Log.WithField("db", "write")
|
||||||
|
config = &c
|
||||||
|
Write, err = gorm.Open(config.Type, config.Connection)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
Write.SingularTable(true)
|
||||||
|
Write.LogMode(c.Logging)
|
||||||
|
Write.SetLogger(writeLog)
|
||||||
|
Write.Callback().Create().Remove("gorm:update_time_stamp")
|
||||||
|
Write.Callback().Update().Remove("gorm:update_time_stamp")
|
||||||
|
if len(config.ReadConnection) > 0 {
|
||||||
|
readLog := log.Log.WithField("db", "read")
|
||||||
|
Read, err = gorm.Open(config.Type, config.ReadConnection)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
Read.SingularTable(true)
|
||||||
|
Read.LogMode(c.Logging)
|
||||||
|
Read.SetLogger(readLog)
|
||||||
|
Read.Callback().Create().Remove("gorm:update_time_stamp")
|
||||||
|
Read.Callback().Update().Remove("gorm:update_time_stamp")
|
||||||
|
} else {
|
||||||
|
Read = Write
|
||||||
|
}
|
||||||
|
Write.AutoMigrate(runtime...)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to safely close the database
|
||||||
|
func Close() {
|
||||||
|
Write.Close()
|
||||||
|
if len(config.ReadConnection) > 0 {
|
||||||
|
Read.Close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to add a model to the runtime
|
||||||
|
func AddModel(m interface{}) {
|
||||||
|
runtime = append(runtime, m)
|
||||||
|
}
|
|
@ -0,0 +1,84 @@
|
||||||
|
// Package that provides the functionality to open, close and use a database
|
||||||
|
package database
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
type TestModel struct {
|
||||||
|
ID int64
|
||||||
|
Value string `gorm:"type:varchar(255);column:value" json:"value"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to test the error handling for the database opening
|
||||||
|
func TestOpenNoDB(t *testing.T) {
|
||||||
|
assert := assert.New(t)
|
||||||
|
|
||||||
|
c := Config{}
|
||||||
|
|
||||||
|
err := Open(c)
|
||||||
|
assert.Error(err, "error")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to test the opening of one database
|
||||||
|
func TestOpenOneDB(t *testing.T) {
|
||||||
|
assert := assert.New(t)
|
||||||
|
AddModel(&TestModel{})
|
||||||
|
|
||||||
|
c := Config{
|
||||||
|
Type: "sqlite3",
|
||||||
|
Logging: true,
|
||||||
|
Connection: "file:database?mode=memory",
|
||||||
|
}
|
||||||
|
var count int64
|
||||||
|
|
||||||
|
err := Open(c)
|
||||||
|
assert.NoError(err, "no error")
|
||||||
|
|
||||||
|
Write.Create(&TestModel{Value: "first"})
|
||||||
|
Write.Create(&TestModel{Value: "secound"})
|
||||||
|
|
||||||
|
var list []*TestModel
|
||||||
|
Read.Find(&list).Count(&count)
|
||||||
|
assert.Equal(int64(2), count, "not enought entries")
|
||||||
|
Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to test the opening of a second database
|
||||||
|
func TestOpenTwoDB(t *testing.T) {
|
||||||
|
assert := assert.New(t)
|
||||||
|
AddModel(&TestModel{})
|
||||||
|
c := Config{
|
||||||
|
Type: "sqlite3",
|
||||||
|
Logging: true,
|
||||||
|
Connection: "file:database?mode=memory",
|
||||||
|
ReadConnection: "file/",
|
||||||
|
}
|
||||||
|
|
||||||
|
err := Open(c)
|
||||||
|
assert.Error(err, "no error found")
|
||||||
|
|
||||||
|
c = Config{
|
||||||
|
Type: "sqlite3",
|
||||||
|
Logging: true,
|
||||||
|
Connection: "file:database?mode=memory",
|
||||||
|
ReadConnection: "file:database2?mode=memory",
|
||||||
|
}
|
||||||
|
var count int64
|
||||||
|
|
||||||
|
err = Open(c)
|
||||||
|
assert.NoError(err, "no error")
|
||||||
|
|
||||||
|
Write.Create(&TestModel{Value: "first"})
|
||||||
|
Write.Create(&TestModel{Value: "secound"})
|
||||||
|
|
||||||
|
var list []*TestModel
|
||||||
|
Write.Find(&list).Count(&count)
|
||||||
|
assert.Equal(int64(2), count, "not enought entries")
|
||||||
|
|
||||||
|
result := Read.Find(&list)
|
||||||
|
assert.Error(result.Error, "error, because it is the wrong database")
|
||||||
|
Close()
|
||||||
|
}
|
Loading…
Reference in New Issue