DROP TABLE IF EXISTS Cts_times; CREATE TABLE Cts_times( mapid TEXT, gametype TEXT, trank INT, tvalue INT, PRIMARY KEY (mapid, gametype, trank), FOREIGN KEY (mapid, gametype, trank) REFERENCES Cts_ranks(mapid, gametype, idrank) ); DROP TABLE IF EXISTS Cts_ranks; CREATE TABLE Cts_ranks( mapid TEXT, gametype TEXT, idrank INT, idvalue TEXT, PRIMARY KEY (mapid, gametype, idrank) ); DROP TABLE IF EXISTS Id2alias; CREATE TABLE Id2alias( rtype TEXT, cryptokey TEXT, alias TEXT, PRIMARY KEY (cryptokey) ); -- These table fields are unaltered. -- Exerpts from source/qcsrc/race.qc -- // player improved his existing record, only have to iterate on ranks between new and old recs -- for (i = prevpos; i > newpos; --i) -- { -- db_put(ServerProgsDB, strcat(map, rr, "time", ftos(i)), ftos(race_readTime(map, i - 1))); -- db_put(ServerProgsDB, strcat(map, rr, "crypto_idfp", ftos(i)), race_readUID(map, i - 1)); -- } -- .... -- // store new time itself -- db_put(ServerProgsDB, strcat(map, rr, "time", ftos(i)), ftos(race_readTime(map, i - 1))); -- db_put(ServerProgsDB, strcat(map, rr, "crypto_idfp", ftos(i)), race_readUID(map, i - 1)); -- re: foreign key from & to Cts_ranks & Id2alias. -- An ranked unregistered player will have a row in Cts_ranks, but will not have a row in Id2alias. -- A registered player may have a row in Id2alias, but may not necessary have a rank.