43
42
#include <drizzled/gettext.h>
44
43
#include <drizzled/unireg.h>
45
44
#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"
52
#include "drizzled/db.h"
45
#include <drizzled/errmsg_print.h>
46
#include <drizzled/xid.h>
47
#include <drizzled/sql_table.h>
48
#include <drizzled/global_charset_info.h>
49
#include <drizzled/charset.h>
50
#include <drizzled/internal/my_sys.h>
54
51
#include <drizzled/table_proto.h>
55
52
#include <drizzled/plugin/event_observer.h>
53
#include <drizzled/internal_error_handler.h>
57
54
#include <drizzled/table/shell.h>
59
#include "drizzled/message/cache.h"
55
#include <drizzled/message/cache.h>
56
#include <drizzled/key.h>
61
58
#include <boost/algorithm/string/compare.hpp>
287
284
class StorageEngineGetTableDefinition: public std::unary_function<StorageEngine *,bool>
289
286
Session& session;
290
const TableIdentifier &identifier;
287
const identifier::Table &identifier;
291
288
message::Table &table_message;
289
drizzled::error_t &err;
295
292
StorageEngineGetTableDefinition(Session& session_arg,
296
const TableIdentifier &identifier_arg,
293
const identifier::Table &identifier_arg,
297
294
message::Table &table_message_arg,
295
drizzled::error_t &err_arg) :
299
296
session(session_arg),
300
297
identifier(identifier_arg),
301
298
table_message(table_message_arg),
306
303
int ret= engine->doGetTableDefinition(session, identifier, table_message);
308
305
if (ret != ENOENT)
306
err= static_cast<drizzled::error_t>(ret);
311
return err == EEXIST || err != ENOENT;
308
return err == static_cast<drizzled::error_t>(EEXIST) or err != static_cast<drizzled::error_t>(ENOENT);
315
312
class StorageEngineDoesTableExist: public std::unary_function<StorageEngine *, bool>
317
314
Session& session;
318
const TableIdentifier &identifier;
315
const identifier::Table &identifier;
321
StorageEngineDoesTableExist(Session& session_arg, const TableIdentifier &identifier_arg) :
318
StorageEngineDoesTableExist(Session& session_arg, const identifier::Table &identifier_arg) :
322
319
session(session_arg),
323
320
identifier(identifier_arg)
357
bool plugin::StorageEngine::doDoesTableExist(Session&, const drizzled::TableIdentifier&)
354
bool plugin::StorageEngine::doDoesTableExist(Session&, const drizzled::identifier::Table&)
359
356
std::cerr << " Engine was called for doDoesTableExist() and does not implement it: " << this->getName() << "\n";
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)
361
message::table::shared_ptr StorageEngine::getTableMessage(Session& session,
362
identifier::Table::const_reference identifier,
363
bool include_temporary_tables)
365
drizzled::error_t error;
366
error= static_cast<drizzled::error_t>(ENOENT);
376
368
if (include_temporary_tables)
378
370
Table *table= session.find_temporary_table(identifier);
381
table_message.reset(new message::Table(*table->getShare()->getTableProto()));
373
return message::table::shared_ptr(new message::Table(*table->getShare()->getTableMessage()));
386
377
drizzled::message::table::shared_ptr table_ptr;
387
378
if ((table_ptr= drizzled::message::Cache::singleton().find(identifier)))
389
table_message= table_ptr;
392
383
message::Table message;
393
384
EngineVector::iterator iter=
394
385
std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
395
StorageEngineGetTableDefinition(session, identifier, message, err));
386
StorageEngineGetTableDefinition(session, identifier, message, error));
397
388
if (iter == vector_of_engines.end())
390
return message::table::shared_ptr();
401
table_message.reset(new message::Table(message));
403
drizzled::message::Cache::singleton().insert(identifier, table_message);
392
message::table::shared_ptr table_message(new message::Table(message));
394
drizzled::message::Cache::singleton().insert(identifier, table_message);
396
return table_message;
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
error_message.append(" : ");
457
error_message.append(src_proto->InitializationErrorString());
459
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0), error_message.c_str());
461
return ER_CORRUPT_TABLE_DEFINITION;
465
engine= StorageEngine::findByName(session, src_proto->engine().name());
467
engine= StorageEngine::findByName(session, "");
471
std::string error_message;
472
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)
429
class DropTableByIdentifier: public std::unary_function<EngineVector::value_type, bool>
431
Session::reference session;
432
identifier::Table::const_reference identifier;
433
drizzled::error_t &error;
437
DropTableByIdentifier(Session::reference session_arg,
438
identifier::Table::const_reference identifier_arg,
439
drizzled::error_t &error_arg) :
440
session(session_arg),
441
identifier(identifier_arg),
445
result_type operator() (argument_type engine)
447
if (not engine->doDoesTableExist(session, identifier))
450
int local_error= engine->doDropTable(session, identifier);
458
case HA_ERR_NO_SUCH_TABLE:
460
error= static_cast<drizzled::error_t>(HA_ERR_NO_SUCH_TABLE);
464
error= static_cast<drizzled::error_t>(local_error);
471
bool StorageEngine::dropTable(Session::reference session,
472
identifier::Table::const_reference identifier,
473
drizzled::error_t &error)
477
EngineVector::const_iterator iter= std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
478
DropTableByIdentifier(session, identifier, error));
484
else if (iter == vector_of_engines.end())
486
error= ER_BAD_TABLE_ERROR;
490
drizzled::message::Cache::singleton().erase(identifier);
495
bool StorageEngine::dropTable(Session& session,
496
const identifier::Table &identifier)
498
drizzled::error_t error;
500
if (not dropTable(session, identifier, error))
508
bool StorageEngine::dropTable(Session::reference session,
509
StorageEngine &engine,
510
identifier::Table::const_reference identifier,
511
drizzled::error_t &error)
492
514
engine.setTransactionReadWrite(session);
516
assert(identifier.isTmp());
494
518
if (unlikely(plugin::EventObserver::beforeDropTable(session, identifier)))
521
int StorageEngine::createTable(Session &session,
522
const TableIdentifier &identifier,
523
message::Table& table_message)
551
bool StorageEngine::createTable(Session &session,
552
const identifier::Table &identifier,
553
message::Table& table_message)
555
drizzled::error_t error= EE_OK;
526
557
TableShare share(identifier);
527
558
table::Shell table(share);
528
559
message::Table tmp_proto;
576
616
public std::unary_function<StorageEngine *, void>
578
618
CachedDirectory &directory;
579
const SchemaIdentifier &identifier;
580
TableIdentifier::vector &set_of_identifiers;
619
const identifier::Schema &identifier;
620
identifier::Table::vector &set_of_identifiers;
584
AddTableIdentifier(CachedDirectory &directory_arg, const SchemaIdentifier &identifier_arg, TableIdentifier::vector &of_names) :
624
AddTableIdentifier(CachedDirectory &directory_arg, const identifier::Schema &identifier_arg, identifier::Table::vector &of_names) :
585
625
directory(directory_arg),
586
626
identifier(identifier_arg),
587
627
set_of_identifiers(of_names)
761
798
- table->getShare()->path
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;
801
void StorageEngine::print_error(int error, myf errflag, const Table &table) const
803
drizzled::error_t textno= ER_GET_ERRNO;
774
806
textno=ER_OPEN_AS_READONLY;
900
930
textno=ER_TABLE_DEF_CHANGED;
902
932
case HA_ERR_NO_SUCH_TABLE:
904
my_error(ER_NO_SUCH_TABLE, MYF(0), table->getShare()->getSchemaName(),
905
table->getShare()->getTableName());
934
identifier::Table identifier(table.getShare()->getSchemaName(), table.getShare()->getTableName());
935
my_error(ER_TABLE_UNKNOWN, identifier);
907
938
case HA_ERR_RBR_LOGGING_FAILED:
908
939
textno= ER_BINLOG_ROW_LOGGING_FAILED;
910
941
case HA_ERR_DROP_INDEX_FK:
913
943
const char *ptr= "???";
914
uint32_t key_nr= table->get_dup_key(error);
944
uint32_t key_nr= table.get_dup_key(error);
915
945
if ((int) key_nr >= 0)
916
ptr= table->key_info[key_nr].name;
946
ptr= table.key_info[key_nr].name;
917
947
my_error(ER_DROP_INDEX_FK, MYF(0), ptr);
972
1003
Returns true if this is a temporary error
974
bool StorageEngine::get_error_message(int , String* )
1005
bool StorageEngine::get_error_message(int , String* ) const
980
void StorageEngine::print_keydup_error(uint32_t key_nr, const char *msg, Table &table)
1011
void StorageEngine::print_keydup_error(uint32_t key_nr, const char *msg, const Table &table) const
982
1013
/* Write the duplicated key in the error message */
983
1014
char key[MAX_KEY_LENGTH];