47
47
#include "drizzled/xid.h"
48
48
#include "drizzled/sql_table.h"
49
49
#include "drizzled/global_charset_info.h"
50
#include "drizzled/plugin/authorization.h"
50
51
#include "drizzled/charset.h"
51
52
#include "drizzled/internal/my_sys.h"
52
53
#include "drizzled/db.h"
318
319
const char *db_arg,
319
320
const char *table_name_arg,
320
321
const bool is_tmp_arg,
321
message::Table *table_proto_arg,
322
message::Table *table_message_arg,
323
324
session(session_arg),
326
327
table_name(table_name_arg),
327
328
is_tmp(is_tmp_arg),
328
table_proto(table_proto_arg),
329
table_message(table_message_arg),
331
332
result_type operator() (argument_type engine)
362
363
int StorageEngine::getTableDefinition(Session& session,
363
364
TableIdentifier &identifier,
364
message::Table *table_proto,
365
message::Table *table_message,
365
366
bool include_temporary_tables)
367
368
return getTableDefinition(session,
368
369
identifier.getPath(), identifier.getDBName(), identifier.getTableName(), identifier.isTmp(),
369
table_proto, include_temporary_tables);
370
table_message, include_temporary_tables);
372
373
int StorageEngine::getTableDefinition(Session& session,
374
375
const char *schema_name,
375
376
const char *table_name,
377
message::Table *table_proto,
378
message::Table *table_message,
378
379
bool include_temporary_tables)
382
383
if (include_temporary_tables)
384
if (session.doGetTableDefinition(path, schema_name, table_name, false, table_proto) == EEXIST)
385
if (session.doGetTableDefinition(path, schema_name, table_name, false, table_message) == EEXIST)
388
389
EngineVector::iterator iter=
389
390
find_if(vector_of_engines.begin(), vector_of_engines.end(),
390
StorageEngineGetTableDefinition(session, path, NULL, NULL, true, table_proto, &err));
391
StorageEngineGetTableDefinition(session, path, NULL, NULL, true, table_message, &err));
392
393
if (iter == vector_of_engines.end())
514
515
@todo refactor to remove goto
516
517
int StorageEngine::createTable(Session& session,
517
TableIdentifier &identifier,
518
bool update_create_info,
519
message::Table& table_proto, bool proto_used)
518
TableIdentifier &identifier,
519
bool update_create_info,
520
message::Table& table_message)
523
524
TableShare share(identifier.getDBName(), 0, identifier.getTableName(), identifier.getPath());
524
525
message::Table tmp_proto;
528
if (parse_table_proto(session, table_proto, &share))
533
if (open_table_def(session, &share))
527
if (parse_table_proto(session, table_message, &share))
537
530
if (open_table_from_share(&session, &share, "", 0, 0,
541
534
if (update_create_info)
542
table.updateCreateInfo(&table_proto);
535
table.updateCreateInfo(&table_message);
544
537
/* Check for legal operations against the Engine using the proto (if used) */
547
if (table_proto.type() == message::Table::TEMPORARY &&
548
share.storage_engine->check_flag(HTON_BIT_TEMPORARY_NOT_SUPPORTED) == true)
550
error= HA_ERR_UNSUPPORTED;
553
else if (table_proto.type() != message::Table::TEMPORARY &&
554
share.storage_engine->check_flag(HTON_BIT_TEMPORARY_ONLY) == true)
556
error= HA_ERR_UNSUPPORTED;
538
if (table_message.type() == message::Table::TEMPORARY &&
539
share.storage_engine->check_flag(HTON_BIT_TEMPORARY_NOT_SUPPORTED) == true)
541
error= HA_ERR_UNSUPPORTED;
544
else if (table_message.type() != message::Table::TEMPORARY &&
545
share.storage_engine->check_flag(HTON_BIT_TEMPORARY_ONLY) == true)
547
error= HA_ERR_UNSUPPORTED;
565
555
table_name_arg= share.storage_engine->checkLowercaseNames(identifier.getPath(), name_buff);
557
if (not share.storage_engine->check_flag(HTON_BIT_HAS_DATA_DICTIONARY))
559
int protoerr= StorageEngine::writeDefinitionFromPath(identifier, table_message);
567
568
share.storage_engine->setTransactionReadWrite(session);
569
570
error= share.storage_engine->doCreateTable(&session,
579
if (not share.storage_engine->check_flag(HTON_BIT_HAS_DATA_DICTIONARY))
580
plugin::StorageEngine::deleteDefinitionFromPath(identifier);
582
my_error(ER_CANT_CREATE_TABLE, MYF(ME_BELL+ME_WAITTANG), identifier.getSQLPath().c_str(), error);
576
585
table.closefrm(false);
580
char name_buff[FN_REFLEN];
581
sprintf(name_buff,"%s.%s", identifier.getDBName(), identifier.getTableName());
582
my_error(ER_CANT_CREATE_TABLE, MYF(ME_BELL+ME_WAITTANG), name_buff, error);
585
588
share.free_table_share();
586
589
return(error != 0);
642
645
// Add hook here for engines to register schema.
643
646
for_each(vector_of_schema_engines.begin(), vector_of_schema_engines.end(),
644
647
AddSchemaNames(set_of_names));
649
plugin::Authorization::pruneSchemaNames(current_session->getSecurityContext(),
647
653
class StorageEngineGetSchemaDefinition: public unary_function<StorageEngine *, bool>
1230
1236
return internal::my_rename(src_path.c_str(), dest_path.c_str(), MYF(MY_WME));
1233
int StorageEngine::writeDefinitionFromPath(TableIdentifier &identifier, message::Table &table_proto)
1239
int StorageEngine::writeDefinitionFromPath(TableIdentifier &identifier, message::Table &table_message)
1235
1241
string file_name(identifier.getPath());
1244
1250
google::protobuf::io::ZeroCopyOutputStream* output=
1245
1251
new google::protobuf::io::FileOutputStream(fd);
1247
if (table_proto.SerializeToZeroCopyStream(output) == false)
1253
if (table_message.SerializeToZeroCopyStream(output) == false)
1265
class CanCreateTable: public unary_function<StorageEngine *, bool>
1267
const TableIdentifier &identifier;
1270
CanCreateTable(const TableIdentifier &identifier_arg) :
1271
identifier(identifier_arg)
1274
result_type operator() (argument_type engine)
1276
return not engine->doCanCreateTable(identifier);
1282
@note on success table can be created.
1284
bool StorageEngine::canCreateTable(drizzled::TableIdentifier &identifier)
1286
EngineVector::iterator iter=
1287
find_if(vector_of_engines.begin(), vector_of_engines.end(),
1288
CanCreateTable(identifier));
1290
if (iter == vector_of_engines.end())
1259
1298
} /* namespace plugin */
1260
1299
} /* namespace drizzled */