This repository has been archived on 2025-01-04. You can view files and clone it, but cannot push or open issues or pull requests.
lwb6/legacyworlds-server-data/db-structure/parts/040-functions/171-event-priorities.sql
Emmanuel BENOîT dc9ef2292d Event-related functions split
Because the events management functions are definitely going to be quite
big, I thought it would be better to split them into multiple SQL files.
For now, there's a file for event definition functions and one for
functions that manipulate priority overrides. The old file containing
the old code stays around for now.
2012-07-01 01:04:26 +02:00

143 lines
3.5 KiB
PL/PgSQL

-- LegacyWorlds Beta 6
-- PostgreSQL database scripts
--
-- Functions to manipulate player-defined event priority
-- overrides.
--
-- Copyright(C) 2004-2012, DeepClone Development
-- --------------------------------------------------------
/*
* Set an event priority override
* ------------------------------
*
* Adds a new event priority override or modify its value. If the event type
* does not exist, does not allow overrides or if the specified priority is
* invalid, the error will be ignored silently.
*
* Parameters:
* _empire_id The identifier of the player's empire
* _evdef_id The identifier of the event type
* _priority The custom priority value
*/
DROP FUNCTION IF EXISTS events.evcp_set( INT , TEXT , INT );
CREATE FUNCTION events.evcp_set(
_empire_id INT ,
_evdef_id TEXT ,
_priority INT )
RETURNS VOID
LANGUAGE PLPGSQL
STRICT VOLATILE SECURITY DEFINER
AS $evcp_set$
DECLARE
_user_id INT;
BEGIN
BEGIN
INSERT INTO events.custom_priorities(
evdef_id , address_id , evcp_priority )
SELECT _evdef_id , owner_id , _priority
FROM naming.empire_names
WHERE id = _empire_id;
IF NOT FOUND
THEN
RAISE EXCEPTION 'missing empire';
END IF;
EXCEPTION
WHEN unique_violation THEN
UPDATE events.custom_priorities
SET evcp_priority = _priority
WHERE evdef_id = _evdef_id
AND address_id = (
SELECT owner_id
FROM naming.empire_names
WHERE id = _empire_id );
END;
EXCEPTION
WHEN raise_exception THEN
PERFORM sys.write_sql_log( 'Events' , 'WARNING'::log_level ,
'Call to events.evcp_set() from missing empire #' || _empire_id );
WHEN foreign_key_violation OR check_violation THEN
PERFORM sys.write_sql_log( 'Events' , 'WARNING'::log_level ,
'Bad call to events.evcp_set() from empire #' || _empire_id );
END;
$evcp_set$;
REVOKE EXECUTE
ON FUNCTION events.evcp_set( INT , TEXT , INT )
FROM PUBLIC;
GRANT EXECUTE
ON FUNCTION events.evcp_set( INT , TEXT , INT )
TO :dbuser;
/*
* Clear an event priority override
* --------------------------------
*
* Remove an event priority override from the custom priorities table. If
* there was no override for the specified event type and empire, do nothing.
*
* Parameters:
* _empire_id The identifier of the player's empire
* _evdef_id The identifier of the event type
*/
DROP FUNCTION IF EXISTS events.evcp_clear( INT , TEXT );
CREATE FUNCTION events.evcp_clear(
_empire_id INT ,
_evdef_id TEXT )
RETURNS VOID
LANGUAGE SQL
STRICT VOLATILE SECURITY DEFINER
AS $evcp_clear$
DELETE FROM events.custom_priorities
WHERE evdef_id = $2
AND address_id = (
SELECT owner_id
FROM naming.empire_names
WHERE id = $1 )
$evcp_clear$;
REVOKE EXECUTE
ON FUNCTION events.evcp_clear( INT , TEXT )
FROM PUBLIC;
GRANT EXECUTE
ON FUNCTION events.evcp_clear( INT , TEXT )
TO :dbuser;
/*
* Clear all event priority overrides
* ----------------------------------
*
* Remove all event priority overrides set by some player.
*
* Parameters:
* _empire_id The identifier of the player's empire
*/
DROP FUNCTION IF EXISTS events.evcp_clear( INT );
CREATE FUNCTION events.evcp_clear( _empire_id INT )
RETURNS VOID
LANGUAGE SQL
STRICT VOLATILE SECURITY DEFINER
AS $evcp_clear$
DELETE FROM events.custom_priorities
WHERE address_id = (
SELECT owner_id
FROM naming.empire_names
WHERE id = $1 )
$evcp_clear$;
REVOKE EXECUTE
ON FUNCTION events.evcp_clear( INT )
FROM PUBLIC;
GRANT EXECUTE
ON FUNCTION events.evcp_clear( INT )
TO :dbuser;