commit c1f645311e7fd4466bd24dda6b730816c59b2231
parent 5e347fbde9c86a3176783e2543b8120dca26b8f7
Author: MTRNord <mtrnord1@gmail.com>
Date: Wed, 22 Nov 2017 16:50:23 +0100
Switch DB to badger by dgraph-io \(^^)/
Signed-off-by: MTRNord <mtrnord1@gmail.com>
Diffstat:
9 files changed, 319 insertions(+), 165 deletions(-)
diff --git a/Morpheus_suite_test.go b/Morpheus_suite_test.go
@@ -0,0 +1,13 @@
+package main_test
+
+import (
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+
+ "testing"
+)
+
+func TestMorpheus(t *testing.T) {
+ RegisterFailHandler(Fail)
+ RunSpecs(t, "Morpheus Suite")
+}
diff --git a/main.go b/main.go
@@ -1,25 +1,28 @@
package main
import (
+ "fmt"
"log"
"os"
+ "runtime"
"sync"
"github.com/Nordgedanken/Morpheus/matrix"
"github.com/Nordgedanken/Morpheus/matrix/db"
"github.com/Nordgedanken/Morpheus/ui"
"github.com/Nordgedanken/Morpheus/util"
+ "github.com/dgraph-io/badger"
"github.com/matrix-org/gomatrix"
"github.com/therecipe/qt/core"
"github.com/therecipe/qt/gui"
"github.com/therecipe/qt/widgets"
- "github.com/tidwall/buntdb"
)
var window *widgets.QMainWindow
var localLog *log.Logger
func main() {
+ runtime.GOMAXPROCS(128)
var file *os.File
var err error
@@ -30,7 +33,12 @@ func main() {
}
defer file.Close()
- db, DBOpenErr := db.OpenUserDB()
+ UserDB, DBOpenErr := db.OpenUserDB()
+ if DBOpenErr != nil {
+ localLog.Fatalln(DBOpenErr)
+ }
+
+ CacheDB, DBOpenErr := db.OpenCacheDB()
if DBOpenErr != nil {
localLog.Fatalln(DBOpenErr)
}
@@ -80,34 +88,45 @@ func main() {
var userID string
// Get cache
- DBErr := db.View(func(tx *buntdb.Tx) error {
- accessTokenErr := tx.AscendKeys("user|accessToken",
- func(key, value string) bool {
- accessToken = value
- return true
- })
- if accessTokenErr != nil {
- return accessTokenErr
+ DBErr := UserDB.View(func(txn *badger.Txn) error {
+ accessTokenItem, QueryErr := txn.Get([]byte("user|accessToken"))
+ if QueryErr != nil && QueryErr != badger.ErrKeyNotFound {
+ return QueryErr
+ }
+ if QueryErr != badger.ErrKeyNotFound {
+ accessTokenByte, accessTokenErr := accessTokenItem.Value()
+ accessToken = fmt.Sprintf("%s", accessTokenByte)
+ if accessTokenErr != nil {
+ return accessTokenErr
+ }
+ }
+
+ homeserverURLItem, QueryErr := txn.Get([]byte("user|homeserverURL"))
+ if QueryErr != nil && QueryErr != badger.ErrKeyNotFound {
+ return QueryErr
+ }
+ if QueryErr != badger.ErrKeyNotFound {
+ homeserverURLByte, homeserverURLErr := homeserverURLItem.Value()
+ homeserverURL = fmt.Sprintf("%s", homeserverURLByte)
+ if homeserverURLErr != nil {
+ return homeserverURLErr
+ }
+ }
+
+ userIDItem, QueryErr := txn.Get([]byte("user|userID"))
+ if QueryErr != nil && QueryErr != badger.ErrKeyNotFound {
+ return QueryErr
}
- homeserverURLErr := tx.AscendKeys("user|homeserverURL",
- func(key, value string) bool {
- homeserverURL = value
- return true
- })
- if homeserverURLErr != nil {
- return homeserverURLErr
+ if QueryErr != badger.ErrKeyNotFound {
+ userIDByte, userIDErr := userIDItem.Value()
+ userID = fmt.Sprintf("%s", userIDByte)
+ return userIDErr
}
- userIDErr := tx.AscendKeys("user|userID",
- func(key, value string) bool {
- userID = value
- return true
- })
- return userIDErr
+ return nil
})
if DBErr != nil {
- localLog.Fatalln(DBErr)
+ localLog.Fatalln("Login: ", DBErr)
}
- db.Close()
if accessToken != "" && homeserverURL != "" && userID != "" {
var wg sync.WaitGroup
@@ -133,7 +152,7 @@ func main() {
}
mainUIErr := MainUIStruct.NewUI()
if mainUIErr != nil {
- localLog.Fatalln(mainUIErr)
+ localLog.Fatalln("mainUI: ", mainUIErr)
return
}
MainUIStruct.GetWidget().Resize2(windowWidth, windowHeight)
@@ -148,7 +167,7 @@ func main() {
}
loginUIErr := LoginUIStruct.NewUI()
if loginUIErr != nil {
- localLog.Fatalln(loginUIErr)
+ localLog.Fatalln("Login Err: ", loginUIErr)
return
}
LoginUIStruct.GetWidget().Resize2(windowWidth, windowHeight)
@@ -160,5 +179,7 @@ func main() {
//enter the main event loop
_ = widgets.QApplication_Exec()
+ defer UserDB.Close()
+ defer CacheDB.Close()
localLog.Println("Stopping Morpheus")
}
diff --git a/matrix/db/db.go b/matrix/db/db.go
@@ -1,53 +1,104 @@
package db
import (
+ "errors"
+ "log"
"os"
"path/filepath"
"strconv"
+ "sync"
+ "github.com/dgraph-io/badger"
"github.com/shibukawa/configdir"
- "github.com/tidwall/buntdb"
)
+var UserDB *badger.DB
+var CacheDB *badger.DB
+var onceCache sync.Once
+var onceUser sync.Once
+
// OpenCacheDB opens or generates the Database file for settings and Cache
-func OpenCacheDB() (db *buntdb.DB, err error) {
- // Open the data.db file. It will be created if it doesn't exist.
- configDirs := configdir.New("Nordgedanken", "Morpheus")
- if _, StatErr := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/"); os.IsNotExist(StatErr) {
- MkdirErr := os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/data/", 0666)
- if MkdirErr != nil {
- err = MkdirErr
+func OpenCacheDB() (db *badger.DB, err error) {
+ onceCache.Do(func() {
+ // Open the data.db file. It will be created if it doesn't exist.
+ configDirs := configdir.New("Nordgedanken", "Morpheus")
+ if _, StatErr := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/"); os.IsNotExist(StatErr) {
+ MkdirErr := os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/data/", 0666)
+ if MkdirErr != nil {
+ err = MkdirErr
+ return
+ }
+ }
+ if _, StatErr := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/cache/"); os.IsNotExist(StatErr) {
+ MkdirErr := os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/data/cache/", 0666)
+ if MkdirErr != nil {
+ err = MkdirErr
+ return
+ }
+ }
+ opts := badger.DefaultOptions
+ opts.SyncWrites = false
+ opts.Dir = filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/cache"
+ opts.ValueDir = filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/cache"
+
+ expDB, DBErr := badger.Open(opts)
+ if DBErr != nil {
+ err = DBErr
return
}
- }
- expDB, DBErr := buntdb.Open(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/cache.db")
- if DBErr != nil {
- err = DBErr
+ CacheDB = expDB
+ })
+
+ if CacheDB == nil {
+ log.Println(CacheDB)
+ err = errors.New("missing CacheDB")
return
}
- db = expDB
+ db = CacheDB
return
}
// OpenUserDB opens or generates the Database file for settings and Cache
-func OpenUserDB() (db *buntdb.DB, err error) {
- // Open the data.db file. It will be created if it doesn't exist.
- configDirs := configdir.New("Nordgedanken", "Morpheus")
- if _, StatErr := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/"); os.IsNotExist(StatErr) {
- MkdirErr := os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/data/", 0666)
- if MkdirErr != nil {
- err = MkdirErr
+func OpenUserDB() (db *badger.DB, err error) {
+ onceUser.Do(func() {
+ // Open the data.db file. It will be created if it doesn't exist.
+ configDirs := configdir.New("Nordgedanken", "Morpheus")
+ if _, StatErr := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/"); os.IsNotExist(StatErr) {
+ MkdirErr := os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/data/", 0666)
+ if MkdirErr != nil {
+ err = MkdirErr
+ return
+ }
+ }
+ if _, StatErr := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/user/"); os.IsNotExist(StatErr) {
+ MkdirErr := os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/data/user/", 0666)
+ if MkdirErr != nil {
+ err = MkdirErr
+ return
+ }
+ }
+ opts := badger.DefaultOptions
+ opts.SyncWrites = false
+ opts.Dir = filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/user"
+ opts.ValueDir = filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/user"
+
+ expDB, DBErr := badger.Open(opts)
+ if DBErr != nil {
+ err = DBErr
return
}
- }
- expDB, DBErr := buntdb.Open(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/userData.db")
- if DBErr != nil {
- err = DBErr
+
+ UserDB = expDB
+ })
+
+ if UserDB == nil {
+ log.Println(UserDB)
+ err = errors.New("missing UserDB")
return
}
- db = expDB
+ db = UserDB
return
}
@@ -58,33 +109,37 @@ func CacheMessageEvents(id, sender, roomID, message string, timestamp int64) (er
err = DBOpenErr
return
}
- defer db.Close()
// Update cache
- DBerr := db.Update(func(tx *buntdb.Tx) error {
- _, _, DBSetIDErr := tx.Set("room|"+roomID+"|messages|"+id+"|id", id, nil)
- if DBSetIDErr != nil {
- return DBSetIDErr
- }
-
- _, _, DBSetSenderErr := tx.Set("room|"+roomID+"|messages|"+id+"|sender", sender, nil)
- if DBSetSenderErr != nil {
- return DBSetSenderErr
- }
+ txn := db.NewTransaction(true) // Read-write txn
+ DBSetIDErr := txn.Set([]byte("room|"+roomID+"|messages|"+id+"|id"), []byte(id))
+ if DBSetIDErr != nil {
+ err = DBSetIDErr
+ return
+ }
- _, _, DBSetMessageErr := tx.Set("room|"+roomID+"|messages|"+id+"|message", message, nil)
- if DBSetMessageErr != nil {
- return DBSetMessageErr
- }
+ DBSetSenderErr := txn.Set([]byte("room|"+roomID+"|messages|"+id+"|sender"), []byte(sender))
+ if DBSetSenderErr != nil {
+ err = DBSetSenderErr
+ return
+ }
- timestampString := strconv.FormatInt(timestamp, 10)
- _, _, DBSeTimestampErr := tx.Set("room|"+roomID+"|messages|"+id+"|timestamp", timestampString, nil)
- return DBSeTimestampErr
+ DBSetMessageErr := txn.Set([]byte("room|"+roomID+"|messages|"+id+"|message"), []byte(message))
+ if DBSetMessageErr != nil {
+ err = DBSetMessageErr
+ return
+ }
- })
- if DBerr != nil {
- err = DBerr
+ timestampString := strconv.FormatInt(timestamp, 10)
+ DBSeTimestampErr := txn.Set([]byte("room|"+roomID+"|messages|"+id+"|timestamp"), []byte(timestampString))
+ if DBSeTimestampErr != nil {
+ err = DBSeTimestampErr
return
}
+ CommitErr := txn.Commit(nil)
+ if CommitErr != nil {
+ err = CommitErr
+ }
+
return
}
diff --git a/matrix/db/userDataDB_test.go b/matrix/db/userDataDB_test.go
@@ -4,14 +4,15 @@ import (
"os"
"path/filepath"
+ "github.com/dgraph-io/badger"
. "github.com/onsi/ginkgo"
+
//. "github.com/onsi/gomega"
"github.com/shibukawa/configdir"
- "github.com/tidwall/buntdb"
)
// OpenUserDB opens or generates the Database file for settings and Cache
-func OpenUserDBTest() (db *buntdb.DB, err error) {
+func OpenUserDBTest() (db *badger.DB, err error) {
// Open the data.db file. It will be created if it doesn't exist.
configDirs := configdir.New("Nordgedanken", "Morpheus")
if _, StatErr := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/tests/"); os.IsNotExist(StatErr) {
@@ -28,7 +29,25 @@ func OpenUserDBTest() (db *buntdb.DB, err error) {
return
}
}
- expDB, DBErr := buntdb.Open(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/tests/data/userData.db")
+ if _, StatErr := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/tests/data/user/"); os.IsNotExist(StatErr) {
+ MkdirErr := os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/tests/data/user/", 0666)
+ if MkdirErr != nil {
+ err = MkdirErr
+ return
+ }
+ }
+ if _, StatErr := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/tests/data/userValue/"); os.IsNotExist(StatErr) {
+ MkdirErr := os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/tests/data/userValue/", 0666)
+ if MkdirErr != nil {
+ err = MkdirErr
+ return
+ }
+ }
+ opts := badger.DefaultOptions
+ opts.Dir = filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/tests/data/user/"
+ opts.ValueDir = filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/tests/data/userValue/"
+
+ expDB, DBErr := badger.Open(opts)
if DBErr != nil {
err = DBErr
return
@@ -39,10 +58,10 @@ func OpenUserDBTest() (db *buntdb.DB, err error) {
}
var _ = Describe("UserDataDB", func() {
- var db *buntdb.DB
+ var db *badger.DB
/*BeforeEach(func() {
- DBErr := db.Update(func(tx *buntdb.Tx) error {
- DeleteErr := tx.DeleteAll()
+ DBErr := db.Update(func(txn *badger.Txn) error {
+ DeleteErr := txn.DeleteAll()
return DeleteErr
})
if DBErr != nil {
diff --git a/matrix/login.go b/matrix/login.go
@@ -7,7 +7,6 @@ import (
"github.com/Nordgedanken/Morpheus/matrix/db"
"github.com/matrix-org/gomatrix"
- "github.com/tidwall/buntdb"
)
//GetClient returns a Client
@@ -16,7 +15,6 @@ func GetClient(homeserverURL, userID, accessToken string) (client *gomatrix.Clie
if DBOpenErr != nil {
localLog.Fatalln(DBOpenErr)
}
- defer db.Close()
client, ClientErr := gomatrix.NewClient(homeserverURL, userID, accessToken)
if ClientErr != nil {
@@ -24,25 +22,29 @@ func GetClient(homeserverURL, userID, accessToken string) (client *gomatrix.Clie
return
}
- DBErr := db.Update(func(tx *buntdb.Tx) error {
- _, _, DBSetAccessTokenErr := tx.Set("user|accessToken", client.AccessToken, nil)
- if DBSetAccessTokenErr != nil {
- return DBSetAccessTokenErr
- }
+ txn := db.NewTransaction(true) // Read-write txn
+ DBSetAccessTokenErr := txn.Set([]byte("user|accessToken"), []byte(client.AccessToken))
+ if DBSetAccessTokenErr != nil {
+ err = DBSetAccessTokenErr
+ return
+ }
- _, _, DBSetHomeserverURLErr := tx.Set("user|homeserverURL", client.HomeserverURL.String(), nil)
- if DBSetHomeserverURLErr != nil {
- return DBSetHomeserverURLErr
- }
+ DBSetHomeserverURLErr := txn.Set([]byte("user|homeserverURL"), []byte(client.HomeserverURL.String()))
+ if DBSetHomeserverURLErr != nil {
+ err = DBSetHomeserverURLErr
+ return
+ }
- _, _, DBSetUserIDErr := tx.Set("user|userID", client.UserID, nil)
- return DBSetUserIDErr
- })
- if DBErr != nil {
- err = DBErr
+ DBSetUserIDErr := txn.Set([]byte("user|userID"), []byte(client.UserID))
+ if DBSetUserIDErr != nil {
+ err = DBSetUserIDErr
return
}
+ CommitErr := txn.Commit(nil)
+ if CommitErr != nil {
+ err = CommitErr
+ }
return
}
@@ -76,29 +78,33 @@ func LoginUser(username, password string) (*gomatrix.Client, error) {
if DBOpenErr != nil {
localLog.Fatalln(DBOpenErr)
}
- defer db.Close()
cli.SetCredentials(resp.UserID, resp.AccessToken)
- DBerr := db.Update(func(tx *buntdb.Tx) error {
- _, _, DBSetAccessTokenErr := tx.Set("user|accessToken", resp.AccessToken, nil)
- if DBSetAccessTokenErr != nil {
- return DBSetAccessTokenErr
- }
- _, _, DBSetDeviceIDErr := tx.Set("user|deviceID", resp.DeviceID, nil)
- if DBSetDeviceIDErr != nil {
- return DBSetDeviceIDErr
- }
+ txn := db.NewTransaction(true) // Read-write txn
+ DBSetAccessTokenErr := txn.Set([]byte("user|accessToken"), []byte(resp.AccessToken))
+ if DBSetAccessTokenErr != nil {
+ return nil, DBSetAccessTokenErr
+ }
- _, _, DBSetHomeserverURLErr := tx.Set("user|homeserverURL", resp.HomeServer, nil)
- if DBSetHomeserverURLErr != nil {
- return DBSetHomeserverURLErr
- }
+ DBSetDeviceIDErr := txn.Set([]byte("user|deviceID"), []byte(resp.DeviceID))
+ if DBSetDeviceIDErr != nil {
+ return nil, DBSetDeviceIDErr
+ }
- _, _, DBSetUserIDErr := tx.Set("user|userID", resp.UserID, nil)
- return DBSetUserIDErr
- })
- if DBerr != nil {
- return nil, DBerr
+ DBSetHomeserverURLErr := txn.Set([]byte("user|homeserverURL"), []byte(resp.HomeServer))
+ if DBSetHomeserverURLErr != nil {
+ return nil, DBSetHomeserverURLErr
+ }
+
+ DBSetUserIDErr := txn.Set([]byte("user|userID"), []byte(resp.UserID))
+ if DBSetUserIDErr != nil {
+ return nil, DBSetUserIDErr
+
+ }
+
+ CommitErr := txn.Commit(nil)
+ if CommitErr != nil {
+ return nil, CommitErr
}
return cli, nil
}
diff --git a/matrix/rooms.go b/matrix/rooms.go
@@ -2,15 +2,16 @@ package matrix
import (
"bytes"
+ "fmt"
"image"
"image/draw"
"image/png"
"strings"
"github.com/Nordgedanken/Morpheus/matrix/db"
+ "github.com/dgraph-io/badger"
"github.com/matrix-org/gomatrix"
"github.com/therecipe/qt/gui"
- "github.com/tidwall/buntdb"
)
// Room saves the information of a Room
@@ -65,20 +66,23 @@ func (r *Room) GetRoomAvatar() (avatarResp *gui.QPixmap, err error) {
if DBOpenErr != nil {
localLog.Fatalln(DBOpenErr)
}
- defer db.Close()
// Init local vars
var roomAvatarData string
var IMGdata string
// Get cache
- DBErr := db.View(func(tx *buntdb.Tx) error {
- QueryErr := tx.AscendKeys("room|"+r.RoomID+"|84x84",
- func(key, value string) bool {
- roomAvatarData = value
- return true
- })
- return QueryErr
+ DBErr := db.View(func(txn *badger.Txn) error {
+ roomAvatarDataItem, QueryErr := txn.Get([]byte("room|" + r.RoomID + "|84x84"))
+ if QueryErr != nil && QueryErr != badger.ErrKeyNotFound {
+ return QueryErr
+ }
+ if QueryErr != badger.ErrKeyNotFound {
+ roomAvatarDataBytes, roomAvatarDataErr := roomAvatarDataItem.Value()
+ roomAvatarData = fmt.Sprintf("%s", roomAvatarDataBytes)
+ return roomAvatarDataErr
+ }
+ return nil
})
if DBErr != nil {
err = DBErr
@@ -120,12 +124,10 @@ func (r *Room) GetRoomAvatar() (avatarResp *gui.QPixmap, err error) {
}
// Update cache
- DBerr := db.Update(func(tx *buntdb.Tx) error {
- _, _, DBSetErr := tx.Set("room|"+r.RoomID+"|84x84", IMGdata, nil)
- return DBSetErr
- })
- if DBerr != nil {
- err = DBErr
+ txn := db.NewTransaction(true) // Read-write txn
+ DBSetErr := txn.Set([]byte("room|"+r.RoomID+"|84x84"), []byte(IMGdata))
+ if DBSetErr != nil {
+ err = DBSetErr
return
}
} else {
diff --git a/matrix/user.go b/matrix/user.go
@@ -2,9 +2,12 @@ package matrix
import (
"bytes"
+ "fmt"
"image"
"image/color"
"image/draw"
+ // image/jpeg needed to load jpeg images
+ _ "image/jpeg"
"image/png"
"log"
"os"
@@ -13,17 +16,16 @@ import (
"unicode"
"unicode/utf8"
+ "github.com/Nordgedanken/Morpheus/matrix/db"
"github.com/Nordgedanken/Morpheus/util"
"github.com/disintegration/letteravatar"
"github.com/matrix-org/gomatrix"
"github.com/therecipe/qt/gui"
- "github.com/tidwall/buntdb"
- // image/jpeg needed to load jpeg images
- _ "image/jpeg"
+ "github.com/dgraph-io/badger"
// golang.org/x/image/webp needed to load webp images
- "github.com/Nordgedanken/Morpheus/matrix/db"
_ "golang.org/x/image/webp"
+
// golang.org/x/image/bmp needed to load bmp images
_ "golang.org/x/image/bmp"
)
@@ -99,23 +101,24 @@ func GetUserAvatar(cli *gomatrix.Client, mxid string, size int) (avatarResp *gui
if DBOpenErr != nil {
localLog.Fatalln(DBOpenErr)
}
- defer db.Close()
// Init local vars
var avatarData string
var IMGdata string
// Get cache
- DBErr := db.View(func(tx *buntdb.Tx) error {
- QueryErr := tx.AscendKeys("user|"+mxid+"|avatarData"+strconv.Itoa(size)+"x"+strconv.Itoa(size),
- func(key, value string) bool {
- avatarData = value
- return true
- })
- return QueryErr
- })
- if DBErr != nil {
- err = DBErr
+ txn := db.NewTransaction(false)
+ avatarDataItem, QueryErr := txn.Get([]byte("user|" + mxid + "|avatarData" + strconv.Itoa(size) + "x" + strconv.Itoa(size)))
+ if QueryErr != nil && QueryErr != badger.ErrKeyNotFound {
+ err = QueryErr
+ return
+ }
+ if QueryErr != badger.ErrKeyNotFound {
+ avatarDataByte, avatarDataErr := avatarDataItem.Value()
+ avatarData = fmt.Sprintf("%s", avatarDataByte)
+ if avatarDataErr != nil {
+ err = avatarDataErr
+ }
return
}
@@ -159,12 +162,10 @@ func GetUserAvatar(cli *gomatrix.Client, mxid string, size int) (avatarResp *gui
}
// Update cache
- DBerr := db.Update(func(tx *buntdb.Tx) error {
- _, _, DBSetErr := tx.Set("user|"+mxid+"|avatarData"+strconv.Itoa(size)+"x"+strconv.Itoa(size), IMGdata, nil)
- return DBSetErr
- })
- if DBerr != nil {
- err = DBErr
+ txn := db.NewTransaction(true)
+ DBSetErr := txn.Set([]byte("user|"+mxid+"|avatarData"+strconv.Itoa(size)+"x"+strconv.Itoa(size)), []byte(IMGdata))
+ if DBSetErr != nil {
+ err = DBSetErr
return
}
} else {
diff --git a/testSpec_test.go b/testSpec_test.go
@@ -0,0 +1,15 @@
+package main_test
+
+import (
+ "fmt"
+)
+
+var _ = Describe("TestSpec", func() {
+ Describe("Test", func() {
+ Context("opening", func() {
+ It("should print Test", func() {
+ fmt.Println("test")
+ })
+ })
+ })
+})
diff --git a/ui/MainUI.go b/ui/MainUI.go
@@ -5,18 +5,16 @@ import (
"log"
"sync"
- "strconv"
-
"github.com/Nordgedanken/Morpheus/matrix"
"github.com/Nordgedanken/Morpheus/matrix/db"
"github.com/Nordgedanken/Morpheus/util"
+ "github.com/dgraph-io/badger"
"github.com/matrix-org/gomatrix"
"github.com/rhinoman/go-commonmark"
"github.com/therecipe/qt/core"
"github.com/therecipe/qt/gui"
"github.com/therecipe/qt/uitools"
"github.com/therecipe/qt/widgets"
- "github.com/tidwall/buntdb"
)
// NewMainUIStruct gives you a MainUI struct with prefilled data
@@ -38,6 +36,7 @@ func NewMainUIStructWithExistingConfig(configStruct config, window *widgets.QMai
mainUIStruct = MainUI{
config: configStruct,
window: window,
+ rooms: make(map[string]*matrix.Room),
}
return
}
@@ -238,15 +237,24 @@ func (m *MainUI) logout(widget *widgets.QWidget, messageScrollArea *widgets.QScr
if DBOpenErr != nil {
localLog.Fatalln(DBOpenErr)
}
- defer db.Close()
//Flush complete DB
- DBErr := db.Update(func(tx *buntdb.Tx) error {
- QueryErr := tx.DeleteAll()
- return QueryErr
- })
- if DBErr != nil {
- localLog.Panicln(DBErr)
+ txn := db.NewTransaction(true) // Read-write txn
+ QueryErr := txn.Delete([]byte(""))
+ if QueryErr != nil {
+ localLog.Println(QueryErr)
+ results <- false
+ }
+
+ CommitErr := txn.Commit(nil)
+ if CommitErr != nil {
+ localLog.Println(CommitErr)
+ results <- false
+ }
+
+ DBPurgeErr := db.PurgeOlderVersions()
+ if DBPurgeErr != nil {
+ localLog.Println(DBPurgeErr)
results <- false
} else {
results <- true
@@ -351,10 +359,24 @@ func (m *MainUI) loadCache() (err error) {
if DBOpenErr != nil {
err = DBOpenErr
}
- defer db.Close()
- DBerr := db.View(func(tx *buntdb.Tx) error {
- IDErr := tx.AscendKeys("room|"+m.currentRoom+"|messages|*|id", func(_, id string) bool {
+ DBerr := db.View(func(txn *badger.Txn) error {
+ MsgOpts := badger.DefaultIteratorOptions
+ MsgOpts.PrefetchSize = 10
+ MsgIt := txn.NewIterator(MsgOpts)
+ MsgPrefix := []byte("room|" + m.currentRoom + "|messages|")
+ for MsgIt.Seek(MsgPrefix); MsgIt.ValidForPrefix(MsgPrefix); MsgIt.Next() {
+ item := MsgIt.Item()
+ k := item.Key()
+ value, err := item.Value()
+ if err != nil {
+ return err
+ }
+ fmt.Sprintf("Value: %s Key: %s", value, k)
+ //msg := fmt.Sprintf("%s", value)
+ }
+
+ /*IDErr := tx.AscendKeys("room|"+m.currentRoom+"|messages|*|id", func(_, id string) bool {
msg, GetMsgErr := tx.Get("room|" + m.currentRoom + "|messages|" + id + "|message")
if GetMsgErr != nil {
fmt.Println("GetMsgErr: ", GetMsgErr)
@@ -374,13 +396,13 @@ func (m *MainUI) loadCache() (err error) {
if ConvErr != nil {
return false
}
- m.MessageListLayout.TriggerMessage(msg, sender, timestampInt)
+
return true
})
if IDErr != nil {
fmt.Println("IDErr: ", IDErr)
return IDErr
- }
+ }*/
return nil
})
if DBerr != nil {