~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/session.cc

  • Committer: Stewart Smith
  • Date: 2010-11-03 03:27:09 UTC
  • mto: (1902.1.1 build) (1910.1.2 build)
  • mto: This revision was merged to the branch mainline in revision 1903.
  • Revision ID: stewart@flamingspork.com-20101103032709-oyvfrc6eb8fzj0mr
fix docs warning: docs/unlock.rst:2: (WARNING/2) Title underline too short.

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
 
24
24
#include "config.h"
25
25
#include "drizzled/session.h"
26
 
#include "drizzled/session/cache.h"
 
26
#include "drizzled/session_list.h"
27
27
#include <sys/stat.h>
28
28
#include "drizzled/error.h"
29
29
#include "drizzled/gettext.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"
58
57
 
59
58
#include "drizzled/util/functors.h"
60
59
 
61
 
#include "drizzled/display.h"
62
 
 
63
60
#include <fcntl.h>
64
61
#include <algorithm>
65
62
#include <climits>
66
63
#include <boost/filesystem.hpp>
67
64
 
68
 
#include "drizzled/util/backtrace.h"
69
 
 
70
65
using namespace std;
71
66
 
72
67
namespace fs=boost::filesystem;
86
81
{
87
82
  return length == other.length &&
88
83
         field_name.length == other.field_name.length &&
89
 
    !my_strcasecmp(system_charset_info, field_name.str, other.field_name.str);
 
84
         !strcmp(field_name.str, other.field_name.str);
90
85
}
91
86
 
92
87
Open_tables_state::Open_tables_state(uint64_t version_arg) :
164
159
  mem_root(&main_mem_root),
165
160
  xa_id(0),
166
161
  lex(&main_lex),
167
 
  query(new std::string),
168
 
  _schema(new std::string("")),
169
162
  catalog("LOCAL"),
170
163
  client(client_arg),
171
164
  scheduler(NULL),
173
166
  lock_id(&main_lock_id),
174
167
  user_time(0),
175
168
  ha_data(plugin::num_trx_monitored_objects),
176
 
  concurrent_execute_allowed(true),
177
169
  arg_of_last_insert_id_function(false),
178
170
  first_successful_insert_id_in_prev_stmt(0),
179
171
  first_successful_insert_id_in_cur_stmt(0),
180
172
  limit_found_rows(0),
181
 
  _global_read_lock(NONE),
182
 
  _killed(NOT_KILLED),
 
173
  global_read_lock(0),
183
174
  some_tables_deleted(false),
184
175
  no_errors(false),
185
176
  password(false),
195
186
  session_event_observers(NULL),
196
187
  use_usage(false)
197
188
{
 
189
  memset(process_list_info, 0, PROCESS_LIST_WIDTH);
198
190
  client->setSession(this);
199
191
 
200
192
  /*
205
197
  memory::init_sql_alloc(&main_mem_root, memory::ROOT_MIN_BLOCK_SIZE, 0);
206
198
  thread_stack= NULL;
207
199
  count_cuted_fields= CHECK_FIELD_ERROR_FOR_NULL;
 
200
  killed= NOT_KILLED;
208
201
  col_access= 0;
209
202
  tmp_table= 0;
210
203
  used_tables= 0;
339
332
{
340
333
  assert(cleanup_done == false);
341
334
 
342
 
  setKilled(KILL_CONNECTION);
 
335
  killed= KILL_CONNECTION;
343
336
#ifdef ENABLE_WHEN_BINLOG_WILL_BE_ABLE_TO_PREPARE
344
337
  if (transaction.xid_state.xa_state == XA_PREPARED)
345
338
  {
365
358
  close_temporary_tables();
366
359
 
367
360
  if (global_read_lock)
368
 
  {
369
 
    unlockGlobalReadLock();
370
 
  }
 
361
    unlock_global_read_lock(this);
371
362
 
372
363
  cleanup_done= true;
373
364
}
412
403
    delete (*iter).second;
413
404
  }
414
405
  life_properties.clear();
415
 
}
416
 
 
417
 
void Session::setClient(plugin::Client *client_arg)
418
 
{
419
 
  client= client_arg;
420
 
  client->setSession(this);
421
 
}
422
 
 
423
 
void Session::awake(Session::killed_state_t state_to_set)
424
 
{
425
 
  if ((state_to_set == Session::KILL_QUERY) and (command == COM_SLEEP))
426
 
    return;
427
 
 
 
406
 
 
407
  /* Ensure that no one is using Session */
 
408
  LOCK_delete.unlock();
 
409
}
 
