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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: cstmt_impl.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:18:18  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: cstmt_impl.cpp,v 1000.3 2004/06/01 19:18:18 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: cstmt_impl.cpp,v 1000.3 2004/06/01 19:18:18 gouriano Exp $
  35. *
  36. * Author:  Michael Kholodov
  37. *   
  38. * File Description:  Callable statement implementation
  39. *
  40. *
  41. * $Log: cstmt_impl.cpp,v $
  42. * Revision 1000.3  2004/06/01 19:18:18  gouriano
  43. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  44. *
  45. * Revision 1.15  2004/05/17 21:10:28  gorelenk
  46. * Added include of PCH ncbi_pch.hpp
  47. *
  48. * Revision 1.14  2004/04/26 14:16:56  kholodov
  49. * Modified: recreate the command objects each time the Get...() is called
  50. *
  51. * Revision 1.13  2004/04/12 14:25:33  kholodov
  52. * Modified: resultset caching scheme, fixed single connection handling
  53. *
  54. * Revision 1.12  2004/04/08 15:56:58  kholodov
  55. * Multiple bug fixes and optimizations
  56. *
  57. * Revision 1.11  2004/03/12 16:27:09  sponomar
  58. * correct nested querys
  59. *
  60. * Revision 1.9  2004/02/26 18:52:34  kholodov
  61. * Added: more trace messages
  62. *
  63. * Revision 1.8  2002/12/05 17:37:23  kholodov
  64. * Fixed: potential memory leak in CStatement::HasMoreResults() method
  65. * Modified: getter and setter name for the internal CDB_Result pointer.
  66. *
  67. * Revision 1.7  2002/10/03 18:50:00  kholodov
  68. * Added: additional TRACE diagnostics about object deletion
  69. * Fixed: setting parameters in IStatement object is fully supported
  70. * Added: IStatement::ExecuteLast() to execute the last statement with
  71. * different parameters if any
  72. *
  73. * Revision 1.6  2002/09/09 20:48:57  kholodov
  74. * Added: Additional trace output about object life cycle
  75. * Added: CStatement::Failed() method to check command status
  76. *
  77. * Revision 1.5  2002/05/16 22:11:11  kholodov
  78. * Improved: using minimum connections possible
  79. *
  80. * Revision 1.4  2002/04/05 19:33:08  kholodov
  81. * Added: ExecuteUpdate() to skip all resultsets returned (if any)
  82. *
  83. * Revision 1.3  2002/02/08 21:29:54  kholodov
  84. * SetDataBase() restored, connection cloning algorithm changed
  85. *
  86. * Revision 1.2  2002/02/05 17:24:02  kholodov
  87. * Put into NCBI scope
  88. *
  89. * Revision 1.1  2002/01/30 14:51:21  kholodov
  90. * User DBAPI implementation, first commit
  91. *
  92. *
  93. *
  94. *
  95. */
  96. #include <ncbi_pch.hpp>
  97. #include "conn_impl.hpp"
  98. #include "cstmt_impl.hpp"
  99. #include "rs_impl.hpp"
  100. #include "basetmpl.hpp"
  101. #include <dbapi/driver/public.hpp>
  102. BEGIN_NCBI_SCOPE
  103. // implementation
  104. CCallableStatement::CCallableStatement(const string& proc,
  105.        int nofArgs,
  106.        CConnection* conn)
  107.   : CStatement(conn), m_status(0), m_nofParams(nofArgs)
  108. {
  109.     SetIdent("CCallableStatement");
  110.   SetBaseCmd(conn->GetCDB_Connection()->RPC(proc.c_str(), nofArgs));
  111. }
  112. CCallableStatement::~CCallableStatement()
  113. {
  114.     Notify(CDbapiClosedEvent(this));
  115. }
  116. CDB_RPCCmd* CCallableStatement::GetRpcCmd() 
  117. {
  118.   return (CDB_RPCCmd*)GetBaseCmd();
  119. }
  120. bool CCallableStatement::HasMoreResults()
  121. {
  122.     _TRACE("CCallableStatement::HasMoreResults(): Calling parent method");
  123.     bool more = CStatement::HasMoreResults();
  124.     if( more 
  125.         && GetCDB_Result() != 0 
  126.         && GetCDB_Result()->ResultType() == eDB_StatusResult ) {
  127.       
  128.         _TRACE("CCallableStatement::HasMoreResults(): Status result received");
  129.         CDB_Int *res = 0;
  130.         while( GetCDB_Result()->Fetch() ) {
  131.             res = dynamic_cast<CDB_Int*>(GetCDB_Result()->GetItem());
  132.         }
  133.         if( res != 0 ) {
  134.             m_status = res->Value();
  135.             _TRACE("CCallableStatement::HasMoreResults(): Return status " 
  136.                    << m_status );
  137.             delete res;
  138.         }
  139.         more = CStatement::HasMoreResults();
  140.     }
  141.     return more;
  142. }
  143.   
  144. void CCallableStatement::SetParam(const CVariant& v, 
  145.   const string& name)
  146. {
  147.   GetRpcCmd()->SetParam(name, v.GetData(), false);
  148. }
  149. void CCallableStatement::SetOutputParam(const CVariant& v, 
  150. const string& name)
  151. {
  152.   GetRpcCmd()->SetParam(name, v.GetData(), true);
  153. }
  154. void CCallableStatement::Execute()
  155. {
  156.   SetFailed(false);
  157.   GetRpcCmd()->Send();
  158. }
  159. void CCallableStatement::ExecuteUpdate()
  160. {
  161.   Execute();
  162.   while( HasMoreResults() );
  163. }
  164. int CCallableStatement::GetReturnStatus()
  165. {
  166.   return m_status;
  167. }
  168. void CCallableStatement::Close()
  169. {
  170.     Notify(CDbapiClosedEvent(this));
  171.     FreeResources();
  172. }    
  173. END_NCBI_SCOPE