287
287
class StorageEngineGetTableDefinition: public std::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
315
class StorageEngineDoesTableExist: public std::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,
370
const TableIdentifier &identifier,
371
371
message::table::shared_ptr &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
378
Table *table= session.find_temporary_table(identifier);
381
table_message.reset(new message::Table(*table->getShare()->getTableMessage()));
381
table_message.reset(new message::Table(*table->getShare()->getTableProto()));
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
409
An interceptor to hijack the text of the error message without
450
410
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)
439
returns ENOENT if the file doesn't exists.
441
int StorageEngine::dropTable(Session& session,
442
const TableIdentifier &identifier)
446
message::table::shared_ptr src_proto;
447
StorageEngine *engine;
449
error_proto= StorageEngine::getTableDefinition(session, identifier, src_proto);
451
if (error_proto == ER_CORRUPT_TABLE_DEFINITION)
453
std::string error_message;
454
identifier.getSQLPath(error_message);
456
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0),
457
error_message.c_str(),
458
src_proto->InitializationErrorString().c_str());
460
return ER_CORRUPT_TABLE_DEFINITION;
464
engine= StorageEngine::findByName(session, src_proto->engine().name());
466
engine= StorageEngine::findByName(session, "");
470
std::string error_message;
471
identifier.getSQLPath(error_message);
473
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0), error_message.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;
665
576
public std::unary_function<StorageEngine *, void>
667
578
CachedDirectory &directory;
668
const identifier::Schema &identifier;
669
identifier::Table::vector &set_of_identifiers;
579
const SchemaIdentifier &identifier;
580
TableIdentifier::vector &set_of_identifiers;
673
AddTableIdentifier(CachedDirectory &directory_arg, const identifier::Schema &identifier_arg, identifier::Table::vector &of_names) :
584
AddTableIdentifier(CachedDirectory &directory_arg, const SchemaIdentifier &identifier_arg, TableIdentifier::vector &of_names) :
674
585
directory(directory_arg),
675
586
identifier(identifier_arg),
676
587
set_of_identifiers(of_names)
847
761
- table->getShare()->path
850
void StorageEngine::print_error(int error, myf errflag, const Table &table) const
852
drizzled::error_t textno= ER_GET_ERRNO;
764
void StorageEngine::print_error(int error, myf errflag, Table &table)
766
print_error(error, errflag, &table);
769
void StorageEngine::print_error(int error, myf errflag, Table *table)
771
int textno= ER_GET_ERRNO;
855
774
textno=ER_OPEN_AS_READONLY;
979
900
textno=ER_TABLE_DEF_CHANGED;
981
902
case HA_ERR_NO_SUCH_TABLE:
983
identifier::Table identifier(table.getShare()->getSchemaName(), table.getShare()->getTableName());
984
my_error(ER_TABLE_UNKNOWN, identifier);
904
my_error(ER_NO_SUCH_TABLE, MYF(0), table->getShare()->getSchemaName(),
905
table->getShare()->getTableName());
987
907
case HA_ERR_RBR_LOGGING_FAILED:
988
908
textno= ER_BINLOG_ROW_LOGGING_FAILED;
990
910
case HA_ERR_DROP_INDEX_FK:
992
913
const char *ptr= "???";
993
uint32_t key_nr= table.get_dup_key(error);
914
uint32_t key_nr= table->get_dup_key(error);
994
915
if ((int) key_nr >= 0)
995
ptr= table.key_info[key_nr].name;
916
ptr= table->key_info[key_nr].name;
996
917
my_error(ER_DROP_INDEX_FK, MYF(0), ptr);
1052
972
Returns true if this is a temporary error
1054
bool StorageEngine::get_error_message(int , String* ) const
974
bool StorageEngine::get_error_message(int , String* )
1060
void StorageEngine::print_keydup_error(uint32_t key_nr, const char *msg, const Table &table) const
980
void StorageEngine::print_keydup_error(uint32_t key_nr, const char *msg, Table &table)
1062
982
/* Write the duplicated key in the error message */
1063
983
char key[MAX_KEY_LENGTH];