func SaveSettings(service *services.Service, settings settingsModel.WinSettings) (*settingsModel.WinSettings, error) {
	log.Startedf(service.UserID, "SaveSettings", "UserID[%s]", settings.UserID)
	f := func(collection *mgo.Collection) error {

		if len(settings.ID) > 0 {
			log.Trace(service.UserID, "SaveSettings", "MGO : db.win_settings.update(%s)", mongo.ToString(settings))
			return collection.Update(bson.M{"_id": settings.ID}, &settings)
		} else {
			log.Trace(service.UserID, "SaveSettings", "MGO : db.win_settings.insert(%s)", mongo.ToString(settings))
			return collection.Insert(&settings)
		}

	}
	if err := service.DBAction(Config.Database, "win_settings", f); err != nil {
		if err != mgo.ErrNotFound {
			log.CompletedError(err, service.UserID, "SaveSettings")
			return nil, err
		}
	}
	log.Completedf(service.UserID, "SaveSettings", "settings%+v", &settings)
	return &settings, nil
}
func UserLogup(service *services.Service, userInfo userModel.UserInfo) (*userModel.UserInfo, error) {
	log.Startedf(service.UserID, "UserLogup", "user[%s]", userInfo.UserName)
	f := func(collection *mgo.Collection) error {
		log.Trace(service.UserID, "UserLogup", "MGO : db.user_infos.insert(%s)", mongo.ToString(userInfo))
		return collection.Insert(&userInfo)
	}
	if err := service.DBAction(Config.Database, "user_infos", f); err != nil {
		if err != mgo.ErrNotFound {
			log.CompletedError(err, service.UserID, "UserLogup")
			return nil, err
		}
	}
	log.Completedf(service.UserID, "UserLogup", "userInfo%+v", &userInfo)
	return &userInfo, nil
}
func SaveFile(service *services.Service, fileInfo fileModels.FileInfo) (*fileModels.FileInfo, error) {
	log.Startedf(service.UserID, "SaveFile", "FileHash[%s]", fileInfo.FileHash)

	f := func(collection *mgo.Collection) error {
		log.Trace(service.UserID, "SaveFile", "MGO : db.file_infos.insert(%s)", mongo.ToString(fileInfo))
		return collection.Insert(&fileInfo)
	}
	if err := service.DBAction(Config.Database, "file_infos", f); err != nil {
		if err != mgo.ErrNotFound {
			log.CompletedError(err, service.UserID, "SaveFile")
			return nil, err
		}
	}

	log.Completedf(service.UserID, "SaveFile", "fileInfo%+v", &fileInfo)
	return &fileInfo, nil
}
// FindRegion retrieves the stations for the specified region
func FindRegion(service *services.Service, region string) ([]buoyModels.BuoyStation, error) {
	log.Startedf(service.UserID, "FindRegion", "region[%s]", region)

	var buoyStations []buoyModels.BuoyStation
	f := func(collection *mgo.Collection) error {
		queryMap := bson.M{"region": region}

		log.Trace(service.UserID, "FindRegion", "Query : db.buoy_stations.find(%s)", mongo.ToString(queryMap))
		return collection.Find(queryMap).All(&buoyStations)
	}

	if err := service.DBAction(Config.Database, "buoy_stations", f); err != nil {
		log.CompletedError(err, service.UserID, "FindRegion")
		return nil, err
	}

	log.Completedf(service.UserID, "FindRegion", "buoyStations%+v", buoyStations)
	return buoyStations, nil
}
func FindUserById(service *services.Service, userID string) (*userModel.UserInfo, error) {
	log.Startedf(service.UserID, "FindUser", "userID[%s]", userID)
	var userInfo userModel.UserInfo
	f := func(collection *mgo.Collection) error {
		queryMap := bson.M{"_id": userID}

		log.Trace(service.UserID, "FindUser", "MGO : db.user_infos.find(%s).limit(1)", mongo.ToString(queryMap))
		return collection.Find(queryMap).One(&userInfo)
	}

	if err := service.DBAction(Config.Database, "user_infos", f); err != nil {
		if err != mgo.ErrNotFound {
			log.CompletedError(err, service.UserID, "FindUser")
			return nil, err
		}
	}

	log.Completedf(service.UserID, "FindUser", "userInfo%+v", &userInfo)
	return &userInfo, nil
}
func UserLogin(service *services.Service, firstPara string, userPwd string) (*userModel.UserInfo, error) {
	log.Startedf(service.UserID, "UserLogin", "user[%s]", firstPara)
	var userInfo userModel.UserInfo
	f := func(collection *mgo.Collection) error {
		queryMap := bson.M{
			"$or": []bson.M{
				bson.M{"user_name": firstPara},
				bson.M{"user_email": firstPara},
				bson.M{"user_mobile": firstPara},
			},
			"user_pwd": userPwd,
		}
		log.Trace(service.UserID, "UserLogin", "MGO : db.user_infos.find(%s).limit(1)", mongo.ToString(queryMap))
		return collection.Find(queryMap).One(&userInfo)
	}
	if err := service.DBAction(Config.Database, "user_infos", f); err != nil {
		if err != mgo.ErrNotFound {
			log.CompletedError(err, service.UserID, "UserLogin")
			return nil, err
		}
	}
	log.Completedf(service.UserID, "UserLogin", "userInfo%+v", &userInfo)
	return &userInfo, nil
}
func FindFilesByHash(service *services.Service, hash string) (*fileModels.FileInfo, error) {
	var fileInfo fileModels.FileInfo

	f := func(collection *mgo.Collection) error {
		queryMap := bson.M{"file_hash": hash}

		log.Trace(service.UserID, "findFilesByHash", "MGO : db.file_infos.find(%s).limit(1)", mongo.ToString(queryMap))
		return collection.Find(queryMap).One(&fileInfo)
	}

	if err := service.DBAction(Config.Database, "file_infos", f); err != nil {
		if err != mgo.ErrNotFound {
			log.CompletedError(err, service.UserID, "findFilesByHash")
			return nil, err
		}
	}

	log.Completedf(service.UserID, "findFilesByHash", "fileInfo%+v", &fileInfo)
	return &fileInfo, nil

}
func FindSettings(service *services.Service, userID string) (*settingsModel.WinSettings, error) {
	log.Startedf(service.UserID, "FindSettings", "userID[%s]", userID)

	var winSettings settingsModel.WinSettings
	f := func(collection *mgo.Collection) error {
		queryMap := bson.M{"user_id": userID}

		log.Trace(service.UserID, "FindSettings", "MGO : db.win_settings.find(%s).limit(1)", mongo.ToString(queryMap))
		return collection.Find(queryMap).One(&winSettings)
	}

	if err := service.DBAction(Config.Database, "win_settings", f); err != nil {
		if err != mgo.ErrNotFound {
			log.CompletedError(err, service.UserID, "FindSettings")
			return nil, err
		}
	}

	log.Completedf(service.UserID, "FindSettings", "winSettings%+v", &winSettings)
	return &winSettings, nil
}
// FindStation retrieves the specified station
func FindStation(service *services.Service, stationID string) (*buoyModels.BuoyStation, error) {
	log.Startedf(service.UserID, "FindStation", "stationID[%s]", stationID)

	var buoyStation buoyModels.BuoyStation
	f := func(collection *mgo.Collection) error {
		queryMap := bson.M{"station_id": stationID}

		log.Trace(service.UserID, "FindStation", "MGO : db.buoy_stations.find(%s).limit(1)", mongo.ToString(queryMap))
		return collection.Find(queryMap).One(&buoyStation)
	}

	if err := service.DBAction(Config.Database, "buoy_stations", f); err != nil {
		if err != mgo.ErrNotFound {
			log.CompletedError(err, service.UserID, "FindStation")
			return nil, err
		}
	}

	log.Completedf(service.UserID, "FindStation", "buoyStation%+v", &buoyStation)
	return &buoyStation, nil
}