mysql5/mysql-5.7.27/storage/ndb/tools/ndb_dump_frm_data.cpp

176 lines
4.0 KiB
C++

/* Copyright (C) 2003 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */
#include <ndb_global.h>
#include <ndb_opts.h>
#include <NdbOut.hpp>
#include <NdbApi.hpp>
#include <NDBT.hpp>
static struct my_option
my_long_options[] =
{
{ "help", '?',
"Display this help and exit.",
0, 0, 0,
GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0 },
{ 0, 0,
0,
0, 0, 0,
GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0 }
};
const char*
load_default_groups[]= { 0 };
static void
short_usage_sub(void)
{
ndb_short_usage_sub("*.frm ...");
}
static void
usage()
{
printf("%s: pack and dump *.frm as C arrays\n", my_progname);
ndb_usage(short_usage_sub, load_default_groups, my_long_options);
}
static void
dodump(const char* name, const uchar* frm_data, uint frm_len)
{
printf("const uint g_%s_frm_len = %u;\n\n", name, frm_len);
printf("const uint8 g_%s_frm_data[%u] =\n{\n", name, frm_len);
uint n = 0;
while (n < frm_len) {
if (n % 8 == 0) {
if (n != 0) {
printf("\n");
}
printf(" ");
}
printf("0x%02x", frm_data[n]);
if (n + 1 < frm_len) {
printf(",");
}
n++;
}
if (n % 8 != 0) {
printf("\n");
}
printf("};\n");
}
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;
}
int
main(int argc, char** argv)
{
my_progname = "ndb_pack_frm";
int ret;
ndb_init();
ndb_opt_set_usage_funcs(short_usage_sub, usage);
ret = handle_options(&argc, &argv, my_long_options, ndb_std_get_one_option);
if (ret != 0)
return NDBT_WRONGARGS;
for (int i = 0; i < argc; i++)
{
ret = dofile(argv[i]);
if (ret != 0)
return NDBT_FAILED;
}
return NDBT_OK;
}