Wed Sep 5 14:37:59 PDT 2007
- Previous message: [Slony1-commit] slony1-engine/doc/adminguide filelist.sgml partitioning.sgml slony.sgml
- Next message: [Slony1-commit] slony1-engine/src/backend slony1_funcs.sql
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Update of /home/cvsd/slony1/slony1-engine/src/backend
In directory main.slony.info:/tmp/cvs-serv31081/src/backend
Modified Files:
Tag: REL_1_2_STABLE
slony1_funcs.sql
Log Message:
Add functions to 1.2 branch to permit adding empty tables to replication
Index: slony1_funcs.sql
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/src/backend/slony1_funcs.sql,v
retrieving revision 1.98.2.21
retrieving revision 1.98.2.22
diff -C2 -d -r1.98.2.21 -r1.98.2.22
*** slony1_funcs.sql 4 Sep 2007 20:42:14 -0000 1.98.2.21
--- slony1_funcs.sql 5 Sep 2007 21:37:57 -0000 1.98.2.22
***************
*** 5939,5940 ****
--- 5939,6053 ----
In PG versions > 7.3, this looks like (field1,field2,...fieldn)';
+
+ -- -------------------------------------------------------------------------
+ -- FUNCTION add_empty_table_to_replication (set_id, tab_id, tab_nspname,
+ -- tab_tabname, tab_idxname, tab_comment)
+ -- -------------------------------------------------------------------------
+ create or replace function @NAMESPACE at .add_empty_table_to_replication(int4, int4, text, text, text, text) returns bigint as '
+ declare
+ p_set_id alias for $1;
+ p_tab_id alias for $2;
+ p_nspname alias for $3;
+ p_tabname alias for $4;
+ p_idxname alias for $5;
+ p_comment alias for $6;
+
+ prec record;
+ v_origin int4;
+ v_isorigin boolean;
+ v_fqname text;
+ query text;
+ v_rows integer;
+ v_idxname text;
+
+ begin
+ -- Need to validate that the set exists; the set will tell us if this is the origin
+ select set_origin into v_origin from @NAMESPACE at .sl_set where set_id = p_set_id;
+ if not found then
+ raise exception ''add_empty_table_to_replication: set % not found!'', p_set_id;
+ end if;
+
+ -- Need to be aware of whether or not this node is origin for the set
+ v_isorigin := ( v_origin = @NAMESPACE at .getLocalNodeId(''_ at CLUSTERNAME@'') );
+
+ v_fqname := ''"'' || p_nspname || ''"."'' || p_tabname || ''"'';
+ -- Take out a lock on the table
+ query := ''lock '' || v_fqname || '';'';
+ execute query;
+
+ if v_isorigin then
+ -- On the origin, verify that the table is empty, failing if it has any tuples
+ query := ''select 1 as tuple from '' || v_fqname || '' limit 1;'';
+ execute query into prec;
+ GET DIAGNOSTICS v_rows = ROW_COUNT;
+ if v_rows = 0 then
+ raise notice ''add_empty_table_to_replication: table % empty on origin - OK'', v_fqname;
+ else
+ raise exception ''add_empty_table_to_replication: table % contained tuples on origin node %'', v_fqname, v_origin;
+ end if;
+ else
+ -- On other nodes, TRUNCATE the table
+ query := ''truncate '' || v_fqname || '';'';
+ execute query;
+ end if;
+ -- If p_idxname is NULL, then look up the PK index, and RAISE EXCEPTION if one does not exist
+ if p_idxname is NULL then
+ select c2.relname into prec from pg_catalog.pg_index i, pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_namespace n where i.indrelid = c1.oid and i.indexrelid = c2.oid and c1.relname = p_tabname and i.indisprimary and n.nspname = p_nspname and n.oid = c1.relnamespace;
+ if not found then
+ raise exception ''add_empty_table_to_replication: table % has no primary key and no candidate specified!'', v_fqname;
+ else
+ v_idxname := prec.relname;
+ end if;
+ else
+ v_idxname := p_idxname;
+ end if;
+ perform @NAMESPACE at .setAddTable_int(p_set_id, p_tab_id, v_fqname, v_idxname, p_comment);
+ return @NAMESPACE at .alterTableRestore(p_tab_id);
+ end
+ ' language plpgsql;
+
+ comment on function @NAMESPACE at .add_empty_table_to_replication(int4, int4, text, text, text, text) is
+ 'Verify that a table is empty, and add it to replication.
+ tab_idxname is optional - if NULL, then we use the primary key.';
+
+ -- -------------------------------------------------------------------------
+ -- FUNCTION replicate_partition (tab_id, tab_nspname, tab_tabname,
+ -- tab_idxname, tab_comment)
+ -- -------------------------------------------------------------------------
+ create or replace function @NAMESPACE at .replicate_partition(int4, text, text, text, text) returns bigint as '
+ declare
+ p_tab_id alias for $1;
+ p_nspname alias for $2;
+ p_tabname alias for $3;
+ p_idxname alias for $4;
+ p_comment alias for $5;
+
+ prec record;
+ prec2 record;
+ v_set_id int4;
+
+ begin
+ -- Look up the parent table; fail if it does not exist
+ select c1.oid into prec from pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_inherits i, pg_catalog.pg_namespace n where c1.oid = i.inhparent and c2.oid = i.inhrelid and n.oid = c2.relnamespace and n.nspname = p_nspname and c2.relname = p_tabname;
+ if not found then
+ raise exception ''replicate_partition: No parent table found for %.%!'', p_nspname, p_tabname;
+ end if;
+
+ -- The parent table tells us what replication set to use
+ select tab_set into prec2 from @NAMESPACE at .sl_table where tab_reloid = prec.oid;
+ if not found then
+ raise exception ''replicate_partition: Parent table % for new partition %.% is not replicated!'', prec.oid, p_nspname, p_tabname;
+ end if;
+
+ v_set_id := prec2.tab_set;
+
+ -- Now, we have all the parameters necessary to run add_empty_table_to_replication...
+ return @NAMESPACE at .add_empty_table_to_replication(v_set_id, p_tab_id, p_nspname, p_tabname, p_idxname, p_comment);
+ end
+ ' language plpgsql;
+
+ comment on function @NAMESPACE at .replicate_partition(int4, text, text, text, text) is
+ 'Add a partition table to replication.
+ tab_idxname is optional - if NULL, then we use the primary key.
+ This function looks up replication configuration via the parent table.';
+
- Previous message: [Slony1-commit] slony1-engine/doc/adminguide filelist.sgml partitioning.sgml slony.sgml
- Next message: [Slony1-commit] slony1-engine/src/backend slony1_funcs.sql
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Slony1-commit mailing list