Skip to content
Snippets Groups Projects
main.go 2.54 KiB
Newer Older
  • Learn to ignore specific revisions
  • package database
    
    import (
    	"fmt"
    	"os"
    	"time"
    
    	"github.com/glebarez/sqlite"
    	gormloggerlogrus "github.com/nekomeowww/gorm-logger-logrus"
    	"github.com/sirupsen/logrus"
    	"gorm.io/driver/mysql"
    	"gorm.io/gorm"
    	"gorm.io/gorm/logger"
    	"jonasled.dev/jonasled/ems-esp-logger/database/tables"
    	"jonasled.dev/jonasled/ems-esp-logger/log"
    )
    
    var Db *gorm.DB
    
    func Init() {
    	var err error
    	var dbdriver gorm.Dialector
    	switch os.Getenv("OUTPUT_DATABASE_TYPE") {
    	case "sqlite":
    		dbdriver = sqlite.Open(os.Getenv("OUTPUT_DATABSE"))
    	case "mysql":
    		dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
    			os.Getenv("OUTPUT_DATABASE_USER"),
    			os.Getenv("OUTPUT_DATABASE_PASSWORD"),
    			os.Getenv("OUTPUT_DATABASE_HOST"),
    			os.Getenv("OUTPUT_DATABSE"),
    		)
    		dbdriver = mysql.Open(dsn)
    	default:
    		log.Log.Fatal("Please set OUTPUT_DATABASE_TYPE to a valid value")
    	}
    	Db, err = gorm.Open(dbdriver, &gorm.Config{
    		Logger: gormloggerlogrus.New(gormloggerlogrus.Options{
    			Logger:                    logrus.NewEntry(log.Log),
    			LogLevel:                  logger.Error,
    			IgnoreRecordNotFoundError: false,
    			SlowThreshold:             time.Millisecond * 200,
    			FileWithLineNumField:      "file",
    		}),
    	})
    
    	if err != nil {
    		log.Log.Fatal("Failed initializing database: ", err.Error())
    	}
    
    	if os.Getenv("OUTPUT_DATABASE_EXECUTE_MIGRATIONS") != "false" {
    		log.Log.Info("Executing database migrations")
    
    		Db.AutoMigrate(&tables.Instance{}, &tables.ValueType{}, &tables.Value{})
    
    	}
    }
    
    func CreateInstance() {
    	instanceName := os.Getenv("INSTANCE_NAME")
    	instanceDescription := os.Getenv("INSTANCE_DESCRIPTION")
    	if instanceName == "" || instanceDescription == "" {
    		log.Log.Fatal("INSTANCE_NAME and INSTANCE_DESCRIPTION must be set")
    	}
    	var instance tables.Instance
    	err := Db.Where("name = ?", instanceName).First(&instance).Error
    
    	if err != nil {
    		if err == gorm.ErrRecordNotFound {
    			// Create a new instance if it doesn't exist
    			instance = tables.Instance{
    				Name:        instanceName,
    				Description: instanceDescription,
    			}
    			if err := Db.Create(&instance).Error; err != nil {
    				log.Log.Fatalf("Failed to create instance: %v", err)
    			}
    			log.Log.Infof("Created new instance: %+v\n", instance)
    		} else {
    			log.Log.Fatalf("Failed to query database: %v", err)
    		}
    	} else {
    		// Update the description if the instance exists
    		instance.Description = instanceDescription
    		if err := Db.Save(&instance).Error; err != nil {
    			log.Log.Fatalf("Failed to update instance description: %v", err)
    		}
    		log.Log.Infof("Updated instance description: %+v\n", instance)
    	}
    }