74
74
static std::set<std::string> set_of_table_definition_ext;
76
76
StorageEngine::StorageEngine(const string name_arg,
77
const bitset<HTON_BIT_SIZE> &flags_arg)
78
: Plugin(name_arg, "StorageEngine"),
79
MonitoredInTransaction(), /* This gives the storage engine a "slot" or ID */
77
const bitset<HTON_BIT_SIZE> &flags_arg) :
78
Plugin(name_arg, "StorageEngine"),
79
MonitoredInTransaction(), /* This gives the storage engine a "slot" or ID */
82
pthread_mutex_init(&proto_cache_mutex, NULL);
85
84
StorageEngine::~StorageEngine()
87
pthread_mutex_destroy(&proto_cache_mutex);
90
88
void StorageEngine::setTransactionReadWrite(Session& session)
93
91
statement_ctx.markModifiedNonTransData();
96
int StorageEngine::doRenameTable(Session *,
95
int StorageEngine::renameTable(Session &session, TableIdentifier &from, TableIdentifier &to)
101
for (const char **ext= bas_ext(); *ext ; ext++)
103
if (rename_file_ext(from, to, *ext))
105
if ((error=errno) != ENOENT)
97
setTransactionReadWrite(session);
99
return doRenameTable(session, from, to);
115
103
Delete all files with extension from bas_ext().
202
StorageEngine *StorageEngine::findByName(string find_str)
192
StorageEngine *StorageEngine::findByName(const string &find_str)
204
transform(find_str.begin(), find_str.end(),
205
find_str.begin(), ::tolower);
194
string search_string(find_str);
195
transform(search_string.begin(), search_string.end(),
196
search_string.begin(), ::tolower);
208
199
EngineVector::iterator iter= find_if(vector_of_engines.begin(),
209
200
vector_of_engines.end(),
210
FindEngineByName(find_str));
201
FindEngineByName(search_string));
211
202
if (iter != vector_of_engines.end())
213
204
StorageEngine *engine= *iter;
221
StorageEngine *StorageEngine::findByName(Session& session,
212
StorageEngine *StorageEngine::findByName(Session& session, const string &find_str)
225
transform(find_str.begin(), find_str.end(),
226
find_str.begin(), ::tolower);
214
string search_string(find_str);
215
transform(search_string.begin(), search_string.end(),
216
search_string.begin(), ::tolower);
228
if (find_str.compare("default") == 0)
218
if (search_string.compare("default") == 0)
229
219
return session.getDefaultStorageEngine();
231
221
EngineVector::iterator iter= find_if(vector_of_engines.begin(),
232
222
vector_of_engines.end(),
233
FindEngineByName(find_str));
223
FindEngineByName(search_string));
234
224
if (iter != vector_of_engines.end())
236
226
StorageEngine *engine= *iter;
290
279
Session& session;
291
280
TableIdentifier &identifier;
292
281
message::Table &table_message;
296
285
StorageEngineGetTableDefinition(Session& session_arg,
297
286
TableIdentifier &identifier_arg,
298
287
message::Table &table_message_arg,
300
289
session(session_arg),
301
290
identifier(identifier_arg),
302
291
table_message(table_message_arg),
385
374
EngineVector::iterator iter=
386
375
find_if(vector_of_engines.begin(), vector_of_engines.end(),
387
StorageEngineGetTableDefinition(session, identifier, table_message, &err));
376
StorageEngineGetTableDefinition(session, identifier, table_message, err));
389
378
if (iter == vector_of_engines.end())
518
503
TableShare share(identifier.getDBName().c_str(), 0, identifier.getTableName().c_str(), identifier.getPath().c_str());
519
504
message::Table tmp_proto;
521
if (parse_table_proto(session, table_message, &share))
524
if (open_table_from_share(&session, &share, "", 0, 0,
528
if (update_create_info)
529
table.updateCreateInfo(&table_message);
531
/* Check for legal operations against the Engine using the proto (if used) */
532
if (table_message.type() == message::Table::TEMPORARY &&
533
share.storage_engine->check_flag(HTON_BIT_TEMPORARY_NOT_SUPPORTED) == true)
535
error= HA_ERR_UNSUPPORTED;
538
else if (table_message.type() != message::Table::TEMPORARY &&
539
share.storage_engine->check_flag(HTON_BIT_TEMPORARY_ONLY) == true)
541
error= HA_ERR_UNSUPPORTED;
546
if (not share.storage_engine->check_flag(HTON_BIT_HAS_DATA_DICTIONARY))
548
int protoerr= StorageEngine::writeDefinitionFromPath(identifier, table_message);
557
share.storage_engine->setTransactionReadWrite(session);
559
error= share.storage_engine->doCreateTable(&session,
568
if (not share.storage_engine->check_flag(HTON_BIT_HAS_DATA_DICTIONARY))
569
plugin::StorageEngine::deleteDefinitionFromPath(identifier);
571
my_error(ER_CANT_CREATE_TABLE, MYF(ME_BELL+ME_WAITTANG), identifier.getSQLPath().c_str(), error);
574
table.closefrm(false);
506
if (parse_table_proto(session, table_message, &share) || open_table_from_share(&session, &share, "", 0, 0, &table))
508
// @note Error occured, we should probably do a little more here.
512
if (update_create_info)
513
table.updateCreateInfo(&table_message);
515
/* Check for legal operations against the Engine using the proto (if used) */
516
if (table_message.type() == message::Table::TEMPORARY &&
517
share.storage_engine->check_flag(HTON_BIT_TEMPORARY_NOT_SUPPORTED) == true)
519
error= HA_ERR_UNSUPPORTED;
521
else if (table_message.type() != message::Table::TEMPORARY &&
522
share.storage_engine->check_flag(HTON_BIT_TEMPORARY_ONLY) == true)
524
error= HA_ERR_UNSUPPORTED;
528
bool do_create= true;
529
if (not share.storage_engine->check_flag(HTON_BIT_HAS_DATA_DICTIONARY))
531
int protoerr= StorageEngine::writeDefinitionFromPath(identifier, table_message);
542
share.storage_engine->setTransactionReadWrite(session);
544
error= share.storage_engine->doCreateTable(&session,
553
if (not share.storage_engine->check_flag(HTON_BIT_HAS_DATA_DICTIONARY))
554
plugin::StorageEngine::deleteDefinitionFromPath(identifier);
556
my_error(ER_CANT_CREATE_TABLE, MYF(ME_BELL+ME_WAITTANG), identifier.getSQLPath().c_str(), error);
559
table.closefrm(false);
577
562
share.free_table_share();
578
563
return(error != 0);
1222
1207
src_path.append(DEFAULT_DEFINITION_FILE_EXT);
1223
1208
dest_path.append(DEFAULT_DEFINITION_FILE_EXT);
1210
int fd= open(src_path.c_str(), O_RDONLY);
1214
perror(src_path.c_str());
1218
google::protobuf::io::ZeroCopyInputStream* input=
1219
new google::protobuf::io::FileInputStream(fd);
1222
return HA_ERR_CRASHED_ON_USAGE;
1224
message::Table table_message;
1225
if (not table_message.ParseFromZeroCopyStream(input))
1229
if (not table_message.IsInitialized())
1231
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0),
1232
table_message.InitializationErrorString().c_str());
1233
return ER_CORRUPT_TABLE_DEFINITION;
1236
return HA_ERR_CRASHED_ON_USAGE;
1241
dest.copyToTableMessage(table_message);
1243
// We have to update the source to have the right information before we
1244
// make it the master.
1245
int error= StorageEngine::writeDefinitionFromPath(src, table_message);
1248
perror(src_path.c_str());
1225
1252
return internal::my_rename(src_path.c_str(), dest_path.c_str(), MYF(MY_WME));