Research priorities
* Added stored procedures meant to update research priorities.
This commit is contained in:
parent
b15acadc1b
commit
1dcde71dff
7 changed files with 424 additions and 1 deletions
legacyworlds-server-data/db-structure/parts/040-functions
|
@ -195,6 +195,162 @@ REVOKE EXECUTE
|
|||
FROM PUBLIC;
|
||||
|
||||
|
||||
/*
|
||||
* Initialise a research priorities update
|
||||
* ----------------------------------------
|
||||
*
|
||||
* This stored procedure prepares a temporary table which is used to update
|
||||
* an empire's research priorities.
|
||||
*
|
||||
* Parameters:
|
||||
* _empire The empire's identifier
|
||||
*
|
||||
* Returns:
|
||||
* ? TRUE if the empire exists, is not on vacation mode and has
|
||||
* in-progress research, FALSE otherwise.
|
||||
*/
|
||||
DROP FUNCTION IF EXISTS emp.resprio_update_start( INT );
|
||||
CREATE FUNCTION emp.resprio_update_start( _empire INT )
|
||||
RETURNS BOOLEAN
|
||||
LANGUAGE PLPGSQL
|
||||
STRICT VOLATILE
|
||||
SECURITY DEFINER
|
||||
AS $resprio_update_start$
|
||||
BEGIN
|
||||
|
||||
-- Create temporary table
|
||||
CREATE TEMPORARY TABLE rprio_update(
|
||||
_empire_id INT ,
|
||||
_technology_name_id INT ,
|
||||
_emptech_id TEXT ,
|
||||
_emptech_priority INT
|
||||
) ON COMMIT DROP;
|
||||
|
||||
-- Lock records and fill table
|
||||
INSERT INTO rprio_update (
|
||||
_empire_id , _technology_name_id , _emptech_id , _emptech_priority
|
||||
) SELECT _emp.name_id , _tech.technology_name_id ,
|
||||
emp.technology_make_identifier( empire_id , _str.name , emptech_visible ) ,
|
||||
_etech.emptech_priority
|
||||
FROM emp.empires _emp
|
||||
INNER JOIN emp.technologies_v2 _etech
|
||||
ON _etech.empire_id = _emp.name_id
|
||||
AND _etech.emptech_state = 'RESEARCH'
|
||||
INNER JOIN defs.technologies _tech
|
||||
USING ( technology_name_id )
|
||||
INNER JOIN emp.technology_visibility_view _vis
|
||||
USING ( empire_id , technology_name_id )
|
||||
INNER JOIN defs.strings _str
|
||||
ON _str.id = _tech.technology_name_id
|
||||
INNER JOIN naming.empire_names _ename
|
||||
ON _ename.id = _emp.name_id
|
||||
LEFT OUTER JOIN users.vacations _vac
|
||||
ON _vac.account_id = _ename.owner_id
|
||||
AND _vac.status = 'PROCESSED'
|
||||
WHERE _emp.name_id = _empire AND _vac.account_id IS NULL
|
||||
FOR UPDATE OF _emp , _etech
|
||||
FOR SHARE OF _tech , _str , _ename;
|
||||
|
||||
RETURN FOUND;
|
||||
END;
|
||||
$resprio_update_start$;
|
||||
|
||||
REVOKE EXECUTE
|
||||
ON FUNCTION emp.resprio_update_start( INT )
|
||||
FROM PUBLIC;
|
||||
|
||||
GRANT EXECUTE
|
||||
ON FUNCTION emp.resprio_update_start( INT )
|
||||
TO :dbuser;
|
||||
|
||||
|
||||
/*
|
||||
* Set the priority of some research
|
||||
* ----------------------------------
|
||||
*
|
||||
* This stored procedure updates the priority of some in-progress empire
|
||||
* research. It will only function correctly if emp.resprio_update_start() was
|
||||
* already executed.
|
||||
*
|
||||
* Parameters:
|
||||
* _technology The client-side identifier of the technology, as
|
||||
* returned by emp.technology_make_identifier()
|
||||
* _priority The priority to assign to the technology
|
||||
*
|
||||
* Returns:
|
||||
* ? TRUE if the technology was found, FALSE if it wasn't.
|
||||
*/
|
||||
DROP FUNCTION IF EXISTS emp.resprio_update_set( TEXT , INT );
|
||||
CREATE FUNCTION emp.resprio_update_set( _technology TEXT , _priority INT )
|
||||
RETURNS BOOLEAN
|
||||
LANGUAGE PLPGSQL
|
||||
STRICT VOLATILE
|
||||
SECURITY DEFINER
|
||||
AS $resprio_update_set$
|
||||
BEGIN
|
||||
|
||||
UPDATE rprio_update
|
||||
SET _emptech_priority = _priority
|
||||
WHERE _emptech_id = _technology;
|
||||
RETURN FOUND;
|
||||
|
||||
END;
|
||||
$resprio_update_set$;
|
||||
|
||||
REVOKE EXECUTE
|
||||
ON FUNCTION emp.resprio_update_set( TEXT , INT )
|
||||
FROM PUBLIC;
|
||||
|
||||
GRANT EXECUTE
|
||||
ON FUNCTION emp.resprio_update_set( TEXT , INT )
|
||||
TO :dbuser;
|
||||
|
||||
|
||||
/*
|
||||
* Apply an update to research priorities
|
||||
* ---------------------------------------
|
||||
*
|
||||
* This stored procedure applies changes listed in the temporary research
|
||||
* priority table by updating the actual table with the new values.
|
||||
*
|
||||
* Returns:
|
||||
* ? TRUE if the update was valid, FALSE if one of the updated
|
||||
* values was incorrect
|
||||
*/
|
||||
DROP FUNCTION IF EXISTS emp.resprio_update_apply( );
|
||||
CREATE FUNCTION emp.resprio_update_apply( )
|
||||
RETURNS BOOLEAN
|
||||
LANGUAGE PLPGSQL
|
||||
STRICT VOLATILE
|
||||
SECURITY DEFINER
|
||||
AS $resprio_update_apply$
|
||||
BEGIN
|
||||
|
||||
UPDATE emp.technologies_v2
|
||||
SET emptech_priority = _emptech_priority
|
||||
FROM rprio_update
|
||||
WHERE _empire_id = empire_id
|
||||
AND _technology_name_id = technology_name_id;
|
||||
RETURN TRUE;
|
||||
|
||||
EXCEPTION
|
||||
|
||||
WHEN check_violation THEN
|
||||
RETURN FALSE;
|
||||
|
||||
END;
|
||||
$resprio_update_apply$;
|
||||
|
||||
REVOKE EXECUTE
|
||||
ON FUNCTION emp.resprio_update_apply( )
|
||||
FROM PUBLIC;
|
||||
|
||||
GRANT EXECUTE
|
||||
ON FUNCTION emp.resprio_update_apply( )
|
||||
TO :dbuser;
|
||||
|
||||
|
||||
|
||||
--
|
||||
-- Returns a planet owner's empire size
|
||||
--
|
||||
|
@ -1041,4 +1197,4 @@ CREATE VIEW emp.technologies_v2_view
|
|||
|
||||
GRANT SELECT
|
||||
ON emp.technologies_v2_view
|
||||
TO :dbuser;
|
||||
TO :dbuser;
|
||||
|
|
Reference in a new issue