コード例 #1
0
ファイル: consumer_restore.cpp プロジェクト: A-eolus/mysql
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);
}
コード例 #2
0
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;
}