21
21
* @file Implementation of the Session class and API
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/plugin/query_rewrite.h"
45
#include "drizzled/probes.h"
46
#include "drizzled/table_proto.h"
47
#include "drizzled/db.h"
48
#include "drizzled/pthread_globals.h"
49
#include "drizzled/transaction_services.h"
50
#include "drizzled/drizzled.h"
52
#include "drizzled/table/instance.h"
54
#include "plugin/myisam/myisam.h"
55
#include "drizzled/internal/iocache.h"
56
#include "drizzled/internal/thread_var.h"
57
#include "drizzled/plugin/event_observer.h"
59
#include "drizzled/util/functors.h"
61
#include "drizzled/display.h"
26
#include <drizzled/copy_field.h>
27
#include <drizzled/session.h>
28
#include <drizzled/session/cache.h>
29
#include <drizzled/error.h>
30
#include <drizzled/gettext.h>
31
#include <drizzled/query_id.h>
32
#include <drizzled/data_home.h>
33
#include <drizzled/sql_base.h>
34
#include <drizzled/lock.h>
35
#include <drizzled/item/cache.h>
36
#include <drizzled/item/float.h>
37
#include <drizzled/item/return_int.h>
38
#include <drizzled/item/empty_string.h>
39
#include <drizzled/show.h>
40
#include <drizzled/plugin/client.h>
41
#include <drizzled/plugin/scheduler.h>
42
#include <drizzled/plugin/authentication.h>
43
#include <drizzled/plugin/logging.h>
44
#include <drizzled/plugin/transactional_storage_engine.h>
45
#include <drizzled/plugin/query_rewrite.h>
46
#include <drizzled/probes.h>
47
#include <drizzled/table_proto.h>
48
#include <drizzled/pthread_globals.h>
49
#include <drizzled/transaction_services.h>
50
#include <drizzled/drizzled.h>
51
#include <drizzled/select_to_file.h>
52
#include <drizzled/select_export.h>
53
#include <drizzled/select_dump.h>
54
#include <drizzled/select_subselect.h>
55
#include <drizzled/select_singlerow_subselect.h>
56
#include <drizzled/select_max_min_finder_subselect.h>
57
#include <drizzled/select_exists_subselect.h>
58
#include <drizzled/tmp_table_param.h>
59
#include <drizzled/internal_error_handler.h>
61
#include <drizzled/identifier.h>
63
#include <drizzled/refresh_version.h>
65
#include <drizzled/table/singular.h>
67
#include <plugin/myisam/myisam.h>
68
#include <drizzled/internal/iocache.h>
69
#include <drizzled/internal/thread_var.h>
70
#include <drizzled/plugin/event_observer.h>
72
#include <drizzled/user_var_entry.h>
74
#include <drizzled/util/functors.h>
76
#include <drizzled/display.h>
64
78
#include <algorithm>
66
83
#include <boost/filesystem.hpp>
68
#include "drizzled/util/backtrace.h"
84
#include <boost/checked_delete.hpp>
86
#include <drizzled/util/backtrace.h>
88
#include <drizzled/schema.h>
70
90
using namespace std;
113
int session_tablespace_op(const Session *session)
115
return test(session->tablespace_op);
119
Set the process info field of the Session structure.
121
This function is used by plug-ins. Internally, the
122
Session::set_proc_info() function should be used.
124
@see Session::set_proc_info
126
void set_session_proc_info(Session *session, const char *info)
128
session->set_proc_info(info);
131
const char *get_session_proc_info(Session *session)
133
return session->get_proc_info();
136
133
void **Session::getEngineData(const plugin::MonitoredInTransaction *monitored)
138
135
return static_cast<void **>(&ha_data[monitored->getId()].ha_ptr);
149
146
return session->options & test_options;
152
int session_sql_command(const Session *session)
154
return (int) session->lex->sql_command;
157
enum_tx_isolation session_tx_isolation(const Session *session)
159
return (enum_tx_isolation)session->variables.tx_isolation;
162
Session::Session(plugin::Client *client_arg) :
149
Session::Session(plugin::Client *client_arg, catalog::Instance::shared_ptr catalog_arg) :
163
150
Open_tables_state(refresh_version),
164
151
mem_root(&main_mem_root),
167
154
query(new std::string),
168
155
_schema(new std::string("")),
170
156
client(client_arg),
172
158
scheduler_arg(NULL),
173
159
lock_id(&main_lock_id),
161
security_ctx(identifier::User::make_shared()),
162
_where(Session::DEFAULT_WHERE),
163
dbug_sentry(Session_SENTRY_MAGIC),
165
command(COM_CONNECT),
167
_epoch(boost::gregorian::date(1970,1,1)),
168
_connect_time(boost::posix_time::microsec_clock::universal_time()),
175
170
ha_data(plugin::num_trx_monitored_objects),
176
173
concurrent_execute_allowed(true),
177
174
arg_of_last_insert_id_function(false),
178
175
first_successful_insert_id_in_prev_stmt(0),
179
176
first_successful_insert_id_in_cur_stmt(0),
180
177
limit_found_rows(0),
178
options(session_startup_options),
181
examined_row_count(0),
185
statement_id_counter(0),
181
189
_global_read_lock(NONE),
190
count_cuted_fields(CHECK_FIELD_ERROR_FOR_NULL),
182
191
_killed(NOT_KILLED),
183
192
some_tables_deleted(false),
184
193
no_errors(false),
1504
1492
bool select_max_min_finder_subselect::cmp_decimal()
1506
1494
Item *maxmin= ((Item_singlerow_subselect *)item)->element_index(0);
1507
my_decimal cval, *cvalue= cache->val_decimal(&cval);
1508
my_decimal mval, *mvalue= maxmin->val_decimal(&mval);
1495
type::Decimal cval, *cvalue= cache->val_decimal(&cval);
1496
type::Decimal mval, *mvalue= maxmin->val_decimal(&mval);
1510
1498
return (cache->null_value && !maxmin->null_value) ||
1511
1499
(!cache->null_value && !maxmin->null_value &&
1512
my_decimal_cmp(cvalue, mvalue) > 0) ;
1500
class_decimal_cmp(cvalue, mvalue) > 0) ;
1513
1501
return (maxmin->null_value && !cache->null_value) ||
1514
1502
(!cache->null_value && !maxmin->null_value &&
1515
my_decimal_cmp(cvalue,mvalue) < 0);
1503
class_decimal_cmp(cvalue,mvalue) < 0);
1518
1506
bool select_max_min_finder_subselect::cmp_str()
1636
1624
@param session Thread handle
1637
1625
@param all true <=> rollback main transaction.
1639
void mark_transaction_to_rollback(Session *session, bool all)
1627
void Session::markTransactionForRollback(bool all)
1643
session->is_fatal_sub_stmt_error= true;
1644
session->transaction_rollback_request= all;
1629
is_fatal_sub_stmt_error= true;
1630
transaction_rollback_request= all;
1648
void Session::disconnect(uint32_t errcode, bool should_lock)
1633
void Session::disconnect(enum error_t errcode)
1650
1635
/* Allow any plugins to cleanup their session variables */
1651
1636
plugin_sessionvar_cleanup(this);
1661
1646
if (not getKilled() && variables.log_warnings > 1)
1663
SecurityContext *sctx= &security_ctx;
1665
errmsg_printf(ERRMSG_LVL_WARN, ER(ER_NEW_ABORTING_CONNECTION)
1648
errmsg_printf(error::WARN, ER(ER_NEW_ABORTING_CONNECTION)
1667
1650
, (_schema->empty() ? "unconnected" : _schema->c_str())
1668
, sctx->getUser().empty() == false ? sctx->getUser().c_str() : "unauthenticated"
1669
, sctx->getIp().c_str()
1651
, security_ctx->username().empty() == false ? security_ctx->username().c_str() : "unauthenticated"
1652
, security_ctx->address().c_str()
1670
1653
, (main_da.is_error() ? main_da.message() : ER(ER_UNKNOWN_ERROR)));
1674
/* Close out our connection to the client */
1676
session::Cache::singleton().mutex().lock();
1678
1657
setKilled(Session::KILL_CONNECTION);
1680
1659
if (client->isConnected())
1661
if (errcode != EE_OK)
1684
1663
/*my_error(errcode, ER(errcode));*/
1685
1664
client->sendError(errcode, ER(errcode));
1687
1666
client->close();
1692
session::Cache::singleton().mutex().unlock();
1696
1670
void Session::reset_for_next_command()
1840
1812
void Session::setVariable(const std::string &name, const std::string &value)
1842
1814
user_var_entry *updateable_var= getVariable(name.c_str(), true);
1844
updateable_var->update_hash(false,
1845
(void*)value.c_str(),
1846
static_cast<uint32_t>(value.length()), STRING_RESULT,
1848
DERIVATION_IMPLICIT, false);
1817
updateable_var->update_hash(false,
1818
(void*)value.c_str(),
1819
static_cast<uint32_t>(value.length()), STRING_RESULT,
1821
DERIVATION_IMPLICIT, false);
1851
1825
void Open_tables_state::mark_temp_tables_as_free_for_reuse()
1974
1949
might be an issue (lame engines).
1977
bool Open_tables_state::rm_temporary_table(const TableIdentifier &identifier, bool best_effort)
1952
bool Open_tables_state::rm_temporary_table(const identifier::Table &identifier, bool best_effort)
1979
if (plugin::StorageEngine::dropTable(*static_cast<Session *>(this), identifier))
1954
if (not plugin::StorageEngine::dropTable(*static_cast<Session *>(this), identifier))
1981
1956
if (not best_effort)
1983
1958
std::string path;
1984
1959
identifier.getSQLPath(path);
1985
errmsg_printf(ERRMSG_LVL_WARN, _("Could not remove temporary table: '%s', error: %d"),
1960
errmsg_printf(error::WARN, _("Could not remove temporary table: '%s', error: %d"),
1986
1961
path.c_str(), errno);
1995
bool Open_tables_state::rm_temporary_table(plugin::StorageEngine *base, const TableIdentifier &identifier)
1970
bool Open_tables_state::rm_temporary_table(plugin::StorageEngine *base, const identifier::Table &identifier)
1972
drizzled::error_t error;
1999
if (plugin::StorageEngine::dropTable(*static_cast<Session *>(this), *base, identifier))
1975
if (not plugin::StorageEngine::dropTable(*static_cast<Session *>(this), *base, identifier, error))
2001
1977
std::string path;
2002
1978
identifier.getSQLPath(path);
2003
errmsg_printf(ERRMSG_LVL_WARN, _("Could not remove temporary table: '%s', error: %d"),
2004
path.c_str(), errno);
1979
errmsg_printf(error::WARN, _("Could not remove temporary table: '%s', error: %d"),
1980
path.c_str(), error);
2046
bool Session::TableMessages::storeTableMessage(const TableIdentifier &identifier, message::Table &table_message)
2048
table_message_cache.insert(make_pair(identifier.getPath(), table_message));
2053
bool Session::TableMessages::removeTableMessage(const TableIdentifier &identifier)
2055
TableMessageCache::iterator iter;
2057
iter= table_message_cache.find(identifier.getPath());
2059
if (iter == table_message_cache.end())
2062
table_message_cache.erase(iter);
2067
bool Session::TableMessages::getTableMessage(const TableIdentifier &identifier, message::Table &table_message)
2069
TableMessageCache::iterator iter;
2071
iter= table_message_cache.find(identifier.getPath());
2073
if (iter == table_message_cache.end())
2076
table_message.CopyFrom(((*iter).second));
2081
bool Session::TableMessages::doesTableMessageExist(const TableIdentifier &identifier)
2083
TableMessageCache::iterator iter;
2085
iter= table_message_cache.find(identifier.getPath());
2087
if (iter == table_message_cache.end())
2095
bool Session::TableMessages::renameTableMessage(const TableIdentifier &from, const TableIdentifier &to)
2097
TableMessageCache::iterator iter;
2099
table_message_cache[to.getPath()]= table_message_cache[from.getPath()];
2101
iter= table_message_cache.find(to.getPath());
2103
if (iter == table_message_cache.end())
2108
(*iter).second.set_schema(to.getSchemaName());
2109
(*iter).second.set_name(to.getTableName());
2114
table::Instance *Session::getInstanceTable()
2116
temporary_shares.push_back(new table::Instance()); // This will not go into the tableshare cache, so no key is used.
2118
table::Instance *tmp_share= temporary_shares.back();
2022
table::Singular *Session::getInstanceTable()
2024
temporary_shares.push_back(new table::Singular()); // This will not go into the tableshare cache, so no key is used.
2026
table::Singular *tmp_share= temporary_shares.back();
2120
2028
assert(tmp_share);