mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
Dumping BLOBs in HEX notation. The patch was orinigally
contributed by Takeshi. I also added HEX support for "extended-inserts".
This commit is contained in:
@@ -45,5 +45,5 @@ enum options_client
|
|||||||
OPT_COMPATIBLE, OPT_RECONNECT, OPT_DELIMITER, OPT_SECURE_AUTH,
|
OPT_COMPATIBLE, OPT_RECONNECT, OPT_DELIMITER, OPT_SECURE_AUTH,
|
||||||
OPT_OPEN_FILES_LIMIT, OPT_SET_CHARSET, OPT_CREATE_OPTIONS,
|
OPT_OPEN_FILES_LIMIT, OPT_SET_CHARSET, OPT_CREATE_OPTIONS,
|
||||||
OPT_START_POSITION, OPT_STOP_POSITION, OPT_START_DATETIME, OPT_STOP_DATETIME,
|
OPT_START_POSITION, OPT_STOP_POSITION, OPT_START_DATETIME, OPT_STOP_DATETIME,
|
||||||
OPT_SIGINT_IGNORE
|
OPT_SIGINT_IGNORE, OPT_HEXBLOB
|
||||||
};
|
};
|
||||||
|
@@ -81,7 +81,8 @@ static my_bool verbose=0,tFlag=0,cFlag=0,dFlag=0,quick= 1, extended_insert= 1,
|
|||||||
opt_alldbs=0,opt_create_db=0,opt_first_slave=0,opt_set_charset,
|
opt_alldbs=0,opt_create_db=0,opt_first_slave=0,opt_set_charset,
|
||||||
opt_autocommit=0,opt_master_data,opt_disable_keys=1,opt_xml=0,
|
opt_autocommit=0,opt_master_data,opt_disable_keys=1,opt_xml=0,
|
||||||
opt_delete_master_logs=0, tty_password=0,
|
opt_delete_master_logs=0, tty_password=0,
|
||||||
opt_single_transaction=0, opt_comments= 0, opt_compact= 0;
|
opt_single_transaction=0, opt_comments= 0, opt_compact= 0,
|
||||||
|
opt_hex_blob=0;
|
||||||
static ulong opt_max_allowed_packet, opt_net_buffer_length;
|
static ulong opt_max_allowed_packet, opt_net_buffer_length;
|
||||||
static MYSQL mysql_connection,*sock=0;
|
static MYSQL mysql_connection,*sock=0;
|
||||||
static char insert_pat[12 * 1024],*opt_password=0,*current_user=0,
|
static char insert_pat[12 * 1024],*opt_password=0,*current_user=0,
|
||||||
@@ -316,6 +317,8 @@ static struct my_option my_long_options[] =
|
|||||||
{"comments", 'i', "Write additional information.",
|
{"comments", 'i', "Write additional information.",
|
||||||
(gptr*) &opt_comments, (gptr*) &opt_comments, 0, GET_BOOL, NO_ARG,
|
(gptr*) &opt_comments, (gptr*) &opt_comments, 0, GET_BOOL, NO_ARG,
|
||||||
1, 0, 0, 0, 0, 0},
|
1, 0, 0, 0, 0, 0},
|
||||||
|
{"hex-blob", OPT_HEXBLOB, "Dump BLOBs in HEX. this mode does not work with extended-insert",
|
||||||
|
(gptr*) &opt_hex_blob, (gptr*) &opt_hex_blob, 0, GET_BOOL, 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}
|
{0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1507,6 +1510,7 @@ static void dumpTable(uint numFields, char *table)
|
|||||||
|
|
||||||
for (i = 0; i < mysql_num_fields(res); i++)
|
for (i = 0; i < mysql_num_fields(res); i++)
|
||||||
{
|
{
|
||||||
|
int is_blob;
|
||||||
if (!(field = mysql_fetch_field(res)))
|
if (!(field = mysql_fetch_field(res)))
|
||||||
{
|
{
|
||||||
sprintf(query,"%s: Not enough fields from table %s! Aborting.\n",
|
sprintf(query,"%s: Not enough fields from table %s! Aborting.\n",
|
||||||
@@ -1515,6 +1519,17 @@ static void dumpTable(uint numFields, char *table)
|
|||||||
error= EX_CONSCHECK;
|
error= EX_CONSCHECK;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
63 is my_charset_bin. If charsetnr is not 63,
|
||||||
|
we have not a BLOB but a TEXT column.
|
||||||
|
we'll dump it in hex only BLOB columns.
|
||||||
|
*/
|
||||||
|
is_blob= (opt_hex_blob && field->charsetnr == 63 &&
|
||||||
|
(field->type == FIELD_TYPE_BLOB ||
|
||||||
|
field->type == FIELD_TYPE_LONG_BLOB ||
|
||||||
|
field->type == FIELD_TYPE_MEDIUM_BLOB ||
|
||||||
|
field->type == FIELD_TYPE_TINY_BLOB)) ? 1 : 0;
|
||||||
if (extended_insert)
|
if (extended_insert)
|
||||||
{
|
{
|
||||||
ulong length = lengths[i];
|
ulong length = lengths[i];
|
||||||
@@ -1535,13 +1550,29 @@ static void dumpTable(uint numFields, char *table)
|
|||||||
error= EX_EOM;
|
error= EX_EOM;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
if (opt_hex_blob && is_blob)
|
||||||
|
{
|
||||||
|
ulong counter;
|
||||||
|
unsigned char *ptr= row[i];
|
||||||
|
dynstr_append(&extended_row, "0x");
|
||||||
|
for (counter = 0; counter < lengths[i]; counter++)
|
||||||
|
{
|
||||||
|
char xx[3];
|
||||||
|
sprintf(xx, "%02X", ptr[counter]);
|
||||||
|
dynstr_append(&extended_row, xx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
dynstr_append(&extended_row,"'");
|
dynstr_append(&extended_row,"'");
|
||||||
extended_row.length +=
|
extended_row.length +=
|
||||||
mysql_real_escape_string(&mysql_connection,
|
mysql_real_escape_string(&mysql_connection,
|
||||||
&extended_row.str[extended_row.length],row[i],length);
|
&extended_row.str[extended_row.length],
|
||||||
|
row[i],length);
|
||||||
extended_row.str[extended_row.length]='\0';
|
extended_row.str[extended_row.length]='\0';
|
||||||
dynstr_append(&extended_row,"'");
|
dynstr_append(&extended_row,"'");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* change any strings ("inf", "-inf", "nan") into NULL */
|
/* change any strings ("inf", "-inf", "nan") into NULL */
|
||||||
@@ -1591,6 +1622,18 @@ static void dumpTable(uint numFields, char *table)
|
|||||||
print_quoted_xml(md_result_file, row[i], lengths[i]);
|
print_quoted_xml(md_result_file, row[i], lengths[i]);
|
||||||
fputs("</field>\n", md_result_file);
|
fputs("</field>\n", md_result_file);
|
||||||
}
|
}
|
||||||
|
else if (opt_hex_blob && is_blob)
|
||||||
|
{ /* sakaik got this idea. */
|
||||||
|
ulong counter;
|
||||||
|
char xx[4];
|
||||||
|
unsigned char *ptr= row[i];
|
||||||
|
fputs("0x", md_result_file);
|
||||||
|
for (counter = 0; counter < lengths[i]; counter++)
|
||||||
|
{
|
||||||
|
sprintf(xx, "%02X", ptr[counter]);
|
||||||
|
fputs(xx, md_result_file);
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
unescape(md_result_file, row[i], lengths[i]);
|
unescape(md_result_file, row[i], lengths[i]);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user