12
12
You should have received a copy of the GNU General Public License
13
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
16
#include <drizzled/server_includes.h>
17
17
#include <drizzled/error.h>
18
18
#include <drizzled/session.h>
19
19
#include <drizzled/unireg.h>
20
#include "drizzled/sql_table.h"
21
#include "drizzled/global_charset_info.h"
22
#include "drizzled/message/statement_transform.h"
24
#include <drizzled/plugin/storage_engine.h>
26
#include "drizzled/internal/my_sys.h"
33
24
#include <drizzled/message/schema.pb.h>
34
25
#include <drizzled/message/table.pb.h>
35
26
#include <google/protobuf/io/zero_copy_stream.h>
36
27
#include <google/protobuf/io/zero_copy_stream_impl.h>
37
#include <google/protobuf/message.h>
39
29
#include <drizzled/table_proto.h>
40
#include <drizzled/charset.h>
42
#include "drizzled/function/time/typecast.h"
44
30
using namespace std;
48
bool fill_table_proto(message::Table &table_proto,
49
List<CreateField> &create_fields,
50
HA_CREATE_INFO *create_info,
32
int fill_table_proto(drizzled::message::Table *table_proto,
33
const char *table_name,
34
List<CreateField> &create_fields,
35
HA_CREATE_INFO *create_info,
54
39
CreateField *field_arg;
55
40
List_iterator<CreateField> it(create_fields);
56
message::Table::TableOptions *table_options= table_proto.mutable_options();
41
drizzled::message::Table::TableOptions *table_options= table_proto->mutable_options();
58
43
if (create_fields.elements > MAX_FIELDS)
60
45
my_error(ER_TOO_MANY_FIELDS, MYF(0), ER(ER_TOO_MANY_FIELDS));
64
assert(strcmp(table_proto.engine().name().c_str(),
49
assert(strcmp(table_proto->engine().name().c_str(),
65
50
create_info->db_type->getName().c_str())==0);
68
bool use_existing_fields= table_proto.field_size() > 0;
52
assert(strcmp(table_proto->name().c_str(),table_name)==0);
69
54
while ((field_arg= it++))
71
message::Table::Field *attribute;
73
/* some (one) code path for CREATE TABLE fills the proto
74
out more than the others, so we already have partially
75
filled out Field messages */
77
if (use_existing_fields)
79
attribute= table_proto.mutable_field(field_number++);
83
/* Other code paths still have to fill out the proto */
84
attribute= table_proto.add_field();
86
if (field_arg->flags & NOT_NULL_FLAG)
88
attribute->mutable_constraints()->set_is_notnull(true);
91
if (field_arg->flags & UNSIGNED_FLAG and
92
(field_arg->sql_type == DRIZZLE_TYPE_LONGLONG or field_arg->sql_type == DRIZZLE_TYPE_LONG))
94
field_arg->sql_type= DRIZZLE_TYPE_LONGLONG;
95
attribute->mutable_constraints()->set_is_unsigned(true);
98
attribute->set_name(field_arg->field_name);
101
assert(((field_arg->flags & NOT_NULL_FLAG)) == attribute->constraints().is_notnull());
102
assert(strcmp(attribute->name().c_str(), field_arg->field_name)==0);
105
message::Table::Field::FieldType parser_type= attribute->type();
107
if (field_arg->sql_type == DRIZZLE_TYPE_NULL)
109
my_error(ER_CANT_CREATE_TABLE, MYF(ME_BELL+ME_WAITTANG), table_proto.name().c_str(), -1);
113
if (field_arg->flags & UNSIGNED_FLAG and
114
(field_arg->sql_type == DRIZZLE_TYPE_LONGLONG or field_arg->sql_type == DRIZZLE_TYPE_LONG))
116
message::Table::Field::FieldConstraints *constraints= attribute->mutable_constraints();
118
field_arg->sql_type= DRIZZLE_TYPE_LONGLONG;
119
constraints->set_is_unsigned(true);
122
attribute->set_type(message::internalFieldTypeToFieldProtoType(field_arg->sql_type));
124
switch (attribute->type()) {
125
case message::Table::Field::BIGINT:
126
case message::Table::Field::INTEGER:
127
case message::Table::Field::DATE:
128
case message::Table::Field::DATETIME:
129
case message::Table::Field::UUID:
130
case message::Table::Field::TIME:
131
case message::Table::Field::BOOLEAN:
133
case message::Table::Field::DOUBLE:
136
* For DOUBLE, we only add a specific scale and precision iff
137
* the fixed decimal point has been specified...
139
if (field_arg->decimals != NOT_FIXED_DEC)
141
message::Table::Field::NumericFieldOptions *numeric_field_options;
143
numeric_field_options= attribute->mutable_numeric_options();
145
numeric_field_options->set_precision(field_arg->length);
146
numeric_field_options->set_scale(field_arg->decimals);
150
case message::Table::Field::VARCHAR:
152
message::Table::Field::StringFieldOptions *string_field_options;
56
drizzled::message::Table::Field *attribute;
58
attribute= table_proto->add_field();
59
attribute->set_name(field_arg->field_name);
61
attribute->set_pack_flag(field_arg->pack_flag); /* TODO: MUST DIE */
63
if(f_maybe_null(field_arg->pack_flag))
65
drizzled::message::Table::Field::FieldConstraints *constraints;
67
constraints= attribute->mutable_constraints();
68
constraints->set_is_nullable(true);
71
switch (field_arg->sql_type) {
72
case DRIZZLE_TYPE_TINY:
73
attribute->set_type(drizzled::message::Table::Field::TINYINT);
75
case DRIZZLE_TYPE_LONG:
76
attribute->set_type(drizzled::message::Table::Field::INTEGER);
78
case DRIZZLE_TYPE_DOUBLE:
79
attribute->set_type(drizzled::message::Table::Field::DOUBLE);
81
case DRIZZLE_TYPE_NULL :
82
assert(1); /* Not a user definable type */
83
case DRIZZLE_TYPE_TIMESTAMP:
84
attribute->set_type(drizzled::message::Table::Field::TIMESTAMP);
86
case DRIZZLE_TYPE_LONGLONG:
87
attribute->set_type(drizzled::message::Table::Field::BIGINT);
89
case DRIZZLE_TYPE_DATETIME:
90
attribute->set_type(drizzled::message::Table::Field::DATETIME);
92
case DRIZZLE_TYPE_DATE:
93
attribute->set_type(drizzled::message::Table::Field::DATE);
95
case DRIZZLE_TYPE_VARCHAR:
97
drizzled::message::Table::Field::StringFieldOptions *string_field_options;
154
99
string_field_options= attribute->mutable_string_options();
156
if (! use_existing_fields || string_field_options->length()==0)
157
string_field_options->set_length(field_arg->length
158
/ field_arg->charset->mbmaxlen);
160
assert((uint32_t)string_field_options->length() == (uint32_t)(field_arg->length / field_arg->charset->mbmaxlen));
162
if (! string_field_options->has_collation())
164
string_field_options->set_collation_id(field_arg->charset->number);
165
string_field_options->set_collation(field_arg->charset->name);
100
attribute->set_type(drizzled::message::Table::Field::VARCHAR);
101
string_field_options->set_length(field_arg->length
102
/ field_arg->charset->mbmaxlen);
103
string_field_options->set_collation_id(field_arg->charset->number);
104
string_field_options->set_collation(field_arg->charset->name);
169
case message::Table::Field::DECIMAL:
108
case DRIZZLE_TYPE_NEWDECIMAL:
171
message::Table::Field::NumericFieldOptions *numeric_field_options;
110
drizzled::message::Table::Field::NumericFieldOptions *numeric_field_options;
112
attribute->set_type(drizzled::message::Table::Field::DECIMAL);
173
113
numeric_field_options= attribute->mutable_numeric_options();
174
114
/* This is magic, I hate magic numbers -Brian */
175
115
numeric_field_options->set_precision(field_arg->length + ( field_arg->decimals ? -2 : -1));
176
116
numeric_field_options->set_scale(field_arg->decimals);
179
case message::Table::Field::ENUM:
119
case DRIZZLE_TYPE_ENUM:
181
message::Table::Field::EnumerationValues *enumeration_options;
121
drizzled::message::Table::Field::SetFieldOptions *set_field_options;
183
123
assert(field_arg->interval);
185
enumeration_options= attribute->mutable_enumeration_values();
125
attribute->set_type(drizzled::message::Table::Field::ENUM);
126
set_field_options= attribute->mutable_set_options();
187
128
for (uint32_t pos= 0; pos < field_arg->interval->count; pos++)
189
130
const char *src= field_arg->interval->type_names[pos];
191
enumeration_options->add_field_value(src);
132
set_field_options->add_field_value(src);
193
enumeration_options->set_collation_id(field_arg->charset->number);
194
enumeration_options->set_collation(field_arg->charset->name);
134
set_field_options->set_count_elements(set_field_options->field_value_size());
135
set_field_options->set_collation_id(field_arg->charset->number);
136
set_field_options->set_collation(field_arg->charset->name);
198
case message::Table::Field::BLOB:
139
case DRIZZLE_TYPE_BLOB:
200
message::Table::Field::StringFieldOptions *string_field_options;
141
attribute->set_type(drizzled::message::Table::Field::BLOB);
143
drizzled::message::Table::Field::StringFieldOptions *string_field_options;
202
145
string_field_options= attribute->mutable_string_options();
203
146
string_field_options->set_collation_id(field_arg->charset->number);
236
188
my_error(ER_WRONG_STRING_LENGTH, MYF(0),
237
189
field_arg->comment.str,"COLUMN COMMENT",
238
190
(uint32_t) COLUMN_COMMENT_MAXLEN);
242
if (! use_existing_fields)
243
attribute->set_comment(field_arg->comment.str);
245
assert(strcmp(attribute->comment().c_str(), field_arg->comment.str)==0);
194
attribute->set_comment(field_arg->comment.str);
248
if (field_arg->unireg_check == Field::NEXT_NUMBER)
197
if(field_arg->unireg_check == Field::NEXT_NUMBER)
250
message::Table::Field::NumericFieldOptions *field_options;
199
drizzled::message::Table::Field::NumericFieldOptions *field_options;
251
200
field_options= attribute->mutable_numeric_options();
252
201
field_options->set_is_autoincrement(true);
255
if (field_arg->unireg_check == Field::TIMESTAMP_DN_FIELD
256
|| field_arg->unireg_check == Field::TIMESTAMP_DNUN_FIELD)
258
message::Table::Field::FieldOptions *field_options;
259
field_options= attribute->mutable_options();
260
field_options->set_default_expression("CURRENT_TIMESTAMP");
263
if (field_arg->unireg_check == Field::TIMESTAMP_UN_FIELD
264
|| field_arg->unireg_check == Field::TIMESTAMP_DNUN_FIELD)
266
message::Table::Field::FieldOptions *field_options;
267
field_options= attribute->mutable_options();
268
field_options->set_update_expression("CURRENT_TIMESTAMP");
271
if (field_arg->def == NULL && not attribute->constraints().is_notnull())
273
message::Table::Field::FieldOptions *field_options;
274
field_options= attribute->mutable_options();
276
field_options->set_default_null(true);
280
message::Table::Field::FieldOptions *field_options;
281
field_options= attribute->mutable_options();
283
if (field_arg->def->is_null())
204
if(field_arg->unireg_check == Field::TIMESTAMP_DN_FIELD
205
|| field_arg->unireg_check == Field::TIMESTAMP_DNUN_FIELD)
207
drizzled::message::Table::Field::FieldOptions *field_options;
208
field_options= attribute->mutable_options();
209
field_options->set_default_value("NOW()");
212
if(field_arg->unireg_check == Field::TIMESTAMP_UN_FIELD
213
|| field_arg->unireg_check == Field::TIMESTAMP_DNUN_FIELD)
215
drizzled::message::Table::Field::FieldOptions *field_options;
216
field_options= attribute->mutable_options();
217
field_options->set_update_value("NOW()");
222
drizzled::message::Table::Field::FieldOptions *field_options;
223
field_options= attribute->mutable_options();
225
if(field_arg->def->is_null())
285
227
field_options->set_default_null(true);
292
234
assert(default_value);
294
if ((field_arg->sql_type==DRIZZLE_TYPE_VARCHAR
236
if((field_arg->sql_type==DRIZZLE_TYPE_VARCHAR
295
237
|| field_arg->sql_type==DRIZZLE_TYPE_BLOB)
296
238
&& ((field_arg->length / field_arg->charset->mbmaxlen)
297
239
< default_value->length()))
299
241
my_error(ER_INVALID_DEFAULT, MYF(0), field_arg->field_name);
303
if (field_arg->sql_type == DRIZZLE_TYPE_DATE
304
|| field_arg->sql_type == DRIZZLE_TYPE_TIME
305
|| field_arg->sql_type == DRIZZLE_TYPE_DATETIME
306
|| field_arg->sql_type == DRIZZLE_TYPE_MICROTIME
307
|| field_arg->sql_type == DRIZZLE_TYPE_TIMESTAMP)
311
if (field_arg->def->get_date(ltime, TIME_FUZZY_DATE))
313
my_error(ER_INVALID_DATETIME_VALUE, MYF(ME_FATALERROR),
314
default_value->c_str());
318
/* We now do the casting down to the appropriate type.
320
Yes, this implicit casting is balls.
321
It was previously done on reading the proto back in,
322
but we really shouldn't store the bogus things in the proto,
323
and instead do the casting behaviour here.
325
the timestamp errors are taken care of elsewhere.
328
if (field_arg->sql_type == DRIZZLE_TYPE_DATETIME)
330
Item *typecast= new Item_datetime_typecast(field_arg->def);
331
typecast->quick_fix_field();
332
typecast->val_str(default_value);
334
else if (field_arg->sql_type == DRIZZLE_TYPE_DATE)
336
Item *typecast= new Item_date_typecast(field_arg->def);
337
typecast->quick_fix_field();
338
typecast->val_str(default_value);
342
if ((field_arg->sql_type==DRIZZLE_TYPE_VARCHAR
245
if((field_arg->sql_type==DRIZZLE_TYPE_VARCHAR
343
246
&& field_arg->charset==&my_charset_bin)
344
247
|| (field_arg->sql_type==DRIZZLE_TYPE_BLOB
345
248
&& field_arg->charset==&my_charset_bin))
367
assert(! use_existing_fields || (field_number == table_proto.field_size()));
369
if (create_info->table_options & HA_OPTION_PACK_RECORD)
370
table_options->set_pack_record(true);
372
if (table_options->has_comment() && table_options->comment().length() == 0)
373
table_options->clear_comment();
375
if (table_options->has_comment())
277
if (create_info->used_fields & HA_CREATE_USED_PACK_KEYS)
279
if(create_info->table_options & HA_OPTION_PACK_KEYS)
280
table_options->set_pack_keys(true);
281
else if(create_info->table_options & HA_OPTION_NO_PACK_KEYS)
282
table_options->set_pack_keys(false);
285
if(create_info->table_options & HA_OPTION_PACK_KEYS)
286
table_options->set_pack_keys(true);
289
if (create_info->used_fields & HA_CREATE_USED_CHECKSUM)
291
assert(create_info->table_options & (HA_OPTION_CHECKSUM | HA_OPTION_NO_CHECKSUM));
293
if(create_info->table_options & HA_OPTION_CHECKSUM)
294
table_options->set_checksum(true);
296
table_options->set_checksum(false);
298
else if(create_info->table_options & HA_OPTION_CHECKSUM)
299
table_options->set_checksum(true);
302
if (create_info->used_fields & HA_CREATE_USED_PAGE_CHECKSUM)
304
if (create_info->page_checksum == HA_CHOICE_YES)
305
table_options->set_page_checksum(true);
306
else if (create_info->page_checksum == HA_CHOICE_NO)
307
table_options->set_page_checksum(false);
309
else if (create_info->page_checksum == HA_CHOICE_YES)
310
table_options->set_page_checksum(true);
313
if (create_info->used_fields & HA_CREATE_USED_DELAY_KEY_WRITE)
315
if(create_info->table_options & HA_OPTION_DELAY_KEY_WRITE)
316
table_options->set_delay_key_write(true);
317
else if(create_info->table_options & HA_OPTION_NO_DELAY_KEY_WRITE)
318
table_options->set_delay_key_write(false);
320
else if(create_info->table_options & HA_OPTION_DELAY_KEY_WRITE)
321
table_options->set_delay_key_write(true);
324
switch(create_info->row_type)
326
case ROW_TYPE_DEFAULT:
327
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_DEFAULT);
330
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_FIXED);
332
case ROW_TYPE_DYNAMIC:
333
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_DYNAMIC);
335
case ROW_TYPE_COMPRESSED:
336
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_COMPRESSED);
338
case ROW_TYPE_REDUNDANT:
339
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_REDUNDANT);
341
case ROW_TYPE_COMPACT:
342
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_COMPACT);
345
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_PAGE);
351
table_options->set_pack_record(create_info->table_options
352
& HA_OPTION_PACK_RECORD);
354
if (create_info->comment.length)
377
356
uint32_t tmp_len;
378
357
tmp_len= system_charset_info->cset->charpos(system_charset_info,
379
table_options->comment().c_str(),
380
table_options->comment().c_str() +
381
table_options->comment().length(),
382
TABLE_COMMENT_MAXLEN);
358
create_info->comment.str,
359
create_info->comment.str +
360
create_info->comment.length,
361
TABLE_COMMENT_MAXLEN);
384
if (tmp_len < table_options->comment().length())
363
if (tmp_len < create_info->comment.length)
386
365
my_error(ER_WRONG_STRING_LENGTH, MYF(0),
387
table_options->comment().c_str(),"Table COMMENT",
388
(uint32_t) TABLE_COMMENT_MAXLEN);
366
create_info->comment.str,"Table COMMENT",
367
(uint32_t) TABLE_COMMENT_MAXLEN);
371
table_options->set_comment(create_info->comment.str);
393
373
if (create_info->default_table_charset)
395
table_options->set_collation_id(create_info->default_table_charset->number);
375
table_options->set_collation_id(
376
create_info->default_table_charset->number);
396
377
table_options->set_collation(create_info->default_table_charset->name);
399
if (create_info->used_fields & HA_CREATE_USED_AUTO)
400
table_options->set_has_user_set_auto_increment_value(true);
402
table_options->set_has_user_set_auto_increment_value(false);
380
if (create_info->connect_string.length)
381
table_options->set_connect_string(create_info->connect_string.str);
383
if (create_info->data_file_name)
384
table_options->set_data_file_name(create_info->data_file_name);
386
if (create_info->index_file_name)
387
table_options->set_index_file_name(create_info->index_file_name);
389
if (create_info->max_rows)
390
table_options->set_max_rows(create_info->max_rows);
392
if (create_info->min_rows)
393
table_options->set_min_rows(create_info->min_rows);
404
395
if (create_info->auto_increment_value)
405
396
table_options->set_auto_increment_value(create_info->auto_increment_value);
407
for (uint32_t i= 0; i < keys; i++)
398
if (create_info->avg_row_length)
399
table_options->set_avg_row_length(create_info->avg_row_length);
401
if (create_info->key_block_size)
402
table_options->set_key_block_size(create_info->key_block_size);
404
if (create_info->block_size)
405
table_options->set_block_size(create_info->block_size);
407
for (unsigned int i= 0; i < keys; i++)
409
message::Table::Index *idx;
409
drizzled::message::Table::Index *idx;
411
idx= table_proto.add_indexes();
411
idx= table_proto->add_indexes();
413
413
assert(test(key_info[i].flags & HA_USES_COMMENT) ==
414
414
(key_info[i].comment.length > 0));
482
486
my_error(ER_WRONG_STRING_LENGTH, MYF(0),
483
487
key_info[i].comment.str,"Index COMMENT",
484
488
(uint32_t) TABLE_COMMENT_MAXLEN);
488
492
idx->set_comment(key_info[i].comment.str);
490
static const uint64_t unknown_index_flag= (HA_NOSAME | HA_PACK_KEY |
495
HA_KEY_HAS_PART_KEY_SEG |
498
if (key_info[i].flags & ~unknown_index_flag)
494
if(key_info[i].flags & ~(HA_NOSAME | HA_PACK_KEY | HA_USES_BLOCK_SIZE | HA_BINARY_PACK_KEY | HA_VAR_LENGTH_PART | HA_NULL_PART_KEY | HA_KEY_HAS_PART_KEY_SEG | HA_GENERATED_KEY | HA_USES_COMMENT))
499
495
abort(); // Invalid (unknown) index flag.
501
497
for(unsigned int j=0; j< key_info[i].key_parts; j++)
503
message::Table::Index::IndexPart *idxpart;
504
const int fieldnr= key_info[i].key_part[j].fieldnr;
499
drizzled::message::Table::Index::IndexPart *idxpart;
507
501
idxpart= idx->add_index_part();
509
idxpart->set_fieldnr(fieldnr);
511
if (table_proto.field(fieldnr).type() == message::Table::Field::VARCHAR
512
|| table_proto.field(fieldnr).type() == message::Table::Field::BLOB)
514
uint32_t collation_id;
516
if (table_proto.field(fieldnr).string_options().has_collation_id())
517
collation_id= table_proto.field(fieldnr).string_options().collation_id();
519
collation_id= table_proto.options().collation_id();
521
const CHARSET_INFO *cs= get_charset(collation_id);
523
mbmaxlen= cs->mbmaxlen;
526
idxpart->set_compare_length(key_info[i].key_part[j].length / mbmaxlen);
530
if (not table_proto.IsInitialized())
532
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0),
533
table_proto.name().c_str(),
534
table_proto.InitializationErrorString().c_str());
540
Here we test to see if we can validate the Table Message before we continue.
541
We do this by serializing the protobuffer.
547
table_proto.SerializeToString(&tmp_string);
552
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0),
553
table_proto.name().c_str(),
554
table_proto.InitializationErrorString().c_str());
503
idxpart->set_fieldnr(key_info[i].key_part[j].fieldnr);
505
idxpart->set_compare_length(key_info[i].key_part[j].length);
507
idxpart->set_key_type(key_info[i].key_part[j].key_type);
515
int rename_table_proto_file(const char *from, const char* to)
517
string from_path(from);
519
string file_ext = ".dfe";
521
from_path.append(file_ext);
522
to_path.append(file_ext);
524
return my_rename(from_path.c_str(),to_path.c_str(),MYF(MY_WME));
527
int delete_table_proto_file(const char *file_name)
529
string new_path(file_name);
530
string file_ext = ".dfe";
532
new_path.append(file_ext);
533
return my_delete(new_path.c_str(), MYF(0));
536
int drizzle_write_proto_file(const std::string file_name,
537
drizzled::message::Table *table_proto)
539
int fd= open(file_name.c_str(), O_RDWR|O_CREAT|O_TRUNC, my_umask);
544
google::protobuf::io::ZeroCopyOutputStream* output=
545
new google::protobuf::io::FileOutputStream(fd);
547
if (table_proto->SerializeToZeroCopyStream(output) == false)
573
569
create_fields Fields to create
574
570
keys number of keys to create
575
571
key_info Keys to create
573
is_like is true for mysql_create_like_schema_frm
582
bool rea_create_table(Session *session,
583
const identifier::Table &identifier,
584
message::Table &table_proto,
585
HA_CREATE_INFO *create_info,
586
List<CreateField> &create_fields,
587
uint32_t keys, KeyInfo *key_info)
580
int rea_create_table(Session *session, const char *path,
581
const char *db, const char *table_name,
582
drizzled::message::Table *table_proto,
583
HA_CREATE_INFO *create_info,
584
List<CreateField> &create_fields,
585
uint32_t keys, KEY *key_info)
589
assert(table_proto.has_name());
590
if (fill_table_proto(table_proto, create_fields, create_info,
596
assert(table_proto.name() == identifier.getTableName());
598
if (not plugin::StorageEngine::createTable(*session,
587
/* Proto will blow up unless we give a name */
590
if (fill_table_proto(table_proto, table_name, create_fields, create_info,
594
string new_path(path);
595
string file_ext = ".dfe";
597
new_path.append(file_ext);
601
StorageEngine* engine= ha_resolve_by_name(session,
602
table_proto->engine().name());
603
if (engine->check_flag(HTON_BIT_HAS_DATA_DICTIONARY) == false)
604
err= drizzle_write_proto_file(new_path, table_proto);
609
my_error(ER_BAD_DB_ERROR,MYF(0),db);
611
my_error(ER_CANT_CREATE_TABLE,MYF(0),table_name,err);
616
if (ha_create_table(session, path, db, table_name,
617
create_info,0, table_proto))
622
if (engine->check_flag(HTON_BIT_HAS_DATA_DICTIONARY) == false)
623
delete_table_proto_file(path);
607
626
} /* rea_create_table */
609
} /* namespace drizzled */