~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/session.h

  • Committer: Lee Bieber
  • Date: 2011-03-13 16:37:38 UTC
  • mfrom: (2227.4.18 session2)
  • Revision ID: kalebral@gmail.com-20110313163738-7ti21zk40o2xi3ew
Merge Olaf - Refactor Session

Show diffs side-by-side

added added

removed removed

Lines of Context:
38
38
#include <drizzled/copy_info.h>
39
39
#include <drizzled/cursor.h>
40
40
#include <drizzled/diagnostics_area.h>
 
41
#include <drizzled/error.h>
41
42
#include <drizzled/file_exchange.h>
42
43
#include <drizzled/ha_data.h>
43
44
#include <drizzled/identifier.h>
69
70
 
70
71
#define MIN_HANDSHAKE_SIZE      6
71
72
 
72
 
namespace drizzled
73
 
{
 
73
namespace drizzled {
74
74
 
75
75
namespace plugin
76
76
{
77
 
class Client;
78
 
class Scheduler;
79
 
class EventObserverList;
 
77
        class Client;
 
78
        class Scheduler;
 
79
        class EventObserverList;
80
80
}
81
81
 
82
82
namespace message
83
83
{
84
 
class Transaction;
85
 
class Statement;
86
 
class Resultset;
 
84
        class Transaction;
 
85
        class Statement;
 
86
        class Resultset;
87
87
}
88
88
 
89
89
namespace internal { struct st_my_thread_var; }
162
162
  enum enum_mark_columns mark_used_columns;
163
163
  inline void* calloc(size_t size)
164
164
  {
165
 
    void *ptr;
166
 
    if ((ptr= mem_root->alloc_root(size)))
 
165
    void *ptr= mem_root->alloc_root(size);
 
166
    if (ptr)
167
167
      memset(ptr, 0, size);
168
168
    return ptr;
169
169
  }
174
174
 
175
175
  inline void *memdup_w_gap(const void *str, size_t size, uint32_t gap)
176
176
  {
177
 
    void *ptr;
178
 
    if ((ptr= mem_root->alloc_root(size + gap)))
179
 
      memcpy(ptr,str,size);
 
177
    void *ptr= mem_root->alloc_root(size + gap);
 
178
    if (ptr)
 
179
      memcpy(ptr, str, size);
180
180
    return ptr;
181
181
  }
182
182
  /** Frees all items attached to this Statement */
189
189
  Item *free_list;
190
190
  memory::Root *mem_root; /**< Pointer to current memroot */
191
191
 
192
 
 
193
192
  memory::Root *getMemRoot()
194
193
  {
195
194
    return mem_root;
196
195
  }
197
196
 
198
 
  uint64_t xa_id;
199
 
 
200
197
  uint64_t getXaId()
201
198
  {
202
199
    return xa_id;
207
204
    xa_id= in_xa_id;
208
205
  }
209
206
 
210
 
  /**
211
 
   * Uniquely identifies each statement object in thread scope; change during
212
 
   * statement lifetime.
213
 
   *
214
 
   * @todo should be const
215
 
   */
216
 
  uint32_t id;
217
 
 
218
207
public:
219
 
  const LEX* getLex() const
 
208
  const LEX& lex() const
220
209
  {
221
 
    return &main_lex;
 
210
    return main_lex;
222
211
  }
223
 
  LEX* getLex()
 
212
 
 
213
  LEX& lex()
224
214
  {
225
 
    return &main_lex;
 
215
    return main_lex;
226
216
  }
227
217
 
228
218
  enum_sql_command getSqlCommand() const
229
219
  {
230
 
    return getLex()->sql_command;
 
220
    return lex().sql_command;
231
221
  }
232
222
 
233
223
  /** query associated with this statement */
356
346
    return (enum_tx_isolation)variables.tx_isolation;
357
347
  }
358
348
 
359
 
  struct system_status_var status_var; /**< Session-local status counters */
 
349
  system_status_var status_var; /**< Session-local status counters */
360
350
  THR_LOCK_INFO lock_info; /**< Locking information for this session */
361
351
  THR_LOCK_OWNER main_lock_id; /**< To use for conventional queries */
362
352
  THR_LOCK_OWNER *lock_id; /**< If not main_lock_id, points to the lock_id of a cursor. */
525
515
  Field *dup_field;
526
516
  sigset_t signals;
527
517
 
 
518
public:
528
519
  // As of right now we do not allow a concurrent execute to launch itself
529
 
private:
530
 
  bool concurrent_execute_allowed;
531
 
 
532
 
public:
533
 
 
534
520
  void setConcurrentExecute(bool arg)
535
521
  {
536
522
    concurrent_execute_allowed= arg;
541
527
    return concurrent_execute_allowed;
542
528
  }
543
529
 
544
 
  /* Tells if LAST_INSERT_ID(#) was called for the current statement */
545
 
  bool arg_of_last_insert_id_function;
546
 
 
547
530
  /*
548
531
    ALL OVER THIS FILE, "insert_id" means "*automatically generated* value for
549
532
    insertion into an auto_increment column".
773
756
  bool substitute_null_with_insert_id;
774
757
  bool cleanup_done;
775
758
 
776
 
private:
777
 
  bool abort_on_warning;
778
 
  bool tablespace_op; /**< This is true in DISCARD/IMPORT TABLESPACE */
779
 
 
780
759
public:
781
760
  bool got_warning; /**< Set on call to push_warning() */
782
761
  bool no_warnings_for_error; /**< no warnings on call to my_error() */
783
762
  /** set during loop of derived table processing */
784
763
  bool derived_tables_processing;
785
764
 
786
 
  bool doing_tablespace_operation(void)
 
765
  bool doing_tablespace_operation()
787
766
  {
788
767
    return tablespace_op;
789
768
  }
919
898
    if (first_successful_insert_id_in_cur_stmt == 0)
920
899
      first_successful_insert_id_in_cur_stmt= id_arg;
921
900
  }
