morpheus

A Matrix client written in Go-QT
git clone git://archive.git.mtrnord.blog/Nordgedanken/morpheus.git
Log | Files | Refs | README | LICENSE

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:
AMorpheus_suite_test.go | 13+++++++++++++
Mmain.go | 75++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
Mmatrix/db/db.go | 147++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
Mmatrix/db/userDataDB_test.go | 31+++++++++++++++++++++++++------
Mmatrix/login.go | 76+++++++++++++++++++++++++++++++++++++++++-----------------------------------
Mmatrix/rooms.go | 32+++++++++++++++++---------------
Mmatrix/user.go | 43++++++++++++++++++++++---------------------
AtestSpec_test.go | 15+++++++++++++++
Mui/MainUI.go | 52+++++++++++++++++++++++++++++++++++++---------------
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 {