From 5732f06932da5c03a17a26b3cf864b54d2cae046 Mon Sep 17 00:00:00 2001 From: Stephen McQuay Date: Sat, 21 Dec 2013 00:26:54 -0800 Subject: [PATCH] added sql storage --- api.go | 13 +++---------- db.go | 25 +++++++++++++++++++++++++ init.sql | 10 ++++++++++ log.go | 37 +++++++++++++++++++++++++++++++++++++ main.go | 7 ++++++- 5 files changed, 81 insertions(+), 11 deletions(-) create mode 100644 db.go create mode 100644 init.sql create mode 100644 log.go diff --git a/api.go b/api.go index d086674..9197b0c 100644 --- a/api.go +++ b/api.go @@ -22,12 +22,6 @@ type JSONMessage struct { Message string `json:"message"` } -type LogMessage struct { - Level int `json:"level"` - Namespace string `json:"namespace"` - Payload interface{} `json:"payload"` -} - func apiInfo(w http.ResponseWriter, req *http.Request) { version := struct { Version string `json:"version"` @@ -64,13 +58,12 @@ func put(w http.ResponseWriter, req *http.Request) { } parse_err := json.Unmarshal(body, &message) if parse_err != nil { - if err := json.NewEncoder(w).Encode(JSONError{parse_err.Error()}); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } + b, _ := json.Marshal(JSONError{err.Error()}) + http.Error(w, string(b), http.StatusMethodNotAllowed) return } - _, err = json.Marshal(message.Payload) + _, err = message.save() if err != nil { b, _ := json.Marshal(JSONError{err.Error()}) http.Error(w, string(b), http.StatusMethodNotAllowed) diff --git a/db.go b/db.go new file mode 100644 index 0000000..978481d --- /dev/null +++ b/db.go @@ -0,0 +1,25 @@ +package main + +import ( + "fmt" + "github.com/jmoiron/sqlx" + "log" +) + +func dbSetup(config *Configs) { + var err error + psqlConfig := fmt.Sprintf( + "dbname=%s host=%s sslmode=disable", + config.Dbname, + config.Dbhost, + ) + db, err = sqlx.Open( + "postgres", + psqlConfig, + ) + if err != nil { + log.Fatal("Issues connecting to db:", err) + } else { + log.Printf("connected to db %s", psqlConfig) + } +} diff --git a/init.sql b/init.sql new file mode 100644 index 0000000..dbf6d45 --- /dev/null +++ b/init.sql @@ -0,0 +1,10 @@ +DROP TABLE log; + +CREATE TABLE IF NOT EXISTS +log ( + log_id SERIAL, + log_time timestamp DEFAULT CURRENT_TIMESTAMP, + namespace varchar(256) NULL, + level int NOT NULL DEFAULT 0, + payload json NOT NULL +); diff --git a/log.go b/log.go new file mode 100644 index 0000000..fedf90f --- /dev/null +++ b/log.go @@ -0,0 +1,37 @@ +package main + +import ( + "database/sql" + "encoding/json" +) + +type LogMessage struct { + Namespace string `json:"namespace"` + Level int `json:"level"` + Payload interface{} `json:"payload"` +} + +func (l *LogMessage) json() ([]byte, error) { + return json.Marshal(l.Payload) +} + +func (l *LogMessage) save() (sql.Result, error) { + j, err := l.json() + if err != nil { + return nil, err + } + params := map[string]interface{}{ + "namespace": l.Namespace, + "level": l.Level, + "payload": j, + } + // TODO: actually make this return something useful as a first param, might + // need RETURNING log_id? + return db.NamedExecMap(` + INSERT INTO log + (namespace, level, payload) + VALUES + (:namespace, :level, :payload)`, + params, + ) +} diff --git a/main.go b/main.go index 6437261..300e823 100644 --- a/main.go +++ b/main.go @@ -3,13 +3,17 @@ package main import ( "flag" "fmt" + "github.com/jmoiron/sqlx" "github.com/kelseyhightower/envconfig" + _ "github.com/lib/pq" "log" "net/http" ) var verbose = flag.Bool("verbose", false, "increase logging verbosity") +var db *sqlx.DB + func main() { flag.Parse() log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) @@ -21,7 +25,8 @@ func main() { if err := config.validate(); err != nil { log.Fatal(err) } - log.Printf("%+v", config) + log.Printf("config: %#v", config) + dbSetup(config) http.Handle("/api/v0/info/", JsonHandler(apiInfo)) http.Handle("/api/v0/put/", JsonHandler(put))