From 09d32f4cac9f0c20728d2afea5f9389e0cbb20c1 Mon Sep 17 00:00:00 2001 From: Philip O'Toole Date: Sat, 23 Aug 2014 14:32:58 -0700 Subject: [PATCH] Basic query working All column values returned as strings --- src/github.com/otoolep/rqlite/db/db.go | 32 ++++++++++++++++++- .../otoolep/rqlite/server/server.go | 11 +++++-- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/github.com/otoolep/rqlite/db/db.go b/src/github.com/otoolep/rqlite/db/db.go index 6cfa422c..3b991140 100644 --- a/src/github.com/otoolep/rqlite/db/db.go +++ b/src/github.com/otoolep/rqlite/db/db.go @@ -36,7 +36,37 @@ func New(dir string) *DB { // Executes the query. func (db *DB) Query(query string) string { - return "the query" + rows, err := db.dbConn.Query(query) + if err != nil { + fmt.Println(err.Error()) + } + defer rows.Close() + + columns, _ := rows.Columns() + rawResult := make([][]byte, len(columns)) + result := make([]string, len(columns)) + dest := make([]interface{}, len(columns)) // A temporary interface{} slice + for i, _ := range rawResult { + dest[i] = &rawResult[i] // Put pointers to each string in the interface slice + } + + for rows.Next() { + err = rows.Scan(dest...) + if err != nil { + fmt.Println("Failed to scan row", err) + } + + for i, raw := range rawResult { + if raw == nil { + result[i] = "null" + } else { + result[i] = string(raw) + } + } + + fmt.Printf("%#v\n", result) + } + return "query complete response" // Inefficient? } // Sets the value for a given key. diff --git a/src/github.com/otoolep/rqlite/server/server.go b/src/github.com/otoolep/rqlite/server/server.go index b7dd9c50..58e14a2a 100644 --- a/src/github.com/otoolep/rqlite/server/server.go +++ b/src/github.com/otoolep/rqlite/server/server.go @@ -112,8 +112,8 @@ func (s *Server) ListenAndServe(leader string) error { Handler: s.router, } - s.router.HandleFunc("/db/{key}", s.readHandler).Methods("GET") - s.router.HandleFunc("/db/{key}", s.writeHandler).Methods("POST") + s.router.HandleFunc("/db", s.readHandler).Methods("GET") + s.router.HandleFunc("/db", s.writeHandler).Methods("POST") s.router.HandleFunc("/join", s.joinHandler).Methods("POST") log.Println("Listening at:", s.connectionString()) @@ -159,7 +159,12 @@ func (s *Server) joinHandler(w http.ResponseWriter, req *http.Request) { } func (s *Server) readHandler(w http.ResponseWriter, req *http.Request) { - value := s.db.Query("query") + b, err := ioutil.ReadAll(req.Body) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + return + } + value := s.db.Query(string(b)) w.Write([]byte(value)) }