Mon Jan 21 10:54:13 PST 2008
- Previous message: [Slony1-commit] slony1-engine/src/slon local_listen.c remote_worker.c
- Next message: [Slony1-commit] slony1-engine RELEASE-2.0
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Update of /home/cvsd/slony1/slony1-engine/src/slonik In directory main.slony.info:/tmp/cvs-serv28743/slonik Modified Files: parser.y scan.l slonik.c slonik.h Log Message: New even type CLONE_NODE. This will allow to duplicate an existing subscriber using pg_dump or even filesystem level of copying the database cluster. See the script src/ducttape/test_1_clonenode for an example of how this works. Documentation still to be done. Jan Index: slonik.h =================================================================== RCS file: /home/cvsd/slony1/slony1-engine/src/slonik/slonik.h,v retrieving revision 1.32 retrieving revision 1.33 diff -C2 -d -r1.32 -r1.33 *** slonik.h 5 Jul 2007 18:19:04 -0000 1.32 --- slonik.h 21 Jan 2008 18:54:11 -0000 1.33 *************** *** 25,28 **** --- 25,30 ---- typedef struct SlonikStmt_failed_node_s SlonikStmt_failed_node; typedef struct SlonikStmt_uninstall_node_s SlonikStmt_uninstall_node; + typedef struct SlonikStmt_clone_prepare_s SlonikStmt_clone_prepare; + typedef struct SlonikStmt_clone_finish_s SlonikStmt_clone_finish; typedef struct SlonikStmt_store_path_s SlonikStmt_store_path; typedef struct SlonikStmt_drop_path_s SlonikStmt_drop_path; *************** *** 53,56 **** --- 55,60 ---- { STMT_TRY = 1, + STMT_CLONE_FINISH, + STMT_CLONE_PREPARE, STMT_CREATE_SET, STMT_DDL_SCRIPT, *************** *** 60,63 **** --- 64,68 ---- STMT_DROP_SET, STMT_ECHO, + STMT_ERROR, STMT_EXIT, STMT_FAILED_NODE, *************** *** 66,71 **** STMT_MERGE_SET, STMT_MOVE_SET, - STMT_RESTART_NODE, STMT_REPAIR_CONFIG, STMT_SET_ADD_SEQUENCE, STMT_SET_ADD_TABLE, --- 71,76 ---- STMT_MERGE_SET, STMT_MOVE_SET, STMT_REPAIR_CONFIG, + STMT_RESTART_NODE, STMT_SET_ADD_SEQUENCE, STMT_SET_ADD_TABLE, *************** *** 74,90 **** STMT_SET_MOVE_SEQUENCE, STMT_SET_MOVE_TABLE, STMT_STORE_LISTEN, STMT_STORE_NODE, STMT_STORE_PATH, STMT_SUBSCRIBE_SET, STMT_UNINSTALL_NODE, STMT_UNLOCK_SET, STMT_UNSUBSCRIBE_SET, STMT_UPDATE_FUNCTIONS, ! STMT_WAIT_EVENT, ! STMT_SWITCH_LOG, ! STMT_ERROR, ! STMT_SYNC, ! STMT_SLEEP } Slonik_stmttype; --- 79,94 ---- STMT_SET_MOVE_SEQUENCE, STMT_SET_MOVE_TABLE, + STMT_SLEEP, STMT_STORE_LISTEN, STMT_STORE_NODE, STMT_STORE_PATH, STMT_SUBSCRIBE_SET, + STMT_SWITCH_LOG, + STMT_SYNC, STMT_UNINSTALL_NODE, STMT_UNLOCK_SET, STMT_UNSUBSCRIBE_SET, STMT_UPDATE_FUNCTIONS, ! STMT_WAIT_EVENT } Slonik_stmttype; *************** *** 205,208 **** --- 209,229 ---- + struct SlonikStmt_clone_prepare_s + { + SlonikStmt hdr; + int no_id; + int no_provider; + char *no_comment; + }; + + + struct SlonikStmt_clone_finish_s + { + SlonikStmt hdr; + int no_id; + int no_provider; + }; + + struct SlonikStmt_store_path_s { *************** *** 513,516 **** --- 534,539 ---- extern int slonik_failed_node(SlonikStmt_failed_node * stmt); extern int slonik_uninstall_node(SlonikStmt_uninstall_node * stmt); + extern int slonik_clone_prepare(SlonikStmt_clone_prepare * stmt); + extern int slonik_clone_finish(SlonikStmt_clone_finish * stmt); extern int slonik_store_path(SlonikStmt_store_path * stmt); extern int slonik_drop_path(SlonikStmt_drop_path * stmt); Index: parser.y =================================================================== RCS file: /home/cvsd/slony1/slony1-engine/src/slonik/parser.y,v retrieving revision 1.29 retrieving revision 1.30 diff -C2 -d -r1.29 -r1.30 *** parser.y 5 Jul 2007 18:19:04 -0000 1.29 --- parser.y 21 Jan 2008 18:54:11 -0000 1.30 *************** *** 46,50 **** O_TAB_ID, O_TIMEOUT, - O_TRIG_NAME, O_USE_KEY, O_WAIT_CONFIRMED, --- 46,49 ---- *************** *** 135,138 **** --- 134,139 ---- %type <statement> stmt_failed_node %type <statement> stmt_uninstall_node + %type <statement> stmt_clone_prepare + %type <statement> stmt_clone_finish %type <statement> stmt_store_path %type <statement> stmt_drop_path *************** *** 176,179 **** --- 177,181 ---- %token K_BACKUP %token K_CLIENT + %token K_CLONE %token K_CLUSTER %token K_CLUSTERNAME *************** *** 193,196 **** --- 195,199 ---- %token K_FALSE %token K_FILENAME + %token K_FINISH %token K_FOR %token K_FORWARD *************** *** 215,218 **** --- 218,222 ---- %token K_ORIGIN %token K_PATH + %token K_PREPARE %token K_PROVIDER %token K_QUALIFIED *************** *** 429,432 **** --- 433,440 ---- | stmt_uninstall_node { $$ = $1; } + | stmt_clone_prepare + { $$ = $1; } + | stmt_clone_finish + { $$ = $1; } | stmt_store_path { $$ = $1; } *************** *** 698,701 **** --- 706,767 ---- ; + stmt_clone_prepare : lno K_CLONE K_PREPARE option_list + { + SlonikStmt_clone_prepare *new; + statement_option opt[] = { + STMT_OPTION_INT( O_ID, -1 ), + STMT_OPTION_INT( O_PROVIDER, -1 ), + STMT_OPTION_STR( O_COMMENT, NULL ), + STMT_OPTION_END + }; + + new = (SlonikStmt_clone_prepare *) + malloc(sizeof(SlonikStmt_clone_prepare)); + memset(new, 0, sizeof(SlonikStmt_clone_prepare)); + new->hdr.stmt_type = STMT_CLONE_PREPARE; + new->hdr.stmt_filename = current_file; + new->hdr.stmt_lno = $1; + + if (assign_options(opt, $4) == 0) + { + new->no_id = opt[0].ival; + new->no_provider = opt[1].ival; + new->no_comment = opt[2].str; + } + else + parser_errors++; + + $$ = (SlonikStmt *)new; + } + ; + + stmt_clone_finish : lno K_CLONE K_FINISH option_list + { + SlonikStmt_clone_finish *new; + statement_option opt[] = { + STMT_OPTION_INT( O_ID, -1 ), + STMT_OPTION_INT( O_PROVIDER, -1 ), + STMT_OPTION_END + }; + + new = (SlonikStmt_clone_finish *) + malloc(sizeof(SlonikStmt_clone_finish)); + memset(new, 0, sizeof(SlonikStmt_clone_finish)); + new->hdr.stmt_type = STMT_CLONE_FINISH; + new->hdr.stmt_filename = current_file; + new->hdr.stmt_lno = $1; + + if (assign_options(opt, $4) == 0) + { + new->no_id = opt[0].ival; + new->no_provider = opt[1].ival; + } + else + parser_errors++; + + $$ = (SlonikStmt *)new; + } + ; + stmt_store_path : lno K_STORE K_PATH option_list { Index: slonik.c =================================================================== RCS file: /home/cvsd/slony1/slony1-engine/src/slonik/slonik.c,v retrieving revision 1.84 retrieving revision 1.85 diff -C2 -d -r1.84 -r1.85 *** slonik.c 8 Jan 2008 20:43:24 -0000 1.84 --- slonik.c 21 Jan 2008 18:54:11 -0000 1.85 *************** *** 380,383 **** --- 380,411 ---- break; + case STMT_CLONE_PREPARE: + { + SlonikStmt_clone_prepare *stmt = + (SlonikStmt_clone_prepare *) hdr; + + if (stmt->no_id < 0) + { + printf("%s:%d: Error: " + "new node ID must be specified\n", + hdr->stmt_filename, hdr->stmt_lno); + errors++; + } + + if (script_check_adminfo(hdr, stmt->no_provider) < 0) + errors++; + } + break; + + case STMT_CLONE_FINISH: + { + SlonikStmt_clone_finish *stmt = + (SlonikStmt_clone_finish *) hdr; + + if (script_check_adminfo(hdr, stmt->no_id) < 0) + errors++; + } + break; + case STMT_STORE_PATH: { *************** *** 1212,1215 **** --- 1240,1263 ---- break; + case STMT_CLONE_PREPARE: + { + SlonikStmt_clone_prepare *stmt = + (SlonikStmt_clone_prepare *) hdr; + + if (slonik_clone_prepare(stmt) < 0) + errors++; + } + break; + + case STMT_CLONE_FINISH: + { + SlonikStmt_clone_finish *stmt = + (SlonikStmt_clone_finish *) hdr; + + if (slonik_clone_finish(stmt) < 0) + errors++; + } + break; + case STMT_STORE_PATH: { *************** *** 1871,1874 **** --- 1919,1923 ---- } + static int slonik_repair_config(SlonikStmt_repair_config * stmt) *************** *** 2873,2876 **** --- 2922,2987 ---- int + slonik_clone_prepare(SlonikStmt_clone_prepare * stmt) + { + SlonikAdmInfo *adminfo1; + SlonDString query; + + adminfo1 = get_active_adminfo((SlonikStmt *) stmt, stmt->no_provider); + if (adminfo1 == NULL) + return -1; + + dstring_init(&query); + + if (stmt->no_comment == NULL) + slon_mkquery(&query, + "select \"_%s\".cloneNodePrepare(%d, %d, 'Node %d'); ", + stmt->hdr.script->clustername, + stmt->no_id, stmt->no_provider, + stmt->no_id); + else + slon_mkquery(&query, + "select \"_%s\".cloneNodePrepare(%d, %d, '%q'); ", + stmt->hdr.script->clustername, + stmt->no_id, stmt->no_provider, + stmt->no_comment); + if (db_exec_evcommand((SlonikStmt *) stmt, adminfo1, &query) < 0) + { + dstring_free(&query); + return -1; + } + + dstring_free(&query); + return 0; + } + + + int + slonik_clone_finish(SlonikStmt_clone_finish * stmt) + { + SlonikAdmInfo *adminfo1; + SlonDString query; + + adminfo1 = get_active_adminfo((SlonikStmt *) stmt, stmt->no_id); + if (adminfo1 == NULL) + return -1; + + dstring_init(&query); + + slon_mkquery(&query, + "select \"_%s\".cloneNodeFinish(%d, %d); ", + stmt->hdr.script->clustername, + stmt->no_id, stmt->no_provider); + if (db_exec_command((SlonikStmt *) stmt, adminfo1, &query) < 0) + { + dstring_free(&query); + return -1; + } + + dstring_free(&query); + return 0; + } + + + int slonik_store_path(SlonikStmt_store_path * stmt) { Index: scan.l =================================================================== RCS file: /home/cvsd/slony1/slony1-engine/src/slonik/scan.l,v retrieving revision 1.28 retrieving revision 1.29 diff -C2 -d -r1.28 -r1.29 *** scan.l 5 Jul 2007 18:19:04 -0000 1.28 --- scan.l 21 Jan 2008 18:54:11 -0000 1.29 *************** *** 72,75 **** --- 72,76 ---- backup { return K_BACKUP; } client { return K_CLIENT; } + clone { return K_CLONE; } cluster { return K_CLUSTER; } comment { return K_COMMENT; } *************** *** 88,91 **** --- 89,93 ---- false { return K_FALSE; } filename { return K_FILENAME; } + finish { return K_FINISH; } for { return K_FOR; } forward { return K_FORWARD; } *************** *** 111,114 **** --- 113,117 ---- origin { return K_ORIGIN; } path { return K_PATH; } + prepare { return K_PREPARE; } provider { return K_PROVIDER; } qualified { return K_QUALIFIED; }
- Previous message: [Slony1-commit] slony1-engine/src/slon local_listen.c remote_worker.c
- Next message: [Slony1-commit] slony1-engine RELEASE-2.0
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Slony1-commit mailing list