donetick/internal/database/database.go

51 lines
1.2 KiB
Go
Raw Permalink Normal View History

2024-07-01 02:41:41 +01:00
package database
import (
"fmt"
"os"
2024-07-01 02:41:41 +01:00
"time"
"gorm.io/driver/postgres"
// "gorm.io/driver/sqlite" // Sqlite driver based on CGO
2024-07-01 02:41:41 +01:00
"gorm.io/gorm/logger"
"donetick.com/core/config"
"donetick.com/core/logging"
"github.com/glebarez/sqlite" // Pure go SQLite driver, checkout https://github.com/glebarez/sqlite for details
2024-07-01 02:41:41 +01:00
"gorm.io/gorm"
)
func NewDatabase(cfg *config.Config) (*gorm.DB, error) {
var db *gorm.DB
var err error
switch cfg.Database.Type {
case "postgres":
dsn := fmt.Sprintf("host=%s port=%v user=%s password=%s dbname=%s sslmode=disable TimeZone=Asia/Shanghai", cfg.Database.Host, cfg.Database.Port, cfg.Database.User, cfg.Database.Password, cfg.Database.Name)
for i := 0; i <= 30; i++ {
db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
})
if err == nil {
break
}
logging.DefaultLogger().Warnf("failed to open database: %v", err)
time.Sleep(500 * time.Millisecond)
}
default:
path := os.Getenv("DT_SQLITE_PATH")
if path == "" {
db, err = gorm.Open(sqlite.Open("donetick.db"), &gorm.Config{})
} else {
db, err = gorm.Open(sqlite.Open(path), &gorm.Config{})
}
2024-07-01 02:41:41 +01:00
}
if err != nil {
return nil, err
}
return db, nil
}