bool BackupRestore::map_in_frm(char *new_data, const char *data, uint data_len, uint *new_data_len) { const char *end_data= data + data_len; const char *end_part_data; const char *part_data; char *extra_ptr; uint start_key_definition_len = uint2korr(data + 6); uint key_definition_len = uint4korr(data + 47); uint part_info_len; DBUG_ENTER("map_in_frm"); if (data_len < 4096) goto error; extra_ptr = (char*)data + start_key_definition_len + key_definition_len; if ((int)data_len < ((extra_ptr - data) + 2)) goto error; extra_ptr = extra_ptr + 2 + uint2korr(extra_ptr); if ((int)data_len < ((extra_ptr - data) + 2)) goto error; extra_ptr = extra_ptr + 2 + uint2korr(extra_ptr); if ((int)data_len < ((extra_ptr - data) + 4)) goto error; part_info_len = uint4korr(extra_ptr); part_data = extra_ptr + 4; if ((int)data_len < ((part_data + part_info_len) - data)) goto error; do { copy_byte(&data, &new_data, new_data_len); } while (data < part_data); end_part_data = part_data + part_info_len; do { if (search_replace((char*)" NODEGROUP = ", &new_data, &data, end_part_data, new_data_len)) goto error; } while (data != end_part_data); do { copy_byte(&data, &new_data, new_data_len); } while (data < end_data); DBUG_RETURN(FALSE); error: DBUG_RETURN(TRUE); }
bool BackupRestore::search_replace(char *search_str, char **new_data, const char **data, const char *end_data, uint *new_data_len) { uint search_str_len = strlen(search_str); uint inx = 0; bool in_delimiters = FALSE; bool escape_char = FALSE; char start_delimiter = 0; DBUG_ENTER("search_replace"); do { char c = **data; copy_byte(data, new_data, new_data_len); if (escape_char) { escape_char = FALSE; } else if (in_delimiters) { if (c == start_delimiter) in_delimiters = FALSE; } else if (c == '\'' || c == '\"') { in_delimiters = TRUE; start_delimiter = c; } else if (c == '\\') { escape_char = TRUE; } else if (c == search_str[inx]) { inx++; if (inx == search_str_len) { bool found = FALSE; uint number = 0; while (*data != end_data) { if (isdigit(**data)) { found = TRUE; number = (10 * number) + (**data); if (number > MAX_NDB_NODES) break; } else if (found) { /* After long and tedious preparations we have actually found a node group identifier to convert. We'll use the mapping table created for node groups and then insert the new number instead of the old number. */ uint temp = map_ng(number); int no_digits = 0; char digits[10]; while (temp != 0) { digits[no_digits] = temp % 10; no_digits++; temp/=10; } for (no_digits--; no_digits >= 0; no_digits--) { **new_data = digits[no_digits]; *new_data_len+=1; } DBUG_RETURN(FALSE); } else break; (*data)++; } DBUG_RETURN(TRUE); } } else inx = 0; } while (*data < end_data); DBUG_RETURN(FALSE); }
static void ttf_ncopy(int n) { while (n-- > 0) copy_byte(); }