diff --git a/Docs/manual.texi b/Docs/manual.texi index ff7290c0b85fc3e6e6a673f8f3220231842c429d..394360681c8eaa5d263a50ab93fb222c74c21a88 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -32515,6 +32515,10 @@ used.) @item -q, --quick Don't buffer query, dump directly to stdout. Uses @code{mysql_use_result()} to do this. +@item -r, --result-file=... +Direct output to a given file. This option should be used in MSDOS, +because it prevents new line '\n' from being converted to '\n\r' (new +line + carriage return). @item -S /path/to/socket, --socket=/path/to/socket The socket file to use when connecting to @code{localhost} (which is the default host). diff --git a/client/mysqldump.c b/client/mysqldump.c index ce6c64aa00e8c7471deddb4805e72cc2fd71c3b7..aa5a29e45e374c548974aa08055536a06cd4ce07 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -37,7 +37,7 @@ ** Tõnu Samuel <tonu@please.do.not.remove.this.spam.ee> **/ -#define DUMP_VERSION "8.13" +#define DUMP_VERSION "8.14" #include <global.h> #include <my_sys.h> @@ -73,7 +73,8 @@ static my_bool verbose=0,tFlag=0,cFlag=0,dFlag=0,quick=0, extended_insert = 0, lock_tables=0,ignore_errors=0,flush_logs=0,replace=0, ignore=0,opt_drop=0,opt_keywords=0,opt_lock=0,opt_compress=0, opt_delayed=0,create_options=0,opt_quoted=0,opt_databases=0, - opt_alldbs=0,opt_create_db=0,opt_first_slave=0; + opt_alldbs=0,opt_create_db=0,opt_first_slave=0, + opt_resultfile=0; static MYSQL mysql_connection,*sock=0; static char insert_pat[12 * 1024],*opt_password=0,*current_user=0, *current_host=0,*path=0,*fields_terminated=0, @@ -127,6 +128,7 @@ static struct option long_options[] = {"port", required_argument, 0, 'P'}, {"quick", no_argument, 0, 'q'}, {"quote-names", no_argument, 0, 'Q'}, + {"result-file", required_argument, 0, 'r'}, {"set-variable", required_argument, 0, 'O'}, {"socket", required_argument, 0, 'S'}, #include "sslopt-longopts.h" @@ -227,6 +229,10 @@ puts("\ -P, --port=... Port number to use for connection.\n\ -q, --quick Don't buffer query, dump directly to stdout.\n\ -Q, --quote-names Quote table and column names with `\n\ + -r, --result-file=... Direct output to a given file. This option should be\n\ + used in MSDOS, because it prevents new line '\\n'\n\ + from being converted to '\\n\\r' (newline + carriage\n\ + return).\n\ -S, --socket=... Socket file to use for connection.\n\ --tables Overrides option --databases (-B).\n"); #include "sslopt-usage.h" @@ -283,10 +289,12 @@ static int get_options(int *argc,char ***argv) { int c,option_index; my_bool tty_password=0; + FILE *resultfile; load_defaults("my",load_default_groups,argc,argv); set_all_changeable_vars(changeable_vars); - while ((c=getopt_long(*argc,*argv,"#::p::h:u:O:P:S:T:EBaAcCdefFlnqtvVw:?Ix", + while ((c=getopt_long(*argc,*argv, + "#::p::h:u:O:P:r:S:T:EBaAcCdefFlnqtvVw:?Ix", long_options, &option_index)) != EOF) { switch(c) { @@ -346,6 +354,15 @@ static int get_options(int *argc,char ***argv) case 'P': opt_mysql_port= (unsigned int) atoi(optarg); break; + case 'r': + if (!(resultfile = my_fopen(optarg, O_WRONLY, MYF(MY_WME)))) + { + printf("Couldn't open result-file %s, aborting!\n", optarg); + exit(1); + } + opt_resultfile = 1; + stdout = resultfile; + break; case 'S': opt_mysql_unix_port= optarg; break; @@ -625,8 +642,8 @@ static uint getTableStructure(char *table, char* db) O_WRONLY, MYF(MY_WME)); if (!sql_file) /* If file couldn't be opened */ { - safe_exit(EX_MYSQLERR); - DBUG_RETURN(0); + safe_exit(EX_MYSQLERR); + DBUG_RETURN(0); } write_heder(sql_file, db); } @@ -734,20 +751,20 @@ static uint getTableStructure(char *table, char* db) if (!tFlag) { if (opt_keywords) - fprintf(sql_file, " %s.%s %s", table_name, - quote_name(row[SHOW_FIELDNAME],name_buff), row[SHOW_TYPE]); + fprintf(sql_file, " %s.%s %s", table_name, + quote_name(row[SHOW_FIELDNAME],name_buff), row[SHOW_TYPE]); else - fprintf(sql_file, " %s %s", quote_name(row[SHOW_FIELDNAME],name_buff), - row[SHOW_TYPE]); + fprintf(sql_file, " %s %s", quote_name(row[SHOW_FIELDNAME], + name_buff), row[SHOW_TYPE]); if (row[SHOW_DEFAULT]) { - fputs(" DEFAULT ", sql_file); - unescape(sql_file,row[SHOW_DEFAULT],lengths[SHOW_DEFAULT]); + fputs(" DEFAULT ", sql_file); + unescape(sql_file,row[SHOW_DEFAULT],lengths[SHOW_DEFAULT]); } if (!row[SHOW_NULL][0]) - fputs(" NOT NULL", sql_file); + fputs(" NOT NULL", sql_file); if (row[SHOW_EXTRA][0]) - fprintf(sql_file, " %s",row[SHOW_EXTRA]); + fprintf(sql_file, " %s",row[SHOW_EXTRA]); } } numFields = (uint) mysql_num_rows(tableRes); @@ -761,9 +778,9 @@ static uint getTableStructure(char *table, char* db) if (mysql_query(sock, buff)) { fprintf(stderr, "%s: Can't get keys for table '%s' (%s)\n", - my_progname, table, mysql_error(sock)); + my_progname, table, mysql_error(sock)); if (sql_file != stdout) - my_fclose(sql_file, MYF(MY_WME)); + my_fclose(sql_file, MYF(MY_WME)); safe_exit(EX_MYSQLERR); DBUG_RETURN(0); } @@ -776,16 +793,16 @@ static uint getTableStructure(char *table, char* db) { if (atoi(row[3]) == 1) { - keynr++; - #ifdef FORCE_PRIMARY_KEY - if (atoi(row[1]) == 0 && primary_key == INT_MAX) - primary_key=keynr; - #endif - if (!strcmp(row[2],"PRIMARY")) - { - primary_key=keynr; - break; - } + keynr++; +#ifdef FORCE_PRIMARY_KEY + if (atoi(row[1]) == 0 && primary_key == INT_MAX) + primary_key=keynr; +#endif + if (!strcmp(row[2],"PRIMARY")) + { + primary_key=keynr; + break; + } } } mysql_data_seek(tableRes,0); @@ -794,21 +811,21 @@ static uint getTableStructure(char *table, char* db) { if (atoi(row[3]) == 1) { - if (keynr++) - putc(')', sql_file); - if (atoi(row[1])) /* Test if duplicate key */ - /* Duplicate allowed */ - fprintf(sql_file, ",\n KEY %s (",quote_name(row[2],name_buff)); - else if (keynr == primary_key) - fputs(",\n PRIMARY KEY (",sql_file); /* First UNIQUE is primary */ - else - fprintf(sql_file, ",\n UNIQUE %s (",quote_name(row[2],name_buff)); + if (keynr++) + putc(')', sql_file); + if (atoi(row[1])) /* Test if duplicate key */ + /* Duplicate allowed */ + fprintf(sql_file, ",\n KEY %s (",quote_name(row[2],name_buff)); + else if (keynr == primary_key) + fputs(",\n PRIMARY KEY (",sql_file); /* First UNIQUE is primary */ + else + fprintf(sql_file, ",\n UNIQUE %s (",quote_name(row[2],name_buff)); } else - putc(',', sql_file); + putc(',', sql_file); fputs(quote_name(row[4],name_buff), sql_file); if (row[7]) - fprintf(sql_file, " (%s)",row[7]); /* Sub key */ + fprintf(sql_file, " (%s)",row[7]); /* Sub key */ } if (keynr) putc(')', sql_file); @@ -820,28 +837,28 @@ static uint getTableStructure(char *table, char* db) sprintf(buff,"show table status like '%s'",table); if (mysql_query(sock, buff)) { - if (mysql_errno(sock) != ER_PARSE_ERROR) - { /* If old MySQL version */ - if (verbose) - fprintf(stderr, - "# Warning: Couldn't get status information for table '%s' (%s)\n", - table,mysql_error(sock)); - } + if (mysql_errno(sock) != ER_PARSE_ERROR) + { /* If old MySQL version */ + if (verbose) + fprintf(stderr, + "# Warning: Couldn't get status information for table '%s' (%s)\n", + table,mysql_error(sock)); + } } else if (!(tableRes=mysql_store_result(sock)) || - !(row=mysql_fetch_row(tableRes))) + !(row=mysql_fetch_row(tableRes))) { - fprintf(stderr, - "Error: Couldn't read status information for table '%s' (%s)\n", - table,mysql_error(sock)); + fprintf(stderr, + "Error: Couldn't read status information for table '%s' (%s)\n", + table,mysql_error(sock)); } else { - fputs("/*!",sql_file); - print_value(sql_file,tableRes,row,"type=","Type",0); - print_value(sql_file,tableRes,row,"","Create_options",0); - print_value(sql_file,tableRes,row,"comment=","Comment",1); - fputs(" */",sql_file); + fputs("/*!",sql_file); + print_value(sql_file,tableRes,row,"type=","Type",0); + print_value(sql_file,tableRes,row,"","Create_options",0); + print_value(sql_file,tableRes,row,"comment=","Comment",1); + fputs(" */",sql_file); } mysql_free_result(tableRes); /* Is always safe to free */ } @@ -967,7 +984,7 @@ static void dumpTable(uint numFields, char *table) printf("# WHERE: %s\n",where); strxmov(strend(query), " WHERE ",where,NullS); } - puts("#\n"); + fputs("#\n\n", stdout); if (mysql_query(sock, query)) { @@ -1090,7 +1107,7 @@ static void dumpTable(uint numFields, char *table) else { if (row_break) - puts(";"); + fputs(";\n", stdout); row_break=1; /* This is first row */ fputs(insert_pat,stdout); fputs(extended_row.str,stdout); @@ -1098,12 +1115,10 @@ static void dumpTable(uint numFields, char *table) } } else - { - puts(");"); - } + fputs(");\n", stdout); } if (extended_insert && row_break) - puts(";"); /* If not empty table */ + fputs(";\n", stdout); /* If not empty table */ fflush(stdout); if (mysql_errno(sock)) { @@ -1118,7 +1133,7 @@ static void dumpTable(uint numFields, char *table) return; } if (opt_lock) - puts("UNLOCK TABLES;"); + fputs("UNLOCK TABLES;\n", stdout); mysql_free_result(res); } } /* dumpTable */ @@ -1365,7 +1380,9 @@ int main(int argc, char **argv) } } dbDisconnect(current_host); - puts(""); + fputs("\n", stdout); + if (opt_resultfile) + my_fclose(stdout, MYF(0)); my_free(opt_password, MYF(MY_ALLOW_ZERO_PTR)); if (extended_insert) dynstr_free(&extended_row);