// 载入保存过的Raw60 func loadSavedRaw60() error { // 连接数据库 session, err := db.Get() if err != nil { return fmt.Errorf("[DB]\t获取数据库连接失败:%s", err.Error()) } defer session.Close() // 获取所有Raw var raws []Raw60 err = session.DB("stock").C("Raw60").Find(nil).Select(bson.M{"market": 1, "code": 1, "date": 1}).All(&raws) if err != nil { return fmt.Errorf("[DB]\t获取Raw60失败:%s", err.Error()) } saveQueue = make(chan Raw60) dict = make(map[string]bool) for _, raw := range raws { addDict(raw) } log.Printf("[DB]\t数据库中已经保存了%d条Raw60记录", len(raws)) // 保存协程 go saveRaw60() return nil }
// 保存上市公司列表到文件 func (l CompanyList) Save(market Market) error { // 连接数据库 session, err := db.Get() if err != nil { return fmt.Errorf("[DB]\t获取数据库连接失败:%s", err.Error()) } defer session.Close() companies := ([]Company)(l) list := make([]interface{}, 0) for _, company := range companies { list = append(list, company) } collection := session.DB("stock").C("Company") // 删除原有记录 _, err = collection.RemoveAll(bson.M{"market": market.Name()}) if err != nil { return fmt.Errorf("[DB]\t删除原有上市公司发生错误: %s", err.Error()) } return collection.Insert(list...) }
// 以队列的方式保存到数据库 func saveRaw60() { session, err := db.Get() if err != nil { log.Printf("[DB]\t获取数据库连接失败:%s", err.Error()) return } defer session.Close() collection := session.DB("stock").C("Raw60") for { raw := <-saveQueue // 所有新增的记录都是未处理状态 raw.Status = 0 rawlist := make([]interface{}, 0) rawlist = append(rawlist, raw) // 如果队列长度超过1,就批量新增 queueLength := len(saveQueue) if queueLength > 0 { // 读取队列 for index := 0; index < queueLength; index++ { raw := <-saveQueue // 所有新增的记录都是未处理状态 raw.Status = 0 rawlist = append(rawlist, raw) } } var err error for times := retryTimes - 1; times >= 0; times-- { // 保存到数据库 err = collection.Insert(rawlist...) if err == nil { break } if times > 0 { // 延时 time.Sleep(time.Duration(retryIntervalSeconds) * time.Second) } } if err != nil { log.Printf("[DB]\t保存[%s %s %s]出错,已经重试%d次,不再重试:%s", raw.Market, raw.Code, raw.Date.Format("2006-01-02 15:04:05"), retryTimes, err.Error()) } else { for _, ri := range rawlist { addDict(ri.(Raw60)) } } } }
// 从存档读取上市公司列表 func (l *CompanyList) Load(market Market) error { // 连接数据库 session, err := db.Get() if err != nil { return fmt.Errorf("[DB]\t获取数据库连接失败:%s", err.Error()) } defer session.Close() var companies []Company err = session.DB("stock").C("Company").Find(bson.M{"market": market.Name()}).Sort("code").All(&companies) if err != nil { return fmt.Errorf("[DB]\t查询上市公司发生错误: %s", err.Error()) } cl := CompanyList(companies) l = &cl return nil }