openct-tasks/object/adapter.go

143 lines
2.5 KiB
Go

package object
import (
"fmt"
"runtime"
"github.com/astaxie/beego"
_ "github.com/go-sql-driver/mysql"
"xorm.io/xorm"
)
var adapter *Adapter
func InitConfig() {
err := beego.LoadAppConfig("ini", "../conf/app.conf")
if err != nil {
panic(err)
}
InitAdapter()
}
func InitAdapter() {
adapter = NewAdapter(beego.AppConfig.String("driverName"), beego.AppConfig.String("dataSourceName"))
}
// Adapter represents the MySQL adapter for policy storage.
type Adapter struct {
driverName string
dataSourceName string
engine *xorm.Engine
}
// finalizer is the destructor for Adapter.
func finalizer(a *Adapter) {
err := a.engine.Close()
if err != nil {
panic(err)
}
}
// NewAdapter is the constructor for Adapter.
func NewAdapter(driverName string, dataSourceName string) *Adapter {
a := &Adapter{}
a.driverName = driverName
a.dataSourceName = dataSourceName
// Open the DB, create it if not existed.
a.open()
// Call the destructor when the object is released.
runtime.SetFinalizer(a, finalizer)
return a
}
func (a *Adapter) createDatabase() error {
engine, err := xorm.NewEngine(a.driverName, a.dataSourceName)
if err != nil {
return err
}
defer engine.Close()
_, err = engine.Exec(fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s default charset utf8 COLLATE utf8_general_ci", beego.AppConfig.String("dbName")))
return err
}
func (a *Adapter) open() {
if err := a.createDatabase(); err != nil {
panic(err)
}
engine, err := xorm.NewEngine(a.driverName, a.dataSourceName+beego.AppConfig.String("dbName"))
if err != nil {
panic(err)
}
a.engine = engine
a.createTable()
}
func (a *Adapter) close() {
a.engine.Close()
a.engine = nil
}
func (a *Adapter) createTable() {
err := a.engine.Sync2(new(Dataset))
if err != nil {
panic(err)
}
err = a.engine.Sync2(new(Project))
if err != nil {
panic(err)
}
err = a.engine.Sync2(new(Assignment))
if err != nil {
panic(err)
}
err = a.engine.Sync2(new(Audit))
if err != nil {
panic(err)
}
err = a.engine.Sync2(new(FileItem))
if err != nil {
panic(err)
}
err = a.engine.Sync2(new(Step))
if err != nil {
panic(err)
}
err = a.engine.Sync2(new(Submit))
if err != nil {
panic(err)
}
err = a.engine.Sync2(new(TempQuestion))
if err != nil {
panic(err)
}
err = a.engine.Sync2(new(FinalQuestion))
if err != nil {
panic(err)
}
err = a.engine.Sync2(new(TempTestpaper))
if err != nil {
panic(err)
}
err = a.engine.Sync2(new(FinalTestpaper))
if err != nil {
panic(err)
}
}