--- --- ADD COLUMN IF NOT EXISTS was added in PostgreSQL 9.6 --- DO was added in 9.0, so we can use this already --- DO $$ BEGIN BEGIN ALTER TABLE acs_events ADD COLUMN location varchar(255); EXCEPTION WHEN duplicate_column THEN RAISE NOTICE 'column location exists already on table acs_events.'; END; END $$; comment on column acs_events.location is ' The location associated with this event. '; DO $$ DECLARE v_attr_exists integer = 0; attr_id acs_attributes.attribute_id%TYPE; BEGIN select count(*) into v_attr_exists from acs_attributes where object_type = 'acs_event' and attribute_name = 'location'; IF (v_attr_exists = 0) then attr_id := acs_attribute__create_attribute ( 'acs_event', -- object_type 'location', -- attribute_name 'string', -- datatype 'Location', -- pretty_name 'Locations', -- pretty_plural null, -- table_name (default) null, -- column_name (default) null, -- default_value (default) 1, -- min_n_values (default) 1, -- max_n_values (default) null, -- sort_order (default) 'type_specific', -- storage (default) 'f' -- static_p (default) ); END IF; END $$; -- -- recreate the views -- DROP view acs_events_dates; CREATE view acs_events_dates as select e.*, start_date, end_date from acs_events e, timespans s, time_intervals t where e.timespan_id = s.timespan_id and s.interval_id = t.interval_id; DROP view acs_events_activities; CREATE view acs_events_activities as select event_id, coalesce(e.name, a.name) as name, coalesce(e.description, a.description) as description, coalesce(e.html_p, a.html_p) as html_p, coalesce(e.status_summary, a.status_summary) as status_summary, e.activity_id, timespan_id, recurrence_id, location from acs_events e, acs_activities a where e.activity_id = a.activity_id; -- -- procedure acs_event__new/14-15 select define_function_args('acs_event__new','event_id;null,name;null,description;null,html_p;null,status_summary;null,timespan_id;null,activity_id;null,recurrence_id;null,object_type;acs_event,creation_date;now(),creation_user;null,creation_ip;null,context_id;null,package_id;null,location;null'); CREATE OR REPLACE FUNCTION acs_event__new( new__event_id integer, -- default null, new__name varchar, -- default null, new__description text, -- default null, new__html_p boolean, -- default null new__status_summary text, -- default null new__timespan_id integer, -- default null, new__activity_id integer, -- default null, new__recurrence_id integer, -- default null, new__object_type varchar, -- default 'acs_event', new__creation_date timestamptz, -- default now(), new__creation_user integer, -- default null, new__creation_ip varchar, -- default null, new__context_id integer, -- default null new__package_id integer, -- default null new__location varchar default NULL ) RETURNS integer AS $$ -- acs_events.event_id%TYPE DECLARE v_event_id acs_events.event_id%TYPE; BEGIN v_event_id := acs_object__new( new__event_id, -- object_id new__object_type, -- object_type new__creation_date, -- creation_date new__creation_user, -- creation_user new__creation_ip, -- creation_ip new__context_id, -- context_id 't', -- security_inherit_p new__name, -- title new__package_id -- package_id ); insert into acs_events (event_id, name, description, html_p, status_summary, activity_id, timespan_id, recurrence_id, location) values (v_event_id, new__name, new__description, new__html_p, new__status_summary, new__activity_id, new__timespan_id, new__recurrence_id, new__location); return v_event_id; END; $$ LANGUAGE plpgsql; DROP function if exists acs_event__new(integer, character varying, text, boolean, text, integer, integer, integer, character varying, timestamp with time zone, integer, character varying, integer, integer); CREATE OR REPLACE FUNCTION acs_event__new_instance( new_instance__event_id integer, new_instance__date_offset interval ) RETURNS integer AS $$ DECLARE event_row acs_events%ROWTYPE; object_row acs_objects%ROWTYPE; v_event_id acs_events.event_id%TYPE; v_timespan_id acs_events.timespan_id%TYPE; BEGIN -- Get event parameters select * into event_row from acs_events where event_id = new_instance__event_id; -- Get object parameters select * into object_row from acs_objects where object_id = new_instance__event_id; -- We allow non-zero offset, so we copy v_timespan_id := timespan__copy(event_row.timespan_id, new_instance__date_offset); -- Create a new instance v_event_id := acs_event__new( null, -- event_id (default) event_row.name, -- name event_row.description, -- description event_row.html_p, -- html_p event_row.status_summary, -- status_summary v_timespan_id, -- timespan_id event_row.activity_id, -- activity_id` event_row.recurrence_id, -- recurrence_id 'acs_event', -- object_type (default) now(), -- creation_date (default) object_row.creation_user, -- creation_user object_row.creation_ip, -- creation_ip object_row.context_id, -- context_id object_row.package_id, -- package_id event_row.location -- location ); return v_event_id; END; $$ LANGUAGE plpgsql;