32
32
#include <google/protobuf/io/zero_copy_stream.h>
33
33
#include <google/protobuf/io/zero_copy_stream_impl.h>
35
#include <drizzled/cached_directory.h>
35
#include "drizzled/cached_directory.h"
37
37
#include <drizzled/definitions.h>
38
38
#include <drizzled/base.h>
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>
104
int StorageEngine::renameTable(Session &session, const identifier::Table &from, const identifier::Table &to)
104
int StorageEngine::renameTable(Session &session, const TableIdentifier &from, const TableIdentifier &to)
107
107
setTransactionReadWrite(session);
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)
333
333
Utility method which hides some of the details of getTableDefinition()
335
335
bool plugin::StorageEngine::doesTableExist(Session &session,
336
const identifier::Table &identifier,
336
const TableIdentifier &identifier,
337
337
bool include_temporary_tables)
339
339
if (include_temporary_tables)
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);
411
417
Ha_delete_table_error_handler() : Internal_error_handler() {}
412
virtual bool handle_error(drizzled::error_t sql_errno,
418
virtual bool handle_error(uint32_t sql_errno,
413
419
const char *message,
414
420
DRIZZLE_ERROR::enum_warning_level level,
415
421
Session *session);
432
438
class DropTableByIdentifier: public std::unary_function<EngineVector::value_type, bool>
434
440
Session::reference session;
435
identifier::Table::const_reference identifier;
441
TableIdentifier::const_reference identifier;
436
442
drizzled::error_t &error;
440
446
DropTableByIdentifier(Session::reference session_arg,
441
identifier::Table::const_reference identifier_arg,
447
TableIdentifier::const_reference identifier_arg,
442
448
drizzled::error_t &error_arg) :
443
449
session(session_arg),
444
450
identifier(identifier_arg),
474
480
bool StorageEngine::dropTable(Session::reference session,
475
identifier::Table::const_reference identifier,
481
TableIdentifier::const_reference identifier,
476
482
drizzled::error_t &error)
511
517
bool StorageEngine::dropTable(Session::reference session,
512
518
StorageEngine &engine,
513
identifier::Table::const_reference identifier,
519
TableIdentifier::const_reference identifier,
514
520
drizzled::error_t &error)
554
bool StorageEngine::createTable(Session &session,
555
const identifier::Table &identifier,
556
message::Table& table_message)
560
int StorageEngine::createTable(Session &session,
561
const TableIdentifier &identifier,
562
message::Table& table_message)
558
drizzled::error_t error= EE_OK;
560
565
TableShare share(identifier);
561
566
table::Shell table(share);
562
567
message::Table tmp_proto;
564
569
if (share.parse_table_proto(session, table_message) || share.open_table_from_share(&session, identifier, "", 0, 0, table))
566
571
// @note Error occured, we should probably do a little more here.
567
// ER_CORRUPT_TABLE_DEFINITION,ER_CORRUPT_TABLE_DEFINITION_ENUM
569
my_error(ER_CORRUPT_TABLE_DEFINITION_UNKNOWN, identifier);
588
588
share.storage_engine->setTransactionReadWrite(session);
590
error= static_cast<drizzled::error_t>(share.storage_engine->doCreateTable(session,
590
error= share.storage_engine->doCreateTable(session,
596
596
if (error == ER_TABLE_PERMISSION_DENIED)
619
619
public std::unary_function<StorageEngine *, void>
621
621
CachedDirectory &directory;
622
const identifier::Schema &identifier;
623
identifier::Table::vector &set_of_identifiers;
622
const SchemaIdentifier &identifier;
623
TableIdentifier::vector &set_of_identifiers;
627
AddTableIdentifier(CachedDirectory &directory_arg, const identifier::Schema &identifier_arg, identifier::Table::vector &of_names) :
627
AddTableIdentifier(CachedDirectory &directory_arg, const SchemaIdentifier &identifier_arg, TableIdentifier::vector &of_names) :
628
628
directory(directory_arg),
629
629
identifier(identifier_arg),
630
630
set_of_identifiers(of_names)
641
void StorageEngine::getIdentifiers(Session &session, const identifier::Schema &schema_identifier, identifier::Table::vector &set_of_identifiers)
641
void StorageEngine::getIdentifiers(Session &session, const SchemaIdentifier &schema_identifier, TableIdentifier::vector &set_of_identifiers)
643
static SchemaIdentifier INFORMATION_SCHEMA_IDENTIFIER("information_schema");
644
static SchemaIdentifier DATA_DICTIONARY_IDENTIFIER("data_dictionary");
643
646
CachedDirectory directory(schema_identifier.getPath(), set_of_table_definition_ext);
645
648
if (schema_identifier == INFORMATION_SCHEMA_IDENTIFIER)
672
675
session.doGetTableIdentifiers(directory, schema_identifier, set_of_identifiers);
675
class DropTable: public std::unary_function<identifier::Table&, bool>
678
class DropTable: public std::unary_function<TableIdentifier&, bool>
677
680
Session &session;
678
681
StorageEngine *engine;
693
/* This will later be converted to identifier::Tables */
696
/* This will later be converted to TableIdentifiers */
694
697
class DropTables: public std::unary_function<StorageEngine *, void>
696
699
Session &session;
697
identifier::Table::vector &table_identifiers;
700
TableIdentifier::vector &table_identifiers;
701
DropTables(Session &session_arg, identifier::Table::vector &table_identifiers_arg) :
704
DropTables(Session &session_arg, TableIdentifier::vector &table_identifiers_arg) :
702
705
session(session_arg),
703
706
table_identifiers(table_identifiers_arg)
722
725
void StorageEngine::removeLostTemporaryTables(Session &session, const char *directory)
724
727
CachedDirectory dir(directory, set_of_table_definition_ext);
725
identifier::Table::vector table_identifiers;
728
TableIdentifier::vector table_identifiers;
751
754
message::Table definition;
752
755
if (StorageEngine::readTableFile(path, definition))
754
identifier::Table identifier(definition.schema(), definition.name(), path);
757
TableIdentifier identifier(definition.schema(), definition.name(), path);
755
758
table_identifiers.push_back(identifier);
801
804
- table->getShare()->path
804
void StorageEngine::print_error(int error, myf errflag, const Table &table) const
807
void StorageEngine::print_error(int error, myf errflag, Table &table)
806
809
drizzled::error_t textno= ER_GET_ERRNO;
933
936
textno=ER_TABLE_DEF_CHANGED;
935
938
case HA_ERR_NO_SUCH_TABLE:
937
identifier::Table identifier(table.getShare()->getSchemaName(), table.getShare()->getTableName());
938
my_error(ER_TABLE_UNKNOWN, identifier);
939
my_error(ER_NO_SUCH_TABLE, MYF(0), table.getShare()->getSchemaName(),
940
table.getShare()->getTableName());
941
942
case HA_ERR_RBR_LOGGING_FAILED:
942
943
textno= ER_BINLOG_ROW_LOGGING_FAILED;
1006
1007
Returns true if this is a temporary error
1008
bool StorageEngine::get_error_message(int , String* ) const
1009
bool StorageEngine::get_error_message(int , String* )
1014
void StorageEngine::print_keydup_error(uint32_t key_nr, const char *msg, const Table &table) const
1015
void StorageEngine::print_keydup_error(uint32_t key_nr, const char *msg, Table &table)
1016
1017
/* Write the duplicated key in the error message */
1017
1018
char key[MAX_KEY_LENGTH];
1048
1049
return internal::my_delete(path.c_str(), MYF(0));
1051
int StorageEngine::renameDefinitionFromPath(const identifier::Table &dest, const identifier::Table &src)
1052
int StorageEngine::renameDefinitionFromPath(const TableIdentifier &dest, const TableIdentifier &src)
1053
1054
message::Table table_message;
1054
1055
std::string src_path(src.getPath());
1080
int StorageEngine::writeDefinitionFromPath(const identifier::Table &identifier, message::Table &table_message)
1081
int StorageEngine::writeDefinitionFromPath(const TableIdentifier &identifier, message::Table &table_message)
1082
1083
char definition_file_tmp[FN_REFLEN];
1083
1084
std::string file_name(identifier.getPath());
1157
1158
class CanCreateTable: public std::unary_function<StorageEngine *, bool>
1159
const identifier::Table &identifier;
1160
const TableIdentifier &identifier;
1162
CanCreateTable(const identifier::Table &identifier_arg) :
1163
CanCreateTable(const TableIdentifier &identifier_arg) :
1163
1164
identifier(identifier_arg)
1174
1175
@note on success table can be created.
1176
bool StorageEngine::canCreateTable(const identifier::Table &identifier)
1177
bool StorageEngine::canCreateTable(const TableIdentifier &identifier)
1178
1179
EngineVector::iterator iter=
1179
1180
std::find_if(vector_of_engines.begin(), vector_of_engines.end(),