21
21
#ifndef DRIZZLED_SESSION_H
22
22
#define DRIZZLED_SESSION_H
24
/* Classes in mysql */
24
26
#include "drizzled/plugin.h"
25
#include "drizzled/sql_locale.h"
27
#include <drizzled/sql_locale.h>
26
28
#include "drizzled/resource_context.h"
27
#include "drizzled/cursor.h"
28
#include "drizzled/current_session.h"
29
#include "drizzled/sql_error.h"
30
#include "drizzled/file_exchange.h"
31
#include "drizzled/select_result_interceptor.h"
32
#include "drizzled/statistics_variables.h"
33
#include "drizzled/xid.h"
29
#include <drizzled/cursor.h>
30
#include <drizzled/current_session.h>
31
#include <drizzled/sql_error.h>
32
#include <drizzled/file_exchange.h>
33
#include <drizzled/select_result_interceptor.h>
34
#include <drizzled/statistics_variables.h>
35
#include <drizzled/xid.h>
34
36
#include "drizzled/query_id.h"
35
37
#include "drizzled/named_savepoint.h"
36
38
#include "drizzled/transaction_context.h"
37
#include "drizzled/util/storable.h"
38
#include "drizzled/my_hash.h"
39
#include "drizzled/pthread_globals.h"
42
#include <sys/resource.h>
50
#include "drizzled/identifier.h"
51
#include "drizzled/open_tables_state.h"
52
#include "drizzled/internal_error_handler.h"
53
#include "drizzled/diagnostics_area.h"
54
#include "drizzled/plugin/authorization.h"
56
#include <boost/unordered_map.hpp>
58
#include <boost/thread/thread.hpp>
59
#include <boost/thread/mutex.hpp>
60
#include <boost/thread/shared_mutex.hpp>
61
#include <boost/thread/condition_variable.hpp>
62
#include <boost/make_shared.hpp>
46
#include <drizzled/security_context.h>
47
#include <drizzled/open_tables_state.h>
49
#include <drizzled/internal_error_handler.h>
50
#include <drizzled/diagnostics_area.h>
52
#include <drizzled/plugin/authorization.h>
65
54
#define MIN_HANDSHAKE_SIZE 6
399
353
LEX *lex; /**< parse tree descriptor */
405
354
/** query associated with this statement */
406
typedef boost::shared_ptr<const std::string> QueryString;
408
boost::shared_ptr<std::string> query;
410
// Never allow for a modification of this outside of the class. c_str()
411
// requires under some setup non const, you must copy the QueryString in
414
QueryString getQueryString() const
419
void resetQueryString()
426
We need to copy the lock on the string in order to make sure we have a stable string.
427
Once this is done we can use it to build a const char* which can be handed off for
428
a method to use (Innodb is currently the only engine using this).
430
const char *getQueryStringCopy(size_t &length)
432
QueryString tmp_string(getQueryString());
441
length= tmp_string->length();
442
char *to_return= strmake(tmp_string->c_str(), tmp_string->length());
447
std::vector <char> _query;
450
typedef boost::shared_ptr<State> const_shared_ptr;
452
State(const char *in_packet, size_t in_packet_length)
454
if (in_packet_length)
456
size_t minimum= std::min(in_packet_length, static_cast<size_t>(PROCESS_LIST_WIDTH));
457
_query.resize(minimum + 1);
458
memcpy(&_query[0], in_packet, minimum);
466
const char *query() const
474
const char *query(size_t &size) const
478
size= _query.size() -1;
486
friend class Session;
487
typedef boost::shared_ptr<State> shared_ptr;
490
State::shared_ptr _state;
493
State::const_shared_ptr state()
499
358
Name of the current (default) database.
532
379
memory::Root warn_root; /**< Allocation area for warnings and errors */
533
380
plugin::Client *client; /**< Pointer to client object */
535
void setClient(plugin::Client *client_arg);
537
plugin::Client *getClient()
542
381
plugin::Scheduler *scheduler; /**< Pointer to scheduler object */
543
382
void *scheduler_arg; /**< Pointer to the optional scheduler argument */
545
typedef boost::unordered_map< std::string, user_var_entry *, util::insensitive_hash, util::insensitive_equal_to> UserVars;
547
typedef std::pair< UserVars::iterator, UserVars::iterator > UserVarsRange;
548
UserVars user_vars; /**< Hash of user variables defined during the session's lifetime */
552
const UserVars &getUserVariables() const
557
drizzle_system_variables variables; /**< Mutable local variables local to the session */
383
HASH user_vars; /**< Hash of user variables defined during the session's lifetime */
384
struct system_variables variables; /**< Mutable local variables local to the session */
558
385
struct system_status_var status_var; /**< Session-local status counters */
386
struct system_status_var *initial_status_var; /* used by show status */
559
387
THR_LOCK_INFO lock_info; /**< Locking information for this session */
560
388
THR_LOCK_OWNER main_lock_id; /**< To use for conventional queries */
561
389
THR_LOCK_OWNER *lock_id; /**< If not main_lock_id, points to the lock_id of a cursor. */
390
pthread_mutex_t LOCK_delete; /**< Locked before session is deleted */
393
* A peek into the query string for the session. This is a best effort
394
* delivery, there is no guarantee whether the content is meaningful.
396
char process_list_info[PROCESS_LIST_WIDTH+1];
564
399
* A pointer to the stack frame of the scheduler thread
684
481
ResourceContext *getResourceContext(const plugin::MonitoredInTransaction *monitored,
685
482
size_t index= 0);
688
* Structure used to manage "statement transactions" and
689
* "normal transactions". In autocommit mode, the normal transaction is
690
* equivalent to the statement transaction.
692
* Storage engines will be registered here when they participate in
693
* a transaction. No engine is registered more than once.
695
484
struct st_transactions {
696
485
std::deque<NamedSavepoint> savepoints;
699
* The normal transaction (since BEGIN WORK).
701
* Contains a list of all engines that have participated in any of the
702
* statement transactions started within the context of the normal
705
* @note In autocommit mode, this is empty.
707
TransactionContext all;
710
* The statment transaction.
712
* Contains a list of all engines participating in the given statement.
714
* @note In autocommit mode, this will be used to commit/rollback the
715
* normal transaction.
717
TransactionContext stmt;
486
TransactionContext all; ///< Trans since BEGIN WORK
487
TransactionContext stmt; ///< Trans for current statement
719
488
XID_STATE xid_state;
852
605
create_sort_index(); may differ from examined_row_count.
854
607
uint32_t row_count;
855
session_id_t thread_id;
608
pthread_t real_id; /**< For debugging */
856
610
uint32_t tmp_table;
857
enum global_read_lock_t
860
GOT_GLOBAL_READ_LOCK= 1,
861
MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT= 2
864
global_read_lock_t _global_read_lock;
868
global_read_lock_t isGlobalReadLock() const
870
return _global_read_lock;
873
void setGlobalReadLock(global_read_lock_t arg)
875
_global_read_lock= arg;
878
DrizzleLock *lockTables(Table **tables, uint32_t count, uint32_t flags, bool *need_reopen);
879
bool lockGlobalReadLock();
880
bool lock_table_names(TableList *table_list);
881
bool lock_table_names_exclusively(TableList *table_list);
882
bool makeGlobalReadLockBlockCommit();
883
bool abortLockForThread(Table *table);
884
bool wait_if_global_read_lock(bool abort_on_refresh, bool is_not_commit);
885
int lock_table_name(TableList *table_list);
886
void abortLock(Table *table);
887
void removeLock(Table *table);
888
void unlockReadTables(DrizzleLock *sql_lock);
889
void unlockSomeTables(Table **table, uint32_t count);
890
void unlockTables(DrizzleLock *sql_lock);
891
void startWaitingGlobalReadLock();
892
void unlockGlobalReadLock();
895
int unlock_external(Table **table, uint32_t count);
896
int lock_external(Table **tables, uint32_t count);
897
bool wait_for_locked_table_names(TableList *table_list);
898
DrizzleLock *get_lock_data(Table **table_ptr, uint32_t count,
899
bool should_lock, Table **write_lock_used);
611
uint32_t global_read_lock;
902
612
uint32_t server_status;
903
613
uint32_t open_options;
904
614
uint32_t select_number; /**< number of select (used for EXPLAIN) */
1217
923
* Schedule a session to be run on the default scheduler.
1219
static bool schedule(Session::shared_ptr&);
1221
static void unlink(Session::shared_ptr&);
1224
928
For enter_cond() / exit_cond() to work the mutex must be got before
1225
929
enter_cond(); this mutex is then released by exit_cond().
1226
930
Usage must be: lock mutex; enter_cond(); your code; exit_cond().
1228
const char* enter_cond(boost::condition_variable_any &cond, boost::mutex &mutex, const char* msg);
932
const char* enter_cond(pthread_cond_t *cond, pthread_mutex_t* mutex, const char* msg);
1229
933
void exit_cond(const char* old_msg);
1231
935
inline time_t query_start() { return start_time; }
1232
936
inline void set_time()
1234
boost::posix_time::ptime mytime(boost::posix_time::microsec_clock::local_time());
1235
boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));
1236
start_utime= utime_after_lock= (mytime-epoch).total_microseconds();
1240
940
start_time= user_time;
1241
connect_microseconds= start_utime;
941
connect_microseconds= start_utime= utime_after_lock= my_micro_time();
1244
start_time= (mytime-epoch).total_seconds();
944
start_utime= utime_after_lock= my_micro_time_and_time(&start_time);
1246
946
inline void set_current_time() { start_time= time(NULL); }
1247
947
inline void set_time(time_t t)
1249
949
start_time= user_time= t;
1250
boost::posix_time::ptime mytime(boost::posix_time::microsec_clock::local_time());
1251
boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));
1252
uint64_t t_mark= (mytime-epoch).total_microseconds();
1254
start_utime= utime_after_lock= t_mark;
1256
void set_time_after_lock() {
1257
boost::posix_time::ptime mytime(boost::posix_time::microsec_clock::local_time());
1258
boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));
1259
utime_after_lock= (mytime-epoch).total_microseconds();
950
start_utime= utime_after_lock= my_micro_time();
952
void set_time_after_lock() { utime_after_lock= my_micro_time(); }
1262
954
* Returns the current micro-timestamp
1264
956
inline uint64_t getCurrentTimestamp()
1266
boost::posix_time::ptime mytime(boost::posix_time::microsec_clock::local_time());
1267
boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));
1268
uint64_t t_mark= (mytime-epoch).total_microseconds();
958
return my_micro_time();
1272
960
inline uint64_t found_rows(void)
1704
1368
bool openTablesLock(TableList *tables);
1371
* Open all tables in list and process derived tables
1373
* @param Pointer to a list of tables for open
1374
* @param Bitmap of flags to modify how the tables will be open:
1375
* DRIZZLE_LOCK_IGNORE_FLUSH - open table even if someone has
1376
* done a flush or namelock on it.
1385
* This is to be used on prepare stage when you don't read any
1386
* data from the tables.
1388
bool openTables(TableList *tables, uint32_t flags= 0);
1706
1390
int open_tables_from_list(TableList **start, uint32_t *counter, uint32_t flags= 0);
1708
1392
Table *openTableLock(TableList *table_list, thr_lock_type lock_type);
1709
1393
Table *openTable(TableList *table_list, bool *refresh, uint32_t flags= 0);
1711
1395
void unlink_open_table(Table *find);
1712
void drop_open_table(Table *table, const TableIdentifier &identifier);
1396
void drop_open_table(Table *table, TableIdentifier &identifier);
1713
1397
void close_cached_table(Table *table);
1715
1399
/* Create a lock in the cache */
1716
table::Placeholder *table_cache_insert_placeholder(const TableIdentifier &identifier);
1717
bool lock_table_name_if_not_cached(const TableIdentifier &identifier, Table **table);
1719
typedef boost::unordered_map<std::string, message::Table, util::insensitive_hash, util::insensitive_equal_to> TableMessageCache;
1723
TableMessageCache table_message_cache;
1726
bool storeTableMessage(const TableIdentifier &identifier, message::Table &table_message);
1727
bool removeTableMessage(const TableIdentifier &identifier);
1728
bool getTableMessage(const TableIdentifier &identifier, message::Table &table_message);
1729
bool doesTableMessageExist(const TableIdentifier &identifier);
1730
bool renameTableMessage(const TableIdentifier &from, const TableIdentifier &to);
1400
Table *table_cache_insert_placeholder(const char *key, uint32_t key_length);
1401
bool lock_table_name_if_not_cached(TableIdentifier &identifier, Table **table);
1402
bool lock_table_name_if_not_cached(const char *db,
1403
const char *table_name, Table **table);
1405
typedef unordered_map<std::string, message::Table> TableMessageCache;
1406
TableMessageCache table_message_cache;
1408
bool storeTableMessage(TableIdentifier &identifier, message::Table &table_message);
1409
bool removeTableMessage(TableIdentifier &identifier);
1410
bool getTableMessage(TableIdentifier &identifier, message::Table &table_message);
1411
bool doesTableMessageExist(TableIdentifier &identifier);
1412
bool renameTableMessage(TableIdentifier &from, TableIdentifier &to);
1414
/* Work with temporary tables */
1415
Table *find_temporary_table(TableList *table_list);
1416
Table *find_temporary_table(const char *db, const char *table_name);
1417
Table *find_temporary_table(TableIdentifier &identifier);
1419
void doGetTableNames(CachedDirectory &directory,
1420
SchemaIdentifier &schema_identifier,
1421
std::set<std::string>& set_of_names);
1422
void doGetTableNames(SchemaIdentifier &schema_identifier,
1423
std::set<std::string>& set_of_names);
1425
void doGetTableIdentifiers(CachedDirectory &directory,
1426
SchemaIdentifier &schema_identifier,
1427
TableIdentifiers &set_of_identifiers);
1428
void doGetTableIdentifiers(SchemaIdentifier &schema_identifier,
1429
TableIdentifiers &set_of_identifiers);
1431
int doGetTableDefinition(drizzled::TableIdentifier &identifier,
1432
message::Table &table_proto);
1433
bool doDoesTableExist(TableIdentifier &identifier);
1435
void close_temporary_tables();
1436
void close_temporary_table(Table *table);
1437
// The method below just handles the de-allocation of the table. In
1438
// a better memory type world, this would not be needed.
1734
TableMessages _table_message_cache;
1440
void nukeTable(Table *table);
1737
TableMessages &getMessageCache()
1739
return _table_message_cache;
1443
void dumpTemporaryTableNames(const char *id);
1444
int drop_temporary_table(TableList *table_list);
1445
bool rm_temporary_table(plugin::StorageEngine *base, TableIdentifier &identifier);
1446
bool rm_temporary_table(TableIdentifier &identifier);
1447
Table *open_temporary_table(TableIdentifier &identifier,
1448
bool link_in_list= true);
1742
1450
/* Reopen operations */
1743
1451
bool reopen_tables(bool get_locks, bool mark_share_as_old);
1452
bool reopen_name_locked_table(TableList* table_list, bool link_in);
1744
1453
bool close_cached_tables(TableList *tables, bool wait_for_refresh, bool wait_for_placeholders);
1746
void wait_for_condition(boost::mutex &mutex, boost::condition_variable_any &cond);
1455
void wait_for_condition(pthread_mutex_t *mutex, pthread_cond_t *cond);
1747
1456
int setup_conds(TableList *leaves, COND **conds);
1748
1457
int lock_tables(TableList *tables, uint32_t count, bool *need_reopen);
1750
drizzled::util::Storable *getProperty(const std::string &arg)
1752
return life_properties[arg];
1756
bool setProperty(const std::string &arg, T *value)
1758
life_properties[arg]= value;
1459
Table *create_virtual_tmp_table(List<CreateField> &field_list);
1764
1464
Return the default storage engine