~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to client/drizzledump_drizzle.cc

  • Committer: lbieber
  • Date: 2010-10-01 13:06:31 UTC
  • mfrom: (1802.2.2 drizzle-bug-651948)
  • mto: This revision was merged to the branch mainline in revision 1805.
  • Revision ID: lbieber@orisndriz08-20101001130631-xubscnhmj7r5dn6g
Merge Andrew - Fix bug 651948 - Index lengths not retrieved using drizzledump

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
#include <drizzled/gettext.h>
26
26
#include <boost/lexical_cast.hpp>
27
27
 
28
 
extern bool verbose;
29
 
extern bool ignore_errors;
 
28
extern bool  verbose;
30
29
 
31
30
bool DrizzleDumpDatabaseDrizzle::populateTables()
32
31
{
40
39
  if (verbose)
41
40
    std::cerr << _("-- Retrieving table structures for ") << databaseName << "..." << std::endl;
42
41
 
43
 
  query="SELECT TABLE_NAME, TABLE_COLLATION, ENGINE, AUTO_INCREMENT, TABLE_COMMENT FROM DATA_DICTIONARY.TABLES WHERE TABLE_SCHEMA='";
 
42
  query="SELECT TABLE_NAME, TABLE_COLLATION, ENGINE FROM DATA_DICTIONARY.TABLES WHERE TABLE_SCHEMA='";
44
43
  query.append(databaseName);
45
44
  query.append("' ORDER BY TABLE_NAME");
46
45
 
51
50
 
52
51
  while ((row= drizzle_row_next(result)))
53
52
  {
54
 
    size_t* row_sizes= drizzle_row_field_sizes(result);
55
53
    std::string tableName(row[0]);
56
54
    std::string displayName(tableName);
57
55
    cleanTableName(displayName);
62
60
    table->displayName= displayName;
63
61
    table->collate= row[1];
64
62
    table->engineName= row[2];
65
 
    table->autoIncrement= boost::lexical_cast<uint64_t>(row[3]);
66
 
    if (row[4])
67
 
      table->comment= DrizzleDumpData::escape(row[4], row_sizes[4]);
68
 
    else
69
 
      table->comment= "";
 
63
    table->autoIncrement= 0;
70
64
    table->database= this;
71
 
    if ((not table->populateFields()) or (not table->populateIndexes()) or
72
 
      (not table->populateFkeys()))
 
65
    if ((not table->populateFields()) or (not table->populateIndexes()))
73
66
    {
74
67
      delete table;
75
 
      if (not ignore_errors)
76
 
        return false;
77
 
      else
78
 
        continue;
 
68
      return false;
79
69
    }
80
70
    tables.push_back(table);
81
71
  }
131
121
        std::cerr  << "Error: Could not get fields and/ot indexes for table " << displayName << std::endl;
132
122
        delete table;
133
123
        dcon->freeResult(result);
134
 
        if (not ignore_errors)
135
 
          return false;
136
 
        else
137
 
          continue;
 
124
        return false;
138
125
      }
139
126
      tables.push_back(table);
140
127
      dcon->freeResult(result);
143
130
    {
144
131
      std::cerr << "Error: Table " << displayName << " not found." << std::endl;
145
132
      dcon->freeResult(result);
146
 
      if (not ignore_errors)
147
 
        return false;
148
 
      else
149
 
        continue;
 
133
      return false;
150
134
    }
151
135
  }
152
136
 
171
155
  if (verbose)
172
156
    std::cerr << _("-- Retrieving fields for ") << tableName << "..." << std::endl;
173
157
 
174
 
  query= "SELECT COLUMN_NAME, DATA_TYPE, COLUMN_DEFAULT, COLUMN_DEFAULT_IS_NULL, IS_NULLABLE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, COLLATION_NAME, IS_AUTO_INCREMENT, ENUM_VALUES, COLUMN_COMMENT FROM DATA_DICTIONARY.COLUMNS WHERE TABLE_SCHEMA='";
 
