84 lines
No EOL
1.7 KiB
PL/PgSQL
84 lines
No EOL
1.7 KiB
PL/PgSQL
-- LegacyWorlds Beta 6
|
|
-- PostgreSQL database scripts
|
|
--
|
|
-- Buildings views and management functions
|
|
--
|
|
-- Copyright(C) 2004-2010, DeepClone Development
|
|
-- --------------------------------------------------------
|
|
|
|
|
|
--
|
|
-- Construct buildings on a planet
|
|
--
|
|
-- Parameters:
|
|
-- pid Planet identifier
|
|
-- bid Building type
|
|
-- bcnt Amount of buildings
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION verse.do_construct_buildings( pid INT , bid INT , bcnt INT )
|
|
RETURNS VOID
|
|
STRICT VOLATILE
|
|
SECURITY INVOKER
|
|
AS $$
|
|
BEGIN
|
|
LOOP
|
|
UPDATE verse.planet_buildings
|
|
SET amount = amount + bcnt
|
|
WHERE planet_id = pid AND building_id = bid;
|
|
EXIT WHEN FOUND;
|
|
|
|
BEGIN
|
|
INSERT INTO verse.planet_buildings( planet_id , building_id , amount , damage )
|
|
VALUES( pid , bid , bcnt , 0 );
|
|
EXIT;
|
|
EXCEPTION
|
|
WHEN unique_violation THEN
|
|
-- Do nothing, try updating again.
|
|
END;
|
|
END LOOP;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
|
|
|
|
--
|
|
-- Destroy buildings on a planet
|
|
--
|
|
-- Parameters:
|
|
-- pid Planet identifier
|
|
-- bid Building type
|
|
-- bcnt Amount of buildings
|
|
--
|
|
-- Returns:
|
|
-- amount of buildings that were destroyed
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION verse.do_destroy_buildings( pid INT , bid INT , bcnt INT )
|
|
RETURNS INT
|
|
STRICT VOLATILE
|
|
SECURITY INVOKER
|
|
AS $$
|
|
DECLARE
|
|
tmp INT;
|
|
BEGIN
|
|
UPDATE verse.planet_buildings
|
|
SET amount = amount - bcnt
|
|
WHERE planet_id = pid AND building_id = bid;
|
|
|
|
IF FOUND THEN
|
|
RETURN bcnt;
|
|
END IF;
|
|
|
|
RETURN 0;
|
|
EXCEPTION
|
|
WHEN check_violation THEN
|
|
SELECT INTO tmp amount FROM verse.planet_buildings
|
|
WHERE planet_id = pid AND building_id = bid
|
|
FOR UPDATE;
|
|
UPDATE verse.planet_buildings
|
|
SET amount = 0
|
|
WHERE planet_id = pid AND building_id = bid;
|
|
RETURN tmp;
|
|
END;
|
|
$$ LANGUAGE plpgsql; |