Slony-I 2.1.1 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 changes

    declare
    	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;

Prev | Home | Next
updatereloid(p_only_on_node integer, p_set_id integer) | Up | Index