Emmanuel BENOîT
dc9ef2292d
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.
143 lines
3.5 KiB
PL/PgSQL
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;
|