410
 
 
411
void Session::awake(Session::killed_state state_to_set)
 
412
{
428
413
  this->checkSentry();
429
 
 
430
 
  setKilled(state_to_set);
431
 
  scheduler->killSession(this);
432
 
 
 
414
  safe_mutex_assert_owner(&LOCK_delete);
 
415
 
 
416
  killed= state_to_set;
433
417
  if (state_to_set != Session::KILL_QUERY)
434
418
  {
 
419
    scheduler->killSession(this);
435
420
    DRIZZLE_CONNECTION_DONE(thread_id);
436
421
  }
437
 
 
438
422
  if (mysys_var)
439
423
  {
440
424
    boost_unique_lock_t scopedLock(mysys_var->mutex);
547
531
 
548
532
  prepareForQueries();
549
533
 
550
 
  while (not client->haveError() && getKilled() != KILL_CONNECTION)
 
534
  while (! client->haveError() && killed != KILL_CONNECTION)
551
535
  {
552
 
    if (not executeStatement())
 
536
    if (! executeStatement())
553
537
      break;
554
538
  }
555
539
 
556
540
  disconnect(0, true);
557
541
}
558
542
 
559
 
bool Session::schedule(Session::shared_ptr &arg)
 
543
bool Session::schedule()
560
544
{
561
 
  arg->scheduler= plugin::Scheduler::getScheduler();
562
 
  assert(arg->scheduler);
 
545
  scheduler= plugin::Scheduler::getScheduler();
 
546
  assert(scheduler);
563
547
 
564
548
  connection_count.increment();
565
549
 
569
553
  }
570
554
 
571
555
  current_global_counters.connections++;
572
 
  arg->thread_id= arg->variables.pseudo_thread_id= global_thread_id++;
573
 
 
574
 
  session::Cache::singleton().insert(arg);
575
 
 
576
 
  if (unlikely(plugin::EventObserver::connectSession(*arg)))
577
 
  {
578
 
    // We should do something about an error...
579
 
  }
580
 
 
581
 
  if (plugin::Scheduler::getScheduler()->addSession(arg))
582
 
  {
583
 
    DRIZZLE_CONNECTION_START(arg->getSessionId());
 
556
  thread_id= variables.pseudo_thread_id= global_thread_id++;
 
557
 
 
558
  {
 
559
    boost::mutex::scoped_lock scoped(LOCK_thread_count);
 
560
    getSessionList().push_back(this);
 
561
  }
 
562
 
 
563
  if (unlikely(plugin::EventObserver::connectSession(*this)))
 
564
  {
 
565
    // We should do something about an error...
 
566
  }
 
567
 
 
568
  if (unlikely(plugin::EventObserver::connectSession(*this)))
 
569
  {
 
570
    // We should do something about an error...
 
571
  }
 
572
 
 
573
  if (scheduler->addSession(this))
 
574
  {
 
575
    DRIZZLE_CONNECTION_START(thread_id);
584
576
    char error_message_buff[DRIZZLE_ERRMSG_SIZE];
585
577
 
586
 
    arg->setKilled(Session::KILL_CONNECTION);
 
578
    killed= Session::KILL_CONNECTION;
587
579
 
588
 
    arg->status_var.aborted_connects++;
 
580
    status_var.aborted_connects++;
589
581
 
590
582
    /* Can't use my_error() since store_globals has not been called. */
591
583
    /* TODO replace will better error message */
592
584
    snprintf(error_message_buff, sizeof(error_message_buff),
593
585
             ER(ER_CANT_CREATE_THREAD), 1);
594
 
    arg->client->sendError(ER_CANT_CREATE_THREAD, error_message_buff);
595
 
 
 
586
    client->sendError(ER_CANT_CREATE_THREAD, error_message_buff);
596
587
    return true;
597
588
  }
598
589
 
600
591
}
601
592
 
602
593
 
603
 
/*
604
 
  Is this session viewable by the current user?
605
 
*/
606
 
bool Session::isViewable() const
607
 
{
608
 
  return plugin::Authorization::isAuthorized(current_session->getSecurityContext(),
609
 
                                             this,
610
 
                                             false);
611
 
}
612
 
 
613
 
 
614
594
const char* Session::enter_cond(boost::condition_variable_any &cond, boost::mutex &mutex, const char* msg)
615
595
{
616
596
  const char* old_msg = get_proc_info();
638
618
 
639
619
bool Session::authenticate()
640
620
{
641
 
  lex->start(this);
 
621
  lex_start(this);
642
622
  if (client->authenticate())
643
623
    return false;
644
624
 
694
674
  main_da.reset_diagnostics_area();
695
675
 
696
676
  if (client->readCommand(&l_packet, &packet_length) == false)
697
 
  {
698
677
    return false;
699
 
  }
700
678
 
701
 
  if (getKilled() == KILL_CONNECTION)
 
679
  if (killed == KILL_CONNECTION)
702
680
    return false;
703
681
 
704
682
  if (packet_length == 0)
705
683
    return true;
706
684
 
707
 
  l_command= static_cast<enum_server_command>(l_packet[0]);
 
685
  l_command= (enum enum_server_command) (unsigned char) l_packet[0];
708
686
 
709
687
  if (command >= COM_END)
710
688
    command= COM_END;                           // Wrong command
711
689
 
712
690
  assert(packet_length);
713
 
  return not dispatch_command(l_command, this, l_packet+1, (uint32_t) (packet_length-1));
 
691
  return ! dispatch_command(l_command, this, l_packet+1, (uint32_t) (packet_length-1));
714
692
}
715
693
 
716
694
bool Session::readAndStoreQuery(const char *in_packet, uint32_t in_packet_length)
722
700
    in_packet_length--;
723
701
  }
724
702
  const char *pos= in_packet + in_packet_length; /* Point at end null */
725
 
  while (in_packet_length > 0 && (pos[-1] == ';' || my_isspace(charset() ,pos[-1])))
 
703
  while (in_packet_length > 0 &&
 
704
         (pos[-1] == ';' || my_isspace(charset() ,pos[-1])))
726
705
  {
727
706
    pos--;
728
707
    in_packet_length--;
729
708
  }
730
709
 
731
 
  std::string *new_query= new std::string(in_packet, in_packet + in_packet_length);
732
 
  // We can not be entirely sure _schema has a value
733
 
  if (_schema)
734
 
  {
735
 
    plugin::QueryRewriter::rewriteQuery(*_schema, *new_query);
736
 
  }
737
 
  query.reset(new_query);
738
 
  _state.reset(new State(in_packet, in_packet_length));
 
710
  query.assign(in_packet, in_packet + in_packet_length);
739
711
 
740
712
  return true;
741
713
}
790
762
  }
