From f451ed4a2425092e8f70a68181bcc580485a3d37 Mon Sep 17 00:00:00 2001 From: Alex Yatskov Date: Tue, 1 Sep 2015 16:52:19 +0900 Subject: [PATCH] Making search app more modular --- .gitignore | 1 + cmd/main.go | 70 ++++++++++++++++++++++++++++++++++++++++++ server.go => search.go | 66 ++++++++++++--------------------------- types.go | 2 +- util.go | 2 +- 5 files changed, 92 insertions(+), 49 deletions(-) create mode 100644 cmd/main.go rename server.go => search.go (88%) diff --git a/.gitignore b/.gitignore index 06d845c..3cf9946 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ search +cmd/cmd diff --git a/cmd/main.go b/cmd/main.go new file mode 100644 index 0000000..73013b6 --- /dev/null +++ b/cmd/main.go @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2015 Alex Yatskov + * Author: Alex Yatskov + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package main + +import ( + "flag" + "fmt" + "log" + "net/http" + "os" + "os/signal" + "runtime/pprof" + "syscall" + + "github.com/FooSoft/search" + + _ "github.com/mattn/go-sqlite3" +) + +func main() { + var ( + staticDir = flag.String("static", "../static", "static files path") + portNum = flag.Int("port", 8080, "port to serve content on") + dataSrc = flag.String("db", "../build/data/db.sqlite3", "database path") + profile = flag.String("profile", "", "write cpu profile to file") + ) + + flag.Parse() + + if *profile != "" { + f, err := os.Create(*profile) + if err != nil { + log.Fatal(err) + } + + pprof.StartCPUProfile(f) + + c := make(chan os.Signal, 1) + signal.Notify(c, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) + + go func() { + <-c + pprof.StopCPUProfile() + os.Exit(1) + }() + } + + mux := search.NewSearchApp(*staticDir, *dataSrc) + log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", *portNum), mux)) +} diff --git a/server.go b/search.go similarity index 88% rename from server.go rename to search.go index 0f5076b..a31e3a0 100644 --- a/server.go +++ b/search.go @@ -20,39 +20,28 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -package main +package search import ( "database/sql" "encoding/json" - "flag" "fmt" - "log" "math" "net/http" - "os" - "os/signal" - "runtime/pprof" "strings" "sync" - "syscall" "time" "github.com/GaryBoone/GoStats/stats" _ "github.com/mattn/go-sqlite3" ) -var ( - staticDir = flag.String("static", "static", "static files path") - portNum = flag.Int("port", 8080, "port to serve content on") - dataSrc = flag.String("db", "build/data/db.sqlite3", "database path") - profile = flag.String("profile", "", "write cpu profile to file") -) +var dataSrc string func handleExecuteQuery(rw http.ResponseWriter, req *http.Request) { startTime := time.Now() - db, err := sql.Open("sqlite3", *dataSrc) + db, err := sql.Open("sqlite3", dataSrc) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return @@ -167,7 +156,7 @@ func handleExecuteQuery(rw http.ResponseWriter, req *http.Request) { } func handleGetCategories(rw http.ResponseWriter, req *http.Request) { - db, err := sql.Open("sqlite3", *dataSrc) + db, err := sql.Open("sqlite3", dataSrc) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return @@ -217,7 +206,7 @@ func handleGetCategories(rw http.ResponseWriter, req *http.Request) { } func handleAddCategory(rw http.ResponseWriter, req *http.Request) { - db, err := sql.Open("sqlite3", *dataSrc) + db, err := sql.Open("sqlite3", dataSrc) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return @@ -277,7 +266,7 @@ func handleAddCategory(rw http.ResponseWriter, req *http.Request) { } func handleRemoveCategory(rw http.ResponseWriter, req *http.Request) { - db, err := sql.Open("sqlite3", *dataSrc) + db, err := sql.Open("sqlite3", dataSrc) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return @@ -314,7 +303,7 @@ func handleRemoveCategory(rw http.ResponseWriter, req *http.Request) { } func handleAccessReview(rw http.ResponseWriter, req *http.Request) { - db, err := sql.Open("sqlite3", *dataSrc) + db, err := sql.Open("sqlite3", dataSrc) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return @@ -381,7 +370,7 @@ func handleAccessReview(rw http.ResponseWriter, req *http.Request) { } func handleClearHistory(rw http.ResponseWriter, req *http.Request) { - db, err := sql.Open("sqlite3", *dataSrc) + db, err := sql.Open("sqlite3", dataSrc) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return @@ -402,34 +391,17 @@ func handleClearHistory(rw http.ResponseWriter, req *http.Request) { fmt.Fprint(rw, "History tables cleared") } -func main() { - flag.Parse() +func NewSearchApp(sd, ds string) *http.ServeMux { + dataSrc = ds - if *profile != "" { - f, err := os.Create(*profile) - if err != nil { - log.Fatal(err) - } + mux := http.NewServeMux() + mux.HandleFunc("/query", handleExecuteQuery) + mux.HandleFunc("/categories", handleGetCategories) + mux.HandleFunc("/learn", handleAddCategory) + mux.HandleFunc("/forget", handleRemoveCategory) + mux.HandleFunc("/access", handleAccessReview) + mux.HandleFunc("/clear", handleClearHistory) + mux.Handle("/", http.FileServer(http.Dir(sd))) - pprof.StartCPUProfile(f) - - c := make(chan os.Signal, 1) - signal.Notify(c, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) - - go func() { - <-c - pprof.StopCPUProfile() - os.Exit(1) - }() - } - - http.HandleFunc("/query", handleExecuteQuery) - http.HandleFunc("/categories", handleGetCategories) - http.HandleFunc("/learn", handleAddCategory) - http.HandleFunc("/forget", handleRemoveCategory) - http.HandleFunc("/access", handleAccessReview) - http.HandleFunc("/clear", handleClearHistory) - http.Handle("/", http.FileServer(http.Dir(*staticDir))) - - log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", *portNum), nil)) + return mux } diff --git a/types.go b/types.go index 8e9def0..6aa30c2 100644 --- a/types.go +++ b/types.go @@ -20,7 +20,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -package main +package search import ( "errors" diff --git a/util.go b/util.go index f38a6b4..f25be9e 100644 --- a/util.go +++ b/util.go @@ -20,7 +20,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -package main +package search import ( "database/sql"