Thu Oct 26 13:43:28 PDT 2006
- Previous message: [Slony1-commit] By wieck: Added a new command to slonik.
- Next message: [Slony1-commit] By cbbrowne: Fix misspellings of "tranaction"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Log Message:
-----------
Backpatch of slonik command SYNC.
Jan
Tags:
----
REL_1_1_STABLE
Modified Files:
--------------
slony1-engine/src/ducttape:
test_5_ddlscript (r1.2 -> r1.2.4.1)
test_5_subscribe (r1.1 -> r1.1.4.1)
slony1-engine/src/slonik:
parser.y (r1.22.2.1 -> r1.22.2.2)
scan.l (r1.23.2.1 -> r1.23.2.2)
slonik.c (r1.42.2.4 -> r1.42.2.5)
slonik.h (r1.23.2.1 -> r1.23.2.2)
-------------- next part --------------
Index: test_5_ddlscript
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/ducttape/test_5_ddlscript,v
retrieving revision 1.2
retrieving revision 1.2.4.1
diff -Lsrc/ducttape/test_5_ddlscript -Lsrc/ducttape/test_5_ddlscript -u -w -r1.2 -r1.2.4.1
--- src/ducttape/test_5_ddlscript
+++ src/ducttape/test_5_ddlscript
@@ -17,18 +17,7 @@
#
######################################################################
-cat >test_5_tmp.sql <<_EOF_
- alter table accounts add column lastuser name;
-
- create function accounts_lastuser () returns trigger as '
- begin
- NEW.lastuser = SESSION_USER;
- return NEW;
- end;
- ' language plpgsql;
- create trigger accounts_lastuser before insert or update on accounts
- for each row execute procedure accounts_lastuser();
-
+cat >test_5_tmp1.sql <<_EOF_
create table accounts_audit (
au_aid integer,
au_seqno serial,
@@ -40,6 +29,26 @@
foreign key (au_aid) references accounts
);
+ create table tellers_sum (
+ su_tid integer,
+ su_sum integer,
+
+ primary key (su_tid),
+ foreign key (su_tid) references tellers
+ );
+_EOF_
+cat >test_5_tmp2.sql <<_EOF_
+ alter table accounts add column lastuser name;
+
+ create function accounts_lastuser () returns trigger as '
+ begin
+ NEW.lastuser = SESSION_USER;
+ return NEW;
+ end;
+ ' language plpgsql;
+ create trigger accounts_lastuser before insert or update on accounts
+ for each row execute procedure accounts_lastuser();
+
create function accounts_audit_trig () returns trigger as '
begin
--
@@ -58,13 +67,6 @@
create trigger accounts_audit_trig after update on accounts
for each row execute procedure accounts_audit_trig();
- create table tellers_sum (
- su_tid integer,
- su_sum integer,
-
- primary key (su_tid),
- foreign key (su_tid) references tellers
- );
insert into tellers_sum (su_tid, su_sum)
select tid, 0 from tellers;
@@ -81,7 +83,9 @@
node 2 admin conninfo = 'dbname=$DB2';
try {
- execute script (set id = 1, filename = 'test_5_tmp.sql',
+ execute script (set id = 1, filename = 'test_5_tmp1.sql',
+ event node = 1);
+ execute script (set id = 1, filename = 'test_5_tmp2.sql',
event node = 1);
create set (id = 999, origin = 1, comment = 'temp set for new objects');
@@ -100,4 +104,4 @@
}
_EOF_
-rm test_5_tmp.sql
+rm test_5_tmp[12].sql
Index: test_5_subscribe
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/ducttape/test_5_subscribe,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -Lsrc/ducttape/test_5_subscribe -Lsrc/ducttape/test_5_subscribe -u -w -r1.1 -r1.1.4.1
--- src/ducttape/test_5_subscribe
+++ src/ducttape/test_5_subscribe
@@ -28,10 +28,15 @@
on error {
exit 1;
}
+ echo '***** Waiting for subscribe set to arrive on origin';
+ wait for event (origin = 2, confirmed = 1);
+ echo '***** Subscribe set received on origin - issue SYNC';
+ sync (id = 1);
+ echo '***** Waiting for SYNC to be done on subscriber';
+ wait for event (origin = 1, confirmed = 2);
+ echo '***** Subscription complete';
_EOF_
-sleep 30
-
echo "**** Merging set 999 into 1"
slonik <<_EOF_
cluster name = T1;
Index: scan.l
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/scan.l,v
retrieving revision 1.23.2.1
retrieving revision 1.23.2.2
diff -Lsrc/slonik/scan.l -Lsrc/slonik/scan.l -u -w -r1.23.2.1 -r1.23.2.2
--- src/slonik/scan.l
+++ src/slonik/scan.l
@@ -123,6 +123,7 @@
store { return K_STORE; }
subscribe { return K_SUBSCRIBE; }
success { return K_SUCCESS; }
+sync { return K_SYNC; }
table { return K_TABLE; }
timeout { return K_TIMEOUT; }
trigger { return K_TRIGGER; }
Index: slonik.h
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/slonik.h,v
retrieving revision 1.23.2.1
retrieving revision 1.23.2.2
diff -Lsrc/slonik/slonik.h -Lsrc/slonik/slonik.h -u -w -r1.23.2.1 -r1.23.2.2
--- src/slonik/slonik.h
+++ src/slonik/slonik.h
@@ -48,6 +48,7 @@
typedef struct SlonikStmt_ddl_script_s SlonikStmt_ddl_script;
typedef struct SlonikStmt_update_functions_s SlonikStmt_update_functions;
typedef struct SlonikStmt_wait_event_s SlonikStmt_wait_event;
+typedef struct SlonikStmt_sync_s SlonikStmt_sync;
typedef enum
{
@@ -85,7 +86,8 @@
STMT_UNSUBSCRIBE_SET,
STMT_UPDATE_FUNCTIONS,
STMT_WAIT_EVENT,
- STMT_ERROR
+ STMT_ERROR,
+ STMT_SYNC
} Slonik_stmttype;
struct SlonikScript_s
@@ -423,6 +425,13 @@
};
+struct SlonikStmt_sync_s
+{
+ SlonikStmt hdr;
+ int no_id;
+};
+
+
extern SlonikScript *parser_script;
@@ -544,6 +553,7 @@
extern int slonik_ddl_script(SlonikStmt_ddl_script * stmt);
extern int slonik_update_functions(SlonikStmt_update_functions * stmt);
extern int slonik_wait_event(SlonikStmt_wait_event * stmt);
+extern int slonik_sync(SlonikStmt_sync * stmt);
extern int slon_scanint64(char *str, int64 * result);
Index: parser.y
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/parser.y,v
retrieving revision 1.22.2.1
retrieving revision 1.22.2.2
diff -Lsrc/slonik/parser.y -Lsrc/slonik/parser.y -u -w -r1.22.2.1 -r1.22.2.2
--- src/slonik/parser.y
+++ src/slonik/parser.y
@@ -159,6 +159,7 @@
%type <statement> stmt_update_functions
%type <statement> stmt_repair_config
%type <statement> stmt_wait_event
+%type <statement> stmt_sync
%type <opt_list> option_list
%type <opt_list> option_list_item
%type <opt_list> option_list_items
@@ -238,6 +239,7 @@
%token K_UPDATE
%token K_YES
%token K_WAIT
+%token K_SYNC
/*
* Other scanner tokens
@@ -478,6 +480,8 @@
| stmt_error ';'
{ yyerrok;
$$ = $1; }
+ | stmt_sync
+ { $$ = $1; }
;
stmt_echo : lno K_ECHO literal ';'
@@ -1443,6 +1447,32 @@
}
;
+stmt_sync : lno K_SYNC option_list
+ {
+ SlonikStmt_sync *new;
+ statement_option opt[] = {
+ STMT_OPTION_INT( O_ID, -1 ),
+ STMT_OPTION_END
+ };
+
+ new = (SlonikStmt_sync *)
+ malloc(sizeof(SlonikStmt_sync));
+ memset(new, 0, sizeof(SlonikStmt_sync));
+ new->hdr.stmt_type = STMT_SYNC;
+ new->hdr.stmt_filename = current_file;
+ new->hdr.stmt_lno = $1;
+
+ if (assign_options(opt, $3) == 0)
+ {
+ new->no_id = opt[0].ival;
+ }
+ else
+ parser_errors++;
+
+ $$ = (SlonikStmt *)new;
+ }
+ ;
+
option_list : ';'
{ $$ = NULL; }
| '(' option_list_items ')' ';'
Index: slonik.c
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/slonik.c,v
retrieving revision 1.42.2.4
retrieving revision 1.42.2.5
diff -Lsrc/slonik/slonik.c -Lsrc/slonik/slonik.c -u -w -r1.42.2.4 -r1.42.2.5
--- src/slonik/slonik.c
+++ src/slonik/slonik.c
@@ -1051,6 +1051,25 @@
}
break;
+ case STMT_SYNC:
+ {
+ SlonikStmt_sync *stmt =
+ (SlonikStmt_sync *) hdr;
+
+ if (stmt->no_id == -1)
+ {
+ printf("%s:%d: Error: "
+ "node ID must be specified\n",
+ hdr->stmt_filename, hdr->stmt_lno);
+ errors++;
+ }
+
+ if (script_check_adminfo(hdr, stmt->no_id) < 0)
+ errors++;
+
+ }
+ break;
+
}
hdr = hdr->next;
@@ -1476,6 +1495,16 @@
}
break;
+ case STMT_SYNC:
+ {
+ SlonikStmt_sync *stmt =
+ (SlonikStmt_sync *) hdr;
+
+ if (slonik_sync(stmt) < 0)
+ errors++;
+ }
+ break;
+
}
if (current_try_level == 0)
@@ -4056,6 +4085,36 @@
}
+int
+slonik_sync(SlonikStmt_sync * stmt)
+{
+ SlonikAdmInfo *adminfo1;
+ SlonDString query;
+
+ adminfo1 = get_active_adminfo((SlonikStmt *) stmt, stmt->no_id);
+ if (adminfo1 == NULL)
+ return -1;
+
+ if (db_begin_xact((SlonikStmt *) stmt, adminfo1) < 0)
+ return -1;
+
+ dstring_init(&query);
+
+ slon_mkquery(&query,
+ "select \"_%s\".createEvent('_%s', 'SYNC'); ",
+ stmt->hdr.script->clustername,
+ stmt->hdr.script->clustername);
+ if (db_exec_command((SlonikStmt *) stmt, adminfo1, &query) < 0)
+ {
+ dstring_free(&query);
+ return -1;
+ }
+
+ dstring_free(&query);
+ return 0;
+}
+
+
/*
* scanint8 --- try to parse a string into an int8.
*
@@ -4122,6 +4181,52 @@
return true;
}
+
+/*
+ * make a copy of the array of lines, with token replaced by replacement
+ * the first time it occurs on each line.
+ *
+ * This does most of what sed was used for in the shell script, but
+ * doesn't need any regexp stuff.
+ */
+static void
+replace_token(char *resout, char *lines, const char *token, const char *replacement)
+{
+ int numlines = 1;
+ int i,
+ o;
+ char result_set[4096];
+ int toklen,
+ replen;
+
+ for (i = 0; lines[i]; i++)
+ numlines++;
+
+ toklen = strlen(token);
+ replen = strlen(replacement);
+
+ for (i = o = 0; i < numlines; i++, o++)
+ {
+ /* just copy pointer if NULL or no change needed */
+ if (!lines[i] || (strncmp((const char *)lines + i, token, toklen)))
+ {
+ if (lines[i] == 0x0d) /* ||(lines[i] == 0x0a)) */
+ break;
+
+ result_set[o] = lines[i];
+ continue;
+ }
+ /* if we get here a change is needed - set up new line */
+ strncpy((char *)result_set + o, replacement, replen);
+ o += replen - 1;
+ i += toklen - 1;
+ }
+
+ result_set[o] = '\0';
+ memcpy(resout, result_set, o);
+}
+
+
/*
* Local Variables:
* tab-width: 4
- Previous message: [Slony1-commit] By wieck: Added a new command to slonik.
- Next message: [Slony1-commit] By cbbrowne: Fix misspellings of "tranaction"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Slony1-commit mailing list