82
82
return vector_of_schema_engines;
85
StorageEngine::StorageEngine(const std::string name_arg,
86
const std::bitset<HTON_BIT_SIZE> &flags_arg) :
85
StorageEngine::StorageEngine(const string name_arg,
86
const bitset<HTON_BIT_SIZE> &flags_arg) :
87
87
Plugin(name_arg, "StorageEngine"),
88
88
MonitoredInTransaction(), /* This gives the storage engine a "slot" or ID */
226
StorageEngine *StorageEngine::findByName(Session& session, const std::string &predicate)
226
StorageEngine *StorageEngine::findByName(Session& session, const string &predicate)
228
228
if (boost::iequals(predicate, DEFAULT_STRING))
229
229
return session.getDefaultStorageEngine();
231
EngineVector::iterator iter= std::find_if(vector_of_engines.begin(),
232
vector_of_engines.end(),
233
FindEngineByName(predicate));
231
EngineVector::iterator iter= find_if(vector_of_engines.begin(),
232
vector_of_engines.end(),
233
FindEngineByName(predicate));
234
234
if (iter != vector_of_engines.end())
236
236
StorageEngine *engine= *iter;
264
264
void StorageEngine::closeConnection(Session* session)
266
std::for_each(vector_of_engines.begin(), vector_of_engines.end(),
267
StorageEngineCloseConnection(session));
266
for_each(vector_of_engines.begin(), vector_of_engines.end(),
267
StorageEngineCloseConnection(session));
270
270
bool StorageEngine::flushLogs(StorageEngine *engine)
272
272
if (engine == NULL)
274
if (std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
275
std::mem_fun(&StorageEngine::flush_logs))
274
if (find_if(vector_of_engines.begin(), vector_of_engines.end(),
275
mem_fun(&StorageEngine::flush_logs))
276
276
!= vector_of_engines.begin())
287
class StorageEngineGetTableDefinition: public std::unary_function<StorageEngine *,bool>
287
class StorageEngineGetTableDefinition: public unary_function<StorageEngine *,bool>
289
289
Session& session;
290
const identifier::Table &identifier;
290
const TableIdentifier &identifier;
291
291
message::Table &table_message;
292
drizzled::error_t &err;
295
295
StorageEngineGetTableDefinition(Session& session_arg,
296
const identifier::Table &identifier_arg,
296
const TableIdentifier &identifier_arg,
297
297
message::Table &table_message_arg,
298
drizzled::error_t &err_arg) :
299
299
session(session_arg),
300
300
identifier(identifier_arg),
301
301
table_message(table_message_arg),
306
306
int ret= engine->doGetTableDefinition(session, identifier, table_message);
308
308
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);
311
return err == EEXIST || err != ENOENT;
315
class StorageEngineDoesTableExist: public std::unary_function<StorageEngine *, bool>
315
class StorageEngineDoesTableExist: public unary_function<StorageEngine *, bool>
317
317
Session& session;
318
const identifier::Table &identifier;
318
const TableIdentifier &identifier;
321
StorageEngineDoesTableExist(Session& session_arg, const identifier::Table &identifier_arg) :
321
StorageEngineDoesTableExist(Session& session_arg, const TableIdentifier &identifier_arg) :
322
322
session(session_arg),
323
323
identifier(identifier_arg)
367
367
or any dropped tables that need to be removed from disk
369
369
int StorageEngine::getTableDefinition(Session& session,
370
const identifier::Table &identifier,
371
message::table::shared_ptr &table_message,
370
const TableIdentifier &identifier,
371
message::Table &table_message,
372
372
bool include_temporary_tables)
374
drizzled::error_t err= static_cast<drizzled::error_t>(ENOENT);
376
376
if (include_temporary_tables)
378
Table *table= session.find_temporary_table(identifier);
381
table_message.reset(new message::Table(*table->getShare()->getTableMessage()));
378
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
382
EngineVector::iterator iter=
394
std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
395
StorageEngineGetTableDefinition(session, identifier, message, err));
383
find_if(vector_of_engines.begin(), vector_of_engines.end(),
384
StorageEngineGetTableDefinition(session, identifier, table_message, err));
397
386
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
395
An interceptor to hijack the text of the error message without
450
396
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)
425
returns ENOENT if the file doesn't exists.
427
int StorageEngine::dropTable(Session& session,
428
const TableIdentifier &identifier)
432
message::Table src_proto;
433
StorageEngine *engine;
435
error_proto= StorageEngine::getTableDefinition(session, identifier, src_proto);
437
if (error_proto == ER_CORRUPT_TABLE_DEFINITION)
439
string error_message;
441
error_message.append(const_cast<TableIdentifier &>(identifier).getSQLPath());
442
error_message.append(" : ");
443
error_message.append(src_proto.InitializationErrorString());
445
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0), error_message.c_str());
447
return ER_CORRUPT_TABLE_DEFINITION;
450
engine= StorageEngine::findByName(session, src_proto.engine().name());
454
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0), const_cast<TableIdentifier &>(identifier).getSQLPath().c_str());
456
return ER_CORRUPT_TABLE_DEFINITION;
459
error= StorageEngine::dropTable(session, *engine, identifier);
461
if (error_proto && error == 0)
467
int StorageEngine::dropTable(Session& session,
468
StorageEngine &engine,
469
const TableIdentifier &identifier)
563
473
engine.setTransactionReadWrite(session);
565
assert(identifier.isTmp());
567
475
if (unlikely(plugin::EventObserver::beforeDropTable(session, identifier)))
600
bool StorageEngine::createTable(Session &session,
601
const identifier::Table &identifier,
602
message::Table& table_message)
501
int StorageEngine::createTable(Session &session,
502
const TableIdentifier &identifier,
503
message::Table& table_message)
604
drizzled::error_t error= EE_OK;
606
506
TableShare share(identifier);
607
507
table::Shell table(share);
608
508
message::Table tmp_proto;
634
529
share.storage_engine->setTransactionReadWrite(session);
636
error= static_cast<drizzled::error_t>(share.storage_engine->doCreateTable(session,
531
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);
539
my_error(ER_CANT_CREATE_TABLE, MYF(ME_BELL+ME_WAITTANG), const_cast<TableIdentifier &>(identifier).getSQLPath().c_str(), error);
653
542
table.delete_table();
656
return(error == EE_OK);
659
548
Cursor *StorageEngine::getCursor(Table &arg)
664
553
class AddTableIdentifier :
665
public std::unary_function<StorageEngine *, void>
554
public unary_function<StorageEngine *, void>
667
556
CachedDirectory &directory;
668
const identifier::Schema &identifier;
669
identifier::Table::vector &set_of_identifiers;
557
const SchemaIdentifier &identifier;
558
TableIdentifiers &set_of_identifiers;
673
AddTableIdentifier(CachedDirectory &directory_arg, const identifier::Schema &identifier_arg, identifier::Table::vector &of_names) :
562
AddTableIdentifier(CachedDirectory &directory_arg, const SchemaIdentifier &identifier_arg, TableIdentifiers &of_names) :
674
563
directory(directory_arg),
675
564
identifier(identifier_arg),
676
565
set_of_identifiers(of_names)
687
void StorageEngine::getIdentifiers(Session &session, const identifier::Schema &schema_identifier, identifier::Table::vector &set_of_identifiers)
576
void StorageEngine::getIdentifiers(Session &session, const SchemaIdentifier &schema_identifier, TableIdentifiers &set_of_identifiers)
578
static SchemaIdentifier INFORMATION_SCHEMA_IDENTIFIER("information_schema");
579
static SchemaIdentifier DATA_DICTIONARY_IDENTIFIER("data_dictionary");
689
581
CachedDirectory directory(schema_identifier.getPath(), set_of_table_definition_ext);
691
583
if (schema_identifier == INFORMATION_SCHEMA_IDENTIFIER)
699
591
errno= directory.getError();
700
592
if (errno == ENOENT)
703
schema_identifier.getSQLPath(path);
704
my_error(ER_BAD_DB_ERROR, MYF(ME_BELL+ME_WAITTANG), path.c_str());
593
my_error(ER_BAD_DB_ERROR, MYF(ME_BELL+ME_WAITTANG), const_cast<SchemaIdentifier &>(schema_identifier).getSQLPath().c_str());
708
595
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));
600
for_each(vector_of_engines.begin(), vector_of_engines.end(),
601
AddTableIdentifier(directory, schema_identifier, set_of_identifiers));
718
603
session.doGetTableIdentifiers(directory, schema_identifier, set_of_identifiers);
721
class DropTable: public std::unary_function<identifier::Table&, bool>
606
class DropTable: public unary_function<TableIdentifier&, bool>
723
608
Session &session;
724
609
StorageEngine *engine;
739
/* This will later be converted to identifier::Tables */
740
class DropTables: public std::unary_function<StorageEngine *, void>
624
/* This will later be converted to TableIdentifiers */
625
class DropTables: public unary_function<StorageEngine *, void>
742
627
Session &session;
743
identifier::Table::vector &table_identifiers;
628
TableIdentifiers &table_identifiers;
747
DropTables(Session &session_arg, identifier::Table::vector &table_identifiers_arg) :
632
DropTables(Session &session_arg, TableIdentifiers &table_identifiers_arg) :
748
633
session(session_arg),
749
634
table_identifiers(table_identifiers_arg)
754
639
// True returning from DropTable means the table has been successfully
755
640
// 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)),
641
table_identifiers.erase(remove_if(table_identifiers.begin(),
642
table_identifiers.end(),
643
DropTable(session, engine)),
759
644
table_identifiers.end());
797
682
message::Table definition;
798
683
if (StorageEngine::readTableFile(path, definition))
800
identifier::Table identifier(definition.schema(), definition.name(), path);
685
TableIdentifier identifier(definition.schema(), definition.name(), path);
801
686
table_identifiers.push_back(identifier);
805
std::for_each(vector_of_engines.begin(), vector_of_engines.end(),
806
DropTables(session, table_identifiers));
690
for_each(vector_of_engines.begin(), vector_of_engines.end(),
691
DropTables(session, table_identifiers));
809
694
Now we just clean up anything that might left over.
811
696
We rescan because some of what might have been there should
812
697
now be all nice and cleaned up.
814
std::set<std::string> all_exts= set_of_table_definition_ext;
699
set<string> all_exts= set_of_table_definition_ext;
816
701
for (EngineVector::iterator iter= vector_of_engines.begin();
817
702
iter != vector_of_engines.end() ; iter++)
847
732
- table->getShare()->path
850
void StorageEngine::print_error(int error, myf errflag, const Table &table) const
852
drizzled::error_t textno= ER_GET_ERRNO;
735
void StorageEngine::print_error(int error, myf errflag, Table &table)
737
print_error(error, errflag, &table);
740
void StorageEngine::print_error(int error, myf errflag, Table *table)
742
int textno= ER_GET_ERRNO;
855
745
textno=ER_OPEN_AS_READONLY;
894
786
String str(key,sizeof(key),system_charset_info);
896
788
/* Table is opened and defined at this point */
897
key_unpack(&str, &table,(uint32_t) key_nr);
789
key_unpack(&str,table,(uint32_t) key_nr);
898
790
max_length= (DRIZZLE_ERRMSG_SIZE-
899
791
(uint32_t) strlen(ER(ER_FOREIGN_DUPLICATE_KEY)));
900
792
if (str.length() >= max_length)
979
871
textno=ER_TABLE_DEF_CHANGED;
981
873
case HA_ERR_NO_SUCH_TABLE:
983
identifier::Table identifier(table.getShare()->getSchemaName(), table.getShare()->getTableName());
984
my_error(ER_TABLE_UNKNOWN, identifier);
875
my_error(ER_NO_SUCH_TABLE, MYF(0), table->getShare()->getSchemaName(),
876
table->getShare()->getTableName());
987
878
case HA_ERR_RBR_LOGGING_FAILED:
988
879
textno= ER_BINLOG_ROW_LOGGING_FAILED;
990
881
case HA_ERR_DROP_INDEX_FK:
992
884
const char *ptr= "???";
993
uint32_t key_nr= table.get_dup_key(error);
885
uint32_t key_nr= table->get_dup_key(error);
994
886
if ((int) key_nr >= 0)
995
ptr= table.key_info[key_nr].name;
887
ptr= table->key_info[key_nr].name;
996
888
my_error(ER_DROP_INDEX_FK, MYF(0), ptr);
1052
943
Returns true if this is a temporary error
1054
bool StorageEngine::get_error_message(int , String* ) const
945
bool StorageEngine::get_error_message(int , String* )
1060
void StorageEngine::print_keydup_error(uint32_t key_nr, const char *msg, const Table &table) const
951
void StorageEngine::print_keydup_error(uint32_t key_nr, const char *msg, Table &table)
1062
953
/* Write the duplicated key in the error message */
1063
954
char key[MAX_KEY_LENGTH];
1088
int StorageEngine::deleteDefinitionFromPath(const identifier::Table &identifier)
979
int StorageEngine::deleteDefinitionFromPath(const TableIdentifier &identifier)
1090
std::string path(identifier.getPath());
981
string path(identifier.getPath());
1092
983
path.append(DEFAULT_DEFINITION_FILE_EXT);
1094
985
return internal::my_delete(path.c_str(), MYF(0));
1097
int StorageEngine::renameDefinitionFromPath(const identifier::Table &dest, const identifier::Table &src)
988
int StorageEngine::renameDefinitionFromPath(const TableIdentifier &dest, const TableIdentifier &src)
1099
990
message::Table table_message;
1100
std::string src_path(src.getPath());
1101
std::string dest_path(dest.getPath());
991
string src_path(src.getPath());
992
string dest_path(dest.getPath());
1103
994
src_path.append(DEFAULT_DEFINITION_FILE_EXT);
1104
995
dest_path.append(DEFAULT_DEFINITION_FILE_EXT);
1220
1106
@note on success table can be created.
1222
bool StorageEngine::canCreateTable(const identifier::Table &identifier)
1108
bool StorageEngine::canCreateTable(const TableIdentifier &identifier)
1224
1110
EngineVector::iterator iter=
1225
std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
1226
CanCreateTable(identifier));
1111
find_if(vector_of_engines.begin(), vector_of_engines.end(),
1112
CanCreateTable(identifier));
1228
1114
if (iter == vector_of_engines.end())