aboutsummaryrefslogtreecommitdiffstats
path: root/db_query_interface.go
diff options
context:
space:
mode:
authorobscuren <obscuren@obscura.com>2014-01-01 20:36:48 +0800
committerobscuren <obscuren@obscura.com>2014-01-01 20:36:48 +0800
commit5da78427d0d5910c2ea0c0fc6ca84078f327e933 (patch)
tree8d704316190b98f061281db32d058802988e09c6 /db_query_interface.go
parent52952e274d791991c6c368d135234068968981bc (diff)
downloadgo-tangerine-5da78427d0d5910c2ea0c0fc6ca84078f327e933.tar
go-tangerine-5da78427d0d5910c2ea0c0fc6ca84078f327e933.tar.gz
go-tangerine-5da78427d0d5910c2ea0c0fc6ca84078f327e933.tar.bz2
go-tangerine-5da78427d0d5910c2ea0c0fc6ca84078f327e933.tar.lz
go-tangerine-5da78427d0d5910c2ea0c0fc6ca84078f327e933.tar.xz
go-tangerine-5da78427d0d5910c2ea0c0fc6ca84078f327e933.tar.zst
go-tangerine-5da78427d0d5910c2ea0c0fc6ca84078f327e933.zip
Added db query interface and moved memory database
Diffstat (limited to 'db_query_interface.go')
-rw-r--r--db_query_interface.go97
1 files changed, 97 insertions, 0 deletions
diff --git a/db_query_interface.go b/db_query_interface.go
new file mode 100644
index 000000000..1bcf1e72d
--- /dev/null
+++ b/db_query_interface.go
@@ -0,0 +1,97 @@
+package main
+
+import (
+ "fmt"
+ "bufio"
+ "strings"
+ "os"
+ "errors"
+ "encoding/hex"
+)
+
+type DbInterface struct {
+ db *MemDatabase
+ trie *Trie
+}
+
+func NewDBInterface() *DbInterface {
+ db, _ := NewMemDatabase()
+ trie := NewTrie(db, "")
+
+ return &DbInterface{db: db, trie: trie}
+}
+
+func (i *DbInterface) ValidateInput(action string, argumentLength int) error {
+ err := false
+ var expArgCount int
+
+ switch {
+ case action == "update" && argumentLength != 2:
+ err = true
+ expArgCount = 2
+ case action == "get" && argumentLength != 1:
+ err = true
+ expArgCount = 1
+ case (action == "quit" || action == "exit") && argumentLength != 0:
+ err = true
+ expArgCount = 0
+ }
+
+ if err {
+ return errors.New(fmt.Sprintf("'%s' requires %d args, got %d", action, expArgCount, argumentLength))
+ } else {
+ return nil
+ }
+}
+
+func (i *DbInterface) ParseInput(input string) bool {
+ scanner := bufio.NewScanner(strings.NewReader(input))
+ scanner.Split(bufio.ScanWords)
+
+ count := 0
+ var tokens []string
+ for scanner.Scan() {
+ count++
+ tokens = append(tokens, scanner.Text())
+ }
+ if err := scanner.Err(); err != nil {
+ fmt.Fprintln(os.Stderr, "reading input:", err)
+ }
+
+ if len(tokens) == 0 { return true }
+
+ err := i.ValidateInput(tokens[0], count-1)
+ if err != nil {
+ fmt.Println(err)
+ } else {
+ switch tokens[0] {
+ case "update":
+ i.trie.Update(tokens[1], tokens[2])
+
+ fmt.Println(hex.EncodeToString([]byte(i.trie.root)))
+ case "get":
+ fmt.Println(i.trie.Get(tokens[1]))
+ case "exit", "quit", "q":
+ return false
+ default:
+ fmt.Println("Unknown command:", tokens[0])
+ }
+ }
+
+ return true
+}
+
+func (i *DbInterface) Start() {
+ reader := bufio.NewReader(os.Stdin)
+ for {
+ fmt.Printf("db >>> ")
+ str, _, err := reader.ReadLine()
+ if err != nil {
+ fmt.Println("Error reading input", err)
+ } else {
+ if !i.ParseInput(string(str)) {
+ return
+ }
+ }
+ }
+}