rogueserver/db/db.go

117 lines
3.0 KiB
Go
Raw Normal View History

2024-04-29 17:26:46 -04:00
/*
Copyright (C) 2024 Pagefault Games
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
2024-04-29 15:32:58 -04:00
2023-12-05 13:28:08 -05:00
package db
import (
"database/sql"
2024-05-07 22:31:55 +02:00
"encoding/hex"
2023-12-05 13:28:08 -05:00
"fmt"
2023-12-28 19:58:54 -05:00
_ "github.com/go-sql-driver/mysql"
2024-05-07 22:31:55 +02:00
"log"
"os"
2023-12-05 13:28:08 -05:00
)
var handle *sql.DB
func Init(username, password, protocol, address, database string) error {
2024-04-25 16:27:24 -04:00
var err error
handle, err = sql.Open("mysql", username+":"+password+"@"+protocol+"("+address+")/"+database)
2023-12-05 13:28:08 -05:00
if err != nil {
return fmt.Errorf("failed to open database connection: %s", err)
}
2024-04-25 16:27:24 -04:00
handle.SetMaxOpenConns(1000)
2023-12-05 13:28:08 -05:00
2024-05-07 22:31:55 +02:00
tx, err := handle.Begin()
if err != nil {
panic(err)
}
tx.Exec("CREATE TABLE IF NOT EXISTS systemSaveData (uuid BINARY(16) PRIMARY KEY, data BLOB, timestamp TIMESTAMP)")
2024-05-07 22:57:30 +02:00
tx.Exec("CREATE TABLE IF NOT EXISTS sessionSaveData (uuid BINARY(16), slot TINYINT, data BLOB, timestamp TIMESTAMP PRIMARY KEY (uuid, slot))")
2024-05-07 22:31:55 +02:00
err = tx.Commit()
if err != nil {
panic(err)
}
// TODO temp code
entries, err := os.ReadDir("userdata")
if err != nil {
log.Fatalln(err)
return nil
}
for _, entry := range entries {
if !entry.IsDir() {
continue
}
uuidString := entry.Name()
uuid, err := hex.DecodeString(uuidString)
if err != nil {
log.Printf("failed to decode uuid: %s", err)
continue
}
// store new system data
2024-05-07 22:41:53 +02:00
systemData, err := LegacyReadSystemSaveData(uuid)
2024-05-07 22:31:55 +02:00
if err != nil {
log.Printf("failed to read system save data for %v: %s", uuidString, err)
continue
}
err = StoreSystemSaveData(uuid, systemData)
if err != nil {
log.Fatalf("failed to store system save data for %v: %s\n", uuidString, err)
continue
}
2024-05-07 22:00:28 +02:00
2024-05-07 22:31:55 +02:00
// delete old system data
err = os.Remove("userdata/" + uuidString + "/system.pzs")
if err != nil {
log.Fatalf("failed to remove legacy system save data for %v: %s", uuidString, err)
}
for i := 0; i < 5; i++ {
2024-05-07 22:41:53 +02:00
sessionData, err := LegacyReadSessionSaveData(uuid, i)
2024-05-07 22:31:55 +02:00
if err != nil {
log.Printf("failed to read session save data %v for %v: %s", i, uuidString, err)
continue
}
// store new session data
err = StoreSessionSaveData(uuid, sessionData, i)
if err != nil {
log.Fatalf("failed to store session save data for %v: %s\n", uuidString, err)
}
// delete old session data
filename := "session"
if i != 0 {
filename += fmt.Sprintf("%d", i)
}
err = os.Remove(fmt.Sprintf("userdata/%s/%s.pzs", uuidString, filename))
if err != nil {
log.Fatalf("failed to remove legacy session save data %v for %v: %s", i, uuidString, err)
}
}
}
2024-05-07 22:00:28 +02:00
2023-12-05 13:28:08 -05:00
return nil
}