Skip to content
Snippets Groups Projects
main.go 2.93 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     * Copyright 2015 Manish R Jain <manishrjain@gmail.com>
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     * 		http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    package main
    
    import (
    	"flag"
    	"fmt"
    	"io/ioutil"
    	"net/http"
    
    
    	"github.com/Sirupsen/logrus"
    
    	"github.com/dgraph-io/dgraph/commit"
    
    	"github.com/dgraph-io/dgraph/gql"
    	"github.com/dgraph-io/dgraph/posting"
    	"github.com/dgraph-io/dgraph/query"
    	"github.com/dgraph-io/dgraph/store"
    	"github.com/dgraph-io/dgraph/x"
    )
    
    
    
    var postingDir = flag.String("postings", "", "Directory to store posting lists")
    var mutationDir = flag.String("mutations", "", "Directory to store mutations")
    
    var port = flag.String("port", "8080", "Port to run server on.")
    
    
    func queryHandler(w http.ResponseWriter, r *http.Request) {
    	if r.Method != "POST" {
    		x.SetStatus(w, x.E_INVALID_METHOD, "Invalid method")
    		return
    	}
    
    	defer r.Body.Close()
    	q, err := ioutil.ReadAll(r.Body)
    
    		x.Err(glog, err).Error("While reading query")
    
    		x.SetStatus(w, x.E_INVALID_REQUEST, "Invalid request encountered.")
    
    	glog.WithField("q", string(q)).Info("Query received.")
    
    	sg, err := gql.Parse(string(q))
    	if err != nil {
    		x.Err(glog, err).Error("While parsing query")
    		x.SetStatus(w, x.E_INVALID_REQUEST, err.Error())
    		return
    	}
    
    	glog.WithField("q", string(q)).Info("Query parsed.")
    
    	rch := make(chan error)
    	go query.ProcessGraph(sg, rch)
    	err = <-rch
    	if err != nil {
    		x.Err(glog, err).Error("While executing query")
    		x.SetStatus(w, x.E_ERROR, err.Error())
    		return
    	}
    
    	glog.WithField("q", string(q)).Info("Graph processed.")
    
    	js, err := sg.ToJson()
    	if err != nil {
    		x.Err(glog, err).Error("While converting to Json.")
    		x.SetStatus(w, x.E_ERROR, err.Error())
    		return
    	}
    	w.Header().Set("Content-Type", "application/json")
    	fmt.Fprint(w, string(js))
    
    }
    
    func main() {
    	flag.Parse()
    	if !flag.Parsed() {
    		glog.Fatal("Unable to parse flags")
    	}
    
    	glog.WithField("gomaxprocs", runtime.GOMAXPROCS(-1)).Info("Number of CPUs")
    
    
    	ps := new(store.Store)
    	ps.Init(*postingDir)
    
    	clog := commit.NewLogger(*mutationDir, "dgraph", 50<<20)
    
    	clog.SkipWrite = false
    	clog.SyncEvery = 1
    
    	clog.Init()
    	defer clog.Close()
    
    	posting.Init(ps, clog)
    	posting.StartPeriodicMerging()
    
    	http.HandleFunc("/query", queryHandler)
    
    	glog.WithField("port", *port).Info("Listening for requests...")
    	if err := http.ListenAndServe(":"+*port, nil); err != nil {
    
    		x.Err(glog, err).Fatal("ListenAndServe")
    	}
    }