func Start(dir string, port int, tlsCrt, tlsKey, jwtPubKey, jwtPrivateKey string) { var err error HttpDB, err = db.OpenDB(dir) if err != nil { panic(err) } // These endpoints are always available and do not require JWT auth http.HandleFunc("/", Welcome) http.HandleFunc("/version", Version) http.HandleFunc("/memstats", MemStats) if jwtPrivateKey != "" { // JWT support ServeJWTEnabledEndpoints(jwtPubKey, jwtPrivateKey) } else { // No JWT ServeEndpoints() } if tlsCrt != "" { tdlog.Noticef("Will listen on all interfaces (HTTPS), port %d.", port) if err := http.ListenAndServeTLS(fmt.Sprintf(":%d", port), tlsCrt, tlsKey, nil); err != nil { tdlog.Panicf("Failed to start HTTPS service - %s", err) } } else { tdlog.Noticef("Will listen on all interfaces (HTTP), port %d.", port) http.ListenAndServe(fmt.Sprintf(":%d", port), nil) } }
func embeddedExample() { // ****************** Collection Management ****************** myDBDir := "/tmp/MyDatabase" os.RemoveAll(myDBDir) defer os.RemoveAll(myDBDir) // (Create if not exist) open a database myDB, err := db.OpenDB(myDBDir) if err != nil { panic(err) } // Create two collections: Feeds and Votes if err := myDB.Create("Feeds"); err != nil { panic(err) } if err := myDB.Create("Votes"); err != nil { panic(err) } // What collections do I now have? for _, name := range myDB.AllCols() { fmt.Printf("I have a collection called %s\n", name) } // Rename collection "Votes" to "Points" if err := myDB.Rename("Votes", "Points"); err != nil { panic(err) } // Drop (delete) collection "Points" if err := myDB.Drop("Points"); err != nil { panic(err) } // Scrub (repair and compact) "Feeds" if err := myDB.Scrub("Feeds"); err != nil { panic(err) } // ****************** Document Management ****************** // Start using a collection (the reference is valid until DB schema changes or Scrub is carried out) feeds := myDB.Use("Feeds") // Insert document (afterwards the docID uniquely identifies the document and will never change) docID, err := feeds.Insert(map[string]interface{}{ "name": "Go 1.2 is released", "url": "golang.org"}) if err != nil { panic(err) } // Read document readBack, err := feeds.Read(docID) if err != nil { panic(err) } fmt.Println("Document", docID, "is", readBack) // Update document err = feeds.Update(docID, map[string]interface{}{ "name": "Go is very popular", "url": "google.com"}) if err != nil { panic(err) } // Process all documents (note that document order is undetermined) feeds.ForEachDoc(func(id int, docContent []byte) (willMoveOn bool) { fmt.Println("Document", id, "is", string(docContent)) return true // move on to the next document OR return false // do not move on to the next document }) // Delete document if err := feeds.Delete(docID); err != nil { panic(err) } // More complicated error handing - identify the error Type. // In this example, the error code tells that the document no longer exists. if err := feeds.Delete(docID); dberr.Type(err) == dberr.ErrorNoDoc { fmt.Println("The document was already deleted") } // ****************** Index Management ****************** // Indexes assist in many types of queries // Create index (path leads to document JSON attribute) if err := feeds.Index([]string{"author", "name", "first_name"}); err != nil { panic(err) } if err := feeds.Index([]string{"Title"}); err != nil { panic(err) } if err := feeds.Index([]string{"Source"}); err != nil { panic(err) } // What indexes do I have on collection A? for _, path := range feeds.AllIndexes() { fmt.Printf("I have an index on path %v\n", path) } // Remove index if err := feeds.Unindex([]string{"author", "name", "first_name"}); err != nil { panic(err) } // ****************** Queries ****************** // Prepare some documents for the query feeds.Insert(map[string]interface{}{"Title": "New Go release", "Source": "golang.org", "Age": 3}) feeds.Insert(map[string]interface{}{"Title": "Kitkat is here", "Source": "google.com", "Age": 2}) feeds.Insert(map[string]interface{}{"Title": "Good Slackware", "Source": "slackware.com", "Age": 1}) var query interface{} json.Unmarshal([]byte(`[{"eq": "New Go release", "in": ["Title"]}, {"eq": "slackware.com", "in": ["Source"]}]`), &query) queryResult := make(map[int]struct{}) // query result (document IDs) goes into map keys if err := db.EvalQuery(query, feeds, &queryResult); err != nil { panic(err) } // Query result are document IDs for id := range queryResult { // To get query result document, simply read it readBack, err := feeds.Read(id) if err != nil { panic(err) } fmt.Printf("Query returned document %v\n", readBack) } // Gracefully close database if err := myDB.Close(); err != nil { panic(err) } }
// example.go written in test case style func TestAll(t *testing.T) { myDBDir := "/tmp/tiedot_test_embeddedExample" os.RemoveAll(myDBDir) defer os.RemoveAll(myDBDir) myDB, err := db.OpenDB(myDBDir) if err != nil { t.Fatal(err) } if err := myDB.Create("Feeds"); err != nil { t.Fatal(err) } if err := myDB.Create("Votes"); err != nil { t.Fatal(err) } for _, name := range myDB.AllCols() { if name != "Feeds" && name != "Votes" { t.Fatal(myDB.AllCols()) } } if err := myDB.Rename("Votes", "Points"); err != nil { t.Fatal(err) } if err := myDB.Drop("Points"); err != nil { t.Fatal(err) } if err := myDB.Scrub("Feeds"); err != nil { t.Fatal(err) } feeds := myDB.Use("Feeds") docID, err := feeds.Insert(map[string]interface{}{ "name": "Go 1.2 is released", "url": "golang.org"}) if err != nil { t.Fatal(err) } readBack, err := feeds.Read(docID) if err != nil { t.Fatal(err) } if !sameMap(readBack, map[string]interface{}{ "name": "Go 1.2 is released", "url": "golang.org"}) { t.Fatal(readBack) } err = feeds.Update(docID, map[string]interface{}{ "name": "Go is very popular", "url": "google.com"}) if err != nil { panic(err) } feeds.ForEachDoc(func(id int, docContent []byte) (willMoveOn bool) { var doc map[string]interface{} if json.Unmarshal(docContent, &doc) != nil { t.Fatal("cannot deserialize") } if !sameMap(doc, map[string]interface{}{ "name": "Go is very popular", "url": "google.com"}) { t.Fatal(doc) } return true }) if err := feeds.Delete(docID); err != nil { t.Fatal(err) } if err := feeds.Delete(docID); dberr.Type(err) != dberr.ErrorNoDoc { t.Fatal(err) } if err := feeds.Index([]string{"author", "name", "first_name"}); err != nil { t.Fatal(err) } if err := feeds.Index([]string{"Title"}); err != nil { t.Fatal(err) } if err := feeds.Index([]string{"Source"}); err != nil { t.Fatal(err) } for _, path := range feeds.AllIndexes() { joint := strings.Join(path, "") if joint != "authornamefirst_name" && joint != "Title" && joint != "Source" { t.Fatal(feeds.AllIndexes()) } } if err := feeds.Unindex([]string{"author", "name", "first_name"}); err != nil { t.Fatal(err) } // ****************** Queries ****************** // Prepare some documents for the query if _, err := feeds.Insert(map[string]interface{}{"Title": "New Go release", "Source": "golang.org", "Age": 3}); err != nil { t.Fatal("failure") } if _, err := feeds.Insert(map[string]interface{}{"Title": "Kitkat is here", "Source": "google.com", "Age": 2}); err != nil { t.Fatal("failure") } if _, err := feeds.Insert(map[string]interface{}{"Title": "Good Slackware", "Source": "slackware.com", "Age": 1}); err != nil { t.Fatal("failure") } var query interface{} if json.Unmarshal([]byte(`[{"eq": "New Go release", "in": ["Title"]}, {"eq": "slackware.com", "in": ["Source"]}]`), &query) != nil { t.Fatal("failure") } queryResult := make(map[int]struct{}) // query result (document IDs) goes into map keys if err := db.EvalQuery(query, feeds, &queryResult); err != nil { t.Fatal(err) } // Query result are document IDs for id := range queryResult { // To get query result document, simply read it readBack, err := feeds.Read(id) if err != nil { panic(err) } if !sameMap(readBack, map[string]interface{}{"Title": "New Go release", "Source": "golang.org", "Age": 3}) && !sameMap(readBack, map[string]interface{}{"Title": "Good Slackware", "Source": "slackware.com", "Age": 1}) { t.Fatal(readBack) } } if err := myDB.Close(); err != nil { t.Fatal(err) } }