43
43
#include <drizzled/gettext.h>
44
44
#include <drizzled/unireg.h>
45
45
#include <drizzled/data_home.h>
46
#include <drizzled/errmsg_print.h>
47
#include <drizzled/xid.h>
48
#include <drizzled/sql_table.h>
49
#include <drizzled/global_charset_info.h>
50
#include <drizzled/charset.h>
51
#include <drizzled/internal/my_sys.h>
46
#include "drizzled/errmsg_print.h"
47
#include "drizzled/xid.h"
48
#include "drizzled/sql_table.h"
49
#include "drizzled/global_charset_info.h"
50
#include "drizzled/charset.h"
51
#include "drizzled/internal/my_sys.h"
52
#include "drizzled/db.h"
53
54
#include <drizzled/table_proto.h>
54
55
#include <drizzled/plugin/event_observer.h>
55
#include <drizzled/internal_error_handler.h>
57
57
#include <drizzled/table/shell.h>
59
#include <drizzled/message/cache.h>
59
#include "drizzled/message/cache.h"
61
61
#include <boost/algorithm/string/compare.hpp>
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)
357
bool plugin::StorageEngine::doDoesTableExist(Session&, const drizzled::identifier::Table&)
357
bool plugin::StorageEngine::doDoesTableExist(Session&, const drizzled::TableIdentifier&)
359
359
std::cerr << " Engine was called for doDoesTableExist() and does not implement it: " << this->getName() << "\n";
364
message::table::shared_ptr StorageEngine::getTableMessage(Session& session,
365
identifier::Table::const_reference identifier,
366
bool include_temporary_tables)
365
Call this function in order to give the Cursor the possiblity
366
to ask engine if there are any new tables that should be written to disk
367
or any dropped tables that need to be removed from disk
369
int StorageEngine::getTableDefinition(Session& session,
370
const TableIdentifier &identifier,
371
message::table::shared_ptr &table_message,
372
bool include_temporary_tables)
368
drizzled::error_t error;
369
error= static_cast<drizzled::error_t>(ENOENT);
371
376
if (include_temporary_tables)
373
378
Table *table= session.find_temporary_table(identifier);
376
return message::table::shared_ptr(new message::Table(*table->getShare()->getTableMessage()));
381
table_message.reset(new message::Table(*table->getShare()->getTableProto()));
380
386
drizzled::message::table::shared_ptr table_ptr;
381
387
if ((table_ptr= drizzled::message::Cache::singleton().find(identifier)))
389
table_message= table_ptr;
386
392
message::Table message;
387
393
EngineVector::iterator iter=
388
394
std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
389
StorageEngineGetTableDefinition(session, identifier, message, error));
395
StorageEngineGetTableDefinition(session, identifier, message, err));
391
397
if (iter == vector_of_engines.end())
393
return message::table::shared_ptr();
395
message::table::shared_ptr table_message(new message::Table(message));
397
drizzled::message::Cache::singleton().insert(identifier, table_message);
399
return table_message;
401
table_message.reset(new message::Table(message));
403
drizzled::message::Cache::singleton().insert(identifier, table_message);
432
class DropTableByIdentifier: public std::unary_function<EngineVector::value_type, bool>
434
Session::reference session;
435
identifier::Table::const_reference identifier;
436
drizzled::error_t &error;
440
DropTableByIdentifier(Session::reference session_arg,
441
identifier::Table::const_reference identifier_arg,
442
drizzled::error_t &error_arg) :
443
session(session_arg),
444
identifier(identifier_arg),
448
result_type operator() (argument_type engine)
450
if (not engine->doDoesTableExist(session, identifier))
453
int local_error= engine->doDropTable(session, identifier);
461
case HA_ERR_NO_SUCH_TABLE:
463
error= static_cast<drizzled::error_t>(HA_ERR_NO_SUCH_TABLE);
467
error= static_cast<drizzled::error_t>(local_error);
474
bool StorageEngine::dropTable(Session::reference session,
475
identifier::Table::const_reference identifier,
476
drizzled::error_t &error)
480
EngineVector::const_iterator iter= std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
481
DropTableByIdentifier(session, identifier, error));
487
else if (iter == vector_of_engines.end())
489
error= ER_BAD_TABLE_ERROR;
493
drizzled::message::Cache::singleton().erase(identifier);
498
bool StorageEngine::dropTable(Session& session,
499
const identifier::Table &identifier)
501
drizzled::error_t error;
503
if (not dropTable(session, identifier, error))
511
bool StorageEngine::dropTable(Session::reference session,
512
StorageEngine &engine,
513
identifier::Table::const_reference identifier,
514
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)
517
492
engine.setTransactionReadWrite(session);
519
assert(identifier.isTmp());
521
494
if (unlikely(plugin::EventObserver::beforeDropTable(session, identifier)))
554
bool StorageEngine::createTable(Session &session,
555
const identifier::Table &identifier,
556
message::Table& table_message)
521
int StorageEngine::createTable(Session &session,
522
const TableIdentifier &identifier,
523
message::Table& table_message)
558
drizzled::error_t error= EE_OK;
560
526
TableShare share(identifier);
561
527
table::Shell table(share);
562
528
message::Table tmp_proto;
619
576
public std::unary_function<StorageEngine *, void>
621
578
CachedDirectory &directory;
622
const identifier::Schema &identifier;
623
identifier::Table::vector &set_of_identifiers;
579
const SchemaIdentifier &identifier;
580
TableIdentifier::vector &set_of_identifiers;
627
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) :
628
585
directory(directory_arg),
629
586
identifier(identifier_arg),
630
587
set_of_identifiers(of_names)
933
900
textno=ER_TABLE_DEF_CHANGED;
935
902
case HA_ERR_NO_SUCH_TABLE:
937
identifier::Table identifier(table.getShare()->getSchemaName(), table.getShare()->getTableName());
938
my_error(ER_TABLE_UNKNOWN, identifier);
904
my_error(ER_NO_SUCH_TABLE, MYF(0), table->getShare()->getSchemaName(),
905
table->getShare()->getTableName());
941
907
case HA_ERR_RBR_LOGGING_FAILED:
942
908
textno= ER_BINLOG_ROW_LOGGING_FAILED;
944
910
case HA_ERR_DROP_INDEX_FK:
946
913
const char *ptr= "???";
947
uint32_t key_nr= table.get_dup_key(error);
914
uint32_t key_nr= table->get_dup_key(error);
948
915
if ((int) key_nr >= 0)
949
ptr= table.key_info[key_nr].name;
916
ptr= table->key_info[key_nr].name;
950
917
my_error(ER_DROP_INDEX_FK, MYF(0), ptr);
1006
972
Returns true if this is a temporary error
1008
bool StorageEngine::get_error_message(int , String* ) const
974
bool StorageEngine::get_error_message(int , String* )
1014
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)
1016
982
/* Write the duplicated key in the error message */
1017
983
char key[MAX_KEY_LENGTH];