Beispiel #1
0
//	载入保存过的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
}
Beispiel #2
0
//	保存上市公司列表到文件
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...)
}
Beispiel #3
0
//	以队列的方式保存到数据库
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))
			}
		}
	}
}
Beispiel #4
0
//	从存档读取上市公司列表
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
}