922
 
  inline uint64_t read_first_successful_insert_id_in_prev_stmt(void)
 
901
  inline uint64_t read_first_successful_insert_id_in_prev_stmt()
923
902
  {
924
903
    return first_successful_insert_id_in_prev_stmt;
925
904
  }
937
916
  Session(plugin::Client *client_arg, catalog::Instance::shared_ptr catalog);
938
917
  virtual ~Session();
939
918
 
940
 
  void cleanup(void);
 
919
  void cleanup();
941
920
  /**
942
921
   * Cleans up after query.
943
922
   *
1067
1046
 
1068
1047
  void set_time_after_lock()
1069
1048
  {
1070
 
    boost::posix_time::ptime mytime(boost::posix_time::microsec_clock::universal_time());
1071
 
    utime_after_lock= (mytime - _epoch).total_microseconds();
 
1049
    utime_after_lock= (boost::posix_time::microsec_clock::universal_time() - _epoch).total_microseconds();
1072
1050
  }
1073
1051
 
1074
1052
  void set_end_timer()
1087
1065
   */
1088
1066
  type::Time::epoch_t getCurrentTimestamp(bool actual= true) const
1089
1067
  {
1090
 
    type::Time::epoch_t t_mark;
1091
 
 
1092
 
    if (actual)
1093
 
    {
1094
 
      boost::posix_time::ptime mytime(boost::posix_time::microsec_clock::universal_time());
1095
 
      t_mark= (mytime - _epoch).total_microseconds();
1096
 
    }
1097
 
    else
1098
 
    {
1099
 
      t_mark= (_end_timer - _epoch).total_microseconds();
1100
 
    }
1101
 
 
1102
 
    return t_mark;
 
1068
    return ((actual ? boost::posix_time::microsec_clock::universal_time() : _end_timer) - _epoch).total_microseconds();
1103
1069
  }
1104
1070
 
1105
1071
  // We may need to set user on this
1106
1072
  type::Time::epoch_t getCurrentTimestampEpoch() const
