CVS User Account cvsuser
Fri Oct 8 17:31:04 PDT 2004
Log Message:
-----------
Added SET MOVE TABLE and SET MOVE SEQUENCE commands to change
the set a table or sequence belongs to without unsubscribing and
resubscribing all nodes.

Jan

Modified Files:
--------------
    slony1-engine/doc/howto:
        slonik_commands.html (r1.8 -> r1.9)
    slony1-engine/src/backend:
        slony1_funcs.sql (r1.30 -> r1.31)
    slony1-engine/src/slon:
        local_listen.c (r1.25 -> r1.26)
        remote_worker.c (r1.64 -> r1.65)
    slony1-engine/src/slonik:
        parser.y (r1.19 -> r1.20)
        slonik.c (r1.31 -> r1.32)
        slonik.h (r1.19 -> r1.20)

-------------- next part --------------
Index: remote_worker.c
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slon/remote_worker.c,v
retrieving revision 1.64
retrieving revision 1.65
diff -Lsrc/slon/remote_worker.c -Lsrc/slon/remote_worker.c -u -w -r1.64 -r1.65
--- src/slon/remote_worker.c
+++ src/slon/remote_worker.c
@@ -688,15 +688,33 @@
 			} else if (strcmp(event->ev_type, "SET_DROP_TABLE") == 0) 
 			{
 			  int tab_id = (int) strtol(event->ev_data1, NULL, 10);
+
 			  slon_appendquery(&query1, "select %s.setDropTable_int(%d);", 
 					   rtcfg_namespace,
 					   tab_id);
 			} else if (strcmp(event->ev_type, "SET_DROP_SEQUENCE") == 0)
 			{
 			  int seq_id = (int) strtol(event->ev_data1, NULL, 10);
+
 			  slon_appendquery(&query1, "select %s.setDropSequence_int(%d);", 
 					   rtcfg_namespace,
 					   seq_id);
+			} else if (strcmp(event->ev_type, "SET_MOVE_TABLE") == 0) 
+			{
+				int tab_id = (int) strtol(event->ev_data1, NULL, 10);
+				int new_set_id = (int) strtol(event->ev_data2, NULL, 10);
+
+				slon_appendquery(&query1, "select %s.setMoveTable_int(%d, %d);", 
+						rtcfg_namespace,
+						tab_id, new_set_id);
+			} else if (strcmp(event->ev_type, "SET_MOVE_SEQUENCE") == 0)
+			{
+				int seq_id = (int) strtol(event->ev_data1, NULL, 10);
+				int new_set_id = (int) strtol(event->ev_data2, NULL, 10);
+
+				slon_appendquery(&query1, "select %s.setMoveSequence_int(%d, %d);", 
+						rtcfg_namespace,
+						seq_id, new_set_id);
 			} else if (strcmp(event->ev_type, "STORE_TRIGGER") == 0)
 			{
 				int             trig_tabid = (int)strtol(event->ev_data1, NULL, 10);
Index: local_listen.c
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slon/local_listen.c,v
retrieving revision 1.25
retrieving revision 1.26
diff -Lsrc/slon/local_listen.c -Lsrc/slon/local_listen.c -u -w -r1.25 -r1.26
--- src/slon/local_listen.c
+++ src/slon/local_listen.c
@@ -424,6 +424,28 @@
 				 * the runtime configuration.
 				 */
 			}
