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