|
@@ -8,7 +8,6 @@ import (
|
|
|
"log"
|
|
|
"math/rand"
|
|
|
"net/http"
|
|
|
- "runtime"
|
|
|
"sort"
|
|
|
"strconv"
|
|
|
)
|
|
@@ -20,7 +19,8 @@ const (
|
|
|
)
|
|
|
|
|
|
var (
|
|
|
- tmpl = template.Must(template.ParseFiles("templates/layout.html", "templates/fortune.html"))
|
|
|
+ tmpl = template.Must(template.ParseFiles("templates/layout.html", "templates/fortune.html"))
|
|
|
+ helloWorldBytes = []byte(helloWorldString)
|
|
|
|
|
|
database *mgo.Database
|
|
|
fortunes *mgo.Collection
|
|
@@ -32,12 +32,12 @@ type Message struct {
|
|
|
}
|
|
|
|
|
|
type World struct {
|
|
|
- Id uint16 `bson:"id" json:"id"`
|
|
|
+ Id uint16 `bson:"_id" json:"id"`
|
|
|
RandomNumber uint16 `bson:"randomNumber" json:"randomNumber"`
|
|
|
}
|
|
|
|
|
|
type Fortune struct {
|
|
|
- Id uint16 `bson:"id" json:"id"`
|
|
|
+ Id uint16 `bson:"_id" json:"id"`
|
|
|
Message string `bson:"message" json:"message"`
|
|
|
}
|
|
|
|
|
@@ -58,28 +58,21 @@ func (s ByMessage) Less(i, j int) bool {
|
|
|
}
|
|
|
|
|
|
func main() {
|
|
|
- runtime.GOMAXPROCS(runtime.NumCPU())
|
|
|
- if session, err := mgo.Dial(connectionString); err != nil {
|
|
|
+ session, err := mgo.Dial(connectionString)
|
|
|
+ if err != nil {
|
|
|
log.Fatalf("Error opening database: %v", err)
|
|
|
- } else {
|
|
|
- defer session.Close()
|
|
|
- session.SetPoolLimit(5)
|
|
|
- database = session.DB("hello_world")
|
|
|
- worlds = database.C("world")
|
|
|
- fortunes = database.C("fortune")
|
|
|
- http.HandleFunc("/json", jsonHandler)
|
|
|
- http.HandleFunc("/db", dbHandler)
|
|
|
- http.HandleFunc("/fortune", fortuneHandler)
|
|
|
- http.HandleFunc("/queries", queriesHandler)
|
|
|
- http.HandleFunc("/update", updateHandler)
|
|
|
- http.HandleFunc("/plaintext", plaintextHandler)
|
|
|
- http.ListenAndServe(":8080", nil)
|
|
|
}
|
|
|
-}
|
|
|
-
|
|
|
-// Helper for random numbers
|
|
|
-func getRandomNumber() uint16 {
|
|
|
- return uint16(rand.Intn(worldRowCount) + 1)
|
|
|
+ defer session.Close()
|
|
|
+ database = session.DB("hello_world")
|
|
|
+ worlds = database.C("world")
|
|
|
+ fortunes = database.C("fortune")
|
|
|
+ http.HandleFunc("/json", jsonHandler)
|
|
|
+ http.HandleFunc("/db", dbHandler)
|
|
|
+ http.HandleFunc("/fortune", fortuneHandler)
|
|
|
+ http.HandleFunc("/queries", queriesHandler)
|
|
|
+ http.HandleFunc("/update", updateHandler)
|
|
|
+ http.HandleFunc("/plaintext", plaintextHandler)
|
|
|
+ http.ListenAndServe(":8080", nil)
|
|
|
}
|
|
|
|
|
|
// Test 1: JSON serialization
|
|
@@ -89,117 +82,97 @@ func jsonHandler(w http.ResponseWriter, r *http.Request) {
|
|
|
json.NewEncoder(w).Encode(&Message{helloWorldString})
|
|
|
}
|
|
|
|
|
|
+// Helper for random numbers
|
|
|
+func getRandomNumber() uint16 {
|
|
|
+ return uint16(rand.Intn(worldRowCount) + 1)
|
|
|
+}
|
|
|
+
|
|
|
+// Test 2: Single database query
|
|
|
func dbHandler(w http.ResponseWriter, r *http.Request) {
|
|
|
var world World
|
|
|
- query := bson.M{"id": getRandomNumber()}
|
|
|
- if worlds != nil {
|
|
|
- if err := worlds.Find(query).One(&world); err != nil {
|
|
|
- log.Fatalf("Error finding world with id: %s", err.Error())
|
|
|
- return
|
|
|
- } else {
|
|
|
- w.Header().Set("Content-Type", "application/json")
|
|
|
- w.Header().Set("Server", "go-mongodb")
|
|
|
- json.NewEncoder(w).Encode(&world)
|
|
|
- return
|
|
|
- }
|
|
|
- } else {
|
|
|
- log.Fatal("Collection not initialized properly")
|
|
|
+ query := bson.M{"_id": getRandomNumber()}
|
|
|
+ if err := worlds.Find(query).One(&world); err != nil {
|
|
|
+ log.Fatalf("Error finding world with id: %s", err.Error())
|
|
|
}
|
|
|
+ w.Header().Set("Content-Type", "application/json")
|
|
|
+ w.Header().Set("Server", "go-mongodb")
|
|
|
+ json.NewEncoder(w).Encode(&world)
|
|
|
}
|
|
|
|
|
|
-func queriesHandler(w http.ResponseWriter, r *http.Request) {
|
|
|
+// Helper for getting the "queries" parameter
|
|
|
+func getQueriesParam(r *http.Request) int {
|
|
|
n := 1
|
|
|
if nStr := r.URL.Query().Get("queries"); len(nStr) > 0 {
|
|
|
n, _ = strconv.Atoi(nStr)
|
|
|
}
|
|
|
|
|
|
- if n > 500 {
|
|
|
+ if n < 1 {
|
|
|
+ n = 1
|
|
|
+ } else if n > 500 {
|
|
|
n = 500
|
|
|
}
|
|
|
|
|
|
- w.Header().Set("Content-Type", "application/json")
|
|
|
- w.Header().Set("Server", "go-mongodb")
|
|
|
- encoder := json.NewEncoder(w)
|
|
|
+ return n
|
|
|
+}
|
|
|
+
|
|
|
+// Test 3: Multiple database queries
|
|
|
+func queriesHandler(w http.ResponseWriter, r *http.Request) {
|
|
|
+ n := getQueriesParam(r)
|
|
|
+ world := make([]World, n)
|
|
|
|
|
|
- if n <= 1 {
|
|
|
- result := make([]World, 1)
|
|
|
- query := bson.M{"id": getRandomNumber()}
|
|
|
- if err := worlds.Find(query).One(&result[0]); err != nil {
|
|
|
+ for i := 0; i < n; i++ {
|
|
|
+ query := bson.M{"_id": getRandomNumber()}
|
|
|
+ if err := worlds.Find(query).One(&world[i]); err != nil {
|
|
|
log.Fatalf("Error finding world with id: %s", err.Error())
|
|
|
- return
|
|
|
}
|
|
|
- encoder.Encode(&result)
|
|
|
- } else {
|
|
|
- result := make([]World, n)
|
|
|
- for i := 0; i < n; i++ {
|
|
|
- query := bson.M{"id": getRandomNumber()}
|
|
|
- if err := worlds.Find(query).One(&result[i]); err != nil {
|
|
|
- log.Fatalf("Error finding world with id: %s", err.Error())
|
|
|
- return
|
|
|
- }
|
|
|
- }
|
|
|
- encoder.Encode(&result)
|
|
|
}
|
|
|
+
|
|
|
+ w.Header().Set("Content-Type", "application/json")
|
|
|
+ w.Header().Set("Server", "go-mongodb")
|
|
|
+ json.NewEncoder(w).Encode(world)
|
|
|
}
|
|
|
|
|
|
+// Test 4: Fortunes
|
|
|
func fortuneHandler(w http.ResponseWriter, r *http.Request) {
|
|
|
- w.Header().Set("Content-Type", "text/html")
|
|
|
+ w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
|
|
w.Header().Set("Server", "go-mongodb")
|
|
|
f := make(Fortunes, 16)
|
|
|
if err := fortunes.Find(nil).All(&f); err == nil {
|
|
|
- f = append(f, Fortune{
|
|
|
- Message: "Additional fortune added at request time.",
|
|
|
- })
|
|
|
+ f = append(f, Fortune{Message: "Additional fortune added at request time."})
|
|
|
sort.Sort(ByMessage{f})
|
|
|
if err := tmpl.Execute(w, f); err != nil {
|
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
|
}
|
|
|
+ } else {
|
|
|
+ http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
+// Test 5: Database updates
|
|
|
func updateHandler(w http.ResponseWriter, r *http.Request) {
|
|
|
- n := 1
|
|
|
- if nStr := r.URL.Query().Get("queries"); len(nStr) > 0 {
|
|
|
- n, _ = strconv.Atoi(nStr)
|
|
|
- }
|
|
|
+ n := getQueriesParam(r)
|
|
|
+ world := make([]World, n)
|
|
|
|
|
|
- w.Header().Set("Content-Type", "application/json")
|
|
|
- w.Header().Set("Server", "go-mongodb")
|
|
|
- encoder := json.NewEncoder(w)
|
|
|
-
|
|
|
- if n <= 1 {
|
|
|
- result := make([]World, 1)
|
|
|
- colQuery := bson.M{"id": getRandomNumber()}
|
|
|
- update := bson.M{"$set": bson.M{"randomNumber": getRandomNumber()}}
|
|
|
- if err := worlds.Update(colQuery, update); err != nil {
|
|
|
- log.Fatalf("Error updating world with id: %s", err.Error())
|
|
|
- } else {
|
|
|
- result[0].Id = colQuery["id"].(uint16)
|
|
|
- result[0].RandomNumber = update["$set"].(bson.M)["randomNumber"].(uint16)
|
|
|
- }
|
|
|
- encoder.Encode(&result)
|
|
|
- } else {
|
|
|
- if n > 500 {
|
|
|
- n = 500
|
|
|
+ for i := 0; i < n; i++ {
|
|
|
+ query := bson.M{"_id": getRandomNumber()}
|
|
|
+ if err := worlds.Find(query).One(&world[i]); err != nil {
|
|
|
+ log.Fatalf("Error finding world with id: %s", err.Error())
|
|
|
}
|
|
|
- result := make([]World, n)
|
|
|
- for i := 0; i < n; i++ {
|
|
|
- colQuery := bson.M{"id": getRandomNumber()}
|
|
|
- update := bson.M{"$set": bson.M{"randomNumber": getRandomNumber()}}
|
|
|
- if err := worlds.Update(colQuery, update); err != nil {
|
|
|
- log.Fatalf("Error updating world with id: %s", err.Error())
|
|
|
- } else {
|
|
|
- result[i].Id = colQuery["id"].(uint16)
|
|
|
- result[i].RandomNumber = update["$set"].(bson.M)["randomNumber"].(uint16)
|
|
|
- }
|
|
|
+ world[i].RandomNumber = getRandomNumber()
|
|
|
+ update := bson.M{"$set": bson.M{"randomNumber": world[i].RandomNumber}}
|
|
|
+ if err := worlds.Update(query, update); err != nil {
|
|
|
+ log.Fatalf("Error updating world with id: %s", err.Error())
|
|
|
}
|
|
|
- encoder.Encode(&result)
|
|
|
}
|
|
|
+
|
|
|
+ w.Header().Set("Content-Type", "application/json")
|
|
|
+ w.Header().Set("Server", "Go")
|
|
|
+ json.NewEncoder(w).Encode(&world)
|
|
|
}
|
|
|
|
|
|
+// Test 6: Plaintext
|
|
|
func plaintextHandler(w http.ResponseWriter, r *http.Request) {
|
|
|
w.Header().Set("Content-Type", "text/plain")
|
|
|
w.Header().Set("Server", "go-mongodb")
|
|
|
- w.Write([]byte(helloWorldString))
|
|
|
+ w.Write(helloWorldBytes)
|
|
|
}
|