func configFrom(file string) *config.Config { // Find the file... if file != "" { if _, err := os.Stat(file); os.IsNotExist(err) { clog.Fatalf("Cannot find specified configuration file '%s', aborting.", file) } } else if _, err := os.Stat(os.Getenv("CAYLEY_CFG")); err == nil { file = os.Getenv("CAYLEY_CFG") } else if _, err := os.Stat("/etc/cayley.cfg"); err == nil { file = "/etc/cayley.cfg" } if file == "" { clog.Infof("Couldn't find a config file in either $CAYLEY_CFG or /etc/cayley.cfg. Going by flag defaults only.") } cfg, err := config.Load(file) if err != nil { clog.Fatalf("%v", err) } if cfg.DatabasePath == "" { cfg.DatabasePath = *databasePath } if cfg.DatabaseType == "" { cfg.DatabaseType = *databaseBackend } return cfg }
func init() { cfg, err := configFrom("cayley_appengine.cfg") if err != nil { clog.Fatalf("Error loading config: %v", err) } handle, err := db.Open(cfg) if err != nil { clog.Fatalf("Error opening database: %v", err) } http.SetupRoutes(handle, cfg) }
func Serve(handle *graph.Handle, cfg *config.Config) { SetupRoutes(handle, cfg) clog.Infof("Cayley now listening on %s:%s\n", cfg.ListenHost, cfg.ListenPort) fmt.Printf("Cayley now listening on %s:%s\n", cfg.ListenHost, cfg.ListenPort) err := http.ListenAndServe(fmt.Sprintf("%s:%s", cfg.ListenHost, cfg.ListenPort), nil) if err != nil { clog.Fatalf("ListenAndServe: %v", err) } }
func (api *API) ServeV1WriteNQuad(w http.ResponseWriter, r *http.Request, params httprouter.Params) int { if api.config.ReadOnly { return jsonResponse(w, 400, "Database is read-only.") } formFile, _, err := r.FormFile("NQuadFile") if err != nil { clog.Errorf("%v", err) return jsonResponse(w, 500, "Couldn't read file: "+err.Error()) } defer formFile.Close() blockSize, blockErr := strconv.ParseInt(r.URL.Query().Get("block_size"), 10, 64) if blockErr != nil { blockSize = int64(api.config.LoadSize) } quadReader, err := internal.Decompressor(formFile) // TODO(kortschak) Make this configurable from the web UI. dec := cquads.NewDecoder(quadReader) h, err := api.GetHandleForRequest(r) if err != nil { return jsonResponse(w, 400, err) } var ( n int block = make([]quad.Quad, 0, blockSize) ) for { t, err := dec.Unmarshal() if err != nil { if err == io.EOF { break } clog.Fatalf("what can do this here? %v", err) // FIXME(kortschak) } block = append(block, t) n++ if len(block) == cap(block) { h.QuadWriter.AddQuadSet(block) block = block[:0] } } h.QuadWriter.AddQuadSet(block) fmt.Fprintf(w, "{\"result\": \"Successfully wrote %d quads.\"}", n) return 200 }
func findAssetsPath() string { if *assetsPath != "" { if hasAssets(*assetsPath) { return *assetsPath } clog.Fatalf("Cannot find assets at", *assetsPath, ".") } if hasAssets(".") { return "." } if hasAssets("..") { return ".." } gopathPath := os.ExpandEnv("$GOPATH/src/github.com/cayleygraph/cayley") if hasAssets(gopathPath) { return gopathPath } clog.Fatalf("Cannot find assets in any of the default search paths. Please run in the same directory, in a Go workspace, or set --assets .") panic("cannot reach") }
func (it *AllIterator) Result() graph.Value { if it.result == nil { clog.Fatalf("result was nil %v", it) } return it.result }
func main() { // No command? It's time for usage. if len(os.Args) == 1 { fmt.Fprintln(os.Stderr, "Cayley is a graph store and graph query layer.") usage() os.Exit(1) } cmd := os.Args[1] os.Args = append(os.Args[:1], os.Args[2:]...) flag.Parse() if *cpuprofile != "" { f, err := os.Create(*cpuprofile) if err != nil { clog.Fatalf("%v", err) } pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() } var buildString string if Version != "" { buildString = fmt.Sprint("Cayley ", Version, " built ", BuildDate) clog.Infof(buildString) } cfg := configFrom(*configFile) if os.Getenv("GOMAXPROCS") == "" { runtime.GOMAXPROCS(runtime.NumCPU()) clog.Infof("Setting GOMAXPROCS to %d", runtime.NumCPU()) } else { clog.Infof("GOMAXPROCS currently %v -- not adjusting", os.Getenv("GOMAXPROCS")) } var ( handle *graph.Handle err error ) switch cmd { case "version": if Version != "" { fmt.Println(buildString) } else { fmt.Println("Cayley snapshot") } os.Exit(0) case "init": err = db.Init(cfg) if err != nil { break } if *quadFile != "" { handle, err = db.Open(cfg) if err != nil { break } err = internal.Load(handle.QuadWriter, cfg, *quadFile, *quadType) if err != nil { break } handle.Close() } case "load": handle, err = db.Open(cfg) if err != nil { break } err = internal.Load(handle.QuadWriter, cfg, *quadFile, *quadType) if err != nil { break } handle.Close() case "dump": handle, err = db.Open(cfg) if err != nil { break } if !graph.IsPersistent(cfg.DatabaseType) { err = internal.Load(handle.QuadWriter, cfg, *quadFile, *quadType) if err != nil { break } } err = internal.Dump(handle.QuadStore, *dumpFile, *dumpType) if err != nil { break } handle.Close() case "repl": if *initOpt { err = db.Init(cfg) if err != nil && err != graph.ErrDatabaseExists { break } } handle, err = db.Open(cfg) if err != nil { break } if !graph.IsPersistent(cfg.DatabaseType) { err = internal.Load(handle.QuadWriter, cfg, "", *quadType) if err != nil { break } } err = db.Repl(handle, *queryLanguage, cfg) handle.Close() case "http": if *initOpt { err = db.Init(cfg) if err != nil && err != graph.ErrDatabaseExists { break } } handle, err = db.Open(cfg) if err != nil { break } if !graph.IsPersistent(cfg.DatabaseType) { err = internal.Load(handle.QuadWriter, cfg, "", *quadType) if err != nil { break } } http.Serve(handle, cfg) handle.Close() default: fmt.Println("No command", cmd) usage() } if err != nil { clog.Errorf("%v", err) } }