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
#include <drizzled/virtual_column_info.h>
18
19
#include <drizzled/session.h>
19
20
#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>
27
#include <drizzled/typelib.h>
33
#include <drizzled/message/schema.pb.h>
34
#include <drizzled/message/table.pb.h>
25
#include <drizzled/serialize/serialize.h>
26
#include <drizzled/serialize/table.pb.h>
35
27
#include <google/protobuf/io/zero_copy_stream.h>
36
28
#include <google/protobuf/io/zero_copy_stream_impl.h>
37
#include <google/protobuf/message.h>
39
#include <drizzled/table_proto.h>
40
#include <drizzled/charset.h>
42
#include <drizzled/function/time/typecast.h>
44
29
using namespace std;
48
bool fill_table_proto(message::Table &table_proto,
49
List<CreateField> &create_fields,
50
HA_CREATE_INFO *create_info,
54
CreateField *field_arg;
55
List<CreateField>::iterator it(create_fields.begin());
56
message::Table::TableOptions *table_options= table_proto.mutable_options();
31
int drizzle_read_table_proto(const char* path, drizzle::Table* table)
33
int fd= open(path, O_RDONLY);
38
google::protobuf::io::ZeroCopyInputStream* input=
39
new google::protobuf::io::FileInputStream(fd);
41
if (!table->ParseFromZeroCopyStream(input))
53
static int fill_table_proto(drizzle::Table *table_proto,
54
const char *table_name,
55
List<Create_field> &create_fields,
56
HA_CREATE_INFO *create_info,
60
Create_field *field_arg;
61
List_iterator<Create_field> it(create_fields);
62
drizzle::Table::StorageEngine *engine= table_proto->mutable_engine();
63
drizzle::Table::TableOptions *table_options= table_proto->mutable_options();
58
65
if (create_fields.elements > MAX_FIELDS)
60
67
my_error(ER_TOO_MANY_FIELDS, MYF(0), ER(ER_TOO_MANY_FIELDS));
64
assert(strcmp(table_proto.engine().name().c_str(),
65
create_info->db_type->getName().c_str())==0);
68
bool use_existing_fields= table_proto.field_size() > 0;
71
engine->set_name(create_info->db_type->name);
73
table_proto->set_name(table_name);
74
table_proto->set_type(drizzle::Table::STANDARD);
69
76
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;
78
drizzle::Table::Field *attribute;
80
attribute= table_proto->add_field();
81
attribute->set_name(field_arg->field_name);
83
attribute->set_pack_flag(field_arg->pack_flag); /* TODO: MUST DIE */
85
if(f_maybe_null(field_arg->pack_flag))
87
drizzle::Table::Field::FieldConstraints *constraints;
89
constraints= attribute->mutable_constraints();
90
constraints->set_is_nullable(true);
93
switch (field_arg->sql_type) {
94
case DRIZZLE_TYPE_TINY:
95
attribute->set_type(drizzle::Table::Field::TINYINT);
97
case DRIZZLE_TYPE_LONG:
98
attribute->set_type(drizzle::Table::Field::INTEGER);
100
case DRIZZLE_TYPE_DOUBLE:
101
attribute->set_type(drizzle::Table::Field::DOUBLE);
103
case DRIZZLE_TYPE_NULL :
104
assert(1); /* Not a user definable type */
105
case DRIZZLE_TYPE_TIMESTAMP:
106
attribute->set_type(drizzle::Table::Field::TIMESTAMP);
108
case DRIZZLE_TYPE_LONGLONG:
109
attribute->set_type(drizzle::Table::Field::BIGINT);
111
case DRIZZLE_TYPE_DATETIME:
112
attribute->set_type(drizzle::Table::Field::DATETIME);
114
case DRIZZLE_TYPE_DATE:
115
attribute->set_type(drizzle::Table::Field::DATE);
117
case DRIZZLE_TYPE_VARCHAR:
119
drizzle::Table::Field::StringFieldOptions *string_field_options;
154
121
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);
122
attribute->set_type(drizzle::Table::Field::VARCHAR);
123
string_field_options->set_length(field_arg->length
124
/ field_arg->charset->mbmaxlen);
125
string_field_options->set_collation_id(field_arg->charset->number);
126
string_field_options->set_collation(field_arg->charset->name);
169
case message::Table::Field::DECIMAL:
130
case DRIZZLE_TYPE_NEWDECIMAL:
171
message::Table::Field::NumericFieldOptions *numeric_field_options;
132
drizzle::Table::Field::NumericFieldOptions *numeric_field_options;
134
attribute->set_type(drizzle::Table::Field::DECIMAL);
173
135
numeric_field_options= attribute->mutable_numeric_options();
174
136
/* This is magic, I hate magic numbers -Brian */
175
137
numeric_field_options->set_precision(field_arg->length + ( field_arg->decimals ? -2 : -1));
176
138
numeric_field_options->set_scale(field_arg->decimals);
179
case message::Table::Field::ENUM:
141
case DRIZZLE_TYPE_ENUM:
181
message::Table::Field::EnumerationValues *enumeration_options;
143
drizzle::Table::Field::SetFieldOptions *set_field_options;
183
145
assert(field_arg->interval);
185
enumeration_options= attribute->mutable_enumeration_values();
147
attribute->set_type(drizzle::Table::Field::ENUM);
148
set_field_options= attribute->mutable_set_options();
187
150
for (uint32_t pos= 0; pos < field_arg->interval->count; pos++)
189
152
const char *src= field_arg->interval->type_names[pos];
191
enumeration_options->add_field_value(src);
154
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);
156
set_field_options->set_count_elements(set_field_options->field_value_size());
157
set_field_options->set_collation_id(field_arg->charset->number);
158
set_field_options->set_collation(field_arg->charset->name);
198
case message::Table::Field::BLOB:
161
case DRIZZLE_TYPE_BLOB:
200
message::Table::Field::StringFieldOptions *string_field_options;
163
attribute->set_type(drizzle::Table::Field::BLOB);
165
drizzle::Table::Field::StringFieldOptions *string_field_options;
202
167
string_field_options= attribute->mutable_string_options();
203
168
string_field_options->set_collation_id(field_arg->charset->number);
209
case message::Table::Field::EPOCH:
174
assert(0); /* Tell us, since this shouldn't happend */
177
if(field_arg->vcol_info)
180
tmp_len= system_charset_info->cset->charpos(system_charset_info,
181
field_arg->vcol_info->expr_str.str,
182
field_arg->vcol_info->expr_str.str +
183
field_arg->vcol_info->expr_str.length,
184
VIRTUAL_COLUMN_EXPRESSION_MAXLEN);
186
if (tmp_len < field_arg->vcol_info->expr_str.length)
211
if (field_arg->sql_type == DRIZZLE_TYPE_MICROTIME)
212
attribute->mutable_time_options()->set_microseconds(true);
188
my_error(ER_WRONG_STRING_LENGTH, MYF(0),
189
field_arg->vcol_info->expr_str.str,"VIRTUAL COLUMN EXPRESSION",
190
(uint32_t) VIRTUAL_COLUMN_EXPRESSION_MAXLEN);
194
drizzle::Table::Field::VirtualFieldOptions *field_options;
196
field_options= attribute->mutable_virtual_options();
198
field_options->set_type(attribute->type());
199
attribute->set_type(drizzle::Table::Field::VIRTUAL);
201
string expr(field_arg->vcol_info->expr_str.str,
202
field_arg->vcol_info->expr_str.length);
204
field_options->set_expression(expr);
205
field_options->set_physically_stored(field_arg->is_stored);
218
assert (!use_existing_fields || parser_type == attribute->type());
221
209
field_constraints= attribute->mutable_constraints();
222
210
constraints->set_is_nullable(field_arg->def->null_value);
213
switch(field_arg->column_format())
215
case COLUMN_FORMAT_TYPE_NOT_USED:
217
case COLUMN_FORMAT_TYPE_DEFAULT:
218
attribute->set_format(drizzle::Table::Field::DefaultFormat);
220
case COLUMN_FORMAT_TYPE_FIXED:
221
attribute->set_format(drizzle::Table::Field::FixedFormat);
223
case COLUMN_FORMAT_TYPE_DYNAMIC:
224
attribute->set_format(drizzle::Table::Field::DynamicFormat);
227
assert(0); /* Tell us, since this shouldn't happend */
225
230
if (field_arg->comment.length)
227
232
uint32_t tmp_len;
236
241
my_error(ER_WRONG_STRING_LENGTH, MYF(0),
237
242
field_arg->comment.str,"COLUMN COMMENT",
238
243
(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);
247
attribute->set_comment(field_arg->comment.str);
248
if (field_arg->unireg_check == Field::NEXT_NUMBER)
250
if(field_arg->unireg_check == Field::NEXT_NUMBER)
250
message::Table::Field::NumericFieldOptions *field_options;
252
drizzle::Table::Field::NumericFieldOptions *field_options;
251
253
field_options= attribute->mutable_numeric_options();
252
254
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())
257
if(field_arg->unireg_check == Field::TIMESTAMP_DN_FIELD
258
|| field_arg->unireg_check == Field::TIMESTAMP_DNUN_FIELD)
260
drizzle::Table::Field::FieldOptions *field_options;
261
field_options= attribute->mutable_options();
262
field_options->set_default_value("NOW()");
265
if(field_arg->unireg_check == Field::TIMESTAMP_UN_FIELD
266
|| field_arg->unireg_check == Field::TIMESTAMP_DNUN_FIELD)
268
drizzle::Table::Field::FieldOptions *field_options;
269
field_options= attribute->mutable_options();
270
field_options->set_update_value("NOW()");
275
drizzle::Table::Field::FieldOptions *field_options;
276
field_options= attribute->mutable_options();
278
if(field_arg->def->is_null())
285
280
field_options->set_default_null(true);
363
assert(! use_existing_fields || (field_number == table_proto.field_size()));
365
if (create_info->table_options & HA_OPTION_PACK_RECORD)
366
table_options->set_pack_record(true);
368
if (table_options->has_comment() && table_options->comment().length() == 0)
369
table_options->clear_comment();
371
if (table_options->has_comment())
330
if (create_info->used_fields & HA_CREATE_USED_PACK_KEYS)
332
if(create_info->table_options & HA_OPTION_PACK_KEYS)
333
table_options->set_pack_keys(true);
334
else if(create_info->table_options & HA_OPTION_NO_PACK_KEYS)
335
table_options->set_pack_keys(false);
338
if(create_info->table_options & HA_OPTION_PACK_KEYS)
339
table_options->set_pack_keys(true);
342
if (create_info->used_fields & HA_CREATE_USED_CHECKSUM)
344
assert(create_info->table_options & (HA_OPTION_CHECKSUM | HA_OPTION_NO_CHECKSUM));
346
if(create_info->table_options & HA_OPTION_CHECKSUM)
347
table_options->set_checksum(true);
349
table_options->set_checksum(false);
351
else if(create_info->table_options & HA_OPTION_CHECKSUM)
352
table_options->set_checksum(true);
355
if (create_info->used_fields & HA_CREATE_USED_PAGE_CHECKSUM)
357
if (create_info->page_checksum == HA_CHOICE_YES)
358
table_options->set_page_checksum(true);
359
else if (create_info->page_checksum == HA_CHOICE_NO)
360
table_options->set_page_checksum(false);
362
else if (create_info->page_checksum == HA_CHOICE_YES)
363
table_options->set_page_checksum(true);
366
if (create_info->used_fields & HA_CREATE_USED_DELAY_KEY_WRITE)
368
if(create_info->table_options & HA_OPTION_DELAY_KEY_WRITE)
369
table_options->set_delay_key_write(true);
370
else if(create_info->table_options & HA_OPTION_NO_DELAY_KEY_WRITE)
371
table_options->set_delay_key_write(false);
373
else if(create_info->table_options & HA_OPTION_DELAY_KEY_WRITE)
374
table_options->set_delay_key_write(true);
377
switch(create_info->row_type)
379
case ROW_TYPE_DEFAULT:
380
table_options->set_row_type(drizzle::Table::TableOptions::ROW_TYPE_DEFAULT);
383
table_options->set_row_type(drizzle::Table::TableOptions::ROW_TYPE_FIXED);
385
case ROW_TYPE_DYNAMIC:
386
table_options->set_row_type(drizzle::Table::TableOptions::ROW_TYPE_DYNAMIC);
388
case ROW_TYPE_COMPRESSED:
389
table_options->set_row_type(drizzle::Table::TableOptions::ROW_TYPE_COMPRESSED);
391
case ROW_TYPE_REDUNDANT:
392
table_options->set_row_type(drizzle::Table::TableOptions::ROW_TYPE_REDUNDANT);
394
case ROW_TYPE_COMPACT:
395
table_options->set_row_type(drizzle::Table::TableOptions::ROW_TYPE_COMPACT);
398
table_options->set_row_type(drizzle::Table::TableOptions::ROW_TYPE_PAGE);
404
table_options->set_pack_record(create_info->table_options
405
& HA_OPTION_PACK_RECORD);
407
if (create_info->comment.length)
373
409
uint32_t tmp_len;
374
410
tmp_len= system_charset_info->cset->charpos(system_charset_info,
375
table_options->comment().c_str(),
376
table_options->comment().c_str() +
377
table_options->comment().length(),
378
TABLE_COMMENT_MAXLEN);
411
create_info->comment.str,
412
create_info->comment.str +
413
create_info->comment.length,
414
TABLE_COMMENT_MAXLEN);
380
if (tmp_len < table_options->comment().length())
416
if (tmp_len < create_info->comment.length)
382
418
my_error(ER_WRONG_STRING_LENGTH, MYF(0),
383
table_options->comment().c_str(),"Table COMMENT",
384
(uint32_t) TABLE_COMMENT_MAXLEN);
419
create_info->comment.str,"Table COMMENT",
420
(uint32_t) TABLE_COMMENT_MAXLEN);
424
table_options->set_comment(create_info->comment.str);
389
426
if (create_info->default_table_charset)
391
table_options->set_collation_id(create_info->default_table_charset->number);
428
table_options->set_collation_id(
429
create_info->default_table_charset->number);
392
430
table_options->set_collation(create_info->default_table_charset->name);
395
if (create_info->used_fields & HA_CREATE_USED_AUTO)
396
table_options->set_has_user_set_auto_increment_value(true);
398
table_options->set_has_user_set_auto_increment_value(false);
433
if (create_info->connect_string.length)
434
table_options->set_connect_string(create_info->connect_string.str);
436
if (create_info->data_file_name)
437
table_options->set_data_file_name(create_info->data_file_name);
439
if (create_info->index_file_name)
440
table_options->set_index_file_name(create_info->index_file_name);
442
if (create_info->max_rows)
443
table_options->set_max_rows(create_info->max_rows);
445
if (create_info->min_rows)
446
table_options->set_min_rows(create_info->min_rows);
400
448
if (create_info->auto_increment_value)
401
449
table_options->set_auto_increment_value(create_info->auto_increment_value);
403
for (uint32_t i= 0; i < keys; i++)
451
if (create_info->avg_row_length)
452
table_options->set_avg_row_length(create_info->avg_row_length);
454
if (create_info->key_block_size)
455
table_options->set_key_block_size(create_info->key_block_size);
457
if (create_info->block_size)
458
table_options->set_block_size(create_info->block_size);
460
for (unsigned int i= 0; i < keys; i++)
405
message::Table::Index *idx;
462
drizzle::Table::Index *idx;
407
idx= table_proto.add_indexes();
464
idx= table_proto->add_indexes();
409
466
assert(test(key_info[i].flags & HA_USES_COMMENT) ==
410
467
(key_info[i].comment.length > 0));
478
539
my_error(ER_WRONG_STRING_LENGTH, MYF(0),
479
540
key_info[i].comment.str,"Index COMMENT",
480
541
(uint32_t) TABLE_COMMENT_MAXLEN);
484
545
idx->set_comment(key_info[i].comment.str);
486
static const uint64_t unknown_index_flag= (HA_NOSAME | HA_PACK_KEY |
491
HA_KEY_HAS_PART_KEY_SEG |
494
if (key_info[i].flags & ~unknown_index_flag)
547
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))
495
548
abort(); // Invalid (unknown) index flag.
497
550
for(unsigned int j=0; j< key_info[i].key_parts; j++)
499
message::Table::Index::IndexPart *idxpart;
500
const int fieldnr= key_info[i].key_part[j].fieldnr;
552
drizzle::Table::Index::IndexPart *idxpart;
503
554
idxpart= idx->add_index_part();
505
idxpart->set_fieldnr(fieldnr);
507
if (table_proto.field(fieldnr).type() == message::Table::Field::VARCHAR
508
|| table_proto.field(fieldnr).type() == message::Table::Field::BLOB)
510
uint32_t collation_id;
512
if (table_proto.field(fieldnr).string_options().has_collation_id())
513
collation_id= table_proto.field(fieldnr).string_options().collation_id();
515
collation_id= table_proto.options().collation_id();
517
const CHARSET_INFO *cs= get_charset(collation_id);
519
mbmaxlen= cs->mbmaxlen;
522
idxpart->set_compare_length(key_info[i].key_part[j].length / mbmaxlen);
526
if (not table_proto.IsInitialized())
528
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0),
529
table_proto.name().c_str(),
530
table_proto.InitializationErrorString().c_str());
536
Here we test to see if we can validate the Table Message before we continue.
537
We do this by serializing the protobuffer.
543
table_proto.SerializeToString(&tmp_string);
548
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0),
549
table_proto.name().c_str(),
550
table_proto.InitializationErrorString().c_str());
556
idxpart->set_fieldnr(key_info[i].key_part[j].fieldnr);
558
idxpart->set_compare_length(key_info[i].key_part[j].length);
560
idxpart->set_key_type(key_info[i].key_part[j].key_type);
568
int copy_table_proto_file(const char *from, const char* to)
572
string file_ext = ".dfe";
574
dfesrc.append(file_ext);
575
dfedst.append(file_ext);
577
return my_copy(dfesrc.c_str(), dfedst.c_str(),
578
MYF(MY_DONT_OVERWRITE_FILE));
581
int rename_table_proto_file(const char *from, const char* to)
583
string from_path(from);
585
string file_ext = ".dfe";
587
from_path.append(file_ext);
588
to_path.append(file_ext);
590
return my_rename(from_path.c_str(),to_path.c_str(),MYF(MY_WME));
593
int delete_table_proto_file(const char *file_name)
595
string new_path(file_name);
596
string file_ext = ".dfe";
598
new_path.append(file_ext);
599
return my_delete(new_path.c_str(), MYF(0));
602
int table_proto_exists(const char *path)
604
string proto_path(path);
605
string file_ext(".dfe");
606
proto_path.append(file_ext);
608
int error= access(proto_path.c_str(), F_OK);
616
static int create_table_proto_file(const char *file_name,
618
const char *table_name,
619
HA_CREATE_INFO *create_info,
620
List<Create_field> &create_fields,
624
drizzle::Table table_proto;
625
string new_path(file_name);
626
string file_ext = ".dfe";
628
if(fill_table_proto(&table_proto, table_name, create_fields, create_info,
632
new_path.append(file_ext);
634
int fd= open(new_path.c_str(), O_RDWR|O_CREAT|O_TRUNC, my_umask);
639
my_error(ER_BAD_DB_ERROR,MYF(0),db);
641
my_error(ER_CANT_CREATE_TABLE,MYF(0),table_name,errno);
645
google::protobuf::io::ZeroCopyOutputStream* output=
646
new google::protobuf::io::FileOutputStream(fd);
648
if (!table_proto.SerializeToZeroCopyStream(output))
569
670
create_fields Fields to create
570
671
keys number of keys to create
571
672
key_info Keys to create
674
is_like is true for mysql_create_like_schema_frm
578
bool rea_create_table(Session *session,
579
const identifier::Table &identifier,
580
message::Table &table_proto,
581
HA_CREATE_INFO *create_info,
582
List<CreateField> &create_fields,
583
uint32_t keys, KeyInfo *key_info)
681
int rea_create_table(Session *session, const char *path,
682
const char *db, const char *table_name,
683
HA_CREATE_INFO *create_info,
684
List<Create_field> &create_fields,
685
uint32_t keys, KEY *key_info, handler *file,
585
assert(table_proto.has_name());
586
if (fill_table_proto(table_proto, create_fields, create_info,
592
assert(table_proto.name() == identifier.getTableName());
594
if (not plugin::StorageEngine::createTable(*session,
688
/* Proto will blow up unless we give a name */
691
/* For is_like we return once the file has been created */
694
if (create_table_proto_file(path, db, table_name, create_info,
695
create_fields, keys, key_info)!=0)
700
/* Here we need to build the full frm from the path */
703
if (create_table_proto_file(path, db, table_name, create_info,
704
create_fields, keys, key_info))
708
// Make sure mysql_create_frm din't remove extension
709
if (session->variables.keep_files_on_create)
710
create_info->options|= HA_CREATE_KEEP_FILES;
711
if (file->ha_create_handler_files(path, NULL, CHF_CREATE_FLAG, create_info))
713
if (ha_create_table(session, path, db, table_name,
719
file->ha_create_handler_files(path, NULL, CHF_DELETE_FLAG, create_info);
721
delete_table_proto_file(path);
603
724
} /* rea_create_table */
605
} /* namespace drizzled */