// Copyright 2021 The casbin Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package object import ( "fmt" "runtime" "github.com/astaxie/beego" "github.com/casbin/casdoor/conf" _ "github.com/go-sql-driver/mysql" // db = mysql //_ "github.com/lib/pq" // db = postgres "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"), conf.GetBeegoConfDataSourceName(), beego.AppConfig.String("dbName")) adapter.createTable() } // Adapter represents the MySQL adapter for policy storage. type Adapter struct { driverName string dataSourceName string dbName 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, dbName string) *Adapter { a := &Adapter{} a.driverName = driverName a.dataSourceName = dataSourceName a.dbName = dbName // 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", a.dbName)) return err } func (a *Adapter) open() { if a.driverName != "postgres" { if err := a.createDatabase(); err != nil { panic(err) } } engine, err := xorm.NewEngine(a.driverName, a.dataSourceName+a.dbName) if err != nil { panic(err) } a.Engine = engine } func (a *Adapter) close() { _ = a.Engine.Close() a.Engine = nil } func (a *Adapter) createTable() { err := a.Engine.Sync2(new(Organization)) if err != nil { panic(err) } err = a.Engine.Sync2(new(User)) if err != nil { panic(err) } err = a.Engine.Sync2(new(Provider)) if err != nil { panic(err) } err = a.Engine.Sync2(new(Application)) if err != nil { panic(err) } err = a.Engine.Sync2(new(Resource)) if err != nil { panic(err) } err = a.Engine.Sync2(new(Token)) if err != nil { panic(err) } err = a.Engine.Sync2(new(VerificationRecord)) if err != nil { panic(err) } err = a.Engine.Sync2(new(Record)) if err != nil { panic(err) } err = a.Engine.Sync2(new(Webhook)) if err != nil { panic(err) } err = a.Engine.Sync2(new(Syncer)) if err != nil { panic(err) } err = a.Engine.Sync2(new(Ldap)) if err != nil { panic(err) } }