BEGIN_NCBI_SCOPE // Aux. for s_*GetItem() // CDB_Image and CDB_Text are not handled by this function ... static CDB_Object* s_GenericGetItem(EDB_Type data_type, CDB_Object* item_buff, EDB_Type b_type, const BYTE* d_ptr, DBINT d_len) { switch (data_type) { case eDB_VarBinary: { if (item_buff) { switch (b_type) { case eDB_VarBinary: ((CDB_VarBinary*) item_buff)->SetValue((const void*) d_ptr, (size_t) d_len); break; case eDB_Binary: ((CDB_Binary*) item_buff)->SetValue((const void*) d_ptr, (size_t) d_len); break; case eDB_VarChar: ((CDB_VarChar*) item_buff)->SetValue((const char*) d_ptr, (size_t) d_len); break; case eDB_Char: ((CDB_Char*) item_buff)->SetValue((const char*) d_ptr, (size_t) d_len); break; case eDB_LongBinary: ((CDB_LongBinary*)item_buff)->SetValue((const void*) d_ptr, (size_t) d_len); break; case eDB_LongChar: ((CDB_LongChar*) item_buff)->SetValue((const char*) d_ptr, (size_t) d_len); break; default: DATABASE_DRIVER_ERROR( "wrong type of CDB_Object", 230020 ); } return item_buff; } return d_ptr ? new CDB_VarBinary((const void*) d_ptr, (size_t) d_len) : new CDB_VarBinary(); } case eDB_Bit: { DBBIT* v = (DBBIT*) d_ptr; if (item_buff) { if (v) { switch (b_type) { case eDB_Bit: *((CDB_Bit*) item_buff) = (int) *v; break; case eDB_TinyInt: *((CDB_TinyInt*) item_buff) = *v ? 1 : 0; break; case eDB_SmallInt: *((CDB_SmallInt*) item_buff) = *v ? 1 : 0; break; case eDB_Int: *((CDB_Int*) item_buff) = *v ? 1 : 0; break; default: DATABASE_DRIVER_ERROR( "wrong type of CDB_Object", 230020 ); } } else item_buff->AssignNULL(); return item_buff; } return v ? new CDB_Bit((int) *v) : new CDB_Bit; } case eDB_VarChar: { if (item_buff) { switch (b_type) { case eDB_VarChar: ((CDB_VarChar*) item_buff)->SetValue((const char*) d_ptr, (size_t) d_len); break; case eDB_Char: ((CDB_Char*) item_buff)->SetValue((const char*) d_ptr, (size_t) d_len); break; case eDB_LongChar: ((CDB_LongChar*) item_buff)->SetValue((const char*) d_ptr, (size_t) d_len); break; case eDB_VarBinary: ((CDB_VarBinary*) item_buff)->SetValue((const void*) d_ptr, (size_t) d_len); break; case eDB_Binary: ((CDB_Binary*) item_buff)->SetValue((const void*) d_ptr, (size_t) d_len); break; case eDB_LongBinary: ((CDB_LongBinary*)item_buff)->SetValue((const void*) d_ptr, (size_t) d_len); break; default: DATABASE_DRIVER_ERROR( "wrong type of CDB_Object", 230020 ); } return item_buff; } return d_ptr ? new CDB_VarChar((const char*) d_ptr, (size_t) d_len) : new CDB_VarChar(); } case eDB_DateTime: { DBDATETIME* v = (DBDATETIME*) d_ptr; if (item_buff) { if (b_type != eDB_DateTime) { DATABASE_DRIVER_ERROR( "wrong type of CDB_Object", 230020 ); } if (v) ((CDB_DateTime*) item_buff)->Assign(v->dtdays, v->dttime); else item_buff->AssignNULL(); return item_buff; } return v ? new CDB_DateTime(v->dtdays, v->dttime) : new CDB_DateTime; } case eDB_SmallDateTime: { DBDATETIME4* v = (DBDATETIME4*)d_ptr; if (item_buff) { if (v) { switch (b_type) { case eDB_SmallDateTime: ((CDB_SmallDateTime*) item_buff)->Assign (DBDATETIME4_days(v), DBDATETIME4_mins(v)); break; case eDB_DateTime: ((CDB_DateTime*) item_buff)->Assign ((int) DBDATETIME4_days(v), (int) DBDATETIME4_mins(v)*60*300); break; default: DATABASE_DRIVER_ERROR( "wrong type of CDB_Object", 230020 ); } } else item_buff->AssignNULL(); return item_buff; } return v ? new CDB_SmallDateTime(DBDATETIME4_days(v), DBDATETIME4_mins(v)) : new CDB_SmallDateTime; } case eDB_TinyInt: { DBTINYINT* v = (DBTINYINT*) d_ptr; if (item_buff) { if (v) { switch (b_type) { case eDB_TinyInt: *((CDB_TinyInt*) item_buff) = (Uint1) *v; break; case eDB_SmallInt: *((CDB_SmallInt*) item_buff) = (Int2) *v; break; case eDB_Int: *((CDB_Int*) item_buff) = (Int4) *v; break; default: DATABASE_DRIVER_ERROR( "wrong type of CDB_Object", 230020 ); } } else item_buff->AssignNULL(); return item_buff; } return v ? new CDB_TinyInt((Uint1) *v) : new CDB_TinyInt; } case eDB_SmallInt: { DBSMALLINT* v = (DBSMALLINT*) d_ptr; if (item_buff) { if (v) { switch (b_type) { case eDB_SmallInt: *((CDB_SmallInt*) item_buff) = (Int2) *v; break; case eDB_Int: *((CDB_Int*) item_buff) = (Int4) *v; break; default: DATABASE_DRIVER_ERROR( "wrong type of CDB_Object", 230020 ); } } else item_buff->AssignNULL(); return item_buff; } return v ? new CDB_SmallInt((Int2) *v) : new CDB_SmallInt; } case eDB_Int: { DBINT* v = (DBINT*) d_ptr; if (item_buff) { if (v) { if (b_type == eDB_Int) *((CDB_Int*) item_buff) = (Int4) *v; else { DATABASE_DRIVER_ERROR( "wrong type of CDB_Object", 230020 ); } } else item_buff->AssignNULL(); return item_buff; } return v ? new CDB_Int((Int4) *v) : new CDB_Int; } case eDB_Double: { if (item_buff && b_type != eDB_Double) { DATABASE_DRIVER_ERROR( "wrong type of CDB_Object", 130020 ); } DBFLT8* v = (DBFLT8*) d_ptr; if (item_buff) { if (v) *((CDB_Double*) item_buff) = (double) *v; else item_buff->AssignNULL(); return item_buff; } return v ? new CDB_Double((double)*v) : new CDB_Double; } case eDB_Float: { if (item_buff && b_type != eDB_Float) { DATABASE_DRIVER_ERROR( "wrong type of CDB_Object", 130020 ); } DBREAL* v = (DBREAL*) d_ptr; if (item_buff) { if (v) *((CDB_Float*) item_buff) = (float) *v; else item_buff->AssignNULL(); return item_buff; } return v ? new CDB_Float((float)*v) : new CDB_Float; } case eDB_LongBinary: { if (item_buff) { switch (b_type) { case eDB_LongBinary: ((CDB_LongBinary*)item_buff)->SetValue((const void*) d_ptr, (size_t) d_len); break; case eDB_LongChar: ((CDB_LongChar*) item_buff)->SetValue((const char*) d_ptr, (size_t) d_len); break; default: DATABASE_DRIVER_ERROR( "wrong type of CDB_Object", 230020 ); } return item_buff; } return d_ptr ? new CDB_LongBinary((size_t) d_len, (const void*) d_ptr, (size_t) d_len) : new CDB_LongBinary(); } case eDB_LongChar: { if (item_buff) { switch (b_type) { case eDB_LongChar: ((CDB_LongChar*) item_buff)->SetValue((const char*) d_ptr, (size_t) d_len); break; case eDB_LongBinary: ((CDB_LongBinary*)item_buff)->SetValue((const void*) d_ptr, (size_t) d_len); break; default: DATABASE_DRIVER_ERROR( "wrong type of CDB_Object", 230020 ); } return item_buff; } return d_ptr ? new CDB_LongChar((size_t) d_len, (const char*) d_ptr) : new CDB_LongChar(); } default: return 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 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; }