bool BackupRestore::translate_frm(NdbDictionary::Table *table) { uchar *pack_data, *data, *new_pack_data; char *new_data; uint new_data_len; size_t data_len, new_pack_len; uint no_parts, extra_growth; DBUG_ENTER("translate_frm"); pack_data = (uchar*) table->getFrmData(); no_parts = table->getFragmentCount(); /* Add max 4 characters per partition to handle worst case of mapping from single digit to 5-digit number. Fairly future-proof, ok up to 99999 node groups. */ extra_growth = no_parts * 4; if (unpackfrm(&data, &data_len, pack_data)) { DBUG_RETURN(TRUE); } if ((new_data = (char*) my_malloc(data_len + extra_growth, MYF(0)))) { DBUG_RETURN(TRUE); } if (map_in_frm(new_data, (const char*)data, data_len, &new_data_len)) { my_free(new_data); DBUG_RETURN(TRUE); } if (packfrm((uchar*) new_data, new_data_len, &new_pack_data, &new_pack_len)) { my_free(new_data); DBUG_RETURN(TRUE); } table->setFrm(new_pack_data, new_pack_len); DBUG_RETURN(FALSE); }
static int dofile(const char* file) { struct stat st; size_t size = 0; uchar* data = 0; int fd = -1; uchar* pack_data = 0; size_t pack_len = 0; char* namebuf = 0; int ret = -1; do { if (stat(file, &st) == -1) { fprintf(stderr, "%s: stat: %s\n", file, strerror(errno)); break; } size = st.st_size; if ((data = (uchar*)malloc(size)) == 0) { fprintf(stderr, "%s: malloc %u: %s\n", file, (uint)size, strerror(errno)); break; } if ((fd = open(file, O_RDONLY)) == -1) { fprintf(stderr, "%s: open: %s\n", file, strerror(errno)); break; } ssize_t size2; if ((size2 = read(fd, data, (unsigned)size)) == -1) { fprintf(stderr, "%s: read: %s\n", file, strerror(errno)); break; } if ((size_t)size2 != size) { fprintf(stderr, "%s: short read: %u != %u\n", file, (uint)size2, (uint)size); break; } int error; if ((error = packfrm(data, size, &pack_data, &pack_len)) != 0) { fprintf(stderr, "%s: packfrm: error %d\n", file, error); break; } namebuf = strdup(file); if (namebuf == 0) { fprintf(stderr, "%s: strdup: %s\n", file, strerror(errno)); break; } char* name = namebuf; if (strchr(name, '/') != 0) name = strrchr(name, '/') + 1; char* dot; if ((dot = strchr(name, '.')) != 0) *dot = 0; printf("\n/*\n"); printf(" name: %s\n", name); printf(" orig: %u\n", (uint)size); printf(" pack: %u\n", (uint)pack_len); printf("*/\n\n"); dodump(name, pack_data, (uint)pack_len); ret = 0; } while (0); if (namebuf != 0) free(namebuf); if (pack_data != 0) my_free(pack_data); // Free data returned from packfrm with my_free if (fd != -1) (void)close(fd); if (data != 0) free(data); return ret; }