203
field->defaultValue= "";
202
field->defaultValue= "";
206
204
field->isAutoIncrement= (strcmp(row[8], "auto_increment") == 0) ? true : false;
207
205
field->defaultIsNull= field->isNull;
209
/* Seriously MySQL, why is BIT length in NUMERIC_PRECISION? */
210
if ((strncmp(row[1], "bit", 3) == 0) and (row[5] != NULL))
211
field->length= ((boost::lexical_cast<uint32_t>(row[5]) - 1) / 8) + 1;
206
field->length= (row[4]) ? boost::lexical_cast<uint32_t>(row[4]) : 0;
207
if ((row[5] != NULL) and (row[6] != NULL))
209
field->decimalPrecision= boost::lexical_cast<uint32_t>(row[5]);
210
field->decimalScale= boost::lexical_cast<uint32_t>(row[6]);
213
field->length= (row[4]) ? boost::lexical_cast<uint32_t>(row[4]) : 0;
215
/* Also, CHAR(0) is valid?? */
216
if (((field->type.compare("VARBINARY") == 0)
217
or (field->type.compare("VARCHAR") == 0))
218
and (field->length == 0))
214
field->decimalPrecision= 0;
215
field->decimalScale= 0;
223
field->decimalPrecision= (row[5]) ? boost::lexical_cast<uint32_t>(row[5]) : 0;
224
field->decimalScale= (row[6]) ? boost::lexical_cast<uint32_t>(row[6]) : 0;
225
field->comment= (row[9]) ? row[9] : "";
226
218
fields.push_back(field);
315
307
std::cerr << _("-- Retrieving foreign keys for ") << tableName << "..." << std::endl;
317
query= "SHOW CREATE TABLE `";
318
query.append(database->databaseName);
320
query.append(tableName);
309
query= "SHOW TABLES FROM INFORMATION_SCHEMA LIKE 'REFERENTIAL_CONSTRAINTS'";
322
311
result= dcon->query(query);
324
313
if (result == NULL)
327
if ((row= drizzle_row_next(result)))
329
boost::match_flag_type flags = boost::match_default;
330
boost::regex constraint_regex("CONSTRAINT `(.*?)` FOREIGN KEY \\((.*?)\\) REFERENCES `(.*?)` \\((.*?)\\)( ON (UPDATE|DELETE) (CASCADE|RESTRICT|SET NULL))?( ON (UPDATE|DELETE) (CASCADE|RESTRICT|SET NULL))?");
332
boost::match_results<std::string::const_iterator> constraint_results;
334
std::string search_body(row[1]);
335
std::string::const_iterator start, end;
336
start= search_body.begin();
337
end= search_body.end();
338
while (regex_search(start, end, constraint_results, constraint_regex, flags))
340
fkey= new DrizzleDumpForeignKey(constraint_results[1], dcon);
341
fkey->parentColumns= constraint_results[2];
342
fkey->childTable= constraint_results[3];
343
fkey->childColumns= constraint_results[4];
316
uint64_t search_count = drizzle_result_row_count(result);
318
dcon->freeResult(result);
320
/* MySQL 5.0 will be 0 and MySQL 5.1 will be 1 */
321
if (search_count > 0)
323
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='";
324
query.append(database->databaseName);
325
query.append("' and rc.table_name='");
326
query.append(tableName);
327
query.append("' group by rc.constraint_name");
329
result= dcon->query(query);
334
while ((row= drizzle_row_next(result)))
336
fkey= new DrizzleDumpForeignKey(row[0], dcon);
337
fkey->parentColumns= row[6];
338
fkey->childTable= row[1];
339
fkey->childColumns= row[2];
340
fkey->updateRule= (strcmp(row[3], "RESTRICT") != 0) ? row[3] : "";
341
fkey->deleteRule= (strcmp(row[4], "RESTRICT") != 0) ? row[4] : "";
342
fkey->matchOption= (strcmp(row[5], "NONE") != 0) ? row[5] : "";
344
fkeys.push_back(fkey);
349
query= "SHOW CREATE TABLE `";
350
query.append(database->databaseName);
352
query.append(tableName);
354
result= dcon->query(query);
359
if ((row= drizzle_row_next(result)))
361
boost::match_flag_type flags = boost::match_default;
362
boost::regex constraint_regex("CONSTRAINT `(.*)` FOREIGN KEY \\((.*)\\) REFERENCES `(.*)` \\((.*)\\)( ON (UPDATE|DELETE) (CASCADE|RESTRICT|SET NULL))?( ON (UPDATE|DELETE) (CASCADE|RESTRICT|SET NULL))?");
364
boost::match_results<std::string::const_iterator> constraint_results;
366
std::string search_body(row[1]);
367
std::string::const_iterator start, end;
368
start= search_body.begin();
369
end= search_body.end();
370
while (regex_search(start, end, constraint_results, constraint_regex, flags))
372
fkey= new DrizzleDumpForeignKey(constraint_results[1], dcon);
373
fkey->parentColumns= constraint_results[2];
374
fkey->childTable= constraint_results[3];
375
fkey->childColumns= constraint_results[4];
345
if (constraint_results[5].compare("") != 0)
347
if (constraint_results[6].compare("UPDATE") == 0)
348
fkey->updateRule= constraint_results[7];
349
else if (constraint_results[6].compare("DELETE") == 0)
350
fkey->deleteRule= constraint_results[7];
352
if (constraint_results[8].compare("") != 0)
354
if (constraint_results[9].compare("UPDATE") == 0)
355
fkey->updateRule= constraint_results[10];
356
else if (constraint_results[9].compare("DELETE") == 0)
357
fkey->deleteRule= constraint_results[10];
359
fkey->matchOption= "";
361
fkeys.push_back(fkey);
363
start= constraint_results[0].second;
364
flags |= boost::match_prev_avail;
365
flags |= boost::match_not_bob;
377
if (constraint_results[5].compare("") != 0)
379
if (constraint_results[6].compare("UPDATE") == 0)
380
fkey->updateRule= constraint_results[7];
381
else if (constraint_results[6].compare("DELETE") == 0)
382
fkey->deleteRule= constraint_results[7];
384
if (constraint_results[8].compare("") != 0)
386
if (constraint_results[9].compare("UPDATE") == 0)
387
fkey->updateRule= constraint_results[10];
388
else if (constraint_results[9].compare("DELETE") == 0)
389
fkey->deleteRule= constraint_results[10];
391
fkey->matchOption= "";
393
fkeys.push_back(fkey);
395
start= constraint_results[0].second;
396
flags |= boost::match_prev_avail;
397
flags |= boost::match_not_bob;
368
401
dcon->freeResult(result);