117 lines
2.7 KiB
Go
117 lines
2.7 KiB
Go
package data
|
|
|
|
import (
|
|
"database/sql"
|
|
"log"
|
|
"time"
|
|
|
|
_ "modernc.org/sqlite" // Importiert den SQLite-Treiber
|
|
)
|
|
|
|
type DatabaseService struct {
|
|
DB *sql.DB
|
|
}
|
|
|
|
func NewDatabaseService(dbPath string) (*DatabaseService, error) {
|
|
db, err := sql.Open("sqlite", dbPath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err = db.Ping(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
createTableSQL := `
|
|
CREATE TABLE IF NOT EXISTS training (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
date TEXT NOT NULL,
|
|
sets INTEGER,
|
|
weightLeft REAL,
|
|
weightRight REAL,
|
|
repsPerSet INTEGER,
|
|
duration INTEGER,
|
|
program TEXT,
|
|
blockDay INTEGER
|
|
);`
|
|
|
|
_, err = db.Exec(createTableSQL)
|
|
if err != nil {
|
|
log.Printf("Fehler beim Erstellen der Tabelle: %v", err)
|
|
return nil, err
|
|
}
|
|
|
|
// Hier könnten wir auch komplexere Migrationen wie dein _onUpgrade handle,
|
|
// aber für den Anfang reicht das Erstellen der Tabelle.
|
|
|
|
log.Println("Datenbank erfolgreich initialisiert.")
|
|
return &DatabaseService{DB: db}, nil
|
|
}
|
|
|
|
func (s *DatabaseService) SaveTraining(session *TrainingSession) error {
|
|
dateStr := session.Date.Format(time.RFC3339)
|
|
|
|
query := `
|
|
INSERT INTO training (id, date, sets, weightLeft, weightRight, repsPerSet, duration, program, blockDay)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
ON CONFLICT(id) DO UPDATE SET
|
|
date = excluded.date,
|
|
sets = excluded.sets,
|
|
weightLeft = excluded.weightLeft,
|
|
weightRight = excluded.weightRight,
|
|
repsPerSet = excluded.repsPerSet,
|
|
duration = excluded.duration,
|
|
program = excluded.program,
|
|
blockDay = excluded.blockDay;
|
|
`
|
|
var id any
|
|
if session.ID != 0 {
|
|
id = session.ID
|
|
}
|
|
|
|
_, err := s.DB.Exec(query, id, dateStr, session.Sets, session.WeightLeft, session.WeightRight, session.RepsPerSet, session.Duration, session.Program, session.BlockDay)
|
|
return err
|
|
}
|
|
|
|
func (s *DatabaseService) GetTrainingCount() (int, error) {
|
|
var count int
|
|
query := "SELECT COUNT(*) FROM training;"
|
|
err := s.DB.QueryRow(query).Scan(&count)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
return 0, nil
|
|
}
|
|
return 0, err
|
|
}
|
|
return count, nil
|
|
}
|
|
|
|
func (s *DatabaseService) GetHistory() ([]TrainingSession, error) {
|
|
query := `SELECT id, date, sets, weightLeft, weightRight, repsPerSet, duration, program, blockDay FROM training ORDER BY date DESC LIMIT 20;`
|
|
|
|
rows, err := s.DB.Query(query)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
var sessions []TrainingSession
|
|
for rows.Next() {
|
|
var s TrainingSession
|
|
var dateStr string
|
|
|
|
err := rows.Scan(&s.ID, &dateStr, &s.Sets, &s.WeightLeft, &s.WeightRight, &s.RepsPerSet, &s.Duration, &s.Program, &s.BlockDay)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
s.Date, err = time.Parse(time.RFC3339, dateStr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
sessions = append(sessions, s)
|
|
}
|
|
|
|
return sessions, nil
|
|
}
|