Update for db

This commit is contained in:
2025-06-16 08:03:02 +02:00
parent 711c27967b
commit ed64cd886b
10 changed files with 230 additions and 2 deletions

1
.env Normal file
View File

@@ -0,0 +1 @@
DATABASE_URL=postgres://postgres:.admin1@localhost/no_man_sky2

View File

@@ -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"

9
diesel.toml Normal file
View File

@@ -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"

0
migrations/.keep Normal file
View File

View File

@@ -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();

View File

@@ -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;

View File

@@ -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";

View File

@@ -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);

46
src/db/models.rs Normal file
View File

@@ -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<String>,
pub url: Option<String>,
pub width: Option<i32>,
pub height: Option<i32>,
pub state: Option<Json>,
}
#[derive(Queryable, Debug)]
pub struct Ingredient {
pub id: Uuid,
pub resource: Uuid,
pub quantity: i32,
pub state: Option<Json>,
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<Json>,
}
#[derive(Queryable, Debug)]
pub struct Resource {
pub id: Uuid,
pub name: String,
pub title: String,
pub url: Option<String>,
pub icon: Option<Uuid>,
pub state: Option<Json>,
}

63
src/db/schema.rs Normal file
View File

@@ -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<Varchar>,
#[max_length = 512]
url -> Nullable<Varchar>,
width -> Nullable<Int4>,
height -> Nullable<Int4>,
state -> Nullable<Json>,
}
}
diesel::table! {
ingredient (id) {
id -> Uuid,
resource -> Uuid,
quantity -> Int4,
state -> Nullable<Json>,
recipe -> Uuid,
}
}
diesel::table! {
recipe (id) {
id -> Uuid,
resource -> Uuid,
#[max_length = 50]
recipe_type -> Varchar,
duration -> Int4,
state -> Nullable<Json>,
}
}
diesel::table! {
resource (id) {
id -> Uuid,
#[max_length = 255]
name -> Varchar,
#[max_length = 255]
title -> Varchar,
#[max_length = 512]
url -> Nullable<Varchar>,
icon -> Nullable<Uuid>,
state -> Nullable<Json>,
}
}
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,
);