예제 #1
0
func (location *LocationInfo) NewLocation() error {
	session := common.MongoGet()
	defer common.MongoPut(session)

	c := session.DB("du").C("location")

	index := mgo.Index{
		Key:        []string{"$2d:loc"},
		Bits:       26,
		Background: true,
	}
	if err := c.EnsureIndex(index); err != nil {
		return errors.As(err, index)
	}

	newLoc := bson.M{
		"uid":      location.Uid,
		"loc":      location.Loc,
		"sendtime": location.SendTime,
	}

	if err := c.Insert(newLoc); err != nil {
		return errors.As(err, newLoc)
	}

	return nil
}
예제 #2
0
func (location *LocationInfo) SaveLocation() error {
	session := common.MongoGet()
	defer common.MongoPut(session)

	c := session.DB("du").C("location")

	selector := bson.M{"uid": location.Uid}
	newLoc := bson.M{"uid": location.Uid, "loc": location.Loc, "sendtime": location.SendTime}
	update := bson.M{"$set": newLoc}
	syslog.Debug("selector: ", selector, " update: ", update)
	if err := c.Update(selector, update); err != nil {
		return errors.As(err, *location)
	}

	return nil
}
예제 #3
0
func (location *LocationInfo) GetLocation(level uint16, hour uint32, page uint16) []LocResult {
	if level != 1 {
		syslog.Error("level ", level, " not completed.")
		return nil
	}

	session := common.MongoGet()
	defer common.MongoPut(session)

	c := session.DB("du").C("location")

	selector := bson.M{"loc": bson.M{"$near": location.Loc}}
	syslog.Debug("selector: ", selector)
	iter := c.Find(selector).Limit(MAX_ROW*LOCAL_MAX_PAGE + 1).Iter()
	result := LocationInfo{}

	retLoc := make([]LocResult, MAX_ROW*30)
	line := 0

	retLoc[line].Uid = location.Uid
	retLoc[line].Xpos = float64(int64(location.Loc[0]*1000000)) / 1000000
	retLoc[line].Ypos = float64(int64(location.Loc[1]*1000000)) / 1000000
	syslog.Debug(retLoc[line].Xpos, retLoc[line].Ypos)
	line++

	for iter.Next(&result) && line < MAX_ROW*30 {
		if result.Uid == location.Uid {
			continue
		}

		syslog.Debug("Uid: ", result.Uid, " Loc: ", result.Loc, " send time: ", result.SendTime, "line:", line)

		retLoc[line].Uid = result.Uid
		retLoc[line].Xpos = float64(int64(result.Loc[0]*1000000)) / 1000000
		retLoc[line].Ypos = float64(int64(result.Loc[1]*1000000)) / 1000000
		//retlocl[line].Xpos = result.Loc[0]
		//retlocl[line].Ypos = result.Loc[1]

		line++
	}

	return retLoc[:line]
}
예제 #4
0
func (location *LocationInfo) GetLocationInfo() error {
	session := common.MongoGet()
	defer common.MongoPut(session)

	c := session.DB("du").C("location")

	selector := bson.M{"uid": location.Uid}

	iter := c.Find(selector).Iter()

	for iter.Next(&location) {
		syslog.Info("Uid: ", location.Uid, " AppKey: ", " Loc: ", location.Loc, " send time: ", location.SendTime)
	}

	if err := iter.Close(); err != nil {
		return errors.As(err, *location)
	}

	return nil
}