82
80
return vector_of_schema_engines;
85
StorageEngine::StorageEngine(const std::string name_arg,
86
const std::bitset<HTON_BIT_SIZE> &flags_arg) :
83
StorageEngine::StorageEngine(const string name_arg,
84
const bitset<HTON_BIT_SIZE> &flags_arg) :
87
85
Plugin(name_arg, "StorageEngine"),
88
86
MonitoredInTransaction(), /* This gives the storage engine a "slot" or ID */
226
StorageEngine *StorageEngine::findByName(Session& session, const std::string &predicate)
224
StorageEngine *StorageEngine::findByName(Session& session, const string &predicate)
228
226
if (boost::iequals(predicate, DEFAULT_STRING))
229
227
return session.getDefaultStorageEngine();
231
EngineVector::iterator iter= std::find_if(vector_of_engines.begin(),
232
vector_of_engines.end(),
233
FindEngineByName(predicate));
229
EngineVector::iterator iter= find_if(vector_of_engines.begin(),
230
vector_of_engines.end(),
231
FindEngineByName(predicate));
234
232
if (iter != vector_of_engines.end())
236
234
StorageEngine *engine= *iter;
264
262
void StorageEngine::closeConnection(Session* session)
266
std::for_each(vector_of_engines.begin(), vector_of_engines.end(),
267
StorageEngineCloseConnection(session));
264
for_each(vector_of_engines.begin(), vector_of_engines.end(),
265
StorageEngineCloseConnection(session));
270
268
bool StorageEngine::flushLogs(StorageEngine *engine)
272
270
if (engine == NULL)
274
if (std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
275
std::mem_fun(&StorageEngine::flush_logs))
272
if (find_if(vector_of_engines.begin(), vector_of_engines.end(),
273
mem_fun(&StorageEngine::flush_logs))
276
274
!= vector_of_engines.begin())
287
class StorageEngineGetTableDefinition: public std::unary_function<StorageEngine *,bool>
285
class StorageEngineGetTableDefinition: public unary_function<StorageEngine *,bool>
289
287
Session& session;
290
const identifier::Table &identifier;
288
const TableIdentifier &identifier;
291
289
message::Table &table_message;
292
drizzled::error_t &err;
295
293
StorageEngineGetTableDefinition(Session& session_arg,
296
const identifier::Table &identifier_arg,
294
const TableIdentifier &identifier_arg,
297
295
message::Table &table_message_arg,
298
drizzled::error_t &err_arg) :
299
297
session(session_arg),
300
298
identifier(identifier_arg),
301
299
table_message(table_message_arg),
306
304
int ret= engine->doGetTableDefinition(session, identifier, table_message);
308
306
if (ret != ENOENT)
309
err= static_cast<drizzled::error_t>(ret);
311
return err == static_cast<drizzled::error_t>(EEXIST) or err != static_cast<drizzled::error_t>(ENOENT);
309
return err == EEXIST || err != ENOENT;
315
class StorageEngineDoesTableExist: public std::unary_function<StorageEngine *, bool>
313
class StorageEngineDoesTableExist: public unary_function<StorageEngine *, bool>
317
315
Session& session;
318
const identifier::Table &identifier;
316
const TableIdentifier &identifier;
321
StorageEngineDoesTableExist(Session& session_arg, const identifier::Table &identifier_arg) :
319
StorageEngineDoesTableExist(Session& session_arg, const TableIdentifier &identifier_arg) :
322
320
session(session_arg),
323
321
identifier(identifier_arg)
367
365
or any dropped tables that need to be removed from disk
369
367
int StorageEngine::getTableDefinition(Session& session,
370
const identifier::Table &identifier,
371
message::table::shared_ptr &table_message,
368
const TableIdentifier &identifier,
369
message::Table &table_message,
372
370
bool include_temporary_tables)
374
drizzled::error_t err= static_cast<drizzled::error_t>(ENOENT);
376
374
if (include_temporary_tables)
378
Table *table= session.find_temporary_table(identifier);
381
table_message.reset(new message::Table(*table->getShare()->getTableMessage()));
376
if (session.doGetTableDefinition(identifier, table_message) == EEXIST)
386
drizzled::message::table::shared_ptr table_ptr;
387
if ((table_ptr= drizzled::message::Cache::singleton().find(identifier)))
389
table_message= table_ptr;
392
message::Table message;
393
380
EngineVector::iterator iter=
394
std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
395
StorageEngineGetTableDefinition(session, identifier, message, err));
381
find_if(vector_of_engines.begin(), vector_of_engines.end(),
382
StorageEngineGetTableDefinition(session, identifier, table_message, err));
397
384
if (iter == vector_of_engines.end())
401
table_message.reset(new message::Table(message));
403
drizzled::message::Cache::singleton().insert(identifier, table_message);
408
message::table::shared_ptr StorageEngine::getTableMessage(Session& session,
409
identifier::Table::const_reference identifier,
410
drizzled::error_t &error,
411
bool include_temporary_tables)
413
error= static_cast<drizzled::error_t>(ENOENT);
415
if (include_temporary_tables)
417
Table *table= session.find_temporary_table(identifier);
421
return message::table::shared_ptr(new message::Table(*table->getShare()->getTableMessage()));
425
drizzled::message::table::shared_ptr table_ptr;
426
if ((table_ptr= drizzled::message::Cache::singleton().find(identifier)))
431
message::Table message;
432
EngineVector::iterator iter=
433
std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
434
StorageEngineGetTableDefinition(session, identifier, message, error));
436
if (iter == vector_of_engines.end())
438
error= static_cast<drizzled::error_t>(ENOENT);
439
return message::table::shared_ptr();
441
message::table::shared_ptr table_message(new message::Table(message));
443
drizzled::message::Cache::singleton().insert(identifier, table_message);
445
return table_message;
449
393
An interceptor to hijack the text of the error message without
450
394
setting an error in the thread. We need the text to present it
478
class DropTableByIdentifier: public std::unary_function<EngineVector::value_type, bool>
480
Session::reference session;
481
identifier::Table::const_reference identifier;
482
drizzled::error_t &error;
486
DropTableByIdentifier(Session::reference session_arg,
487
identifier::Table::const_reference identifier_arg,
488
drizzled::error_t &error_arg) :
489
session(session_arg),
490
identifier(identifier_arg),
494
result_type operator() (argument_type engine)
496
if (not engine->doDoesTableExist(session, identifier))
499
int local_error= engine->doDropTable(session, identifier);
507
case HA_ERR_NO_SUCH_TABLE:
509
error= static_cast<drizzled::error_t>(HA_ERR_NO_SUCH_TABLE);
513
error= static_cast<drizzled::error_t>(local_error);
520
bool StorageEngine::dropTable(Session::reference session,
521
identifier::Table::const_reference identifier,
522
drizzled::error_t &error)
526
EngineVector::const_iterator iter= std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
527
DropTableByIdentifier(session, identifier, error));
533
else if (iter == vector_of_engines.end())
535
error= ER_BAD_TABLE_ERROR;
539
drizzled::message::Cache::singleton().erase(identifier);
544
bool StorageEngine::dropTable(Session& session,
545
const identifier::Table &identifier)
547
drizzled::error_t error;
549
if (not dropTable(session, identifier, error))
557
bool StorageEngine::dropTable(Session::reference session,
558
StorageEngine &engine,
559
identifier::Table::const_reference identifier,
560
drizzled::error_t &error)
423
returns ENOENT if the file doesn't exists.
425
int StorageEngine::dropTable(Session& session,
426
const TableIdentifier &identifier)
430
message::Table src_proto;
431
StorageEngine *engine;
433
error_proto= StorageEngine::getTableDefinition(session, identifier, src_proto);
435
if (error_proto == ER_CORRUPT_TABLE_DEFINITION)
437
string error_message;
439
error_message.append(const_cast<TableIdentifier &>(identifier).getSQLPath());
440
error_message.append(" : ");
441
error_message.append(src_proto.InitializationErrorString());
443
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0), error_message.c_str());
445
return ER_CORRUPT_TABLE_DEFINITION;
448
engine= StorageEngine::findByName(session, src_proto.engine().name());
452
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0), const_cast<TableIdentifier &>(identifier).getSQLPath().c_str());
454
return ER_CORRUPT_TABLE_DEFINITION;
457
error= StorageEngine::dropTable(session, *engine, identifier);
459
if (error_proto && error == 0)
465
int StorageEngine::dropTable(Session& session,
466
StorageEngine &engine,
467
const TableIdentifier &identifier)
563
471
engine.setTransactionReadWrite(session);
565
assert(identifier.isTmp());
567
473
if (unlikely(plugin::EventObserver::beforeDropTable(session, identifier)))
600
bool StorageEngine::createTable(Session &session,
601
const identifier::Table &identifier,
602
message::Table& table_message)
499
int StorageEngine::createTable(Session &session,
500
const TableIdentifier &identifier,
501
message::Table& table_message)
604
drizzled::error_t error= EE_OK;
606
505
TableShare share(identifier);
607
table::Shell table(share);
608
506
message::Table tmp_proto;
610
508
if (share.parse_table_proto(session, table_message) || share.open_table_from_share(&session, identifier, "", 0, 0, table))
612
510
// @note Error occured, we should probably do a little more here.
613
// ER_CORRUPT_TABLE_DEFINITION,ER_CORRUPT_TABLE_DEFINITION_ENUM
615
my_error(ER_CORRUPT_TABLE_DEFINITION_UNKNOWN, identifier);
634
527
share.storage_engine->setTransactionReadWrite(session);
636
error= static_cast<drizzled::error_t>(share.storage_engine->doCreateTable(session,
529
error= share.storage_engine->doCreateTable(session,
642
if (error == ER_TABLE_PERMISSION_DENIED)
644
my_error(ER_TABLE_PERMISSION_DENIED, identifier);
649
identifier.getSQLPath(path);
650
my_error(ER_CANT_CREATE_TABLE, MYF(ME_BELL+ME_WAITTANG), path.c_str(), error);
537
my_error(ER_CANT_CREATE_TABLE, MYF(ME_BELL+ME_WAITTANG), const_cast<TableIdentifier &>(identifier).getSQLPath().c_str(), error);
653
540
table.delete_table();
656
return(error == EE_OK);
659
Cursor *StorageEngine::getCursor(Table &arg)
546
Cursor *StorageEngine::getCursor(TableShare &share)
548
return create(share);
664
551
class AddTableIdentifier :
665
public std::unary_function<StorageEngine *, void>
552
public unary_function<StorageEngine *, void>
667
554
CachedDirectory &directory;
668
const identifier::Schema &identifier;
669
identifier::Table::vector &set_of_identifiers;
555
const SchemaIdentifier &identifier;
556
TableIdentifiers &set_of_identifiers;
673
AddTableIdentifier(CachedDirectory &directory_arg, const identifier::Schema &identifier_arg, identifier::Table::vector &of_names) :
560
AddTableIdentifier(CachedDirectory &directory_arg, const SchemaIdentifier &identifier_arg, TableIdentifiers &of_names) :
674
561
directory(directory_arg),
675
562
identifier(identifier_arg),
676
563
set_of_identifiers(of_names)
699
589
errno= directory.getError();
700
590
if (errno == ENOENT)
703
schema_identifier.getSQLPath(path);
704
my_error(ER_BAD_DB_ERROR, MYF(ME_BELL+ME_WAITTANG), path.c_str());
591
my_error(ER_BAD_DB_ERROR, MYF(ME_BELL+ME_WAITTANG), const_cast<SchemaIdentifier &>(schema_identifier).getSQLPath().c_str());
708
593
my_error(ER_CANT_READ_DIR, MYF(ME_BELL+ME_WAITTANG), directory.getPath(), errno);
715
std::for_each(vector_of_engines.begin(), vector_of_engines.end(),
716
AddTableIdentifier(directory, schema_identifier, set_of_identifiers));
598
for_each(vector_of_engines.begin(), vector_of_engines.end(),
599
AddTableIdentifier(directory, schema_identifier, set_of_identifiers));
718
601
session.doGetTableIdentifiers(directory, schema_identifier, set_of_identifiers);
721
class DropTable: public std::unary_function<identifier::Table&, bool>
604
class DropTable: public unary_function<TableIdentifier&, bool>
723
606
Session &session;
724
607
StorageEngine *engine;
739
/* This will later be converted to identifier::Tables */
740
class DropTables: public std::unary_function<StorageEngine *, void>
622
/* This will later be converted to TableIdentifiers */
623
class DropTables: public unary_function<StorageEngine *, void>
742
625
Session &session;
743
identifier::Table::vector &table_identifiers;
626
TableIdentifiers &table_identifiers;
747
DropTables(Session &session_arg, identifier::Table::vector &table_identifiers_arg) :
630
DropTables(Session &session_arg, TableIdentifiers &table_identifiers_arg) :
748
631
session(session_arg),
749
632
table_identifiers(table_identifiers_arg)
754
637
// True returning from DropTable means the table has been successfully
755
638
// deleted, so it should be removed from the list of tables to drop
756
table_identifiers.erase(std::remove_if(table_identifiers.begin(),
757
table_identifiers.end(),
758
DropTable(session, engine)),
639
table_identifiers.erase(remove_if(table_identifiers.begin(),
640
table_identifiers.end(),
641
DropTable(session, engine)),
759
642
table_identifiers.end());
797
680
message::Table definition;
798
681
if (StorageEngine::readTableFile(path, definition))
800
identifier::Table identifier(definition.schema(), definition.name(), path);
683
TableIdentifier identifier(definition.schema(), definition.name(), path);
801
684
table_identifiers.push_back(identifier);
805
std::for_each(vector_of_engines.begin(), vector_of_engines.end(),
806
DropTables(session, table_identifiers));
688
for_each(vector_of_engines.begin(), vector_of_engines.end(),
689
DropTables(session, table_identifiers));
809
692
Now we just clean up anything that might left over.
811
694
We rescan because some of what might have been there should
812
695
now be all nice and cleaned up.
814
std::set<std::string> all_exts= set_of_table_definition_ext;
697
set<string> all_exts= set_of_table_definition_ext;
816
699
for (EngineVector::iterator iter= vector_of_engines.begin();
817
700
iter != vector_of_engines.end() ; iter++)
847
730
- table->getShare()->path
850
void StorageEngine::print_error(int error, myf errflag, const Table &table) const
852
drizzled::error_t textno= ER_GET_ERRNO;
733
void StorageEngine::print_error(int error, myf errflag, Table &table)
735
print_error(error, errflag, &table);
738
void StorageEngine::print_error(int error, myf errflag, Table *table)
740
int textno= ER_GET_ERRNO;
855
743
textno=ER_OPEN_AS_READONLY;
894
784
String str(key,sizeof(key),system_charset_info);
896
786
/* Table is opened and defined at this point */
897
key_unpack(&str, &table,(uint32_t) key_nr);
787
key_unpack(&str,table,(uint32_t) key_nr);
898
788
max_length= (DRIZZLE_ERRMSG_SIZE-
899
789
(uint32_t) strlen(ER(ER_FOREIGN_DUPLICATE_KEY)));
900
790
if (str.length() >= max_length)
979
869
textno=ER_TABLE_DEF_CHANGED;
981
871
case HA_ERR_NO_SUCH_TABLE:
983
identifier::Table identifier(table.getShare()->getSchemaName(), table.getShare()->getTableName());
984
my_error(ER_TABLE_UNKNOWN, identifier);
873
my_error(ER_NO_SUCH_TABLE, MYF(0), table->getShare()->getSchemaName(),
874
table->getShare()->getTableName());
987
876
case HA_ERR_RBR_LOGGING_FAILED:
988
877
textno= ER_BINLOG_ROW_LOGGING_FAILED;
990
879
case HA_ERR_DROP_INDEX_FK:
992
882
const char *ptr= "???";
993
uint32_t key_nr= table.get_dup_key(error);
883
uint32_t key_nr= table->get_dup_key(error);
994
884
if ((int) key_nr >= 0)
995
ptr= table.key_info[key_nr].name;
885
ptr= table->key_info[key_nr].name;
996
886
my_error(ER_DROP_INDEX_FK, MYF(0), ptr);
1052
941
Returns true if this is a temporary error
1054
bool StorageEngine::get_error_message(int , String* ) const
943
bool StorageEngine::get_error_message(int , String* )
1060
void StorageEngine::print_keydup_error(uint32_t key_nr, const char *msg, const Table &table) const
949
void StorageEngine::print_keydup_error(uint32_t key_nr, const char *msg, Table &table)
1062
951
/* Write the duplicated key in the error message */
1063
952
char key[MAX_KEY_LENGTH];
1088
int StorageEngine::deleteDefinitionFromPath(const identifier::Table &identifier)
977
int StorageEngine::deleteDefinitionFromPath(const TableIdentifier &identifier)
1090
std::string path(identifier.getPath());
979
string path(identifier.getPath());
1092
981
path.append(DEFAULT_DEFINITION_FILE_EXT);
1094
983
return internal::my_delete(path.c_str(), MYF(0));
1097
int StorageEngine::renameDefinitionFromPath(const identifier::Table &dest, const identifier::Table &src)
986
int StorageEngine::renameDefinitionFromPath(const TableIdentifier &dest, const TableIdentifier &src)
1099
988
message::Table table_message;
1100
std::string src_path(src.getPath());
1101
std::string dest_path(dest.getPath());
989
string src_path(src.getPath());
990
string dest_path(dest.getPath());
1103
992
src_path.append(DEFAULT_DEFINITION_FILE_EXT);
1104
993
dest_path.append(DEFAULT_DEFINITION_FILE_EXT);
1220
1104
@note on success table can be created.
1222
bool StorageEngine::canCreateTable(const identifier::Table &identifier)
1106
bool StorageEngine::canCreateTable(const TableIdentifier &identifier)
1224
1108
EngineVector::iterator iter=
1225
std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
1226
CanCreateTable(identifier));
1109
find_if(vector_of_engines.begin(), vector_of_engines.end(),
1110
CanCreateTable(identifier));
1228
1112
if (iter == vector_of_engines.end())