scriptmark 0.2.0

Automated grading CLI for student programming assignments
Documentation
use rusqlite::Connection;

use super::DbError;

pub fn migrate(conn: &Connection) -> Result<(), DbError> {
	conn.execute_batch(
		"
		CREATE TABLE IF NOT EXISTS students (
			id TEXT PRIMARY KEY,
			name TEXT,
			email TEXT,
			canvas_id INTEGER,
			created_at TEXT DEFAULT (datetime('now'))
		);

		CREATE TABLE IF NOT EXISTS sessions (
			id INTEGER PRIMARY KEY AUTOINCREMENT,
			assignment TEXT NOT NULL,
			spec_title TEXT,
			grading_policy TEXT,
			student_count INTEGER DEFAULT 0,
			avg_grade REAL DEFAULT 0,
			created_at TEXT DEFAULT (datetime('now'))
		);

		CREATE TABLE IF NOT EXISTS results (
			id INTEGER PRIMARY KEY AUTOINCREMENT,
			session_id INTEGER NOT NULL REFERENCES sessions(id),
			student_id TEXT NOT NULL,
			pass_rate REAL,
			final_grade REAL,
			lint_score REAL,
			total_cases INTEGER,
			passed_cases INTEGER,
			details TEXT,
			UNIQUE(session_id, student_id)
		);

		CREATE TABLE IF NOT EXISTS similarity (
			id INTEGER PRIMARY KEY AUTOINCREMENT,
			session_id INTEGER NOT NULL REFERENCES sessions(id),
			student_a TEXT NOT NULL,
			student_b TEXT NOT NULL,
			style_score REAL,
			structure_score REAL,
			combined_score REAL
		);

		CREATE INDEX IF NOT EXISTS idx_results_session ON results(session_id);
		CREATE INDEX IF NOT EXISTS idx_results_student ON results(student_id);
		CREATE INDEX IF NOT EXISTS idx_similarity_session ON similarity(session_id);
		",
	)?;
	Ok(())
}