PoolNdb.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <common/common.hpp>
  14. #include <NdbMutex.h>
  15. #include <NdbApi.hpp>
  16. #include "PoolNdb.hpp"
  17. #ifdef NDB_WIN32
  18. static NdbMutex & ndb_mutex = * NdbMutex_Create();
  19. #else
  20. static NdbMutex ndb_mutex = NDB_MUTEX_INITIALIZER;
  21. #endif
  22. PoolNdb::PoolNdb() :
  23.     m_cntUsed(0),
  24.     m_cntFree(0)
  25. {
  26. }
  27. PoolNdb::~PoolNdb()
  28. {
  29. }
  30. Ndb*
  31. PoolNdb::allocate(Ctx& ctx, int timeout)
  32. {
  33.     NdbMutex_Lock(&ndb_mutex);
  34.     Ndb* pNdb;
  35.     if (m_cntFree == 0) {
  36. pNdb = new Ndb("TEST_DB");
  37. pNdb->useFullyQualifiedNames(true);
  38. if (pNdb->init(64) < 0) {
  39.     ctx.pushStatus(pNdb, "init");
  40.     delete pNdb;
  41.     NdbMutex_Unlock(&ndb_mutex);
  42.     return 0;
  43. }
  44. if (pNdb->waitUntilReady(timeout) < 0) {
  45.     ctx.pushStatus(Sqlstate::_HYT00, Error::Gen, "connection timeout after %d seconds", timeout);
  46.     ctx.pushStatus(pNdb, "waitUntilReady");
  47.     delete pNdb;
  48.     NdbMutex_Unlock(&ndb_mutex);
  49.     return 0;
  50. }
  51. m_listFree.push_back(pNdb);
  52. m_cntFree++;
  53.     }
  54.     pNdb = m_listFree.front();
  55.     m_listFree.pop_front();
  56.     m_cntFree--;
  57.     m_cntUsed++;
  58.     ctx_log1(("alloc Ndb: used=%u free=%u", m_cntUsed, m_cntFree));
  59.     NdbMutex_Unlock(&ndb_mutex);
  60.     return pNdb;
  61. }
  62. void
  63. PoolNdb::release(Ctx& ctx, Ndb* pNdb)
  64. {
  65.     NdbMutex_Lock(&ndb_mutex);
  66.     m_listUsed.remove(pNdb);
  67.     m_listFree.push_back(pNdb);
  68.     m_cntFree++;
  69.     m_cntUsed--;
  70.     ctx_log1(("free Ndb: used=%u free=%u", m_cntUsed, m_cntFree));
  71.     NdbMutex_Unlock(&ndb_mutex);
  72. }