Refactor SQL queries into a dedicated module
- Moved SQL queries from multiple worker files into `src/worker/sql.rs` for better organization and maintainability. - Updated references in `stockage_manager.rs`, `transport.rs`, `underground.rs`, `user_character.rs`, and `value_recalculation.rs` to use the new centralized SQL queries. - Improved code readability by replacing `.get(0)` with `.first()` for better clarity when retrieving the first row from query results. - Cleaned up unnecessary comments and consolidated related SQL queries.
This commit is contained in:
@@ -10,6 +10,19 @@ use std::thread;
|
||||
use std::time::Duration;
|
||||
|
||||
use super::base::{BaseWorker, Worker, WorkerState};
|
||||
use crate::worker::sql::{
|
||||
QUERY_IS_PREVIOUS_DAY_CHARACTER_CREATED,
|
||||
QUERY_GET_TOWN_REGION_IDS,
|
||||
QUERY_LOAD_FIRST_NAMES,
|
||||
QUERY_LOAD_LAST_NAMES,
|
||||
QUERY_INSERT_CHARACTER,
|
||||
QUERY_GET_ELIGIBLE_NPC_FOR_DEATH,
|
||||
QUERY_DELETE_DIRECTOR,
|
||||
QUERY_DELETE_RELATIONSHIP,
|
||||
QUERY_DELETE_CHILD_RELATION,
|
||||
QUERY_INSERT_NOTIFICATION,
|
||||
QUERY_MARK_CHARACTER_DECEASED,
|
||||
};
|
||||
|
||||
pub struct CharacterCreationWorker {
|
||||
pub(crate) base: BaseWorker,
|
||||
@@ -21,145 +34,7 @@ pub struct CharacterCreationWorker {
|
||||
death_thread: Option<thread::JoinHandle<()>>,
|
||||
}
|
||||
|
||||
// SQL-Queries analog zur C++-Implementierung
|
||||
const QUERY_IS_PREVIOUS_DAY_CHARACTER_CREATED: &str = r#"
|
||||
SELECT created_at
|
||||
FROM falukant_data."character"
|
||||
WHERE user_id IS NULL
|
||||
AND created_at::date = CURRENT_DATE
|
||||
ORDER BY created_at DESC
|
||||
LIMIT 1;
|
||||
"#;
|
||||
|
||||
const QUERY_GET_TOWN_REGION_IDS: &str = r#"
|
||||
SELECT fdr.id
|
||||
FROM falukant_data.region fdr
|
||||
JOIN falukant_type.region ftr ON fdr.region_type_id = ftr.id
|
||||
WHERE ftr.label_tr = 'city';
|
||||
"#;
|
||||
|
||||
const QUERY_LOAD_FIRST_NAMES: &str = r#"
|
||||
SELECT id, gender
|
||||
FROM falukant_predefine.firstname;
|
||||
"#;
|
||||
|
||||
const QUERY_LOAD_LAST_NAMES: &str = r#"
|
||||
SELECT id
|
||||
FROM falukant_predefine.lastname;
|
||||
"#;
|
||||
|
||||
const QUERY_INSERT_CHARACTER: &str = r#"
|
||||
INSERT INTO falukant_data.character(
|
||||
user_id,
|
||||
region_id,
|
||||
first_name,
|
||||
last_name,
|
||||
birthdate,
|
||||
gender,
|
||||
created_at,
|
||||
updated_at,
|
||||
title_of_nobility
|
||||
) VALUES (
|
||||
NULL,
|
||||
$1,
|
||||
$2,
|
||||
$3,
|
||||
NOW(),
|
||||
$4,
|
||||
NOW(),
|
||||
NOW(),
|
||||
$5
|
||||
);
|
||||
"#;
|
||||
|
||||
const QUERY_GET_ELIGIBLE_NPC_FOR_DEATH: &str = r#"
|
||||
WITH aged AS (
|
||||
SELECT
|
||||
c.id,
|
||||
(current_date - c.birthdate::date) AS age,
|
||||
c.user_id
|
||||
FROM
|
||||
falukant_data.character c
|
||||
WHERE
|
||||
c.user_id IS NULL
|
||||
AND (current_date - c.birthdate::date) > 60
|
||||
),
|
||||
always_sel AS (
|
||||
SELECT *
|
||||
FROM aged
|
||||
WHERE age > 85
|
||||
),
|
||||
random_sel AS (
|
||||
SELECT *
|
||||
FROM aged
|
||||
WHERE age <= 85
|
||||
ORDER BY random()
|
||||
LIMIT 10
|
||||
)
|
||||
SELECT *
|
||||
FROM always_sel
|
||||
UNION ALL
|
||||
SELECT *
|
||||
FROM random_sel;
|
||||
"#;
|
||||
|
||||
const QUERY_DELETE_DIRECTOR: &str = r#"
|
||||
DELETE FROM falukant_data.director
|
||||
WHERE director_character_id = $1
|
||||
RETURNING employer_user_id;
|
||||
"#;
|
||||
|
||||
const QUERY_DELETE_RELATIONSHIP: &str = r#"
|
||||
WITH deleted AS (
|
||||
DELETE FROM falukant_data.relationship
|
||||
WHERE character1_id = $1
|
||||
OR character2_id = $1
|
||||
RETURNING
|
||||
CASE
|
||||
WHEN character1_id = $1 THEN character2_id
|
||||
ELSE character1_id
|
||||
END AS related_character_id,
|
||||
relationship_type_id
|
||||
)
|
||||
SELECT
|
||||
c.user_id AS related_user_id
|
||||
FROM deleted d
|
||||
JOIN falukant_data.character c
|
||||
ON c.id = d.related_character_id;
|
||||
"#;
|
||||
|
||||
const QUERY_DELETE_CHILD_RELATION: &str = r#"
|
||||
WITH deleted AS (
|
||||
DELETE FROM falukant_data.child_relation
|
||||
WHERE child_character_id = $1
|
||||
RETURNING
|
||||
father_character_id,
|
||||
mother_character_id
|
||||
)
|
||||
SELECT
|
||||
cf.user_id AS father_user_id,
|
||||
cm.user_id AS mother_user_id
|
||||
FROM deleted d
|
||||
JOIN falukant_data.character cf
|
||||
ON cf.id = d.father_character_id
|
||||
JOIN falukant_data.character cm
|
||||
ON cm.id = d.mother_character_id;
|
||||
"#;
|
||||
|
||||
const QUERY_INSERT_NOTIFICATION: &str = r#"
|
||||
INSERT INTO falukant_log.notification (
|
||||
user_id,
|
||||
tr,
|
||||
shown,
|
||||
created_at,
|
||||
updated_at
|
||||
) VALUES ($1, 'director_death', FALSE, NOW(), NOW());
|
||||
"#;
|
||||
|
||||
const QUERY_MARK_CHARACTER_DECEASED: &str = r#"
|
||||
DELETE FROM falukant_data.character
|
||||
WHERE id = $1;
|
||||
"#;
|
||||
|
||||
impl CharacterCreationWorker {
|
||||
pub fn new(pool: ConnectionPool, broker: MessageBroker) -> Self {
|
||||
@@ -329,10 +204,10 @@ impl CharacterCreationWorker {
|
||||
}
|
||||
|
||||
fn load_names(&mut self) {
|
||||
if self.first_name_cache.is_empty() || self.last_name_cache.is_empty() {
|
||||
if let Err(err) = self.load_first_and_last_names() {
|
||||
eprintln!("[CharacterCreationWorker] Fehler in loadNames: {err}");
|
||||
}
|
||||
if (self.first_name_cache.is_empty() || self.last_name_cache.is_empty())
|
||||
&& let Err(err) = self.load_first_and_last_names()
|
||||
{
|
||||
eprintln!("[CharacterCreationWorker] Fehler in loadNames: {err}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -491,12 +366,12 @@ impl CharacterCreationWorker {
|
||||
.and_then(|v| v.parse::<i32>().ok())
|
||||
.unwrap_or(0);
|
||||
|
||||
if character_id > 0 && Self::calculate_death_probability(age) {
|
||||
if let Err(err) = Self::handle_character_death(pool, broker, character_id) {
|
||||
eprintln!(
|
||||
"[CharacterCreationWorker] Fehler beim Bearbeiten des NPC-Todes (id={character_id}): {err}"
|
||||
);
|
||||
}
|
||||
if character_id > 0 && Self::calculate_death_probability(age)
|
||||
&& let Err(err) = Self::handle_character_death(pool, broker, character_id)
|
||||
{
|
||||
eprintln!(
|
||||
"[CharacterCreationWorker] Fehler beim Bearbeiten des NPC-Todes (id={character_id}): {err}"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -531,13 +406,12 @@ impl CharacterCreationWorker {
|
||||
// 1) Director löschen und User benachrichtigen
|
||||
conn.prepare("delete_director", QUERY_DELETE_DIRECTOR)?;
|
||||
let dir_result = conn.execute("delete_director", &[&character_id])?;
|
||||
if let Some(row) = dir_result.get(0) {
|
||||
if let Some(user_id) = row
|
||||
if let Some(row) = dir_result.first()
|
||||
&& let Some(user_id) = row
|
||||
.get("employer_user_id")
|
||||
.and_then(|v| v.parse::<i32>().ok())
|
||||
{
|
||||
Self::notify_user(pool, broker, user_id, "director_death")?;
|
||||
}
|
||||
{
|
||||
Self::notify_user(pool, broker, user_id, "director_death")?;
|
||||
}
|
||||
|
||||
// 2) Relationships löschen und betroffene User benachrichtigen
|
||||
|
||||
Reference in New Issue
Block a user