diff --git a/codes.go b/codes.go index 990d27f..6f93fd6 100644 --- a/codes.go +++ b/codes.go @@ -23,10 +23,28 @@ func DialCodes(filename string, op ...client.Option) (*Codes, error) { if err != nil { return nil, err } - return NewCodes(c, filename) + return NewCodesSqlite(c, filename) } -func NewCodes(c *Client, filenames ...string) (*Codes, error) { +func NewCodesMysql(c *Client, dsn string) (*Codes, error) { + + //连接数据库 + db, err := xorm.NewEngine("mysql", dsn) + if err != nil { + return nil, err + } + db.SetMapper(core.SameMapper{}) + if err := db.Sync2(new(CodeModel)); err != nil { + return nil, err + } + if err := db.Sync2(new(UpdateModel)); err != nil { + return nil, err + } + + return NewCodes(c, db) +} + +func NewCodesSqlite(c *Client, filenames ...string) (*Codes, error) { //如果没有指定文件名,则使用默认 defaultFilename := filepath.Join(DefaultDatabaseDir, "codes.db") @@ -51,6 +69,11 @@ func NewCodes(c *Client, filenames ...string) (*Codes, error) { return nil, err } + return NewCodes(c, db) +} + +func NewCodes(c *Client, db *xorm.Engine) (*Codes, error) { + update := new(UpdateModel) { //查询或者插入一条数据 has, err := db.Get(update) @@ -72,7 +95,8 @@ func NewCodes(c *Client, filenames ...string) (*Codes, error) { task := cron.New(cron.WithSeconds()) task.AddFunc("10 0 9 * * *", func() { for i := 0; i < 3; i++ { - if err := cc.Update(); err == nil { + err := cc.Update() + if err == nil { return } logs.Err(err) @@ -103,6 +127,83 @@ func NewCodes(c *Client, filenames ...string) (*Codes, error) { return cc, cc.Update(true) } +//func NewCodes(c *Client, filenames ...string) (*Codes, error) { +// +// //如果没有指定文件名,则使用默认 +// defaultFilename := filepath.Join(DefaultDatabaseDir, "codes.db") +// filename := conv.Default(defaultFilename, filenames...) +// filename = conv.Select(filename == "", defaultFilename, filename) +// +// //如果文件夹不存在就创建 +// dir, _ := filepath.Split(filename) +// _ = os.MkdirAll(dir, 0777) +// +// //连接数据库 +// db, err := xorm.NewEngine("sqlite", filename) +// if err != nil { +// return nil, err +// } +// db.SetMapper(core.SameMapper{}) +// db.DB().SetMaxOpenConns(1) +// if err := db.Sync2(new(CodeModel)); err != nil { +// return nil, err +// } +// if err := db.Sync2(new(UpdateModel)); err != nil { +// return nil, err +// } +// +// update := new(UpdateModel) +// { //查询或者插入一条数据 +// has, err := db.Get(update) +// if err != nil { +// return nil, err +// } else if !has { +// if _, err := db.Insert(update); err != nil { +// return nil, err +// } +// } +// } +// +// cc := &Codes{ +// Client: c, +// db: db, +// } +// +// { //设置定时器,每天早上9点更新数据 +// task := cron.New(cron.WithSeconds()) +// task.AddFunc("10 0 9 * * *", func() { +// for i := 0; i < 3; i++ { +// if err := cc.Update(); err == nil { +// return +// } +// logs.Err(err) +// <-time.After(time.Minute * 5) +// } +// }) +// task.Start() +// } +// +// { //判断是否更新过,更新过则不更新 +// now := time.Now() +// node := time.Date(now.Year(), now.Month(), now.Day(), 9, 0, 0, 0, time.Local) +// updateTime := time.Unix(update.Time, 0) +// if now.Sub(node) > 0 { +// //当前时间在9点之后,且更新时间在9点之前,需要更新 +// if updateTime.Sub(node) < 0 { +// return cc, cc.Update() +// } +// } else { +// //当前时间在9点之前,且更新时间在上个节点之前 +// if updateTime.Sub(node.Add(time.Hour*24)) < 0 { +// return cc, cc.Update() +// } +// } +// } +// +// //从缓存中加载 +// return cc, cc.Update(true) +//} + type Codes struct { *Client //客户端 db *xorm.Engine //数据库实例 @@ -155,53 +256,8 @@ func (this *Codes) Get(code string) *CodeModel { return this.Map[code] } -//// GetExchange 获取股票交易所,这里的参数不需要带前缀 -//func (this *Codes) GetExchange(code string) protocol.Exchange { -// if len(code) == 6 { -// switch { -// case code[:1] == "6": -// return protocol.ExchangeSH -// case code[:1] == "0": -// return protocol.ExchangeSZ -// case code[:2] == "30": -// return protocol.ExchangeSZ -// } -// } -// var exchange string -// exchanges := this.exchanges[code] -// if len(exchanges) >= 1 { -// exchange = exchanges[0] -// } -// if len(code) == 8 { -// exchange = code[0:2] -// } -// switch exchange { -// case protocol.ExchangeSH.String(): -// return protocol.ExchangeSH -// case protocol.ExchangeSZ.String(): -// return protocol.ExchangeSZ -// default: -// return protocol.ExchangeSH -// } -//} - func (this *Codes) AddExchange(code string) string { return protocol.AddPrefix(code) - //if exchanges := this.exchanges[code]; len(exchanges) == 1 { - // return exchanges[0] + code - //} - //if len(code) == 6 { - // switch { - // case code[:1] == "6": - // return protocol.ExchangeSH.String() + code - // case code[:1] == "0": - // return protocol.ExchangeSZ.String() + code - // case code[:2] == "30": - // return protocol.ExchangeSZ.String() + code - // } - // return this.GetExchange(code).String() + code - //} - //return code } // Update 更新数据,从服务器或者数据库 diff --git a/example/GetQuote/main.go b/example/GetQuote/main.go index 4239189..a6fe6d3 100644 --- a/example/GetQuote/main.go +++ b/example/GetQuote/main.go @@ -10,7 +10,7 @@ func main() { c, err := tdx.Dial("124.71.187.122:7709", tdx.WithDebug()) logs.PanicErr(err) - tdx.DefaultCodes, err = tdx.NewCodes(c, "./codes.db") + tdx.DefaultCodes, err = tdx.NewCodesSqlite(c, "./codes.db") logs.PanicErr(err) _ = c diff --git a/example/WorkdayAndCodes/main.go b/example/WorkdayAndCodes/main.go index fd9adcd..44711df 100644 --- a/example/WorkdayAndCodes/main.go +++ b/example/WorkdayAndCodes/main.go @@ -9,10 +9,10 @@ import ( func main() { common.Test(func(c *tdx.Client) { - _, err := tdx.NewWorkday(c) //"./workday.db" + _, err := tdx.NewWorkdaySqlite(c) //"./workday.db" logs.PanicErr(err) - _, err = tdx.NewCodes(c) //"./codes.db" + _, err = tdx.NewCodesSqlite(c) //"./codes.db" logs.PanicErr(err) c.Close() diff --git a/manage.go b/manage.go index eb42458..19f974e 100644 --- a/manage.go +++ b/manage.go @@ -33,13 +33,13 @@ func NewManage(cfg *ManageConfig, op ...client.Option) (*Manage, error) { commonClient.Wait.SetTimeout(time.Second * 5) //代码管理 - codes, err := NewCodes(commonClient, cfg.CodesFilename) + codes, err := NewCodesSqlite(commonClient, cfg.CodesFilename) if err != nil { return nil, err } //工作日管理 - workday, err := NewWorkday(commonClient, cfg.WorkdayFileName) + workday, err := NewWorkdaySqlite(commonClient, cfg.WorkdayFileName) if err != nil { return nil, err } diff --git a/workday.go b/workday.go index 55031bb..17fb0f0 100644 --- a/workday.go +++ b/workday.go @@ -3,6 +3,7 @@ package tdx import ( "errors" _ "github.com/glebarez/go-sqlite" + _ "github.com/go-sql-driver/mysql" "github.com/injoyai/base/maps" "github.com/injoyai/conv" "github.com/injoyai/logs" @@ -15,7 +16,22 @@ import ( "xorm.io/xorm" ) -func NewWorkday(c *Client, filenames ...string) (*Workday, error) { +func NewWorkdayMysql(c *Client, dsn string) (*Workday, error) { + + //连接数据库 + db, err := xorm.NewEngine("mysql", dsn) + if err != nil { + return nil, err + } + db.SetMapper(core.SameMapper{}) + if err := db.Sync2(new(WorkdayModel)); err != nil { + return nil, err + } + + return NewWorkday(c, db) +} + +func NewWorkdaySqlite(c *Client, filenames ...string) (*Workday, error) { defaultFilename := filepath.Join(DefaultDatabaseDir, "workday.db") filename := conv.Default(defaultFilename, filenames...) @@ -35,17 +51,21 @@ func NewWorkday(c *Client, filenames ...string) (*Workday, error) { return nil, err } + return NewWorkday(c, db) +} + +func NewWorkday(c *Client, db *xorm.Engine) (*Workday, error) { w := &Workday{ Client: c, db: db, cache: maps.NewBit(), } - //设置定时器,每天早上9点更新数据,8点多获取不到今天的数据 task := cron.New(cron.WithSeconds()) task.AddFunc("0 0 9 * * *", func() { for i := 0; i < 3; i++ { - if err := w.Update(); err == nil { + err := w.Update() + if err == nil { return } logs.Err(err) @@ -53,10 +73,51 @@ func NewWorkday(c *Client, filenames ...string) (*Workday, error) { } }) task.Start() - return w, w.Update() } +//func NewWorkday(c *Client, filenames ...string) (*Workday, error) { +// +// defaultFilename := filepath.Join(DefaultDatabaseDir, "workday.db") +// filename := conv.Default(defaultFilename, filenames...) +// +// //如果文件夹不存在就创建 +// dir, _ := filepath.Split(filename) +// _ = os.MkdirAll(dir, 0777) +// +// //连接数据库 +// db, err := xorm.NewEngine("sqlite", filename) +// if err != nil { +// return nil, err +// } +// db.SetMapper(core.SameMapper{}) +// db.DB().SetMaxOpenConns(1) +// if err := db.Sync2(new(WorkdayModel)); err != nil { +// return nil, err +// } +// +// w := &Workday{ +// Client: c, +// db: db, +// cache: maps.NewBit(), +// } +// +// //设置定时器,每天早上9点更新数据,8点多获取不到今天的数据 +// task := cron.New(cron.WithSeconds()) +// task.AddFunc("0 0 9 * * *", func() { +// for i := 0; i < 3; i++ { +// if err := w.Update(); err == nil { +// return +// } +// logs.Err(err) +// <-time.After(time.Minute * 5) +// } +// }) +// task.Start() +// +// return w, w.Update() +//} + type Workday struct { *Client db *xorm.Engine