300
310
std::cerr << _("-- Retrieving foreign keys for ") << tableName << "..." << std::endl;
302
query= "select rc.constraint_name, rc.referenced_table_name, group_concat(distinct concat('`',kc.column_name,'`')), rc.update_rule, rc.delete_rule, rc.match_option, group_concat(distinct concat('`',kt.column_name,'`')) from information_schema.referential_constraints rc join information_schema.key_column_usage kt on (rc.constraint_schema = kt.constraint_schema and rc.constraint_name = kt.constraint_name) join information_schema.key_column_usage kc on (rc.constraint_schema = kc.constraint_schema and rc.referenced_table_name = kc.table_name and rc.unique_constraint_name = kc.constraint_name) where rc.constraint_schema='";
303
query.append(database->databaseName);
304
query.append("' and rc.table_name='");
305
query.append(tableName);
306
query.append("' group by rc.constraint_name");
312
query= "SHOW TABLES FROM INFORMATION_SCHEMA LIKE 'REFERENTIAL_CONSTRAINTS'";
308
314
result= dcon->query(query);
310
316
if (result == NULL)
313
while ((row= drizzle_row_next(result)))
315
fkey= new DrizzleDumpForeignKey(row[0], dcon);
316
fkey->parentColumns= row[6];
317
fkey->childTable= row[1];
318
fkey->childColumns= row[2];
319
fkey->updateRule= (strcmp(row[3], "RESTRICT") != 0) ? row[3] : "";
320
fkey->deleteRule= (strcmp(row[4], "RESTRICT") != 0) ? row[4] : "";
321
fkey->matchOption= (strcmp(row[5], "NONE") != 0) ? row[5] : "";
323
fkeys.push_back(fkey);
319
uint64_t search_count = drizzle_result_row_count(result);
321
dcon->freeResult(result);
323
/* MySQL 5.0 will be 0 and MySQL 5.1 will be 1 */
324
if (search_count > 0)
326
query= "select rc.constraint_name, rc.referenced_table_name, group_concat(distinct concat('`',kc.column_name,'`')), rc.update_rule, rc.delete_rule, rc.match_option, group_concat(distinct concat('`',kt.column_name,'`')) from information_schema.referential_constraints rc join information_schema.key_column_usage kt on (rc.constraint_schema = kt.constraint_schema and rc.constraint_name = kt.constraint_name) join information_schema.key_column_usage kc on (rc.constraint_schema = kc.constraint_schema and rc.referenced_table_name = kc.table_name and rc.unique_constraint_name = kc.constraint_name) where rc.constraint_schema='";
327
query.append(database->databaseName);
328
query.append("' and rc.table_name='");
329
query.append(tableName);
330
query.append("' group by rc.constraint_name");
332
result= dcon->query(query);
337
while ((row= drizzle_row_next(result)))
339
fkey= new DrizzleDumpForeignKey(row[0], dcon);
340
fkey->parentColumns= row[6];
341
fkey->childTable= row[1];
342
fkey->childColumns= row[2];
343
fkey->updateRule= (strcmp(row[3], "RESTRICT") != 0) ? row[3] : "";
344
fkey->deleteRule= (strcmp(row[4], "RESTRICT") != 0) ? row[4] : "";
345
fkey->matchOption= (strcmp(row[5], "NONE") != 0) ? row[5] : "";
347
fkeys.push_back(fkey);
352
query= "SHOW CREATE TABLE `";
353
query.append(database->databaseName);
355
query.append(tableName);
357
result= dcon->query(query);
362
if ((row= drizzle_row_next(result)))
364
boost::match_flag_type flags = boost::match_default;
365
boost::regex constraint_regex("CONSTRAINT `(.*)` FOREIGN KEY \\((.*)\\) REFERENCES `(.*)` \\((.*)\\)( ON (UPDATE|DELETE) (CASCADE|RESTRICT|SET NULL))?( ON (UPDATE|DELETE) (CASCADE|RESTRICT|SET NULL))?");
367
boost::match_results<std::string::const_iterator> constraint_results;
369
std::string search_body(row[1]);
370
std::string::const_iterator start, end;
371
start= search_body.begin();
372
end= search_body.end();
373
while (regex_search(start, end, constraint_results, constraint_regex, flags))
375
fkey= new DrizzleDumpForeignKey(constraint_results[1], dcon);
376
fkey->parentColumns= constraint_results[2];
377
fkey->childTable= constraint_results[3];
378
fkey->childColumns= constraint_results[4];
380
if (constraint_results[5].compare("") != 0)
382
if (constraint_results[6].compare("UPDATE") == 0)
383
fkey->updateRule= constraint_results[7];
384
else if (constraint_results[6].compare("DELETE") == 0)
385
fkey->deleteRule= constraint_results[7];
387
if (constraint_results[8].compare("") != 0)
389
if (constraint_results[9].compare("UPDATE") == 0)
390
fkey->updateRule= constraint_results[10];
391
else if (constraint_results[9].compare("DELETE") == 0)
392
fkey->deleteRule= constraint_results[10];
394
fkey->matchOption= "";
396
fkeys.push_back(fkey);
398
start= constraint_results[0].second;
399
flags |= boost::match_prev_avail;
400
flags |= boost::match_not_bob;
325
404
dcon->freeResult(result);