25
#include <drizzled/serialize/serialize.h>
26
#include <drizzled/serialize/table.pb.h>
25
#include <drizzled/message/schema.pb.h>
26
#include <drizzled/message/table.pb.h>
27
27
#include <google/protobuf/io/zero_copy_stream.h>
28
28
#include <google/protobuf/io/zero_copy_stream_impl.h>
29
29
using namespace std;
31
int drizzle_read_table_proto(const char* path, drizzle::Table* table)
31
int drizzle_read_table_proto(const char* path, drizzled::message::Table* table)
33
33
int fd= open(path, O_RDONLY);
53
static int fill_table_proto(drizzle::Table *table_proto,
53
static int fill_table_proto(drizzled::message::Table *table_proto,
54
54
const char *table_name,
55
55
List<Create_field> &create_fields,
56
56
HA_CREATE_INFO *create_info,
60
60
Create_field *field_arg;
61
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();
62
drizzled::message::Table::StorageEngine *engine= table_proto->mutable_engine();
63
drizzled::message::Table::TableOptions *table_options= table_proto->mutable_options();
65
65
if (create_fields.elements > MAX_FIELDS)
71
71
engine->set_name(create_info->db_type->getName());
73
73
table_proto->set_name(table_name);
74
table_proto->set_type(drizzle::Table::STANDARD);
74
table_proto->set_type(drizzled::message::Table::STANDARD);
76
76
while ((field_arg= it++))
78
drizzle::Table::Field *attribute;
78
drizzled::message::Table::Field *attribute;
80
80
attribute= table_proto->add_field();
81
81
attribute->set_name(field_arg->field_name);
85
85
if(f_maybe_null(field_arg->pack_flag))
87
drizzle::Table::Field::FieldConstraints *constraints;
87
drizzled::message::Table::Field::FieldConstraints *constraints;
89
89
constraints= attribute->mutable_constraints();
90
90
constraints->set_is_nullable(true);
93
93
switch (field_arg->sql_type) {
94
94
case DRIZZLE_TYPE_TINY:
95
attribute->set_type(drizzle::Table::Field::TINYINT);
95
attribute->set_type(drizzled::message::Table::Field::TINYINT);
97
97
case DRIZZLE_TYPE_LONG:
98
attribute->set_type(drizzle::Table::Field::INTEGER);
98
attribute->set_type(drizzled::message::Table::Field::INTEGER);
100
100
case DRIZZLE_TYPE_DOUBLE:
101
attribute->set_type(drizzle::Table::Field::DOUBLE);
101
attribute->set_type(drizzled::message::Table::Field::DOUBLE);
103
103
case DRIZZLE_TYPE_NULL :
104
104
assert(1); /* Not a user definable type */
105
105
case DRIZZLE_TYPE_TIMESTAMP:
106
attribute->set_type(drizzle::Table::Field::TIMESTAMP);
106
attribute->set_type(drizzled::message::Table::Field::TIMESTAMP);
108
108
case DRIZZLE_TYPE_LONGLONG:
109
attribute->set_type(drizzle::Table::Field::BIGINT);
109
attribute->set_type(drizzled::message::Table::Field::BIGINT);
111
111
case DRIZZLE_TYPE_DATETIME:
112
attribute->set_type(drizzle::Table::Field::DATETIME);
112
attribute->set_type(drizzled::message::Table::Field::DATETIME);
114
114
case DRIZZLE_TYPE_DATE:
115
attribute->set_type(drizzle::Table::Field::DATE);
115
attribute->set_type(drizzled::message::Table::Field::DATE);
117
117
case DRIZZLE_TYPE_VARCHAR:
119
drizzle::Table::Field::StringFieldOptions *string_field_options;
119
drizzled::message::Table::Field::StringFieldOptions *string_field_options;
121
121
string_field_options= attribute->mutable_string_options();
122
attribute->set_type(drizzle::Table::Field::VARCHAR);
122
attribute->set_type(drizzled::message::Table::Field::VARCHAR);
123
123
string_field_options->set_length(field_arg->length
124
124
/ field_arg->charset->mbmaxlen);
125
125
string_field_options->set_collation_id(field_arg->charset->number);
130
130
case DRIZZLE_TYPE_NEWDECIMAL:
132
drizzle::Table::Field::NumericFieldOptions *numeric_field_options;
132
drizzled::message::Table::Field::NumericFieldOptions *numeric_field_options;
134
attribute->set_type(drizzle::Table::Field::DECIMAL);
134
attribute->set_type(drizzled::message::Table::Field::DECIMAL);
135
135
numeric_field_options= attribute->mutable_numeric_options();
136
136
/* This is magic, I hate magic numbers -Brian */
137
137
numeric_field_options->set_precision(field_arg->length + ( field_arg->decimals ? -2 : -1));
141
141
case DRIZZLE_TYPE_ENUM:
143
drizzle::Table::Field::SetFieldOptions *set_field_options;
143
drizzled::message::Table::Field::SetFieldOptions *set_field_options;
145
145
assert(field_arg->interval);
147
attribute->set_type(drizzle::Table::Field::ENUM);
147
attribute->set_type(drizzled::message::Table::Field::ENUM);
148
148
set_field_options= attribute->mutable_set_options();
150
150
for (uint32_t pos= 0; pos < field_arg->interval->count; pos++)
161
161
case DRIZZLE_TYPE_BLOB:
163
attribute->set_type(drizzle::Table::Field::BLOB);
163
attribute->set_type(drizzled::message::Table::Field::BLOB);
165
drizzle::Table::Field::StringFieldOptions *string_field_options;
165
drizzled::message::Table::Field::StringFieldOptions *string_field_options;
167
167
string_field_options= attribute->mutable_string_options();
168
168
string_field_options->set_collation_id(field_arg->charset->number);
194
drizzle::Table::Field::VirtualFieldOptions *field_options;
194
drizzled::message::Table::Field::VirtualFieldOptions *field_options;
196
196
field_options= attribute->mutable_virtual_options();
198
198
field_options->set_type(attribute->type());
199
attribute->set_type(drizzle::Table::Field::VIRTUAL);
199
attribute->set_type(drizzled::message::Table::Field::VIRTUAL);
201
201
string expr(field_arg->vcol_info->expr_str.str,
202
202
field_arg->vcol_info->expr_str.length);
215
215
case COLUMN_FORMAT_TYPE_NOT_USED:
217
217
case COLUMN_FORMAT_TYPE_DEFAULT:
218
attribute->set_format(drizzle::Table::Field::DefaultFormat);
218
attribute->set_format(drizzled::message::Table::Field::DefaultFormat);
220
220
case COLUMN_FORMAT_TYPE_FIXED:
221
attribute->set_format(drizzle::Table::Field::FixedFormat);
221
attribute->set_format(drizzled::message::Table::Field::FixedFormat);
223
223
case COLUMN_FORMAT_TYPE_DYNAMIC:
224
attribute->set_format(drizzle::Table::Field::DynamicFormat);
224
attribute->set_format(drizzled::message::Table::Field::DynamicFormat);
227
227
assert(0); /* Tell us, since this shouldn't happend */
250
250
if(field_arg->unireg_check == Field::NEXT_NUMBER)
252
drizzle::Table::Field::NumericFieldOptions *field_options;
252
drizzled::message::Table::Field::NumericFieldOptions *field_options;
253
253
field_options= attribute->mutable_numeric_options();
254
254
field_options->set_is_autoincrement(true);
257
257
if(field_arg->unireg_check == Field::TIMESTAMP_DN_FIELD
258
258
|| field_arg->unireg_check == Field::TIMESTAMP_DNUN_FIELD)
260
drizzle::Table::Field::FieldOptions *field_options;
260
drizzled::message::Table::Field::FieldOptions *field_options;
261
261
field_options= attribute->mutable_options();
262
262
field_options->set_default_value("NOW()");
265
265
if(field_arg->unireg_check == Field::TIMESTAMP_UN_FIELD
266
266
|| field_arg->unireg_check == Field::TIMESTAMP_DNUN_FIELD)
268
drizzle::Table::Field::FieldOptions *field_options;
268
drizzled::message::Table::Field::FieldOptions *field_options;
269
269
field_options= attribute->mutable_options();
270
270
field_options->set_update_value("NOW()");
273
273
if(field_arg->def)
275
drizzle::Table::Field::FieldOptions *field_options;
275
drizzled::message::Table::Field::FieldOptions *field_options;
276
276
field_options= attribute->mutable_options();
278
278
if(field_arg->def->is_null())
316
drizzle::Table::Field::FieldOptions *field_options;
316
drizzled::message::Table::Field::FieldOptions *field_options;
317
317
field_options= attribute->mutable_options();
319
319
field_options->set_length(field_arg->length);
377
377
switch(create_info->row_type)
379
379
case ROW_TYPE_DEFAULT:
380
table_options->set_row_type(drizzle::Table::TableOptions::ROW_TYPE_DEFAULT);
380
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_DEFAULT);
382
382
case ROW_TYPE_FIXED:
383
table_options->set_row_type(drizzle::Table::TableOptions::ROW_TYPE_FIXED);
383
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_FIXED);
385
385
case ROW_TYPE_DYNAMIC:
386
table_options->set_row_type(drizzle::Table::TableOptions::ROW_TYPE_DYNAMIC);
386
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_DYNAMIC);
388
388
case ROW_TYPE_COMPRESSED:
389
table_options->set_row_type(drizzle::Table::TableOptions::ROW_TYPE_COMPRESSED);
389
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_COMPRESSED);
391
391
case ROW_TYPE_REDUNDANT:
392
table_options->set_row_type(drizzle::Table::TableOptions::ROW_TYPE_REDUNDANT);
392
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_REDUNDANT);
394
394
case ROW_TYPE_COMPACT:
395
table_options->set_row_type(drizzle::Table::TableOptions::ROW_TYPE_COMPACT);
395
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_COMPACT);
397
397
case ROW_TYPE_PAGE:
398
table_options->set_row_type(drizzle::Table::TableOptions::ROW_TYPE_PAGE);
398
table_options->set_row_type(drizzled::message::Table::TableOptions::ROW_TYPE_PAGE);
478
478
switch(key_info[i].algorithm)
480
480
case HA_KEY_ALG_HASH:
481
idx->set_type(drizzle::Table::Index::HASH);
481
idx->set_type(drizzled::message::Table::Index::HASH);
484
484
case HA_KEY_ALG_BTREE:
485
idx->set_type(drizzle::Table::Index::BTREE);
485
idx->set_type(drizzled::message::Table::Index::BTREE);
488
488
case HA_KEY_ALG_RTREE:
489
idx->set_type(drizzle::Table::Index::RTREE);
489
idx->set_type(drizzled::message::Table::Index::RTREE);
490
490
case HA_KEY_ALG_FULLTEXT:
491
idx->set_type(drizzle::Table::Index::FULLTEXT);
491
idx->set_type(drizzled::message::Table::Index::FULLTEXT);
492
492
case HA_KEY_ALG_UNDEF:
493
idx->set_type(drizzle::Table::Index::UNKNOWN_INDEX);
493
idx->set_type(drizzled::message::Table::Index::UNKNOWN_INDEX);
503
503
idx->set_is_unique(false);
505
drizzle::Table::Index::IndexOptions *index_options= idx->mutable_options();
505
drizzled::message::Table::Index::IndexOptions *index_options= idx->mutable_options();
507
507
if(key_info[i].flags & HA_USES_BLOCK_SIZE)
508
508
index_options->set_key_block_size(key_info[i].block_size);