1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2009 Sun Microsystems
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; version 2 of the License.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
4
#include <drizzled/message/table.pb.h>
27
#include <boost/program_options.hpp>
29
6
using namespace std;
30
using namespace drizzled;
32
namespace po=boost::program_options;
7
using namespace drizzled::message;
35
10
Written from Google proto example
38
static void fill_engine(message::Engine *engine)
13
void fill_engine(::drizzled::message::Table::StorageEngine *engine)
40
17
engine->set_name("InnoDB");
41
message::Engine::Option *option;
18
Table::StorageEngine::EngineOption *option;
43
20
string option_names[2]= {
53
30
/* Add some engine options */
54
for (int16_t x= 0; x < 2; x++)
31
for (x= 0; x < 2; x++)
56
option= engine->add_options();
57
option->set_name(option_names[x]);
58
option->set_state(option_values[x]);
33
option= engine->add_option();
34
option->set_option_name(option_names[x]);
35
option->set_option_value(option_values[x]);
36
option->set_option_type(Table::StorageEngine::EngineOption::STRING);
62
static void new_index_to_table(message::Table *table,
64
uint16_t num_index_parts,
65
uint32_t field_indexes[],
66
uint32_t compare_lengths[],
40
void new_index_to_table(::drizzled::message::Table *table,
42
uint16_t num_index_parts,
43
uint32_t field_indexes[],
44
uint32_t compare_lengths[],
72
message::Table::Index *index;
73
message::Table::Index::IndexPart *index_part;
51
Table::Index::IndexPart *index_part;
75
53
index= table->add_indexes();
77
55
index->set_name(name);
78
index->set_type(message::Table::Index::BTREE);
56
index->set_type(Table::Index::BTREE);
79
57
index->set_is_primary(is_primary);
80
58
index->set_is_unique(is_unique);
84
for(int i=0; i< num_index_parts; i++)
85
key_length+= compare_lengths[i];
87
index->set_key_length(key_length);
89
60
while (x < num_index_parts)
91
62
index_part= index->add_index_part();
102
static void fill_table(message::Table *table, const char *name)
73
void fill_table(::drizzled::message::Table *table, const char *name)
106
message::Table::Field *field;
107
message::Table::Field::FieldConstraints *field_constraints;
108
message::Table::Field::StringFieldOptions *string_field_options;
109
message::Table::Field::NumericFieldOptions *numeric_field_options;
110
message::Table::Field::EnumerationValues *enumeration_options;
78
Table::Field::FieldConstraints *field_constraints;
79
Table::Field::StringFieldOptions *string_field_options;
80
Table::Field::NumericFieldOptions *numeric_field_options;
81
Table::Field::SetFieldOptions *set_field_options;
112
83
table->set_name(name);
113
table->set_type(message::Table::STANDARD);
84
table->set_type(Table::STANDARD);
115
86
/* Write out some random varchar */
116
87
for (x= 0; x < 3; x++)
120
91
field_constraints= field->mutable_constraints();
121
92
string_field_options= field->mutable_string_options();
123
snprintf(buffer, sizeof(buffer), "sample%u", x);
94
sprintf(buffer, "sample%u", x);
125
96
field->set_name(buffer);
126
field->set_type(message::Table::Field::VARCHAR);
97
field->set_type(Table::Field::VARCHAR);
128
99
field_constraints->set_is_nullable((x % 2));
140
111
field= table->add_field();
141
112
field->set_name("number");
142
field->set_type(message::Table::Field::INTEGER);
113
field->set_type(Table::Field::INTEGER);
144
115
/* Write out a ENUM */
146
117
field= table->add_field();
147
field->set_type(message::Table::Field::ENUM);
118
field->set_type(Table::Field::ENUM);
148
119
field->set_name("colors");
150
enumeration_options= field->mutable_enumeration_values();
151
enumeration_options->add_field_value("red");
152
enumeration_options->add_field_value("blue");
153
enumeration_options->add_field_value("green");
121
set_field_options= field->mutable_set_options();
122
set_field_options->add_field_value("red");
123
set_field_options->add_field_value("blue");
124
set_field_options->add_field_value("green");
125
set_field_options->set_count_elements(set_field_options->field_value_size());
155
127
/* Write out a BLOB */
157
129
field= table->add_field();
158
130
field->set_name("some_btye_string");
159
field->set_type(message::Table::Field::BLOB);
131
field->set_type(Table::Field::BLOB);
162
134
/* Write out a DECIMAL */
164
136
field= table->add_field();
165
137
field->set_name("important_number");
166
field->set_type(message::Table::Field::DECIMAL);
138
field->set_type(Table::Field::DECIMAL);
168
140
field_constraints= field->mutable_constraints();
169
141
field_constraints->set_is_nullable(true);
194
166
/* Do engine-specific stuff */
195
message::Engine *engine= table->mutable_engine();
167
Table::StorageEngine *engine= table->mutable_engine();
196
168
fill_engine(engine);
200
static void fill_table1(message::Table *table)
202
message::Table::Field *field;
203
message::Table::TableOptions *tableopts;
205
table->set_name("t1");
206
table->set_type(message::Table::INTERNAL);
208
tableopts= table->mutable_options();
209
tableopts->set_comment("Table without a StorageEngine message");
212
field= table->add_field();
213
field->set_name("number");
214
field->set_type(message::Table::Field::INTEGER);
220
172
int main(int argc, char* argv[])
224
174
GOOGLE_PROTOBUF_VERIFY_VERSION;
226
po::options_description desc("Allowed options");
228
("help", "produce help message")
229
("table-number,t", po::value<int>(&table_number)->default_value(0), "Table Number");
231
po::variables_map vm;
232
po::positional_options_description p;
233
p.add("table-name", 1);
235
// Disable allow_guessing
236
int style = po::command_line_style::default_style & ~po::command_line_style::allow_guessing;
238
po::store(po::command_line_parser(argc, argv).options(desc).style(style).
239
positional(p).run(), vm);
241
if (not vm.count("table-name"))
243
fprintf(stderr, "Expected Table name argument\n\n");
244
cerr << desc << endl;
248
message::Table table;
250
switch (table_number)
253
fill_table(&table, "example_table");
259
fprintf(stderr, "Invalid table number.\n\n");
260
cerr << desc << endl;
264
fstream output(vm["table-name"].as<string>().c_str(),
265
ios::out | ios::trunc | ios::binary);
178
cerr << "Usage: " << argv[0] << " SCHEMA" << endl;
184
fill_table(&table, "example_table");
186
fstream output(argv[1], ios::out | ios::trunc | ios::binary);
266
187
if (!table.SerializeToOstream(&output))
268
189
cerr << "Failed to write schema." << endl;