package dao import ( "context" "fmt" "math/big" "sdk_api/config" dbModel "sdk_api/model/db" "time" "github.com/ethereum/go-ethereum/ethclient" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/schema" ) type Dao struct { c *config.Config db *gorm.DB ethClient *ethclient.Client chainId *big.Int } func New(_c *config.Config) (dao *Dao, err error) { dao = &Dao{ c: _c, } dao.ethClient, err = ethclient.Dial(_c.Chain.RPC) if err != nil { return } dao.chainId, err = dao.ethClient.ChainID(context.Background()) if err != nil { panic(fmt.Sprintf("failed to get l1 chain id %+v", err)) } dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True", _c.MySQL.User, _c.MySQL.Password, _c.MySQL.Host, _c.MySQL.Port, _c.MySQL.Database) dao.db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{ NamingStrategy: schema.NamingStrategy{ SingularTable: true, }, Logger: logger.Default.LogMode(logger.Silent), }) if err != nil { return } sqlDB, err := dao.db.DB() if err != nil { return } sqlDB.SetMaxOpenConns(_c.MySQL.MaxConn) sqlDB.SetMaxIdleConns(_c.MySQL.MaxIdleConn) sqlDB.SetConnMaxIdleTime(time.Hour) err = dao.db.AutoMigrate(&dbModel.User{}, &dbModel.Task{}) if err != nil { return } return dao, nil }