226
StorageEngine *StorageEngine::findByName(Session& session, const std::string &predicate)
228
StorageEngine *StorageEngine::findByName(Session& session, const string &predicate)
228
230
if (boost::iequals(predicate, DEFAULT_STRING))
229
231
return session.getDefaultStorageEngine();
231
EngineVector::iterator iter= std::find_if(vector_of_engines.begin(),
232
vector_of_engines.end(),
233
FindEngineByName(predicate));
233
EngineVector::iterator iter= find_if(vector_of_engines.begin(),
234
vector_of_engines.end(),
235
FindEngineByName(predicate));
234
236
if (iter != vector_of_engines.end())
236
238
StorageEngine *engine= *iter;
264
266
void StorageEngine::closeConnection(Session* session)
266
std::for_each(vector_of_engines.begin(), vector_of_engines.end(),
267
StorageEngineCloseConnection(session));
268
for_each(vector_of_engines.begin(), vector_of_engines.end(),
269
StorageEngineCloseConnection(session));
270
272
bool StorageEngine::flushLogs(StorageEngine *engine)
272
274
if (engine == NULL)
274
if (std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
275
std::mem_fun(&StorageEngine::flush_logs))
276
if (find_if(vector_of_engines.begin(), vector_of_engines.end(),
277
mem_fun(&StorageEngine::flush_logs))
276
278
!= vector_of_engines.begin())
287
class StorageEngineGetTableDefinition: public std::unary_function<StorageEngine *,bool>
289
class StorageEngineGetTableDefinition: public unary_function<StorageEngine *,bool>
289
291
Session& session;
290
const identifier::Table &identifier;
292
const TableIdentifier &identifier;
291
293
message::Table &table_message;
292
drizzled::error_t &err;
295
297
StorageEngineGetTableDefinition(Session& session_arg,
296
const identifier::Table &identifier_arg,
298
const TableIdentifier &identifier_arg,
297
299
message::Table &table_message_arg,
298
drizzled::error_t &err_arg) :
299
301
session(session_arg),
300
302
identifier(identifier_arg),
301
303
table_message(table_message_arg),
306
308
int ret= engine->doGetTableDefinition(session, identifier, table_message);
308
310
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);
313
return err == EEXIST || err != ENOENT;
315
class StorageEngineDoesTableExist: public std::unary_function<StorageEngine *, bool>
317
class StorageEngineDoesTableExist: public unary_function<StorageEngine *, bool>
317
319
Session& session;
318
const identifier::Table &identifier;
320
const TableIdentifier &identifier;
321
StorageEngineDoesTableExist(Session& session_arg, const identifier::Table &identifier_arg) :
323
StorageEngineDoesTableExist(Session& session_arg, const TableIdentifier &identifier_arg) :
322
324
session(session_arg),
323
325
identifier(identifier_arg)
367
369
or any dropped tables that need to be removed from disk
369
371
int StorageEngine::getTableDefinition(Session& session,
370
const identifier::Table &identifier,
371
message::table::shared_ptr &table_message,
372
const TableIdentifier &identifier,
373
message::TablePtr &table_message,
372
374
bool include_temporary_tables)
374
drizzled::error_t err= static_cast<drizzled::error_t>(ENOENT);
376
378
if (include_temporary_tables)
378
380
Table *table= session.find_temporary_table(identifier);
381
table_message.reset(new message::Table(*table->getShare()->getTableMessage()));
383
table_message.reset(new message::Table(*table->getShare()->getTableProto()));
386
drizzled::message::table::shared_ptr table_ptr;
388
drizzled::message::TablePtr table_ptr;
387
389
if ((table_ptr= drizzled::message::Cache::singleton().find(identifier)))
389
391
table_message= table_ptr;
392
394
message::Table message;
393
395
EngineVector::iterator iter=
394
std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
395
StorageEngineGetTableDefinition(session, identifier, message, err));
396
find_if(vector_of_engines.begin(), vector_of_engines.end(),
397
StorageEngineGetTableDefinition(session, identifier, message, err));
397
399
if (iter == vector_of_engines.end())
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
411
An interceptor to hijack the text of the error message without
450
412
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)
441
returns ENOENT if the file doesn't exists.
443
int StorageEngine::dropTable(Session& session,
444
const TableIdentifier &identifier)
448
message::TablePtr src_proto;
449
StorageEngine *engine;
451
error_proto= StorageEngine::getTableDefinition(session, identifier, src_proto);
453
if (error_proto == ER_CORRUPT_TABLE_DEFINITION)
455
string error_message;
457
error_message.append(const_cast<TableIdentifier &>(identifier).getSQLPath());
458
error_message.append(" : ");
459
error_message.append(src_proto->InitializationErrorString());
461
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0), error_message.c_str());
463
return ER_CORRUPT_TABLE_DEFINITION;
467
engine= StorageEngine::findByName(session, src_proto->engine().name());
469
engine= StorageEngine::findByName(session, "");
473
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0), const_cast<TableIdentifier &>(identifier).getSQLPath().c_str());
475
return ER_CORRUPT_TABLE_DEFINITION;
478
error= StorageEngine::dropTable(session, *engine, identifier);
480
if (error_proto && error == 0)
486
int StorageEngine::dropTable(Session& session,
487
StorageEngine &engine,
488
const TableIdentifier &identifier)
563
492
engine.setTransactionReadWrite(session);
565
assert(identifier.isTmp());
567
494
if (unlikely(plugin::EventObserver::beforeDropTable(session, identifier)))
600
bool StorageEngine::createTable(Session &session,
601
const identifier::Table &identifier,
602
message::Table& table_message)
521
int StorageEngine::createTable(Session &session,
522
const TableIdentifier &identifier,
523
message::Table& table_message)
604
drizzled::error_t error= EE_OK;
606
526
TableShare share(identifier);
607
527
table::Shell table(share);
608
528
message::Table tmp_proto;
634
549
share.storage_engine->setTransactionReadWrite(session);
636
error= static_cast<drizzled::error_t>(share.storage_engine->doCreateTable(session,
551
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);
559
my_error(ER_CANT_CREATE_TABLE, MYF(ME_BELL+ME_WAITTANG), const_cast<TableIdentifier &>(identifier).getSQLPath().c_str(), error);
653
562
table.delete_table();
656
return(error == EE_OK);
659
568
Cursor *StorageEngine::getCursor(Table &arg)
664
573
class AddTableIdentifier :
665
public std::unary_function<StorageEngine *, void>
574
public unary_function<StorageEngine *, void>
667
576
CachedDirectory &directory;
668
const identifier::Schema &identifier;
669
identifier::Table::vector &set_of_identifiers;
577
const SchemaIdentifier &identifier;
578
TableIdentifiers &set_of_identifiers;
673
AddTableIdentifier(CachedDirectory &directory_arg, const identifier::Schema &identifier_arg, identifier::Table::vector &of_names) :
582
AddTableIdentifier(CachedDirectory &directory_arg, const SchemaIdentifier &identifier_arg, TableIdentifiers &of_names) :
674
583
directory(directory_arg),
675
584
identifier(identifier_arg),
676
585
set_of_identifiers(of_names)
699
611
errno= directory.getError();
700
612
if (errno == ENOENT)
703
schema_identifier.getSQLPath(path);
704
my_error(ER_BAD_DB_ERROR, MYF(ME_BELL+ME_WAITTANG), path.c_str());
613
my_error(ER_BAD_DB_ERROR, MYF(ME_BELL+ME_WAITTANG), const_cast<SchemaIdentifier &>(schema_identifier).getSQLPath().c_str());
708
615
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));
620
for_each(vector_of_engines.begin(), vector_of_engines.end(),
621
AddTableIdentifier(directory, schema_identifier, set_of_identifiers));
718
623
session.doGetTableIdentifiers(directory, schema_identifier, set_of_identifiers);
721
class DropTable: public std::unary_function<identifier::Table&, bool>
626
class DropTable: public unary_function<TableIdentifier&, bool>
723
628
Session &session;
724
629
StorageEngine *engine;
739
/* This will later be converted to identifier::Tables */
740
class DropTables: public std::unary_function<StorageEngine *, void>
644
/* This will later be converted to TableIdentifiers */
645
class DropTables: public unary_function<StorageEngine *, void>
742
647
Session &session;
743
identifier::Table::vector &table_identifiers;
648
TableIdentifiers &table_identifiers;
747
DropTables(Session &session_arg, identifier::Table::vector &table_identifiers_arg) :
652
DropTables(Session &session_arg, TableIdentifiers &table_identifiers_arg) :
748
653
session(session_arg),
749
654
table_identifiers(table_identifiers_arg)
754
659
// True returning from DropTable means the table has been successfully
755
660
// 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)),
661
table_identifiers.erase(remove_if(table_identifiers.begin(),
662
table_identifiers.end(),
663
DropTable(session, engine)),
759
664
table_identifiers.end());
797
702
message::Table definition;
798
703
if (StorageEngine::readTableFile(path, definition))
800
identifier::Table identifier(definition.schema(), definition.name(), path);
705
TableIdentifier identifier(definition.schema(), definition.name(), path);
801
706
table_identifiers.push_back(identifier);
805
std::for_each(vector_of_engines.begin(), vector_of_engines.end(),
806
DropTables(session, table_identifiers));
710
for_each(vector_of_engines.begin(), vector_of_engines.end(),
711
DropTables(session, table_identifiers));
809
714
Now we just clean up anything that might left over.
811
716
We rescan because some of what might have been there should
812
717
now be all nice and cleaned up.
814
std::set<std::string> all_exts= set_of_table_definition_ext;
719
set<string> all_exts= set_of_table_definition_ext;
816
721
for (EngineVector::iterator iter= vector_of_engines.begin();
817
722
iter != vector_of_engines.end() ; iter++)
847
752
- table->getShare()->path
850
void StorageEngine::print_error(int error, myf errflag, const Table &table) const
852
drizzled::error_t textno= ER_GET_ERRNO;
755
void StorageEngine::print_error(int error, myf errflag, Table &table)
757
print_error(error, errflag, &table);
760
void StorageEngine::print_error(int error, myf errflag, Table *table)
762
int textno= ER_GET_ERRNO;
855
765
textno=ER_OPEN_AS_READONLY;
894
806
String str(key,sizeof(key),system_charset_info);
896
808
/* Table is opened and defined at this point */
897
key_unpack(&str, &table,(uint32_t) key_nr);
809
key_unpack(&str,table,(uint32_t) key_nr);
898
810
max_length= (DRIZZLE_ERRMSG_SIZE-
899
811
(uint32_t) strlen(ER(ER_FOREIGN_DUPLICATE_KEY)));
900
812
if (str.length() >= max_length)
979
891
textno=ER_TABLE_DEF_CHANGED;
981
893
case HA_ERR_NO_SUCH_TABLE:
983
identifier::Table identifier(table.getShare()->getSchemaName(), table.getShare()->getTableName());
984
my_error(ER_TABLE_UNKNOWN, identifier);
895
my_error(ER_NO_SUCH_TABLE, MYF(0), table->getShare()->getSchemaName(),
896
table->getShare()->getTableName());
987
898
case HA_ERR_RBR_LOGGING_FAILED:
988
899
textno= ER_BINLOG_ROW_LOGGING_FAILED;
990
901
case HA_ERR_DROP_INDEX_FK:
992
904
const char *ptr= "???";
993
uint32_t key_nr= table.get_dup_key(error);
905
uint32_t key_nr= table->get_dup_key(error);
994
906
if ((int) key_nr >= 0)
995
ptr= table.key_info[key_nr].name;
907
ptr= table->key_info[key_nr].name;
996
908
my_error(ER_DROP_INDEX_FK, MYF(0), ptr);
1052
963
Returns true if this is a temporary error
1054
bool StorageEngine::get_error_message(int , String* ) const
965
bool StorageEngine::get_error_message(int , String* )
1060
void StorageEngine::print_keydup_error(uint32_t key_nr, const char *msg, const Table &table) const
971
void StorageEngine::print_keydup_error(uint32_t key_nr, const char *msg, Table &table)
1062
973
/* Write the duplicated key in the error message */
1063
974
char key[MAX_KEY_LENGTH];
1088
int StorageEngine::deleteDefinitionFromPath(const identifier::Table &identifier)
999
int StorageEngine::deleteDefinitionFromPath(const TableIdentifier &identifier)
1090
std::string path(identifier.getPath());
1001
string path(identifier.getPath());
1092
1003
path.append(DEFAULT_DEFINITION_FILE_EXT);
1094
1005
return internal::my_delete(path.c_str(), MYF(0));
1097
int StorageEngine::renameDefinitionFromPath(const identifier::Table &dest, const identifier::Table &src)
1008
int StorageEngine::renameDefinitionFromPath(const TableIdentifier &dest, const TableIdentifier &src)
1099
1010
message::Table table_message;
1100
std::string src_path(src.getPath());
1101
std::string dest_path(dest.getPath());
1011
string src_path(src.getPath());
1012
string dest_path(dest.getPath());
1103
1014
src_path.append(DEFAULT_DEFINITION_FILE_EXT);
1104
1015
dest_path.append(DEFAULT_DEFINITION_FILE_EXT);
1220
1126
@note on success table can be created.
1222
bool StorageEngine::canCreateTable(const identifier::Table &identifier)
1128
bool StorageEngine::canCreateTable(const TableIdentifier &identifier)
1224
1130
EngineVector::iterator iter=
1225
std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
1226
CanCreateTable(identifier));
1131
find_if(vector_of_engines.begin(), vector_of_engines.end(),
1132
CanCreateTable(identifier));
1228
1134
if (iter == vector_of_engines.end())