1107
1073
  {
1108
 
    if (not _user_time.is_not_a_date_time())
1109
 
      return (_user_time - _epoch).total_seconds();
1110
 
 
1111
 
    return (_start_timer - _epoch).total_seconds();
 
1074
                return ((_user_time.is_not_a_date_time() ? _start_timer : _user_time) - _epoch).total_seconds();
1112
1075
  }
1113
1076
 
1114
1077
  type::Time::epoch_t getCurrentTimestampEpoch(type::Time::usec_t &fraction_arg) const
1123
1086
    return (_start_timer - _epoch).total_seconds();
1124
1087
  }
1125
1088
 
1126
 
  uint64_t found_rows(void) const
 
1089
  uint64_t found_rows() const
1127
1090
  {
1128
1091
    return limit_found_rows;
1129
1092
  }
1392
1355
    resultset= NULL;
1393
1356
  }
1394
1357
 
1395
 
private:
1396
 
  /** Pointers to memory managed by the ReplicationServices component */
1397
 
  message::Transaction *transaction_message;
1398
 
  message::Statement *statement_message;
1399
 
  /* Pointer to the current resultset of Select query */
1400
 
  message::Resultset *resultset;
1401
 
  plugin::EventObserverList *session_event_observers;
1402
 
 
1403
 
  /* Schema observers are mapped to databases. */
1404
 
  typedef std::map<std::string, plugin::EventObserverList*> schema_event_observers_t;
1405
 
  schema_event_observers_t schema_event_observers;
1406
 
 
1407
 
 
1408
1358
public:
1409
1359
  plugin::EventObserverList *getSessionObservers()
1410
1360
  {
1433
1383
 
1434
1384
 
1435
1385
 private:
1436
 
  const char *proc_info;
1437
1386
 
1438
1387
  /** The current internal error handler for this thread, or NULL. */
1439
1388
  Internal_error_handler *m_internal_handler;
1491
1440
    main_da.set_eof_status(this);
1492
1441
  }
1493
1442
 
1494
 
  /* Some inline functions for more speed */
1495
 
 
1496
 
  inline bool add_item_to_list(Item *item)
1497
 
  {
1498
 
    return getLex()->current_select->add_item_to_list(this, item);
1499
 
  }
1500
 
 
1501
 
  inline bool add_value_to_list(Item *value)
1502
 
  {
1503
 
    return getLex()->value_list.push_back(value);
1504
 
  }
1505
 
 
1506
 
  inline bool add_order_to_list(Item *item, bool asc)
1507
 
  {
1508
 
    return getLex()->current_select->add_order_to_list(this, item, asc);
1509
 
  }
1510
 
 
1511
 
  inline bool add_group_to_list(Item *item, bool asc)
1512
 
  {
1513
 
    return getLex()->current_select->add_group_to_list(this, item, asc);
1514
 
  }
 
1443
  bool add_item_to_list(Item *item);
 
1444
  bool add_value_to_list(Item *value);
 
1445
  bool add_order_to_list(Item *item, bool asc);
 
1446
  bool add_group_to_list(Item *item, bool asc);
 
1447
 
1515
1448
  void refresh_status();
1516
1449
  user_var_entry *getVariable(LEX_STRING &name, bool create_if_not_exists);
1517
1450
  user_var_entry *getVariable(const std::string  &name, bool create_if_not_exists);
1527
1460
  void close_open_tables();
1528
1461
  void close_data_files_and_morph_locks(const identifier::Table &identifier);
1529
1462
 
1530
 
private:
1531
 
  bool free_cached_table(boost::mutex::scoped_lock &scopedLock);
1532
 
 
1533
 
