bool CDBL_BCPInCmd::Send(void) { char param_buff[2048]; // maximal row size, assured of buffer overruns if (!x_AssignParams(param_buff)) { SetHasFailed(); DATABASE_DRIVER_ERROR( "Cannot assign params." + GetDbgInfo(), 223004 ); } SetWasSent(); if (Check(bcp_sendrow(GetCmd())) != SUCCEED) { SetHasFailed(); DATABASE_DRIVER_ERROR( "bcp_sendrow failed." + GetDbgInfo(), 223005 ); } if (m_HasTextImage) { // send text/image data char buff[1800]; // text/image page size for (unsigned int i = 0; i < GetBindParamsImpl().NofParams(); i++) { if (GetBindParamsImpl().GetParamStatus(i) == 0) continue; CDB_Object& param = *GetBindParamsImpl().GetParam(i); if (param.GetType() != eDB_Text && param.GetType() != eDB_Image) continue; CDB_Stream& val = dynamic_cast<CDB_Stream&> (param); size_t s = val.Size(); do { size_t l = val.Read(buff, sizeof(buff)); if (l > s) l = s; if (Check(bcp_moretext(GetCmd(), (DBINT) l, (BYTE*) buff)) != SUCCEED) { SetHasFailed(); string error; if (param.GetType() == eDB_Text) { error = "bcp_moretext for text failed."; } else { error = "bcp_moretext for image failed."; } DATABASE_DRIVER_ERROR( error + GetDbgInfo(), 223006 ); } if (!l) break; s -= l; } while (s); } } ++m_RowCount; return true; }
bool CODBC_BCPInCmd::Send(void) { char param_buff[2048]; // maximal row size, assured of buffer overruns if (!x_AssignParams(param_buff)) { SetHasFailed(); string err_message = "Cannot assign params." + GetDbgInfo(); DATABASE_DRIVER_ERROR( err_message, 423004 ); } SetWasSent(); if (bcp_sendrow(GetHandle()) != SUCCEED) { SetHasFailed(); ReportErrors(); string err_message = "bcp_sendrow failed." + GetDbgInfo(); DATABASE_DRIVER_ERROR( err_message, 423005 ); } if (m_HasTextImage) { // send text/image data char buff[1800]; // text/image page size for (unsigned int i = 0; i < GetBindParamsImpl().NofParams(); ++i) { if (GetBindParamsImpl().GetParamStatus(i) == 0) continue; CDB_Object& param = *GetBindParamsImpl().GetParam(i); if (param.GetType() != eDB_Image && (param.GetType() != eDB_Text || param.IsNULL())) continue; CDB_Stream& val = dynamic_cast<CDB_Stream&> (param); size_t left_bytes = val.Size(); size_t len = 0; size_t valid_len = 0; size_t invalid_len = 0; do { invalid_len = len - valid_len; if (valid_len < len) { memmove(buff, buff + valid_len, invalid_len); } len = val.Read(buff + invalid_len, sizeof(buff) - invalid_len); if (len > left_bytes) { len = left_bytes; } valid_len = CUtf8::GetValidBytesCount( CTempString(buff, len)); CODBCString odbc_str(buff, len); // !!! TODO: Decode to UCS2 if needed !!!! if (bcp_moretext(GetHandle(), (DBINT) valid_len, (LPCBYTE)static_cast<const char*>(odbc_str) ) != SUCCEED) { SetHasFailed(); ReportErrors(); string err_text; if (param.GetType() == eDB_Text) { err_text = "bcp_moretext for text failed."; } else { err_text = "bcp_moretext for image failed."; } err_text += GetDbgInfo(); DATABASE_DRIVER_ERROR( err_text, 423006 ); } if (!valid_len) { break; } left_bytes -= valid_len; } while (left_bytes); } } return true; }