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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: cursor.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:21:47  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: cursor.cpp,v 1000.1 2004/06/01 19:21:47 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.  * Author:  Vladimir Soussov
  35.  *
  36.  * File Description:  ODBC cursor command
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <dbapi/driver/odbc/interfaces.hpp>
  41. BEGIN_NCBI_SCOPE
  42. /////////////////////////////////////////////////////////////////////////////
  43. //
  44. //  CODBC_CursorCmd::
  45. //
  46. CODBC_CursorCmd::CODBC_CursorCmd(CODBC_Connection* con, SQLHSTMT cmd,
  47.                                const string& cursor_name, const string& query,
  48.                                unsigned int nof_params) :
  49.     m_CursCmd(con, cmd, "declare "+cursor_name+" cursor for "+query, nof_params),
  50.     m_Connect(con), m_Name(cursor_name), m_LCmd(0), m_IsOpen(false), 
  51.     m_HasFailed(false), m_IsDeclared(false), m_Res(0), m_RowCount(-1)
  52. {
  53. }
  54. bool CODBC_CursorCmd::BindParam(const string& param_name, CDB_Object* param_ptr)
  55. {
  56.     return
  57.         m_CursCmd.BindParam(param_name, param_ptr);
  58. }
  59. CDB_Result* CODBC_CursorCmd::Open()
  60. {
  61.     if (m_IsOpen) { // need to close it first
  62.         Close();
  63.     }
  64.     m_HasFailed = false;
  65.     // declare the cursor
  66.     try {
  67.         m_CursCmd.Send();
  68.         m_CursCmd.DumpResults();
  69. #if 0
  70.         while (m_CursCmd.HasMoreResults()) {
  71.             CDB_Result* r = m_CursCmd.Result();
  72.             if (r) {
  73.                 while (r->Fetch())
  74.                     ;
  75.                 delete r;
  76.             }
  77.         }
  78. #endif
  79.     } catch (CDB_Exception& ) {
  80.         throw CDB_ClientEx(eDB_Error, 422001, "CODBC_CursorCmd::Open",
  81.                            "failed to declare cursor");
  82.     }
  83.     m_IsDeclared = true;
  84.     // open the cursor
  85.     m_LCmd = 0;
  86.     // buff = "open " + m_Name;
  87.     try {
  88.         m_LCmd = m_Connect->xLangCmd("open " + m_Name);
  89.         m_LCmd->Send();
  90.         m_LCmd->DumpResults();
  91. #if 0
  92.         while (m_LCmd->HasMoreResults()) {
  93.             CDB_Result* r = m_LCmd->Result();
  94.             if (r) {
  95.                 while (r->Fetch())
  96.                     ;
  97.                 delete r;
  98.             }
  99.         }
  100. #endif
  101.         m_LCmd->Release();
  102.     } catch (CDB_Exception& ) {
  103.         if (m_LCmd) {
  104.             m_LCmd->Release();
  105.             m_LCmd = 0;
  106.         }
  107.         throw CDB_ClientEx(eDB_Error, 422002, "CODBC_CursorCmd::Open",
  108.                            "failed to open cursor");
  109.     }
  110.     m_IsOpen = true;
  111.     m_LCmd = 0;
  112.     //buff = "fetch " + m_Name;
  113.     m_LCmd = m_Connect->xLangCmd("fetch " + m_Name);
  114.     m_Res = new CODBC_CursorResult(m_LCmd);
  115.     return Create_Result(*m_Res);
  116. }
  117. bool CODBC_CursorCmd::Update(const string&, const string& upd_query)
  118. {
  119.     if (!m_IsOpen)
  120.         return false;
  121.     CDB_LangCmd* cmd = 0;
  122.     try {
  123. m_LCmd->Cancel();
  124. #if 0
  125. while(m_LCmd->HasMoreResults()) {
  126. CDB_Result* r= m_LCmd->Result();
  127. if(r) delete r;
  128. }
  129. #endif
  130.         string buff = upd_query + " where current of " + m_Name;
  131.         cmd = m_Connect->LangCmd(buff);
  132.         cmd->Send();
  133.         cmd->DumpResults();
  134. #if 0
  135.         while (cmd->HasMoreResults()) {
  136.             CDB_Result* r = cmd->Result();
  137.             if (r) {
  138.                 while (r->Fetch())
  139.                     ;
  140.                 delete r;
  141.             }
  142.         }
  143. #endif
  144.         delete cmd;
  145.     } catch (CDB_Exception& ) {
  146.         if (cmd)
  147.             delete cmd;
  148.         throw CDB_ClientEx(eDB_Error, 422004, "CODBC_CursorCmd::Update",
  149.                            "update failed");
  150.     }
  151.     return true;
  152. }
  153. CDB_ITDescriptor* CODBC_CursorCmd::x_GetITDescriptor(unsigned int item_num)
  154. {
  155.     if(!m_IsOpen || (m_Res == 0) || (m_LCmd == 0)) {
  156.         return 0;
  157.     }
  158.     string cond= "current of " + m_Name;
  159.     return m_LCmd->m_Res->GetImageOrTextDescriptor(item_num, cond);
  160. }
  161. bool CODBC_CursorCmd::UpdateTextImage(unsigned int item_num, CDB_Stream& data, 
  162.     bool log_it)
  163. {
  164.     CDB_ITDescriptor* desc= x_GetITDescriptor(item_num);
  165.     if(desc == 0) return false;
  166.     C_ITDescriptorGuard g((I_ITDescriptor*)desc);
  167. m_LCmd->Cancel();
  168.     
  169.     return (data.GetType() == eDB_Text)? 
  170.         m_Connect->SendData(*desc, (CDB_Text&)data, log_it) :
  171.         m_Connect->SendData(*desc, (CDB_Image&)data, log_it);
  172. }
  173. CDB_SendDataCmd* CODBC_CursorCmd::SendDataCmd(unsigned int item_num, size_t size, 
  174.     bool log_it)
  175. {
  176.     CDB_ITDescriptor* desc= x_GetITDescriptor(item_num);
  177.     if(desc == 0) return 0;
  178.     C_ITDescriptorGuard g((I_ITDescriptor*)desc);
  179. m_LCmd->Cancel();
  180.     return m_Connect->SendDataCmd((I_ITDescriptor&)*desc, size, log_it);
  181. }     
  182. bool CODBC_CursorCmd::Delete(const string& table_name)
  183. {
  184.     if (!m_IsOpen)
  185.         return false;
  186.     CDB_LangCmd* cmd = 0;
  187.     try {
  188. m_LCmd->Cancel();
  189.         string buff = "delete " + table_name + " where current of " + m_Name;
  190.         cmd = m_Connect->LangCmd(buff);
  191.         cmd->Send();
  192.         cmd->DumpResults();
  193. #if 0
  194.         while (cmd->HasMoreResults()) {
  195.             CDB_Result* r = cmd->Result();
  196.             if (r) {
  197.                 while (r->Fetch())
  198.                     ;
  199.                 delete r;
  200.             }
  201.         }
  202. #endif
  203.         delete cmd;
  204.     } catch (CDB_Exception& ) {
  205.         if (cmd)
  206.             delete cmd;
  207.         throw CDB_ClientEx(eDB_Error, 422004, "CODBC_CursorCmd::Update",
  208.                            "update failed");
  209.     }
  210.     return true;
  211. }
  212. int CODBC_CursorCmd::RowCount() const
  213. {
  214.     return m_RowCount;
  215. }
  216. bool CODBC_CursorCmd::Close()
  217. {
  218.     if (!m_IsOpen)
  219.         return false;
  220.     if (m_Res) {
  221.         delete m_Res;
  222.         m_Res = 0;
  223.     }
  224.     if (m_LCmd) {
  225.         m_LCmd->Release();
  226.         m_LCmd= 0;
  227.     }
  228.     if (m_IsOpen) {
  229.         string buff = "close " + m_Name;
  230.         m_LCmd = 0;
  231.         try {
  232.             m_LCmd = m_Connect->xLangCmd(buff);
  233.             m_LCmd->Send();
  234.             m_LCmd->DumpResults();
  235. #if 0
  236.             while (m_LCmd->HasMoreResults()) {
  237.                 CDB_Result* r = m_LCmd->Result();
  238.                 if (r) {
  239.                     while (r->Fetch())
  240.                         ;
  241.                     delete r;
  242.                 }
  243.             }
  244. #endif
  245.             m_LCmd->Release();
  246.         } catch (CDB_Exception& ) {
  247.             if (m_LCmd)
  248.                 m_LCmd->Release();
  249.             m_LCmd = 0;
  250.             throw CDB_ClientEx(eDB_Error, 422003, "CODBC_CursorCmd::Close",
  251.                                "failed to close cursor");
  252.         }
  253.         m_IsOpen = false;
  254.         m_LCmd = 0;
  255.     }
  256.     if (m_IsDeclared) {
  257.         string buff = "deallocate " + m_Name;
  258.         m_LCmd = 0;
  259.         try {
  260.             m_LCmd = m_Connect->xLangCmd(buff);
  261.             m_LCmd->Send();
  262.             m_LCmd->DumpResults();
  263. #if 0
  264.             while (m_LCmd->HasMoreResults()) {
  265.                 CDB_Result* r = m_LCmd->Result();
  266.                 if (r) {
  267.                     while (r->Fetch())
  268.                         ;
  269.                     delete r;
  270.                 }
  271.             }
  272. #endif
  273.             m_LCmd->Release();
  274.         } catch (CDB_Exception& ) {
  275.             if (m_LCmd)
  276.                 m_LCmd->Release();
  277.             m_LCmd = 0;
  278.             throw CDB_ClientEx(eDB_Error, 422003, "CODBC_CursorCmd::Close",
  279.                                "failed to deallocate cursor");
  280.         }
  281.         m_IsDeclared = false;
  282.         m_LCmd = 0;
  283.     }
  284.     return true;
  285. }
  286. void CODBC_CursorCmd::Release()
  287. {
  288.     m_BR = 0;
  289.     if (m_IsOpen) {
  290.         Close();
  291.         m_IsOpen = false;
  292.     }
  293.     m_Connect->DropCmd(*this);
  294.     delete this;
  295. }
  296. CODBC_CursorCmd::~CODBC_CursorCmd()
  297. {
  298.     if (m_BR)
  299.         *m_BR = 0;
  300.     if (m_IsOpen)
  301.         Close();
  302. }
  303. END_NCBI_SCOPE
  304. /*
  305.  * ===========================================================================
  306.  * $Log: cursor.cpp,v $
  307.  * Revision 1000.1  2004/06/01 19:21:47  gouriano
  308.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  309.  *
  310.  * Revision 1.4  2004/05/17 21:16:06  gorelenk
  311.  * Added include of PCH ncbi_pch.hpp
  312.  *
  313.  * Revision 1.3  2003/06/05 16:02:04  soussov
  314.  * adds code for DumpResults and for the dumped results processing
  315.  *
  316.  * Revision 1.2  2003/01/31 16:51:03  lavr
  317.  * Remove unused variable "e" from catch() clause
  318.  *
  319.  * Revision 1.1  2002/06/18 22:06:24  soussov
  320.  * initial commit
  321.  *
  322.  *
  323.  * ===========================================================================
  324.  */