feat: initialise project structure with core encoding queue, database models, and web management API
Build / Build and Push (push) Successful in 50s
Build / Build and Push (push) Successful in 50s
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
"goencode/internal/config"
|
||||
)
|
||||
|
||||
var DB *sql.DB
|
||||
|
||||
func Init(cfg *config.DatabaseConfig) error {
|
||||
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?parseTime=true",
|
||||
cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.Name)
|
||||
|
||||
var err error
|
||||
DB, err = sql.Open("mysql", dsn)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Set connection pool limits
|
||||
DB.SetMaxOpenConns(25)
|
||||
DB.SetMaxIdleConns(25)
|
||||
DB.SetConnMaxLifetime(5 * time.Minute)
|
||||
|
||||
if err = DB.Ping(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Println("Connected to MariaDB successfully")
|
||||
|
||||
return runMigrations()
|
||||
}
|
||||
|
||||
func runMigrations() error {
|
||||
queries := []string{
|
||||
`CREATE TABLE IF NOT EXISTS watch_folders (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
folder_path VARCHAR(500) NOT NULL UNIQUE,
|
||||
media_type ENUM('video', 'audio') NOT NULL,
|
||||
target_resolution VARCHAR(20),
|
||||
custom_ffmpeg_flags TEXT,
|
||||
enabled BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
)`,
|
||||
`CREATE TABLE IF NOT EXISTS jobs (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
file_path VARCHAR(500) NOT NULL,
|
||||
media_type ENUM('video', 'audio') NOT NULL,
|
||||
status ENUM('pending', 'processing', 'failed') NOT NULL DEFAULT 'pending',
|
||||
priority INT NOT NULL DEFAULT 0,
|
||||
original_size BIGINT DEFAULT 0,
|
||||
target_resolution VARCHAR(20),
|
||||
ffmpeg_flags TEXT,
|
||||
error_message TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
)`,
|
||||
`CREATE TABLE IF NOT EXISTS job_reports (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
file_path VARCHAR(500) NOT NULL,
|
||||
media_type ENUM('video', 'audio') NOT NULL,
|
||||
status ENUM('success', 'failed', 'skipped') NOT NULL,
|
||||
original_size BIGINT NOT NULL DEFAULT 0,
|
||||
encoded_size BIGINT NOT NULL DEFAULT 0,
|
||||
size_saved BIGINT NOT NULL DEFAULT 0,
|
||||
processing_time DECIMAL(10,2) DEFAULT 0,
|
||||
target_resolution VARCHAR(20),
|
||||
ffmpeg_flags TEXT,
|
||||
error_message TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
)`,
|
||||
`CREATE TABLE IF NOT EXISTS app_config (
|
||||
config_key VARCHAR(100) PRIMARY KEY,
|
||||
config_value TEXT
|
||||
)`,
|
||||
}
|
||||
|
||||
for _, q := range queries {
|
||||
if _, err := DB.Exec(q); err != nil {
|
||||
return fmt.Errorf("migration failed: %w\nQuery: %s", err, q)
|
||||
}
|
||||
}
|
||||
|
||||
log.Println("Database schemas initialized")
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user