Files
term_portal/postgres/init/010_function_dictionary_new.sql
2022-12-07 04:43:36 +01:00

124 lines
3.9 KiB
PL/PgSQL

-- Creates new own dictionary.
CREATE OR REPLACE FUNCTION dictionary_new (
_name_sl dictionary.name_sl%type,
_name_sl_short dictionary.name_sl_short%type,
_name_en dictionary.name_en%type,
_author dictionary.author%type,
_issn dictionary.issn%type,
_domain_primary_id dictionary.domain_primary_id%type,
_entries_have_domain_labels dictionary.entries_have_domain_labels%type,
_entries_have_label dictionary.entries_have_label%type,
_entries_have_definition dictionary.entries_have_definition%type,
_entries_have_synonyms dictionary.entries_have_synonyms%type,
_entries_have_links dictionary.entries_have_links%type,
_entries_have_other dictionary.entries_have_other%type,
_entries_have_foreign_languages dictionary.entries_have_foreign_languages%type,
_entries_have_foreign_definitions dictionary.entries_have_foreign_definitions%type,
_entries_have_foreign_synonyms dictionary.entries_have_foreign_synonyms%type,
_entries_have_images dictionary.entries_have_images%type,
_entries_have_audio dictionary.entries_have_audio%type,
_entries_have_videos dictionary.entries_have_videos%type,
_domain_secondary smallint[],
_domain_secondary_new_name_sl varchar[],
_domain_secondary_new_name_en varchar[],
_language int[],
_creator_id user_role.user_id%type,
OUT _dictionary_id dictionary.id%type
)
LANGUAGE plpgsql AS $$
DECLARE
_domain_secondary_id domain_secondary.id%type;
_secondary_domain_id domain_secondary.id%type;
BEGIN
-- Check uniqueness of names within own dictionaries.
IF EXISTS (
SELECT 1
FROM dictionary
WHERE
count_comments IS NOT NULL AND -- Indicator of own dictionaries.
(
name_sl = _name_sl OR
name_sl_short = _name_sl_short OR
name_en = _name_en
)
) THEN
RAISE EXCEPTION 'One of dictionary names not unique among own dictionaries.';
END IF;
-- Create new dictionary.
INSERT INTO dictionary (
name_sl,
name_sl_short,
name_en,
author,
issn,
domain_primary_id,
count_comments,
entries_have_domain_labels,
entries_have_label,
entries_have_definition,
entries_have_synonyms,
entries_have_links,
entries_have_other,
entries_have_foreign_languages,
entries_have_foreign_definitions,
entries_have_foreign_synonyms,
entries_have_images,
entries_have_audio,
entries_have_videos
)
VALUES (
_name_sl,
_name_sl_short,
_name_en,
_author,
_issn,
_domain_primary_id,
0,
_entries_have_domain_labels,
_entries_have_label,
_entries_have_definition,
_entries_have_synonyms,
_entries_have_links,
_entries_have_other,
_entries_have_foreign_languages,
_entries_have_foreign_definitions,
_entries_have_foreign_synonyms,
_entries_have_images,
_entries_have_audio,
_entries_have_videos
)
RETURNING id
INTO _dictionary_id;
-- Create new secondary domains, if any.
FOR i IN 1..COALESCE(array_length(_domain_secondary_new_name_sl, 1), 0) LOOP
INSERT INTO domain_secondary (name_sl, name_en)
VALUES
(_domain_secondary_new_name_sl[i], _domain_secondary_new_name_en[i])
RETURNING id
INTO _domain_secondary_id;
_domain_secondary := _domain_secondary || _domain_secondary_id;
END LOOP;
-- Associate secondary domains, if any.
FOREACH _secondary_domain_id IN ARRAY _domain_secondary LOOP
INSERT INTO dictionary_domain_secondary (dictionary_id, domain_secondary_id)
VALUES (_dictionary_id, _secondary_domain_id);
END LOOP;
-- Associate languages, if any.
FOR i IN 1..COALESCE(array_length(_language, 1), 0) LOOP
INSERT INTO dictionary_language (dictionary_id, language_id, selection_order)
VALUES (_dictionary_id, _language[i], i);
END LOOP;
-- Make the creator its administrator.
INSERT INTO user_role (user_id, role_name, dictionary_id, administration, editing, terminology_review, language_review)
VALUES (_creator_id, 'editor', _dictionary_id, TRUE, TRUE, TRUE, TRUE);
END
$$