|
@@ -0,0 +1,136 @@
|
|
|
+package global
|
|
|
+
|
|
|
+import (
|
|
|
+ "database/sql/driver"
|
|
|
+ _ "dm"
|
|
|
+ dm "dmgorm2"
|
|
|
+ "eta/eta_report/utils"
|
|
|
+ "fmt"
|
|
|
+ "gorm.io/driver/mysql"
|
|
|
+ "gorm.io/gorm"
|
|
|
+ "gorm.io/gorm/logger"
|
|
|
+ "gorm.io/gorm/schema"
|
|
|
+ "io"
|
|
|
+ "log"
|
|
|
+ "os"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+type LocalTime time.Time
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+func InitDb() {
|
|
|
+ dbMap := make(map[string]*gorm.DB)
|
|
|
+
|
|
|
+
|
|
|
+ logWriter := io.MultiWriter(utils.Binlog)
|
|
|
+ if utils.RunMode == `dev` {
|
|
|
+ logWriter = io.MultiWriter(utils.Binlog, os.Stdout)
|
|
|
+ }
|
|
|
+ newLogger := logger.New(log.New(logWriter, "\r\n", log.LstdFlags), logger.Config{
|
|
|
+ SlowThreshold: 200 * time.Millisecond,
|
|
|
+ LogLevel: logger.Info,
|
|
|
+ IgnoreRecordNotFoundError: true,
|
|
|
+ Colorful: false,
|
|
|
+ })
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ connectDb(utils.MYSQL_URL, utils.DbNameReport, newLogger, dbMap, true)
|
|
|
+
|
|
|
+
|
|
|
+ connectDb(utils.MYSQL_URL_ETA, utils.DbNameMaster, newLogger, dbMap, false)
|
|
|
+
|
|
|
+
|
|
|
+ if utils.MYSQL_WEEKLY_URL != `` && (utils.BusinessCode == utils.BusinessCodeRelease || utils.BusinessCode == utils.BusinessCodeSandbox) {
|
|
|
+ connectDb(utils.MYSQL_WEEKLY_URL, utils.DbNameWeekly, newLogger, dbMap, false)
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ DbMap = dbMap
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+func connectDb(dsn, aliasName string, newLogger logger.Interface, dbMap map[string]*gorm.DB, isDefault bool) {
|
|
|
+
|
|
|
+ if dsn == `` {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ var dialector gorm.Dialector
|
|
|
+ switch utils.DbDriverName {
|
|
|
+ case utils.DbDriverByMysql:
|
|
|
+ dialector = mysql.Open(dsn)
|
|
|
+ case utils.DbDriverByDm:
|
|
|
+ dialector = dm.Open(dsn)
|
|
|
+ default:
|
|
|
+ panic(fmt.Errorf("数据库 链接异常,错误的数据库类型,数据库:%s", utils.DbDriverName))
|
|
|
+ }
|
|
|
+ db, err := gorm.Open(dialector, &gorm.Config{
|
|
|
+ Logger: newLogger,
|
|
|
+ NamingStrategy: schema.NamingStrategy{
|
|
|
+ SingularTable: true,
|
|
|
+ },
|
|
|
+ })
|
|
|
+ if err != nil {
|
|
|
+
|
|
|
+ panic(fmt.Errorf("数据库 链接异常,数据库:%s;Err:%s", aliasName, err))
|
|
|
+ }
|
|
|
+
|
|
|
+ sqlDB, err := db.DB()
|
|
|
+ if err != nil {
|
|
|
+
|
|
|
+ panic(fmt.Errorf("数据库 创建连接池失败,数据库:%s;Err:%s", aliasName, err))
|
|
|
+ }
|
|
|
+
|
|
|
+ dbMap[aliasName] = db
|
|
|
+
|
|
|
+
|
|
|
+ if isDefault {
|
|
|
+ DEFAULT_DB = db
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ sqlDB.SetMaxIdleConns(50)
|
|
|
+
|
|
|
+
|
|
|
+ sqlDB.SetMaxOpenConns(100)
|
|
|
+
|
|
|
+
|
|
|
+ sqlDB.SetConnMaxLifetime(10 * time.Minute)
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+func (t *LocalTime) MarshalJSON() ([]byte, error) {
|
|
|
+ tTime := time.Time(*t)
|
|
|
+ if tTime.IsZero() {
|
|
|
+ return []byte("\"\""), nil
|
|
|
+ }
|
|
|
+ return []byte(fmt.Sprintf("\"%v\"", tTime.Format("2006-01-02 15:04:05"))), nil
|
|
|
+}
|
|
|
+
|
|
|
+func (t LocalTime) Value() (driver.Value, error) {
|
|
|
+ var zeroTime time.Time
|
|
|
+ tlt := time.Time(t)
|
|
|
+
|
|
|
+ if tlt.UnixNano() == zeroTime.UnixNano() {
|
|
|
+ return nil, nil
|
|
|
+ }
|
|
|
+ return tlt, nil
|
|
|
+}
|
|
|
+
|
|
|
+func (t *LocalTime) Scan(v interface{}) error {
|
|
|
+ if value, ok := v.(time.Time); ok {
|
|
|
+ *t = LocalTime(value)
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ return fmt.Errorf("can not convert %v to timestamp", v)
|
|
|
+}
|