From b8f33e252ab797e90a8ff6634aac86c60dd12c3b Mon Sep 17 00:00:00 2001 From: vikingowl Date: Thu, 21 Aug 2025 00:22:03 +0200 Subject: [PATCH] [feat] add initial database schema with tables, triggers, and views --- database/main/attribute.sql | 9 +++++ database/main/book.sql | 20 +++++++++++ database/main/citation.sql | 17 ++++++++++ database/main/culture.sql | 12 +++++++ database/main/culture_citation.sql | 14 ++++++++ database/main/culture_language.sql | 15 +++++++++ database/main/culture_profession.sql | 14 ++++++++ database/main/culture_script.sql | 14 ++++++++ database/main/culture_trait.sql | 21 ++++++++++++ database/main/exclusive_group.sql | 9 +++++ database/main/exclusive_group_member.sql | 9 +++++ database/main/kampftechnik.sql | 17 ++++++++++ database/main/language.sql | 10 ++++++ database/main/liturgy.sql | 22 +++++++++++++ database/main/liturgy_citation.sql | 14 ++++++++ database/main/liturgy_tradition.sql | 14 ++++++++ database/main/liturgy_zielkategorie.sql | 14 ++++++++ database/main/merkmal.sql | 8 +++++ database/main/profession.sql | 14 ++++++++ database/main/profession_citation.sql | 14 ++++++++ database/main/profession_special_ability.sql | 14 ++++++++ database/main/profession_trait.sql | 19 +++++++++++ database/main/requirement.sql | 31 ++++++++++++++++++ database/main/sa_type.sql | 7 ++++ database/main/script.sql | 10 ++++++ database/main/special_ability.sql | 14 ++++++++ database/main/special_ability_citation.sql | 14 ++++++++ database/main/species.sql | 17 ++++++++++ database/main/species_attribute_mod.sql | 15 +++++++++ database/main/species_citation.sql | 14 ++++++++ database/main/species_trait.sql | 21 ++++++++++++ database/main/spell.sql | 22 +++++++++++++ database/main/spell_citation.sql | 14 ++++++++ database/main/spell_merkmal.sql | 14 ++++++++ database/main/spell_tradition.sql | 14 ++++++++ database/main/spell_zielkategorie.sql | 14 ++++++++ database/main/talent.sql | 24 ++++++++++++++ database/main/talent_citation.sql | 14 ++++++++ database/main/talent_group.sql | 7 ++++ database/main/tradition.sql | 8 +++++ database/main/trait.sql | 25 ++++++++++++++ database/main/trait_citation.sql | 14 ++++++++ database/main/trait_conflict.sql | 11 +++++++ database/main/trait_level.sql | 12 +++++++ .../trg_requirement_check_attr_insert.sql | 10 ++++++ .../trg_requirement_check_attr_update.sql | 10 ++++++ .../trg_requirement_check_culture_insert.sql | 10 ++++++ .../trg_requirement_check_culture_update.sql | 10 ++++++ .../trg_requirement_check_exclgrp_insert.sql | 10 ++++++ .../trg_requirement_check_exclgrp_update.sql | 10 ++++++ .../trg_requirement_check_merk_insert.sql | 10 ++++++ .../trg_requirement_check_merk_update.sql | 10 ++++++ .../main/trg_requirement_check_sf_insert.sql | 10 ++++++ .../main/trg_requirement_check_sf_update.sql | 10 ++++++ .../trg_requirement_check_species_insert.sql | 10 ++++++ .../trg_requirement_check_species_update.sql | 10 ++++++ .../trg_requirement_check_talent_insert.sql | 10 ++++++ .../trg_requirement_check_talent_update.sql | 10 ++++++ .../trg_requirement_check_trad_insert.sql | 10 ++++++ .../trg_requirement_check_trad_update.sql | 10 ++++++ .../trg_requirement_check_trait_insert.sql | 10 ++++++ .../trg_requirement_check_trait_update.sql | 10 ++++++ database/main/trg_trait_conflict_order.sql | 7 ++++ database/main/v_book_index.sql | 17 ++++++++++ database/main/v_requirement_debug.sql | 13 ++++++++ database/main/v_species_auto_traits.sql | 7 ++++ database/main/zielkategorie.sql | 8 +++++ rules.db | Bin 0 -> 544768 bytes 68 files changed, 882 insertions(+) create mode 100644 database/main/attribute.sql create mode 100644 database/main/book.sql create mode 100644 database/main/citation.sql create mode 100644 database/main/culture.sql create mode 100644 database/main/culture_citation.sql create mode 100644 database/main/culture_language.sql create mode 100644 database/main/culture_profession.sql create mode 100644 database/main/culture_script.sql create mode 100644 database/main/culture_trait.sql create mode 100644 database/main/exclusive_group.sql create mode 100644 database/main/exclusive_group_member.sql create mode 100644 database/main/kampftechnik.sql create mode 100644 database/main/language.sql create mode 100644 database/main/liturgy.sql create mode 100644 database/main/liturgy_citation.sql create mode 100644 database/main/liturgy_tradition.sql create mode 100644 database/main/liturgy_zielkategorie.sql create mode 100644 database/main/merkmal.sql create mode 100644 database/main/profession.sql create mode 100644 database/main/profession_citation.sql create mode 100644 database/main/profession_special_ability.sql create mode 100644 database/main/profession_trait.sql create mode 100644 database/main/requirement.sql create mode 100644 database/main/sa_type.sql create mode 100644 database/main/script.sql create mode 100644 database/main/special_ability.sql create mode 100644 database/main/special_ability_citation.sql create mode 100644 database/main/species.sql create mode 100644 database/main/species_attribute_mod.sql create mode 100644 database/main/species_citation.sql create mode 100644 database/main/species_trait.sql create mode 100644 database/main/spell.sql create mode 100644 database/main/spell_citation.sql create mode 100644 database/main/spell_merkmal.sql create mode 100644 database/main/spell_tradition.sql create mode 100644 database/main/spell_zielkategorie.sql create mode 100644 database/main/talent.sql create mode 100644 database/main/talent_citation.sql create mode 100644 database/main/talent_group.sql create mode 100644 database/main/tradition.sql create mode 100644 database/main/trait.sql create mode 100644 database/main/trait_citation.sql create mode 100644 database/main/trait_conflict.sql create mode 100644 database/main/trait_level.sql create mode 100644 database/main/trg_requirement_check_attr_insert.sql create mode 100644 database/main/trg_requirement_check_attr_update.sql create mode 100644 database/main/trg_requirement_check_culture_insert.sql create mode 100644 database/main/trg_requirement_check_culture_update.sql create mode 100644 database/main/trg_requirement_check_exclgrp_insert.sql create mode 100644 database/main/trg_requirement_check_exclgrp_update.sql create mode 100644 database/main/trg_requirement_check_merk_insert.sql create mode 100644 database/main/trg_requirement_check_merk_update.sql create mode 100644 database/main/trg_requirement_check_sf_insert.sql create mode 100644 database/main/trg_requirement_check_sf_update.sql create mode 100644 database/main/trg_requirement_check_species_insert.sql create mode 100644 database/main/trg_requirement_check_species_update.sql create mode 100644 database/main/trg_requirement_check_talent_insert.sql create mode 100644 database/main/trg_requirement_check_talent_update.sql create mode 100644 database/main/trg_requirement_check_trad_insert.sql create mode 100644 database/main/trg_requirement_check_trad_update.sql create mode 100644 database/main/trg_requirement_check_trait_insert.sql create mode 100644 database/main/trg_requirement_check_trait_update.sql create mode 100644 database/main/trg_trait_conflict_order.sql create mode 100644 database/main/v_book_index.sql create mode 100644 database/main/v_requirement_debug.sql create mode 100644 database/main/v_species_auto_traits.sql create mode 100644 database/main/zielkategorie.sql create mode 100644 rules.db diff --git a/database/main/attribute.sql b/database/main/attribute.sql new file mode 100644 index 0000000..0f57ba5 --- /dev/null +++ b/database/main/attribute.sql @@ -0,0 +1,9 @@ +create table attribute +( + id INTEGER + primary key, + code TEXT + unique, + name TEXT +); + diff --git a/database/main/book.sql b/database/main/book.sql new file mode 100644 index 0000000..46f79aa --- /dev/null +++ b/database/main/book.sql @@ -0,0 +1,20 @@ +create table book +( + id INTEGER + primary key, + code TEXT not null + unique, + title TEXT not null, + subtitle TEXT, + series TEXT, + volume TEXT, + edition TEXT, + isbn13 TEXT + unique, + publisher TEXT, + language TEXT, + published_at TEXT, + url TEXT, + license TEXT +); + diff --git a/database/main/citation.sql b/database/main/citation.sql new file mode 100644 index 0000000..bde3989 --- /dev/null +++ b/database/main/citation.sql @@ -0,0 +1,17 @@ +create table citation +( + id INTEGER + primary key, + book_id INTEGER not null + references book + on delete cascade, + page_start INTEGER not null, + page_end INTEGER, + section TEXT, + anchor TEXT, + note TEXT +); + +create index idx_citation_book + on citation (book_id, page_start); + diff --git a/database/main/culture.sql b/database/main/culture.sql new file mode 100644 index 0000000..aed6ada --- /dev/null +++ b/database/main/culture.sql @@ -0,0 +1,12 @@ +create table culture +( + id INTEGER + primary key, + optolith_key TEXT not null + unique, + name TEXT not null +); + +create index idx_culture_name + on culture (name); + diff --git a/database/main/culture_citation.sql b/database/main/culture_citation.sql new file mode 100644 index 0000000..1eb7fb8 --- /dev/null +++ b/database/main/culture_citation.sql @@ -0,0 +1,14 @@ +create table culture_citation +( + culture_id INTEGER not null + references culture + on delete cascade, + citation_id INTEGER not null + references citation + on delete cascade, + primary key (culture_id, citation_id) +); + +create index idx_culture_citation_cit + on culture_citation (citation_id); + diff --git a/database/main/culture_language.sql b/database/main/culture_language.sql new file mode 100644 index 0000000..49d8241 --- /dev/null +++ b/database/main/culture_language.sql @@ -0,0 +1,15 @@ +create table culture_language +( + culture_id INTEGER not null + references culture + on delete cascade, + language_id INTEGER not null + references language + on delete restrict, + level TEXT, + primary key (culture_id, language_id) +); + +create index idx_culture_language_lang + on culture_language (language_id); + diff --git a/database/main/culture_profession.sql b/database/main/culture_profession.sql new file mode 100644 index 0000000..0700b07 --- /dev/null +++ b/database/main/culture_profession.sql @@ -0,0 +1,14 @@ +create table culture_profession +( + culture_id INTEGER not null + references culture + on delete cascade, + profession_id INTEGER not null + references profession + on delete restrict, + primary key (culture_id, profession_id) +); + +create index idx_culture_profession_prof + on culture_profession (profession_id); + diff --git a/database/main/culture_script.sql b/database/main/culture_script.sql new file mode 100644 index 0000000..b764783 --- /dev/null +++ b/database/main/culture_script.sql @@ -0,0 +1,14 @@ +create table culture_script +( + culture_id INTEGER not null + references culture + on delete cascade, + script_id INTEGER not null + references script + on delete restrict, + primary key (culture_id, script_id) +); + +create index idx_culture_script_script + on culture_script (script_id); + diff --git a/database/main/culture_trait.sql b/database/main/culture_trait.sql new file mode 100644 index 0000000..63e4df8 --- /dev/null +++ b/database/main/culture_trait.sql @@ -0,0 +1,21 @@ +create table culture_trait +( + culture_id INTEGER not null + references culture + on delete cascade, + trait_id INTEGER not null + references trait + on delete restrict, + tag TEXT not null, + level INTEGER, + param_value TEXT, + primary key (culture_id, trait_id, tag), + check (tag IN ('TYPISCH', 'EMPFOHLEN')) +); + +create index idx_culture_trait_trait + on culture_trait (trait_id); + +create index idx_culture_trait_trait2 + on culture_trait (trait_id); + diff --git a/database/main/exclusive_group.sql b/database/main/exclusive_group.sql new file mode 100644 index 0000000..39c32d8 --- /dev/null +++ b/database/main/exclusive_group.sql @@ -0,0 +1,9 @@ +create table exclusive_group +( + id INTEGER + primary key, + name TEXT not null, + scope TEXT not null, + check (scope IN ('TRAIT', 'SF', 'TALENT', 'SPELL', 'LITURGY')) +); + diff --git a/database/main/exclusive_group_member.sql b/database/main/exclusive_group_member.sql new file mode 100644 index 0000000..7841df3 --- /dev/null +++ b/database/main/exclusive_group_member.sql @@ -0,0 +1,9 @@ +create table exclusive_group_member +( + group_id INTEGER not null + references exclusive_group + on delete cascade, + owner_id INTEGER not null, + primary key (group_id, owner_id) +); + diff --git a/database/main/kampftechnik.sql b/database/main/kampftechnik.sql new file mode 100644 index 0000000..96b52dd --- /dev/null +++ b/database/main/kampftechnik.sql @@ -0,0 +1,17 @@ +create table kampftechnik +( + id INTEGER + primary key, + optolith_key TEXT not null + unique, + name TEXT not null, + grundwert INTEGER default 6 not null, + probe_attr1_id INTEGER + references attribute, + probe_attr2_id INTEGER + references attribute, + probe_attr3_id INTEGER + references attribute, + beschreibung TEXT +); + diff --git a/database/main/language.sql b/database/main/language.sql new file mode 100644 index 0000000..fa9d674 --- /dev/null +++ b/database/main/language.sql @@ -0,0 +1,10 @@ +create table language +( + id INTEGER + primary key, + code TEXT + unique, + name TEXT not null + unique +); + diff --git a/database/main/liturgy.sql b/database/main/liturgy.sql new file mode 100644 index 0000000..079d9b1 --- /dev/null +++ b/database/main/liturgy.sql @@ -0,0 +1,22 @@ +create table liturgy +( + id INTEGER + primary key, + optolith_key TEXT not null + unique, + name TEXT not null, + probe_attr1_id INTEGER not null + references attribute, + probe_attr2_id INTEGER not null + references attribute, + probe_attr3_id INTEGER not null + references attribute, + wirkung TEXT, + dauer TEXT, + kap_kosten TEXT, + reichweite TEXT, + wirkungsdauer TEXT, + steig_faktor TEXT not null, + check (steig_faktor IN ('A', 'B', 'C', 'D')) +); + diff --git a/database/main/liturgy_citation.sql b/database/main/liturgy_citation.sql new file mode 100644 index 0000000..da6a772 --- /dev/null +++ b/database/main/liturgy_citation.sql @@ -0,0 +1,14 @@ +create table liturgy_citation +( + liturgy_id INTEGER not null + references liturgy + on delete cascade, + citation_id INTEGER not null + references citation + on delete cascade, + primary key (liturgy_id, citation_id) +); + +create index idx_liturgy_citation_cit + on liturgy_citation (citation_id); + diff --git a/database/main/liturgy_tradition.sql b/database/main/liturgy_tradition.sql new file mode 100644 index 0000000..04bb411 --- /dev/null +++ b/database/main/liturgy_tradition.sql @@ -0,0 +1,14 @@ +create table liturgy_tradition +( + liturgy_id INTEGER not null + references liturgy + on delete cascade, + tradition_id INTEGER not null + references tradition + on delete restrict, + primary key (liturgy_id, tradition_id) +); + +create index idx_liturgy_tradition_t + on liturgy_tradition (tradition_id); + diff --git a/database/main/liturgy_zielkategorie.sql b/database/main/liturgy_zielkategorie.sql new file mode 100644 index 0000000..1d02acf --- /dev/null +++ b/database/main/liturgy_zielkategorie.sql @@ -0,0 +1,14 @@ +create table liturgy_zielkategorie +( + liturgy_id INTEGER not null + references liturgy + on delete cascade, + zielkategorie_id INTEGER not null + references zielkategorie + on delete restrict, + primary key (liturgy_id, zielkategorie_id) +); + +create index idx_liturgy_zielkat_z + on liturgy_zielkategorie (zielkategorie_id); + diff --git a/database/main/merkmal.sql b/database/main/merkmal.sql new file mode 100644 index 0000000..3c0adf7 --- /dev/null +++ b/database/main/merkmal.sql @@ -0,0 +1,8 @@ +create table merkmal +( + id INTEGER + primary key, + name TEXT not null + unique +); + diff --git a/database/main/profession.sql b/database/main/profession.sql new file mode 100644 index 0000000..b7a75ee --- /dev/null +++ b/database/main/profession.sql @@ -0,0 +1,14 @@ +create table profession +( + id INTEGER + primary key, + optolith_key TEXT not null + unique, + name TEXT not null, + typ TEXT, + beschreibung TEXT +); + +create index idx_profession_name + on profession (name); + diff --git a/database/main/profession_citation.sql b/database/main/profession_citation.sql new file mode 100644 index 0000000..9c3a266 --- /dev/null +++ b/database/main/profession_citation.sql @@ -0,0 +1,14 @@ +create table profession_citation +( + profession_id INTEGER not null + references profession + on delete cascade, + citation_id INTEGER not null + references citation + on delete cascade, + primary key (profession_id, citation_id) +); + +create index idx_profession_citation_cit + on profession_citation (citation_id); + diff --git a/database/main/profession_special_ability.sql b/database/main/profession_special_ability.sql new file mode 100644 index 0000000..f509a17 --- /dev/null +++ b/database/main/profession_special_ability.sql @@ -0,0 +1,14 @@ +create table profession_special_ability +( + profession_id INTEGER not null + references profession + on delete cascade, + special_ability_id INTEGER not null + references special_ability + on delete restrict, + primary key (profession_id, special_ability_id) +); + +create index idx_profession_sa_sa + on profession_special_ability (special_ability_id); + diff --git a/database/main/profession_trait.sql b/database/main/profession_trait.sql new file mode 100644 index 0000000..90f7f78 --- /dev/null +++ b/database/main/profession_trait.sql @@ -0,0 +1,19 @@ +create table profession_trait +( + profession_id INTEGER not null + references profession + on delete cascade, + trait_id INTEGER not null + references trait + on delete restrict, + level INTEGER, + param_value TEXT, + primary key (profession_id, trait_id) +); + +create index idx_profession_trait_trait + on profession_trait (trait_id); + +create index idx_profession_trait_trait2 + on profession_trait (trait_id); + diff --git a/database/main/requirement.sql b/database/main/requirement.sql new file mode 100644 index 0000000..bc2f676 --- /dev/null +++ b/database/main/requirement.sql @@ -0,0 +1,31 @@ +create table requirement +( + id INTEGER + primary key, + owner_kind TEXT not null, + owner_id INTEGER not null, + group_no INTEGER default 1 not null, + negate INTEGER default 0 not null, + req_type TEXT not null, + req_id INTEGER, + req_level INTEGER, + req_optokey TEXT, + note TEXT, + check (negate IN (0, 1)), + check (owner_kind IN ( + 'TRAIT', 'SF', 'TALENT', 'SPELL', 'LITURGY', 'PROFESSION', 'SPECIES', 'CULTURE' + )), + check (req_type IN ( + 'TRAIT', 'TRAIT_LEVEL_MIN', + 'ATTR_MIN', 'TALENT_MIN', 'SF', + 'SPECIES', 'CULTURE', 'TRADITION', 'MERKMAL', + 'EXCLUSIVE_GROUP' + )) +); + +create index idx_requirement_owner + on requirement (owner_kind, owner_id, group_no); + +create index idx_requirement_ref + on requirement (req_type, req_id); + diff --git a/database/main/sa_type.sql b/database/main/sa_type.sql new file mode 100644 index 0000000..be64a6f --- /dev/null +++ b/database/main/sa_type.sql @@ -0,0 +1,7 @@ +create table sa_type +( + code TEXT + primary key, + name TEXT not null +); + diff --git a/database/main/script.sql b/database/main/script.sql new file mode 100644 index 0000000..9245f5a --- /dev/null +++ b/database/main/script.sql @@ -0,0 +1,10 @@ +create table script +( + id INTEGER + primary key, + code TEXT + unique, + name TEXT not null + unique +); + diff --git a/database/main/special_ability.sql b/database/main/special_ability.sql new file mode 100644 index 0000000..24f7222 --- /dev/null +++ b/database/main/special_ability.sql @@ -0,0 +1,14 @@ +create table special_ability +( + id INTEGER + primary key, + optolith_key TEXT not null + unique, + name TEXT not null, + type_code TEXT + references sa_type + on update cascade, + ap_kosten INTEGER, + beschreibung TEXT +); + diff --git a/database/main/special_ability_citation.sql b/database/main/special_ability_citation.sql new file mode 100644 index 0000000..3db6857 --- /dev/null +++ b/database/main/special_ability_citation.sql @@ -0,0 +1,14 @@ +create table special_ability_citation +( + special_ability_id INTEGER not null + references special_ability + on delete cascade, + citation_id INTEGER not null + references citation + on delete cascade, + primary key (special_ability_id, citation_id) +); + +create index idx_special_ability_citation_cit + on special_ability_citation (citation_id); + diff --git a/database/main/species.sql b/database/main/species.sql new file mode 100644 index 0000000..9d3f6e9 --- /dev/null +++ b/database/main/species.sql @@ -0,0 +1,17 @@ +create table species +( + id INTEGER + primary key, + optolith_key TEXT not null + unique, + name TEXT not null, + ap_kosten INTEGER, + le_grund INTEGER, + sk_grund INTEGER, + zk_grund INTEGER, + gs_grund INTEGER +); + +create index idx_species_name + on species (name); + diff --git a/database/main/species_attribute_mod.sql b/database/main/species_attribute_mod.sql new file mode 100644 index 0000000..50c8944 --- /dev/null +++ b/database/main/species_attribute_mod.sql @@ -0,0 +1,15 @@ +create table species_attribute_mod +( + species_id INTEGER not null + references species + on delete cascade, + attribute_id INTEGER not null + references attribute + on delete restrict, + delta INTEGER not null, + primary key (species_id, attribute_id) +); + +create index idx_species_attrmod_attr + on species_attribute_mod (attribute_id); + diff --git a/database/main/species_citation.sql b/database/main/species_citation.sql new file mode 100644 index 0000000..89e854a --- /dev/null +++ b/database/main/species_citation.sql @@ -0,0 +1,14 @@ +create table species_citation +( + species_id INTEGER not null + references species + on delete cascade, + citation_id INTEGER not null + references citation + on delete cascade, + primary key (species_id, citation_id) +); + +create index idx_species_citation_cit + on species_citation (citation_id); + diff --git a/database/main/species_trait.sql b/database/main/species_trait.sql new file mode 100644 index 0000000..e733083 --- /dev/null +++ b/database/main/species_trait.sql @@ -0,0 +1,21 @@ +create table species_trait +( + species_id INTEGER not null + references species + on delete cascade, + trait_id INTEGER not null + references trait + on delete restrict, + source TEXT not null, + level INTEGER, + param_value TEXT, + primary key (species_id, trait_id, source), + check (source IN ('AUTOMATISCH', 'TYPISCH', 'EMPFOHLEN')) +); + +create index idx_species_trait_trait + on species_trait (trait_id); + +create index idx_species_trait_trait2 + on species_trait (trait_id); + diff --git a/database/main/spell.sql b/database/main/spell.sql new file mode 100644 index 0000000..dcff04a --- /dev/null +++ b/database/main/spell.sql @@ -0,0 +1,22 @@ +create table spell +( + id INTEGER + primary key, + optolith_key TEXT not null + unique, + name TEXT not null, + probe_attr1_id INTEGER not null + references attribute, + probe_attr2_id INTEGER not null + references attribute, + probe_attr3_id INTEGER not null + references attribute, + wirkung TEXT, + zauberdauer TEXT, + asp_kosten TEXT, + reichweite TEXT, + wirkungsdauer TEXT, + steig_faktor TEXT not null, + check (steig_faktor IN ('A', 'B', 'C', 'D')) +); + diff --git a/database/main/spell_citation.sql b/database/main/spell_citation.sql new file mode 100644 index 0000000..74ad038 --- /dev/null +++ b/database/main/spell_citation.sql @@ -0,0 +1,14 @@ +create table spell_citation +( + spell_id INTEGER not null + references spell + on delete cascade, + citation_id INTEGER not null + references citation + on delete cascade, + primary key (spell_id, citation_id) +); + +create index idx_spell_citation_cit + on spell_citation (citation_id); + diff --git a/database/main/spell_merkmal.sql b/database/main/spell_merkmal.sql new file mode 100644 index 0000000..79eb6de --- /dev/null +++ b/database/main/spell_merkmal.sql @@ -0,0 +1,14 @@ +create table spell_merkmal +( + spell_id INTEGER not null + references spell + on delete cascade, + merkmal_id INTEGER not null + references merkmal + on delete restrict, + primary key (spell_id, merkmal_id) +); + +create index idx_spell_merkmal_m + on spell_merkmal (merkmal_id); + diff --git a/database/main/spell_tradition.sql b/database/main/spell_tradition.sql new file mode 100644 index 0000000..e867ea7 --- /dev/null +++ b/database/main/spell_tradition.sql @@ -0,0 +1,14 @@ +create table spell_tradition +( + spell_id INTEGER not null + references spell + on delete cascade, + tradition_id INTEGER not null + references tradition + on delete restrict, + primary key (spell_id, tradition_id) +); + +create index idx_spell_tradition_t + on spell_tradition (tradition_id); + diff --git a/database/main/spell_zielkategorie.sql b/database/main/spell_zielkategorie.sql new file mode 100644 index 0000000..5b98038 --- /dev/null +++ b/database/main/spell_zielkategorie.sql @@ -0,0 +1,14 @@ +create table spell_zielkategorie +( + spell_id INTEGER not null + references spell + on delete cascade, + zielkategorie_id INTEGER not null + references zielkategorie + on delete restrict, + primary key (spell_id, zielkategorie_id) +); + +create index idx_spell_zielkat_z + on spell_zielkategorie (zielkategorie_id); + diff --git a/database/main/talent.sql b/database/main/talent.sql new file mode 100644 index 0000000..dca637b --- /dev/null +++ b/database/main/talent.sql @@ -0,0 +1,24 @@ +create table talent +( + id INTEGER + primary key, + optolith_key TEXT not null + unique, + name TEXT not null, + group_code TEXT + references talent_group + on update cascade, + probe_attr1_id INTEGER not null + references attribute, + probe_attr2_id INTEGER not null + references attribute, + probe_attr3_id INTEGER not null + references attribute, + steig_faktor TEXT not null, + beschreibung TEXT, + check (steig_faktor IN ('A', 'B', 'C', 'D')) +); + +create index idx_talent_group + on talent (group_code); + diff --git a/database/main/talent_citation.sql b/database/main/talent_citation.sql new file mode 100644 index 0000000..6c0e7ab --- /dev/null +++ b/database/main/talent_citation.sql @@ -0,0 +1,14 @@ +create table talent_citation +( + talent_id INTEGER not null + references talent + on delete cascade, + citation_id INTEGER not null + references citation + on delete cascade, + primary key (talent_id, citation_id) +); + +create index idx_talent_citation_cit + on talent_citation (citation_id); + diff --git a/database/main/talent_group.sql b/database/main/talent_group.sql new file mode 100644 index 0000000..2018b56 --- /dev/null +++ b/database/main/talent_group.sql @@ -0,0 +1,7 @@ +create table talent_group +( + code TEXT + primary key, + name TEXT not null +); + diff --git a/database/main/tradition.sql b/database/main/tradition.sql new file mode 100644 index 0000000..05b3129 --- /dev/null +++ b/database/main/tradition.sql @@ -0,0 +1,8 @@ +create table tradition +( + id INTEGER + primary key, + name TEXT not null + unique +); + diff --git a/database/main/trait.sql b/database/main/trait.sql new file mode 100644 index 0000000..5e5a538 --- /dev/null +++ b/database/main/trait.sql @@ -0,0 +1,25 @@ +create table trait +( + id INTEGER + primary key, + optolith_key TEXT not null + unique, + name TEXT not null, + kind TEXT not null, + is_leveled INTEGER default 0 not null, + level_min INTEGER, + level_max INTEGER, + level_step INTEGER, + ap_cost_mode TEXT default 'FIXED' not null, + ap_wert INTEGER, + ap_per_level INTEGER, + ap_formula TEXT, + beschreibung TEXT, + check (ap_cost_mode IN ('FIXED', 'PER_LEVEL', 'TABLE', 'FORMULA')), + check (is_leveled IN (0, 1)), + check (kind IN ('VORTEIL', 'NACHTEIL')) +); + +create index idx_trait_kind + on trait (kind); + diff --git a/database/main/trait_citation.sql b/database/main/trait_citation.sql new file mode 100644 index 0000000..d78de40 --- /dev/null +++ b/database/main/trait_citation.sql @@ -0,0 +1,14 @@ +create table trait_citation +( + trait_id INTEGER not null + references trait + on delete cascade, + citation_id INTEGER not null + references citation + on delete cascade, + primary key (trait_id, citation_id) +); + +create index idx_trait_citation_cit + on trait_citation (citation_id); + diff --git a/database/main/trait_conflict.sql b/database/main/trait_conflict.sql new file mode 100644 index 0000000..e5e925d --- /dev/null +++ b/database/main/trait_conflict.sql @@ -0,0 +1,11 @@ +create table trait_conflict +( + trait_id INTEGER not null + references trait + on delete cascade, + incompatible_trait_id INTEGER not null + references trait + on delete cascade, + primary key (trait_id, incompatible_trait_id) +); + diff --git a/database/main/trait_level.sql b/database/main/trait_level.sql new file mode 100644 index 0000000..0f12916 --- /dev/null +++ b/database/main/trait_level.sql @@ -0,0 +1,12 @@ +create table trait_level +( + trait_id INTEGER not null + references trait + on delete cascade, + level INTEGER not null, + ap_cost INTEGER, + label TEXT, + note TEXT, + primary key (trait_id, level) +); + diff --git a/database/main/trg_requirement_check_attr_insert.sql b/database/main/trg_requirement_check_attr_insert.sql new file mode 100644 index 0000000..bf03f5e --- /dev/null +++ b/database/main/trg_requirement_check_attr_insert.sql @@ -0,0 +1,10 @@ +CREATE TRIGGER trg_requirement_check_attr_insert +BEFORE INSERT ON requirement +WHEN NEW.req_type = 'ATTR_MIN' +BEGIN + SELECT CASE + WHEN NEW.req_id IS NULL OR NOT EXISTS (SELECT 1 FROM attribute WHERE id = NEW.req_id) + THEN RAISE(ABORT, 'requirement.req_id must reference attribute.id for ATTR_MIN') + END; +END; + diff --git a/database/main/trg_requirement_check_attr_update.sql b/database/main/trg_requirement_check_attr_update.sql new file mode 100644 index 0000000..f053eda --- /dev/null +++ b/database/main/trg_requirement_check_attr_update.sql @@ -0,0 +1,10 @@ +CREATE TRIGGER trg_requirement_check_attr_update +BEFORE UPDATE ON requirement +WHEN NEW.req_type = 'ATTR_MIN' +BEGIN + SELECT CASE + WHEN NEW.req_id IS NULL OR NOT EXISTS (SELECT 1 FROM attribute WHERE id = NEW.req_id) + THEN RAISE(ABORT, 'requirement.req_id must reference attribute.id for ATTR_MIN (UPDATE)') + END; +END; + diff --git a/database/main/trg_requirement_check_culture_insert.sql b/database/main/trg_requirement_check_culture_insert.sql new file mode 100644 index 0000000..120cbe4 --- /dev/null +++ b/database/main/trg_requirement_check_culture_insert.sql @@ -0,0 +1,10 @@ +CREATE TRIGGER trg_requirement_check_culture_insert +BEFORE INSERT ON requirement +WHEN NEW.req_type='CULTURE' +BEGIN + SELECT CASE + WHEN NEW.req_id IS NULL OR NOT EXISTS (SELECT 1 FROM culture WHERE id=NEW.req_id) + THEN RAISE(ABORT,'requirement.req_id must reference culture.id for CULTURE') + END; +END; + diff --git a/database/main/trg_requirement_check_culture_update.sql b/database/main/trg_requirement_check_culture_update.sql new file mode 100644 index 0000000..e34aa99 --- /dev/null +++ b/database/main/trg_requirement_check_culture_update.sql @@ -0,0 +1,10 @@ +CREATE TRIGGER trg_requirement_check_culture_update +BEFORE UPDATE ON requirement +WHEN NEW.req_type='CULTURE' +BEGIN + SELECT CASE + WHEN NEW.req_id IS NULL OR NOT EXISTS (SELECT 1 FROM culture WHERE id=NEW.req_id) + THEN RAISE(ABORT,'requirement.req_id must reference culture.id for CULTURE (UPDATE)') + END; +END; + diff --git a/database/main/trg_requirement_check_exclgrp_insert.sql b/database/main/trg_requirement_check_exclgrp_insert.sql new file mode 100644 index 0000000..bb85e07 --- /dev/null +++ b/database/main/trg_requirement_check_exclgrp_insert.sql @@ -0,0 +1,10 @@ +CREATE TRIGGER trg_requirement_check_exclgrp_insert +BEFORE INSERT ON requirement +WHEN NEW.req_type='EXCLUSIVE_GROUP' +BEGIN + SELECT CASE + WHEN NEW.req_id IS NULL OR NOT EXISTS (SELECT 1 FROM exclusive_group WHERE id=NEW.req_id) + THEN RAISE(ABORT,'requirement.req_id must reference exclusive_group.id for EXCLUSIVE_GROUP') + END; +END; + diff --git a/database/main/trg_requirement_check_exclgrp_update.sql b/database/main/trg_requirement_check_exclgrp_update.sql new file mode 100644 index 0000000..a822f07 --- /dev/null +++ b/database/main/trg_requirement_check_exclgrp_update.sql @@ -0,0 +1,10 @@ +CREATE TRIGGER trg_requirement_check_exclgrp_update +BEFORE UPDATE ON requirement +WHEN NEW.req_type='EXCLUSIVE_GROUP' +BEGIN + SELECT CASE + WHEN NEW.req_id IS NULL OR NOT EXISTS (SELECT 1 FROM exclusive_group WHERE id=NEW.req_id) + THEN RAISE(ABORT,'requirement.req_id must reference exclusive_group.id for EXCLUSIVE_GROUP (UPDATE)') + END; +END; + diff --git a/database/main/trg_requirement_check_merk_insert.sql b/database/main/trg_requirement_check_merk_insert.sql new file mode 100644 index 0000000..2a21797 --- /dev/null +++ b/database/main/trg_requirement_check_merk_insert.sql @@ -0,0 +1,10 @@ +CREATE TRIGGER trg_requirement_check_merk_insert +BEFORE INSERT ON requirement +WHEN NEW.req_type='MERKMAL' +BEGIN + SELECT CASE + WHEN NEW.req_id IS NULL OR NOT EXISTS (SELECT 1 FROM merkmal WHERE id=NEW.req_id) + THEN RAISE(ABORT,'requirement.req_id must reference merkmal.id for MERKMAL') + END; +END; + diff --git a/database/main/trg_requirement_check_merk_update.sql b/database/main/trg_requirement_check_merk_update.sql new file mode 100644 index 0000000..cf017ea --- /dev/null +++ b/database/main/trg_requirement_check_merk_update.sql @@ -0,0 +1,10 @@ +CREATE TRIGGER trg_requirement_check_merk_update +BEFORE UPDATE ON requirement +WHEN NEW.req_type='MERKMAL' +BEGIN + SELECT CASE + WHEN NEW.req_id IS NULL OR NOT EXISTS (SELECT 1 FROM merkmal WHERE id=NEW.req_id) + THEN RAISE(ABORT,'requirement.req_id must reference merkmal.id for MERKMAL (UPDATE)') + END; +END; + diff --git a/database/main/trg_requirement_check_sf_insert.sql b/database/main/trg_requirement_check_sf_insert.sql new file mode 100644 index 0000000..ce3f059 --- /dev/null +++ b/database/main/trg_requirement_check_sf_insert.sql @@ -0,0 +1,10 @@ +CREATE TRIGGER trg_requirement_check_sf_insert +BEFORE INSERT ON requirement +WHEN NEW.req_type='SF' +BEGIN + SELECT CASE + WHEN NEW.req_id IS NULL OR NOT EXISTS (SELECT 1 FROM special_ability WHERE id=NEW.req_id) + THEN RAISE(ABORT,'requirement.req_id must reference special_ability.id for SF') + END; +END; + diff --git a/database/main/trg_requirement_check_sf_update.sql b/database/main/trg_requirement_check_sf_update.sql new file mode 100644 index 0000000..bc90bca --- /dev/null +++ b/database/main/trg_requirement_check_sf_update.sql @@ -0,0 +1,10 @@ +CREATE TRIGGER trg_requirement_check_sf_update +BEFORE UPDATE ON requirement +WHEN NEW.req_type='SF' +BEGIN + SELECT CASE + WHEN NEW.req_id IS NULL OR NOT EXISTS (SELECT 1 FROM special_ability WHERE id=NEW.req_id) + THEN RAISE(ABORT,'requirement.req_id must reference special_ability.id for SF (UPDATE)') + END; +END; + diff --git a/database/main/trg_requirement_check_species_insert.sql b/database/main/trg_requirement_check_species_insert.sql new file mode 100644 index 0000000..637e58e --- /dev/null +++ b/database/main/trg_requirement_check_species_insert.sql @@ -0,0 +1,10 @@ +CREATE TRIGGER trg_requirement_check_species_insert +BEFORE INSERT ON requirement +WHEN NEW.req_type='SPECIES' +BEGIN + SELECT CASE + WHEN NEW.req_id IS NULL OR NOT EXISTS (SELECT 1 FROM species WHERE id=NEW.req_id) + THEN RAISE(ABORT,'requirement.req_id must reference species.id for SPECIES') + END; +END; + diff --git a/database/main/trg_requirement_check_species_update.sql b/database/main/trg_requirement_check_species_update.sql new file mode 100644 index 0000000..71dba68 --- /dev/null +++ b/database/main/trg_requirement_check_species_update.sql @@ -0,0 +1,10 @@ +CREATE TRIGGER trg_requirement_check_species_update +BEFORE UPDATE ON requirement +WHEN NEW.req_type='SPECIES' +BEGIN + SELECT CASE + WHEN NEW.req_id IS NULL OR NOT EXISTS (SELECT 1 FROM species WHERE id=NEW.req_id) + THEN RAISE(ABORT,'requirement.req_id must reference species.id for SPECIES (UPDATE)') + END; +END; + diff --git a/database/main/trg_requirement_check_talent_insert.sql b/database/main/trg_requirement_check_talent_insert.sql new file mode 100644 index 0000000..e4b5636 --- /dev/null +++ b/database/main/trg_requirement_check_talent_insert.sql @@ -0,0 +1,10 @@ +CREATE TRIGGER trg_requirement_check_talent_insert +BEFORE INSERT ON requirement +WHEN NEW.req_type='TALENT_MIN' +BEGIN + SELECT CASE + WHEN NEW.req_id IS NULL OR NOT EXISTS (SELECT 1 FROM talent WHERE id=NEW.req_id) + THEN RAISE(ABORT,'requirement.req_id must reference talent.id for TALENT_MIN') + END; +END; + diff --git a/database/main/trg_requirement_check_talent_update.sql b/database/main/trg_requirement_check_talent_update.sql new file mode 100644 index 0000000..0b939e4 --- /dev/null +++ b/database/main/trg_requirement_check_talent_update.sql @@ -0,0 +1,10 @@ +CREATE TRIGGER trg_requirement_check_talent_update +BEFORE UPDATE ON requirement +WHEN NEW.req_type='TALENT_MIN' +BEGIN + SELECT CASE + WHEN NEW.req_id IS NULL OR NOT EXISTS (SELECT 1 FROM talent WHERE id=NEW.req_id) + THEN RAISE(ABORT,'requirement.req_id must reference talent.id for TALENT_MIN (UPDATE)') + END; +END; + diff --git a/database/main/trg_requirement_check_trad_insert.sql b/database/main/trg_requirement_check_trad_insert.sql new file mode 100644 index 0000000..f54a8f7 --- /dev/null +++ b/database/main/trg_requirement_check_trad_insert.sql @@ -0,0 +1,10 @@ +CREATE TRIGGER trg_requirement_check_trad_insert +BEFORE INSERT ON requirement +WHEN NEW.req_type='TRADITION' +BEGIN + SELECT CASE + WHEN NEW.req_id IS NULL OR NOT EXISTS (SELECT 1 FROM tradition WHERE id=NEW.req_id) + THEN RAISE(ABORT,'requirement.req_id must reference tradition.id for TRADITION') + END; +END; + diff --git a/database/main/trg_requirement_check_trad_update.sql b/database/main/trg_requirement_check_trad_update.sql new file mode 100644 index 0000000..0c4ef84 --- /dev/null +++ b/database/main/trg_requirement_check_trad_update.sql @@ -0,0 +1,10 @@ +CREATE TRIGGER trg_requirement_check_trad_update +BEFORE UPDATE ON requirement +WHEN NEW.req_type='TRADITION' +BEGIN + SELECT CASE + WHEN NEW.req_id IS NULL OR NOT EXISTS (SELECT 1 FROM tradition WHERE id=NEW.req_id) + THEN RAISE(ABORT,'requirement.req_id must reference tradition.id for TRADITION (UPDATE)') + END; +END; + diff --git a/database/main/trg_requirement_check_trait_insert.sql b/database/main/trg_requirement_check_trait_insert.sql new file mode 100644 index 0000000..a4ca131 --- /dev/null +++ b/database/main/trg_requirement_check_trait_insert.sql @@ -0,0 +1,10 @@ +CREATE TRIGGER trg_requirement_check_trait_insert +BEFORE INSERT ON requirement +WHEN NEW.req_type IN ('TRAIT','TRAIT_LEVEL_MIN') +BEGIN + SELECT CASE + WHEN NEW.req_id IS NULL OR NOT EXISTS (SELECT 1 FROM trait WHERE id = NEW.req_id) + THEN RAISE(ABORT, 'requirement.req_id must reference trait.id for TRAIT/TRAIT_LEVEL_MIN') + END; +END; + diff --git a/database/main/trg_requirement_check_trait_update.sql b/database/main/trg_requirement_check_trait_update.sql new file mode 100644 index 0000000..c855177 --- /dev/null +++ b/database/main/trg_requirement_check_trait_update.sql @@ -0,0 +1,10 @@ +CREATE TRIGGER trg_requirement_check_trait_update +BEFORE UPDATE ON requirement +WHEN NEW.req_type IN ('TRAIT','TRAIT_LEVEL_MIN') +BEGIN + SELECT CASE + WHEN NEW.req_id IS NULL OR NOT EXISTS (SELECT 1 FROM trait WHERE id = NEW.req_id) + THEN RAISE(ABORT, 'requirement.req_id must reference trait.id for TRAIT/TRAIT_LEVEL_MIN (UPDATE)') + END; +END; + diff --git a/database/main/trg_trait_conflict_order.sql b/database/main/trg_trait_conflict_order.sql new file mode 100644 index 0000000..9bb2f69 --- /dev/null +++ b/database/main/trg_trait_conflict_order.sql @@ -0,0 +1,7 @@ +CREATE TRIGGER trg_trait_conflict_order +BEFORE INSERT ON trait_conflict +WHEN NEW.trait_id > NEW.incompatible_trait_id +BEGIN + SELECT RAISE(ABORT, 'Insert smaller id first (trait_id < incompatible_trait_id)'); +END; + diff --git a/database/main/v_book_index.sql b/database/main/v_book_index.sql new file mode 100644 index 0000000..d652e69 --- /dev/null +++ b/database/main/v_book_index.sql @@ -0,0 +1,17 @@ +CREATE VIEW v_book_index AS +SELECT 'TRAIT' AS kind, t.name, b.code, c.page_start, c.page_end +FROM trait t JOIN trait_citation tc ON tc.trait_id=t.id + JOIN citation c ON c.id=tc.citation_id JOIN book b ON b.id=c.book_id +UNION ALL +SELECT 'SPECIES', s.name, b.code, c.page_start, c.page_end +FROM species s JOIN species_citation sc ON sc.species_id=s.id + JOIN citation c ON c.id=sc.citation_id JOIN book b ON b.id=c.book_id +UNION ALL +SELECT 'CULTURE', cu.name, b.code, c.page_start, c.page_end +FROM culture cu JOIN culture_citation cc ON cc.culture_id=cu.id + JOIN citation c ON c.id=cc.citation_id JOIN book b ON b.id=c.book_id +UNION ALL +SELECT 'PROFESSION', p.name, b.code, c.page_start, c.page_end +FROM profession p JOIN profession_citation pc ON pc.profession_id=p.id + JOIN citation c ON c.id=pc.citation_id JOIN book b ON b.id=c.book_id; + diff --git a/database/main/v_requirement_debug.sql b/database/main/v_requirement_debug.sql new file mode 100644 index 0000000..e258d6d --- /dev/null +++ b/database/main/v_requirement_debug.sql @@ -0,0 +1,13 @@ +CREATE VIEW v_requirement_debug AS +SELECT + owner_kind, + owner_id, + group_no, + CASE negate WHEN 1 THEN 'NOT ' ELSE '' END || req_type AS req_op, + req_id, + req_level, + req_optokey, + note +FROM requirement +ORDER BY owner_kind, owner_id, group_no, negate DESC, req_type, req_id; + diff --git a/database/main/v_species_auto_traits.sql b/database/main/v_species_auto_traits.sql new file mode 100644 index 0000000..eab51ed --- /dev/null +++ b/database/main/v_species_auto_traits.sql @@ -0,0 +1,7 @@ +CREATE VIEW v_species_auto_traits AS +SELECT s.id AS species_id, s.name AS species, + t.id AS trait_id, t.name AS trait, st.level, st.param_value +FROM species s + JOIN species_trait st ON st.species_id = s.id AND st.source = 'AUTOMATISCH' + JOIN trait t ON t.id = st.trait_id; + diff --git a/database/main/zielkategorie.sql b/database/main/zielkategorie.sql new file mode 100644 index 0000000..9fe4184 --- /dev/null +++ b/database/main/zielkategorie.sql @@ -0,0 +1,8 @@ +create table zielkategorie +( + id INTEGER + primary key, + name TEXT not null + unique +); + diff --git a/rules.db b/rules.db new file mode 100644 index 0000000000000000000000000000000000000000..bcf6c6a79f099f5395ba0c6859cc5a2039e6e11a GIT binary patch literal 544768 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 TZdlw9T^OPHWcbAmN?`>67dkT2 literal 0 HcmV?d00001