From 0c1d73e35ebe9feff560ab7ec06be2690a040fcc Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Sat, 1 Oct 2022 19:16:53 +0200 Subject: [PATCH] DB: Add base files for the DB implem using rust with the diesel crate --- src/rust/liblektor-rs/Cargo.toml | 5 +- src/rust/liblektor-rs/diesel.toml | 8 +++ src/rust/liblektor-rs/migrations/.keep | 0 .../2022-09-30-204512_create_posts/down.sql | 9 ++++ .../2022-09-30-204512_create_posts/up.sql | 51 +++++++++++++++++++ src/rust/liblektor-rs/src/database.rs | 45 ---------------- src/rust/liblektor-rs/src/database/mod.rs | 0 src/rust/liblektor-rs/src/schema.rs | 45 ++++++++++++++++ 8 files changed, 116 insertions(+), 47 deletions(-) create mode 100644 src/rust/liblektor-rs/diesel.toml create mode 100644 src/rust/liblektor-rs/migrations/.keep create mode 100644 src/rust/liblektor-rs/migrations/2022-09-30-204512_create_posts/down.sql create mode 100644 src/rust/liblektor-rs/migrations/2022-09-30-204512_create_posts/up.sql delete mode 100644 src/rust/liblektor-rs/src/database.rs create mode 100644 src/rust/liblektor-rs/src/database/mod.rs create mode 100644 src/rust/liblektor-rs/src/schema.rs diff --git a/src/rust/liblektor-rs/Cargo.toml b/src/rust/liblektor-rs/Cargo.toml index 5ffadb98..58bfc571 100644 --- a/src/rust/liblektor-rs/Cargo.toml +++ b/src/rust/liblektor-rs/Cargo.toml @@ -4,7 +4,8 @@ version = "0.1.0" edition = "2021" [lib] -crate-type = ["staticlib"] +crate-type = [ "staticlib" ] [dependencies] -libc = "0.2.0" +libc = "0.2.0" +diesel = { version = "2", features = [ "sqlite" ] } \ No newline at end of file diff --git a/src/rust/liblektor-rs/diesel.toml b/src/rust/liblektor-rs/diesel.toml new file mode 100644 index 00000000..35a12ff0 --- /dev/null +++ b/src/rust/liblektor-rs/diesel.toml @@ -0,0 +1,8 @@ +# For documentation on how to configure this file, +# see https://diesel.rs/guides/configuring-diesel-cli + +[print_schema] +file = "src/schema.rs" + +[migrations_directory] +dir = "migrations" diff --git a/src/rust/liblektor-rs/migrations/.keep b/src/rust/liblektor-rs/migrations/.keep new file mode 100644 index 00000000..e69de29b diff --git a/src/rust/liblektor-rs/migrations/2022-09-30-204512_create_posts/down.sql b/src/rust/liblektor-rs/migrations/2022-09-30-204512_create_posts/down.sql new file mode 100644 index 00000000..5a2e3600 --- /dev/null +++ b/src/rust/liblektor-rs/migrations/2022-09-30-204512_create_posts/down.sql @@ -0,0 +1,9 @@ +DROP TABLE repo; +DROP TABLE kara_repo; +DROP TABLE kara; +DROP TABLE kara_makers; +DROP TABLE kara_tag; +DROP TABLE tag; +DROP TABLE kara_tags; +DROP TABLE queue_1; +DROP TABLE history; diff --git a/src/rust/liblektor-rs/migrations/2022-09-30-204512_create_posts/up.sql b/src/rust/liblektor-rs/migrations/2022-09-30-204512_create_posts/up.sql new file mode 100644 index 00000000..33a7c418 --- /dev/null +++ b/src/rust/liblektor-rs/migrations/2022-09-30-204512_create_posts/up.sql @@ -0,0 +1,51 @@ +CREATE TABLE repo + ( name TEXT NOT NULL + , id INTEGER NOT NULL + ); + +CREATE TABLE repo_kara + ( repo_id INTEGER NOT NULL REFERENCES repo(id) + , repo_kara_id INTEGER NOT NULL + , local_kara_id INTEGER NOT NULL REFERENCES kara(id) + , PRIMARY KEY (repo_id, repo_kara_id, local_kara_id) + ); + +CREATE TABLE kara + ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT + , is_dl BOOLEAN NOT NULL DEFAULT false + , song_title TEXT NOT NULL + , song_type TEXT NOT NULL + , song_origin TEXT NOT NULL + , source_name TEXT NOT NULL + , language TEXT NOT NULL + , kara_hash TEXT NOT NULL -- TEXT ABOVE + HASH OF FILE IN FS + ); + +CREATE TABLE kara_makers + ( id INTEGER NOT NULL REFERENCES kara ON DELETE CASCADE + , name TEXT NOT NULL + , PRIMARY KEY (id, name) + ); + +CREATE TABLE tag + ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT + , name TEXT NOT NULL + ); + +CREATE TABLE kara_tags + ( kara_id INTEGER NOT NULL REFERENCES kara(id) ON DELETE CASCADE + , tag_id INTEGER NOT NULL REFERENCES tag(id) ON DELETE CASCADE + , value TEXT + , PRIMARY KEY (kara_id, tag_id, value) + ); + +CREATE TABLE queue_1 + ( id INTEGER NOT NULL REFERENCES kara(id) ON DELETE CASCADE + , position INTEGER NOT NULL CHECK(position > 0) + ); + +CREATE TABLE history + ( id INTEGER NOT NULL REFERENCES kara(id) ON DELETE CASCADE + , epoch INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT + , PRIMARY KEY (id, epoch) + ); diff --git a/src/rust/liblektor-rs/src/database.rs b/src/rust/liblektor-rs/src/database.rs deleted file mode 100644 index 8ddcedc1..00000000 --- a/src/rust/liblektor-rs/src/database.rs +++ /dev/null @@ -1,45 +0,0 @@ -use crate::*; - -pub(crate) type LktDbPtr = *mut c_void; - -#[repr(C)] -pub(crate) struct LktQueueState { - volume: c_int, - paused: c_int, - random: c_int, - repeat: c_int, - single: c_int, - current: c_int, - duration: c_int, - consume: c_int, - length: c_int, -} - -extern "C" { - pub(crate) fn database_queue_toggle_pause(db: LktDbPtr) -> c_void; - - /* Update stuff */ - pub(crate) fn database_get_update( - db: LktDbPtr, - timestamp: *mut c_long, - job: *mut c_long, - current: *mut c_int, - ) -> c_void; - pub(crate) fn database_stamp(db: LktDbPtr) -> c_void; - pub(crate) fn database_updated(db: LktDbPtr) -> c_void; - pub(crate) fn database_deleted_kara( - db: LktDbPtr, - kara_id: *mut *mut c_int, - len: *mut size_t, - ) -> c_void; - pub(crate) fn database_total_playtime(db: LktDbPtr, seconds: *mut u64) -> c_void; - - /* Get information on the queue and currently playing kara */ - pub(crate) fn database_queue_state(db: LktDbPtr, res: *mut LktQueueState) -> bool; - pub(crate) fn database_queue_current_kara( - db: LktDbPtr, - res: *mut mkv::LktKaraMetadata, - id: *mut c_int, - ) -> bool; - pub(crate) fn database_queue_playtime(db: LktDbPtr, seconds: *mut u64) -> c_void; -} diff --git a/src/rust/liblektor-rs/src/database/mod.rs b/src/rust/liblektor-rs/src/database/mod.rs new file mode 100644 index 00000000..e69de29b diff --git a/src/rust/liblektor-rs/src/schema.rs b/src/rust/liblektor-rs/src/schema.rs new file mode 100644 index 00000000..fda66f55 --- /dev/null +++ b/src/rust/liblektor-rs/src/schema.rs @@ -0,0 +1,45 @@ +// @generated automatically by Diesel CLI. + +diesel::table! { + kara (id) { + id -> Integer, + song_title -> Text, + song_type -> Text, + song_origin -> Text, + source_name -> Text, + language -> Text, + } +} + +diesel::table! { + kara_makers (id, name) { + id -> Integer, + name -> Text, + } +} + +diesel::table! { + kara_tags (kara_id, tag_id, value) { + kara_id -> Integer, + tag_id -> Integer, + value -> Nullable<Text>, + } +} + +diesel::table! { + tag (id) { + id -> Integer, + name -> Text, + } +} + +diesel::joinable!(kara_makers -> kara (id)); +diesel::joinable!(kara_tags -> kara (kara_id)); +diesel::joinable!(kara_tags -> tag (tag_id)); + +diesel::allow_tables_to_appear_in_same_query!( + kara, + kara_makers, + kara_tags, + tag, +); -- GitLab