791
763
 
792
764
  if (result == false)
793
 
  {
794
765
    my_error(killed_errno(), MYF(0));
795
 
  }
796
766
  else if ((result == true) && do_release)
797
 
  {
798
 
    setKilled(Session::KILL_CONNECTION);
799
 
  }
 
767
    killed= Session::KILL_CONNECTION;
800
768
 
801
769
  return result;
802
770
}
955
923
  my_message(errcode, err, MYF(0));
956
924
  if (file > 0)
957
925
  {
958
 
    (void) cache->end_io_cache();
 
926
    (void) end_io_cache(cache);
959
927
    (void) internal::my_close(file, MYF(0));
960
928
    (void) internal::my_delete(path.file_string().c_str(), MYF(0));             // Delete file on error
961
929
    file= -1;
965
933
 
966
934
bool select_to_file::send_eof()
967
935
{
968
 
  int error= test(cache->end_io_cache());
 
936
  int error= test(end_io_cache(cache));
969
937
  if (internal::my_close(file, MYF(MY_WME)))
970
938
    error= 1;
971
939
  if (!error)
987
955
  /* In case of error send_eof() may be not called: close the file here. */
988
956
  if (file >= 0)
989
957
  {
990
 
    (void) cache->end_io_cache();
 
958
    (void) end_io_cache(cache);
991
959
    (void) internal::my_close(file, MYF(0));
992
960
    file= -1;
993
961
  }
1046
1014
  if (not to_file.has_root_directory())
1047
1015
  {
1048
1016
    target_path= fs::system_complete(getDataHomeCatalog());
1049
 
    util::string::const_shared_ptr schema(session->schema());
1050
 
    if (schema and not schema->empty())
 
1017
    if (not session->db.empty())
1051
1018
    {
1052
1019
      int count_elements= 0;
1053
1020
      for (fs::path::iterator iter= to_file.begin();
1057
1024
 
1058
1025
      if (count_elements == 1)
1059
1026
      {
1060
 
        target_path /= *schema;
 
1027
        target_path /= session->db;
1061
1028
      }
1062
1029
    }
1063
1030
    target_path /= to_file;
1086
1053
  if ((file= internal::my_create(target_path.file_string().c_str(), 0666, O_WRONLY|O_EXCL, MYF(MY_WME))) < 0)
1087
1054
    return file;
1088
1055
  (void) fchmod(file, 0666);                    // Because of umask()
1089
 
  if (cache->init_io_cache(file, 0L, internal::WRITE_CACHE, 0L, 1, MYF(MY_WME)))
 
1056
  if (init_io_cache(cache, file, 0L, internal::WRITE_CACHE, 0L, 1, MYF(MY_WME)))
1090
1057
  {
1091
1058
    internal::my_close(file, MYF(0));
1092
1059
    internal::my_delete(target_path.file_string().c_str(), MYF(0));  // Delete file on error, it was just created
1115
1082
    {
1116
1083
      if (item->max_length >= MAX_BLOB_WIDTH)
1117
1084
      {
1118
 
        blob_flag=1;
1119
 
        break;
 
1085
        blob_flag=1;
 
1086
        break;
1120
1087
      }
1121
 
 
1122
1088
      if (item->result_type() == STRING_RESULT)
1123
1089
        string_results= true;
1124
1090
      else
1554
1520
void Session::end_statement()
1555
1521
{
1556
1522
  /* Cleanup SQL processing state to reuse this statement in next query. */
1557
 
  lex->end();
 
1523
  lex_end(lex);
1558
1524
  query_cache_key= ""; // reset the cache key
1559
1525
  resetResultsetMessage();
1560
1526
}
1561
1527
 
1562
1528
bool Session::copy_db_to(char **p_db, size_t *p_db_length)
1563
1529
{
1564
 
  assert(_schema);
1565
 
  if (_schema and _schema->empty())
1566
 
  {
1567
 
    my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
1568
 
    return true;
1569
 
  }
1570
 
  else if (not _schema)
1571
 
  {
1572
 
    my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
1573
 
    return true;
1574
 
  }
1575
 
  assert(_schema);
1576
 
 
1577
 
  *p_db= strmake(_schema->c_str(), _schema->size());
1578
 
  *p_db_length= _schema->size();
1579
 
 
 
1530
  if (db.empty())
 
1531
  {
 
1532
    my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
 
1533
    return true;
 
1534
  }
 
1535
  *p_db= strmake(db.c_str(), db.length());
 
1536
  *p_db_length= db.length();
1580
1537
  return false;
1581
1538
}
1582
1539
 
1616
1573
}
1617
1574
 
1618
1575
 
1619
 
void Session::set_db(const std::string &new_db)
 
1576
bool Session::set_db(const std::string &new_db)
1620
1577
{
1621
1578
  /* Do not reallocate memory if current chunk is big enough. */
1622
1579
  if (new_db.length())
1623
 
  {
1624
 
    _schema.reset(new std::string(new_db));
1625
 
  }
 
1580
    db= new_db;
1626
1581
  else
1627
 
  {
1628
 
    _schema.reset(new std::string(""));
1629
 
  }
1630
 
}
1631
 
 
 
1582
    db.clear();
 
1583
 
 
1584
  return false;
 
1585
}
 
1586
 
 
1587
 
 
1588
 
 
1589
 
 
1590
/**
 
1591
  Check the killed state of a user thread
 
1592
  @param session  user thread
 
1593
  @retval 0 the user thread is active
 
1594
  @retval 1 the user thread has been killed
 
1595
*/
 
1596
int session_killed(const Session *session)
 
1597
{
 
1598
  return(session->killed);
 
1599
}
 
1600
 
 
1601
 
 
1602
const struct charset_info_st *session_charset(Session *session)
 
1603
{
 
1604
  return(session->charset());
 
1605
}
1632
1606
 
1633
1607
/**
1634
1608
  Mark transaction to rollback and mark error as fatal to a sub-statement.
1651
1625
  plugin_sessionvar_cleanup(this);
1652
1626
 
1653
1627
  /* If necessary, log any aborted or unauthorized connections */
1654
 
  if (getKilled() || client->wasAborted())
 
1628
  if (killed || client->wasAborted())
1655
1629
  {
1656
1630
    status_var.aborted_threads++;
1657
1631
  }
1658
1632
 
1659
1633
  if (client->wasAborted())
1660
1634
  {
1661
 
    if (not getKilled() && variables.log_warnings > 1)
 
1635
    if (! killed && variables.log_warnings > 1)
1662
1636
    {
1663
1637
      SecurityContext *sctx= &security_ctx;
1664
1638
 
1665
1639
      errmsg_printf(ERRMSG_LVL_WARN, ER(ER_NEW_ABORTING_CONNECTION)
1666
1640
                  , thread_id
1667
 
                  , (_schema->empty() ? "unconnected" : _schema->c_str())
 
1641
                  , (db.empty() ? "unconnected" : db.c_str())
1668
1642
                  , sctx->getUser().empty() == false ? sctx->getUser().c_str() : "unauthenticated"
1669
1643
                  , sctx->getIp().c_str()
1670
1644
                  , (main_da.is_error() ? main_da.message() : ER(ER_UNKNOWN_ERROR)));
1673
1647
 
1674
1648
  /* Close out our connection to the client */
1675
1649
  if (should_lock)
1676
 
    session::Cache::singleton().mutex().lock();
1677
 
 
1678
 
  setKilled(Session::KILL_CONNECTION);
1679
 
 
 
1650
    LOCK_thread_count.lock();
 
1651
  killed= Session::KILL_CONNECTION;
1680
1652
  if (client->isConnected())
1681
1653
  {
1682
1654
    if (errcode)
1686
1658
    }
1687
1659
    client->close();
1688
1660
  }
1689
 
 
1690
1661
  if (should_lock)
1691
 
  {
1692
 
    session::Cache::singleton().mutex().unlock();
1693
 
  }
 
1662
    (void) LOCK_thread_count.unlock();
1694
1663
}
1695
1664
 
1696
1665
void Session::reset_for_next_command()
1718
1687
  Close all temporary tables created by 'CREATE TEMPORARY TABLE' for thread
1719
1688
*/
1720
1689
 
1721
 
void Open_tables_state::close_temporary_tables()
 
1690
void Session::close_temporary_tables()
1722
1691
{
1723
1692
  Table *table;
1724
1693
  Table *tmp_next;
1738
1707
  unlink from session->temporary tables and close temporary table
1739
1708
*/
1740
1709
 
1741
 
void Open_tables_state::close_temporary_table(Table *table)
 
1710
void Session::close_temporary_table(Table *table)
1742
1711
{
1743
1712
  if (table->getPrev())
1744
1713
  {
1774
1743
  If this is needed, use close_temporary_table()
1775
1744
*/
1776
1745
 
1777
 
void Open_tables_state::nukeTable(Table *table)
 
1746
void Session::nukeTable(Table *table)
1778
1747
{
1779
1748
  plugin::StorageEngine *table_type= table->getShare()->db_type();
1780
1749
 
1848
1817
                              DERIVATION_IMPLICIT, false);
1849
1818
}
1850
1819
 
1851
 
void Open_tables_state::mark_temp_tables_as_free_for_reuse()
 
1820
void Session::mark_temp_tables_as_free_for_reuse()
1852
1821
{
1853
1822
  for (Table *table= temporary_tables ; table ; table= table->getNext())
1854
1823
  {
1855
 
    if (table->query_id == getQueryId())
 
1824
    if (table->query_id == query_id)
1856
1825
    {
1857
1826
      table->query_id= 0;
1858
1827
      table->cursor->ha_reset();
1864
1833
{
1865
1834
  for (; table ; table= table->getNext())
1866
1835
  {
1867
 
    if (table->query_id == getQueryId())
 
1836
    if (table->query_id == query_id)
1868
1837
    {
1869
1838
      table->query_id= 0;
1870
1839
      table->cursor->ha_reset();
1883
1852
*/
1884
1853
void Session::close_thread_tables()
1885
1854
{
1886
 
  clearDerivedTables();
 
1855
  if (derived_tables)
 
1856
    derived_tables= NULL; // They should all be invalid by this point
1887
1857
 
1888
1858
  /*
1889
1859
    Mark all temporary tables used by this statement as free for reuse.
1916
1886
      handled either before writing a query log event (inside
1917
1887
      binlog_query()) or when preparing a pending event.
1918
1888
     */
1919
 
    unlockTables(lock);
 
1889
    mysql_unlock_tables(this, lock);
1920
1890
    lock= 0;
1921
1891
  }
1922
1892
  /*
1923
 
    Note that we need to hold table::Cache::singleton().mutex() while changing the
 
1893
    Note that we need to hold LOCK_open while changing the
1924
1894
    open_tables list. Another thread may work on it.
1925
1895
    (See: table::Cache::singleton().removeTable(), mysql_wait_completed_table())
1926
1896
    Closing a MERGE child before the parent would be fatal if the
1974
1944
  might be an issue (lame engines).
1975
1945
*/
1976
1946
 
1977
 
bool Open_tables_state::rm_temporary_table(const TableIdentifier &identifier, bool best_effort)
 
1947
bool Session::rm_temporary_table(TableIdentifier &identifier, bool best_effort)
1978
1948
{
1979
 
  if (plugin::StorageEngine::dropTable(*static_cast<Session *>(this), identifier))
 
1949
  if (plugin::StorageEngine::dropTable(*this, identifier))
1980
1950
  {
1981
1951
    if (not best_effort)
1982
1952
    {
1983
 
      std::string path;
1984
 
      identifier.getSQLPath(path);
1985
1953
      errmsg_printf(ERRMSG_LVL_WARN, _("Could not remove temporary table: '%s', error: %d"),
1986
 
                    path.c_str(), errno);
 
1954
                    identifier.getSQLPath().c_str(), errno);
1987
1955
    }
1988
1956
 
1989
1957
    return true;
1992
1960
  return false;
1993
1961
}
1994
1962
 
1995
 
bool Open_tables_state::rm_temporary_table(plugin::StorageEngine *base, const TableIdentifier &identifier)
 
1963
bool Session::rm_temporary_table(plugin::StorageEngine *base, TableIdentifier &identifier)
1996
1964
{
1997
1965
  assert(base);
1998
1966
 
1999
 
  if (plugin::StorageEngine::dropTable(*static_cast<Session *>(this), *base, identifier))
 
1967
  if (plugin::StorageEngine::dropTable(*this, *base, identifier))
2000
1968
  {
2001
 
    std::string path;
2002
 
    identifier.getSQLPath(path);
2003
1969
    errmsg_printf(ERRMSG_LVL_WARN, _("Could not remove temporary table: '%s', error: %d"),
2004
 
                  path.c_str(), errno);
 
1970
                  identifier.getSQLPath().c_str(), errno);
2005
1971
 
2006
1972
    return true;
2007
1973
  }
2013
1979
  @note this will be removed, I am looking through Hudson to see if it is finding
2014
1980
  any tables that are missed during cleanup.
2015
1981
*/
2016
 
void Open_tables_state::dumpTemporaryTableNames(const char *foo)
 
1982
void Session::dumpTemporaryTableNames(const char *foo)
2017
1983
{
2018
1984
  Table *table;
2019
1985
 
2037
2003
      cerr << "\t\t Proto " << proto->schema() << " " << proto->name() << "\n";
2038
2004
    }
2039
2005
    else
2040
 
    {
2041
2006
      cerr << "\tTabl;e Name " << table->getShare()->getSchemaName() << "." << table->getShare()->getTableName() << " : " << answer << "\n";
2042
 
    }
2043
2007
  }
2044
2008
}
2045
2009
 
2046
 
bool Session::TableMessages::storeTableMessage(const TableIdentifier &identifier, message::Table &table_message)
 
2010
bool Session::storeTableMessage(const TableIdentifier &identifier, message::Table &table_message)
2047
2011
{
2048
2012
  table_message_cache.insert(make_pair(identifier.getPath(), table_message));
2049
2013
 
2050
2014
  return true;
2051
2015
}
2052
2016
 
2053
 
bool Session::TableMessages::removeTableMessage(const TableIdentifier &identifier)
 
2017
bool Session::removeTableMessage(const TableIdentifier &identifier)
2054
2018
{
2055
2019
  TableMessageCache::iterator iter;
2056
2020
 
2064
2028
  return true;
2065
2029
}
2066
2030
 
2067
 
bool Session::TableMessages::getTableMessage(const TableIdentifier &identifier, message::Table &table_message)
 
2031
bool Session::getTableMessage(const TableIdentifier &identifier, message::Table &table_message)
2068
2032
{
2069
2033
  TableMessageCache::iterator iter;
2070
2034
 
2078
2042
  return true;
2079
2043
}
2080
2044
 
2081
 
bool Session::TableMessages::doesTableMessageExist(const TableIdentifier &identifier)
 
2045
bool Session::doesTableMessageExist(const TableIdentifier &identifier)
2082
2046
{
2083
2047
  TableMessageCache::iterator iter;
2084
2048
 
2092
2056
  return true;
2093
2057
}
2094
2058
 
2095
 
bool Session::TableMessages::renameTableMessage(const TableIdentifier &from, const TableIdentifier &to)
 
2059
bool Session::renameTableMessage(const TableIdentifier &from, const TableIdentifier &to)
2096
2060
{
2097
2061
  TableMessageCache::iterator iter;
2098
2062
 
2152
2116
  return tmp_share;
2153
2117
}
2154
2118
 
2155
 
namespace display  {
2156
 
 
2157
 
static const std::string NONE= "NONE";
2158
 
static const std::string GOT_GLOBAL_READ_LOCK= "HAS GLOBAL READ LOCK";
2159
 
static const std::string MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT= "HAS GLOBAL READ LOCK WITH BLOCKING COMMIT";
2160
 
 
2161
 
const std::string &type(drizzled::Session::global_read_lock_t type)
2162
 
{
2163
 
  switch (type) {
2164
 
    default:
2165
 
    case Session::NONE:
2166
 
      return NONE;
2167
 
    case Session::GOT_GLOBAL_READ_LOCK:
2168
 
      return GOT_GLOBAL_READ_LOCK;
2169
 
    case Session::MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT:
2170
 
      return MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT;
2171
 
  }
2172
 
}
2173
 
 
2174
 
size_t max_string_length(drizzled::Session::global_read_lock_t)
2175
 
{
2176
 
  return MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT.size();
2177
 
}
2178
 
 
2179
 
} /* namespace display */
2180
 
 
2181
2119
} /* namespace drizzled */