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; }
CBaseCmd::CBaseCmd(impl::CConnection& conn, const string& query) : CCmdBase(conn) , m_Query(query) , m_InParams(GetBindParamsImpl()) , m_OutParams(GetDefineParamsImpl()) , m_Recompile(false) , m_HasFailed(false) , m_IsOpen(false) , m_IsDeclared(false) { }
bool CMySQL_LangCmd::Send() { if (mysql_real_query (&m_Connect->m_MySQL, GetQuery().data(), GetQuery().length()) != 0) { DATABASE_DRIVER_WARNING( "Failed: mysql_real_query", 800003 ); } GetBindParamsImpl().LockBinding(); my_ulonglong nof_Rows = mysql_affected_rows(&this->m_Connect->m_MySQL); // There is not too much sence in comparing unsigned value with -1. // m_HasMoreResults = nof_Rows == -1 || nof_Rows > 0; m_HasMoreResults = nof_Rows > 0; return true; }
CDBParams& CODBC_RPCCmd::GetBindParams(void) { if (m_InParams.get() == NULL) { m_InParams.reset(new impl::CRowInfo_SP_SQL_Server( GetQuery(), GetConnImpl(), GetBindParamsImpl() ) ); } return *m_InParams; }
bool CODBC_RPCCmd::x_AssignParams(string& cmd, string& q_exec, string& q_select, CMemPot& bind_guard, SQLLEN* indicator) { char p_nm[16]; // check if we do have a named parameters (first named - all named) bool param_named = !GetBindParamsImpl().GetParamName(0).empty(); for (unsigned int n = 0; n < GetBindParamsImpl().NofParams(); n++) { if(GetBindParamsImpl().GetParamStatus(n) == 0) continue; const string& name = GetBindParamsImpl().GetParamName(n); CDB_Object& param = *GetBindParamsImpl().GetParam(n); if (!x_BindParam_ODBC(param, bind_guard, indicator, n)) { return false; } q_exec += n ? ',':' '; const string type = Type2String(param); if(!param_named) { sprintf(p_nm, "@pR%d", n); q_exec += p_nm; cmd += "declare "; cmd += p_nm; cmd += ' '; cmd += type; cmd += ";select "; cmd += p_nm; cmd += " = ?;"; } else { q_exec += name+'='+name; cmd += "declare " + name + ' ' + type + ";select " + name + " = ?;"; } if(param.IsNULL()) { indicator[n] = SQL_NULL_DATA; } if ((GetBindParamsImpl().GetParamStatus(n) & impl::CDB_Params::fOutput) != 0) { q_exec += " output"; const char* p_name = param_named? name.c_str() : p_nm; if(!q_select.empty()) q_select += ','; q_select.append(p_name+1); q_select += '='; q_select += p_name; } } GetBindParamsImpl().LockBinding(); return true; }
CBaseCmd::CBaseCmd(impl::CConnection& conn, const string& cursor_name, const string& query) : CCmdBase(conn) , m_Query(query) , m_InParams(GetBindParamsImpl()) , m_OutParams(GetDefineParamsImpl()) , m_Recompile(false) , m_HasFailed(false) , m_IsOpen(false) , m_IsDeclared(false) , m_CmdName(cursor_name) , m_RowsSent(0) , m_BatchesSent(0) { }
bool CDBL_BCPInCmd::x_AssignParams(void* pb) { RETCODE r; if (!m_WasBound) { for (unsigned int i = 0; i < GetBindParamsImpl().NofParams(); i++) { if (GetBindParamsImpl().GetParamStatus(i) == 0) continue; CDB_Object& param = *GetBindParamsImpl().GetParam(i); switch ( param.GetType() ) { case eDB_Bit: DATABASE_DRIVER_ERROR("Bit data type is not supported", 10005); break; case eDB_Int: { CDB_Int& val = dynamic_cast<CDB_Int&> (param); // DBINT v = (DBINT) val.Value(); r = Check(bcp_bind(GetCmd(), (BYTE*) val.BindVal(), 0, val.IsNULL() ? 0 : -1, 0, 0, SYBINT4, i + 1)); } break; case eDB_SmallInt: { CDB_SmallInt& val = dynamic_cast<CDB_SmallInt&> (param); // DBSMALLINT v = (DBSMALLINT) val.Value(); r = Check(bcp_bind(GetCmd(), (BYTE*) val.BindVal(), 0, val.IsNULL() ? 0 : -1, 0, 0, SYBINT2, i + 1)); } break; case eDB_TinyInt: { CDB_TinyInt& val = dynamic_cast<CDB_TinyInt&> (param); // DBTINYINT v = (DBTINYINT) val.Value(); r = Check(bcp_bind(GetCmd(), (BYTE*) val.BindVal(), 0, val.IsNULL() ? 0 : -1, 0, 0, SYBINT1, i + 1)); } break; case eDB_BigInt: { CDB_BigInt& val = dynamic_cast<CDB_BigInt&> (param); DBNUMERIC* v = reinterpret_cast<DBNUMERIC*> (pb); Int8 v8 = val.Value(); v->precision= 18; v->scale= 0; if (longlong_to_numeric(v8, 18, DBNUMERIC_val(v)) == 0) return false; r = Check(bcp_bind(GetCmd(), (BYTE*) v, 0, val.IsNULL() ? 0 : -1, 0, 0, SYBNUMERIC, i + 1)); pb = (void*) (v + 1); } break; case eDB_Char: { CDB_Char& val = dynamic_cast<CDB_Char&> (param); if (val.IsNULL()) { r = Check(bcp_bind(GetCmd(), (BYTE*) "", 0, 0, NULL, 0, SYBCHAR, i + 1)); } else { // r = Check(bcp_bind(GetCmd(), (BYTE*) val.Data(), 0, // val.Size(), NULL, 0, SYBCHAR, i + 1)); r = Check(bcp_bind(GetCmd(), (BYTE*) val.AsCString(), 0, -1, (BYTE*) "", 1, SYBCHAR, i + 1)); } } break; case eDB_VarChar: { CDB_VarChar& val = dynamic_cast<CDB_VarChar&> (param); if (val.IsNULL()) { r = Check(bcp_bind(GetCmd(), (BYTE*) "", 0, 0, NULL, 0, SYBVARCHAR, i + 1)); } else { r = Check(bcp_bind(GetCmd(), (BYTE*) val.AsCString(), 0, -1, (BYTE*) "", 1, SYBVARCHAR, i + 1)); } } break; case eDB_LongChar: { CDB_LongChar& val = dynamic_cast<CDB_LongChar&> (param); if (val.IsNULL()) { r = Check(bcp_bind(GetCmd(), (BYTE*) "", 0, 0, NULL, 0, SYBCHAR, i + 1)); } else { r = Check(bcp_bind(GetCmd(), (BYTE*) val.AsCString(), 0, -1, (BYTE*) "", 1, SYBCHAR, i + 1)); } } break; case eDB_Binary: { CDB_Binary& val = dynamic_cast<CDB_Binary&> (param); r = Check(bcp_bind(GetCmd(), (BYTE*) val.Value(), 0, val.IsNULL() ? 0 : (DBINT) val.Size(), 0, 0, SYBBINARY, i + 1)); } break; case eDB_VarBinary: { CDB_VarBinary& val = dynamic_cast<CDB_VarBinary&> (param); r = Check(bcp_bind(GetCmd(), (BYTE*) val.Value(), 0, val.IsNULL() ? 0 : (DBINT) val.Size(), 0, 0, SYBBINARY, i + 1)); } break; case eDB_LongBinary: { CDB_LongBinary& val = dynamic_cast<CDB_LongBinary&> (param); r = Check(bcp_bind(GetCmd(), (BYTE*) val.Value(), 0, val.IsNULL() ? 0 : val.DataSize(), 0, 0, SYBBINARY, i + 1)); } break; case eDB_Float: { CDB_Float& val = dynamic_cast<CDB_Float&> (param); // DBREAL v = (DBREAL) val.Value(); r = Check(bcp_bind(GetCmd(), (BYTE*) val.BindVal(), 0, val.IsNULL() ? 0 : -1, 0, 0, SYBREAL, i + 1)); } break; case eDB_Double: { CDB_Double& val = dynamic_cast<CDB_Double&> (param); // DBFLT8 v = (DBFLT8) val.Value(); r = Check(bcp_bind(GetCmd(), (BYTE*) val.BindVal(), 0, val.IsNULL() ? 0 : -1, 0, 0, SYBFLT8, i + 1)); } break; case eDB_SmallDateTime: { CDB_SmallDateTime& val = dynamic_cast<CDB_SmallDateTime&> (param); DBDATETIME4* dt = (DBDATETIME4*) pb; if (param.IsNULL()) { DBDATETIME4_days(dt) = 0; DBDATETIME4_mins(dt) = 0; } else { DBDATETIME4_days(dt) = val.GetDays(); DBDATETIME4_mins(dt) = val.GetMinutes(); } r = Check(bcp_bind(GetCmd(), (BYTE*) dt, 0, val.IsNULL() ? 0 : -1, 0, 0, SYBDATETIME4, i + 1)); pb = (void*) (dt + 1); } break; case eDB_DateTime: { CDB_DateTime& val = dynamic_cast<CDB_DateTime&> (param); DBDATETIME* dt = (DBDATETIME*) pb; if (param.IsNULL()) { dt->dtdays = 0; dt->dttime = 0; } else { dt->dtdays = val.GetDays(); dt->dttime = val.Get300Secs(); } r = Check(bcp_bind(GetCmd(), (BYTE*) dt, 0, val.IsNULL() ? 0 : -1, 0, 0, SYBDATETIME, i + 1)); pb = (void*) (dt + 1); } break; case eDB_Text: { CDB_Text& val = dynamic_cast<CDB_Text&> (param); r = Check(bcp_bind(GetCmd(), 0, 0, val.IsNULL() ? 0 : (DBINT) val.Size(), 0, 0, SYBTEXT, i + 1)); m_HasTextImage = true; } break; case eDB_Image: { CDB_Image& val = dynamic_cast<CDB_Image&> (param); r = Check(bcp_bind(GetCmd(), 0, 0, val.IsNULL() ? 0 : (DBINT) val.Size(), 0, 0, SYBIMAGE, i + 1)); m_HasTextImage = true; } break; default: return false; } if (r != CS_SUCCEED) return false; } GetBindParamsImpl().LockBinding(); m_WasBound = true; } else { for (unsigned int i = 0; i < GetBindParamsImpl().NofParams(); i++) { if (GetBindParamsImpl().GetParamStatus(i) == 0) continue; CDB_Object& param = *GetBindParamsImpl().GetParam(i); switch ( param.GetType() ) { case eDB_Int: { CDB_Int& val = dynamic_cast<CDB_Int&> (param); // DBINT v = (DBINT) val.Value(); r = Check(bcp_colptr(GetCmd(), (BYTE*) val.BindVal(), i + 1)) == SUCCEED && Check(bcp_collen(GetCmd(), val.IsNULL() ? 0 : -1, i + 1)) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_SmallInt: { CDB_SmallInt& val = dynamic_cast<CDB_SmallInt&> (param); // DBSMALLINT v = (DBSMALLINT) val.Value(); r = Check(bcp_colptr(GetCmd(), (BYTE*) val.BindVal(), i + 1)) == SUCCEED && Check(bcp_collen(GetCmd(), val.IsNULL() ? 0 : -1, i + 1)) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_TinyInt: { CDB_TinyInt& val = dynamic_cast<CDB_TinyInt&> (param); // DBTINYINT v = (DBTINYINT) val.Value(); r = Check(bcp_colptr(GetCmd(), (BYTE*) val.BindVal(), i + 1)) == SUCCEED && Check(bcp_collen(GetCmd(), val.IsNULL() ? 0 : -1, i + 1)) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_BigInt: { CDB_BigInt& val = dynamic_cast<CDB_BigInt&> (param); DBNUMERIC* v = (DBNUMERIC*) pb; v->precision= 18; v->scale= 0; Int8 v8 = val.Value(); if (longlong_to_numeric(v8, 18, DBNUMERIC_val(v)) == 0) return false; r = Check(bcp_colptr(GetCmd(), (BYTE*) v, i + 1)) == SUCCEED && Check(bcp_collen(GetCmd(), val.IsNULL() ? 0 : -1, i + 1)) == SUCCEED ? SUCCEED : FAIL; pb = (void*) (v + 1); } break; case eDB_Char: { CDB_Char& val = dynamic_cast<CDB_Char&> (param); if (val.IsNULL()) { r = Check(bcp_colptr(GetCmd(), (BYTE*) "", i + 1)) == SUCCEED && Check(bcp_collen(GetCmd(), 0, i + 1)) == SUCCEED ? SUCCEED : FAIL; } else { r = Check(bcp_colptr(GetCmd(), (BYTE*) val.AsCString(), i + 1)) == SUCCEED && Check(bcp_collen(GetCmd(), -1 /* val.Size() */, i + 1)) == SUCCEED ? SUCCEED : FAIL; } } break; case eDB_VarChar: { CDB_VarChar& val = dynamic_cast<CDB_VarChar&> (param); if (val.IsNULL()) { r = Check(bcp_colptr(GetCmd(), (BYTE*) "", i + 1)) == SUCCEED && Check(bcp_collen(GetCmd(), 0, i + 1)) == SUCCEED ? SUCCEED : FAIL; } else { r = Check(bcp_colptr(GetCmd(), (BYTE*) val.AsCString(), i + 1)) == SUCCEED && Check(bcp_collen(GetCmd(), -1, i + 1)) == SUCCEED ? SUCCEED : FAIL; } } break; case eDB_LongChar: { CDB_LongChar& val = dynamic_cast<CDB_LongChar&> (param); if (val.IsNULL()) { r = Check(bcp_colptr(GetCmd(), (BYTE*) "", i + 1)) == SUCCEED && Check(bcp_collen(GetCmd(), 0, i + 1)) == SUCCEED ? SUCCEED : FAIL; } else { r = Check(bcp_colptr(GetCmd(), (BYTE*) val.AsCString(), i + 1)) == SUCCEED && Check(bcp_collen(GetCmd(), -1, i + 1)) == SUCCEED ? SUCCEED : FAIL; } } break; case eDB_Binary: { CDB_Binary& val = dynamic_cast<CDB_Binary&> (param); r = Check(bcp_colptr(GetCmd(), (BYTE*) val.Value(), i + 1)) == SUCCEED && Check(bcp_collen(GetCmd(), val.IsNULL() ? 0 : (DBINT) val.Size(), i + 1)) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_VarBinary: { CDB_VarBinary& val = dynamic_cast<CDB_VarBinary&> (param); r = Check(bcp_colptr(GetCmd(), (BYTE*) val.Value(), i + 1)) == SUCCEED && Check(bcp_collen(GetCmd(), val.IsNULL() ? 0 : (DBINT)val.Size(), i + 1)) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_LongBinary: { CDB_LongBinary& val = dynamic_cast<CDB_LongBinary&> (param); r = Check(bcp_colptr(GetCmd(), (BYTE*) val.Value(), i + 1)) == SUCCEED && Check(bcp_collen(GetCmd(), val.IsNULL() ? 0 : val.DataSize(), i + 1)) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_Float: { CDB_Float& val = dynamic_cast<CDB_Float&> (param); //DBREAL v = (DBREAL) val.Value(); r = Check(bcp_colptr(GetCmd(), (BYTE*) val.BindVal(), i + 1)) == SUCCEED && Check(bcp_collen(GetCmd(), val.IsNULL() ? 0 : -1, i + 1)) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_Double: { CDB_Double& val = dynamic_cast<CDB_Double&> (param); //DBFLT8 v = (DBFLT8) val.Value(); r = Check(bcp_bind(GetCmd(), (BYTE*) val.BindVal(), 0, val.IsNULL() ? 0 : -1, 0, 0, SYBFLT8, i + 1)); } break; case eDB_SmallDateTime: { CDB_SmallDateTime& val = dynamic_cast<CDB_SmallDateTime&> (param); DBDATETIME4* dt = (DBDATETIME4*) pb; if (param.IsNULL()) { DBDATETIME4_days(dt) = 0; DBDATETIME4_mins(dt) = 0; } else { DBDATETIME4_days(dt) = val.GetDays(); DBDATETIME4_mins(dt) = val.GetMinutes(); } r = Check(bcp_colptr(GetCmd(), (BYTE*) dt, i + 1)) == SUCCEED && Check(bcp_collen(GetCmd(), val.IsNULL() ? 0 : -1, i + 1)) == SUCCEED ? SUCCEED : FAIL; pb = (void*) (dt + 1); } break; case eDB_DateTime: { CDB_DateTime& val = dynamic_cast<CDB_DateTime&> (param); DBDATETIME* dt = (DBDATETIME*) pb; if (param.IsNULL()) { dt->dtdays = 0; dt->dttime = 0; } else { dt->dtdays = val.GetDays(); dt->dttime = val.Get300Secs(); } r = Check(bcp_colptr(GetCmd(), (BYTE*) dt, i + 1)) == SUCCEED && Check(bcp_collen(GetCmd(), val.IsNULL() ? 0 : -1, i + 1)) == SUCCEED ? SUCCEED : FAIL; pb = (void*) (dt + 1); } break; case eDB_Text: { CDB_Text& val = dynamic_cast<CDB_Text&> (param); r = Check(bcp_collen(GetCmd(), (DBINT) val.Size(), i + 1)); } break; case eDB_Image: { CDB_Image& val = dynamic_cast<CDB_Image&> (param); r = Check(bcp_collen(GetCmd(), (DBINT) val.Size(), i + 1)); } break; default: return false; } if (r != CS_SUCCEED) return false; } } return true; }
bool CDBL_BCPInCmd::Bind(unsigned int column_num, CDB_Object* param_ptr) { m_WasBound = false; return GetBindParamsImpl().BindParam(column_num, kEmptyStr, param_ptr); }
bool CTL_BCPInCmd::Send(void) { unsigned int i; CS_INT datalen = 0; size_t len = 0; char buff[2048]; CheckIsDead(); if ( !WasSent() ) { // we need to init the bcp CheckSFB(blk_init(x_GetSybaseCmd(), CS_BLK_IN, (CS_CHAR*) GetQuery().data(), GetQuery().size()), "blk_init failed", 123001); SetWasSent(); // check what needs to be default CS_DATAFMT fmt; for (i = 0; i < GetBindParamsImpl().NofParams(); i++) { if (GetBindParamsImpl().GetParamStatus(i) != 0) { continue; } SetHasFailed((Check(blk_describe(x_GetSybaseCmd(), i + 1, &fmt)) != CS_SUCCEED)); CHECK_DRIVER_ERROR( HasFailed(), "blk_describe failed (check the number of " "columns in a table)." + GetDbgInfo(), 123002 ); } } SetHasFailed(!x_AssignParams()); CHECK_DRIVER_ERROR( HasFailed(), "Cannot assign the params." + GetDbgInfo(), 123004 ); switch ( Check(blk_rowxfer(x_GetSybaseCmd())) ) { case CS_BLK_HAS_TEXT: for (i = 0; i < GetBindParamsImpl().NofParams(); i++) { if (GetBindParamsImpl().GetParamStatus(i) == 0) continue; CDB_Object& param = *GetBindParamsImpl().GetParam(i); if (param.IsNULL()) { continue; } else if (param.GetType() == eDB_Text || param.GetType() == eDB_Image) { CDB_Stream& par = dynamic_cast<CDB_Stream&> (param); for (datalen = (CS_INT) par.Size(); datalen > 0; datalen -= (CS_INT) len) { len = par.Read(buff, sizeof(buff)); SetHasFailed((Check(blk_textxfer(x_GetSybaseCmd(), (CS_BYTE*) buff, (CS_INT) len, 0) ) == CS_FAIL)); CHECK_DRIVER_ERROR( HasFailed(), "blk_textxfer failed for the text/image field." + GetDbgInfo(), 123005 ); } } } case CS_SUCCEED: ++m_RowCount; return true; default: SetHasFailed(); CHECK_DRIVER_ERROR( HasFailed(), "blk_rowxfer failed." + GetDbgInfo(), 123007 ); } return false; }
bool CODBC_RPCCmd::Send() { Cancel(); SetHasFailed(false); m_HasStatus = false; // make a language command string main_exec_query("declare @STpROCrETURNsTATUS int;\nexec @STpROCrETURNsTATUS="); main_exec_query += GetQuery(); string param_result_query; CMemPot bindGuard; string q_str; if(GetBindParamsImpl().NofParams() > 0) { SQLLEN* indicator = (SQLLEN*) bindGuard.Alloc(GetBindParamsImpl().NofParams() * sizeof(SQLLEN)); if (!x_AssignParams(q_str, main_exec_query, param_result_query, bindGuard, indicator)) { ResetParams(); SetHasFailed(); string err_message = "Cannot assign params." + GetDbgInfo(); DATABASE_DRIVER_ERROR( err_message, 420003 ); } } if(NeedToRecompile()) main_exec_query += " with recompile"; q_str += main_exec_query + ";\nselect STpROCrETURNsTATUS=@STpROCrETURNsTATUS"; if(!param_result_query.empty()) { q_str += ";\nselect " + param_result_query; } switch(SQLExecDirect(GetHandle(), CODBCString(q_str, GetClientEncoding()), SQL_NTS)) { case SQL_SUCCESS: m_HasMoreResults = true; break; case SQL_NO_DATA: m_HasMoreResults = true; /* this is a bug in SQLExecDirect it returns SQL_NO_DATA if status result is the only result of RPC */ m_RowCount = 0; break; case SQL_ERROR: ReportErrors(); ResetParams(); SetHasFailed(); { string err_message = "SQLExecDirect failed." + GetDbgInfo(); DATABASE_DRIVER_ERROR( err_message, 420001 ); } case SQL_SUCCESS_WITH_INFO: ReportErrors(); m_HasMoreResults = true; break; case SQL_STILL_EXECUTING: ReportErrors(); ResetParams(); SetHasFailed(); { string err_message = "Some other query is executing on this connection." + GetDbgInfo(); DATABASE_DRIVER_ERROR( err_message, 420002 ); } case SQL_INVALID_HANDLE: SetHasFailed(); { string err_message = "The statement handler is invalid (memory corruption suspected)." + GetDbgInfo(); DATABASE_DRIVER_ERROR( err_message, 420004 ); } default: ReportErrors(); ResetParams(); SetHasFailed(); { string err_message = "Unexpected error." + GetDbgInfo(); DATABASE_DRIVER_ERROR( err_message, 420005 ); } } SetWasSent(); return true; }
bool CODBC_BCPInCmd::Bind(unsigned int column_num, CDB_Object* param_ptr) { return GetBindParamsImpl().BindParam(column_num, kEmptyStr, param_ptr); }
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; }
bool CODBC_BCPInCmd::x_AssignParams(void* pb) { RETCODE r; if (!m_WasBound) { for (unsigned int i = 0; i < GetBindParamsImpl().NofParams(); ++i) { if (GetBindParamsImpl().GetParamStatus(i) == 0) { r = bcp_bind(GetHandle(), (BYTE*) pb, 0, SQL_VARLEN_DATA, 0, 0, 0, i + 1); } else { CDB_Object& param = *GetBindParamsImpl().GetParam(i); EDB_Type data_type = param.GetType(); r = bcp_bind(GetHandle(), static_cast<LPCBYTE>(const_cast<void*>(x_GetDataPtr(data_type, pb))), 0, static_cast<DBINT>(x_GetBCPDataSize(data_type)), static_cast<LPCBYTE>(x_GetDataTerminator(data_type)), static_cast<INT>(x_GetDataTermSize(data_type)), x_GetBCPDataType(data_type), i + 1); m_HasTextImage = m_HasTextImage || (data_type == eDB_Image || data_type == eDB_Text); } if (r != SUCCEED) { ReportErrors(); return false; } } GetBindParamsImpl().LockBinding(); m_WasBound = true; } for (unsigned int i = 0; i < GetBindParamsImpl().NofParams(); i++) { if (GetBindParamsImpl().GetParamStatus(i) == 0) { r = bcp_collen(GetHandle(), SQL_NULL_DATA, i + 1); } else { CDB_Object& param = *GetBindParamsImpl().GetParam(i); switch ( param.GetType() ) { case eDB_Bit: DATABASE_DRIVER_ERROR("Bit data type is not supported", 10005); break; case eDB_Int: { CDB_Int& val = dynamic_cast<CDB_Int&> (param); r = bcp_colptr(GetHandle(), (BYTE*) val.BindVal(), i + 1) == SUCCEED && bcp_collen(GetHandle(), val.IsNULL() ? SQL_NULL_DATA : sizeof(Int4), i + 1) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_SmallInt: { CDB_SmallInt& val = dynamic_cast<CDB_SmallInt&> (param); // DBSMALLINT v = (DBSMALLINT) val.Value(); r = bcp_colptr(GetHandle(), (BYTE*) val.BindVal(), i + 1) == SUCCEED && bcp_collen(GetHandle(), val.IsNULL() ? SQL_NULL_DATA : sizeof(Int2), i + 1) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_TinyInt: { CDB_TinyInt& val = dynamic_cast<CDB_TinyInt&> (param); // DBTINYINT v = (DBTINYINT) val.Value(); r = bcp_colptr(GetHandle(), (BYTE*) val.BindVal(), i + 1) == SUCCEED && bcp_collen(GetHandle(), val.IsNULL() ? SQL_NULL_DATA : sizeof(Uint1), i + 1) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_BigInt: { CDB_BigInt& val = dynamic_cast<CDB_BigInt&> (param); r = bcp_colptr(GetHandle(), (BYTE*) val.BindVal(), i + 1) == SUCCEED && bcp_collen(GetHandle(), val.IsNULL() ? SQL_NULL_DATA : sizeof(Int8), i + 1) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_Char: case eDB_VarChar: case eDB_LongChar: { CDB_String& val = dynamic_cast<CDB_String&> (param); CTempString data; if (val.IsNULL()) { data.assign(static_cast<char*>(pb), 0); } else { if (IsMultibyteClientEncoding()) { const wstring& ws = val.AsWString(GetClientEncoding()); // hack data.assign((const char*)(ws.data()), ws.size() * sizeof(wchar_t)); } else { data = val.Value(); } } DBINT length; INT dummy; // Can't just supply NULL if (val.IsNULL()) { length = SQL_NULL_DATA; } else if (bcp_getcolfmt(GetHandle(), i + 1, BCP_FMT_DATA_LEN, &length, sizeof(length), &dummy) == FAIL || length < 0) { length = SQL_VARLEN_DATA; // Be conservative. } else if (static_cast<SIZE_TYPE>(length) > data.size()) { // Retain automatic truncation, which blindly supplying // data.size() could lose. length = data.size(); } r = bcp_colptr(GetHandle(), (BYTE*) data.data(), i + 1) == SUCCEED && bcp_collen(GetHandle(), length, i + 1) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_Binary: { CDB_Binary& val = dynamic_cast<CDB_Binary&> (param); r = bcp_colptr(GetHandle(), (!val.IsNULL())? ((BYTE*) val.Value()) : (BYTE*)pb, i + 1) == SUCCEED && bcp_collen(GetHandle(), val.IsNULL() ? SQL_NULL_DATA : (Int4) val.Size(), i + 1) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_VarBinary: { CDB_VarBinary& val = dynamic_cast<CDB_VarBinary&> (param); r = bcp_colptr(GetHandle(), (!val.IsNULL())? ((BYTE*) val.Value()) : (BYTE*)pb, i + 1) == SUCCEED && bcp_collen(GetHandle(), val.IsNULL() ? SQL_NULL_DATA : (Int4) val.Size(), i + 1) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_LongBinary: { CDB_LongBinary& val = dynamic_cast<CDB_LongBinary&> (param); r = bcp_colptr(GetHandle(), (!val.IsNULL())? ((BYTE*) val.Value()) : (BYTE*)pb, i + 1) == SUCCEED && bcp_collen(GetHandle(), val.IsNULL() ? SQL_NULL_DATA : (Int4) val.DataSize(), i + 1) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_Float: { CDB_Float& val = dynamic_cast<CDB_Float&> (param); //DBREAL v = (DBREAL) val.Value(); r = bcp_colptr(GetHandle(), (BYTE*) val.BindVal(), i + 1) == SUCCEED && bcp_collen(GetHandle(), val.IsNULL() ? SQL_NULL_DATA : sizeof(float), i + 1) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_Double: { CDB_Double& val = dynamic_cast<CDB_Double&> (param); //DBFLT8 v = (DBFLT8) val.Value(); r = bcp_colptr(GetHandle(), (BYTE*) val.BindVal(), i + 1) == SUCCEED && bcp_collen(GetHandle(), val.IsNULL() ? SQL_NULL_DATA : sizeof(double), i + 1) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_SmallDateTime: { CDB_SmallDateTime& val = dynamic_cast<CDB_SmallDateTime&> (param); DBDATETIM4* dt = (DBDATETIM4*) pb; DBDATETIME4_days(dt) = val.GetDays(); DBDATETIME4_mins(dt) = val.GetMinutes(); r = bcp_colptr(GetHandle(), (BYTE*) dt, i + 1) == SUCCEED && bcp_collen(GetHandle(), val.IsNULL() ? SQL_NULL_DATA : sizeof(DBDATETIM4), i + 1) == SUCCEED ? SUCCEED : FAIL; pb = (void*) (dt + 1); } break; case eDB_DateTime: { CDB_DateTime& val = dynamic_cast<CDB_DateTime&> (param); DBDATETIME* dt = (DBDATETIME*) pb; if (val.IsNULL()) { r = bcp_colptr(GetHandle(), (BYTE*) dt, i + 1) == SUCCEED && bcp_collen(GetHandle(), SQL_NULL_DATA, i + 1) == SUCCEED ? SUCCEED : FAIL; } else { dt->dtdays = val.GetDays(); dt->dttime = val.Get300Secs(); r = bcp_colptr(GetHandle(), (BYTE*) dt, i + 1) == SUCCEED && bcp_collen(GetHandle(), sizeof(DBDATETIME), i + 1) == SUCCEED ? SUCCEED : FAIL; } pb = (void*) (dt + 1); } break; case eDB_Text: { CDB_Text& val = dynamic_cast<CDB_Text&> (param); if (val.IsNULL()) { r = bcp_colptr(GetHandle(), (BYTE*) pb, i + 1) == SUCCEED && bcp_collen(GetHandle(), SQL_NULL_DATA, i + 1) == SUCCEED ? SUCCEED : FAIL; } else { r = bcp_bind(GetHandle(), (BYTE*) NULL, 0, (DBINT) val.Size(), static_cast<LPCBYTE>(x_GetDataTerminator(eDB_Text)), static_cast<INT>(x_GetDataTermSize(eDB_Text)), x_GetBCPDataType(eDB_Text), i + 1); } } break; case eDB_Image: { CDB_Image& val = dynamic_cast<CDB_Image&> (param); // Null images doesn't work in odbc // (at least in those tests that exists in dbapi_unit_test) r = bcp_collen(GetHandle(), (DBINT) val.Size(), i + 1); } break; default: return false; } } if (r != SUCCEED) { ReportErrors(); return false; } } return true; }