diff options
author | unknown <vva@eagle.mysql.r18.ru> | 2004-06-25 01:14:12 +0500 |
---|---|---|
committer | unknown <vva@eagle.mysql.r18.ru> | 2004-06-25 01:14:12 +0500 |
commit | 769654278536794d60b551a9686fbde965bc5b13 (patch) | |
tree | cf9399cbdd9b2c492005a6e3ed965b56f9564ee5 /client | |
parent | 95325f13544aa8f43af45ae66a271949fd6aee2d (diff) | |
download | mariadb-git-769654278536794d60b551a9686fbde965bc5b13.tar.gz |
fixed bug #1851 "mysqldump does not return
an error code if the output device is filled"
Diffstat (limited to 'client')
-rw-r--r-- | client/mysqldump.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/client/mysqldump.c b/client/mysqldump.c index 218a97c252e..de39f9474d2 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -55,6 +55,7 @@ #define EX_MYSQLERR 2 #define EX_CONSCHECK 3 #define EX_EOM 4 +#define EX_EOF 5 /* ferror for output file was got */ /* index into 'show fields from table' */ @@ -332,6 +333,23 @@ static const char *check_if_ignore_table(const char *table_name); #include <help_start.h> +/* + exit with message if ferror(file) + + SYNOPSIS + check_io() + file - checked file +*/ + +void check_io(FILE *file) +{ + if (ferror(file)) + { + fprintf(stderr, "%s: Got errno %d on write\n", my_progname, errno); + safe_exit(EX_EOF); + } +} + static void print_version(void) { printf("%s Ver %s Distrib %s, for %s (%s)\n",my_progname,DUMP_VERSION, @@ -378,6 +396,7 @@ static void write_header(FILE *sql_file, char *db_name) { fputs("<?xml version=\"1.0\"?>\n", sql_file); fputs("<mysqldump>\n", sql_file); + check_io(sql_file); } else if (!opt_compact) { @@ -409,6 +428,7 @@ static void write_header(FILE *sql_file, char *db_name) "/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=\"%s%s%s\" */;\n", path?"":"NO_AUTO_VALUE_ON_ZERO",compatible_mode_normal_str[0]==0?"":",", compatible_mode_normal_str); + check_io(sql_file); } } /* write_header */ @@ -416,7 +436,10 @@ static void write_header(FILE *sql_file, char *db_name) static void write_footer(FILE *sql_file) { if (opt_xml) + { fputs("</mysqldump>\n", sql_file); + check_io(sql_file); + } else if (!opt_compact) { fprintf(sql_file,"\n/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;\n"); @@ -432,6 +455,7 @@ static void write_footer(FILE *sql_file) "/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\n" "/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;\n"); fputs("\n", sql_file); + check_io(sql_file); } } /* write_footer */ @@ -725,6 +749,7 @@ static void unescape(FILE *file,char *pos,uint length) fputc('\'', file); fputs(tmp, file); fputc('\'', file); + check_io(file); my_free(tmp, MYF(MY_WME)); DBUG_VOID_RETURN; } /* unescape */ @@ -816,6 +841,7 @@ static void print_quoted_xml(FILE *xml_file, const char *str, ulong len) break; } } + check_io(xml_file); } @@ -849,6 +875,7 @@ static void print_xml_tag1(FILE * xml_file, const char* sbeg, print_quoted_xml(xml_file, sval, strlen(sval)); fputs("\">", xml_file); fputs(send, xml_file); + check_io(xml_file); } @@ -877,6 +904,7 @@ static void print_xml_row(FILE *xml_file, const char *row_name, ulong *lengths= mysql_fetch_lengths(tableRes); fprintf(xml_file, "\t\t<%s", row_name); + check_io(xml_file); mysql_field_seek(tableRes, 0); for (i= 0; (field= mysql_fetch_field(tableRes)); i++) { @@ -887,9 +915,11 @@ static void print_xml_row(FILE *xml_file, const char *row_name, fputs("=\"", xml_file); print_quoted_xml(xml_file, (*row)[i], lengths[i]); fputc('"', xml_file); + check_io(xml_file); } } fputs(" />\n", xml_file); + check_io(xml_file); } /* @@ -956,14 +986,21 @@ static uint getTableStructure(char *table, char* db) write_header(sql_file, db); } if (!opt_xml && opt_comments) + { fprintf(sql_file, "\n--\n-- Table structure for table %s\n--\n\n", result_table); + check_io(sql_file); + } if (opt_drop) + { fprintf(sql_file, "DROP TABLE IF EXISTS %s;\n", opt_quoted_table); + check_io(sql_file); + } tableRes=mysql_store_result(sock); row=mysql_fetch_row(tableRes); fprintf(sql_file, "%s;\n", row[1]); + check_io(sql_file); mysql_free_result(tableRes); } sprintf(insert_pat,"show fields from %s", result_table); @@ -1043,6 +1080,7 @@ static uint getTableStructure(char *table, char* db) fprintf(sql_file, "CREATE TABLE %s (\n", result_table); else print_xml_tag1(sql_file, "\t", "table_structure name=", table, "\n"); + check_io(sql_file); } if (cFlag) sprintf(insert_pat, "INSERT %sINTO %s (", delayed, result_table); @@ -1060,7 +1098,10 @@ static uint getTableStructure(char *table, char* db) if (init) { if (!opt_xml && !tFlag) + { fputs(",\n",sql_file); + check_io(sql_file); + } if (cFlag) strpos=strmov(strpos,", "); } @@ -1092,6 +1133,7 @@ static uint getTableStructure(char *table, char* db) fputs(" NOT NULL", sql_file); if (row[SHOW_EXTRA][0]) fprintf(sql_file, " %s",row[SHOW_EXTRA]); + check_io(sql_file); } } numFields = (uint) mysql_num_rows(tableRes); @@ -1160,12 +1202,14 @@ static uint getTableStructure(char *table, char* db) fputs(quote_name(row[4], name_buff, 0), sql_file); if (row[7]) fprintf(sql_file, " (%s)",row[7]); /* Sub key */ + check_io(sql_file); } if (!opt_xml) { if (keynr) putc(')', sql_file); fputs("\n)",sql_file); + check_io(sql_file); } /* Get MySQL specific create options */ @@ -1204,6 +1248,7 @@ static uint getTableStructure(char *table, char* db) print_value(sql_file,tableRes,row,"","Create_options",0); print_value(sql_file,tableRes,row,"comment=","Comment",1); fputs(" */",sql_file); + check_io(sql_file); } } mysql_free_result(tableRes); /* Is always safe to free */ @@ -1212,6 +1257,7 @@ static uint getTableStructure(char *table, char* db) fputs(";\n", sql_file); else fputs("\t</table_structure>\n", sql_file); + check_io(sql_file); } } if (cFlag) @@ -1365,19 +1411,28 @@ static void dumpTable(uint numFields, char *table) else { if (!opt_xml && opt_comments) + { fprintf(md_result_file,"\n--\n-- Dumping data for table %s\n--\n", result_table); + check_io(md_result_file); + } sprintf(query, "SELECT /*!40001 SQL_NO_CACHE */ * FROM %s", result_table); if (where) { if (!opt_xml && opt_comments) + { fprintf(md_result_file,"-- WHERE: %s\n",where); + check_io(md_result_file); + } query= alloc_query_str((ulong) (strlen(where) + strlen(query) + 10)); strxmov(query, query_buf, " WHERE ", where, NullS); } if (!opt_xml && !opt_compact) + { fputs("\n", md_result_file); + check_io(md_result_file); + } if (mysql_query(sock, query)) { DBerror(sock, "when retrieving data from server"); @@ -1405,10 +1460,16 @@ static void dumpTable(uint numFields, char *table) } if (opt_disable_keys) + { fprintf(md_result_file, "\n/*!40000 ALTER TABLE %s DISABLE KEYS */;\n", opt_quoted_table); + check_io(md_result_file); + } if (opt_lock) + { fprintf(md_result_file,"LOCK TABLES %s WRITE;\n", opt_quoted_table); + check_io(md_result_file); + } total_length= opt_net_buffer_length; /* Force row break */ row_break=0; @@ -1418,7 +1479,10 @@ static void dumpTable(uint numFields, char *table) print_xml_tag1(md_result_file, "\t", "table_data name=", table, "\n"); if (opt_autocommit) + { fprintf(md_result_file, "set autocommit=0;\n"); + check_io(md_result_file); + } while ((row=mysql_fetch_row(res))) { @@ -1426,11 +1490,17 @@ static void dumpTable(uint numFields, char *table) ulong *lengths=mysql_fetch_lengths(res); rownr++; if (!extended_insert && !opt_xml) + { fputs(insert_pat,md_result_file); + check_io(md_result_file); + } mysql_field_seek(res,0); if (opt_xml) + { fputs("\t<row>\n", md_result_file); + check_io(md_result_file); + } for (i = 0; i < mysql_num_fields(res); i++) { @@ -1503,7 +1573,10 @@ static void dumpTable(uint numFields, char *table) else { if (i && !opt_xml) + { fputc(',', md_result_file); + check_io(md_result_file); + } if (row[i]) { if (!IS_NUM_FIELD(field)) @@ -1544,11 +1617,15 @@ static void dumpTable(uint numFields, char *table) fputs(ptr, md_result_file); } } + check_io(md_result_file); } } if (opt_xml) + { fputs("\t</row>\n", md_result_file); + check_io(md_result_file); + } if (extended_insert) { @@ -1571,9 +1648,13 @@ static void dumpTable(uint numFields, char *table) fputs(extended_row.str,md_result_file); total_length = row_length+init_length; } + check_io(md_result_file); } else if (!opt_xml) + { fputs(");\n", md_result_file); + check_io(md_result_file); + } } /* XML - close table tag and supress regular output */ @@ -1582,6 +1663,7 @@ static void dumpTable(uint numFields, char *table) else if (extended_insert && row_break) fputs(";\n", md_result_file); /* If not empty table */ fflush(md_result_file); + check_io(md_result_file); if (mysql_errno(sock)) { sprintf(query,"%s: Error %d: %s when dumping table %s at row: %ld\n", @@ -1595,12 +1677,21 @@ static void dumpTable(uint numFields, char *table) goto err; } if (opt_lock) + { fputs("UNLOCK TABLES;\n", md_result_file); + check_io(md_result_file); + } if (opt_disable_keys) + { fprintf(md_result_file,"/*!40000 ALTER TABLE %s ENABLE KEYS */;\n", opt_quoted_table); + check_io(md_result_file); + } if (opt_autocommit) + { fprintf(md_result_file, "commit;\n"); + check_io(md_result_file); + } mysql_free_result(res); if (query != query_buf) my_free(query, MYF(MY_ALLOW_ZERO_PTR)); @@ -1691,7 +1782,10 @@ static int init_dumping(char *database) char quoted_database_buf[64*2+3]; char *qdatabase= quote_name(database,quoted_database_buf,opt_quoted); if (opt_comments) + { fprintf(md_result_file,"\n--\n-- Current Database: %s\n--\n", qdatabase); + check_io(md_result_file); + } if (!opt_create_db) { char qbuf[256]; @@ -1718,6 +1812,7 @@ static int init_dumping(char *database) } } fprintf(md_result_file,"\nUSE %s;\n", qdatabase); + check_io(md_result_file); } } if (extended_insert && init_dynamic_string(&extended_row, "", 1024, 1024)) @@ -1764,7 +1859,10 @@ static int dump_all_tables_in_db(char *database) dumpTable(numrows,table); } if (opt_xml) + { fputs("</database>\n", md_result_file); + check_io(md_result_file); + } if (lock_tables) mysql_query(sock,"UNLOCK TABLES"); return 0; @@ -1810,7 +1908,10 @@ static int dump_selected_tables(char *db, char **table_names, int tables) dumpTable(numrows, *table_names); } if (opt_xml) + { fputs("</database>\n", md_result_file); + check_io(md_result_file); + } if (lock_tables) mysql_query(sock,"UNLOCK TABLES"); return 0; @@ -1879,6 +1980,7 @@ static void print_value(FILE *file, MYSQL_RES *result, MYSQL_ROW row, unescape(file,row[0],(uint) strlen(row[0])); else fputs(row[0], file); + check_io(file); return; } } @@ -2018,6 +2120,7 @@ int main(int argc, char **argv) fprintf(md_result_file, "CHANGE MASTER TO MASTER_LOG_FILE='%s', \ MASTER_LOG_POS=%s ;\n",row[0],row[1]); + check_io(md_result_file); } mysql_free_result(master); } |