summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authorunknown <lars@mysql.com>2004-12-27 19:10:30 +0100
committerunknown <lars@mysql.com>2004-12-27 19:10:30 +0100
commit0ab90532cc54bfa81204ab2129de7124d8aac376 (patch)
treed873d1219b84485324f64d52f5a43de02015ae6a /client
parent47efc5f335d117cd0fbe3d1e633936ae70442933 (diff)
downloadmariadb-git-0ab90532cc54bfa81204ab2129de7124d8aac376.tar.gz
WL#2319 V2: Exclude tables from dump
- Added a hash to keep track of database-table pairs. - Specified database-table tables do not get dumped client/client_priv.h: WL#2319 V2: Exclude tables from dump client/mysqldump.c: WL#2319 V2: Exclude tables from dump mysql-test/r/mysqldump.result: WL#2319 V2: Exclude tables from dump mysql-test/t/mysqldump.test: WL#2319 V2: Exclude tables from dump
Diffstat (limited to 'client')
-rw-r--r--client/client_priv.h1
-rw-r--r--client/mysqldump.c106
2 files changed, 100 insertions, 7 deletions
diff --git a/client/client_priv.h b/client/client_priv.h
index e86a56f58c1..95f4d105156 100644
--- a/client/client_priv.h
+++ b/client/client_priv.h
@@ -49,4 +49,5 @@ enum options_client
#ifdef HAVE_NDBCLUSTER_DB
,OPT_NDBCLUSTER,OPT_NDB_CONNECTSTRING
#endif
+ ,OPT_IGNORE_TABLE
};
diff --git a/client/mysqldump.c b/client/mysqldump.c
index be2abd19822..ffdb84397e9 100644
--- a/client/mysqldump.c
+++ b/client/mysqldump.c
@@ -43,6 +43,7 @@
#include <my_sys.h>
#include <m_string.h>
#include <m_ctype.h>
+#include <hash.h>
#include "client_priv.h"
#include "mysql.h"
@@ -128,6 +129,16 @@ const char *compatible_mode_names[]=
TYPELIB compatible_mode_typelib= {array_elements(compatible_mode_names) - 1,
"", compatible_mode_names, NULL};
+#define TABLE_RULE_HASH_SIZE 16
+
+typedef struct st_table_rule_ent
+{
+ char* key; /* dbname.tablename */
+ uint key_len;
+} TABLE_RULE_ENT;
+
+my_bool ignore_table_inited;
+HASH ignore_table;
static struct my_option my_long_options[] =
{
@@ -233,6 +244,11 @@ static struct my_option my_long_options[] =
(gptr*) &opt_hex_blob, (gptr*) &opt_hex_blob, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{"host", 'h', "Connect to host.", (gptr*) &current_host,
(gptr*) &current_host, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
+ {"ignore-table", OPT_IGNORE_TABLE,
+ "Do not dump the specified table. To specify more than one table to ignore, "
+ "use the directive multiple times, once for each table. Each table must "
+ "be specified with both database and table names, e.g. --ignore-table=database.table",
+ 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"lines-terminated-by", OPT_LTB, "Lines in the i.file are terminated by ...",
(gptr*) &lines_terminated, (gptr*) &lines_terminated, 0, GET_STR,
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
@@ -502,6 +518,32 @@ static void write_footer(FILE *sql_file)
} /* write_footer */
+static void free_table_ent(TABLE_RULE_ENT* e)
+{
+ my_free((gptr) e, MYF(0));
+}
+
+
+static byte* get_table_key(TABLE_RULE_ENT* e, uint* len,
+ my_bool not_used __attribute__((unused)))
+{
+ *len= e->key_len;
+ return (byte*)e->key;
+}
+
+
+void init_table_rule_hash(HASH* h, bool* h_inited)
+{
+ if(hash_init(h, charset_info, TABLE_RULE_HASH_SIZE, 0, 0,
+ (hash_get_key) get_table_key,
+ (hash_free_key) free_table_ent, 0))
+ {
+ fprintf(stderr, "Internal hash initialization error\n");
+ exit(1);
+ }
+ *h_inited= 1;
+}
+
static my_bool
get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
@@ -573,6 +615,37 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
case (int) OPT_TABLES:
opt_databases=0;
break;
+ case (int) OPT_IGNORE_TABLE:
+ {
+ const char* dot = strchr(argument, '.');
+ if (!dot)
+ {
+ fprintf(stderr, "Illegal use of option --ignore-table=<database>.<table>\n");
+ exit(1);
+ }
+ // len is always > 0 because we know the there exists a '.'
+ uint len= (uint)strlen(argument);
+ TABLE_RULE_ENT* e= (TABLE_RULE_ENT*)my_malloc(sizeof(TABLE_RULE_ENT)
+ + len, MYF(MY_WME));
+ if (!e)
+ {
+ fprintf(stderr, "Internal memory allocation error\n");
+ exit(1);
+ }
+ e->key= (char*)e + sizeof(TABLE_RULE_ENT);
+ e->key_len= len;
+ memcpy(e->key, argument, len);
+
+ if (!ignore_table_inited)
+ init_table_rule_hash(&ignore_table, &ignore_table_inited);
+
+ if(my_hash_insert(&ignore_table, (byte*)e))
+ {
+ fprintf(stderr, "Internal hash insert error\n");
+ exit(1);
+ }
+ break;
+ }
case (int) OPT_COMPATIBLE:
{
char buff[255];
@@ -1946,6 +2019,15 @@ static int init_dumping(char *database)
} /* init_dumping */
+my_bool include_table(byte* hash_key, uint len)
+{
+ if (ignore_table_inited &&
+ hash_search(&ignore_table, (byte*) hash_key, len))
+ return FALSE;
+
+ return TRUE;
+}
+
static int dump_all_tables_in_db(char *database)
{
@@ -1953,6 +2035,12 @@ static int dump_all_tables_in_db(char *database)
uint numrows;
char table_buff[NAME_LEN*2+3];
+ char hash_key[2*NAME_LEN+2]; /* "db.tablename" */
+ char *afterdot;
+
+ afterdot= strmov(hash_key, database);
+ *afterdot++= '.';
+
if (init_dumping(database))
return 1;
if (opt_xml)
@@ -1961,7 +2049,7 @@ static int dump_all_tables_in_db(char *database)
{
DYNAMIC_STRING query;
init_dynamic_string(&query, "LOCK TABLES ", 256, 1024);
- for (numrows=0 ; (table = getTableName(1)) ; numrows++)
+ for (numrows= 0 ; (table= getTableName(1)) ; numrows++)
{
dynstr_append(&query, quote_name(table, table_buff, 1));
dynstr_append(&query, " READ /*!32311 LOCAL */,");
@@ -1977,13 +2065,17 @@ static int dump_all_tables_in_db(char *database)
DBerror(sock, "when doing refresh");
/* We shall continue here, if --force was given */
}
- while ((table = getTableName(0)))
+ while ((table= getTableName(0)))
{
- numrows = getTableStructure(table, database);
- if (!dFlag && numrows > 0)
- dumpTable(numrows,table);
- my_free(order_by, MYF(MY_ALLOW_ZERO_PTR));
- order_by= 0;
+ char *end= strmov(afterdot, table);
+ if (include_table(hash_key, end - hash_key))
+ {
+ numrows = getTableStructure(table, database);
+ if (!dFlag && numrows > 0)
+ dumpTable(numrows,table);
+ my_free(order_by, MYF(MY_ALLOW_ZERO_PTR));
+ order_by= 0;
+ }
}
if (opt_xml)
{