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 }