This repository has been archived on 2025-03-16. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
boilerplate/internal/database/database.go
2025-03-09 20:10:48 +07:00

88 lines
1.6 KiB
Go

package database
import (
"app/internal/dal"
"log"
"os"
"sync"
"time"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
var (
db *gorm.DB
once sync.Once
)
const Path = "database.db"
func initialize() error {
var err error
newLogger := logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
logger.Config{
SlowThreshold: time.Second, // Slow SQL threshold
LogLevel: logger.Info, // Log level
IgnoreRecordNotFoundError: false, // Ignore ErrRecordNotFound error for logger
ParameterizedQueries: false, // Don't include params in the SQL log
Colorful: true, // Disable color
},
)
db, err = gorm.Open(sqlite.Open("file:"+Path+"?_fk=1"), &gorm.Config{
Logger: newLogger,
FullSaveAssociations: false,
})
if err != nil {
return err
}
if res := db.Exec(`PRAGMA foreign_keys = ON`); res.Error != nil {
return res.Error
}
if err := limitConnectionPool(); err != nil {
return err
}
dal.SetDefault(db)
log.Println("Initialized database")
return nil
}
func limitConnectionPool() error {
sqlDB, err := db.DB()
if err != nil {
return err
}
sqlDB.SetMaxIdleConns(10)
sqlDB.SetMaxOpenConns(100)
sqlDB.SetConnMaxLifetime(time.Hour)
return nil
}
func Shutdown() error {
db, err := db.DB()
if err != nil {
return err
}
err = db.Close()
if err != nil {
return err
}
once = sync.Once{}
return nil
}
func GetInstance() *gorm.DB {
once.Do(func() {
err := initialize()
if err != nil {
panic(err)
}
})
return db
}