socialnetworknews-api

git clone git://archive.git.mtrnord.blog/SocialNetworkNews/socialnetworknews-api.git
Log | Files | Refs | LICENSE

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 }