📄 connection.cpp
字号:
CTDS_ITDescriptor& desc = p_desc? dynamic_cast<CTDS_ITDescriptor&> (*p_desc) : dynamic_cast<CTDS_ITDescriptor&> (descr_in); // CTDS_ITDescriptor& desc = dynamic_cast<CTDS_ITDescriptor&> (descr_in); char buff[1800]; // maximal page size if (size <= sizeof(buff)) { // we could write a blob in one chunk size_t s = stream.Read(buff, sizeof(buff)); if (dbwritetext(m_Link, (char*) desc.m_ObjName.c_str(), desc.m_TxtPtr_is_NULL ? 0 : desc.m_TxtPtr, DBTXPLEN, desc.m_TimeStamp_is_NULL ? 0 : desc.m_TimeStamp, log_it ? TRUE : FALSE, (DBINT) s, (BYTE*) buff) != SUCCEED) { throw CDB_ClientEx(eDB_Error, 210030, "CTDS_Connection::SendData", "dbwritetext failed"); } return true; } // write it in chunks if (dbwritetext(m_Link, (char*) desc.m_ObjName.c_str(), desc.m_TxtPtr_is_NULL ? 0 : desc.m_TxtPtr, DBTXPLEN, desc.m_TimeStamp_is_NULL ? 0 : desc.m_TimeStamp, log_it ? TRUE : FALSE, (DBINT) size, 0) != SUCCEED || dbsqlok(m_Link) != SUCCEED || // dbresults(m_Link) == FAIL) { x_Results(m_Link) == FAIL) { throw CDB_ClientEx(eDB_Error, 210031, "CTDS_Connection::SendData", "dbwritetext/dbsqlok/dbresults failed"); } while (size > 0) { size_t s = stream.Read(buff, sizeof(buff)); if (s < 1) { dbcancel(m_Link); throw CDB_ClientEx(eDB_Fatal, 210032, "CTDS_Connection::SendData", "Text/Image data corrupted"); } if (dbmoretext(m_Link, (DBINT) s, (BYTE*) buff) != SUCCEED) { dbcancel(m_Link); throw CDB_ClientEx(eDB_Error, 210033, "CTDS_Connection::SendData", "dbmoretext failed"); } size -= s; } // if (dbsqlok(m_Link) != SUCCEED || dbresults(m_Link) == FAIL) { if (dbsqlok(m_Link) != SUCCEED || x_Results(m_Link) == FAIL) { throw CDB_ClientEx(eDB_Error, 110034, "CTDS_Connection::SendData", "dbsqlok/dbresults failed"); } return true;}I_ITDescriptor* CTDS_Connection::x_GetNativeITDescriptor(const CDB_ITDescriptor& descr_in){ string q= "set rowcount 1\nupdate "; q+= descr_in.TableName(); q+= " set "; q+= descr_in.ColumnName(); q+= "='0x0' where "; q+= descr_in.SearchConditions(); q+= " \nselect "; q+= descr_in.ColumnName(); q+= " from "; q+= descr_in.TableName(); q+= " where "; q+= descr_in.SearchConditions(); q+= " \nset rowcount 0"; CDB_LangCmd* lcmd= LangCmd(q, 0); if(!lcmd->Send()) { throw CDB_ClientEx(eDB_Error, 210035, "CTDS_Connection::x_GetNativeITDescriptor", "can not send the language command"); } CDB_Result* res; I_ITDescriptor* descr= 0; bool i; while(lcmd->HasMoreResults()) { res= lcmd->Result(); if(res == 0) continue; if((res->ResultType() == eDB_RowResult) && (descr == 0)) { EDB_Type tt= res->ItemDataType(0); if(tt == eDB_Text || tt == eDB_Image) { while(res->Fetch()) { res->ReadItem(&i, 1); descr= new CTDS_ITDescriptor(m_Link, descr_in); // descr= res->GetImageOrTextDescriptor(); if(descr) break; } } } delete res; } delete lcmd; return descr;}RETCODE CTDS_Connection::x_Results(DBPROCESS* pLink){ unsigned int x_Status= 0x1; CDB_Result* dbres; I_Result* res= 0; while ((x_Status & 0x1) != 0) { switch (dbresults(pLink)) { case SUCCEED: if (DBCMDROW(pLink) == SUCCEED) { // we may get rows in this result if(!m_ResProc) { for(;;) { switch(dbnextrow(pLink)) { case NO_MORE_ROWS: case FAIL: case BUF_FULL: break; default: continue; } break; } continue; } res = new CTDS_RowResult(pLink, &x_Status); if(res) { dbres= Create_Result(*res); m_ResProc->ProcessResult(*dbres); delete dbres; delete res; } if ((x_Status & 0x10) != 0) { // we do have a compute result res = new CTDS_ComputeResult(pLink, &x_Status); if(res) { dbres= Create_Result(*res); m_ResProc->ProcessResult(*dbres); delete dbres; delete res; } } } continue; case NO_MORE_RESULTS: x_Status = 2; break; default: return FAIL; } break; } // we've done with the row results at this point // let's look at return parameters and ret status if (m_ResProc && x_Status == 2) { x_Status = 4; int n = dbnumrets(pLink); if (n > 0) { res = new CTDS_ParamResult(pLink, n); if(res) { dbres= Create_Result(*res); m_ResProc->ProcessResult(*dbres); delete dbres; delete res; } } } if (m_ResProc && x_Status == 4) { if (dbhasretstat(pLink)) { res = new CTDS_StatusResult(pLink); if(res) { dbres= Create_Result(*res); m_ResProc->ProcessResult(*dbres); delete dbres; delete res; } } } return SUCCEED;}///////////////////////////////////////////////////////////////////////////////// CTDS_SendDataCmd:://CTDS_SendDataCmd::CTDS_SendDataCmd(CTDS_Connection* con, DBPROCESS* cmd, size_t nof_bytes){ m_Connect = con; m_Cmd = cmd; m_Bytes2go = nof_bytes;}size_t CTDS_SendDataCmd::SendChunk(const void* pChunk, size_t nof_bytes){ if (!pChunk || !nof_bytes) { throw CDB_ClientEx(eDB_Fatal, 290000, "CTDS_SendDataCmd::SendChunk", "wrong (zero) arguments"); } if (!m_Bytes2go) return 0; if (nof_bytes > m_Bytes2go) nof_bytes = m_Bytes2go; if (dbmoretext(m_Cmd, nof_bytes, (BYTE*) pChunk) != SUCCEED) { dbcancel(m_Cmd); throw CDB_ClientEx(eDB_Error, 290001, "CTDS_SendDataCmd::SendChunk", "dbmoretext failed"); } m_Bytes2go -= nof_bytes; if (m_Bytes2go <= 0) { // if (dbsqlok(m_Cmd) != SUCCEED || dbresults(m_Cmd) == FAIL) { if (dbsqlok(m_Cmd) != SUCCEED || m_Connect->x_Results(m_Cmd) == FAIL) { throw CDB_ClientEx(eDB_Error, 290002, "CTDS_SendDataCmd::SendChunk", "dbsqlok/results failed"); } } return nof_bytes;}void CTDS_SendDataCmd::Release(){ m_BR = 0; if (m_Bytes2go > 0) { dbcancel(m_Cmd); m_Bytes2go = 0; } m_Connect->DropCmd(*this); delete this;}CTDS_SendDataCmd::~CTDS_SendDataCmd(){ if (m_Bytes2go > 0) dbcancel(m_Cmd); if (m_BR) *m_BR = 0;}END_NCBI_SCOPE/* * =========================================================================== * $Log: connection.cpp,v $ * Revision 1000.1 2004/06/01 19:20:42 gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7 * * Revision 1.7 2004/05/17 21:13:37 gorelenk * Added include of PCH ncbi_pch.hpp * * Revision 1.6 2003/06/05 16:01:40 soussov * adds code for DumpResults and for the dumped results processing * * Revision 1.5 2002/12/03 19:21:24 soussov * formatting * * Revision 1.4 2002/08/23 16:32:11 soussov * fixes bug in ~CTDS_Connection() * * Revision 1.3 2002/03/26 15:35:10 soussov * new image/text operations added * * Revision 1.2 2001/11/06 18:00:02 lavr * Formatted uniformly as the rest of the library * * Revision 1.1 2001/10/25 00:39:22 vakatov * Initial revision * * =========================================================================== */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -