diff --git a/Cargo.toml b/Cargo.toml index 9fbf986..905120c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,11 +8,11 @@ license = "MIT" repository = "ssh://git@gitea.merlinserver.de:2222/Stefan/merlin_env_helper.git" [dependencies] -ego-tree = "0.10.0" +diesel = "2.2.10" env_logger = "0.11.8" log = "0.4.27" merlin_env_helper = { version = "0.2.0", registry = "merlin" } regex = "1.11.1" reqwest = {version="0.12.15", features=["blocking"]} -scraper = "0.23.1" +#scraper = "0.23.1" select = "0.6.1" diff --git a/diesel.toml b/diesel.toml new file mode 100644 index 0000000..8e30b70 --- /dev/null +++ b/diesel.toml @@ -0,0 +1,9 @@ +# For documentation on how to configure this file, +# see https://diesel.rs/guides/configuring-diesel-cli + +[print_schema] +file = "src/db/schema.rs" +custom_type_derives = ["diesel::query_builder::QueryId", "Clone"] + +[migrations_directory] +dir = "/home/stefan/projects/rust/no-man-sky-wiki/migrations" diff --git a/migrations/.keep b/migrations/.keep new file mode 100644 index 0000000..e69de29 diff --git a/migrations/00000000000000_diesel_initial_setup/down.sql b/migrations/00000000000000_diesel_initial_setup/down.sql new file mode 100644 index 0000000..a9f5260 --- /dev/null +++ b/migrations/00000000000000_diesel_initial_setup/down.sql @@ -0,0 +1,6 @@ +-- This file was automatically created by Diesel to setup helper functions +-- and other internal bookkeeping. This file is safe to edit, any future +-- changes will be added to existing projects as new migrations. + +DROP FUNCTION IF EXISTS diesel_manage_updated_at(_tbl regclass); +DROP FUNCTION IF EXISTS diesel_set_updated_at(); diff --git a/migrations/00000000000000_diesel_initial_setup/up.sql b/migrations/00000000000000_diesel_initial_setup/up.sql new file mode 100644 index 0000000..d68895b --- /dev/null +++ b/migrations/00000000000000_diesel_initial_setup/up.sql @@ -0,0 +1,36 @@ +-- This file was automatically created by Diesel to setup helper functions +-- and other internal bookkeeping. This file is safe to edit, any future +-- changes will be added to existing projects as new migrations. + + + + +-- Sets up a trigger for the given table to automatically set a column called +-- `updated_at` whenever the row is modified (unless `updated_at` was included +-- in the modified columns) +-- +-- # Example +-- +-- ```sql +-- CREATE TABLE users (id SERIAL PRIMARY KEY, updated_at TIMESTAMP NOT NULL DEFAULT NOW()); +-- +-- SELECT diesel_manage_updated_at('users'); +-- ``` +CREATE OR REPLACE FUNCTION diesel_manage_updated_at(_tbl regclass) RETURNS VOID AS $$ +BEGIN + EXECUTE format('CREATE TRIGGER set_updated_at BEFORE UPDATE ON %s + FOR EACH ROW EXECUTE PROCEDURE diesel_set_updated_at()', _tbl); +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION diesel_set_updated_at() RETURNS trigger AS $$ +BEGIN + IF ( + NEW IS DISTINCT FROM OLD AND + NEW.updated_at IS NOT DISTINCT FROM OLD.updated_at + ) THEN + NEW.updated_at := current_timestamp; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; diff --git a/migrations/2025-06-14-100926_init/down.sql b/migrations/2025-06-14-100926_init/down.sql new file mode 100644 index 0000000..2d865fb --- /dev/null +++ b/migrations/2025-06-14-100926_init/down.sql @@ -0,0 +1,11 @@ +-- This file should undo anything in `up.sql` +DROP INDEX IF EXISTS idx_icon_name; +DROP INDEX IF EXISTS idx_resource_name; +DROP INDEX IF EXISTS idx_resource_title; +DROP INDEX IF EXISTS idx_recipe_type; + + +DROP TABLE IF EXISTS "ingredient"; +DROP TABLE IF EXISTS "recipe"; +DROP TABLE IF EXISTS "resource"; +DROP TABLE IF EXISTS "icon"; diff --git a/migrations/2025-06-14-100926_init/up.sql b/migrations/2025-06-14-100926_init/up.sql new file mode 100644 index 0000000..bb511dc --- /dev/null +++ b/migrations/2025-06-14-100926_init/up.sql @@ -0,0 +1,56 @@ +CREATE TABLE "icon"( + "id" UUID NOT NULL PRIMARY KEY, + "name" VARCHAR(255) NOT NULL, + "content_type" VARCHAR(255), + "url" VARCHAR(512), + "width" INT4, + "height" INT4, + "state" JSON +); + +CREATE TABLE "resource"( + "id" UUID NOT NULL PRIMARY KEY, + "name" VARCHAR(255) NOT NULL, + "title" VARCHAR(255) NOT NULL, + "url" VARCHAR(512), + "icon" UUID, + "state" JSON, + FOREIGN KEY ("icon") REFERENCES "icon"("id") +); + +CREATE TABLE "recipe"( + "id" UUID NOT NULL PRIMARY KEY, + "resource" UUID NOT NULL, + "recipe_type" VARCHAR(50) NOT NULL, + "duration" INT4 NOT NULL, + "state" JSON, + FOREIGN KEY ("resource") REFERENCES "resource"("id") +); + +CREATE TABLE "ingredient"( + "id" UUID NOT NULL PRIMARY KEY, + "resource" UUID NOT NULL, + "quantity" INT4 NOT NULL, + "state" JSON, + "recipe" UUID NOT NULL, + FOREIGN KEY ("resource") REFERENCES "resource"("id"), + FOREIGN KEY ("recipe") REFERENCES "recipe"("id") +); + + + +CREATE INDEX IF NOT EXISTS idx_icon_name + ON icon USING btree + (name COLLATE pg_catalog."default" ASC NULLS LAST); + +CREATE INDEX IF NOT EXISTS idx_recipe_type + ON recipe USING btree + (recipe_type COLLATE pg_catalog."default" ASC NULLS LAST); + +CREATE INDEX IF NOT EXISTS idx_resource_name + ON resource USING btree + (name COLLATE pg_catalog."default" ASC NULLS LAST); + +CREATE INDEX IF NOT EXISTS idx_resource_title + ON resource USING btree + (title COLLATE pg_catalog."default" ASC NULLS LAST); diff --git a/src/db/models.rs b/src/db/models.rs new file mode 100644 index 0000000..a2323f4 --- /dev/null +++ b/src/db/models.rs @@ -0,0 +1,46 @@ +// Generated by diesel_ext + +#![allow(unused)] +#![allow(clippy::all)] + + +use uuid::Uuid; +#[derive(Queryable, Debug)] +pub struct Icon { + pub id: Uuid, + pub name: String, + pub content_type: Option, + pub url: Option, + pub width: Option, + pub height: Option, + pub state: Option, +} + +#[derive(Queryable, Debug)] +pub struct Ingredient { + pub id: Uuid, + pub resource: Uuid, + pub quantity: i32, + pub state: Option, + pub recipe: Uuid, +} + +#[derive(Queryable, Debug)] +pub struct Recipe { + pub id: Uuid, + pub resource: Uuid, + pub recipe_type: String, + pub duration: i32, + pub state: Option, +} + +#[derive(Queryable, Debug)] +pub struct Resource { + pub id: Uuid, + pub name: String, + pub title: String, + pub url: Option, + pub icon: Option, + pub state: Option, +} + diff --git a/src/db/schema.rs b/src/db/schema.rs new file mode 100644 index 0000000..74e65d8 --- /dev/null +++ b/src/db/schema.rs @@ -0,0 +1,63 @@ +// @generated automatically by Diesel CLI. + +diesel::table! { + icon (id) { + id -> Uuid, + #[max_length = 255] + name -> Varchar, + #[max_length = 255] + content_type -> Nullable, + #[max_length = 512] + url -> Nullable, + width -> Nullable, + height -> Nullable, + state -> Nullable, + } +} + +diesel::table! { + ingredient (id) { + id -> Uuid, + resource -> Uuid, + quantity -> Int4, + state -> Nullable, + recipe -> Uuid, + } +} + +diesel::table! { + recipe (id) { + id -> Uuid, + resource -> Uuid, + #[max_length = 50] + recipe_type -> Varchar, + duration -> Int4, + state -> Nullable, + } +} + +diesel::table! { + resource (id) { + id -> Uuid, + #[max_length = 255] + name -> Varchar, + #[max_length = 255] + title -> Varchar, + #[max_length = 512] + url -> Nullable, + icon -> Nullable, + state -> Nullable, + } +} + +diesel::joinable!(ingredient -> recipe (recipe)); +diesel::joinable!(ingredient -> resource (resource)); +diesel::joinable!(recipe -> resource (resource)); +diesel::joinable!(resource -> icon (icon)); + +diesel::allow_tables_to_appear_in_same_query!( + icon, + ingredient, + recipe, + resource, +);