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
#include <drizzled/table_proto.h>
40
#include <drizzled/charset.h>
42
#include "drizzled/function/time/typecast.h"
44
28
using namespace std;
48
bool fill_table_proto(message::Table &table_proto,
49
List<CreateField> &create_fields,
50
HA_CREATE_INFO *create_info,
30
int drizzle_read_table_proto(const char* path, drizzled::message::Table* table)
32
int fd= open(path, O_RDONLY);
37
google::protobuf::io::ZeroCopyInputStream* input=
38
new google::protobuf::io::FileInputStream(fd);
40
if (!table->ParseFromZeroCopyStream(input))
52
static int fill_table_proto(drizzled::message::Table *table_proto,
53
const char *table_name,
54
List<CreateField> &create_fields,
55
HA_CREATE_INFO *create_info,
54
59
CreateField *field_arg;
55
60
List_iterator<CreateField> it(create_fields);
56
message::Table::TableOptions *table_options= table_proto.mutable_options();
61
drizzled::message::Table::TableOptions *table_options= table_proto->mutable_options();
58
63
if (create_fields.elements > MAX_FIELDS)
60
65
my_error(ER_TOO_MANY_FIELDS, MYF(0), ER(ER_TOO_MANY_FIELDS));
64
assert(strcmp(table_proto.engine().name().c_str(),
69
assert(strcmp(table_proto->engine().name().c_str(),
65
70
create_info->db_type->getName().c_str())==0);
68
bool use_existing_fields= table_proto.field_size() > 0;
72
assert(strcmp(table_proto->name().c_str(),table_name)==0);
69
74
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;
76
drizzled::message::Table::Field *attribute;
78
attribute= table_proto->add_field();
79
attribute->set_name(field_arg->field_name);
81
attribute->set_pack_flag(field_arg->pack_flag); /* TODO: MUST DIE */
83
if(f_maybe_null(field_arg->pack_flag))
85
drizzled::message::Table::Field::FieldConstraints *constraints;
87
constraints= attribute->mutable_constraints();
88
constraints->set_is_nullable(true);
91
switch (field_arg->sql_type) {
92
case DRIZZLE_TYPE_TINY:
93
attribute->set_type(drizzled::message::Table::Field::TINYINT);
95
case DRIZZLE_TYPE_LONG:
96
attribute->set_type(drizzled::message::Table::Field::INTEGER);
98
case DRIZZLE_TYPE_DOUBLE:
99
attribute->set_type(drizzled::message::Table::Field::DOUBLE);
101
case DRIZZLE_TYPE_NULL :
102
assert(1); /* Not a user definable type */
103
case DRIZZLE_TYPE_TIMESTAMP:
104
attribute->set_type(drizzled::message::Table::Field::TIMESTAMP);
106
case DRIZZLE_TYPE_LONGLONG:
107
attribute->set_type(drizzled::message::Table::Field::BIGINT);
109
case DRIZZLE_TYPE_DATETIME:
110
attribute->set_type(drizzled::message::Table::Field::DATETIME);
112
case DRIZZLE_TYPE_DATE:
113
attribute->set_type(drizzled::message::Table::Field::DATE);
115
case DRIZZLE_TYPE_VARCHAR:
117
drizzled::message::Table::Field::StringFieldOptions *string_field_options;
154
119
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);
120
attribute->set_type(drizzled::message::Table::Field::VARCHAR);
121
string_field_options->set_length(field_arg->length
122
/ field_arg->charset->mbmaxlen);
123
string_field_options->set_collation_id(field_arg->charset->number);
124
string_field_options->set_collation(field_arg->charset->name);
169
case message::Table::Field::DECIMAL:
128
case DRIZZLE_TYPE_NEWDECIMAL:
171
message::Table::Field::NumericFieldOptions *numeric_field_options;
130
drizzled::message::Table::Field::NumericFieldOptions *numeric_field_options;
132
attribute->set_type(drizzled::message::Table::Field::DECIMAL);
173
133
numeric_field_options= attribute->mutable_numeric_options();
174
134
/* This is magic, I hate magic numbers -Brian */
175
135
numeric_field_options->set_precision(field_arg->length + ( field_arg->decimals ? -2 : -1));
176
136
numeric_field_options->set_scale(field_arg->decimals);
179
case message::Table::Field::ENUM:
139
case DRIZZLE_TYPE_ENUM:
181
message::Table::Field::EnumerationValues *enumeration_options;
141
drizzled::message::Table::Field::SetFieldOptions *set_field_options;
183
143
assert(field_arg->interval);
185
enumeration_options= attribute->mutable_enumeration_values();
145
attribute->set_type(drizzled::message::Table::Field::ENUM);
146
set_field_options= attribute->mutable_set_options();
187
148
for (uint32_t pos= 0; pos < field_arg->interval->count; pos++)
189
150
const char *src= field_arg->interval->type_names[pos];
191
enumeration_options->add_field_value(src);
152
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);
154
set_field_options->set_count_elements(set_field_options->field_value_size());
155
set_field_options->set_collation_id(field_arg->charset->number);
156
set_field_options->set_collation(field_arg->charset->name);
198
case message::Table::Field::BLOB:
159
case DRIZZLE_TYPE_BLOB:
200
message::Table::Field::StringFieldOptions *string_field_options;
161
attribute->set_type(drizzled::message::Table::Field::BLOB);
163
drizzled::message::Table::Field::StringFieldOptions *string_field_options;
202
165
string_field_options= attribute->mutable_string_options();
203
166
string_field_options->set_collation_id(field_arg->charset->number);
236
208
my_error(ER_WRONG_STRING_LENGTH, MYF(0),
237
209
field_arg->comment.str,"COLUMN COMMENT",
238
210
(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);
214
attribute->set_comment(field_arg->comment.str);
248
if (field_arg->unireg_check == Field::NEXT_NUMBER)
217
if(field_arg->unireg_check == Field::NEXT_NUMBER)
250
message::Table::Field::NumericFieldOptions *field_options;
219
drizzled::message::Table::Field::NumericFieldOptions *field_options;
251
220
field_options= attribute->mutable_numeric_options();
252
221
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())
224
if(field_arg->unireg_check == Field::TIMESTAMP_DN_FIELD
225
|| field_arg->unireg_check == Field::TIMESTAMP_DNUN_FIELD)
227
drizzled::message::Table::Field::FieldOptions *field_options;
228
field_options= attribute->mutable_options();
229
field_options->set_default_value("NOW()");
232
if(field_arg->unireg_check == Field::TIMESTAMP_UN_FIELD
233
|| field_arg->unireg_check == Field::TIMESTAMP_DNUN_FIELD)
235
drizzled::message::Table::Field::FieldOptions *field_options;
236
field_options= attribute->mutable_options();
237
field_options->set_update_value("NOW()");
242
drizzled::message::Table::Field::FieldOptions *field_options;
243
field_options= attribute->mutable_options();
245
if(field_arg->def->is_null())
285
247
field_options->set_default_null(true);
292
254
assert(default_value);
294
if ((field_arg->sql_type==DRIZZLE_TYPE_VARCHAR
256
if((field_arg->sql_type==DRIZZLE_TYPE_VARCHAR
295
257
|| field_arg->sql_type==DRIZZLE_TYPE_BLOB)
296
258
&& ((field_arg->length / field_arg->charset->mbmaxlen)
297
259
< default_value->length()))
299
261
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
265
if((field_arg->sql_type==DRIZZLE_TYPE_VARCHAR
343
266
&& field_arg->charset==&my_charset_bin)
344
267
|| (field_arg->sql_type==DRIZZLE_TYPE_BLOB
345
268
&& 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())
297
if (create_info->used_fields & HA_CREATE_USED_PACK_KEYS)
299
if(create_info->table_options & HA_OPTION_PACK_KEYS)
300
table_options->set_pack_keys(true);
301
else if(create_info->table_options & HA_OPTION_NO_PACK_KEYS)
302
table_options->set_pack_keys(false);
305
if(create_info->table_options & HA_OPTION_PACK_KEYS)
306
table_options->set_pack_keys(true);
309
if (create_info->used_fields & HA_CREATE_USED_CHECKSUM)
311
assert(create_info->table_options & (HA_OPTION_CHECKSUM | HA_OPTION_NO_CHECKSUM));
313
if(create_info->table_options & HA_OPTION_CHECKSUM)
314
table_options->set_checksum(true);
316
table_options->set_checksum(false);
318
else if(create_info->table_options & HA_OPTION_CHECKSUM)
319
table_options->set_checksum(true);
322
if (create_info->used_fields & HA_CREATE_USED_PAGE_CHECKSUM)
324
if (create_info->page_checksum == HA_CHOICE_YES)
325
table_options->set_page_checksum(true);
326
else if (create_info->page_checksum == HA_CHOICE_NO)
327
table_options->set_page_checksum(false);
329
else if (create_info->page_checksum == HA_CHOICE_YES)
330
table_options->set_page_checksum(true);
333
if (create_info->used_fields & HA_CREATE_USED_DELAY_KEY_WRITE)
335
if(create_info->table_options & HA_OPTION_DELAY_KEY_WRITE)
336
table_options->set_delay_key_write(true);
337
else if(create_info->table_options & HA_OPTION_NO_DELAY_KEY_WRITE)
338
table_options->set_delay_key_write(false);
340
else if(create_info->table_options & HA_OPTION_DELAY_KEY_WRITE)
341
table_options->set_delay_key_write(true);
344
switch(create_info->row_type)
346
case ROW_TYPE_DEFAULT:
347
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_DEFAULT);
350
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_FIXED);
352
case ROW_TYPE_DYNAMIC:
353
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_DYNAMIC);
355
case ROW_TYPE_COMPRESSED:
356
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_COMPRESSED);
358
case ROW_TYPE_REDUNDANT:
359
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_REDUNDANT);
361
case ROW_TYPE_COMPACT:
362
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_COMPACT);
365
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_PAGE);
371
table_options->set_pack_record(create_info->table_options
372
& HA_OPTION_PACK_RECORD);
374
if (create_info->comment.length)
377
376
uint32_t tmp_len;
378
377
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);
378
create_info->comment.str,
379
create_info->comment.str +
380
create_info->comment.length,
381
TABLE_COMMENT_MAXLEN);
384
if (tmp_len < table_options->comment().length())
383
if (tmp_len < create_info->comment.length)
386
385
my_error(ER_WRONG_STRING_LENGTH, MYF(0),
387
table_options->comment().c_str(),"Table COMMENT",
388
(uint32_t) TABLE_COMMENT_MAXLEN);
386
create_info->comment.str,"Table COMMENT",
387
(uint32_t) TABLE_COMMENT_MAXLEN);
391
table_options->set_comment(create_info->comment.str);
393
393
if (create_info->default_table_charset)
395
table_options->set_collation_id(create_info->default_table_charset->number);
395
table_options->set_collation_id(
396
create_info->default_table_charset->number);
396
397
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);
400
if (create_info->connect_string.length)
401
table_options->set_connect_string(create_info->connect_string.str);
403
if (create_info->data_file_name)
404
table_options->set_data_file_name(create_info->data_file_name);
406
if (create_info->index_file_name)
407
table_options->set_index_file_name(create_info->index_file_name);
409
if (create_info->max_rows)
410
table_options->set_max_rows(create_info->max_rows);
412
if (create_info->min_rows)
413
table_options->set_min_rows(create_info->min_rows);
404
415
if (create_info->auto_increment_value)
405
416
table_options->set_auto_increment_value(create_info->auto_increment_value);
407
for (uint32_t i= 0; i < keys; i++)
418
if (create_info->avg_row_length)
419
table_options->set_avg_row_length(create_info->avg_row_length);
421
if (create_info->key_block_size)
422
table_options->set_key_block_size(create_info->key_block_size);
424
if (create_info->block_size)
425
table_options->set_block_size(create_info->block_size);
427
for (unsigned int i= 0; i < keys; i++)
409
message::Table::Index *idx;
429
drizzled::message::Table::Index *idx;
411
idx= table_proto.add_indexes();
431
idx= table_proto->add_indexes();
413
433
assert(test(key_info[i].flags & HA_USES_COMMENT) ==
414
434
(key_info[i].comment.length > 0));
482
506
my_error(ER_WRONG_STRING_LENGTH, MYF(0),
483
507
key_info[i].comment.str,"Index COMMENT",
484
508
(uint32_t) TABLE_COMMENT_MAXLEN);
488
512
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)
514
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
515
abort(); // Invalid (unknown) index flag.
501
517
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;
519
drizzled::message::Table::Index::IndexPart *idxpart;
507
521
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());
523
idxpart->set_fieldnr(key_info[i].key_part[j].fieldnr);
525
idxpart->set_compare_length(key_info[i].key_part[j].length);
527
idxpart->set_key_type(key_info[i].key_part[j].key_type);
535
int copy_table_proto_file(const char *from, const char* to)
539
string file_ext = ".dfe";
541
dfesrc.append(file_ext);
542
dfedst.append(file_ext);
544
return my_copy(dfesrc.c_str(), dfedst.c_str(),
545
MYF(MY_DONT_OVERWRITE_FILE));
548
int rename_table_proto_file(const char *from, const char* to)
550
string from_path(from);
552
string file_ext = ".dfe";
554
from_path.append(file_ext);
555
to_path.append(file_ext);
557
return my_rename(from_path.c_str(),to_path.c_str(),MYF(MY_WME));
560
int delete_table_proto_file(const char *file_name)
562
string new_path(file_name);
563
string file_ext = ".dfe";
565
new_path.append(file_ext);
566
return my_delete(new_path.c_str(), MYF(0));
569
int table_proto_exists(const char *path)
571
string proto_path(path);
572
string file_ext(".dfe");
573
proto_path.append(file_ext);
575
int error= access(proto_path.c_str(), F_OK);
583
static int create_table_proto_file(const char *file_name,
585
const char *table_name,
586
drizzled::message::Table *table_proto,
587
HA_CREATE_INFO *create_info,
588
List<CreateField> &create_fields,
592
string new_path(file_name);
593
string file_ext = ".dfe";
595
if(fill_table_proto(table_proto, table_name, create_fields, create_info,
599
new_path.append(file_ext);
601
int fd= open(new_path.c_str(), O_RDWR|O_CREAT|O_TRUNC, my_umask);
606
my_error(ER_BAD_DB_ERROR,MYF(0),db);
608
my_error(ER_CANT_CREATE_TABLE,MYF(0),table_name,errno);
612
google::protobuf::io::ZeroCopyOutputStream* output=
613
new google::protobuf::io::FileOutputStream(fd);
615
if (!table_proto->SerializeToZeroCopyStream(output))
573
637
create_fields Fields to create
574
638
keys number of keys to create
575
639
key_info Keys to create
641
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)
648
int rea_create_table(Session *session, const char *path,
649
const char *db, const char *table_name,
650
drizzled::message::Table *table_proto,
651
HA_CREATE_INFO *create_info,
652
List<CreateField> &create_fields,
653
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,
656
/* Proto will blow up unless we give a name */
659
/* For is_like we return once the file has been created */
662
if (create_table_proto_file(path, db, table_name, table_proto,
664
create_fields, keys, key_info)!=0)
669
/* Here we need to build the full frm from the path */
672
if (create_table_proto_file(path, db, table_name, table_proto,
674
create_fields, keys, key_info))
678
if (ha_create_table(session, path, db, table_name,
684
delete_table_proto_file(path);
607
687
} /* rea_create_table */
609
} /* namespace drizzled */