22
22
#include <drizzled/plugin/table_function.h>
23
23
#include <drizzled/table_function_container.h>
24
24
#include <drizzled/gettext.h>
25
#include "drizzled/plugin/registry.h"
25
26
#include "drizzled/global_charset_info.h"
26
27
#include "drizzled/session.h"
27
28
#include "drizzled/current_session.h"
36
39
void plugin::TableFunction::init()
38
drizzled::message::Engine *engine;
41
drizzled::message::Table::StorageEngine *engine;
39
42
drizzled::message::Table::TableOptions *table_options;
41
proto.set_name(getTableLabel());
42
proto.set_schema(identifier.getSchemaName());
44
proto.set_name(identifier.getTableName());
43
45
proto.set_type(drizzled::message::Table::FUNCTION);
44
proto.set_creation_timestamp(0);
45
proto.set_update_timestamp(0);
47
47
table_options= proto.mutable_options();
48
48
table_options->set_collation_id(default_charset_info->number);
62
plugin::TableFunction *plugin::TableFunction::getFunction(const std::string &arg)
62
plugin::TableFunction *plugin::TableFunction::getFunction(const string &arg)
64
64
return table_functions.getFunction(arg);
67
void plugin::TableFunction::getNames(const std::string &arg,
68
std::set<std::string> &set_of_names)
67
void plugin::TableFunction::getNames(const string &arg,
68
set<std::string> &set_of_names)
70
70
table_functions.getNames(arg, set_of_names);
91
91
void plugin::TableFunction::add_field(const char *label,
92
TableFunction::ColumnType type,
93
uint32_t field_length,
92
TableFunction::ColumnType type,
93
uint32_t field_length,
96
96
drizzled::message::Table::Field *field;
97
97
drizzled::message::Table::Field::FieldOptions *field_options;
113
113
field_options->set_default_null(false);
114
114
field_constraints->set_is_nullable(false);
115
115
case TableFunction::STRING:
117
drizzled::message::Table::Field::StringFieldOptions *string_field_options;
118
if (field_length >= TABLE_FUNCTION_BLOB_SIZE)
120
field->set_type(drizzled::message::Table::Field::BLOB);
121
string_field_options= field->mutable_string_options();
122
string_field_options->set_collation_id(default_charset_info->number);
123
string_field_options->set_collation(default_charset_info->name);
127
field->set_type(drizzled::message::Table::Field::VARCHAR);
128
string_field_options= field->mutable_string_options();
129
string_field_options->set_length(field_length);
133
case TableFunction::VARBINARY:
135
drizzled::message::Table::Field::StringFieldOptions *string_field_options;
136
field->set_type(drizzled::message::Table::Field::VARCHAR);
138
string_field_options= field->mutable_string_options();
139
string_field_options->set_length(field_length);
140
string_field_options->set_collation(my_charset_bin.csname);
141
string_field_options->set_collation_id(my_charset_bin.number);
116
drizzled::message::Table::Field::StringFieldOptions *string_field_options;
117
field->set_type(drizzled::message::Table::Field::VARCHAR);
119
string_field_options= field->mutable_string_options();
120
string_field_options->set_length(field_length);
144
123
case TableFunction::NUMBER: // Currently NUMBER always has a value
145
124
field->set_type(drizzled::message::Table::Field::BIGINT);
125
field_options->set_default_null(false);
126
field_constraints->set_is_nullable(false);
150
131
plugin::TableFunction::Generator::Generator(Field **arg) :
152
session(current_session)
154
134
scs= system_charset_info;
174
154
void plugin::TableFunction::Generator::push(uint64_t arg)
176
(*columns_iterator)->store(static_cast<int64_t>(arg), true);
177
(*columns_iterator)->set_notnull();
156
(*columns_iterator)->store(static_cast<int64_t>(arg), false);
160
void plugin::TableFunction::Generator::push(uint32_t arg)
162
(*columns_iterator)->store(static_cast<int64_t>(arg), false);
178
163
columns_iterator++;
181
166
void plugin::TableFunction::Generator::push(int64_t arg)
183
168
(*columns_iterator)->store(arg, false);
184
(*columns_iterator)->set_notnull();
172
void plugin::TableFunction::Generator::push(int32_t arg)
174
(*columns_iterator)->store(arg, false);
185
175
columns_iterator++;
193
183
length= length ? length : strlen(arg);
195
if ((*columns_iterator)->char_length() < length)
196
length= (*columns_iterator)->char_length();
198
188
(*columns_iterator)->store(arg, length, scs);
199
189
(*columns_iterator)->set_notnull();
220
(*columns_iterator)->store("YES", 3, scs);
209
(*columns_iterator)->store("TRUE", 4, scs);
224
(*columns_iterator)->store("NO", 2, scs);
213
(*columns_iterator)->store("FALSE", 5, scs);
227
216
columns_iterator++;
230
219
bool plugin::TableFunction::Generator::isWild(const std::string &predicate)
232
if (not getSession().lex->wild)
221
Session *session= current_session;
223
if (not session->lex->wild)
235
226
bool match= wild_case_compare(system_charset_info,
236
227
predicate.c_str(),
237
getSession().lex->wild->ptr());
228
session->lex->wild->ptr());