+			else if (strcmp(ev_type, "SET_MOVE_TABLE") == 0)
+			{
+				/*
+				 * SET_MOVE_TABLE
+				 */
+				/*
+				 * Nothing to do ATM ... 
+				 * table information is not maintained in
+				 * the runtime configuration.
+				 */
+			}
+			else if (strcmp(ev_type, "SET_MOVE_SEQUENCE") == 0)
+			{
+				/*
+				 * SET_MOVE_SEQUENCE
+				 */
+				/*
+				 * Nothing to do ATM ... 
+				 * table information is not maintained in
+				 * the runtime configuration.
+				 */
+			}
 			else if (strcmp(ev_type, "ADJUST_SEQ") == 0)
 			{
 				/*
Index: slony1_funcs.sql
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/backend/slony1_funcs.sql,v
retrieving revision 1.30
retrieving revision 1.31
diff -Lsrc/backend/slony1_funcs.sql -Lsrc/backend/slony1_funcs.sql -u -w -r1.30 -r1.31
--- src/backend/slony1_funcs.sql
+++ src/backend/slony1_funcs.sql
@@ -2713,6 +2713,240 @@
 subscribe to the set containing sequence seq_id, drop the sequence
 from the replication set.';
 
+
+-- ----------------------------------------------------------------------
+-- FUNCTION setMoveTable (tab_id, new_set_id)
+--
+--	Generate the SET_MOVE_TABLE event.
+-- ----------------------------------------------------------------------
+create or replace function @NAMESPACE at .setMoveTable (int4, int4)
+returns bigint
+as '
+declare
+	p_tab_id			alias for $1;
+	p_new_set_id		alias for $2;
+	v_old_set_id		int4;
+	v_origin			int4;
+begin
+	-- ----
+	-- Grab the central configuration lock
+	-- ----
+	lock table @NAMESPACE at .sl_config_lock;
+
+	-- ----
+	-- Get the tables current set
+	-- ----
+	select tab_set into v_old_set_id from @NAMESPACE at .sl_table
+			where tab_id = p_tab_id;
+	if not found then
+		raise exception ''Slony-I: table %d not found'', p_tab_id;
+	end if;
+	
+	-- ----
+	-- Check that both sets exist and originate here
+	-- ----
+	if p_new_set_id = v_old_set_id then
+		raise exception ''Slony-I: set ids cannot be identical'';
+	end if;
+	select set_origin into v_origin from @NAMESPACE at .sl_set
+			where set_id = p_new_set_id;
+	if not found then
+		raise exception ''Slony-I: set % not found'', p_new_set_id;
+	end if;
+	if v_origin != @NAMESPACE at .getLocalNodeId(''_ at CLUSTERNAME@'') then
+		raise exception ''Slony-I: set % does not originate on local node'',
+				p_new_set_id;
+	end if;
+
+	select set_origin into v_origin from @NAMESPACE at .sl_set
+			where set_id = v_old_set_id;
+	if not found then
+		raise exception ''Slony-I: set % not found'', v_old_set_id;
+	end if;
+	if v_origin != @NAMESPACE at .getLocalNodeId(''_ at CLUSTERNAME@'') then
+		raise exception ''Slony-I: set % does not originate on local node'',
+				v_old_set_id;
+	end if;
+
+	-- ----
+	-- Check that both sets are subscribed by the same set of nodes
+	-- ----
+	if exists (select true from @NAMESPACE at .sl_subscribe SUB1
+				where SUB1.sub_set = p_new_set_id
+				and SUB1.sub_receiver not in (select SUB2.sub_receiver
+						from @NAMESPACE at .sl_subscribe SUB2
+						where SUB2.sub_set = v_old_set_id))
+	then
+		raise exception ''Slony-I: subscriber lists of set % and % are different'',
+				p_new_set_id, v_old_set_id;
+	end if;
+
+	if exists (select true from @NAMESPACE at .sl_subscribe SUB1
+				where SUB1.sub_set = v_old_set_id
+				and SUB1.sub_receiver not in (select SUB2.sub_receiver
+						from @NAMESPACE at .sl_subscribe SUB2
+						where SUB2.sub_set = p_new_set_id))
+	then
+		raise exception ''Slony-I: subscriber lists of set % and % are different'',
+				v_old_set_id, p_new_set_id;
+	end if;
+
+	-- ----
+	-- Change the set the table belongs to
+	-- ----
+	perform @NAMESPACE at .createEvent(''_ at CLUSTERNAME@'', ''SYNC'', NULL);
+	perform @NAMESPACE at .setMoveTable_int(p_tab_id, p_new_set_id);
+	return  @NAMESPACE at .createEvent(''_ at CLUSTERNAME@'', ''SET_MOVE_TABLE'', 
+			p_tab_id, p_new_set_id);
+end;
+' language plpgsql;
+
+
+-- ----------------------------------------------------------------------
+-- FUNCTION setMoveTable_int (tab_id, new_set_id)
+--
+--	Process the SET_MOVE_TABLE event.
+-- ----------------------------------------------------------------------
+create or replace function @NAMESPACE at .setMoveTable_int (int4, int4)
+returns int4
+as '
+declare
+	p_tab_id			alias for $1;
+	p_new_set_id		alias for $2;
+begin
+	-- ----
+	-- Grab the central configuration lock
+	-- ----
+	lock table @NAMESPACE at .sl_config_lock;
+	
+	-- ----
+	-- Move the table to the new set
+	-- ----
+	update @NAMESPACE at .sl_table
+			set tab_set = p_new_set_id
+			where tab_id = p_tab_id;
+
+	return p_tab_id;
+end;
+' language plpgsql;
+
+
+-- ----------------------------------------------------------------------
+-- FUNCTION setMoveSequence (seq_id, new_set_id)
+--
+--	Generate the SET_MOVE_SEQUENCE event.
+-- ----------------------------------------------------------------------
+create or replace function @NAMESPACE at .setMoveSequence (int4, int4)
+returns bigint
+as '
+declare
+	p_seq_id			alias for $1;
+	p_new_set_id		alias for $2;
+	v_old_set_id		int4;
+	v_origin			int4;
+begin
+	-- ----
+	-- Grab the central configuration lock
+	-- ----
+	lock table @NAMESPACE at .sl_config_lock;
+
+	-- ----
+	-- Get the sequences current set
+	-- ----
+	select seq_set into v_old_set_id from @NAMESPACE at .sl_sequence
+			where seq_id = p_seq_id;
+	if not found then
+		raise exception ''Slony-I: sequence %d not found'', p_seq_id;
+	end if;
+	
+	-- ----
+	-- Check that both sets exist and originate here
+	-- ----
+	if p_new_set_id = v_old_set_id then
+		raise exception ''Slony-I: set ids cannot be identical'';
+	end if;
+	select set_origin into v_origin from @NAMESPACE at .sl_set
+			where set_id = p_new_set_id;
+	if not found then
+		raise exception ''Slony-I: set % not found'', p_new_set_id;
+	end if;
+	if v_origin != @NAMESPACE at .getLocalNodeId(''_ at CLUSTERNAME@'') then
+		raise exception ''Slony-I: set % does not originate on local node'',
+				p_new_set_id;
+	end if;
+
+	select set_origin into v_origin from @NAMESPACE at .sl_set
+			where set_id = v_old_set_id;
+	if not found then
+		raise exception ''Slony-I: set % not found'', v_old_set_id;
+	end if;
+	if v_origin != @NAMESPACE at .getLocalNodeId(''_ at CLUSTERNAME@'') then
+		raise exception ''Slony-I: set % does not originate on local node'',
+				v_old_set_id;
+	end if;
+
+	-- ----
+	-- Check that both sets are subscribed by the same set of nodes
+	-- ----
+	if exists (select true from @NAMESPACE at .sl_subscribe SUB1
+				where SUB1.sub_set = p_new_set_id
+				and SUB1.sub_receiver not in (select SUB2.sub_receiver
+						from @NAMESPACE at .sl_subscribe SUB2
+						where SUB2.sub_set = v_old_set_id))
+	then
+		raise exception ''Slony-I: subscriber lists of set % and % are different'',
+				p_new_set_id, v_old_set_id;
+	end if;
+
+	if exists (select true from @NAMESPACE at .sl_subscribe SUB1
+				where SUB1.sub_set = v_old_set_id
+				and SUB1.sub_receiver not in (select SUB2.sub_receiver
+						from @NAMESPACE at .sl_subscribe SUB2
+						where SUB2.sub_set = p_new_set_id))
+	then
+		raise exception ''Slony-I: subscriber lists of set % and % are different'',
+				v_old_set_id, p_new_set_id;
+	end if;
+
+	-- ----
+	-- Change the set the sequence belongs to
+	-- ----
+	perform @NAMESPACE at .setMoveSequence_int(p_seq_id, p_new_set_id);
+	return  @NAMESPACE at .createEvent(''_ at CLUSTERNAME@'', ''SET_MOVE_SEQUENCE'', 
+			p_seq_id, p_new_set_id);
+end;
+' language plpgsql;
+
+
+-- ----------------------------------------------------------------------
+-- FUNCTION setMoveSequence_int (seq_id, new_set_id)
+--
+--	Process the SET_MOVE_SEQUENCE event.
+-- ----------------------------------------------------------------------
+create or replace function @NAMESPACE at .setMoveSequence_int (int4, int4)
+returns int4
+as '
+declare
+	p_seq_id			alias for $1;
+	p_new_set_id		alias for $2;
+begin
+	-- ----
+	-- Grab the central configuration lock
+	-- ----
+	lock table @NAMESPACE at .sl_config_lock;
+	
+	-- ----
+	-- Move the sequence to the new set
+	-- ----
+	update @NAMESPACE at .sl_sequence
+			set seq_set = p_new_set_id
+			where seq_id = p_seq_id;
+
+	return p_seq_id;
+end;
+' language plpgsql;
+
+
 -- ----------------------------------------------------------------------
 -- FUNCTION sequenceSetValue (seq_id, seq_origin, ev_seqno, last_value)
 -- ----------------------------------------------------------------------
Index: slonik_commands.html
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/doc/howto/slonik_commands.html,v
retrieving revision 1.8
retrieving revision 1.9
diff -Ldoc/howto/slonik_commands.html -Ldoc/howto/slonik_commands.html -u -w -r1.8 -r1.9
--- doc/howto/slonik_commands.html
+++ doc/howto/slonik_commands.html
@@ -39,6 +39,8 @@
 		<li><a href="#stmt_set_add_sequence">SET ADD SEQUENCE</a>
 		<li><a href="#stmt_set_drop_table">SET DROP TABLE</a>
 		<li><a href="#stmt_set_drop_sequence">SET DROP SEQUENCE</a>
+		<li><a href="#stmt_set_move_table">SET DROP TABLE</a>
+		<li><a href="#stmt_set_move_sequence">SET DROP SEQUENCE</a>
 		<li><a href="#stmt_store_trigger">STORE TRIGGER</a>
 		<li><a href="#stmt_drop_trigger">DROP TRIGGER</a>
 		<li><a href="#stmt_subscribe_set">SUBSCRIBE SET</a>
@@ -1097,6 +1099,106 @@
 <p align="right">Back to <a href="#index">Index</a></p>
 
 <!-- **************************************** -->
+<a name="stmt_set_move_table">
+<h3>SET MOVE TABLE</h3>
+</a>
+<div style="margin-left:40px; margin-right:0px;">
+<h3>Synopsis:</h3>
+	SET MOVE TABLE ( &lt;options&gt; );
+<h3>Description:</h3>
+<p>
+	Change the set a table belongs to. The current set and the new set
+	must origin on the same node and subscribed by the same nodes.
+	CAUTION: Due to the way subscribing to new sets works make
+	absolutely sure that the subscription of all nodes to the sets
+	is completely processed before moving tables. Moving a table too
+	early to a new set causes the subscriber to try and add the table
+	already during the subscription process, which fails with a duplicate
+	key error and breaks replication.
+</p>
+<table border="0" cellpadding="10">
+<tr>
+	<td align="left" valign="top" nowrap><b>ORIGIN = &lt;ival&gt;</b></td>
+	<td align="left" valign="top"><p>
+		The current origin of the set. A future version of slonik
+		might figure out this information by itself.
+	</p></td>
+</tr>
+<tr>
+	<td align="left" valign="top" nowrap><b>ID = &lt;ival&gt;</b></td>
+	<td align="left" valign="top"><p>
+		Unique ID of the table. 
+	</p></td>
+</tr>
+<tr>
+	<td align="left" valign="top" nowrap><b>NEW SET = &lt;ival&gt;</b></td>
+	<td align="left" valign="top"><p>
+		Unique ID of the new set. 
+	</p></td>
+</tr>
+</table>
+<h3>Example:</h3>
+<p>
+	SET MOVE TABLE (
+	<br>&nbsp;&nbsp;&nbsp;&nbsp;ORIGIN = 1,
+	<br>&nbsp;&nbsp;&nbsp;&nbsp;ID = 20,
+	<br>&nbsp;&nbsp;&nbsp;&nbsp;NEW SET = 3
+	<br>);
+</p>
+</div>
+<p align="right">Back to <a href="#index">Index</a></p>
+
+<!-- **************************************** -->
+<a name="stmt_set_move_sequence">
+<h3>SET MOVE SEQUENCE</h3>
+</a>
+<div style="margin-left:40px; margin-right:0px;">
+<h3>Synopsis:</h3>
+	SET MOVE SEQUENCE ( &lt;options&gt; );
+<h3>Description:</h3>
+<p>
+	Change the set a sequence belongs to. The current set and the new set
+	must origin on the same node and subscribed by the same nodes.
+	CAUTION: Due to the way subscribing to new sets works make
+	absolutely sure that the subscription of all nodes to the sets
+	is completely processed before moving sequences. Moving a sequence too
+	early to a new set causes the subscriber to try and add the sequence
+	already during the subscription process, which fails with a duplicate
+	key error and breaks replication.
+</p>
+<table border="0" cellpadding="10">
+<tr>
+	<td align="left" valign="top" nowrap><b>ORIGIN = &lt;ival&gt;</b></td>
+	<td align="left" valign="top"><p>
+		The current origin of the set. A future version of slonik
+		might figure out this information by itself.
+	</p></td>
+</tr>
+<tr>
+	<td align="left" valign="top" nowrap><b>ID = &lt;ival&gt;</b></td>
+	<td align="left" valign="top"><p>
+		Unique ID of the sequence. 
+	</p></td>
+</tr>
+<tr>
+	<td align="left" valign="top" nowrap><b>NEW SET = &lt;ival&gt;</b></td>
+	<td align="left" valign="top"><p>
+		Unique ID of the new set. 
+	</p></td>
+</tr>
+</table>
+<h3>Example:</h3>
+<p>
+	SET MOVE SEQUENCE (
+	<br>&nbsp;&nbsp;&nbsp;&nbsp;ORIGIN = 1,
+	<br>&nbsp;&nbsp;&nbsp;&nbsp;ID = 54,
+	<br>&nbsp;&nbsp;&nbsp;&nbsp;NEW SET = 3
+	<br>);
+</p>
+</div>
+<p align="right">Back to <a href="#index">Index</a></p>
+
+<!-- **************************************** -->
 <a name="stmt_store_trigger">
 <h3>STORE TRIGGER</h3>
 </a>
Index: slonik.h
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/slonik.h,v
retrieving revision 1.19
retrieving revision 1.20
diff -Lsrc/slonik/slonik.h -Lsrc/slonik/slonik.h -u -w -r1.19 -r1.20
--- src/slonik/slonik.h
+++ src/slonik/slonik.h
@@ -34,6 +34,8 @@
 typedef struct SlonikStmt_set_add_sequence_s	SlonikStmt_set_add_sequence;
 typedef struct SlonikStmt_set_drop_table_s		SlonikStmt_set_drop_table;
 typedef struct SlonikStmt_set_drop_sequence_s	SlonikStmt_set_drop_sequence;
+typedef struct SlonikStmt_set_move_table_s		SlonikStmt_set_move_table;
+typedef struct SlonikStmt_set_move_sequence_s	SlonikStmt_set_move_sequence;
 typedef struct SlonikStmt_table_add_key_s		SlonikStmt_table_add_key;
 typedef struct SlonikStmt_store_trigger_s		SlonikStmt_store_trigger;
 typedef struct SlonikStmt_drop_trigger_s		SlonikStmt_drop_trigger;
@@ -67,6 +69,8 @@
 	STMT_SET_ADD_TABLE,
 	STMT_SET_DROP_SEQUENCE,
 	STMT_SET_DROP_TABLE,
+	STMT_SET_MOVE_SEQUENCE,
+	STMT_SET_MOVE_TABLE,
 	STMT_STORE_LISTEN,
 	STMT_STORE_NODE,
 	STMT_STORE_PATH,
@@ -254,6 +258,7 @@
 	char			   *seq_comment;
 };
 
+
 struct SlonikStmt_set_drop_table_s {
 	SlonikStmt			hdr;
 	int					set_origin;
@@ -268,6 +273,22 @@
 };
 
 
+struct SlonikStmt_set_move_table_s {
+	SlonikStmt			hdr;
+	int					set_origin;
+	int					tab_id;
+	int					new_set_id;
+};
+
+
+struct SlonikStmt_set_move_sequence_s {
+	SlonikStmt			hdr;
+	int					set_origin;
+	int					seq_id;
+	int					new_set_id;
+};
+
+
 struct SlonikStmt_table_add_key_s {
 	SlonikStmt			hdr;
 	int					no_id;
@@ -462,6 +483,8 @@
 extern int		slonik_set_add_sequence(SlonikStmt_set_add_sequence *stmt);
 extern int		slonik_set_drop_table(SlonikStmt_set_drop_table *stmt);
 extern int		slonik_set_drop_sequence(SlonikStmt_set_drop_sequence *stmt);
+extern int		slonik_set_move_table(SlonikStmt_set_move_table *stmt);
+extern int		slonik_set_move_sequence(SlonikStmt_set_move_sequence *stmt);
 extern int		slonik_table_add_key(SlonikStmt_table_add_key *stmt);
 extern int		slonik_store_trigger(SlonikStmt_store_trigger *stmt);
 extern int		slonik_drop_trigger(SlonikStmt_drop_trigger *stmt);
Index: parser.y
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/parser.y,v
retrieving revision 1.19
retrieving revision 1.20
diff -Lsrc/slonik/parser.y -Lsrc/slonik/parser.y -u -w -r1.19 -r1.20
--- src/slonik/parser.y
+++ src/slonik/parser.y
@@ -33,6 +33,7 @@
 	O_FQNAME,
 	O_ID,
 	O_NEW_ORIGIN,
+	O_NEW_SET,
 	O_NODE_ID,
 	O_OLD_ORIGIN,
 	O_ORIGIN,
@@ -143,6 +144,8 @@
 %type <statement>	stmt_set_add_sequence
 %type <statement>	stmt_set_drop_table
 %type <statement>	stmt_set_drop_sequence
+%type <statement>	stmt_set_move_table
+%type <statement>	stmt_set_move_sequence
 %type <statement>	stmt_table_add_key
 %type <statement>	stmt_store_trigger
 %type <statement>	stmt_drop_trigger
@@ -441,6 +444,10 @@
 						{ $$ = $1; }
 					| stmt_set_drop_sequence
 						{ $$ = $1; }
+					| stmt_set_move_table
+						{ $$ = $1; }
+					| stmt_set_move_sequence
+						{ $$ = $1; }
 					| stmt_store_trigger
 						{ $$ = $1; }
 					| stmt_drop_trigger
@@ -1042,6 +1049,64 @@
 					}
 					;
 
+stmt_set_move_table	: lno K_SET K_MOVE K_TABLE option_list
+					{
+						SlonikStmt_set_move_table *new;
+						statement_option opt[] = {
+							STMT_OPTION_INT( O_ORIGIN, -1 ),
+							STMT_OPTION_INT( O_ID, -1 ),
+							STMT_OPTION_INT( O_NEW_SET, -1 ),
+							STMT_OPTION_END
+						};
+						new = (SlonikStmt_set_move_table *)
+							malloc(sizeof(SlonikStmt_set_move_table));
+						memset(new, 0, sizeof(SlonikStmt_set_move_table));
+						new->hdr.stmt_type		= STMT_SET_MOVE_TABLE;
+						new->hdr.stmt_filename	= current_file;
+						new->hdr.stmt_lno		= $1;
+
+						if (assign_options(opt, $5) == 0) {
+							new->set_origin		= opt[0].ival;
+							new->tab_id			= opt[1].ival;
+							new->new_set_id		= opt[2].ival;
+						}
+						else
+							parser_errors++;
+
+						$$ = (SlonikStmt *)new;
+					}
+					;
+
+stmt_set_move_sequence : lno K_SET K_MOVE K_SEQUENCE option_list
+					{
+						SlonikStmt_set_move_sequence *new;
+						statement_option opt[] = {
+							STMT_OPTION_INT( O_ORIGIN, -1 ),
+							STMT_OPTION_INT( O_ID, -1 ),
+							STMT_OPTION_INT( O_NEW_SET, -1 ),
+							STMT_OPTION_END
+						};
+
+						new = (SlonikStmt_set_move_sequence *)
+								malloc(sizeof(SlonikStmt_set_move_sequence));
+						memset(new, 0, sizeof(SlonikStmt_set_move_sequence));
+						new->hdr.stmt_type		= STMT_SET_MOVE_SEQUENCE;
+						new->hdr.stmt_filename	= current_file;
+						new->hdr.stmt_lno		= $1;
+
+						if (assign_options(opt, $5) == 0)
+						{
+							new->set_origin		= opt[0].ival;
+							new->seq_id			= opt[1].ival;
+							new->new_set_id		= opt[2].ival;
+						}
+						else
+							parser_errors++;
+
+						$$ = (SlonikStmt *)new;
+					}
+					;
+
 stmt_store_trigger	: lno K_STORE K_TRIGGER option_list
 					{
 						SlonikStmt_store_trigger *new;
@@ -1391,6 +1456,11 @@
 						$4->opt_code	= O_NEW_ORIGIN;
 						$$ = $4;
 					}
+					| K_NEW K_SET '=' option_item_id
+					{
+						$4->opt_code	= O_NEW_SET;
+						$$ = $4;
+					}
 					| K_RECEIVER '=' option_item_id
 					{
 						$3->opt_code	= O_RECEIVER;
@@ -1647,6 +1717,7 @@
 		case O_FQNAME:			return "full qualified name";
 		case O_ID:				return "id";
 		case O_NEW_ORIGIN:		return "new origin";
+		case O_NEW_SET:			return "new set";
 		case O_NODE_ID:			return "node id";
 		case O_OLD_ORIGIN:		return "old origin";
 		case O_ORIGIN:			return "origin";
Index: slonik.c
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/slonik.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -Lsrc/slonik/slonik.c -Lsrc/slonik/slonik.c -u -w -r1.31 -r1.32
--- src/slonik/slonik.c
+++ src/slonik/slonik.c
@@ -633,6 +633,90 @@
 				}
 				break;
 
+			case STMT_SET_MOVE_TABLE:
+				{
+					SlonikStmt_set_move_table *stmt =
+							(SlonikStmt_set_move_table *)hdr;
+
+					/*
+					 * Check that we have the set_id and set_origin
+					 * and that we can reach the origin.
+					 */
+					if (stmt->set_origin < 0)
+					{
+						printf("%s:%d: Error: "
+								"origin must be specified\n",
+								hdr->stmt_filename, hdr->stmt_lno);
+						errors++;
+					}
+					else
+					{
+						if (script_check_adminfo(hdr, stmt->set_origin) < 0)
+							errors++;
+					}
+
+					/*
+					 * Check that we have the table id and new set id
+					 */
+					if (stmt->tab_id < 0)
+					{
+						printf("%s:%d: Error: "
+								"table id must be specified\n",
+								hdr->stmt_filename, hdr->stmt_lno);
+						errors++;
+					}
+					if (stmt->new_set_id < 0)
+					{
+						printf("%s:%d: Error: "
+								"new set id must be specified\n",
+								hdr->stmt_filename, hdr->stmt_lno);
+						errors++;
+					}
+				}
+				break;
+
+			case STMT_SET_MOVE_SEQUENCE:
+				{
+					SlonikStmt_set_move_sequence *stmt =
+							(SlonikStmt_set_move_sequence *)hdr;
+
+					/*
+					 * Check that we have the set_id and set_origin
+					 * and that we can reach the origin.
+					 */
+					if (stmt->set_origin < 0)
+					{
+						printf("%s:%d: Error: "
+								"origin must be specified\n",
+								hdr->stmt_filename, hdr->stmt_lno);
+						errors++;
+					}
+					else
+					{
+						if (script_check_adminfo(hdr, stmt->set_origin) < 0)
+							errors++;
+					}
+
+					/*
+					 * Check that we have the sequence id and new set id
+					 */
+					if (stmt->seq_id < 0)
+					{
+						printf("%s:%d: Error: "
+								"sequence id must be specified\n",
+								hdr->stmt_filename, hdr->stmt_lno);
+						errors++;
+					}
+					if (stmt->new_set_id < 0)
+					{
+						printf("%s:%d: Error: "
+								"new set id must be specified\n",
+								hdr->stmt_filename, hdr->stmt_lno);
+						errors++;
+					}
+				}
+				break;
+
 			case STMT_TABLE_ADD_KEY:
 				{
 					SlonikStmt_table_add_key *stmt =
@@ -1219,6 +1303,26 @@
 				}
 				break;
 
