morpheus

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

db.go (3970B)


      1 package db
      2 
      3 import (
      4 	"errors"
      5 	"os"
      6 	"path/filepath"
      7 	"strconv"
      8 	"sync"
      9 
     10 	"github.com/dgraph-io/badger"
     11 	"github.com/shibukawa/configdir"
     12 )
     13 
     14 var UserDB *badger.DB
     15 var CacheDB *badger.DB
     16 var onceCache sync.Once
     17 var onceUser sync.Once
     18 
     19 // OpenCacheDB opens or generates the Database file for settings and Cache
     20 func OpenCacheDB() (db *badger.DB, err error) {
     21 	onceCache.Do(func() {
     22 		// Open the data.db file. It will be created if it doesn't exist.
     23 		configDirs := configdir.New("Nordgedanken", "Morpheus")
     24 		if _, StatErr := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/"); os.IsNotExist(StatErr) {
     25 			MkdirErr := os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/data/", 0666)
     26 			if MkdirErr != nil {
     27 				err = MkdirErr
     28 				return
     29 			}
     30 		}
     31 		if _, StatErr := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/cache/"); os.IsNotExist(StatErr) {
     32 			MkdirErr := os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/data/cache/", 0666)
     33 			if MkdirErr != nil {
     34 				err = MkdirErr
     35 				return
     36 			}
     37 		}
     38 		opts := badger.DefaultOptions
     39 		opts.SyncWrites = false
     40 		opts.Dir = filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/cache"
     41 		opts.ValueDir = filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/cache"
     42 
     43 		expDB, DBErr := badger.Open(opts)
     44 		if DBErr != nil {
     45 			err = DBErr
     46 			return
     47 		}
     48 		CacheDB = expDB
     49 	})
     50 
     51 	if CacheDB == nil {
     52 		err = errors.New("missing CacheDB")
     53 		return
     54 	}
     55 
     56 	db = CacheDB
     57 	return
     58 }
     59 
     60 // OpenUserDB opens or generates the Database file for settings and Cache
     61 func OpenUserDB() (db *badger.DB, err error) {
     62 	onceUser.Do(func() {
     63 		// Open the data.db file. It will be created if it doesn't exist.
     64 		configDirs := configdir.New("Nordgedanken", "Morpheus")
     65 		if _, StatErr := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/"); os.IsNotExist(StatErr) {
     66 			MkdirErr := os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/data/", 0666)
     67 			if MkdirErr != nil {
     68 				err = MkdirErr
     69 				return
     70 			}
     71 		}
     72 		if _, StatErr := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/user/"); os.IsNotExist(StatErr) {
     73 			MkdirErr := os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/data/user/", 0666)
     74 			if MkdirErr != nil {
     75 				err = MkdirErr
     76 				return
     77 			}
     78 		}
     79 		opts := badger.DefaultOptions
     80 		opts.SyncWrites = false
     81 		opts.Dir = filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/user"
     82 		opts.ValueDir = filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/user"
     83 
     84 		expDB, DBErr := badger.Open(opts)
     85 		if DBErr != nil {
     86 			err = DBErr
     87 			return
     88 		}
     89 
     90 		UserDB = expDB
     91 	})
     92 
     93 	if UserDB == nil {
     94 		err = errors.New("missing UserDB")
     95 		return
     96 	}
     97 
     98 	db = UserDB
     99 	return
    100 }
    101 
    102 // CacheMessageEvents writes message infos into the cache into the defined room
    103 func CacheMessageEvents(id, sender, roomID, message string, timestamp int64) (err error) {
    104 	db, DBOpenErr := OpenCacheDB()
    105 	if DBOpenErr != nil {
    106 		err = DBOpenErr
    107 		return
    108 	}
    109 
    110 	// Update cache
    111 	DBerr := db.Update(func(txn *badger.Txn) error {
    112 		DBSetIDErr := txn.Set([]byte("room|"+roomID+"|messages|"+id+"|id"), []byte(id))
    113 		if DBSetIDErr != nil {
    114 			return DBSetIDErr
    115 		}
    116 
    117 		DBSetSenderErr := txn.Set([]byte("room|"+roomID+"|messages|"+id+"|sender"), []byte(sender))
    118 		if DBSetSenderErr != nil {
    119 			return DBSetSenderErr
    120 		}
    121 
    122 		DBSetMessageErr := txn.Set([]byte("room|"+roomID+"|messages|"+id+"|messageString"), []byte(message))
    123 		if DBSetMessageErr != nil {
    124 			return DBSetMessageErr
    125 		}
    126 
    127 		timestampString := strconv.FormatInt(timestamp, 10)
    128 		DBSeTimestampErr := txn.Set([]byte("room|"+roomID+"|messages|"+id+"|timestamp"), []byte(timestampString))
    129 		return DBSeTimestampErr
    130 	})
    131 
    132 	if DBerr != nil {
    133 		err = DBerr
    134 		return
    135 	}
    136 
    137 	return
    138 }