update db

This commit is contained in:
2025-02-05 01:43:29 +01:00
parent a6ee466b8d
commit 8421f02027
2 changed files with 138 additions and 14 deletions

View File

@@ -47,7 +47,22 @@ func initDB(connectionString string, osuDb *parser.OsuDB, osuRoot string) (*sql.
} }
if err = checkhealth(db, osuDB); err != nil { if err = checkhealth(db, osuDB); err != nil {
if err = rebuildDb(db, osuDB); err != nil { if err = rebuildBeatmapDb(db, osuDB); err != nil {
return nil, err
}
}
if err = createCollectionDB(db); err != nil {
return nil, err
}
collectionDB, err := parser.ParseCollectionsDB(osuRoot + "collection.db")
if err != nil {
return nil, err
}
if err = checkCollectionHealth(db, collectionDB); err != nil {
if err = rebuildCollectionDb(db, collectionDB); err != nil {
return nil, err return nil, err
} }
} }
@@ -56,7 +71,8 @@ func initDB(connectionString string, osuDb *parser.OsuDB, osuRoot string) (*sql.
} }
func createDB(db *sql.DB) error { func createDB(db *sql.DB) error {
_, err := db.Query(`
_, err := db.Exec(`
CREATE TABLE IF NOT EXISTS Beatmap ( CREATE TABLE IF NOT EXISTS Beatmap (
BeatmapId INTEGER DEFAULT 0, BeatmapId INTEGER DEFAULT 0,
Artist TEXT DEFAULT '?????', Artist TEXT DEFAULT '?????',
@@ -102,6 +118,29 @@ func createDB(db *sql.DB) error {
return nil return nil
} }
func createCollectionDB(db *sql.DB) error {
_, err := db.Exec(`CREATE TABLE IF NOT EXISTS Collection (
Name TEXT DEFAULT '',
MD5Hash TEXT DEFAULT '00000000000000000000000000000000'
);
`)
if err != nil {
return err
}
_, err = db.Exec("CREATE INDEX IF NOT EXISTS idx_collection_name ON Collection(Name);")
if err != nil {
return err
}
_, err = db.Exec("CREATE INDEX IF NOT EXISTS idx_collection_md5hash ON Collection(MD5Hash);")
if err != nil {
return err
}
return nil
}
func checkhealth(db *sql.DB, osuDb *parser.OsuDB) error { func checkhealth(db *sql.DB, osuDb *parser.OsuDB) error {
rows, err := db.Query(`SELECT COUNT(*) FROM Beatmap GROUP BY BeatmapSetId;`) rows, err := db.Query(`SELECT COUNT(*) FROM Beatmap GROUP BY BeatmapSetId;`)
@@ -137,9 +176,9 @@ func checkhealth(db *sql.DB, osuDb *parser.OsuDB) error {
return nil return nil
} }
func rebuildDb(db *sql.DB, osuDb *parser.OsuDB) error { func rebuildBeatmapDb(db *sql.DB, osuDb *parser.OsuDB) error {
if _, err := db.Query("DROP TABLE Beatmap"); err != nil { if _, err := db.Exec("DROP TABLE Beatmap"); err != nil {
return err return err
} }
@@ -190,6 +229,82 @@ func rebuildDb(db *sql.DB, osuDb *parser.OsuDB) error {
return nil return nil
} }
func checkCollectionHealth(db *sql.DB, collectionDB *parser.Collections) error {
rows, err := db.Query(`SELECT COUNT(*) FROM Collection GROUP BY Name;`)
if err != nil {
return err
}
defer rows.Close()
var count int
if err = rows.Scan(&count); err != nil {
return err
}
if count != int(collectionDB.NumberOfCollections) {
return errors.New("Collection Count Not Matching")
}
rows, err = db.Query(`SELECT COUNT(*) FROM Collection;`)
if err != nil {
return err
}
if err = rows.Scan(&count); err != nil {
return err
}
sum := 0
for _, col := range collectionDB.Collections {
sum += len(col.Beatmaps)
}
if count != int(sum) {
return errors.New("Beatmap count missmatch rebuilding collections")
}
return nil
}
func rebuildCollectionDb(db *sql.DB, collectionDb *parser.Collections) error {
if _, err := db.Exec("DROP TABLE Collection"); err != nil {
return err
}
if err := createCollectionDB(db); err != nil {
return err
}
stmt, err := db.Prepare(`
INSERT INTO Collection (
Name,
MD5Hash
) VALUES (?, ?)
`)
if err != nil {
return err
}
defer stmt.Close()
tx, err := db.Begin()
if err != nil {
return err
}
stmt = tx.Stmt(stmt)
for _, col := range collectionDb.Collections {
for _, hash := range col.Beatmaps {
_, err := stmt.Exec(col.Name, hash)
if err != nil {
fmt.Println(err)
}
}
}
return tx.Commit()
}
func getBeatmapCount(db *sql.DB) int { func getBeatmapCount(db *sql.DB) int {
rows, err := db.Query("SELECT COUNT(*) FROM Beatmap") rows, err := db.Query("SELECT COUNT(*) FROM Beatmap")
if err != nil { if err != nil {
@@ -258,8 +373,12 @@ func getFavorites(db *sql.DB, q string, limit, offset int) ([]Song, error) {
} }
func getCollection(db *sql.DB, index int) (Collection, error) { func getCollection(db *sql.DB, index int) (Collection, error) {
row := db.QueryRow("SELECT * FROM Collections WHERE CollectionId = ?", index) rows, err := db.Query("SELECT * FROM Collection WHERE rowid = ? GROUP BY NAME", index)
return scanCollection(row) if err != nil {
return Collection{}, err
}
defer rows.Close()
return scanCollection(rows)
} }
func getCollections(db *sql.DB, q string, limit, offset int) ([]Collection, error) { func getCollections(db *sql.DB, q string, limit, offset int) ([]Collection, error) {
@@ -336,11 +455,16 @@ func scanCollections(rows *sql.Rows) ([]Collection, error) {
return collection, nil return collection, nil
} }
func scanCollection(row *sql.Row) (Collection, error) { func scanCollection(rows *sql.Rows) (Collection, error) {
var c Collection var c Collection
if err := row.Scan(&c); err != nil { for rows.Next() {
return Collection{}, err var s Song
if err := rows.Scan(&c.Name, &s.MD5Hash); err != nil {
return Collection{}, err
}
c.Songs = append(c.Songs, s)
} }
return c, nil return c, nil
} }

View File

@@ -8,12 +8,12 @@ import (
"github.com/juli0n21/go-osu-parser/parser" "github.com/juli0n21/go-osu-parser/parser"
) )
// @title go-osu-music-hoster // @title go-osu-music-hoster
// @version 1.0 // @version 1.0
// @description Server Hosting ur own osu files over a simple Api // @description Server Hosting ur own osu files over a simple Api
// @host localhost:8080 // @host localhost:8080
// @BasePath /api/v1/ // @BasePath /api/v1/
func main() { func main() {
filename := "/mnt/g/Anwendungen/osu!/osu!.db" filename := "/mnt/g/Anwendungen/osu!/osu!.db"