📄 cursor.cpp
字号:
/* * =========================================================================== * PRODUCTION $Log: cursor.cpp,v $ * PRODUCTION Revision 1000.1 2004/06/01 19:20:49 gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11 * PRODUCTION * =========================================================================== *//* $Id: cursor.cpp,v 1000.1 2004/06/01 19:20:49 gouriano Exp $ * =========================================================================== * * PUBLIC DOMAIN NOTICE * National Center for Biotechnology Information * * This software/database is a "United States Government Work" under the * terms of the United States Copyright Act. It was written as part of * the author's official duties as a United States Government employee and * thus cannot be copyrighted. This software/database is freely available * to the public for use. The National Library of Medicine and the U.S. * Government have not placed any restriction on its use or reproduction. * * Although all reasonable efforts have been taken to ensure the accuracy * and reliability of the software and data, the NLM and the U.S. * Government do not and cannot warrant the performance or results that * may be obtained by using this software or data. The NLM and the U.S. * Government disclaim all warranties, express or implied, including * warranties of performance, merchantability or fitness for any particular * purpose. * * Please cite the author in any work or product based on this material. * * =========================================================================== * * Author: Vladimir Soussov * * File Description: TDS cursor command * */#include <ncbi_pch.hpp>#include <dbapi/driver/ftds/interfaces.hpp>BEGIN_NCBI_SCOPE///////////////////////////////////////////////////////////////////////////////// CTDS_CursorCmd:://CTDS_CursorCmd::CTDS_CursorCmd(CTDS_Connection* con, DBPROCESS* cmd, const string& cursor_name, const string& query, unsigned int nof_params) : m_Connect(con), m_Cmd(cmd), m_Name(cursor_name), m_LCmd(0), m_Query(query), m_Params(nof_params), m_IsOpen(false), m_HasFailed(false), m_IsDeclared(false), m_Res(0), m_RowCount(-1){}bool CTDS_CursorCmd::BindParam(const string& param_name, CDB_Object* param_ptr){ return m_Params.BindParam(CDB_Params::kNoParamNumber, param_name, param_ptr);}static bool for_update_of(const string& q){ if((q.find("update") == string::npos) && (q.find("UPDATE") == string::npos)) return false; if((q.find("for update") != string::npos) || (q.find("FOR UPDATE") != string::npos)) return true; // TODO: add more logic here to find "for update" clause return false;}CDB_Result* CTDS_CursorCmd::Open(){ if (m_IsOpen) { // need to close it first Close(); } m_HasFailed = false; // declare the cursor if (!x_AssignParams()) { m_HasFailed = true; throw CDB_ClientEx(eDB_Error, 222003, "CTDS_CursorCmd::Open", "cannot assign params"); } m_LCmd = 0; string cur_feat; if(for_update_of(m_Query)) { cur_feat= " cursor FORWARD_ONLY SCROLL_LOCKS for "; } else { cur_feat= " cursor FORWARD_ONLY for "; } string buff = "declare " + m_Name + cur_feat + m_Query; try { m_LCmd = m_Connect->LangCmd(buff); m_LCmd->Send(); m_LCmd->DumpResults();#if 0 while (m_LCmd->HasMoreResults()) { CDB_Result* r = m_LCmd->Result(); if (r) { while (r->Fetch()) ; delete r; } }#endif delete m_LCmd; } catch (CDB_Exception& e) { if (m_LCmd) { delete m_LCmd; m_LCmd = 0; } throw CDB_ClientEx(eDB_Error, 222001, "CTDS_CursorCmd::Open", "failed to declare cursor"); } m_IsDeclared = true; // open the cursor m_LCmd = 0; buff = "open " + m_Name; try { m_LCmd = m_Connect->LangCmd(buff); m_LCmd->Send(); m_LCmd->DumpResults();#if 0 while (m_LCmd->HasMoreResults()) { CDB_Result* r = m_LCmd->Result(); if (r) { while (r->Fetch()) ; delete r; } }#endif delete m_LCmd; } catch (CDB_Exception& e) { if (m_LCmd) { delete m_LCmd; m_LCmd = 0; } throw CDB_ClientEx(eDB_Error, 222002, "CTDS_CursorCmd::Open", "failed to open cursor"); } m_IsOpen = true; m_LCmd = 0; buff = "fetch " + m_Name; m_LCmd = m_Connect->LangCmd(buff); m_Res = new CTDS_CursorResult(m_LCmd); return Create_Result(*m_Res);}bool CTDS_CursorCmd::Update(const string&, const string& upd_query){ if (!m_IsOpen) return false; CDB_LangCmd* cmd = 0; try { while(m_LCmd->HasMoreResults()) { CDB_Result* r= m_LCmd->Result(); if(r) delete r; } string buff = upd_query + " where current of " + m_Name; cmd = m_Connect->LangCmd(buff); cmd->Send(); cmd->DumpResults();#if 0 while (cmd->HasMoreResults()) { CDB_Result* r = cmd->Result(); if (r) { while (r->Fetch()) ; delete r; } }#endif delete cmd; } catch (CDB_Exception& e) { if (cmd) delete cmd; throw CDB_ClientEx(eDB_Error, 222004, "CTDS_CursorCmd::Update", "update failed"); } return true;}I_ITDescriptor* CTDS_CursorCmd::x_GetITDescriptor(unsigned int item_num){ if(!m_IsOpen || (m_Res == 0)) { return 0; } while(m_Res->CurrentItemNo() < item_num) { if(!m_Res->SkipItem()) return 0; } I_ITDescriptor* desc= new CTDS_ITDescriptor(m_Cmd, item_num+1); return desc;}bool CTDS_CursorCmd::UpdateTextImage(unsigned int item_num, CDB_Stream& data, bool log_it){ I_ITDescriptor* desc= x_GetITDescriptor(item_num); C_ITDescriptorGuard d_guard(desc); if(desc) { while(m_LCmd->HasMoreResults()) { CDB_Result* r= m_LCmd->Result(); if(r) delete r; } return m_Connect->x_SendData(*desc, data, log_it); } return false;}CDB_SendDataCmd* CTDS_CursorCmd::SendDataCmd(unsigned int item_num, size_t size, bool log_it){ I_ITDescriptor* desc= x_GetITDescriptor(item_num); C_ITDescriptorGuard d_guard(desc); if(desc) { m_LCmd->DumpResults();#if 0 while(m_LCmd->HasMoreResults()) { CDB_Result* r= m_LCmd->Result(); if(r) delete r; }#endif return m_Connect->SendDataCmd(*desc, size, log_it); } return 0;} bool CTDS_CursorCmd::Delete(const string& table_name){ if (!m_IsOpen) return false; CDB_LangCmd* cmd = 0; try { while(m_LCmd->HasMoreResults()) { CDB_Result* r= m_LCmd->Result(); if(r) delete r; } string buff = "delete " + table_name + " where current of " + m_Name; cmd = m_Connect->LangCmd(buff); cmd->Send(); cmd->DumpResults();#if 0 while (cmd->HasMoreResults()) { CDB_Result* r = cmd->Result(); if (r) { while (r->Fetch()) ; delete r; } }#endif delete cmd; } catch (CDB_Exception& e) { if (cmd) delete cmd; throw CDB_ClientEx(eDB_Error, 222004, "CTDS_CursorCmd::Update", "update failed"); } return true;}int CTDS_CursorCmd::RowCount() const{ return m_RowCount;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -