From 9797bc543c8188e6cb8c5d774a624071bdc7d880 Mon Sep 17 00:00:00 2001 From: Pawan Rawal <pawan0201@gmail.com> Date: Mon, 18 Apr 2016 11:48:23 +0530 Subject: [PATCH] Making changes so that client gets back protocol buffer data Client now gets back protocol buffer data and is able to parse it into protocol buffer Subgraph --- client/go/main.go | 55 +++++++++++++++++++++++++++++++---------------- query/query.go | 3 +++ server/main.go | 18 ++++++++++------ 3 files changed, 52 insertions(+), 24 deletions(-) diff --git a/client/go/main.go b/client/go/main.go index f2d5d870..c78c7ef6 100644 --- a/client/go/main.go +++ b/client/go/main.go @@ -17,50 +17,69 @@ package main import ( + "bytes" "flag" - "fmt" "net" + "github.com/dgraph-io/dgraph/query/protocolbuffer" "github.com/dgraph-io/dgraph/x" + "github.com/golang/protobuf/proto" ) var glog = x.Log("client") -var port = flag.String("port", "3000", "Port to communicate with server") +var port = flag.String("port", "8090", "Port to communicate with server") func main() { - var q0 = ` - { - user(_xid_:alice) { - follows { - _xid_ - status - } - _xid_ - status + var q0 = `{ + me(_xid_: m.06pj8) { + type.object.name.en + film.director.film { + type.object.name.en + film.film.starring { + film.performance.character { + type.object.name.en + } + film.performance.actor { + type.object.name.en + film.director.film { + type.object.name.en + } + } + } + film.film.initial_release_date + film.film.country + film.film.genre { + type.object.name.en + } + } } - } -` +}` conn, err := net.Dial("tcp", "127.0.0.1:"+*port) if err != nil { - glog.Fatalf("While running server: %v", err) + x.Err(glog, err).Fatal("DialTCPConnection") } - fmt.Println("sending data", []byte(q0)) _, err = conn.Write([]byte(q0)) if err != nil { x.Err(glog, err).Fatal("Error in writing to server") } - reply := []byte{} + // TODO(pawan): Discuss and implement a better way of doing this. + reply := make([]byte, 4096) _, err = conn.Read(reply) if err != nil { x.Err(glog, err).Fatal("Error in reading response from server") } - fmt.Println(string(reply)) + // Trimming null bytes + reply = bytes.Trim(reply, "\000") - conn.Close() + usg := &protocolbuffer.SubGraph{} + if err := proto.Unmarshal(reply, usg); err != nil { + x.Err(glog, err).Fatal("Error in umarshalling protocol buffer") + } + conn.Close() } diff --git a/query/query.go b/query/query.go index d8e99f51..10226922 100644 --- a/query/query.go +++ b/query/query.go @@ -255,6 +255,9 @@ func (g *SubGraph) ToJson(l *Latency) (js []byte, rerr error) { func preTraverse(g *SubGraph) (sg *protocolbuffer.SubGraph, rerr error) { sg = &protocolbuffer.SubGraph{} + if len(g.query) == 0 { + return sg, nil + } sg.Attr = g.Attr ro := flatbuffers.GetUOffsetT(g.result) diff --git a/server/main.go b/server/main.go index 720a1785..fb9b2a6d 100644 --- a/server/main.go +++ b/server/main.go @@ -24,6 +24,7 @@ import ( "net" "net/http" "runtime" + "strconv" "strings" "time" @@ -197,7 +198,10 @@ func queryHandler(w http.ResponseWriter, r *http.Request) { } func pbQueryHandler(q []byte) (pb []byte, rerr error) { - fmt.Println("in pbQueryHandler") + if len(q) == 0 { + return + } + glog.WithField("q", string(q)).Debug("Query received.") gq, _, err := gql.Parse(string(q)) if err != nil { @@ -249,11 +253,11 @@ func runServerForClient(address string) error { WithField("remote", cxn.RemoteAddr()). Debug("Client Worker accepted connection") - q := make([]byte, 1024000) - // Move to separate function + // TODO(pawan) - Find a better way to do this, byte slice shouldn't be of fixed size + q := make([]byte, 4096) + // TODO(pawan) - Move to separate function go func(c net.Conn) { - _, _ = c.Read(q) - fmt.Println("query received: ", string(q)) + c.Read(q) r, _ := pbQueryHandler(q) c.Write(r) }(cxn) @@ -306,7 +310,9 @@ func main() { worker.Connect(addrs) - runServerForClient(":3000") + // TODO(pawan): Have a better way to do this, pick port for client from a flag + clientPort, _ := strconv.Atoi(*port) + runServerForClient(":" + strconv.Itoa(clientPort+10)) http.HandleFunc("/query", queryHandler) glog.WithField("port", *port).Info("Listening for requests...") -- GitLab