Priority settings update procedures

Added stored procedures which can be used to update customisable event
priorities:
 * events.evcp_set() adds or modifies an override,
 * events.clear() can be used to remove a specific override or all
overrides for a given player.
This commit is contained in:
Emmanuel BENOîT 2012-06-30 16:25:50 +02:00
parent 1dd1da5ae3
commit cf8dee6ec9

View file

@ -864,6 +864,142 @@ GRANT EXECUTE
TO :dbuser;
/*
* 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;
/*
* OLD B6M1 CODE BELOW!
*/