aboutsummaryrefslogtreecommitdiffstats
path: root/internal/database/database.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--internal/database/database.go44
1 files changed, 44 insertions, 0 deletions
diff --git a/internal/database/database.go b/internal/database/database.go
new file mode 100644
index 0000000..8fc8a68
--- /dev/null
+++ b/internal/database/database.go
@@ -0,0 +1,44 @@
+package database
+
+import (
+ "fmt"
+ "time"
+
+ "gorm.io/driver/postgres"
+ "gorm.io/driver/sqlite" // Sqlite driver based on CGO
+ "gorm.io/gorm/logger"
+
+ // "github.com/glebarez/sqlite" // Pure go SQLite driver, checkout https://github.com/glebarez/sqlite for details
+ "donetick.com/core/config"
+ "donetick.com/core/logging"
+ "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:
+
+ db, err = gorm.Open(sqlite.Open("donetick.db"), &gorm.Config{})
+
+ }
+
+ if err != nil {
+ return nil, err
+ }
+ return db, nil
+}