db_opt.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package utils
  2. import (
  3. "encoding/json"
  4. "io/ioutil"
  5. "math/rand"
  6. "os"
  7. "sync"
  8. "time"
  9. )
  10. func SaveDb(lock *sync.Mutex, val interface{}, fileName string) (err error) {
  11. lock.Lock()
  12. defer lock.Unlock()
  13. content, _ := json.Marshal(val)
  14. tmpName := RandString(16)
  15. err = ioutil.WriteFile(tmpName, content, 0666) //写入文件(字节数组)
  16. if err != nil {
  17. os.Remove(tmpName)
  18. panic("cannot SaveToBak, err:" + err.Error())
  19. } else {
  20. if exist, _ := PathExists(fileName); exist {
  21. if err := os.Remove(fileName); err != nil {
  22. panic("cannot remove, err:" + err.Error())
  23. }
  24. }
  25. if err := os.Rename(tmpName, fileName); err != nil {
  26. panic("cannot SaveToBak, err:" + err.Error())
  27. }
  28. }
  29. return
  30. }
  31. func LoadDb(lock *sync.Mutex, fileName string, val interface{}) (err error) {
  32. file, err := os.OpenFile(fileName, os.O_RDONLY, 0666)
  33. if err != nil {
  34. return
  35. }
  36. content, err := ioutil.ReadAll(file)
  37. if err != nil {
  38. return
  39. }
  40. err = json.Unmarshal(content, val)
  41. return
  42. }
  43. func RandString(len int) string {
  44. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  45. bytes := make([]byte, len)
  46. for i := 0; i < len; i++ {
  47. b := r.Intn(26) + 65
  48. bytes[i] = byte(b)
  49. }
  50. return string(bytes)
  51. }