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>
30
#include <drizzled/error.h>
31
#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>
36
#include <drizzled/item/cache.h>
37
#include <drizzled/item/empty_string.h>
38
#include <drizzled/item/float.h>
39
#include <drizzled/item/return_int.h>
40
#include <drizzled/lock.h>
41
#include <drizzled/plugin/authentication.h>
42
#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>
25
#include "drizzled/session.h"
26
#include "drizzled/session/cache.h"
28
#include "drizzled/error.h"
29
#include "drizzled/gettext.h"
30
#include "drizzled/query_id.h"
31
#include "drizzled/data_home.h"
32
#include "drizzled/sql_base.h"
33
#include "drizzled/lock.h"
34
#include "drizzled/item/cache.h"
35
#include "drizzled/item/float.h"
36
#include "drizzled/item/return_int.h"
37
#include "drizzled/item/empty_string.h"
38
#include "drizzled/show.h"
39
#include "drizzled/plugin/client.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"
60
#include "drizzled/display.h"
71
63
#include <algorithm>
76
65
#include <boost/filesystem.hpp>
77
#include <boost/checked_delete.hpp>
79
#include <drizzled/util/backtrace.h>
81
#include <drizzled/schema.h>
67
#include "drizzled/util/backtrace.h"
83
69
using namespace std;
112
int session_tablespace_op(const Session *session)
114
return test(session->tablespace_op);
118
Set the process info field of the Session structure.
120
This function is used by plug-ins. Internally, the
121
Session::set_proc_info() function should be used.
123
@see Session::set_proc_info
125
void set_session_proc_info(Session *session, const char *info)
127
session->set_proc_info(info);
130
const char *get_session_proc_info(Session *session)
132
return session->get_proc_info();
126
135
void **Session::getEngineData(const plugin::MonitoredInTransaction *monitored)
128
137
return static_cast<void **>(&ha_data[monitored->getId()].ha_ptr);
139
148
return session->options & test_options;
142
Session::Session(plugin::Client *client_arg, catalog::Instance::shared_ptr catalog_arg) :
151
int session_sql_command(const Session *session)
153
return (int) session->lex->sql_command;
156
enum_tx_isolation session_tx_isolation(const Session *session)
158
return (enum_tx_isolation)session->variables.tx_isolation;
161
Session::Session(plugin::Client *client_arg) :
143
162
Open_tables_state(refresh_version),
144
163
mem_root(&main_mem_root),
147
166
query(new std::string),
148
_schema(new std::string("")),
149
168
client(client_arg),
151
170
scheduler_arg(NULL),
152
171
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
173
ha_data(plugin::num_trx_monitored_objects),
166
174
concurrent_execute_allowed(true),
167
175
arg_of_last_insert_id_function(false),
168
176
first_successful_insert_id_in_prev_stmt(0),
169
177
first_successful_insert_id_in_cur_stmt(0),
170
178
limit_found_rows(0),
171
options(session_startup_options),
174
examined_row_count(0),
178
statement_id_counter(0),
182
179
_global_read_lock(NONE),
183
count_cuted_fields(CHECK_FIELD_ERROR_FOR_NULL),
184
180
_killed(NOT_KILLED),
185
181
some_tables_deleted(false),
186
182
no_errors(false),
1485
1490
bool select_max_min_finder_subselect::cmp_decimal()
1487
1492
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);
1493
my_decimal cval, *cvalue= cache->val_decimal(&cval);
1494
my_decimal mval, *mvalue= maxmin->val_decimal(&mval);
1491
1496
return (cache->null_value && !maxmin->null_value) ||
1492
1497
(!cache->null_value && !maxmin->null_value &&
1493
class_decimal_cmp(cvalue, mvalue) > 0) ;
1498
my_decimal_cmp(cvalue, mvalue) > 0) ;
1494
1499
return (maxmin->null_value && !cache->null_value) ||
1495
1500
(!cache->null_value && !maxmin->null_value &&
1496
class_decimal_cmp(cvalue,mvalue) < 0);
1501
my_decimal_cmp(cvalue,mvalue) < 0);
1499
1504
bool select_max_min_finder_subselect::cmp_str()
1543
1548
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();
1552
my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
1555
*p_db= strmake(db.c_str(), db.length());
1556
*p_db_length= db.length();
1617
1611
@param session Thread handle
1618
1612
@param all true <=> rollback main transaction.
1620
void Session::markTransactionForRollback(bool all)
1614
void mark_transaction_to_rollback(Session *session, bool all)
1622
is_fatal_sub_stmt_error= true;
1623
transaction_rollback_request= all;
1618
session->is_fatal_sub_stmt_error= true;
1619
session->transaction_rollback_request= all;
1626
void Session::disconnect(enum error_t errcode)
1623
void Session::disconnect(uint32_t errcode, bool should_lock)
1628
1625
/* Allow any plugins to cleanup their session variables */
1629
1626
plugin_sessionvar_cleanup(this);
1639
1636
if (not getKilled() && variables.log_warnings > 1)
1641
errmsg_printf(error::WARN, ER(ER_NEW_ABORTING_CONNECTION)
1638
SecurityContext *sctx= &security_ctx;
1640
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()
1642
, (db.empty() ? "unconnected" : db.c_str())
1643
, sctx->getUser().empty() == false ? sctx->getUser().c_str() : "unauthenticated"
1644
, sctx->getIp().c_str()
1646
1645
, (main_da.is_error() ? main_da.message() : ER(ER_UNKNOWN_ERROR)));
1649
/* Close out our connection to the client */
1651
session::Cache::singleton().mutex().lock();
1650
1653
setKilled(Session::KILL_CONNECTION);
1652
1655
if (client->isConnected())
1654
if (errcode != EE_OK)
1656
1659
/*my_error(errcode, ER(errcode));*/
1657
1660
client->sendError(errcode, ER(errcode));
1659
1662
client->close();
1667
session::Cache::singleton().mutex().unlock();
1663
1671
void Session::reset_for_next_command()
1805
1815
void Session::setVariable(const std::string &name, const std::string &value)
1807
1817
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);
1819
updateable_var->update_hash(false,
1820
(void*)value.c_str(),
1821
static_cast<uint32_t>(value.length()), STRING_RESULT,
1823
DERIVATION_IMPLICIT, false);
1818
1826
void Open_tables_state::mark_temp_tables_as_free_for_reuse()
1942
1949
might be an issue (lame engines).
1945
bool Open_tables_state::rm_temporary_table(const identifier::Table &identifier, bool best_effort)
1952
bool Open_tables_state::rm_temporary_table(const TableIdentifier &identifier, bool best_effort)
1947
if (not plugin::StorageEngine::dropTable(*static_cast<Session *>(this), identifier))
1954
if (plugin::StorageEngine::dropTable(*static_cast<Session *>(this), identifier))
1949
1956
if (not best_effort)
1951
1958
std::string path;
1952
1959
identifier.getSQLPath(path);
1953
errmsg_printf(error::WARN, _("Could not remove temporary table: '%s', error: %d"),
1960
errmsg_printf(ERRMSG_LVL_WARN, _("Could not remove temporary table: '%s', error: %d"),
1954
1961
path.c_str(), errno);
1963
bool Open_tables_state::rm_temporary_table(plugin::StorageEngine *base, const identifier::Table &identifier)
1970
bool Open_tables_state::rm_temporary_table(plugin::StorageEngine *base, const TableIdentifier &identifier)
1965
drizzled::error_t error;
1968
if (not plugin::StorageEngine::dropTable(*static_cast<Session *>(this), *base, identifier, error))
1974
if (plugin::StorageEngine::dropTable(*static_cast<Session *>(this), *base, identifier))
1970
1976
std::string path;
1971
1977
identifier.getSQLPath(path);
1972
errmsg_printf(error::WARN, _("Could not remove temporary table: '%s', error: %d"),
1973
path.c_str(), error);
1978
errmsg_printf(ERRMSG_LVL_WARN, _("Could not remove temporary table: '%s', error: %d"),
1979
path.c_str(), errno);
2006
2012
cerr << "\t\t Proto " << proto->schema() << " " << proto->name() << "\n";
2010
2015
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();
2019
bool Session::TableMessages::storeTableMessage(const TableIdentifier &identifier, message::Table &table_message)
2021
table_message_cache.insert(make_pair(identifier.getPath(), table_message));
2026
bool Session::TableMessages::removeTableMessage(const TableIdentifier &identifier)
2028
TableMessageCache::iterator iter;
2030
iter= table_message_cache.find(identifier.getPath());
2032
if (iter == table_message_cache.end())
2035
table_message_cache.erase(iter);
2040
bool Session::TableMessages::getTableMessage(const TableIdentifier &identifier, message::Table &table_message)
2042
TableMessageCache::iterator iter;
2044
iter= table_message_cache.find(identifier.getPath());
2046
if (iter == table_message_cache.end())
2049
table_message.CopyFrom(((*iter).second));
2054
bool Session::TableMessages::doesTableMessageExist(const TableIdentifier &identifier)
2056
TableMessageCache::iterator iter;
2058
iter= table_message_cache.find(identifier.getPath());
2060
if (iter == table_message_cache.end())
2068
bool Session::TableMessages::renameTableMessage(const TableIdentifier &from, const TableIdentifier &to)
2070
TableMessageCache::iterator iter;
2072
table_message_cache[to.getPath()]= table_message_cache[from.getPath()];
2074
iter= table_message_cache.find(to.getPath());
2076
if (iter == table_message_cache.end())
2081
(*iter).second.set_schema(to.getSchemaName());
2082
(*iter).second.set_name(to.getTableName());
2087
table::Instance *Session::getInstanceTable()
2089
temporary_shares.push_back(new table::Instance()); // This will not go into the tableshare cache, so no key is used.
2091
table::Instance *tmp_share= temporary_shares.back();
2021
2093
assert(tmp_share);