db.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package database
  2. import (
  3. "bytes"
  4. "io"
  5. "io/fs"
  6. "os"
  7. "path"
  8. "x-ui/config"
  9. "x-ui/database/model"
  10. "x-ui/xray"
  11. "gorm.io/driver/sqlite"
  12. "gorm.io/gorm"
  13. "gorm.io/gorm/logger"
  14. )
  15. var db *gorm.DB
  16. var initializers = []func() error{
  17. initUser,
  18. initInbound,
  19. initSetting,
  20. initInboundClientIps,
  21. initClientTraffic,
  22. }
  23. func initUser() error {
  24. err := db.AutoMigrate(&model.User{})
  25. if err != nil {
  26. return err
  27. }
  28. var count int64
  29. err = db.Model(&model.User{}).Count(&count).Error
  30. if err != nil {
  31. return err
  32. }
  33. if count == 0 {
  34. user := &model.User{
  35. Username: "admin",
  36. Password: "admin",
  37. LoginSecret: "",
  38. }
  39. return db.Create(user).Error
  40. }
  41. return nil
  42. }
  43. func initInbound() error {
  44. return db.AutoMigrate(&model.Inbound{})
  45. }
  46. func initSetting() error {
  47. return db.AutoMigrate(&model.Setting{})
  48. }
  49. func initInboundClientIps() error {
  50. return db.AutoMigrate(&model.InboundClientIps{})
  51. }
  52. func initClientTraffic() error {
  53. return db.AutoMigrate(&xray.ClientTraffic{})
  54. }
  55. func InitDB(dbPath string) error {
  56. dir := path.Dir(dbPath)
  57. err := os.MkdirAll(dir, fs.ModePerm)
  58. if err != nil {
  59. return err
  60. }
  61. var gormLogger logger.Interface
  62. if config.IsDebug() {
  63. gormLogger = logger.Default
  64. } else {
  65. gormLogger = logger.Discard
  66. }
  67. c := &gorm.Config{
  68. Logger: gormLogger,
  69. }
  70. db, err = gorm.Open(sqlite.Open(dbPath), c)
  71. if err != nil {
  72. return err
  73. }
  74. for _, initialize := range initializers {
  75. if err := initialize(); err != nil {
  76. return err
  77. }
  78. }
  79. return nil
  80. }
  81. func GetDB() *gorm.DB {
  82. return db
  83. }
  84. func IsNotFound(err error) bool {
  85. return err == gorm.ErrRecordNotFound
  86. }
  87. func IsSQLiteDB(file io.ReaderAt) (bool, error) {
  88. signature := []byte("SQLite format 3\x00")
  89. buf := make([]byte, len(signature))
  90. _, err := file.ReadAt(buf, 0)
  91. if err != nil {
  92. return false, err
  93. }
  94. return bytes.Equal(buf, signature), nil
  95. }