This repository has been archived on 2024-07-18. You can view files and clone it, but cannot push or open issues or pull requests.
lwb6/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/000-defs-functions.sql

128 lines
2.9 KiB
PL/PgSQL

-- LegacyWorlds Beta 6
-- PostgreSQL database scripts
--
-- Definitions management functions
--
-- Copyright(C) 2004-2010, DeepClone Development
-- --------------------------------------------------------
--
-- Creates or updates a language definition
--
-- Parameters:
-- lid Language identifier
-- lnm Language name
--
CREATE OR REPLACE FUNCTION defs.uoc_language( lid TEXT , lnm TEXT )
RETURNS VOID
STRICT
VOLATILE
SECURITY DEFINER
AS $$
BEGIN
INSERT INTO defs.languages ( language , name )
VALUES ( lower( lid ) , lnm );
EXCEPTION
WHEN unique_violation THEN
UPDATE defs.languages SET name = lnm
WHERE language = lower( lid );
END;
$$ LANGUAGE plpgsql;
GRANT EXECUTE ON FUNCTION defs.uoc_language( TEXT , TEXT ) TO :dbuser;
CREATE OR REPLACE FUNCTION defs.uoc_language( lid TEXT , lnm TEXT , a_id INT )
RETURNS VOID
STRICT VOLATILE
SECURITY DEFINER
AS $$
BEGIN
PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Updating language ' || lid );
PERFORM defs.uoc_language( lid , lnm );
END;
$$ LANGUAGE plpgsql;
GRANT EXECUTE ON FUNCTION defs.uoc_language( TEXT, TEXT , INT ) TO :dbuser;
--
-- Creates or updates a translation
--
-- Parameters:
-- lid Language identifier
-- sid String identifier
-- txt Translation
--
CREATE OR REPLACE FUNCTION defs.uoc_translation( lid TEXT , sid TEXT , txt TEXT )
RETURNS VOID
STRICT
VOLATILE
SECURITY DEFINER
AS $$
DECLARE
isid INT;
ilid INT;
BEGIN
-- Get language
SELECT INTO ilid id FROM defs.languages
WHERE language = lid;
-- Create string, if needed
BEGIN
INSERT INTO defs.strings (name) VALUES ( sid )
RETURNING id INTO isid;
EXCEPTION
WHEN unique_violation THEN
SELECT INTO isid id FROM defs.strings
WHERE name = sid;
END;
-- Create or update translation
BEGIN
INSERT INTO defs.translations ( string_id , lang_id , translated_string )
VALUES ( isid , ilid , txt );
EXCEPTION
WHEN unique_violation THEN
UPDATE defs.translations SET translated_string = txt
WHERE string_id = isid AND lang_id = ilid;
END;
END;
$$ LANGUAGE plpgsql;
GRANT EXECUTE ON FUNCTION defs.uoc_translation( TEXT , TEXT , TEXT ) TO :dbuser;
CREATE OR REPLACE FUNCTION defs.uoc_translation( lid TEXT , sid TEXT , txt TEXT , a_id INT )
RETURNS VOID
STRICT VOLATILE
SECURITY DEFINER
AS $$
BEGIN
PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Updating string ' || sid || ' in language ' || lid );
PERFORM defs.uoc_translation( lid , sid , txt );
END;
$$ LANGUAGE plpgsql;
GRANT EXECUTE ON FUNCTION defs.uoc_translation( TEXT, TEXT , TEXT , INT ) TO :dbuser;
--
-- Translations view (used to load all translations)
--
CREATE VIEW defs.translations_view
AS SELECT l.language AS language_id , l.name AS language_name ,
s.name AS string_id , t.translated_string AS translation
FROM defs.translations t
INNER JOIN defs.strings s
ON s.id = t.string_id
INNER JOIN defs.languages l
ON l.id = t.lang_id;
GRANT SELECT ON defs.translations_view TO :dbuser;