24
24
#include "config.h"
25
#include "drizzled/session.h"
26
#include "drizzled/session/cache.h"
25
#include <drizzled/session.h>
26
#include "drizzled/session_list.h"
27
27
#include <sys/stat.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"
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
40
#include "drizzled/plugin/scheduler.h"
41
41
#include "drizzled/plugin/authentication.h"
42
42
#include "drizzled/plugin/logging.h"
43
43
#include "drizzled/plugin/transactional_storage_engine.h"
44
#include "drizzled/plugin/query_rewrite.h"
45
44
#include "drizzled/probes.h"
46
45
#include "drizzled/table_proto.h"
47
46
#include "drizzled/db.h"
49
48
#include "drizzled/transaction_services.h"
50
49
#include "drizzled/drizzled.h"
52
#include "drizzled/identifier.h"
54
#include "drizzled/table/instance.h"
51
#include "drizzled/table_share_instance.h"
56
53
#include "plugin/myisam/myisam.h"
57
54
#include "drizzled/internal/iocache.h"
58
55
#include "drizzled/internal/thread_var.h"
59
56
#include "drizzled/plugin/event_observer.h"
61
#include "drizzled/util/functors.h"
63
#include "drizzled/display.h"
66
59
#include <algorithm>
68
#include <boost/filesystem.hpp>
70
#include "drizzled/util/backtrace.h"
61
#include "boost/filesystem.hpp"
72
63
using namespace std;
89
80
return length == other.length &&
90
81
field_name.length == other.field_name.length &&
91
!my_strcasecmp(system_charset_info, field_name.str, other.field_name.str);
82
!strcmp(field_name.str, other.field_name.str);
94
85
Open_tables_state::Open_tables_state(uint64_t version_arg) :
164
155
Session::Session(plugin::Client *client_arg) :
165
156
Open_tables_state(refresh_version),
166
157
mem_root(&main_mem_root),
169
query(new std::string),
170
_schema(new std::string("")),
172
160
client(client_arg),
174
162
scheduler_arg(NULL),
175
163
lock_id(&main_lock_id),
177
security_ctx(identifier::User::make_shared()),
179
165
ha_data(plugin::num_trx_monitored_objects),
180
concurrent_execute_allowed(true),
181
166
arg_of_last_insert_id_function(false),
182
167
first_successful_insert_id_in_prev_stmt(0),
183
168
first_successful_insert_id_in_cur_stmt(0),
184
169
limit_found_rows(0),
185
_global_read_lock(NONE),
187
171
some_tables_deleted(false),
188
172
no_errors(false),
319
boost_unique_lock_t scopedLock(mysys_var->mutex);
306
boost::mutex::scoped_lock scopedLock(mysys_var->mutex);
320
307
if (mysys_var->current_cond)
322
309
mysys_var->current_mutex->lock();
323
mysys_var->current_cond->notify_all();
310
pthread_cond_broadcast(mysys_var->current_cond->native_handle());
324
311
mysys_var->current_mutex->unlock();
382
367
if (client->isConnected())
384
assert(security_ctx);
385
369
if (global_system_variables.log_warnings)
387
errmsg_printf(ERRMSG_LVL_WARN, ER(ER_FORCING_CLOSE),
388
internal::my_progname,
390
security_ctx->username().c_str());
370
errmsg_printf(ERRMSG_LVL_WARN, ER(ER_FORCING_CLOSE),internal::my_progname,
372
(getSecurityContext().getUser().c_str() ?
373
getSecurityContext().getUser().c_str() : ""));
393
374
disconnect(0, false);
419
400
delete (*iter).second;
421
402
life_properties.clear();
424
void Session::setClient(plugin::Client *client_arg)
427
client->setSession(this);
430
void Session::awake(Session::killed_state_t state_to_set)
432
if ((state_to_set == Session::KILL_QUERY) and (command == COM_SLEEP))
404
/* Ensure that no one is using Session */
405
LOCK_delete.unlock();
408
void Session::awake(Session::killed_state state_to_set)
435
410
this->checkSentry();
437
setKilled(state_to_set);
438
scheduler->killSession(this);
411
safe_mutex_assert_owner(&LOCK_delete);
413
killed= state_to_set;
440
414
if (state_to_set != Session::KILL_QUERY)
416
scheduler->killSession(this);
442
417
DRIZZLE_CONNECTION_DONE(thread_id);
447
boost_unique_lock_t scopedLock(mysys_var->mutex);
421
boost::mutex::scoped_lock scopedLock(mysys_var->mutex);
450
424
This broadcast could be up in the air if the victim thread
468
442
if (mysys_var->current_cond && mysys_var->current_mutex)
470
444
mysys_var->current_mutex->lock();
471
mysys_var->current_cond->notify_all();
445
pthread_cond_broadcast(mysys_var->current_cond->native_handle());
472
446
mysys_var->current_mutex->unlock();
555
529
prepareForQueries();
557
while (not client->haveError() && getKilled() != KILL_CONNECTION)
531
while (! client->haveError() && killed != KILL_CONNECTION)
559
if (not executeStatement())
533
if (! executeStatement())
563
537
disconnect(0, true);
566
bool Session::schedule(Session::shared_ptr &arg)
540
bool Session::schedule()
568
arg->scheduler= plugin::Scheduler::getScheduler();
569
assert(arg->scheduler);
542
scheduler= plugin::Scheduler::getScheduler();
571
545
connection_count.increment();
578
552
current_global_counters.connections++;
579
arg->thread_id= arg->variables.pseudo_thread_id= global_thread_id++;
581
session::Cache::singleton().insert(arg);
583
if (unlikely(plugin::EventObserver::connectSession(*arg)))
585
// We should do something about an error...
588
if (plugin::Scheduler::getScheduler()->addSession(arg))
590
DRIZZLE_CONNECTION_START(arg->getSessionId());
553
thread_id= variables.pseudo_thread_id= global_thread_id++;
555
LOCK_thread_count.lock();
556
getSessionList().push_back(this);
557
LOCK_thread_count.unlock();
559
if (scheduler->addSession(this))
561
DRIZZLE_CONNECTION_START(thread_id);
591
562
char error_message_buff[DRIZZLE_ERRMSG_SIZE];
593
arg->setKilled(Session::KILL_CONNECTION);
564
killed= Session::KILL_CONNECTION;
595
arg->status_var.aborted_connects++;
566
status_var.aborted_connects++;
597
568
/* Can't use my_error() since store_globals has not been called. */
598
569
/* TODO replace will better error message */
599
570
snprintf(error_message_buff, sizeof(error_message_buff),
600
571
ER(ER_CANT_CREATE_THREAD), 1);
601
arg->client->sendError(ER_CANT_CREATE_THREAD, error_message_buff);
572
client->sendError(ER_CANT_CREATE_THREAD, error_message_buff);
611
Is this session viewable by the current user?
613
bool Session::isViewable() const
615
return plugin::Authorization::isAuthorized(current_session->user(),
621
const char* Session::enter_cond(boost::condition_variable_any &cond, boost::mutex &mutex, const char* msg)
580
const char* Session::enter_cond(boost::condition_variable &cond, boost::mutex &mutex, const char* msg)
623
582
const char* old_msg = get_proc_info();
624
583
safe_mutex_assert_owner(mutex);
637
596
does a Session::awake() on you).
639
598
mysys_var->current_mutex->unlock();
640
boost_unique_lock_t scopedLock(mysys_var->mutex);
599
boost::mutex::scoped_lock scopedLock(mysys_var->mutex);
641
600
mysys_var->current_mutex = 0;
642
601
mysys_var->current_cond = 0;
643
602
this->set_proc_info(old_msg);
657
bool Session::checkUser(const std::string &passwd_str,
658
const std::string &in_db)
616
bool Session::checkUser(const char *passwd, uint32_t passwd_len, const char *in_db)
618
const string passwd_str(passwd, passwd_len);
660
619
bool is_authenticated=
661
plugin::Authentication::isAuthenticated(user(), passwd_str);
620
plugin::Authentication::isAuthenticated(getSecurityContext(),
663
623
if (is_authenticated != true)
700
660
main_da.reset_diagnostics_area();
702
662
if (client->readCommand(&l_packet, &packet_length) == false)
707
if (getKilled() == KILL_CONNECTION)
665
if (killed == KILL_CONNECTION)
710
668
if (packet_length == 0)
713
l_command= static_cast<enum_server_command>(l_packet[0]);
671
l_command= (enum enum_server_command) (unsigned char) l_packet[0];
715
673
if (command >= COM_END)
716
674
command= COM_END; // Wrong command
718
676
assert(packet_length);
719
return not dispatch_command(l_command, this, l_packet+1, (uint32_t) (packet_length-1));
677
return ! dispatch_command(l_command, this, l_packet+1, (uint32_t) (packet_length-1));
722
680
bool Session::readAndStoreQuery(const char *in_packet, uint32_t in_packet_length)
728
686
in_packet_length--;
730
688
const char *pos= in_packet + in_packet_length; /* Point at end null */
731
while (in_packet_length > 0 && (pos[-1] == ';' || my_isspace(charset() ,pos[-1])))
689
while (in_packet_length > 0 &&
690
(pos[-1] == ';' || my_isspace(charset() ,pos[-1])))
734
693
in_packet_length--;
737
std::string *new_query= new std::string(in_packet, in_packet + in_packet_length);
738
// We can not be entirely sure _schema has a value
741
plugin::QueryRewriter::rewriteQuery(*_schema, *new_query);
743
query.reset(new_query);
744
_state.reset(new State(in_packet, in_packet_length));
696
query.assign(in_packet, in_packet + in_packet_length);
873
821
where= Session::DEFAULT_WHERE;
875
823
/* Reset the temporary shares we built */
876
for_each(temporary_shares.begin(),
877
temporary_shares.end(),
824
for (std::vector<TableShareInstance *>::iterator iter= temporary_shares.begin();
825
iter != temporary_shares.end(); iter++)
879
829
temporary_shares.clear();
961
911
my_message(errcode, err, MYF(0));
964
(void) cache->end_io_cache();
914
(void) end_io_cache(cache);
965
915
(void) internal::my_close(file, MYF(0));
966
(void) internal::my_delete(path.file_string().c_str(), MYF(0)); // Delete file on error
916
(void) internal::my_delete(path, MYF(0)); // Delete file on error
1044
static int create_file(Session *session,
1045
fs::path &target_path,
1046
file_exchange *exchange,
1047
internal::IO_CACHE *cache)
994
static int create_file(Session *session, char *path, file_exchange *exchange, internal::IO_CACHE *cache)
1049
fs::path to_file(exchange->file_name);
1052
if (not to_file.has_root_directory())
997
uint32_t option= MY_UNPACK_FILENAME | MY_RELATIVE_PATH;
999
#ifdef DONT_ALLOW_FULL_LOAD_DATA_PATHS
1000
option|= MY_REPLACE_DIR; // Force use of db directory
1003
if (!internal::dirname_length(exchange->file_name))
1054
target_path= fs::system_complete(getDataHomeCatalog());
1055
util::string::const_shared_ptr schema(session->schema());
1056
if (schema and not schema->empty())
1058
int count_elements= 0;
1059
for (fs::path::iterator iter= to_file.begin();
1060
iter != to_file.end();
1061
++iter, ++count_elements)
1064
if (count_elements == 1)
1066
target_path /= *schema;
1069
target_path /= to_file;
1005
strcpy(path, getDataHomeCatalog().c_str());
1006
strncat(path, "/", 1);
1007
if (! session->db.empty())
1008
strncat(path, session->db.c_str(), FN_REFLEN-getDataHomeCatalog().size());
1009
(void) internal::fn_format(path, exchange->file_name, path, "", option);
1073
target_path = exchange->file_name;
1012
(void) internal::fn_format(path, exchange->file_name, getDataHomeCatalog().c_str(), "", option);
1076
if (not secure_file_priv.string().empty())
1014
if (opt_secure_file_priv)
1078
if (target_path.file_string().substr(0, secure_file_priv.file_string().size()) != secure_file_priv.file_string())
1016
fs::path secure_file_path(fs::system_complete(fs::path(opt_secure_file_priv)));
1017
fs::path target_path(fs::system_complete(fs::path(path)));
1018
if (target_path.file_string().substr(0, secure_file_path.file_string().size()) != secure_file_path.file_string())
1080
1020
/* Write only allowed to dir or subdir specified by secure_file_priv */
1081
1021
my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--secure-file-priv");
1086
if (!access(target_path.file_string().c_str(), F_OK))
1026
if (!access(path, F_OK))
1088
1028
my_error(ER_FILE_EXISTS_ERROR, MYF(0), exchange->file_name);
1091
1031
/* Create the file world readable */
1092
if ((file= internal::my_create(target_path.file_string().c_str(), 0666, O_WRONLY|O_EXCL, MYF(MY_WME))) < 0)
1032
if ((file= internal::my_create(path, 0666, O_WRONLY|O_EXCL, MYF(MY_WME))) < 0)
1094
1034
(void) fchmod(file, 0666); // Because of umask()
1095
if (cache->init_io_cache(file, 0L, internal::WRITE_CACHE, 0L, 1, MYF(MY_WME)))
1035
if (init_io_cache(cache, file, 0L, internal::WRITE_CACHE, 0L, 1, MYF(MY_WME)))
1097
1037
internal::my_close(file, MYF(0));
1098
internal::my_delete(target_path.file_string().c_str(), MYF(0)); // Delete file on error, it was just created
1038
internal::my_delete(path, MYF(0)); // Delete file on error, it was just created
1109
1049
bool string_results= false, non_string_results= false;
1111
1051
if ((uint32_t) strlen(exchange->file_name) + NAME_LEN >= FN_REFLEN)
1113
path= exchange->file_name;
1052
strncpy(path,exchange->file_name,FN_REFLEN-1);
1116
1054
/* Check if there is any blobs in data */
1301
1237
tmp_buff[1]= *pos ? *pos : '0';
1302
1238
if (my_b_write(cache,(unsigned char*) start,(uint32_t) (pos-start)) ||
1303
1239
my_b_write(cache,(unsigned char*) tmp_buff,2))
1308
1244
if (my_b_write(cache,(unsigned char*) start,(uint32_t) (pos-start)))
1311
1247
else if (my_b_write(cache,(unsigned char*) res->ptr(),used_length))
1314
1250
if (fixed_row_size)
1315
1251
{ // Fill with space
1325
1261
for (; length > sizeof(space) ; length-=sizeof(space))
1327
1263
if (my_b_write(cache,(unsigned char*) space,sizeof(space)))
1330
1266
if (my_b_write(cache,(unsigned char*) space,length))
1334
1270
if (res && enclosed)
1336
1272
if (my_b_write(cache, (unsigned char*) exchange->enclosed->ptr(),
1337
1273
exchange->enclosed->length()))
1340
1276
if (--items_left)
1342
1278
if (my_b_write(cache, (unsigned char*) exchange->field_term->ptr(),
1343
1279
field_term_length))
1347
1283
if (my_b_write(cache,(unsigned char*) exchange->line_term->ptr(),
1348
1284
exchange->line_term->length()))
1391
1326
if (!res) // If NULL
1393
1328
if (my_b_write(cache,(unsigned char*) "",1))
1396
1331
else if (my_b_write(cache,(unsigned char*) res->ptr(),res->length()))
1398
my_error(ER_ERROR_ON_WRITE, MYF(0), path.file_string().c_str(), errno);
1333
my_error(ER_ERROR_ON_WRITE, MYF(0), path, errno);
1457
1394
switch (val_item->result_type())
1459
1396
case REAL_RESULT:
1460
op= &select_max_min_finder_subselect::cmp_real;
1397
op= &select_max_min_finder_subselect::cmp_real;
1462
1399
case INT_RESULT:
1463
op= &select_max_min_finder_subselect::cmp_int;
1400
op= &select_max_min_finder_subselect::cmp_int;
1465
1402
case STRING_RESULT:
1466
op= &select_max_min_finder_subselect::cmp_str;
1403
op= &select_max_min_finder_subselect::cmp_str;
1468
1405
case DECIMAL_RESULT:
1469
1406
op= &select_max_min_finder_subselect::cmp_decimal;
1471
1408
case ROW_RESULT:
1472
1409
// This case should never be choosen
1477
1414
cache->store(val_item);
1560
1497
void Session::end_statement()
1562
1499
/* Cleanup SQL processing state to reuse this statement in next query. */
1564
1501
query_cache_key= ""; // reset the cache key
1565
1502
resetResultsetMessage();
1568
1505
bool Session::copy_db_to(char **p_db, size_t *p_db_length)
1571
if (_schema and _schema->empty())
1573
my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
1576
else if (not _schema)
1578
my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
1583
*p_db= strmake(_schema->c_str(), _schema->size());
1584
*p_db_length= _schema->size();
1509
my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
1512
*p_db= strmake(db.c_str(), db.length());
1513
*p_db_length= db.length();
1625
void Session::set_db(const std::string &new_db)
1553
bool Session::set_db(const std::string &new_db)
1627
1555
/* Do not reallocate memory if current chunk is big enough. */
1628
1556
if (new_db.length())
1630
_schema.reset(new std::string(new_db));
1634
_schema.reset(new std::string(""));
1568
Check the killed state of a user thread
1569
@param session user thread
1570
@retval 0 the user thread is active
1571
@retval 1 the user thread has been killed
1573
int session_killed(const Session *session)
1575
return(session->killed);
1579
const struct charset_info_st *session_charset(Session *session)
1581
return(session->charset());
1640
1585
Mark transaction to rollback and mark error as fatal to a sub-statement.
1657
1602
plugin_sessionvar_cleanup(this);
1659
1604
/* If necessary, log any aborted or unauthorized connections */
1660
if (getKilled() || client->wasAborted())
1605
if (killed || client->wasAborted())
1662
1607
status_var.aborted_threads++;
1665
1610
if (client->wasAborted())
1667
if (not getKilled() && variables.log_warnings > 1)
1612
if (! killed && variables.log_warnings > 1)
1614
SecurityContext *sctx= &security_ctx;
1669
1616
errmsg_printf(ERRMSG_LVL_WARN, ER(ER_NEW_ABORTING_CONNECTION)
1671
, (_schema->empty() ? "unconnected" : _schema->c_str())
1672
, security_ctx->username().empty() == false ? security_ctx->username().c_str() : "unauthenticated"
1673
, security_ctx->address().c_str()
1618
, (db.empty() ? "unconnected" : db.c_str())
1619
, sctx->getUser().empty() == false ? sctx->getUser().c_str() : "unauthenticated"
1620
, sctx->getIp().c_str()
1674
1621
, (main_da.is_error() ? main_da.message() : ER(ER_UNKNOWN_ERROR)));
1678
1625
/* Close out our connection to the client */
1679
1626
if (should_lock)
1680
session::Cache::singleton().mutex().lock();
1682
setKilled(Session::KILL_CONNECTION);
1627
LOCK_thread_count.lock();
1628
killed= Session::KILL_CONNECTION;
1684
1629
if (client->isConnected())
1810
1752
user_var_entry *Session::getVariable(LEX_STRING &name, bool create_if_not_exists)
1812
return getVariable(std::string(name.str, name.length), create_if_not_exists);
1815
user_var_entry *Session::getVariable(const std::string &name, bool create_if_not_exists)
1817
UserVarsRange ppp= user_vars.equal_range(name);
1754
user_var_entry *entry= NULL;
1755
UserVarsRange ppp= user_vars.equal_range(std::string(name.str, name.length));
1819
1757
for (UserVars::iterator iter= ppp.first;
1820
iter != ppp.second; ++iter)
1758
iter != ppp.second; ++iter)
1822
return (*iter).second;
1760
entry= (*iter).second;
1825
if (not create_if_not_exists)
1828
user_var_entry *entry= NULL;
1829
entry= new (nothrow) user_var_entry(name.c_str(), query_id);
1834
std::pair<UserVars::iterator, bool> returnable= user_vars.insert(make_pair(name, entry));
1836
if (not returnable.second)
1763
if ((entry == NULL) && create_if_not_exists)
1765
entry= new (nothrow) user_var_entry(name.str, query_id);
1770
std::pair<UserVars::iterator, bool> returnable= user_vars.insert(make_pair(std::string(name.str, name.length), entry));
1772
if (not returnable.second)
1844
void Session::setVariable(const std::string &name, const std::string &value)
1846
user_var_entry *updateable_var= getVariable(name.c_str(), true);
1848
updateable_var->update_hash(false,
1849
(void*)value.c_str(),
1850
static_cast<uint32_t>(value.length()), STRING_RESULT,
1852
DERIVATION_IMPLICIT, false);
1855
void Open_tables_state::mark_temp_tables_as_free_for_reuse()
1782
void Session::mark_temp_tables_as_free_for_reuse()
1857
1784
for (Table *table= temporary_tables ; table ; table= table->getNext())
1859
if (table->query_id == getQueryId())
1786
if (table->query_id == query_id)
1861
1788
table->query_id= 0;
1862
1789
table->cursor->ha_reset();
1920
1848
handled either before writing a query log event (inside
1921
1849
binlog_query()) or when preparing a pending event.
1851
mysql_unlock_tables(this, lock);
1927
Note that we need to hold table::Cache::singleton().mutex() while changing the
1855
Note that we need to hold LOCK_open while changing the
1928
1856
open_tables list. Another thread may work on it.
1929
(See: table::Cache::singleton().removeTable(), mysql_wait_completed_table())
1857
(See: remove_table_from_cache(), mysql_wait_completed_table())
1930
1858
Closing a MERGE child before the parent would be fatal if the
1931
1859
other thread tries to abort the MERGE lock in between.
1965
1893
close_tables_for_reopen(&tables);
1967
1895
if ((mysql_handle_derived(lex, &mysql_derived_prepare) ||
1896
(fill_derived_tables() &&
1969
1897
mysql_handle_derived(lex, &mysql_derived_filling))))
1903
bool Session::openTables(TableList *tables, uint32_t flags)
1906
bool ret= fill_derived_tables();
1907
assert(ret == false);
1908
if (open_tables_from_list(&tables, &counter, flags) ||
1909
mysql_handle_derived(lex, &mysql_derived_prepare))
1976
1917
@note "best_effort" is used in cases were if a failure occurred on this
1977
1918
operation it would not be surprising because we are only removing because there
1978
1919
might be an issue (lame engines).
1981
bool Open_tables_state::rm_temporary_table(const TableIdentifier &identifier, bool best_effort)
1922
bool Session::rm_temporary_table(TableIdentifier &identifier, bool best_effort)
1983
if (plugin::StorageEngine::dropTable(*static_cast<Session *>(this), identifier))
1924
if (plugin::StorageEngine::dropTable(*this, identifier))
1985
1926
if (not best_effort)
1988
identifier.getSQLPath(path);
1989
1928
errmsg_printf(ERRMSG_LVL_WARN, _("Could not remove temporary table: '%s', error: %d"),
1990
path.c_str(), errno);
1929
identifier.getSQLPath().c_str(), errno);
1999
bool Open_tables_state::rm_temporary_table(plugin::StorageEngine *base, const TableIdentifier &identifier)
1938
bool Session::rm_temporary_table(plugin::StorageEngine *base, TableIdentifier &identifier)
2003
if (plugin::StorageEngine::dropTable(*static_cast<Session *>(this), *base, identifier))
1942
if (plugin::StorageEngine::dropTable(*this, *base, identifier))
2006
identifier.getSQLPath(path);
2007
1944
errmsg_printf(ERRMSG_LVL_WARN, _("Could not remove temporary table: '%s', error: %d"),
2008
path.c_str(), errno);
1945
identifier.getSQLPath().c_str(), errno);
2041
1978
cerr << "\t\t Proto " << proto->schema() << " " << proto->name() << "\n";
2045
1981
cerr << "\tTabl;e Name " << table->getShare()->getSchemaName() << "." << table->getShare()->getTableName() << " : " << answer << "\n";
2050
bool Session::TableMessages::storeTableMessage(const TableIdentifier &identifier, message::Table &table_message)
1985
bool Session::storeTableMessage(const TableIdentifier &identifier, message::Table &table_message)
2052
1987
table_message_cache.insert(make_pair(identifier.getPath(), table_message));
2057
bool Session::TableMessages::removeTableMessage(const TableIdentifier &identifier)
1992
bool Session::removeTableMessage(const TableIdentifier &identifier)
2059
1994
TableMessageCache::iterator iter;
2118
table::Instance *Session::getInstanceTable()
2120
temporary_shares.push_back(new table::Instance()); // This will not go into the tableshare cache, so no key is used.
2122
table::Instance *tmp_share= temporary_shares.back();
2131
Create a reduced Table object with properly set up Field list from a
2132
list of field definitions.
2134
The created table doesn't have a table Cursor associated with
2135
it, has no keys, no group/distinct, no copy_funcs array.
2136
The sole purpose of this Table object is to use the power of Field
2137
class to read/write data to/from table->getInsertRecord(). Then one can store
2138
the record in any container (RB tree, hash, etc).
2139
The table is created in Session mem_root, so are the table's fields.
2140
Consequently, if you don't BLOB fields, you don't need to free it.
2142
@param session connection handle
2143
@param field_list list of column definitions
2146
0 if out of memory, Table object in case of success
2148
table::Instance *Session::getInstanceTable(List<CreateField> &field_list)
2150
temporary_shares.push_back(new table::Instance(this, field_list)); // This will not go into the tableshare cache, so no key is used.
2152
table::Instance *tmp_share= temporary_shares.back();
2161
static const std::string NONE= "NONE";
2162
static const std::string GOT_GLOBAL_READ_LOCK= "HAS GLOBAL READ LOCK";
2163
static const std::string MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT= "HAS GLOBAL READ LOCK WITH BLOCKING COMMIT";
2165
const std::string &type(drizzled::Session::global_read_lock_t type)
2171
case Session::GOT_GLOBAL_READ_LOCK:
2172
return GOT_GLOBAL_READ_LOCK;
2173
case Session::MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT:
2174
return MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT;
2178
size_t max_string_length(drizzled::Session::global_read_lock_t)
2180
return MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT.size();
2183
} /* namespace display */
2053
TableShareInstance *Session::getTemporaryShare(TableIdentifier::Type type_arg)
2055
temporary_shares.push_back(new TableShareInstance(type_arg)); // This will not go into the tableshare cache, so no key is used.
2057
TableShareInstance *tmp_share= temporary_shares.back();
2185
2064
} /* namespace drizzled */