+			case STMT_SET_MOVE_TABLE:
+				{
+					SlonikStmt_set_move_table *stmt =
+							(SlonikStmt_set_move_table *)hdr;
+
+					if (slonik_set_move_table(stmt) < 0)
+						errors++;
+				}
+				break;
+
+			case STMT_SET_MOVE_SEQUENCE:
+				{
+					SlonikStmt_set_move_sequence *stmt =
+							(SlonikStmt_set_move_sequence *)hdr;
+
+					if (slonik_set_move_sequence(stmt) < 0)
+						errors++;
+				}
+				break;
+
 			case STMT_TABLE_ADD_KEY:
 				{
 					SlonikStmt_table_add_key *stmt =
@@ -3069,8 +3173,6 @@
 {
 	SlonikAdmInfo  *adminfo1;
 	SlonDString		query;
-	char		   *idxname;
-	PGresult	   *res;
 	
 	adminfo1 = get_active_adminfo((SlonikStmt *)stmt, stmt->set_origin);
 	if (adminfo1 == NULL)
@@ -3086,7 +3188,6 @@
 				 stmt->hdr.script->clustername,		     
 				 stmt->tab_id);
 	if (db_exec_evcommand((SlonikStmt *)stmt, adminfo1, &query) < 0) {
-		PQclear(res);
 		dstring_free(&query);
 		return -1;
 	}
@@ -3131,6 +3232,62 @@
 
 
 int
+slonik_set_move_table(SlonikStmt_set_move_table *stmt)
+{
+	SlonikAdmInfo  *adminfo1;
+	SlonDString		query;
+	
+	adminfo1 = get_active_adminfo((SlonikStmt *)stmt, stmt->set_origin);
+	if (adminfo1 == NULL)
+		return -1;
+	
+	if (db_begin_xact((SlonikStmt *)stmt, adminfo1) < 0)
+		return -1;
+	
+	dstring_init(&query);
+	
+	slon_mkquery(&query,
+				 "select \"_%s\".setMoveTable(%d, %d); ",
+				 stmt->hdr.script->clustername,		     
+				 stmt->tab_id, stmt->new_set_id);
+	if (db_exec_evcommand((SlonikStmt *)stmt, adminfo1, &query) < 0) {
+		dstring_free(&query);
+		return -1;
+	}
+	dstring_free(&query);
+	return 0;
+}
+
+
+int
+slonik_set_move_sequence(SlonikStmt_set_move_sequence *stmt)
+{
+	SlonikAdmInfo  *adminfo1;
+	SlonDString		query;
+	
+	adminfo1 = get_active_adminfo((SlonikStmt *)stmt, stmt->set_origin);
+	if (adminfo1 == NULL)
+		return -1;
+	
+	if (db_begin_xact((SlonikStmt *)stmt, adminfo1) < 0)
+		return -1;
+	
+	dstring_init(&query);
+	
+	slon_mkquery(&query,
+				 "select \"_%s\".setMoveSequence(%d, %d); ",
+				 stmt->hdr.script->clustername,		     
+				 stmt->seq_id, stmt->new_set_id);
+	if (db_exec_evcommand((SlonikStmt *)stmt, adminfo1, &query) < 0) {
+		dstring_free(&query);
+		return -1;
+	}
+	dstring_free(&query);
+	return 0;
+}
+
+
+int
 slonik_table_add_key(SlonikStmt_table_add_key *stmt)
 {
 	SlonikAdmInfo  *adminfo1;


More information about the Slony1-commit mailing list