public:
1534
 
 
1535
1463
  /**
1536
1464
   * Prepares statement for reopening of tables and recalculation of set of
1537
1465
   * prelocked tables.
1570
1498
  table::Placeholder *table_cache_insert_placeholder(const identifier::Table &identifier);
1571
1499
  bool lock_table_name_if_not_cached(const identifier::Table &identifier, Table **table);
1572
1500
 
1573
 
private:
1574
 
  session::TableMessages _table_message_cache;
1575
 
 
1576
 
public:
1577
1501
  session::TableMessages &getMessageCache()
1578
1502
  {
1579
1503
    return _table_message_cache;
1593
1517
  }
1594
1518
 
1595
1519
  template<class T>
1596
 
  bool setProperty(const std::string &arg, T *value)
 
1520
  void setProperty(const std::string &arg, T *value)
1597
1521
  {
1598
1522
    life_properties.setProperty(arg, value);
1599
 
 
1600
 
    return true;
1601
1523
  }
1602
1524
 
1603
1525
  /**
1620
1542
  table::Singular *getInstanceTable();
1621
1543
  table::Singular *getInstanceTable(List<CreateField> &field_list);
1622
1544
 
1623
 
private:
1624
 
  bool resetUsage()
1625
 
  {
1626
 
    if (getrusage(RUSAGE_THREAD, &usage))
1627
 
    {
1628
 
      return false;
1629
 
    }
1630
 
 
1631
 
    return true;
1632
 
  }
1633
 
 
1634
 
public:
1635
 
 
1636
1545
  void setUsage(bool arg)
1637
1546
  {
1638
1547
    use_usage= arg;
1639
1548
  }
1640
1549
 
1641
 
  const struct rusage &getUsage()
 
1550
  const rusage &getUsage()
1642
1551
  {
1643
1552
    return usage;
1644
1553
  }
1645
1554
 
1646
1555
  catalog::Instance::const_reference catalog() const
1647
1556
  {
1648
 
    return *(_catalog.get());
 
1557
    return *_catalog;
1649
1558
  }
1650
1559
 
1651
1560
  catalog::Instance::reference catalog()
1652
1561
  {
1653
 
    return *(_catalog.get());
 
1562
    return *_catalog;
1654
1563
  }
1655
1564
 
 
1565
  bool arg_of_last_insert_id_function; // Tells if LAST_INSERT_ID(#) was called for the current statement
1656
1566
private:
 
1567
        class impl_c;
 
1568
 
 
1569
  bool free_cached_table(boost::mutex::scoped_lock &scopedLock);
 
1570
 
 
1571
  bool resetUsage()
 
1572
  {
 
1573
    return not getrusage(RUSAGE_THREAD, &usage);
 
1574
  }
 
1575
 
 
1576
  session::TableMessages _table_message_cache;
 
1577
  boost::scoped_ptr<impl_c> impl_;
1657
1578
  catalog::Instance::shared_ptr _catalog;
1658
1579
 
1659
 
  // This lives throughout the life of Session
 
1580
  /** Pointers to memory managed by the ReplicationServices component */
 
1581
  message::Transaction *transaction_message;
 
1582
  message::Statement *statement_message;
 
1583
  /* Pointer to the current resultset of Select query */
 
1584
  message::Resultset *resultset;
 
1585
  plugin::EventObserverList *session_event_observers;
 
1586
 
 
1587
  /* Schema observers are mapped to databases. */
 
1588
  typedef std::map<std::string, plugin::EventObserverList*> schema_event_observers_t;
 
1589
  schema_event_observers_t schema_event_observers;
 
1590
 
 
1591
  uint64_t xa_id;
 
1592
  const char *proc_info;
 
1593
  bool abort_on_warning;
 
1594
  bool concurrent_execute_allowed;
 
1595
  bool tablespace_op; /**< This is true in DISCARD/IMPORT TABLESPACE */
1660
1596
  bool use_usage;
1661
1597
  session::PropertyMap life_properties;
1662
1598
  std::vector<table::Singular *> temporary_shares;
1663
 
  struct rusage usage;
 
1599
  rusage usage;
1664
1600
};
1665
1601
 
1666
1602
#define ESCAPE_CHARS "ntrb0ZN" // keep synchronous with READ_INFO::unescape