21
21
* @file Implementation of the Session class and API
26
#include <drizzled/copy_field.h>
27
#include <drizzled/data_home.h>
28
#include <drizzled/display.h>
29
#include <drizzled/drizzled.h>
25
#include <drizzled/session.h>
26
#include "drizzled/session_list.h"
30
28
#include <drizzled/error.h>
31
29
#include <drizzled/gettext.h>
32
#include <drizzled/identifier.h>
33
#include <drizzled/internal/iocache.h>
34
#include <drizzled/internal/thread_var.h>
35
#include <drizzled/internal_error_handler.h>
30
#include <drizzled/query_id.h>
31
#include <drizzled/data_home.h>
32
#include <drizzled/sql_base.h>
33
#include <drizzled/lock.h>
36
34
#include <drizzled/item/cache.h>
37
#include <drizzled/item/empty_string.h>
38
35
#include <drizzled/item/float.h>
39
36
#include <drizzled/item/return_int.h>
40
#include <drizzled/lock.h>
41
#include <drizzled/plugin/authentication.h>
37
#include <drizzled/item/empty_string.h>
38
#include <drizzled/show.h>
42
39
#include <drizzled/plugin/client.h>
43
#include <drizzled/plugin/event_observer.h>
44
#include <drizzled/plugin/logging.h>
45
#include <drizzled/plugin/query_rewrite.h>
46
#include <drizzled/plugin/scheduler.h>
47
#include <drizzled/plugin/transactional_storage_engine.h>
48
#include <drizzled/probes.h>
49
#include <drizzled/pthread_globals.h>
50
#include <drizzled/query_id.h>
51
#include <drizzled/refresh_version.h>
52
#include <drizzled/select_dump.h>
53
#include <drizzled/select_exists_subselect.h>
54
#include <drizzled/select_export.h>
55
#include <drizzled/select_max_min_finder_subselect.h>
56
#include <drizzled/select_singlerow_subselect.h>
57
#include <drizzled/select_subselect.h>
58
#include <drizzled/select_to_file.h>
59
#include <drizzled/session.h>
60
#include <drizzled/session/cache.h>
61
#include <drizzled/show.h>
62
#include <drizzled/sql_base.h>
63
#include <drizzled/table/singular.h>
64
#include <drizzled/table_proto.h>
65
#include <drizzled/tmp_table_param.h>
66
#include <drizzled/transaction_services.h>
67
#include <drizzled/user_var_entry.h>
68
#include <drizzled/util/functors.h>
69
#include <plugin/myisam/myisam.h>
40
#include "drizzled/plugin/scheduler.h"
41
#include "drizzled/plugin/authentication.h"
42
#include "drizzled/plugin/logging.h"
43
#include "drizzled/plugin/transactional_storage_engine.h"
44
#include "drizzled/probes.h"
45
#include "drizzled/table_proto.h"
46
#include "drizzled/db.h"
47
#include "drizzled/pthread_globals.h"
48
#include "drizzled/transaction_services.h"
49
#include "drizzled/drizzled.h"
51
#include "drizzled/table/instance.h"
53
#include "plugin/myisam/myisam.h"
54
#include "drizzled/internal/iocache.h"
55
#include "drizzled/internal/thread_var.h"
56
#include "drizzled/plugin/event_observer.h"
58
#include "drizzled/util/functors.h"
71
61
#include <algorithm>
76
#include <boost/filesystem.hpp>
77
#include <boost/checked_delete.hpp>
79
#include <drizzled/util/backtrace.h>
81
#include <drizzled/schema.h>
63
#include "boost/filesystem.hpp"
83
65
using namespace std;
108
int session_tablespace_op(const Session *session)
110
return test(session->tablespace_op);
114
Set the process info field of the Session structure.
116
This function is used by plug-ins. Internally, the
117
Session::set_proc_info() function should be used.
119
@see Session::set_proc_info
121
void set_session_proc_info(Session *session, const char *info)
123
session->set_proc_info(info);
126
const char *get_session_proc_info(Session *session)
128
return session->get_proc_info();
126
131
void **Session::getEngineData(const plugin::MonitoredInTransaction *monitored)
128
133
return static_cast<void **>(&ha_data[monitored->getId()].ha_ptr);
139
144
return session->options & test_options;
142
Session::Session(plugin::Client *client_arg, catalog::Instance::shared_ptr catalog_arg) :
147
int session_sql_command(const Session *session)
149
return (int) session->lex->sql_command;
152
enum_tx_isolation session_tx_isolation(const Session *session)
154
return (enum_tx_isolation)session->variables.tx_isolation;
157
Session::Session(plugin::Client *client_arg) :
143
158
Open_tables_state(refresh_version),
144
159
mem_root(&main_mem_root),
147
query(new std::string),
148
_schema(new std::string("")),
149
162
client(client_arg),
151
164
scheduler_arg(NULL),
152
165
lock_id(&main_lock_id),
154
security_ctx(identifier::User::make_shared()),
155
_where(Session::DEFAULT_WHERE),
156
dbug_sentry(Session_SENTRY_MAGIC),
158
command(COM_CONNECT),
160
_epoch(boost::gregorian::date(1970,1,1)),
161
_connect_time(boost::posix_time::microsec_clock::universal_time()),
163
167
ha_data(plugin::num_trx_monitored_objects),
166
concurrent_execute_allowed(true),
167
168
arg_of_last_insert_id_function(false),
168
169
first_successful_insert_id_in_prev_stmt(0),
169
170
first_successful_insert_id_in_cur_stmt(0),
170
171
limit_found_rows(0),
171
options(session_startup_options),
174
examined_row_count(0),
178
statement_id_counter(0),
182
_global_read_lock(NONE),
183
count_cuted_fields(CHECK_FIELD_ERROR_FOR_NULL),
185
173
some_tables_deleted(false),
186
174
no_errors(false),
188
176
is_fatal_error(false),
189
177
transaction_rollback_request(false),
190
178
is_fatal_sub_stmt_error(0),
179
derived_tables_processing(false),
191
180
tablespace_op(false),
192
derived_tables_processing(false),
195
183
transaction_message(NULL),
196
184
statement_message(NULL),
197
185
session_event_observers(NULL),
198
_catalog(catalog_arg),
188
memset(process_list_info, 0, PROCESS_LIST_WIDTH);
201
189
client->setSession(this);
360
367
this->checkSentry();
362
if (client and client->isConnected())
369
if (client->isConnected())
364
assert(security_ctx);
365
371
if (global_system_variables.log_warnings)
367
errmsg_printf(error::WARN, ER(ER_FORCING_CLOSE),
368
internal::my_progname,
370
security_ctx->username().c_str());
372
errmsg_printf(ERRMSG_LVL_WARN, ER(ER_FORCING_CLOSE),internal::my_progname,
374
(getSecurityContext().getUser().c_str() ?
375
getSecurityContext().getUser().c_str() : ""));
376
disconnect(0, false);
376
379
/* Close connection */
380
boost::checked_delete(client);
384
383
if (cleanup_done == false)
398
397
plugin::Logging::postEndDo(this);
399
398
plugin::EventObserver::deregisterSessionEvents(*this);
402
void Session::setClient(plugin::Client *client_arg)
405
client->setSession(this);
408
void Session::awake(Session::killed_state_t state_to_set)
410
if ((state_to_set == Session::KILL_QUERY) and (command == COM_SLEEP))
400
for (PropertyMap::iterator iter= life_properties.begin(); iter != life_properties.end(); iter++)
402
delete (*iter).second;
404
life_properties.clear();
406
/* Ensure that no one is using Session */
407
LOCK_delete.unlock();
410
void Session::awake(Session::killed_state state_to_set)
413
412
this->checkSentry();
415
setKilled(state_to_set);
416
scheduler->killSession(this);
413
safe_mutex_assert_owner(&LOCK_delete);
415
killed= state_to_set;
418
416
if (state_to_set != Session::KILL_QUERY)
418
scheduler->killSession(this);
420
419
DRIZZLE_CONNECTION_DONE(thread_id);
425
423
boost_unique_lock_t scopedLock(mysys_var->mutex);
527
525
if (initGlobals() || authenticate())
533
531
prepareForQueries();
535
while (not client->haveError() && getKilled() != KILL_CONNECTION)
533
while (! client->haveError() && killed != KILL_CONNECTION)
537
if (not executeStatement())
535
if (! executeStatement())
544
bool Session::schedule(Session::shared_ptr &arg)
542
bool Session::schedule()
546
arg->scheduler= plugin::Scheduler::getScheduler();
547
assert(arg->scheduler);
551
long current_connections= connection_count;
553
if (current_connections > 0 and static_cast<uint64_t>(current_connections) > current_global_counters.max_used_connections)
544
scheduler= plugin::Scheduler::getScheduler();
547
connection_count.increment();
549
if (connection_count > current_global_counters.max_used_connections)
555
current_global_counters.max_used_connections= static_cast<uint64_t>(connection_count);
551
current_global_counters.max_used_connections= connection_count;
558
554
current_global_counters.connections++;
559
arg->thread_id= arg->variables.pseudo_thread_id= global_thread_id++;
561
session::Cache::singleton().insert(arg);
563
if (unlikely(plugin::EventObserver::connectSession(*arg)))
565
// We should do something about an error...
568
if (plugin::Scheduler::getScheduler()->addSession(arg))
570
DRIZZLE_CONNECTION_START(arg->getSessionId());
555
thread_id= variables.pseudo_thread_id= global_thread_id++;
558
boost::mutex::scoped_lock scoped(LOCK_thread_count);
559
getSessionList().push_back(this);
562
if (unlikely(plugin::EventObserver::connectSession(*this)))
564
// We should do something about an error...
567
if (unlikely(plugin::EventObserver::connectSession(*this)))
569
// We should do something about an error...
572
if (scheduler->addSession(this))
574
DRIZZLE_CONNECTION_START(thread_id);
571
575
char error_message_buff[DRIZZLE_ERRMSG_SIZE];
573
arg->setKilled(Session::KILL_CONNECTION);
577
killed= Session::KILL_CONNECTION;
575
arg->status_var.aborted_connects++;
579
status_var.aborted_connects++;
577
581
/* Can't use my_error() since store_globals has not been called. */
578
582
/* TODO replace will better error message */
579
583
snprintf(error_message_buff, sizeof(error_message_buff),
580
584
ER(ER_CANT_CREATE_THREAD), 1);
581
arg->client->sendError(ER_CANT_CREATE_THREAD, error_message_buff);
585
client->sendError(ER_CANT_CREATE_THREAD, error_message_buff);
677
673
main_da.reset_diagnostics_area();
679
675
if (client->readCommand(&l_packet, &packet_length) == false)
684
if (getKilled() == KILL_CONNECTION)
678
if (killed == KILL_CONNECTION)
687
681
if (packet_length == 0)
690
l_command= static_cast<enum_server_command>(l_packet[0]);
684
l_command= (enum enum_server_command) (unsigned char) l_packet[0];
692
686
if (command >= COM_END)
693
687
command= COM_END; // Wrong command
695
689
assert(packet_length);
696
return not dispatch_command(l_command, this, l_packet+1, (uint32_t) (packet_length-1));
690
return ! dispatch_command(l_command, this, l_packet+1, (uint32_t) (packet_length-1));
699
693
bool Session::readAndStoreQuery(const char *in_packet, uint32_t in_packet_length)
705
699
in_packet_length--;
707
701
const char *pos= in_packet + in_packet_length; /* Point at end null */
708
while (in_packet_length > 0 && (pos[-1] == ';' || my_isspace(charset() ,pos[-1])))
702
while (in_packet_length > 0 &&
703
(pos[-1] == ';' || my_isspace(charset() ,pos[-1])))
711
706
in_packet_length--;
714
std::string *new_query= new std::string(in_packet, in_packet + in_packet_length);
715
// We can not be entirely sure _schema has a value
718
plugin::QueryRewriter::rewriteQuery(*_schema, *new_query);
720
query.reset(new_query);
721
_state.reset(new session::State(in_packet, in_packet_length));
709
query.assign(in_packet, in_packet + in_packet_length);
1067
1052
if ((file= internal::my_create(target_path.file_string().c_str(), 0666, O_WRONLY|O_EXCL, MYF(MY_WME))) < 0)
1069
1054
(void) fchmod(file, 0666); // Because of umask()
1070
if (cache->init_io_cache(file, 0L, internal::WRITE_CACHE, 0L, 1, MYF(MY_WME)))
1055
if (init_io_cache(cache, file, 0L, internal::WRITE_CACHE, 0L, 1, MYF(MY_WME)))
1072
1057
internal::my_close(file, MYF(0));
1073
1058
internal::my_delete(target_path.file_string().c_str(), MYF(0)); // Delete file on error, it was just created
1300
1283
for (; length > sizeof(space) ; length-=sizeof(space))
1302
1285
if (my_b_write(cache,(unsigned char*) space,sizeof(space)))
1305
1288
if (my_b_write(cache,(unsigned char*) space,length))
1309
1292
if (res && enclosed)
1311
1294
if (my_b_write(cache, (unsigned char*) exchange->enclosed->ptr(),
1312
1295
exchange->enclosed->length()))
1315
1298
if (--items_left)
1317
1300
if (my_b_write(cache, (unsigned char*) exchange->field_term->ptr(),
1318
1301
field_term_length))
1322
1305
if (my_b_write(cache,(unsigned char*) exchange->line_term->ptr(),
1323
1306
exchange->line_term->length()))
1485
1467
bool select_max_min_finder_subselect::cmp_decimal()
1487
1469
Item *maxmin= ((Item_singlerow_subselect *)item)->element_index(0);
1488
type::Decimal cval, *cvalue= cache->val_decimal(&cval);
1489
type::Decimal mval, *mvalue= maxmin->val_decimal(&mval);
1470
my_decimal cval, *cvalue= cache->val_decimal(&cval);
1471
my_decimal mval, *mvalue= maxmin->val_decimal(&mval);
1491
1473
return (cache->null_value && !maxmin->null_value) ||
1492
1474
(!cache->null_value && !maxmin->null_value &&
1493
class_decimal_cmp(cvalue, mvalue) > 0) ;
1475
my_decimal_cmp(cvalue, mvalue) > 0) ;
1494
1476
return (maxmin->null_value && !cache->null_value) ||
1495
1477
(!cache->null_value && !maxmin->null_value &&
1496
class_decimal_cmp(cvalue,mvalue) < 0);
1478
my_decimal_cmp(cvalue,mvalue) < 0);
1499
1481
bool select_max_min_finder_subselect::cmp_str()
1535
1517
void Session::end_statement()
1537
1519
/* Cleanup SQL processing state to reuse this statement in next query. */
1539
1521
query_cache_key= ""; // reset the cache key
1540
1522
resetResultsetMessage();
1543
1525
bool Session::copy_db_to(char **p_db, size_t *p_db_length)
1546
if (_schema and _schema->empty())
1548
my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
1551
else if (not _schema)
1553
my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
1558
*p_db= strmake(_schema->c_str(), _schema->size());
1559
*p_db_length= _schema->size();
1529
my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
1532
*p_db= strmake(db.c_str(), db.length());
1533
*p_db_length= db.length();
1600
void Session::set_db(const std::string &new_db)
1573
bool Session::set_db(const std::string &new_db)
1602
1575
/* Do not reallocate memory if current chunk is big enough. */
1603
1576
if (new_db.length())
1605
_schema.reset(new std::string(new_db));
1609
_schema.reset(new std::string(""));
1588
Check the killed state of a user thread
1589
@param session user thread
1590
@retval 0 the user thread is active
1591
@retval 1 the user thread has been killed
1593
int session_killed(const Session *session)
1595
return(session->killed);
1599
const struct charset_info_st *session_charset(Session *session)
1601
return(session->charset());
1615
1605
Mark transaction to rollback and mark error as fatal to a sub-statement.
1617
1607
@param session Thread handle
1618
1608
@param all true <=> rollback main transaction.
1620
void Session::markTransactionForRollback(bool all)
1610
void mark_transaction_to_rollback(Session *session, bool all)
1622
is_fatal_sub_stmt_error= true;
1623
transaction_rollback_request= all;
1614
session->is_fatal_sub_stmt_error= true;
1615
session->transaction_rollback_request= all;
1626
void Session::disconnect(enum error_t errcode)
1619
void Session::disconnect(uint32_t errcode, bool should_lock)
1628
1621
/* Allow any plugins to cleanup their session variables */
1629
1622
plugin_sessionvar_cleanup(this);
1631
1624
/* If necessary, log any aborted or unauthorized connections */
1632
if (getKilled() || client->wasAborted())
1625
if (killed || client->wasAborted())
1634
1627
status_var.aborted_threads++;
1637
1630
if (client->wasAborted())
1639
if (not getKilled() && variables.log_warnings > 1)
1632
if (! killed && variables.log_warnings > 1)
1641
errmsg_printf(error::WARN, ER(ER_NEW_ABORTING_CONNECTION)
1634
SecurityContext *sctx= &security_ctx;
1636
errmsg_printf(ERRMSG_LVL_WARN, ER(ER_NEW_ABORTING_CONNECTION)
1643
, (_schema->empty() ? "unconnected" : _schema->c_str())
1644
, security_ctx->username().empty() == false ? security_ctx->username().c_str() : "unauthenticated"
1645
, security_ctx->address().c_str()
1638
, (db.empty() ? "unconnected" : db.c_str())
1639
, sctx->getUser().empty() == false ? sctx->getUser().c_str() : "unauthenticated"
1640
, sctx->getIp().c_str()
1646
1641
, (main_da.is_error() ? main_da.message() : ER(ER_UNKNOWN_ERROR)));
1650
setKilled(Session::KILL_CONNECTION);
1645
/* Close out our connection to the client */
1647
LOCK_thread_count.lock();
1648
killed= Session::KILL_CONNECTION;
1652
1649
if (client->isConnected())
1654
if (errcode != EE_OK)
1656
1653
/*my_error(errcode, ER(errcode));*/
1657
1654
client->sendError(errcode, ER(errcode));
1659
1656
client->close();
1659
(void) LOCK_thread_count.unlock();
1663
1662
void Session::reset_for_next_command()
1741
1740
If this is needed, use close_temporary_table()
1744
void Open_tables_state::nukeTable(Table *table)
1743
void Session::nukeTable(Table *table)
1746
1745
plugin::StorageEngine *table_type= table->getShare()->db_type();
1748
1747
table->free_io_cache();
1749
1748
table->delete_table();
1751
identifier::Table identifier(table->getShare()->getSchemaName(), table->getShare()->getTableName(), table->getShare()->getPath());
1750
TableIdentifier identifier(table->getShare()->getSchemaName(), table->getShare()->getTableName(), table->getShare()->getPath());
1752
1751
rm_temporary_table(table_type, identifier);
1754
boost::checked_delete(table->getMutableShare());
1753
delete table->getMutableShare();
1756
boost::checked_delete(table);
1755
/* This makes me sad, but we're allocating it via malloc */
1759
1759
/** Clear most status variables. */
1805
1806
void Session::setVariable(const std::string &name, const std::string &value)
1807
1808
user_var_entry *updateable_var= getVariable(name.c_str(), true);
1810
updateable_var->update_hash(false,
1811
(void*)value.c_str(),
1812
static_cast<uint32_t>(value.length()), STRING_RESULT,
1814
DERIVATION_IMPLICIT, false);
1810
updateable_var->update_hash(false,
1811
(void*)value.c_str(),
1812
static_cast<uint32_t>(value.length()), STRING_RESULT,
1814
DERIVATION_IMPLICIT, false);
1818
void Open_tables_state::mark_temp_tables_as_free_for_reuse()
1817
void Session::mark_temp_tables_as_free_for_reuse()
1820
1819
for (Table *table= temporary_tables ; table ; table= table->getNext())
1822
if (table->query_id == getQueryId())
1821
if (table->query_id == query_id)
1824
1823
table->query_id= 0;
1825
1824
table->cursor->ha_reset();
1883
1883
handled either before writing a query log event (inside
1884
1884
binlog_query()) or when preparing a pending event.
1886
mysql_unlock_tables(this, lock);
1890
Note that we need to hold table::Cache::singleton().mutex() while changing the
1890
Note that we need to hold LOCK_open while changing the
1891
1891
open_tables list. Another thread may work on it.
1892
(See: table::Cache::singleton().removeTable(), wait_completed_table())
1892
(See: remove_table_from_cache(), mysql_wait_completed_table())
1893
1893
Closing a MERGE child before the parent would be fatal if the
1894
1894
other thread tries to abort the MERGE lock in between.
1942
1941
might be an issue (lame engines).
1945
bool Open_tables_state::rm_temporary_table(const identifier::Table &identifier, bool best_effort)
1944
bool Session::rm_temporary_table(TableIdentifier &identifier, bool best_effort)
1947
if (not plugin::StorageEngine::dropTable(*static_cast<Session *>(this), identifier))
1946
if (plugin::StorageEngine::dropTable(*this, identifier))
1949
1948
if (not best_effort)
1952
identifier.getSQLPath(path);
1953
errmsg_printf(error::WARN, _("Could not remove temporary table: '%s', error: %d"),
1954
path.c_str(), errno);
1950
errmsg_printf(ERRMSG_LVL_WARN, _("Could not remove temporary table: '%s', error: %d"),
1951
identifier.getSQLPath().c_str(), errno);
1963
bool Open_tables_state::rm_temporary_table(plugin::StorageEngine *base, const identifier::Table &identifier)
1960
bool Session::rm_temporary_table(plugin::StorageEngine *base, TableIdentifier &identifier)
1965
drizzled::error_t error;
1968
if (not plugin::StorageEngine::dropTable(*static_cast<Session *>(this), *base, identifier, error))
1964
if (plugin::StorageEngine::dropTable(*this, *base, identifier))
1971
identifier.getSQLPath(path);
1972
errmsg_printf(error::WARN, _("Could not remove temporary table: '%s', error: %d"),
1973
path.c_str(), error);
1966
errmsg_printf(ERRMSG_LVL_WARN, _("Could not remove temporary table: '%s', error: %d"),
1967
identifier.getSQLPath().c_str(), errno);
2006
2000
cerr << "\t\t Proto " << proto->schema() << " " << proto->name() << "\n";
2010
2003
cerr << "\tTabl;e Name " << table->getShare()->getSchemaName() << "." << table->getShare()->getTableName() << " : " << answer << "\n";
2015
table::Singular *Session::getInstanceTable()
2017
temporary_shares.push_back(new table::Singular()); // This will not go into the tableshare cache, so no key is used.
2019
table::Singular *tmp_share= temporary_shares.back();
2028
Create a reduced Table object with properly set up Field list from a
2029
list of field definitions.
2031
The created table doesn't have a table Cursor associated with
2032
it, has no keys, no group/distinct, no copy_funcs array.
2033
The sole purpose of this Table object is to use the power of Field
2034
class to read/write data to/from table->getInsertRecord(). Then one can store
2035
the record in any container (RB tree, hash, etc).
2036
The table is created in Session mem_root, so are the table's fields.
2037
Consequently, if you don't BLOB fields, you don't need to free it.
2039
@param session connection handle
2040
@param field_list list of column definitions
2043
0 if out of memory, Table object in case of success
2045
table::Singular *Session::getInstanceTable(List<CreateField> &field_list)
2047
temporary_shares.push_back(new table::Singular(this, field_list)); // This will not go into the tableshare cache, so no key is used.
2049
table::Singular *tmp_share= temporary_shares.back();
2058
static const std::string NONE= "NONE";
2059
static const std::string GOT_GLOBAL_READ_LOCK= "HAS GLOBAL READ LOCK";
2060
static const std::string MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT= "HAS GLOBAL READ LOCK WITH BLOCKING COMMIT";
2062
const std::string &type(drizzled::Session::global_read_lock_t type)
2068
case Session::GOT_GLOBAL_READ_LOCK:
2069
return GOT_GLOBAL_READ_LOCK;
2070
case Session::MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT:
2071
return MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT;
2075
size_t max_string_length(drizzled::Session::global_read_lock_t)
2077
return MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT.size();
2080
} /* namespace display */
2007
bool Session::storeTableMessage(const TableIdentifier &identifier, message::Table &table_message)
2009
table_message_cache.insert(make_pair(identifier.getPath(), table_message));
2014
bool Session::removeTableMessage(const TableIdentifier &identifier)
2016
TableMessageCache::iterator iter;
2018
iter= table_message_cache.find(identifier.getPath());
2020
if (iter == table_message_cache.end())
2023
table_message_cache.erase(iter);
2028
bool Session::getTableMessage(const TableIdentifier &identifier, message::Table &table_message)
2030
TableMessageCache::iterator iter;
2032
iter= table_message_cache.find(identifier.getPath());
2034
if (iter == table_message_cache.end())
2037
table_message.CopyFrom(((*iter).second));
2042
bool Session::doesTableMessageExist(const TableIdentifier &identifier)
2044
TableMessageCache::iterator iter;
2046
iter= table_message_cache.find(identifier.getPath());
2048
if (iter == table_message_cache.end())
2056
bool Session::renameTableMessage(const TableIdentifier &from, const TableIdentifier &to)
2058
TableMessageCache::iterator iter;
2060
table_message_cache[to.getPath()]= table_message_cache[from.getPath()];
2062
iter= table_message_cache.find(to.getPath());
2064
if (iter == table_message_cache.end())
2069
(*iter).second.set_schema(to.getSchemaName());
2070
(*iter).second.set_name(to.getTableName());
2075
table::Instance *Session::getInstanceTable()
2077
temporary_shares.push_back(new table::Instance()); // This will not go into the tableshare cache, so no key is used.
2079
table::Instance *tmp_share= temporary_shares.back();
2082
2086
} /* namespace drizzled */