99
int StorageEngine::renameTable(Session &session, TableIdentifier &from, TableIdentifier &to)
100
int StorageEngine::renameTable(Session &session, const TableIdentifier &from, const TableIdentifier &to)
101
103
setTransactionReadWrite(session);
103
return doRenameTable(session, from, to);
105
if (unlikely(plugin::EventObserver::beforeRenameTable(session, from, to)))
107
error= ER_EVENT_OBSERVER_PLUGIN;
111
error = doRenameTable(session, from, to);
112
if (unlikely(plugin::EventObserver::afterRenameTable(session, from, to, error)))
114
error= ER_EVENT_OBSERVER_PLUGIN;
280
295
class StorageEngineGetTableDefinition: public unary_function<StorageEngine *,bool>
282
297
Session& session;
283
TableIdentifier &identifier;
298
const TableIdentifier &identifier;
284
299
message::Table &table_message;
288
303
StorageEngineGetTableDefinition(Session& session_arg,
289
TableIdentifier &identifier_arg,
304
const TableIdentifier &identifier_arg,
290
305
message::Table &table_message_arg,
292
307
session(session_arg),
308
323
class StorageEngineDoesTableExist: public unary_function<StorageEngine *, bool>
310
325
Session& session;
311
TableIdentifier &identifier;
326
const TableIdentifier &identifier;
314
StorageEngineDoesTableExist(Session& session_arg, TableIdentifier &identifier_arg) :
329
StorageEngineDoesTableExist(Session& session_arg, const TableIdentifier &identifier_arg) :
315
330
session(session_arg),
316
331
identifier(identifier_arg)
326
341
Utility method which hides some of the details of getTableDefinition()
328
343
bool plugin::StorageEngine::doesTableExist(Session &session,
329
TableIdentifier &identifier,
344
const TableIdentifier &identifier,
330
345
bool include_temporary_tables)
332
347
if (include_temporary_tables)
360
375
or any dropped tables that need to be removed from disk
362
377
int StorageEngine::getTableDefinition(Session& session,
363
TableIdentifier &identifier,
378
const TableIdentifier &identifier,
364
379
message::Table &table_message,
365
380
bool include_temporary_tables)
447
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0), identifier.getSQLPath().c_str());
462
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0), const_cast<TableIdentifier &>(identifier).getSQLPath().c_str());
449
464
return ER_CORRUPT_TABLE_DEFINITION;
460
475
int StorageEngine::dropTable(Session& session,
461
476
StorageEngine &engine,
462
TableIdentifier &identifier)
477
const TableIdentifier &identifier)
466
481
engine.setTransactionReadWrite(session);
467
error= engine.doDropTable(session, identifier);
483
if (unlikely(plugin::EventObserver::beforeDropTable(session, identifier)))
485
error= ER_EVENT_OBSERVER_PLUGIN;
489
error= engine.doDropTable(session, identifier);
490
if (unlikely(plugin::EventObserver::afterDropTable(session, identifier, error)))
492
error= ER_EVENT_OBSERVER_PLUGIN;
481
509
int StorageEngine::createTable(Session &session,
482
TableIdentifier &identifier,
483
bool update_create_info,
510
const TableIdentifier &identifier,
484
511
message::Table& table_message)
488
TableShare share(identifier.getSchemaName().c_str(), 0, identifier.getTableName().c_str(), identifier.getPath().c_str());
515
TableShare share(identifier);
489
516
message::Table tmp_proto;
491
if (parse_table_proto(session, table_message, &share) || open_table_from_share(&session, &share, "", 0, 0, &table))
518
if (share.parse_table_proto(session, table_message) || share.open_table_from_share(&session, identifier, "", 0, 0, table))
493
520
// @note Error occured, we should probably do a little more here.
497
if (update_create_info)
498
table.updateCreateInfo(&table_message);
500
524
/* Check for legal operations against the Engine using the proto (if used) */
501
525
if (table_message.type() == message::Table::TEMPORARY &&
502
526
share.storage_engine->check_flag(HTON_BIT_TEMPORARY_NOT_SUPPORTED) == true)
523
my_error(ER_CANT_CREATE_TABLE, MYF(ME_BELL+ME_WAITTANG), identifier.getSQLPath().c_str(), error);
547
my_error(ER_CANT_CREATE_TABLE, MYF(ME_BELL+ME_WAITTANG), const_cast<TableIdentifier &>(identifier).getSQLPath().c_str(), error);
526
table.closefrm(false);
550
table.delete_table();
529
share.free_table_share();
530
553
return(error != 0);
533
Cursor *StorageEngine::getCursor(TableShare &share, memory::Root *alloc)
556
Cursor *StorageEngine::getCursor(TableShare &share)
535
return create(share, alloc);
558
return create(share);
539
public unary_function<StorageEngine *, void>
541
CachedDirectory &directory;
542
SchemaIdentifier &identifier;
543
TableNameList &set_of_names;
547
AddTableName(CachedDirectory &directory_arg, SchemaIdentifier &identifier_arg, set<string>& of_names) :
548
directory(directory_arg),
549
identifier(identifier_arg),
550
set_of_names(of_names)
554
result_type operator() (argument_type engine)
556
engine->doGetTableNames(directory, identifier, set_of_names);
560
561
class AddTableIdentifier :
561
562
public unary_function<StorageEngine *, void>
563
564
CachedDirectory &directory;
564
SchemaIdentifier &identifier;
565
const SchemaIdentifier &identifier;
565
566
TableIdentifiers &set_of_identifiers;
569
AddTableIdentifier(CachedDirectory &directory_arg, SchemaIdentifier &identifier_arg, TableIdentifiers &of_names) :
570
AddTableIdentifier(CachedDirectory &directory_arg, const SchemaIdentifier &identifier_arg, TableIdentifiers &of_names) :
570
571
directory(directory_arg),
571
572
identifier(identifier_arg),
572
573
set_of_identifiers(of_names)
583
584
static SchemaIdentifier INFORMATION_SCHEMA_IDENTIFIER("information_schema");
584
585
static SchemaIdentifier DATA_DICTIONARY_IDENTIFIER("data_dictionary");
586
void StorageEngine::getTableNames(Session &session, SchemaIdentifier &schema_identifier, TableNameList &set_of_names)
588
CachedDirectory directory(schema_identifier.getPath(), set_of_table_definition_ext);
590
if (schema_identifier == INFORMATION_SCHEMA_IDENTIFIER)
592
else if (schema_identifier == DATA_DICTIONARY_IDENTIFIER)
596
if (directory.fail())
598
errno= directory.getError();
600
my_error(ER_BAD_DB_ERROR, MYF(ME_BELL+ME_WAITTANG), schema_identifier.getSQLPath().c_str());
602
my_error(ER_CANT_READ_DIR, MYF(ME_BELL+ME_WAITTANG), directory.getPath(), errno);
607
for_each(vector_of_engines.begin(), vector_of_engines.end(),
608
AddTableName(directory, schema_identifier, set_of_names));
610
session.doGetTableNames(directory, schema_identifier, set_of_names);
613
void StorageEngine::getTableIdentifiers(Session &session, SchemaIdentifier &schema_identifier, TableIdentifiers &set_of_identifiers)
615
CachedDirectory directory(schema_identifier.getPath(), set_of_table_definition_ext);
617
if (schema_identifier == INFORMATION_SCHEMA_IDENTIFIER)
619
else if (schema_identifier == DATA_DICTIONARY_IDENTIFIER)
623
if (directory.fail())
625
errno= directory.getError();
627
my_error(ER_BAD_DB_ERROR, MYF(ME_BELL+ME_WAITTANG), schema_identifier.getSQLPath().c_str());
587
void StorageEngine::getIdentifiers(Session &session, const SchemaIdentifier &schema_identifier, TableIdentifiers &set_of_identifiers)
589
CachedDirectory directory(schema_identifier.getPath(), set_of_table_definition_ext);
591
if (schema_identifier == INFORMATION_SCHEMA_IDENTIFIER)
593
else if (schema_identifier == DATA_DICTIONARY_IDENTIFIER)
597
if (directory.fail())
599
errno= directory.getError();
601
my_error(ER_BAD_DB_ERROR, MYF(ME_BELL+ME_WAITTANG), const_cast<SchemaIdentifier &>(schema_identifier).getSQLPath().c_str());
629
603
my_error(ER_CANT_READ_DIR, MYF(ME_BELL+ME_WAITTANG), directory.getPath(), errno);
637
611
session.doGetTableIdentifiers(directory, schema_identifier, set_of_identifiers);
614
class DropTable: public unary_function<TableIdentifier&, bool>
617
StorageEngine *engine;
621
DropTable(Session &session_arg, StorageEngine *engine_arg) :
622
session(session_arg),
626
result_type operator() (argument_type identifier)
628
return engine->doDropTable(session, identifier) == 0;
640
632
/* This will later be converted to TableIdentifiers */
641
633
class DropTables: public unary_function<StorageEngine *, void>
643
635
Session &session;
644
TableIdentifierList &table_identifiers;
636
TableIdentifiers &table_identifiers;
648
DropTables(Session &session_arg, TableIdentifierList &table_identifiers_arg) :
640
DropTables(Session &session_arg, TableIdentifiers &table_identifiers_arg) :
649
641
session(session_arg),
650
642
table_identifiers(table_identifiers_arg)
653
645
result_type operator() (argument_type engine)
655
for (TableIdentifierList::iterator iter= table_identifiers.begin();
656
iter != table_identifiers.end();
659
int error= engine->doDropTable(session, const_cast<TableIdentifier&>(*iter));
661
// On a return of zero we know we found and deleted the table. So we
662
// remove it from our search.
664
table_identifiers.erase(iter);
647
// True returning from DropTable means the table has been successfully
648
// deleted, so it should be removed from the list of tables to drop
649
table_identifiers.erase(remove_if(table_identifiers.begin(),
650
table_identifiers.end(),
651
DropTable(session, engine)),
652
table_identifiers.end());
674
661
void StorageEngine::removeLostTemporaryTables(Session &session, const char *directory)
676
663
CachedDirectory dir(directory, set_of_table_definition_ext);
677
TableIdentifierList table_identifiers;
664
TableIdentifiers table_identifiers;
788
775
const char *err_msg= ER(ER_DUP_ENTRY_WITH_KEY_NAME);
791
(table->key_info[0].key_part[0].field->flags &
793
&& (current_session)->lex->sql_command == SQLCOM_ALTER_TABLE)
795
err_msg= ER(ER_DUP_ENTRY_AUTOINCREMENT_CASE);
798
777
print_keydup_error(key_nr, err_msg, *table);
801
781
textno=ER_DUP_KEY;
822
802
str.length(max_length-4);
823
803
str.append(STRING_WITH_LEN("..."));
825
my_error(ER_FOREIGN_DUPLICATE_KEY, MYF(0), table->s->table_name.str,
805
my_error(ER_FOREIGN_DUPLICATE_KEY, MYF(0), table->getShare()->getTableName(),
826
806
str.c_ptr(), key_nr+1);
901
881
case HA_ERR_NO_SUCH_TABLE:
903
my_error(ER_NO_SUCH_TABLE, MYF(0), table->s->getSchemaName(),
904
table->s->table_name.str);
883
my_error(ER_NO_SUCH_TABLE, MYF(0), table->getShare()->getSchemaName(),
884
table->getShare()->getTableName());
906
886
case HA_ERR_RBR_LOGGING_FAILED:
907
887
textno= ER_BINLOG_ROW_LOGGING_FAILED;
960
my_error(textno, errflag, table->s->table_name.str, error);
940
my_error(textno, errflag, table->getShare()->getTableName(), error);
1013
993
return internal::my_delete(path.c_str(), MYF(0));
1016
int StorageEngine::renameDefinitionFromPath(TableIdentifier &dest, TableIdentifier &src)
996
int StorageEngine::renameDefinitionFromPath(const TableIdentifier &dest, const TableIdentifier &src)
1018
998
message::Table table_message;
1019
999
string src_path(src.getPath());
1045
int StorageEngine::writeDefinitionFromPath(TableIdentifier &identifier, message::Table &table_message)
1025
int StorageEngine::writeDefinitionFromPath(const TableIdentifier &identifier, message::Table &table_message)
1047
1027
char definition_file_tmp[FN_REFLEN];
1048
1028
string file_name(identifier.getPath());
1062
1042
google::protobuf::io::ZeroCopyOutputStream* output=
1063
1043
new google::protobuf::io::FileOutputStream(fd);
1065
if (not table_message.SerializeToZeroCopyStream(output))
1048
success= table_message.SerializeToZeroCopyStream(output);
1067
1057
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0),
1068
1058
table_message.InitializationErrorString().c_str());
1107
1097
class CanCreateTable: public unary_function<StorageEngine *, bool>
1109
TableIdentifier &identifier;
1099
const TableIdentifier &identifier;
1112
CanCreateTable(TableIdentifier &identifier_arg) :
1102
CanCreateTable(const TableIdentifier &identifier_arg) :
1113
1103
identifier(identifier_arg)
1124
1114
@note on success table can be created.
1126
bool StorageEngine::canCreateTable(drizzled::TableIdentifier &identifier)
1116
bool StorageEngine::canCreateTable(const TableIdentifier &identifier)
1128
1118
EngineVector::iterator iter=
1129
1119
find_if(vector_of_engines.begin(), vector_of_engines.end(),
1144
1134
if (input.good())
1146
if (table_message.ParseFromIstream(&input))
1137
if (table_message.ParseFromIstream(&input))
1144
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0),
1145
table_message.InitializationErrorString().empty() ? "": table_message.InitializationErrorString().c_str());
1151
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0),
1152
table_message.InitializationErrorString().c_str());