158
  query= "SELECT COLUMN_NAME, DATA_TYPE, COLUMN_DEFAULT, COLUMN_DEFAULT_IS_NULL, IS_NULLABLE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, COLLATION_NAME, IS_AUTO_INCREMENT, ENUM_VALUES FROM DATA_DICTIONARY.COLUMNS WHERE TABLE_SCHEMA='";
175
159
  query.append(database->databaseName);
176
160
  query.append("' AND TABLE_NAME='");
177
161
  query.append(tableName);
202
186
    field->length= (row[5]) ? boost::lexical_cast<uint32_t>(row[5]) : 0;
203
187
    field->decimalPrecision= (row[6]) ? boost::lexical_cast<uint32_t>(row[6]) : 0;
204
188
    field->decimalScale= (row[7]) ? boost::lexical_cast<uint32_t>(row[7]) : 0;
205
 
    field->comment= (row[11]) ? row[11] : "";
 
189
 
206
190
 
207
191
    fields.push_back(field);
208
192
  }
224
208
  if (verbose)
225
209
    std::cerr << _("-- Retrieving indexes for ") << tableName << "..." << std::endl;
226
210
 
227
 
  query= "SELECT INDEX_NAME, COLUMN_NAME, IS_USED_IN_PRIMARY, IS_UNIQUE, COMPARE_LENGTH FROM DATA_DICTIONARY.INDEX_PARTS WHERE TABLE_SCHEMA='";
228
 
  query.append(database->databaseName);
229
 
  query.append("' AND TABLE_NAME='");
 
211
  query= "SELECT INDEX_NAME, COLUMN_NAME, IS_USED_IN_PRIMARY, IS_UNIQUE, COMPARE_LENGTH FROM DATA_DICTIONARY.INDEX_PARTS WHERE TABLE_NAME='";
230
212
  query.append(tableName);
231
213
  query.append("'");
232
214
 
259
241
  return true;
260
242
}
261
243
 
262
 
bool DrizzleDumpTableDrizzle::populateFkeys()
263
 
{
264
 
  drizzle_result_st *result;
265
 
  drizzle_row_t row;
266
 
  std::string query;
267
 
  DrizzleDumpForeignKey *fkey;
268
 
 
269
 
  if (verbose)
270
 
    std::cerr << _("-- Retrieving foreign keys for ") << tableName << "..." << std::endl;
271
 
 
272
 
  query= "SELECT CONSTRAINT_NAME, CONSTRAINT_COLUMNS, REFERENCED_TABLE_NAME, REFERENCED_TABLE_COLUMNS, MATCH_OPTION, DELETE_RULE, UPDATE_RULE FROM DATA_DICTIONARY.FOREIGN_KEYS WHERE CONSTRAINT_SCHEMA='";
273
 
  query.append(database->databaseName);
274
 
  query.append("' AND CONSTRAINT_TABLE='");
275
 
  query.append(tableName);
276
 
  query.append("'");
277
 
 
278
 
  result= dcon->query(query);
279
 
 
280
 
  if (result == NULL)
281
 
    return false;
282
 
 
283
 
  while ((row= drizzle_row_next(result)))
284
 
  {
285
 
    fkey= new DrizzleDumpForeignKey(row[0], dcon);
286
 
    fkey->parentColumns= row[1];
287
 
    fkey->childTable= row[2];
288
 
    fkey->childColumns= row[3];
289
 
    fkey->matchOption= (strcmp(row[4], "NONE") != 0) ? row[4] : "";
290
 
    fkey->deleteRule= (strcmp(row[5], "UNDEFINED") != 0) ? row[5] : "";
291
 
    fkey->updateRule= (strcmp(row[6], "UNDEFINED") != 0) ? row[6] : "";
292
 
 
293
 
    fkeys.push_back(fkey);
294
 
  }
295
 
  dcon->freeResult(result);
296
 
  return true;
297
 
}
298
 
 
299
244
DrizzleDumpData* DrizzleDumpTableDrizzle::getData(void)
300
245
{
301
246
  try
351
296
  result= dcon->query(query);
352
297
 
353
298
  if (result == NULL)
354
 
    throw std::exception();
 
299
    throw 1;
355
300
}
356
301
 
357
302
DrizzleDumpDataDrizzle::~DrizzleDumpDataDrizzle()