17
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
21
#ifndef DRIZZLED_SESSION_H
21
22
#define DRIZZLED_SESSION_H
25
#include <boost/make_shared.hpp>
26
#include <boost/thread/condition_variable.hpp>
27
#include <boost/thread/mutex.hpp>
28
#include <boost/thread/shared_mutex.hpp>
29
#include <boost/thread/thread.hpp>
24
/* Classes in mysql */
26
#include "drizzled/plugin.h"
27
#include <drizzled/sql_locale.h>
28
#include "drizzled/resource_context.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>
36
#include "drizzled/query_id.h"
37
#include "drizzled/named_savepoint.h"
38
#include "drizzled/transaction_context.h"
33
#include <sys/resource.h>
36
#include <drizzled/catalog/instance.h>
37
#include <drizzled/catalog/local.h>
38
#include <drizzled/copy_info.h>
39
#include <drizzled/cursor.h>
46
#include <drizzled/security_context.h>
47
#include <drizzled/open_tables_state.h>
49
#include <drizzled/internal_error_handler.h>
40
50
#include <drizzled/diagnostics_area.h>
41
#include <drizzled/file_exchange.h>
42
#include <drizzled/ha_data.h>
43
#include <drizzled/identifier.h>
44
#include <drizzled/lex_column.h>
45
#include <drizzled/my_hash.h>
46
#include <drizzled/named_savepoint.h>
47
#include <drizzled/open_tables_state.h>
48
#include <drizzled/plugin.h>
49
52
#include <drizzled/plugin/authorization.h>
50
#include <drizzled/pthread_globals.h>
51
#include <drizzled/query_id.h>
52
#include <drizzled/resource_context.h>
53
#include <drizzled/session/property_map.h>
54
#include <drizzled/session/state.h>
55
#include <drizzled/session/table_messages.h>
56
#include <drizzled/session/transactions.h>
57
#include <drizzled/sql_error.h>
58
#include <drizzled/sql_lex.h>
59
#include <drizzled/sql_locale.h>
60
#include <drizzled/statistics_variables.h>
61
#include <drizzled/system_variables.h>
62
#include <drizzled/system_variables.h>
63
#include <drizzled/table_ident.h>
64
#include <drizzled/transaction_context.h>
65
#include <drizzled/util/storable.h>
66
#include <drizzled/var.h>
67
#include <drizzled/visibility.h>
69
54
#define MIN_HANDSHAKE_SIZE 6
106
88
#define TC_HEURISTIC_RECOVER_ROLLBACK 2
107
89
extern uint32_t tc_heuristic_recover;
93
Local storage for proto that are tmp table. This should be enlarged
94
to hande the entire table-share for a local table. Once Hash is done,
95
we should consider exchanging the map for it.
97
typedef std::map <std::string, message::Table> ProtoCache;
100
The COPY_INFO structure is used by INSERT/REPLACE code.
101
The schema of the row counting by the INSERT/INSERT ... ON DUPLICATE KEY
103
If a row is inserted then the copied variable is incremented.
104
If a row is updated by the INSERT ... ON DUPLICATE KEY UPDATE and the
105
new data differs from the old one then the copied and the updated
106
variables are incremented.
107
The touched variable is incremented if a row was touched by the update part
108
of the INSERT ... ON DUPLICATE KEY UPDATE no matter whether the row
109
was actually changed or not.
111
typedef struct st_copy_info
113
ha_rows records; /**< Number of processed records */
114
ha_rows deleted; /**< Number of deleted records */
115
ha_rows updated; /**< Number of updated records */
116
ha_rows copied; /**< Number of copied records */
118
ha_rows touched; /* Number of touched records */
119
enum enum_duplicates handle_duplicates;
120
int escape_char, last_errno;
122
/* for INSERT ... UPDATE */
123
List<Item> *update_fields;
124
List<Item> *update_values;
125
/* for VIEW ... WITH CHECK OPTION */
128
typedef struct drizzled_lock_st
131
uint32_t table_count;
133
THR_LOCK_DATA **locks;
136
} /* namespace drizzled */
138
/** @TODO why is this in the middle of the file */
139
#include <drizzled/lex_column.h>
109
147
#define Session_SENTRY_MAGIC 0xfeedd1ff
110
148
#define Session_SENTRY_GONE 0xdeadbeef
112
extern DRIZZLED_API struct drizzle_system_variables global_system_variables;
150
struct system_variables
152
system_variables() {};
154
How dynamically allocated system variables are handled:
156
The global_system_variables and max_system_variables are "authoritative"
157
They both should have the same 'version' and 'size'.
158
When attempting to access a dynamic variable, if the session version
159
is out of date, then the session version is updated and realloced if
160
neccessary and bytes copied from global to make up for missing data.
162
ulong dynamic_variables_version;
163
char * dynamic_variables_ptr;
164
uint32_t dynamic_variables_head; /* largest valid variable offset */
165
uint32_t dynamic_variables_size; /* how many bytes are in use */
167
uint64_t myisam_max_extra_sort_file_size;
168
uint64_t max_heap_table_size;
169
uint64_t tmp_table_size;
170
ha_rows select_limit;
171
ha_rows max_join_size;
172
uint64_t auto_increment_increment;
173
uint64_t auto_increment_offset;
174
uint64_t bulk_insert_buff_size;
175
uint64_t join_buff_size;
176
uint32_t max_allowed_packet;
177
uint64_t max_error_count;
178
uint64_t max_length_for_sort_data;
179
size_t max_sort_length;
180
uint64_t min_examined_row_limit;
181
bool optimizer_prune_level;
184
uint32_t optimizer_search_depth;
185
uint32_t div_precincrement;
186
uint64_t preload_buff_size;
187
uint32_t read_buff_size;
188
uint32_t read_rnd_buff_size;
189
size_t sortbuff_size;
190
uint32_t thread_handling;
191
uint32_t tx_isolation;
192
uint32_t completion_type;
193
/* Determines which non-standard SQL behaviour should be enabled */
195
uint64_t max_seeks_for_key;
196
size_t range_alloc_block_size;
197
uint32_t query_alloc_block_size;
198
uint32_t query_prealloc_size;
199
uint64_t group_concat_max_len;
200
uint64_t pseudo_thread_id;
202
plugin::StorageEngine *storage_engine;
204
/* Only charset part of these variables is sensible */
205
const CHARSET_INFO *character_set_filesystem;
207
/* Both charset and collation parts of these variables are important */
208
const CHARSET_INFO *collation_server;
210
inline const CHARSET_INFO *getCollation(void)
212
return collation_server;
216
MY_LOCALE *lc_time_names;
218
Time_zone *time_zone;
221
extern struct system_variables global_system_variables;
223
} /* namespace drizzled */
225
#include "drizzled/sql_lex.h"
230
void mark_transaction_to_rollback(Session *session, bool all);
232
extern pthread_mutex_t LOCK_xid_cache;
233
extern HASH xid_cache;
236
Storage engine specific thread local data.
241
Storage engine specific thread local data.
242
Lifetime: one user connection.
246
* Resource contexts for both the "statement" and "normal"
249
* Resource context at index 0:
251
* Life time: one statement within a transaction. If @@autocommit is
252
* on, also represents the entire transaction.
254
* Resource context at index 1:
256
* Life time: one transaction within a connection.
260
* If the storage engine does not participate in a transaction,
261
* there will not be a resource context.
263
drizzled::ResourceContext resource_context[2];
265
Ha_data() :ha_ptr(NULL) {}
115
269
* Represents a client connection to the database server.
213
350
* @todo should be const
217
353
LEX *lex; /**< parse tree descriptor */
225
enum_sql_command getSqlCommand() const
227
return lex->sql_command;
230
354
/** query associated with this statement */
231
typedef boost::shared_ptr<const std::string> QueryString;
234
boost::shared_ptr<std::string> query;
236
// Never allow for a modification of this outside of the class. c_str()
237
// requires under some setup non const, you must copy the QueryString in
240
QueryString getQueryString() const
245
void resetQueryString()
252
We need to copy the lock on the string in order to make sure we have a stable string.
253
Once this is done we can use it to build a const char* which can be handed off for
254
a method to use (Innodb is currently the only engine using this).
256
const char *getQueryStringCopy(size_t &length)
258
QueryString tmp_string(getQueryString());
266
length= tmp_string->length();
267
char *to_return= strmake(tmp_string->c_str(), tmp_string->length());
272
session::State::shared_ptr _state;
276
session::State::const_shared_ptr state()
282
358
Name of the current (default) database.
314
377
static const char * const DEFAULT_WHERE;
316
379
memory::Root warn_root; /**< Allocation area for warnings and errors */
318
380
plugin::Client *client; /**< Pointer to client object */
322
void setClient(plugin::Client *client_arg);
324
plugin::Client *getClient()
329
plugin::Client *getClient() const
334
381
plugin::Scheduler *scheduler; /**< Pointer to scheduler object */
335
382
void *scheduler_arg; /**< Pointer to the optional scheduler argument */
337
typedef boost::unordered_map< std::string, user_var_entry *, util::insensitive_hash, util::insensitive_equal_to> UserVars;
340
typedef std::pair< UserVars::iterator, UserVars::iterator > UserVarsRange;
341
UserVars user_vars; /**< Hash of user variables defined during the session's lifetime */
344
const UserVars &getUserVariables() const
349
drizzle_system_variables variables; /**< Mutable local variables local to the session */
351
enum_tx_isolation getTxIsolation()
353
return (enum_tx_isolation)variables.tx_isolation;
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 */
356
385
struct system_status_var status_var; /**< Session-local status counters */
386
struct system_status_var *initial_status_var; /* used by show status */
357
387
THR_LOCK_INFO lock_info; /**< Locking information for this session */
358
388
THR_LOCK_OWNER main_lock_id; /**< To use for conventional queries */
359
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];
362
399
* A pointer to the stack frame of the scheduler thread
365
402
char *thread_stack;
368
identifier::User::shared_ptr security_ctx;
370
int32_t scoreboard_index;
405
SecurityContext security_ctx;
372
407
inline void checkSentry() const
374
409
assert(this->dbug_sentry == Session_SENTRY_MAGIC);
378
identifier::User::const_shared_ptr user() const
383
return identifier::User::const_shared_ptr();
386
void setUser(identifier::User::shared_ptr arg)
391
int32_t getScoreboardIndex()
393
return scoreboard_index;
396
void setScoreboardIndex(int32_t in_scoreboard_index)
398
scoreboard_index= in_scoreboard_index;
412
const SecurityContext& getSecurityContext() const
417
SecurityContext& getSecurityContext()
402
423
* Is this session viewable by the current user?
404
bool isViewable(identifier::User::const_reference) const;
425
bool isViewable() const
427
return plugin::Authorization::isAuthorized(current_session->getSecurityContext(),
408
433
Used in error messages to tell user in what part of MySQL we found an
409
434
error. E. g. when where= "having clause", if fix_fields() fails, user
410
435
will know that the error was in having clause.
420
void setWhere(const char *arg)
426
440
One thread can hold up to one named user-level lock. This variable
466
451
uint32_t file_id; /**< File ID for LOAD DATA INFILE */
467
452
/* @note the following three members should likely move to Client */
468
453
uint32_t max_client_packet_length; /**< Maximum number of bytes a client can send in a single packet */
471
boost::posix_time::ptime _epoch;
472
boost::posix_time::ptime _connect_time;
473
boost::posix_time::ptime _start_timer;
474
boost::posix_time::ptime _end_timer;
476
boost::posix_time::ptime _user_time;
478
uint64_t utime_after_lock; // This used by Innodb.
482
_user_time= boost::posix_time::not_a_date_time;
485
const boost::posix_time::ptime &start_timer() const
490
void getTimeDifference(boost::posix_time::time_duration &result_arg, const boost::posix_time::ptime &arg) const
492
result_arg= arg - _start_timer;
456
uint64_t thr_create_utime; /**< track down slow pthread_create */
457
uint64_t start_utime;
458
uint64_t utime_after_lock;
495
460
thr_lock_type update_lock_default;
512
477
query_id_t query_id;
513
478
query_id_t warn_query_id;
516
480
void **getEngineData(const plugin::MonitoredInTransaction *monitored);
517
481
ResourceContext *getResourceContext(const plugin::MonitoredInTransaction *monitored,
518
482
size_t index= 0);
520
session::Transactions transaction;
484
struct st_transactions {
485
std::deque<NamedSavepoint> savepoints;
486
TransactionContext all; ///< Trans since BEGIN WORK
487
TransactionContext stmt; ///< Trans for current statement
522
502
Field *dup_field;
523
503
sigset_t signals;
525
// As of right now we do not allow a concurrent execute to launch itself
527
bool concurrent_execute_allowed;
531
void setConcurrentExecute(bool arg)
533
concurrent_execute_allowed= arg;
536
bool isConcurrentExecuteAllowed() const
538
return concurrent_execute_allowed;
541
505
/* Tells if LAST_INSERT_ID(#) was called for the current statement */
542
506
bool arg_of_last_insert_id_function;
545
508
ALL OVER THIS FILE, "insert_id" means "*automatically generated* value for
546
509
insertion into an auto_increment column".
648
605
create_sort_index(); may differ from examined_row_count.
650
607
uint32_t row_count;
652
uint32_t getRowCount() const
657
session_id_t thread_id;
608
pthread_t real_id; /**< For debugging */
658
610
uint32_t tmp_table;
659
enum global_read_lock_t
662
GOT_GLOBAL_READ_LOCK= 1,
663
MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT= 2
666
global_read_lock_t _global_read_lock;
670
global_read_lock_t isGlobalReadLock() const
672
return _global_read_lock;
675
void setGlobalReadLock(global_read_lock_t arg)
677
_global_read_lock= arg;
680
DrizzleLock *lockTables(Table **tables, uint32_t count, uint32_t flags);
681
bool lockGlobalReadLock();
682
bool lock_table_names(TableList *table_list);
683
bool lock_table_names_exclusively(TableList *table_list);
684
bool makeGlobalReadLockBlockCommit();
685
bool abortLockForThread(Table *table);
686
bool wait_if_global_read_lock(bool abort_on_refresh, bool is_not_commit);
687
int lock_table_name(TableList *table_list);
688
void abortLock(Table *table);
689
void removeLock(Table *table);
690
void unlockReadTables(DrizzleLock *sql_lock);
691
void unlockSomeTables(Table **table, uint32_t count);
692
void unlockTables(DrizzleLock *sql_lock);
693
void startWaitingGlobalReadLock();
694
void unlockGlobalReadLock();
697
int unlock_external(Table **table, uint32_t count);
698
int lock_external(Table **tables, uint32_t count);
699
bool wait_for_locked_table_names(TableList *table_list);
700
DrizzleLock *get_lock_data(Table **table_ptr, uint32_t count,
701
bool should_lock, Table **write_lock_used);
611
uint32_t global_read_lock;
704
612
uint32_t server_status;
705
613
uint32_t open_options;
706
614
uint32_t select_number; /**< number of select (used for EXPLAIN) */
1034
923
* Schedule a session to be run on the default scheduler.
1036
static bool schedule(Session::shared_ptr&);
1038
static void unlink(session_id_t &session_id);
1039
static void unlink(Session::shared_ptr&);
1042
928
For enter_cond() / exit_cond() to work the mutex must be got before
1043
929
enter_cond(); this mutex is then released by exit_cond().
1044
930
Usage must be: lock mutex; enter_cond(); your code; exit_cond().
1046
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);
1047
933
void exit_cond(const char* old_msg);
1049
type::Time::epoch_t query_start()
1051
return getCurrentTimestampEpoch();
1056
_end_timer= _start_timer= boost::posix_time::microsec_clock::universal_time();
1057
utime_after_lock= (_start_timer - _epoch).total_microseconds();
1060
void set_time(time_t t) // This is done by a sys_var, as long as user_time is set, we will use that for all references to time
1062
_user_time= boost::posix_time::from_time_t(t);
1065
void set_time_after_lock()
1067
boost::posix_time::ptime mytime(boost::posix_time::microsec_clock::universal_time());
1068
utime_after_lock= (mytime - _epoch).total_microseconds();
1071
void set_end_timer()
1073
_end_timer= boost::posix_time::microsec_clock::universal_time();
1074
status_var.execution_time_nsec+=(_end_timer - _start_timer).total_microseconds();
1077
uint64_t getElapsedTime() const
1079
return (_end_timer - _start_timer).total_microseconds();
935
inline time_t query_start() { return start_time; }
936
inline void set_time()
940
start_time= user_time;
941
connect_microseconds= start_utime= utime_after_lock= my_micro_time();
944
start_utime= utime_after_lock= my_micro_time_and_time(&start_time);
946
inline void set_current_time() { start_time= time(NULL); }
947
inline void set_time(time_t t)
949
start_time= user_time= t;
950
start_utime= utime_after_lock= my_micro_time();
952
void set_time_after_lock() { utime_after_lock= my_micro_time(); }
1083
954
* Returns the current micro-timestamp
1085
type::Time::epoch_t getCurrentTimestamp(bool actual= true) const
1087
type::Time::epoch_t t_mark;
1091
boost::posix_time::ptime mytime(boost::posix_time::microsec_clock::universal_time());
1092
t_mark= (mytime - _epoch).total_microseconds();
1096
t_mark= (_end_timer - _epoch).total_microseconds();
1102
// We may need to set user on this
1103
type::Time::epoch_t getCurrentTimestampEpoch() const
1105
if (not _user_time.is_not_a_date_time())
1106
return (_user_time - _epoch).total_seconds();
1108
return (_start_timer - _epoch).total_seconds();
1111
type::Time::epoch_t getCurrentTimestampEpoch(type::Time::usec_t &fraction_arg) const
1113
if (not _user_time.is_not_a_date_time())
1116
return (_user_time - _epoch).total_seconds();
1119
fraction_arg= _start_timer.time_of_day().fractional_seconds() % 1000000;
1120
return (_start_timer - _epoch).total_seconds();
1123
uint64_t found_rows(void) const
956
inline uint64_t getCurrentTimestamp()
958
return my_micro_time();
960
inline uint64_t found_rows(void)
1125
962
return limit_found_rows;
1128
964
/** Returns whether the session is currently inside a transaction */
1129
bool inTransaction() const
965
inline bool inTransaction()
1131
967
return server_status & SERVER_STATUS_IN_TRANS;
969
inline bool fill_derived_tables()
971
return !lex->only_view_structure();
1134
974
LEX_STRING *make_lex_string(LEX_STRING *lex_str,
1135
975
const char* str, uint32_t length,
1136
976
bool allocate_lex_string);
1138
977
LEX_STRING *make_lex_string(LEX_STRING *lex_str,
1139
978
const std::string &str,
1140
979
bool allocate_lex_string);
1142
981
int send_explain_fields(select_result *result);
1145
983
Clear the current error, if any.
1146
984
We do not clear is_fatal_error or is_fatal_sub_stmt_error since we
1305
1131
* Current implementation does not depend on that, but future changes
1306
1132
* should be done with this in mind;
1308
* @param passwd Scrambled password received from client
1309
* @param db Database name to connect to, may be NULL
1134
* @param Scrambled password received from client
1135
* @param Length of scrambled password
1136
* @param Database name to connect to, may be NULL
1311
bool checkUser(const std::string &passwd, const std::string &db);
1138
bool checkUser(const char *passwd, uint32_t passwd_len, const char *db);
1314
1141
* Returns the timestamp (in microseconds) of when the Session
1315
1142
* connected to the server.
1317
uint64_t getConnectMicroseconds() const
1319
return (_connect_time - _epoch).total_microseconds();
1322
uint64_t getConnectSeconds() const
1324
return (_connect_time - _epoch).total_seconds();
1144
inline uint64_t getConnectMicroseconds() const
1146
return connect_microseconds;
1567
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);
1569
1390
int open_tables_from_list(TableList **start, uint32_t *counter, uint32_t flags= 0);
1571
1392
Table *openTableLock(TableList *table_list, thr_lock_type lock_type);
1572
1393
Table *openTable(TableList *table_list, bool *refresh, uint32_t flags= 0);
1574
1395
void unlink_open_table(Table *find);
1575
void drop_open_table(Table *table, const identifier::Table &identifier);
1396
void drop_open_table(Table *table, TableIdentifier &identifier);
1576
1397
void close_cached_table(Table *table);
1578
1399
/* Create a lock in the cache */
1579
table::Placeholder *table_cache_insert_placeholder(const identifier::Table &identifier);
1580
bool lock_table_name_if_not_cached(const identifier::Table &identifier, Table **table);
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.
1583
session::TableMessages _table_message_cache;
1440
void nukeTable(Table *table);
1586
session::TableMessages &getMessageCache()
1588
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);
1591
1450
/* Reopen operations */
1592
bool reopen_tables();
1451
bool reopen_tables(bool get_locks, bool mark_share_as_old);
1452
bool reopen_name_locked_table(TableList* table_list, bool link_in);
1593
1453
bool close_cached_tables(TableList *tables, bool wait_for_refresh, bool wait_for_placeholders);
1595
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);
1596
1456
int setup_conds(TableList *leaves, COND **conds);
1597
1457
int lock_tables(TableList *tables, uint32_t count, bool *need_reopen);
1599
drizzled::util::Storable *getProperty(const std::string &arg)
1601
return life_properties.getProperty(arg);
1605
bool setProperty(const std::string &arg, T *value)
1607
life_properties.setProperty(arg, value);
1459
Table *create_virtual_tmp_table(List<CreateField> &field_list);
1613
1464
Return the default storage engine
1622
1473
if (variables.storage_engine)
1623
1474
return variables.storage_engine;
1624
1475
return global_system_variables.storage_engine;
1627
void get_xid(DrizzleXid *xid); // Innodb only
1629
table::Singular *getInstanceTable();
1630
table::Singular *getInstanceTable(List<CreateField> &field_list);
1478
static void unlink(Session *session);
1480
void get_xid(DRIZZLE_XID *xid); // Innodb only
1635
if (getrusage(RUSAGE_THREAD, &usage))
1483
std::vector<TableShareInstance *> temporary_shares;
1645
void setUsage(bool arg)
1650
const struct rusage &getUsage()
1655
catalog::Instance::const_reference catalog() const
1657
return *(_catalog.get());
1660
catalog::Instance::reference catalog()
1662
return *(_catalog.get());
1666
catalog::Instance::shared_ptr _catalog;
1668
// This lives throughout the life of Session
1670
session::PropertyMap life_properties;
1671
std::vector<table::Singular *> temporary_shares;
1672
struct rusage usage;
1486
TableShareInstance *getTemporaryShare(const char *tmpname_arg);
1487
TableShareInstance *getTemporaryShare();
1675
1492
#define ESCAPE_CHARS "ntrb0ZN" // keep synchronous with READ_INFO::unescape
1494
} /* namespace drizzled */
1496
/** @TODO why is this in the middle of the file */
1497
#include <drizzled/select_to_file.h>
1498
#include <drizzled/select_export.h>
1499
#include <drizzled/select_dump.h>
1500
#include <drizzled/select_insert.h>
1501
#include <drizzled/select_create.h>
1502
#include <drizzled/tmp_table_param.h>
1503
#include <drizzled/select_union.h>
1504
#include <drizzled/select_subselect.h>
1505
#include <drizzled/select_singlerow_subselect.h>
1506
#include <drizzled/select_max_min_finder_subselect.h>
1507
#include <drizzled/select_exists_subselect.h>
1513
* A structure used to describe sort information
1514
* for a field or item used in ORDER BY.
1516
typedef struct st_sort_field
1518
Field *field; /**< Field to sort */
1519
Item *item; /**< Item if not sorting fields */
1520
size_t length; /**< Length of sort field */
1521
uint32_t suffix_length; /**< Length suffix (0-4) */
1522
Item_result result_type; /**< Type of item */
1523
bool reverse; /**< if descending sort */
1524
bool need_strxnfrm; /**< If we have to use strxnfrm() */
1527
typedef struct st_sort_buffer
1529
uint32_t index; /* 0 or 1 */
1530
uint32_t sort_orders;
1531
uint32_t change_pos; /* If sort-fields changed */
1533
SORT_FIELD *sortorder;
1536
} /* namespace drizzled */
1538
/** @TODO why is this in the middle of the file */
1540
#include <drizzled/table_ident.h>
1541
#include <drizzled/user_var_entry.h>
1542
#include <drizzled/unique.h>
1543
#include <drizzled/var.h>
1544
#include <drizzled/select_dumpvar.h>
1677
1549
/* Bits in sql_command_flags */
1679
1551
enum sql_command_flag_bits