--- --- Fix SQL function that were defined with the same number of --- arguments and the same argument names, but receiving different --- types (integers vs. timespans). This is fine, as long the --- functions are only called from SQL and positional arguments. When --- calling from Tcl, this does not work. --- --- This change uses in cases, where offsets are specified as --- intervals the suffix "_interval" for the variable names, keeping --- the names without this suffix for integer arguments (for Oracle --- compatibility). --- DROP FUNCTION acs_event__shift(integer,interval,interval); CREATE OR REPLACE FUNCTION acs_event__shift( shift__event_id integer, -- default null shift__start_offset_interval interval, -- default 0 shift__end_offset_interval interval -- default 0 ) RETURNS integer AS $$ DECLARE rec_events record; BEGIN -- update acs_events_dates -- set start_date = start_date + shift__start_offset_interval, -- end_date = end_date + shift__end_offset_interval -- where event_id = shift__event_id; -- Can not update view, so we do it the hard way -- (as if we make the rule anyways) for rec_events in select t.* from acs_events e, timespans s, time_intervals t where e.event_id = shift__event_id and e.timespan_id = s.timespan_id and s.interval_id = t.interval_id loop update time_intervals set start_date = start_date + shift__start_offset_interval, end_date = end_date + shift__end_offset_interval where interval_id = rec_events.interval_id; end loop; return 0; END; $$ LANGUAGE plpgsql; DROP FUNCTION acs_event__shift_all(integer,interval,interval); CREATE OR REPLACE FUNCTION acs_event__shift_all( shift_all__event_id integer, -- default null shift_all__start_offset_inverval interval, -- default 0 shift_all__end_offset_inverval interval -- default 0 ) RETURNS integer AS $$ DECLARE rec_events record; BEGIN -- update acs_events_dates -- set start_date = start_date + shift_all__start_offset_inverval, -- end_date = end_date + shift_all__end_offset_inverval -- where recurrence_id = (select recurrence_id -- from acs_events -- where event_id = shift_all__event_id); -- Can not update views for rec_events in select * from acs_events_dates where recurrence_id = (select recurrence_id from acs_events where event_id = shift_all__event_id) loop PERFORM acs_event__shift( rec_events.event_id, shift_all__start_offset_inverval, shift_all__end_offset_inverval ); end loop; return 0; END; $$ LANGUAGE plpgsql; DROP FUNCTION time_interval__shift(integer,interval,interval); CREATE OR REPLACE FUNCTION time_interval__shift( shift__interval_id integer, shift__start_offset_intverval interval, -- default 0, shift__end_offset_intverval interval -- default 0 ) RETURNS integer AS $$ DECLARE BEGIN update time_intervals set start_date = start_date + shift__start_offset_intverval, end_date = end_date + shift__end_offset_intverval where interval_id = shift__interval_id; return 0; END; $$ LANGUAGE plpgsql; DROP FUNCTION time_interval__copy(integer,interval); CREATE OR REPLACE FUNCTION time_interval__copy( copy__interval_id integer, copy__offset_interval interval -- default 0 ) RETURNS integer AS $$ DECLARE interval_row time_intervals%ROWTYPE; v_foo timestamptz; BEGIN select * into interval_row from time_intervals where interval_id = copy__interval_id; return time_interval__new( (interval_row.start_date ::timestamp + copy__offset_interval) :: timestamptz, (interval_row.end_date ::timestamp + copy__offset_interval) :: timestamptz ); END; $$ LANGUAGE plpgsql; DROP FUNCTION timespan__copy(integer,interval); CREATE OR REPLACE FUNCTION timespan__copy( copy__timespan_id integer, copy__offset_interval interval -- default 0 ) RETURNS integer AS $$ DECLARE rec_timespan record; v_interval_id timespans.interval_id%TYPE; v_timespan_id timespans.timespan_id%TYPE; BEGIN v_timespan_id := null; -- Loop over each interval in timespan, creating a new copy for rec_timespan in select * from timespans where timespan_id = copy__timespan_id loop v_interval_id := time_interval__copy( rec_timespan.interval_id, copy__offset_interval ); if v_timespan_id is null then -- JS: NOTE DEFAULT BEHAVIOR OF timespan__new v_timespan_id := timespan__new(v_interval_id); else -- no copy, use whatever is generated by time_interval__copy PERFORM timespan__join_interval( v_timespan_id, v_interval_id, false); end if; end loop; return v_timespan_id; END; $$ LANGUAGE plpgsql;