// CreateSession creates a connection pool for use func CreateSession(sessionId string, mode string, sessionName string, hosts []string, databaseName string, username string, password string) (err error) { defer helper.CatchPanic(nil, sessionId, "CreateSession") tracelog.STARTEDf(sessionId, "CreateSession", "Mode[%s] SessionName[%s] Hosts[%s] DatabaseName[%s] Username[%s]", mode, sessionName, hosts, databaseName, username) // Create the database object mongoSession := &mongoSession{ mongoDBDialInfo: &mgo.DialInfo{ Addrs: hosts, Timeout: 60 * time.Second, Database: databaseName, Username: username, Password: password, }, } // Establish the master session mongoSession.mongoSession, err = mgo.DialWithInfo(mongoSession.mongoDBDialInfo) if err != nil { tracelog.COMPLETED_ERROR(err, sessionId, "CreateSession") return err } switch mode { case "strong": // Reads and writes will always be made to the master server using a // unique connection so that reads and writes are fully consistent, // ordered, and observing the most up-to-date data. // http://godoc.org/labix.org/v2/mgo#Session.SetMode mongoSession.mongoSession.SetMode(mgo.Strong, true) break case "monotonic": // Reads may not be entirely up-to-date, but they will always see the // history of changes moving forward, the data read will be consistent // across sequential queries in the same session, and modifications made // within the session will be observed in following queries (read-your-writes). // http://godoc.org/labix.org/v2/mgo#Session.SetMode mongoSession.mongoSession.SetMode(mgo.Monotonic, true) } // Have the session check for errors // http://godoc.org/labix.org/v2/mgo#Session.SetSafe mongoSession.mongoSession.SetSafe(&mgo.Safe{}) // Add the database to the map _This.sessions[sessionName] = mongoSession tracelog.COMPLETED(sessionId, "CreateSession") return err }
// Execute the MongoDB literal function func Execute(sessionId string, mongoSession *mgo.Session, databaseName string, collectionName string, mongoCall MongoCall) (err error) { tracelog.STARTEDf(sessionId, "Execute", "Database[%s] Collection[%s]", databaseName, collectionName) // Capture the specified collection collection, err := GetCollection(mongoSession, databaseName, collectionName) if err != nil { tracelog.COMPLETED_ERROR(err, sessionId, "Execute") return err } // Execute the mongo call err = mongoCall(collection) if err != nil { tracelog.COMPLETED_ERROR(err, sessionId, "Execute") return err } tracelog.COMPLETED(sessionId, "Execute") return err }
// initApp contains all application level initialization func initApp() { // Capture the global email settings tracelog.EmailHost = revel.Config.StringDefault("email.host", "") tracelog.EmailPort = revel.Config.IntDefault("email.port", 0) tracelog.EmailUserName = revel.Config.StringDefault("email.username", "") tracelog.EmailPassword = revel.Config.StringDefault("email.password", "") tracelog.EmailTo = revel.Config.StringDefault("email.to", "") tracelog.EmailAlertSubject = revel.Config.StringDefault("email.alert_subject", "") // MongoDB Settings helper.MONGO_DATABASE = revel.Config.StringDefault("mgo.use_database", "") // Init mongo err := mongo.Startup(helper.MAIN_GO_ROUTINE) if err != nil { tracelog.COMPLETED_ERROR(err, helper.MAIN_GO_ROUTINE, "initApp") os.Exit(1) } }
// CopySession makes a clone of the specified session for client use func CloneSession(sessionId string, useSession string) (mongoSession *mgo.Session, err error) { defer helper.CatchPanic(nil, sessionId, "CopySession") tracelog.STARTEDf(sessionId, "CloneSession", "UseSession[%s]", useSession) // Find the session object session := _This.sessions[useSession] if session == nil { err = fmt.Errorf("Unable To Locate Session %s", useSession) tracelog.COMPLETED_ERROR(err, sessionId, "CloneSession") return mongoSession, err } // Clone the master session mongoSession = session.mongoSession.Clone() tracelog.COMPLETED(sessionId, "CloneSession") return mongoSession, err }
// FindRegion retrieves the stations for the specified region func FindRegion(service *services.Service, region string) (buoyStations []*buoyModel.BuoyStation, err error) { defer helper.CatchPanic(&err, service.UserId, "FindRegion") tracelog.STARTED(service.UserId, "FindRegion") // Find the specified region queryMap := bson.M{"region": region} tracelog.TRACE(helper.MAIN_GO_ROUTINE, "FindRegion", "Query : %s", mongo.ToString(queryMap)) // Capture the specified buoy buoyStations = []*buoyModel.BuoyStation{} err = service.DBAction("buoy_stations", func(collection *mgo.Collection) error { return collection.Find(queryMap).All(&buoyStations) }) if err != nil { tracelog.COMPLETED_ERROR(err, helper.MAIN_GO_ROUTINE, "FindRegion") return buoyStations, err } tracelog.COMPLETED(service.UserId, "FindRegion") return buoyStations, err }
// FindStation retrieves the specified station func FindStation(service *services.Service, stationId string) (buoyStation *buoyModel.BuoyStation, err error) { defer helper.CatchPanic(&err, service.UserId, "FindStation") tracelog.STARTED(service.UserId, "FindStation") // Find the specified station id queryMap := bson.M{"station_id": stationId} tracelog.TRACE(helper.MAIN_GO_ROUTINE, "FindStation", "Query : %s", mongo.ToString(queryMap)) // Execute the query buoyStation = &buoyModel.BuoyStation{} err = service.DBAction("buoy_stations", func(collection *mgo.Collection) error { return collection.Find(queryMap).One(buoyStation) }) if err != nil { tracelog.COMPLETED_ERROR(err, helper.MAIN_GO_ROUTINE, "FindStation") return buoyStation, err } tracelog.COMPLETED(service.UserId, "FindStation") return buoyStation, err }