Skip to content

Commit

Permalink
Consolidate SQL schema
Browse files Browse the repository at this point in the history
For INSTALL.sh and tests/conftest.py
Closes #242
  • Loading branch information
jdabtieu committed Dec 12, 2023
1 parent 27b503d commit 3d6448d
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 170 deletions.
86 changes: 1 addition & 85 deletions INSTALL.sh
Original file line number Diff line number Diff line change
Expand Up @@ -66,92 +66,8 @@ mkdir "$DATA_DIR"
touch "$DATA_DIR/database.db"
ln -s "$DATA_DIR/database.db" database.db
echo "Creating database..."
sqlite3 database.db < schema.sql
sqlite3 database.db << EOF
CREATE TABLE 'users' (
'id' integer PRIMARY KEY NOT NULL,
'username' varchar(20) NOT NULL UNIQUE,
'password' varchar(64) NOT NULL,
'email' varchar(128) UNIQUE,
'join_date' datetime NOT NULL DEFAULT(0),
'banned' boolean NOT NULL DEFAULT(0),
'verified' boolean NOT NULL DEFAULT(0),
'twofa' boolean NOT NULL DEFAULT(0),
'api' varchar(36) UNIQUE,
'total_points' integer NOT NULL DEFAULT(0),
'contests_completed' integer NOT NULL DEFAULT(0),
'problems_solved' integer NOT NULL DEFAULT(0)
);
CREATE TABLE 'user_perms' (
'user_id' integer NOT NULL,
'perm_id' integer NOT NULL,
UNIQUE(perm_id, user_id) ON CONFLICT IGNORE
);
CREATE TABLE 'submissions' (
'id' integer PRIMARY KEY NOT NULL,
'date' datetime NOT NULL,
'user_id' integer NOT NULL,
'problem_id' varchar(32) NOT NULL,
'contest_id' varchar(32),
'correct' boolean NOT NULL,
'submitted' text NOT NULL DEFAULT('')
);
CREATE TABLE 'problems' (
'id' varchar(64) NOT NULL UNIQUE,
'name' varchar(256) NOT NULL,
'point_value' integer NOT NULL DEFAULT(0),
'category' varchar(64),
'flag' varchar(256) NOT NULL,
'draft' boolean NOT NULL DEFAULT(0),
'flag_hint' varchar(256) NOT NULL DEFAULT(''),
'instanced' boolean NOT NULL DEFAULT(0)
);
CREATE TABLE 'problem_solved' (
'user_id' integer NOT NULL,
'problem_id' varchar(64) NOT NULL,
UNIQUE(problem_id, user_id) ON CONFLICT ABORT
);
CREATE TABLE 'contests' (
'id' varchar(32) NOT NULL UNIQUE,
'name' varchar(256) NOT NULL,
'start' datetime NOT NULL,
'end' datetime NOT NULL,
'scoreboard_visible' boolean NOT NULL DEFAULT(1),
'scoreboard_key' varchar(36)
);
CREATE TABLE 'announcements' (
'id' integer PRIMARY KEY NOT NULL,
'name' varchar(256) NOT NULL,
'date' datetime NOT NULL
);
CREATE TABLE 'contest_users' (
'contest_id' varchar(32) NOT NULL,
'user_id' integer NOT NULL,
'points' integer NOT NULL DEFAULT (0),
'lastAC' datetime,
'hidden' integer NOT NULL DEFAULT(0),
UNIQUE(contest_id, user_id) ON CONFLICT ABORT
);
CREATE TABLE 'contest_solved' (
'contest_id' varchar(32) NOT NULL,
'user_id' integer NOT NULL,
'problem_id' varchar(64) NOT NULL,
UNIQUE(contest_id, user_id, problem_id) ON CONFLICT ABORT
);
CREATE TABLE 'contest_problems' (
'contest_id' varchar(32) NOT NULL,
'problem_id' varchar(64) NOT NULL,
'name' varchar(256) NOT NULL,
'point_value' integer NOT NULL DEFAULT(0),
'category' varchar(64),
'flag' varchar(256) NOT NULL,
'draft' boolean NOT NULL DEFAULT(0),
'score_min' integer NOT NULL DEFAULT(0),
'score_max' integer NOT NULL DEFAULT(0),
'score_users' integer NOT NULL DEFAULT(-1),
'flag_hint' varchar(256) NOT NULL DEFAULT(''),
'instanced' boolean NOT NULL DEFAULT(0),
UNIQUE(contest_id, problem_id) ON CONFLICT ABORT
);
INSERT INTO 'users' VALUES(1, 'admin', 'pbkdf2:sha256:150000\$XoLKRd3I\$2dbdacb6a37de2168298e419c6c54e768d242aee475aadf1fa9e6c30aa02997f', 'e', datetime('now'), 0, 1, 0, NULL, 0, 0, 0);
INSERT INTO 'user_perms' VALUES(1, 0); -- helpers.py: SUPERADMIN
EOF
Expand Down
85 changes: 85 additions & 0 deletions src/schema.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
CREATE TABLE 'users' (
'id' integer PRIMARY KEY NOT NULL,
'username' varchar(20) NOT NULL UNIQUE,
'password' varchar(64) NOT NULL,
'email' varchar(128) UNIQUE,
'join_date' datetime NOT NULL DEFAULT(0),
'banned' boolean NOT NULL DEFAULT(0),
'verified' boolean NOT NULL DEFAULT(0),
'twofa' boolean NOT NULL DEFAULT(0),
'api' varchar(36) UNIQUE,
'total_points' integer NOT NULL DEFAULT(0),
'contests_completed' integer NOT NULL DEFAULT(0),
'problems_solved' integer NOT NULL DEFAULT(0)
);
CREATE TABLE 'user_perms' (
'user_id' integer NOT NULL,
'perm_id' integer NOT NULL,
UNIQUE(perm_id, user_id) ON CONFLICT IGNORE
);
CREATE TABLE 'submissions' (
'id' integer PRIMARY KEY NOT NULL,
'date' datetime NOT NULL DEFAULT(datetime('now')),
'user_id' integer NOT NULL,
'problem_id' varchar(32) NOT NULL,
'contest_id' varchar(32),
'correct' boolean NOT NULL,
'submitted' text NOT NULL DEFAULT('')
);
CREATE TABLE 'problems' (
'id' varchar(64) NOT NULL UNIQUE,
'name' varchar(256) NOT NULL,
'point_value' integer NOT NULL DEFAULT(0),
'category' varchar(64),
'flag' varchar(256) NOT NULL,
'draft' boolean NOT NULL DEFAULT(0),
'flag_hint' varchar(256) NOT NULL DEFAULT(''),
'instanced' boolean NOT NULL DEFAULT(0)
);
CREATE TABLE 'problem_solved' (
'user_id' integer NOT NULL,
'problem_id' varchar(64) NOT NULL,
UNIQUE(problem_id, user_id) ON CONFLICT ABORT
);
CREATE TABLE 'contests' (
'id' varchar(32) NOT NULL UNIQUE,
'name' varchar(256) NOT NULL,
'start' datetime NOT NULL,
'end' datetime NOT NULL,
'scoreboard_visible' boolean NOT NULL DEFAULT(1),
'scoreboard_key' varchar(36)
);
CREATE TABLE 'announcements' (
'id' integer PRIMARY KEY NOT NULL,
'name' varchar(256) NOT NULL,
'date' datetime NOT NULL
);
CREATE TABLE 'contest_users' (
'contest_id' varchar(32) NOT NULL,
'user_id' integer NOT NULL,
'points' integer NOT NULL DEFAULT (0),
'lastAC' datetime,
'hidden' integer NOT NULL DEFAULT(0),
UNIQUE(contest_id, user_id) ON CONFLICT ABORT
);
CREATE TABLE 'contest_solved' (
'contest_id' varchar(32) NOT NULL,
'user_id' integer NOT NULL,
'problem_id' varchar(64) NOT NULL,
UNIQUE(contest_id, user_id, problem_id) ON CONFLICT ABORT
);
CREATE TABLE 'contest_problems' (
'contest_id' varchar(32) NOT NULL,
'problem_id' varchar(64) NOT NULL,
'name' varchar(256) NOT NULL,
'point_value' integer NOT NULL DEFAULT(0),
'category' varchar(64),
'flag' varchar(256) NOT NULL,
'draft' boolean NOT NULL DEFAULT(0),
'score_min' integer NOT NULL DEFAULT(0),
'score_max' integer NOT NULL DEFAULT(0),
'score_users' integer NOT NULL DEFAULT(-1),
'flag_hint' varchar(256) NOT NULL DEFAULT(''),
'instanced' boolean NOT NULL DEFAULT(0),
UNIQUE(contest_id, problem_id) ON CONFLICT ABORT
);
91 changes: 6 additions & 85 deletions src/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,89 +31,10 @@ def client():
def database():
open("database_test.db", "w").close()
db = SQL("sqlite:///database_test.db")
db.execute(
("CREATE TABLE 'users' ("
" 'id' integer PRIMARY KEY NOT NULL,"
" 'username' varchar(20) NOT NULL UNIQUE,"
" 'password' varchar(64) NOT NULL,"
" 'email' varchar(128) UNIQUE,"
" 'join_date' datetime NOT NULL DEFAULT(0),"
" 'banned' boolean NOT NULL DEFAULT(0),"
" 'verified' boolean NOT NULL DEFAULT(0),"
" 'twofa' boolean NOT NULL DEFAULT(0),"
" 'api' varchar(36) UNIQUE,"
" 'total_points' integer NOT NULL DEFAULT(0),"
" 'contests_completed' integer NOT NULL DEFAULT(0),"
" 'problems_solved' integer NOT NULL DEFAULT(0));"))
db.execute(
("CREATE TABLE 'user_perms' ("
" 'user_id' integer NOT NULL,"
" 'perm_id' integer NOT NULL,"
" UNIQUE(perm_id, user_id) ON CONFLICT IGNORE);"))
db.execute(
("CREATE TABLE 'submissions' ("
" 'id' integer PRIMARY KEY NOT NULL,"
" 'date' datetime NOT NULL DEFAULT(datetime('now')),"
" 'user_id' integer NOT NULL,"
" 'problem_id' varchar(32) NOT NULL,"
" 'contest_id' varchar(32),"
" 'correct' boolean NOT NULL,"
" 'submitted' text NOT NULL DEFAULT(''));"))
db.execute(
("CREATE TABLE 'problems' ("
" 'id' varchar(64) NOT NULL UNIQUE,"
" 'name' varchar(256) NOT NULL,"
" 'point_value' integer NOT NULL DEFAULT(0),"
" 'category' varchar(64),"
" 'flag' varchar(256) NOT NULL,"
" 'draft' boolean NOT NULL DEFAULT(0),"
" 'flag_hint' varchar(256) NOT NULL DEFAULT(''),"
" 'instanced' boolean NOT NULL DEFAULT(0));"))
db.execute(
("CREATE TABLE 'problem_solved' ("
" 'user_id' integer NOT NULL,"
" 'problem_id' varchar(64) NOT NULL,"
" UNIQUE(problem_id, user_id) ON CONFLICT ABORT);"))
db.execute(
("CREATE TABLE 'contests' ("
" 'id' varchar(32) NOT NULL UNIQUE,"
" 'name' varchar(256) NOT NULL,"
" 'start' datetime NOT NULL,"
" 'end' datetime NOT NULL,"
" 'scoreboard_visible' boolean NOT NULL DEFAULT(1),"
" 'scoreboard_key' varchar(36));"))
db.execute(
("CREATE TABLE 'announcements' ("
" 'id' integer PRIMARY KEY NOT NULL,"
" 'name' varchar(256) NOT NULL,"
" 'date' datetime NOT NULL);"))
db.execute(
("CREATE TABLE 'contest_users' ("
" 'contest_id' varchar(32) NOT NULL,"
" 'user_id' integer NOT NULL,"
" 'points' integer NOT NULL DEFAULT (0),"
" 'lastAC' datetime,"
" 'hidden' integer NOT NULL DEFAULT(0),"
" UNIQUE(contest_id, user_id) ON CONFLICT ABORT);"))
db.execute(
("CREATE TABLE 'contest_solved' ("
" 'contest_id' varchar(32) NOT NULL,"
" 'user_id' integer NOT NULL,"
" 'problem_id' varchar(64) NOT NULL,"
" UNIQUE(contest_id, user_id, problem_id) ON CONFLICT ABORT);"))
db.execute(
("CREATE TABLE 'contest_problems' ("
" 'contest_id' varchar(32) NOT NULL,"
" 'problem_id' varchar(64) NOT NULL,"
" 'name' varchar(256) NOT NULL,"
" 'point_value' integer NOT NULL DEFAULT(0),"
" 'category' varchar(64),"
" 'flag' varchar(256) NOT NULL,"
" 'draft' boolean NOT NULL DEFAULT(0),"
" 'score_min' integer NOT NULL DEFAULT(0),"
" 'score_max' integer NOT NULL DEFAULT(0),"
" 'score_users' integer NOT NULL DEFAULT(-1),"
" 'flag_hint' varchar(256) NOT NULL DEFAULT(''),"
" 'instanced' boolean NOT NULL DEFAULT(0),"
" UNIQUE(contest_id, problem_id) ON CONFLICT ABORT);"))
with open("schema.sql") as schemafile:
schema = schemafile.read().split(";") # split commands by ;
schema = [x.strip() for x in schema] # strip newlines
schema = [x for x in schema if x] # remove empty commands
for query in schema:
db.execute(query)
return db

0 comments on commit 3d6448d

Please sign in to comment.