wip (apply)

This commit is contained in:
2025-10-20 01:35:32 +02:00
parent 8ca8918966
commit a95dd4f3e0
14 changed files with 354 additions and 15 deletions

View File

@@ -0,0 +1,25 @@
package storage
import (
"embed"
"fmt"
"github.com/pressly/goose/v3"
)
//go:embed migrations/*.sql
var embedMigrations embed.FS
func (r *Repository) Migrate() error {
goose.SetBaseFS(embedMigrations)
if err := goose.SetDialect("sqlite3"); err != nil {
panic(err)
}
if err := goose.Up(r.db, "migrations"); err != nil {
return fmt.Errorf("failed to migrate the database: %s", err)
}
return nil
}

View File

@@ -0,0 +1,18 @@
-- +goose Up
CREATE TABLE Projects (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL
);
CREATE TABLE Repositories (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
schedule TEXT NOT NULL,
"source" TEXT NOT NULL,
destination TEXT NOT NULL,
project INTEGER NOT NULL
);
-- +goose Down
DROP TABLE Projects;

View File

@@ -0,0 +1,73 @@
package storage
import (
"database/sql"
"fmt"
"mirror-sync/pkg/project"
_ "github.com/glebarez/go-sqlite"
)
type (
Repository struct {
db *sql.DB
}
)
func OpenDB(path string) (*Repository, error) {
// connect
db, err := sql.Open("sqlite", path)
if err != nil {
return nil, fmt.Errorf("failed to open database: %s", err)
}
return &Repository{
db: db,
}, nil
}
func (r *Repository) Save(pr project.Project) (err error) {
tx, err := r.db.Begin()
if err != nil {
return fmt.Errorf("failed to create transaction: %s", err)
}
defer func() {
if err != nil {
tx.Rollback()
return
}
tx.Commit()
}()
stmt, err := tx.Prepare("INSERT INTO Projects (name) VALUES (?)")
if err != nil {
return fmt.Errorf("failed to create statement: %s", err)
}
if _, err := stmt.Exec(pr.Name); err != nil {
return fmt.Errorf("failed to execute sql query: %s", err)
}
rows, err := tx.Query("SELECT id FROM Projects WHERE name = ?", pr.Name)
if err != nil {
return fmt.Errorf("failed to query project id: %s", err)
}
defer rows.Close()
var id int
rows.Next()
if err := rows.Scan(&id); err != nil {
return fmt.Errorf("failed to query project id: %s", err)
}
for _, repo := range pr.Repositories {
stmt, err := tx.Prepare("INSERT INTO Repositories (name, source, destination, schedule, project) VALUES (?, ?, ?, ?, ?)")
if err != nil {
return fmt.Errorf("failed to create statement: %s", err)
}
if _, err := stmt.Exec(repo.Name, repo.Source, repo.Destination, repo.Schedule, id); err != nil {
return fmt.Errorf("failed to execute sql query: %s", err)
}
}
return nil
}