85 lines
1.5 KiB
Go
85 lines
1.5 KiB
Go
package database
|
|
|
|
import (
|
|
"fmt"
|
|
"log/slog"
|
|
|
|
"gorm.io/driver/mysql"
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
|
|
"zeromesh/internal/config"
|
|
"zeromesh/internal/model"
|
|
)
|
|
|
|
type DB struct {
|
|
*gorm.DB
|
|
}
|
|
|
|
func Init(cfg *config.DatabaseConfig) (*DB, error) {
|
|
var db *gorm.DB
|
|
var err error
|
|
|
|
switch cfg.Driver {
|
|
case "mysql":
|
|
dsn := cfg.BuildDSN()
|
|
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
|
|
case "sqlite":
|
|
fallthrough
|
|
default:
|
|
db, err = gorm.Open(sqlite.Open(cfg.SQLite.Path), &gorm.Config{})
|
|
}
|
|
|
|
if err != nil {
|
|
return nil, fmt.Errorf("open database: %w", err)
|
|
}
|
|
|
|
sqlDB, err := db.DB()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("get sql db: %w", err)
|
|
}
|
|
|
|
if cfg.Driver == "mysql" {
|
|
sqlDB.SetMaxIdleConns(cfg.MySQL.MaxIdleConns)
|
|
sqlDB.SetMaxOpenConns(cfg.MySQL.MaxOpenConns)
|
|
}
|
|
|
|
if cfg.AutoMigrate {
|
|
if err := db.AutoMigrate(
|
|
&model.User{},
|
|
&model.Network{},
|
|
&model.NetworkMember{},
|
|
&model.Node{},
|
|
&model.Config{},
|
|
&model.ApiLog{},
|
|
&model.ErrorLog{},
|
|
); err != nil {
|
|
return nil, fmt.Errorf("auto migrate: %w", err)
|
|
}
|
|
}
|
|
|
|
if cfg.InitData {
|
|
seedData(db)
|
|
}
|
|
|
|
slog.Info("database initialized", "driver", cfg.Driver)
|
|
return &DB{db}, nil
|
|
}
|
|
|
|
func seedData(db *gorm.DB) {
|
|
var count int64
|
|
db.Model(&model.Config{}).Count(&count)
|
|
if count > 0 {
|
|
return
|
|
}
|
|
|
|
defaults := []model.Config{
|
|
{Key: "allow_register", Value: "true"},
|
|
{Key: "default_network_pool", Value: "10.147.0.0/16"},
|
|
}
|
|
for _, c := range defaults {
|
|
db.Create(&c)
|
|
}
|
|
slog.Info("seed data inserted")
|
|
}
|