db.go (1842B)
1 package db 2 3 import ( 4 "errors" 5 "github.com/SocialNetworkNews/SocialNetworkNews_API/config" 6 "github.com/dgraph-io/badger" 7 "os" 8 "path/filepath" 9 "sync" 10 ) 11 12 var DB *badger.DB 13 var onceDB sync.Once 14 15 func OpenDB() (db *badger.DB, err error) { 16 onceDB.Do(func() { 17 // Open the data.db file. It will be created if it doesn't exist. 18 filePath := config.ConfigPath() 19 20 if _, StatErr := os.Stat(filepath.Join(filePath, "data")); os.IsNotExist(StatErr) { 21 MkdirErr := os.MkdirAll(filepath.Join(filePath, "data"), 0700) 22 if MkdirErr != nil { 23 err = MkdirErr 24 return 25 } 26 } 27 if _, StatErr := os.Stat(filepath.Join(filePath, "data", "cache")); os.IsNotExist(StatErr) { 28 MkdirErr := os.MkdirAll(filepath.Join(filePath, "data", "cache"), 0700) 29 if MkdirErr != nil { 30 err = MkdirErr 31 return 32 } 33 } 34 opts := badger.DefaultOptions 35 opts.SyncWrites = false 36 opts.Dir = filepath.Join(filePath, "data", "cache") 37 opts.ValueDir = filepath.Join(filePath, "data", "cache") 38 39 if _, StatErr := os.Stat(filepath.Join(filePath, "data", "cache", "LOCK")); StatErr == nil { 40 DeleteErr := os.Remove(filepath.Join(filePath, "data", "cache", "LOCK")) 41 if DeleteErr != nil { 42 err = DeleteErr 43 return 44 } 45 } 46 47 expDB, DBErr := badger.Open(opts) 48 if DBErr != nil { 49 err = DBErr 50 return 51 } 52 DB = expDB 53 }) 54 55 if DB == nil { 56 err = errors.New("missing DB") 57 return 58 } 59 60 db = DB 61 return 62 } 63 64 // Get deduplicates all the Gets inside the Database to not repeat that much code. 65 func Get(txn *badger.Txn, key []byte) (result []byte, err error) { 66 item, QueryErr := txn.Get(key) 67 if QueryErr != nil && QueryErr != badger.ErrKeyNotFound { 68 err = QueryErr 69 return 70 } 71 if QueryErr != badger.ErrKeyNotFound { 72 valueByte, valueErr := item.Value() 73 result = valueByte 74 if valueErr != nil { 75 err = valueErr 76 return 77 } 78 } 79 return 80 }