// NGnius 2020-02-11 package main import ( "database/sql" "fmt" _ "github.com/mattn/go-sqlite3" ) const ( sqlServerDefault = "sqlite3" sqlConnectionDefault = "test.sqlite" ) var ( // command line arguments sqlServer string sqlConnection string buildTables bool populateTables bool // internal variables db *sql.DB ) func sqlInit() error { var dbOpenErr error db, dbOpenErr = sql.Open(sqlServer, sqlConnection) if dbOpenErr != nil { return dbOpenErr } if buildTables { fmt.Println("Building tables in database...") sqlBuildTables() } if populateTables { fmt.Println("Populating tables in database...") sqlPopulateTables() } return nil } func sqlClose() error { if db != nil { err := db.Close() if err != nil { return err } db = nil } return nil } func boardByName(name string) (*Board, error) { b := &Board{} return b, db.QueryRow("SELECT * FROM Boards WHERE name=? LIMIT 1", name).Scan(b.Intake()...) } func playerByName(name string) (*Player, error) { p := &Player{} return p, db.QueryRow("SELECT * FROM Players WHERE name=? LIMTI 1", name).Scan(p.Intake()...) } // internal operations func sqlBuildTables() { transaction, txErr := db.Begin() if txErr != nil { return } // test table //transaction.Exec("CREATE TABLE IF NOT EXISTS Test (Sometext VARCHAR, Somenumber);") //transaction.Exec("INSERT INTO Test (Sometext, Somenumber) VALUES (?,?);", "Hello sqlite", 123) // build real tables transaction.Exec("CREATE TABLE IF NOT EXISTS Players (id INTEGER PRIMARY KEY, name TEXT NOT NULL);") transaction.Exec("CREATE TABLE IF NOT EXISTS Boards (id INTEGER PRIMARY KEY, name TEXT NOT NULL, description TEXT);") transaction.Exec("CREATE TABLE IF NOT EXISTS Entries (id INTEGER PRIMARY KEY, rank INTEGER, score INTEGER NOT NULL, player INTEGER NOT NULL, board INTEGER NOT NULL, FOREIGN KEY(player) REFERENCES Players(id), FOREIGN KEY(board) REFERENCES Boards(id));") transaction.Commit() } func sqlPopulateTables() { boards := []*Board{ &Board{ID: 1, Name: "main-test", Description: "Overall best (test data)"}, &Board{ID: 2, Name: "coolest-test", Description: "Coolest score (test data)"}, &Board{ID: 3, Name: "fastest-test", Description: "Fastest time (test data)"}, } for _, b := range boards { err := b.Commit() if err != nil { fmt.Printf("Error creating board %d: %s\n", b.ID, err) } } players := []*Player{ &Player{ID: 1, Name: "NGnius (test)"}, &Player{ID: 2, Name: "Also NGnius (test)"}, &Player{ID: 3, Name: ".xX||eDgY TeeNaGeR||Xx. (test)"}, &Player{ID: 4, Name: "New username who dis? (test)"}, &Player{ID: 5, Name: "Extremely Ridiculously Long Name to break things (test)"}, &Player{ID: 6, Name: "P|P3 |o|z (test)"}, &Player{ID: 7, Name: "Waldo (test)"}, &Player{ID: 8, Name: "Zettagram.com (test)"}, &Player{ID: 9, Name: "The Doctor (test)"}, &Player{ID: 10, Name: "Marvin the Paranoid Android (test)"}, &Player{ID: 11, Name: "IDK HOW (test)"}, &Player{ID: 12, Name: "If you can read this your API may be wrong (test)"}, &Player{ID: 13, Name: "Unlucky 7 (test)"}, } for _, p := range players { err := p.Commit() if err != nil { fmt.Printf("Error creating player %d: %s\n", p.ID, err) } } entries := []*Entry{ &Entry{ID: 1, Rank: 1, Score: 1000, Player: players[0].ID, Board: boards[0].ID}, &Entry{ID: 2, Rank: 2, Score: 900, Player: players[1].ID, Board: boards[0].ID}, &Entry{ID: 3, Rank: 3, Score: 400, Player: players[2].ID, Board: boards[0].ID}, &Entry{ID: 4, Rank: 4, Score: 350, Player: players[3].ID, Board: boards[0].ID}, &Entry{ID: 5, Rank: 5, Score: 350, Player: players[4].ID, Board: boards[0].ID}, &Entry{ID: 6, Rank: 6, Score: 250, Player: players[5].ID, Board: boards[0].ID}, &Entry{ID: 7, Rank: 7, Score: 200, Player: players[6].ID, Board: boards[0].ID}, &Entry{ID: 8, Rank: 8, Score: 175, Player: players[7].ID, Board: boards[0].ID}, &Entry{ID: 9, Rank: 9, Score: 150, Player: players[8].ID, Board: boards[0].ID}, &Entry{ID: 10, Rank: 10, Score: 140, Player: players[9].ID, Board: boards[0].ID}, &Entry{ID: 11, Rank: 11, Score: 10, Player: players[10].ID, Board: boards[0].ID}, &Entry{ID: 12, Rank: 12, Score: 60, Player: players[11].ID, Board: boards[0].ID}, &Entry{ID: 13, Rank: 13, Score: 13, Player: players[12].ID, Board: boards[0].ID}, } for _, e := range entries { err := e.Commit() if err != nil { fmt.Printf("Error creating entry %d: %s", e.ID, err) } } }