-
Notifications
You must be signed in to change notification settings - Fork 8
sqlite support #270
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
sqlite support #270
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,124 @@ | ||
| -- SQLite Migration | ||
| -- This migration creates the same tables as the PostgreSQL and MySQL migrations | ||
| -- but using SQLite-compatible syntax. | ||
|
|
||
| -- Factions Table | ||
| CREATE TABLE IF NOT EXISTS factions ( | ||
| id INTEGER PRIMARY KEY AUTOINCREMENT, | ||
| name TEXT UNIQUE NOT NULL, | ||
| description TEXT | ||
| ); | ||
|
|
||
| -- Races Table | ||
| CREATE TABLE IF NOT EXISTS races ( | ||
| id INTEGER PRIMARY KEY AUTOINCREMENT, | ||
| name TEXT UNIQUE NOT NULL, | ||
| faction_id INTEGER REFERENCES factions(id) ON DELETE CASCADE | ||
| ); | ||
|
|
||
| -- Classes Table | ||
| CREATE TABLE IF NOT EXISTS classes ( | ||
| id INTEGER PRIMARY KEY AUTOINCREMENT, | ||
| name TEXT UNIQUE NOT NULL, | ||
| specialization TEXT | ||
| ); | ||
|
|
||
| -- Characters Table | ||
| CREATE TABLE IF NOT EXISTS characters ( | ||
| id INTEGER PRIMARY KEY AUTOINCREMENT, | ||
| name TEXT NOT NULL, | ||
| race_id INTEGER REFERENCES races(id), | ||
| class_id INTEGER REFERENCES classes(id), | ||
| level INTEGER DEFAULT 1, | ||
| experience INTEGER DEFAULT 0, | ||
| gold REAL DEFAULT 0, | ||
| created_at DATETIME DEFAULT CURRENT_TIMESTAMP | ||
| ); | ||
|
|
||
| -- Guilds Table | ||
| CREATE TABLE IF NOT EXISTS guilds ( | ||
| id INTEGER PRIMARY KEY AUTOINCREMENT, | ||
| name TEXT UNIQUE NOT NULL, | ||
| description TEXT, | ||
| created_at DATETIME DEFAULT CURRENT_TIMESTAMP | ||
| ); | ||
|
|
||
| -- Guild Members Table | ||
| CREATE TABLE IF NOT EXISTS guild_members ( | ||
| guild_id INTEGER REFERENCES guilds(id) ON DELETE CASCADE, | ||
| character_id INTEGER REFERENCES characters(id) ON DELETE CASCADE, | ||
| rank TEXT, | ||
| joined_at DATETIME DEFAULT CURRENT_TIMESTAMP, | ||
| PRIMARY KEY (guild_id, character_id) | ||
| ); | ||
|
|
||
| -- Inventory Table | ||
| CREATE TABLE IF NOT EXISTS inventory ( | ||
| id INTEGER PRIMARY KEY AUTOINCREMENT, | ||
| character_id INTEGER REFERENCES characters(id) ON DELETE CASCADE, | ||
| quantity INTEGER DEFAULT 1 | ||
| ); | ||
|
|
||
| -- Items Table | ||
| CREATE TABLE IF NOT EXISTS items ( | ||
| id INTEGER PRIMARY KEY AUTOINCREMENT, | ||
| name TEXT NOT NULL, | ||
| rarity TEXT, | ||
| flavor_text TEXT, | ||
| inventory_id INTEGER REFERENCES inventory(id) ON DELETE CASCADE | ||
| ); | ||
|
|
||
| -- Quests Table | ||
| CREATE TABLE IF NOT EXISTS quests ( | ||
| id INTEGER PRIMARY KEY AUTOINCREMENT, | ||
| name TEXT NOT NULL, | ||
| description TEXT, | ||
| rewards TEXT, | ||
| completed BOOLEAN DEFAULT 0, | ||
| required_level INTEGER DEFAULT 1 | ||
| ); | ||
|
|
||
| -- Character Quests Table | ||
| CREATE TABLE IF NOT EXISTS character_quests ( | ||
| character_id INTEGER REFERENCES characters(id) ON DELETE CASCADE, | ||
| quest_id INTEGER REFERENCES quests(id) ON DELETE CASCADE, | ||
| status TEXT DEFAULT 'In Progress', | ||
| PRIMARY KEY (character_id, quest_id) | ||
| ); | ||
|
|
||
| -- Random types table for testing SQLite type mappings | ||
| CREATE TABLE IF NOT EXISTS random ( | ||
| int1 INTEGER, | ||
| real1 REAL, | ||
| text1 TEXT, | ||
| blob1 BLOB, | ||
| numeric1 NUMERIC, | ||
| bool1 BOOLEAN, | ||
| date1 DATE, | ||
| datetime1 DATETIME, | ||
| float1 FLOAT, | ||
| double1 DOUBLE, | ||
| varchar1 VARCHAR(100), | ||
| char1 CHAR(10), | ||
| json1 JSON | ||
| ); | ||
|
|
||
| --- SEED DATA | ||
|
|
||
| INSERT INTO factions (name, description) VALUES | ||
| ('alliance', 'The noble and righteous faction'), | ||
| ('horde', 'The fierce and battle-hardened faction'); | ||
|
|
||
| INSERT INTO races (name, faction_id) VALUES | ||
| ('human', 1), | ||
| ('night elf', 1), | ||
| ('dwarf', 1), | ||
| ('gnome', 1), | ||
| ('orc', 2), | ||
| ('troll', 2), | ||
| ('tauren', 2), | ||
| ('undead', 2); | ||
|
|
||
| INSERT INTO classes (name, specialization) VALUES | ||
| ('warrior', '{"role": "tank", "weapon": "sword", "abilities": ["charge", "slam", "shield block"]}'), | ||
| ('hunter', '{"role": "ranged", "weapon": "bow", "abilities": ["aimed shot", "multi-shot", "trap"]}'); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -234,7 +234,9 @@ impl Config { | |
| .or_else(|| default_config.map(|x| x.db_host.clone())) | ||
| }; | ||
|
|
||
| let db_host = match (db_url.is_some(), db_host_chain()) { | ||
| let is_sqlite = matches!(db_type, DatabaseType::Sqlite); | ||
|
|
||
| let db_host = match (db_url.is_some() || is_sqlite, db_host_chain()) { | ||
| (true, Some(v)) => v, | ||
| (true, None) => String::new(), | ||
| (false, Some(v)) => v, | ||
|
|
@@ -254,7 +256,7 @@ impl Config { | |
| .or_else(|| default_config.map(|x| x.db_port)) | ||
| }; | ||
|
|
||
| let db_port = match (db_url.is_some(), db_port_chain()) { | ||
| let db_port = match (db_url.is_some() || is_sqlite, db_port_chain()) { | ||
| (true, Some(v)) => v, | ||
| (true, None) => 0, | ||
| (false, Some(v)) => v, | ||
|
|
@@ -275,7 +277,7 @@ impl Config { | |
| .or_else(|| default_config.map(|x| x.db_user.clone())) | ||
| }; | ||
|
|
||
| let db_user = match (db_url.is_some(), db_user_chain()) { | ||
| let db_user = match (db_url.is_some() || is_sqlite, db_user_chain()) { | ||
| (true, Some(v)) => v, | ||
| (true, None) => String::new(), | ||
| (false, Some(v)) => v, | ||
|
|
@@ -381,6 +383,19 @@ impl Config { | |
| .to_string() | ||
| } | ||
|
|
||
| /// Returns the file path for a SQLite database connection. | ||
| /// If DB_URL is provided, it's used directly. Otherwise DB_NAME is used as the file path. | ||
| pub fn get_sqlite_path(&self, conn: &DbConnectionConfig) -> String { | ||
| if let Some(db_url) = &conn.db_url { | ||
| return db_url.to_owned(); | ||
| } | ||
|
|
||
| conn | ||
| .db_name | ||
| .clone() | ||
| .unwrap_or_else(|| panic!("DB_NAME (file path) is required for SQLite connections")) | ||
| } | ||
|
Comment on lines
+386
to
+397
|
||
|
|
||
| pub fn get_postgres_cred(&self, conn: &DbConnectionConfig) -> String { | ||
| // If custom DB_URL is provided, use it directly | ||
| if let Some(db_url) = &conn.db_url { | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
rusqliteis added both under[dependencies]and[dev-dependencies]with the same version/features. Since the crate code now depends on rusqlite, the dev-dependency entry is redundant and can be removed to avoid duplication.