cursor_impl.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:7k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: cursor_impl.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:18:24  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: cursor_impl.cpp,v 1000.3 2004/06/01 19:18:24 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE                          
  13. *               National Center for Biotechnology Information
  14. *                                                                          
  15. *  This software/database is a "United States Government Work" under the   
  16. *  terms of the United States Copyright Act.  It was written as part of    
  17. *  the author's official duties as a United States Government employee and 
  18. *  thus cannot be copyrighted.  This software/database is freely available 
  19. *  to the public for use. The National Library of Medicine and the U.S.    
  20. *  Government have not placed any restriction on its use or reproduction.  
  21. *                                                                          
  22. *  Although all reasonable efforts have been taken to ensure the accuracy  
  23. *  and reliability of the software and data, the NLM and the U.S.          
  24. *  Government do not and cannot warrant the performance or results that    
  25. *  may be obtained by using this software or data. The NLM and the U.S.    
  26. *  Government disclaim all warranties, express or implied, including       
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.                                                                
  29. *                                                                          
  30. *  Please cite the author in any work or product based on this material.   
  31. *
  32. * ===========================================================================
  33. *
  34. * File Name:  $Id: cursor_impl.cpp,v 1000.3 2004/06/01 19:18:24 gouriano Exp $
  35. *
  36. * Author:  Michael Kholodov
  37. *   
  38. * File Description:  Base class for database access
  39. *
  40. *
  41. * $Log: cursor_impl.cpp,v $
  42. * Revision 1000.3  2004/06/01 19:18:24  gouriano
  43. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16
  44. *
  45. * Revision 1.16  2004/05/17 21:10:28  gorelenk
  46. * Added include of PCH ncbi_pch.hpp
  47. *
  48. * Revision 1.15  2004/04/26 14:16:56  kholodov
  49. * Modified: recreate the command objects each time the Get...() is called
  50. *
  51. * Revision 1.14  2004/04/22 14:22:25  kholodov
  52. * Added: Cancel()
  53. *
  54. * Revision 1.13  2004/04/12 14:25:33  kholodov
  55. * Modified: resultset caching scheme, fixed single connection handling
  56. *
  57. * Revision 1.12  2004/04/08 15:56:58  kholodov
  58. * Multiple bug fixes and optimizations
  59. *
  60. * Revision 1.11  2004/03/08 22:15:19  kholodov
  61. * Added: 3 new Get...() methods internally
  62. *
  63. * Revision 1.10  2002/10/21 20:38:08  kholodov
  64. * Added: GetParentConn() method to get the parent connection from IStatement,
  65. * ICallableStatement and ICursor objects.
  66. * Fixed: Minor fixes
  67. *
  68. * Revision 1.9  2002/10/03 18:50:00  kholodov
  69. * Added: additional TRACE diagnostics about object deletion
  70. * Fixed: setting parameters in IStatement object is fully supported
  71. * Added: IStatement::ExecuteLast() to execute the last statement with
  72. * different parameters if any
  73. *
  74. * Revision 1.8  2002/09/18 18:49:27  kholodov
  75. * Modified: class declaration and Action method to reflect
  76. * direct inheritance of CActiveObject from IEventListener
  77. *
  78. * Revision 1.7  2002/09/16 19:34:40  kholodov
  79. * Added: bulk insert support
  80. *
  81. * Revision 1.6  2002/09/09 20:48:57  kholodov
  82. * Added: Additional trace output about object life cycle
  83. * Added: CStatement::Failed() method to check command status
  84. *
  85. * Revision 1.5  2002/08/26 15:35:56  kholodov
  86. * Added possibility to disable transaction log
  87. * while updating BLOBs
  88. *
  89. * Revision 1.4  2002/07/08 16:06:37  kholodov
  90. * Added GetBlobOStream() implementation
  91. *
  92. * Revision 1.3  2002/05/16 22:11:12  kholodov
  93. * Improved: using minimum connections possible
  94. *
  95. * Revision 1.2  2002/02/08 17:38:26  kholodov
  96. * Moved listener registration to parent objects
  97. *
  98. * Revision 1.1  2002/01/30 14:51:21  kholodov
  99. * User DBAPI implementation, first commit
  100. *
  101. * Revision 1.1  2001/11/30 16:30:05  kholodov
  102. * Snapshot of the first draft of dbapi lib
  103. *
  104. *
  105. *
  106. */
  107. #include <ncbi_pch.hpp>
  108. #include "conn_impl.hpp"
  109. #include "cursor_impl.hpp"
  110. #include "rs_impl.hpp"
  111. #include <dbapi/driver/exception.hpp>
  112. #include <dbapi/driver/public.hpp>
  113. BEGIN_NCBI_SCOPE
  114. // implementation
  115. CCursor::CCursor(const string& name,
  116.                  const string& sql,
  117.                  int nofArgs,
  118.                  int batchSize,
  119.                  CConnection* conn)
  120.     : m_nofArgs(nofArgs), m_cmd(0), m_conn(conn), m_ostr(0)
  121. {
  122.     SetIdent("CCursor");
  123.     m_cmd = m_conn->GetCDB_Connection()->Cursor(name, sql,
  124.                                                 nofArgs, batchSize);
  125. }
  126. CCursor::~CCursor()
  127. {
  128.     Notify(CDbapiClosedEvent(this));
  129.     FreeResources();
  130.     Notify(CDbapiDeletedEvent(this));
  131.     _TRACE(GetIdent() << " " << (void*)this << " deleted."); 
  132. }
  133.   
  134. IConnection* CCursor::GetParentConn() 
  135. {
  136.     return m_conn;
  137. }
  138. void CCursor::SetParam(const CVariant& v, 
  139.                        const string& name)
  140. {
  141.     Parameters::iterator cur = m_params.find(name);
  142.     if( cur != m_params.end() ) {
  143.         *((*cur).second) = v;
  144.     }
  145.     else {
  146.         pair<Parameters::iterator, bool> 
  147.             ins = m_params.insert(make_pair(name, new CVariant(v)));
  148.         cur = ins.first;
  149.     }
  150.     GetCursorCmd()->BindParam((*cur).first,
  151.                               (*cur).second->GetData());
  152. }
  153. IResultSet* CCursor::Open()
  154. {
  155.     CResultSet *ri = new CResultSet(m_conn, GetCursorCmd()->Open());
  156.     ri->AddListener(this);
  157.     AddListener(ri);
  158.     return ri;
  159. }
  160. void CCursor::Update(const string& table, const string& updateSql) 
  161. {
  162.     GetCursorCmd()->Update(table, updateSql);
  163. }
  164. void CCursor::Delete(const string& table)
  165. {
  166.     GetCursorCmd()->Delete(table);
  167. }
  168. ostream& CCursor::GetBlobOStream(unsigned int col,
  169.                                  size_t blob_size, 
  170.                                  EAllowLog log_it,
  171.                                  size_t buf_size)
  172. {
  173.     // Delete previous ostream
  174.     delete m_ostr;
  175.     m_ostr = new CBlobOStream(GetCursorCmd(),
  176.                               col - 1,
  177.                               blob_size,
  178.                               buf_size,
  179.                               log_it == eEnableLog);
  180.     return *m_ostr;
  181. }
  182. void CCursor::Cancel()
  183. {
  184.     if( GetCursorCmd() != 0 )
  185.         GetCursorCmd()->Close();
  186. }
  187. void CCursor::Close()
  188. {
  189.     Notify(CDbapiClosedEvent(this));
  190.     FreeResources();
  191. }
  192. void CCursor::FreeResources() 
  193. {
  194.     Parameters::iterator i = m_params.begin();
  195.     for( ; i != m_params.end(); ++i ) {
  196.         delete (*i).second;
  197.     }
  198.     m_params.clear();
  199.     delete m_cmd;
  200.     m_cmd = 0;
  201.     delete m_ostr;
  202.     m_ostr = 0;
  203.     if( m_conn != 0 && m_conn->IsAux() ) {
  204.     delete m_conn;
  205.     m_conn = 0;
  206.     Notify(CDbapiAuxDeletedEvent(this));
  207.     }
  208.   
  209. }
  210. void CCursor::Action(const CDbapiEvent& e) 
  211. {
  212.     _TRACE(GetIdent() << " " << (void*)this << ": '" << e.GetName() 
  213.            << "' from " << e.GetSource()->GetIdent());
  214.     if(dynamic_cast<const CDbapiDeletedEvent*>(&e) != 0 ) {
  215. RemoveListener(e.GetSource());
  216.         if(dynamic_cast<CConnection*>(e.GetSource()) != 0 ) {
  217.             _TRACE("Deleting " << GetIdent() << " " << (void*)this); 
  218.             delete this;
  219.         }
  220.     }
  221. }
  222. END_NCBI_SCOPE