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/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/identifier.h"
54
#include "drizzled/table/instance.h"
56
#include "plugin/myisam/myisam.h"
57
#include "drizzled/internal/iocache.h"
58
#include "drizzled/internal/thread_var.h"
59
#include "drizzled/plugin/event_observer.h"
61
#include "drizzled/util/functors.h"
63
#include "drizzled/display.h"
71
66
#include <algorithm>
76
68
#include <boost/filesystem.hpp>
77
#include <boost/checked_delete.hpp>
79
#include <drizzled/util/backtrace.h>
81
#include <drizzled/schema.h>
70
#include "drizzled/util/backtrace.h"
83
72
using namespace std;
115
int session_tablespace_op(const Session *session)
117
return test(session->tablespace_op);
121
Set the process info field of the Session structure.
123
This function is used by plug-ins. Internally, the
124
Session::set_proc_info() function should be used.
126
@see Session::set_proc_info
128
void set_session_proc_info(Session *session, const char *info)
130
session->set_proc_info(info);
133
const char *get_session_proc_info(Session *session)
135
return session->get_proc_info();
126
138
void **Session::getEngineData(const plugin::MonitoredInTransaction *monitored)
128
140
return static_cast<void **>(&ha_data[monitored->getId()].ha_ptr);
139
151
return session->options & test_options;
142
Session::Session(plugin::Client *client_arg, catalog::Instance::shared_ptr catalog_arg) :
154
int session_sql_command(const Session *session)
156
return (int) session->lex->sql_command;
159
enum_tx_isolation session_tx_isolation(const Session *session)
161
return (enum_tx_isolation)session->variables.tx_isolation;
164
Session::Session(plugin::Client *client_arg) :
143
165
Open_tables_state(refresh_version),
144
166
mem_root(&main_mem_root),
147
169
query(new std::string),
148
170
_schema(new std::string("")),
149
172
client(client_arg),
151
174
scheduler_arg(NULL),
152
175
lock_id(&main_lock_id),
153
176
thread_stack(NULL),
154
177
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
179
ha_data(plugin::num_trx_monitored_objects),
166
180
concurrent_execute_allowed(true),
167
181
arg_of_last_insert_id_function(false),
168
182
first_successful_insert_id_in_prev_stmt(0),
169
183
first_successful_insert_id_in_cur_stmt(0),
170
184
limit_found_rows(0),
171
options(session_startup_options),
174
examined_row_count(0),
178
statement_id_counter(0),
182
185
_global_read_lock(NONE),
183
count_cuted_fields(CHECK_FIELD_ERROR_FOR_NULL),
184
186
_killed(NOT_KILLED),
185
187
some_tables_deleted(false),
186
188
no_errors(false),
1485
1511
bool select_max_min_finder_subselect::cmp_decimal()
1487
1513
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);
1514
my_decimal cval, *cvalue= cache->val_decimal(&cval);
1515
my_decimal mval, *mvalue= maxmin->val_decimal(&mval);
1491
1517
return (cache->null_value && !maxmin->null_value) ||
1492
1518
(!cache->null_value && !maxmin->null_value &&
1493
class_decimal_cmp(cvalue, mvalue) > 0) ;
1519
my_decimal_cmp(cvalue, mvalue) > 0) ;
1494
1520
return (maxmin->null_value && !cache->null_value) ||
1495
1521
(!cache->null_value && !maxmin->null_value &&
1496
class_decimal_cmp(cvalue,mvalue) < 0);
1522
my_decimal_cmp(cvalue,mvalue) < 0);
1499
1525
bool select_max_min_finder_subselect::cmp_str()
1805
1836
void Session::setVariable(const std::string &name, const std::string &value)
1807
1838
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);
1840
updateable_var->update_hash(false,
1841
(void*)value.c_str(),
1842
static_cast<uint32_t>(value.length()), STRING_RESULT,
1844
DERIVATION_IMPLICIT, false);
1818
1847
void Open_tables_state::mark_temp_tables_as_free_for_reuse()
1942
1970
might be an issue (lame engines).
1945
bool Open_tables_state::rm_temporary_table(const identifier::Table &identifier, bool best_effort)
1973
bool Open_tables_state::rm_temporary_table(const TableIdentifier &identifier, bool best_effort)
1947
if (not plugin::StorageEngine::dropTable(*static_cast<Session *>(this), identifier))
1975
if (plugin::StorageEngine::dropTable(*static_cast<Session *>(this), identifier))
1949
1977
if (not best_effort)
1951
1979
std::string path;
1952
1980
identifier.getSQLPath(path);
1953
errmsg_printf(error::WARN, _("Could not remove temporary table: '%s', error: %d"),
1981
errmsg_printf(ERRMSG_LVL_WARN, _("Could not remove temporary table: '%s', error: %d"),
1954
1982
path.c_str(), errno);
1963
bool Open_tables_state::rm_temporary_table(plugin::StorageEngine *base, const identifier::Table &identifier)
1991
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))
1995
if (plugin::StorageEngine::dropTable(*static_cast<Session *>(this), *base, identifier))
1970
1997
std::string path;
1971
1998
identifier.getSQLPath(path);
1972
errmsg_printf(error::WARN, _("Could not remove temporary table: '%s', error: %d"),
1973
path.c_str(), error);
1999
errmsg_printf(ERRMSG_LVL_WARN, _("Could not remove temporary table: '%s', error: %d"),
2000
path.c_str(), errno);
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();
2042
bool Session::TableMessages::storeTableMessage(const TableIdentifier &identifier, message::Table &table_message)
2044
table_message_cache.insert(make_pair(identifier.getPath(), table_message));
2049
bool Session::TableMessages::removeTableMessage(const TableIdentifier &identifier)
2051
TableMessageCache::iterator iter;
2053
iter= table_message_cache.find(identifier.getPath());
2055
if (iter == table_message_cache.end())
2058
table_message_cache.erase(iter);
2063
bool Session::TableMessages::getTableMessage(const TableIdentifier &identifier, message::Table &table_message)
2065
TableMessageCache::iterator iter;
2067
iter= table_message_cache.find(identifier.getPath());
2069
if (iter == table_message_cache.end())
2072
table_message.CopyFrom(((*iter).second));
2077
bool Session::TableMessages::doesTableMessageExist(const TableIdentifier &identifier)
2079
TableMessageCache::iterator iter;
2081
iter= table_message_cache.find(identifier.getPath());
2083
if (iter == table_message_cache.end())
2091
bool Session::TableMessages::renameTableMessage(const TableIdentifier &from, const TableIdentifier &to)
2093
TableMessageCache::iterator iter;
2095
table_message_cache[to.getPath()]= table_message_cache[from.getPath()];
2097
iter= table_message_cache.find(to.getPath());
2099
if (iter == table_message_cache.end())
2104
(*iter).second.set_schema(to.getSchemaName());
2105
(*iter).second.set_name(to.getTableName());
2110
table::Instance *Session::getInstanceTable()
2112
temporary_shares.push_back(new table::Instance()); // This will not go into the tableshare cache, so no key is used.
2114
table::Instance *tmp_share= temporary_shares.back();
2021
2116
assert(tmp_share);