| Slony-I 2.1.4 Documentation | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 8. Schema schemadoc | Fast Forward | Next |
8.146. upgradeschema(p_old text)
Function Properties
Language: PLPGSQL
Return Type: text
Called during "update functions" by slonik to perform schema changesdeclare
v_tab_row record;
v_query text;
v_keepstatus text;
begin
-- If old version is pre-2.0, then we require a special upgrade process
if p_old like '1.%' then
raise exception 'Upgrading to Slony-I 2.x requires running slony_upgrade_20';
end if;
perform upgradeSchemaAddTruncateTriggers();
-- Change all Slony-I-defined columns that are "timestamp without time zone" to "timestamp *WITH* time zone"
if exists (select 1 from information_schema.columns c
where table_schema = '_schemadoc' and data_type = 'timestamp without time zone'
and exists (select 1 from information_schema.tables t where t.table_schema = c.table_schema and t.table_name = c.table_name and t.table_type = 'BASE TABLE')
and (c.table_name, c.column_name) in (('sl_confirm', 'con_timestamp'), ('sl_event', 'ev_timestamp'), ('sl_registry', 'reg_timestamp'),('sl_archive_counter', 'ac_timestamp')))
then
-- Preserve sl_status
select pg_get_viewdef('sl_status') into v_keepstatus;
execute 'drop view sl_status';
for v_tab_row in select table_schema, table_name, column_name from information_schema.columns c
where table_schema = '_schemadoc' and data_type = 'timestamp without time zone'
and exists (select 1 from information_schema.tables t where t.table_schema = c.table_schema and t.table_name = c.table_name and t.table_type = 'BASE TABLE')
and (table_name, column_name) in (('sl_confirm', 'con_timestamp'), ('sl_event', 'ev_timestamp'), ('sl_registry', 'reg_timestamp'),('sl_archive_counter', 'ac_timestamp'))
loop
raise notice 'Changing Slony-I column [%.%] to timestamp WITH time zone', v_tab_row.table_name, v_tab_row.column_name;
v_query := 'alter table ' || slon_quote_brute(v_tab_row.table_schema) ||
'.' || v_tab_row.table_name || ' alter column ' || v_tab_row.column_name ||
' type timestamp with time zone;';
execute v_query;
end loop;
-- restore sl_status
execute 'create view sl_status as ' || v_keepstatus;
end if;
if not exists (select 1 from information_schema.tables where table_schema = '_schemadoc' and table_name = 'sl_components') then
v_query := '
create table sl_components (
co_actor text not null primary key,
co_pid integer not null,
co_node integer not null,
co_connection_pid integer not null,
co_activity text,
co_starttime timestamptz not null,
co_event bigint,
co_eventtype text
) without oids;
';
execute v_query;
end if;
if not exists (select 1 from information_schema.tables t where table_schema = '_schemadoc' and table_name = 'sl_event_lock') then
v_query := 'create table sl_event_lock (dummy integer);';
execute v_query;
end if;
return p_old;
end;