summary refs log tree commit diff stats
path: root/svc/leveldb.go
diff options
context:
space:
mode:
authorBen Morrison <ben@gbmor.dev>2019-06-08 01:04:38 -0400
committerBen Morrison <ben@gbmor.dev>2019-06-08 02:29:33 -0400
commita5a32e7a317dd5cf156e52a71d7be432d0594bf7 (patch)
treec266a1652f78ec446b2eb85f2371e0cfabed65ff /svc/leveldb.go
parente6beae32cd45ea0057e1a5bc5e4b3f2a098a1a1e (diff)
downloadgetwtxt-a5a32e7a317dd5cf156e52a71d7be432d0594bf7.tar.gz
split db-specific funcs into separate files
Diffstat (limited to 'svc/leveldb.go')
-rw-r--r--svc/leveldb.go106
1 files changed, 106 insertions, 0 deletions
diff --git a/svc/leveldb.go b/svc/leveldb.go
new file mode 100644
index 0000000..455d8b9
--- /dev/null
+++ b/svc/leveldb.go
@@ -0,0 +1,106 @@
+package svc // import "github.com/getwtxt/getwtxt/svc"
+
+import (
+	"net"
+	"strings"
+	"time"
+
+	"github.com/getwtxt/registry"
+	"github.com/syndtr/goleveldb/leveldb"
+)
+
+type dbLevel struct {
+	db *leveldb.DB
+}
+
+func (lvl dbLevel) push() error {
+
+	twtxtCache.Mu.RLock()
+	var dbBasket = &leveldb.Batch{}
+	for k, v := range twtxtCache.Users {
+
+		dbBasket.Put([]byte(k+"*Nick"), []byte(v.Nick))
+		dbBasket.Put([]byte(k+"*URL"), []byte(v.URL))
+		dbBasket.Put([]byte(k+"*IP"), []byte(v.IP.String()))
+		dbBasket.Put([]byte(k+"*Date"), []byte(v.Date))
+		dbBasket.Put([]byte(k+"*RLen"), []byte(v.RLen))
+
+		for i, e := range v.Status {
+			rfc := i.Format(time.RFC3339)
+			dbBasket.Put([]byte(k+"*Status*"+rfc), []byte(e))
+		}
+	}
+	twtxtCache.Mu.RUnlock()
+
+	remoteRegistries.Mu.RLock()
+	for k, v := range remoteRegistries.List {
+		dbBasket.Put([]byte("remote*"+string(k)), []byte(v))
+	}
+	remoteRegistries.Mu.RUnlock()
+
+	confObj.Mu.Lock()
+	confObj.LastPush = time.Now()
+	confObj.Mu.Unlock()
+
+	return lvl.db.Write(dbBasket, nil)
+}
+
+func (lvl dbLevel) pull() {
+
+	iter := lvl.db.NewIterator(nil, nil)
+
+	for iter.Next() {
+		key := string(iter.Key())
+		val := string(iter.Value())
+
+		split := strings.Split(key, "*")
+		urls := split[0]
+		field := split[1]
+
+		if urls == "remote" {
+			remoteRegistries.Mu.Lock()
+			remoteRegistries.List = append(remoteRegistries.List, val)
+			remoteRegistries.Mu.Unlock()
+			continue
+		}
+
+		data := registry.NewUser()
+		twtxtCache.Mu.RLock()
+		if _, ok := twtxtCache.Users[urls]; ok {
+			twtxtCache.Users[urls].Mu.RLock()
+			data = twtxtCache.Users[urls]
+			twtxtCache.Users[urls].Mu.RUnlock()
+		}
+		twtxtCache.Mu.RUnlock()
+
+		data.Mu.Lock()
+		switch field {
+		case "IP":
+			data.IP = net.ParseIP(val)
+		case "Nick":
+			data.Nick = val
+		case "URL":
+			data.URL = val
+		case "RLen":
+			data.RLen = val
+		case "Date":
+			data.Date = val
+		case "Status":
+			thetime, err := time.Parse(time.RFC3339, split[2])
+			errLog("", err)
+			data.Status[thetime] = val
+		}
+		data.Mu.Unlock()
+
+		twtxtCache.Mu.Lock()
+		twtxtCache.Users[urls] = data
+		twtxtCache.Mu.Unlock()
+	}
+
+	remoteRegistries.Mu.Lock()
+	remoteRegistries.List = dedupe(remoteRegistries.List)
+	remoteRegistries.Mu.Unlock()
+
+	iter.Release()
+	errLog("Error while pulling DB into registry cache: ", iter.Error())
+}