int BCPInRecords(ifstream bcpInfile, char *szExtSystem) { int intImportCount = 0; // Get current server datetime DBDATETIME dtCurDateTime; dtCurDateTime.dtdays = 0; dbcmd(dbproc, "select getdate()"); dbsqlexec(dbproc); if (dbresults(dbproc) == SUCCEED) if (dbnextrow(dbproc) != NO_MORE_ROWS) dbconvert(dbproc, SYBDATETIME, (dbdata(dbproc, 1)), (DBINT)-1, SYBDATETIME, (BYTE*)&dtCurDateTime, (DBINT)-1); if ( dtCurDateTime.dtdays == 0 ) return -1; // Call bcp_init if ( bcp_init(dbproc, "cags..x_import", NULL, "bcp_err.out", DB_IN) != SUCCEED ) { errfile << ERROR_PREFIX << "failed bcp_init" << endl; return -1; } bcp_bind(dbproc, (BYTE*)szExtSystem, 0, -1, (BYTE*)"", 1, SYBCHAR, 1); bcp_bind(dbproc, (BYTE*)&dtCurDateTime, 0, -1, NULL, 0, SYBDATETIME, 2); bcp_bind(dbproc, (BYTE*)&intImportCount, 0, -1, NULL, 0, SYBINT2, 3); bcp_bind(dbproc, (BYTE*)buffer, 0, -1, (BYTE*)"", 1, SYBVARCHAR, 4); while ( !bcpInfile.eof() ) { bcpInfile.getline(buffer, 255); // cout << buffer << endl; intImportCount++; // Bulk copy it into the database */ bcp_sendrow(dbproc); } // Close the bulk copy process so all the changes are committed return bcp_done(dbproc); }
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; }
static int transfer_data(BCPPARAMDATA params, DBPROCESS * dbsrc, DBPROCESS * dbdest) { char ls_command[256]; int col; DBINT src_numcols = 0; DBINT src_datlen; typedef struct migcoldata { DBINT coltype; DBINT collen; DBINT nullind; DBCHAR *data; } MIGCOLDATA; MIGCOLDATA **srcdata; DBINT rows_read = 0; DBINT rows_sent = 0; DBINT rows_done = 0; DBINT ret; struct timeval start_time; struct timeval end_time; double elapsed_time; struct timeval batch_start; struct timeval batch_end; double elapsed_batch = 0.0; if (params.vflag) { printf("\nStarting copy...\n"); } if (params.tflag) { sprintf(ls_command, "truncate table %s", params.ddbobject); if (dbcmd(dbdest, ls_command) == FAIL) { printf("dbcmd failed\n"); return FALSE; } if (dbsqlexec(dbdest) == FAIL) { printf("dbsqlexec failed\n"); return FALSE; } if (dbresults(dbdest) == FAIL) { printf("Error in dbresults\n"); return FALSE; } } sprintf(ls_command, "select * from %s", params.sdbobject); if (dbcmd(dbsrc, ls_command) == FAIL) { printf("dbcmd failed\n"); return FALSE; } if (dbsqlexec(dbsrc) == FAIL) { printf("dbsqlexec failed\n"); return FALSE; } if (NO_MORE_RESULTS != dbresults(dbsrc)); { if (0 == (src_numcols = dbnumcols(dbsrc))) { printf("Error in dbnumcols\n"); return FALSE; } } if (bcp_init(dbdest, params.ddbobject, (char *) NULL, (char *) NULL, DB_IN) == FAIL) { printf("Error in bcp_init\n"); return FALSE; } srcdata = (MIGCOLDATA **) malloc(sizeof(MIGCOLDATA *) * src_numcols); for (col = 0; col < src_numcols; col++) { srcdata[col] = (MIGCOLDATA *) malloc(sizeof(MIGCOLDATA)); memset(srcdata[col], '\0', sizeof(MIGCOLDATA)); srcdata[col]->coltype = dbcoltype(dbsrc, col + 1); srcdata[col]->collen = dbcollen(dbsrc, col + 1); switch (srcdata[col]->coltype) { case SYBBIT: srcdata[col]->data = malloc(sizeof(DBBIT)); if (srcdata[col]->data == (char *) NULL) { printf("allocation error\n"); return FALSE; } dbbind(dbsrc, col + 1, BITBIND, sizeof(DBBIT), (BYTE *) srcdata[col]->data); dbnullbind(dbsrc, col + 1, &(srcdata[col]->nullind)); if (bcp_bind(dbdest, (BYTE *) srcdata[col]->data, 0, -1, NULL, 0, SYBBIT, col + 1) == FAIL) { printf("bcp_bind error\n"); return FALSE; } break; case SYBINT1: srcdata[col]->data = malloc(sizeof(DBTINYINT)); if (srcdata[col]->data == (char *) NULL) { printf("allocation error\n"); return FALSE; } dbbind(dbsrc, col + 1, TINYBIND, sizeof(DBTINYINT), (BYTE *) srcdata[col]->data); dbnullbind(dbsrc, col + 1, &(srcdata[col]->nullind)); if (bcp_bind(dbdest, (BYTE *) srcdata[col]->data, 0, -1, NULL, 0, SYBINT1, col + 1) == FAIL) { printf("bcp_bind error\n"); return FALSE; } break; case SYBINT2: srcdata[col]->data = malloc(sizeof(DBSMALLINT)); if (srcdata[col]->data == (char *) NULL) { printf("allocation error\n"); return FALSE; } dbbind(dbsrc, col + 1, SMALLBIND, sizeof(DBSMALLINT), (BYTE *) srcdata[col]->data); dbnullbind(dbsrc, col + 1, &(srcdata[col]->nullind)); if (bcp_bind(dbdest, (BYTE *) srcdata[col]->data, 0, -1, NULL, 0, SYBINT2, col + 1) == FAIL) { printf("bcp_bind error\n"); return FALSE; } break; case SYBINT4: srcdata[col]->data = malloc(sizeof(DBINT)); if (srcdata[col]->data == (char *) NULL) { printf("allocation error\n"); return FALSE; } dbbind(dbsrc, col + 1, INTBIND, sizeof(DBINT), (BYTE *) srcdata[col]->data); dbnullbind(dbsrc, col + 1, &(srcdata[col]->nullind)); if (bcp_bind(dbdest, (BYTE *) srcdata[col]->data, 0, -1, NULL, 0, SYBINT4, col + 1) == FAIL) { printf("bcp_bind error\n"); return FALSE; } break; case SYBFLT8: srcdata[col]->data = malloc(sizeof(DBFLT8)); if (srcdata[col]->data == (char *) NULL) { printf("allocation error\n"); return FALSE; } dbbind(dbsrc, col + 1, FLT8BIND, sizeof(DBFLT8), (BYTE *) srcdata[col]->data); dbnullbind(dbsrc, col + 1, &(srcdata[col]->nullind)); if (bcp_bind(dbdest, (BYTE *) srcdata[col]->data, 0, -1, NULL, 0, SYBFLT8, col + 1) == FAIL) { printf("bcp_bind error\n"); return FALSE; } break; case SYBREAL: srcdata[col]->data = malloc(sizeof(DBREAL)); if (srcdata[col]->data == (char *) NULL) { printf("allocation error\n"); return FALSE; } dbbind(dbsrc, col + 1, REALBIND, sizeof(DBREAL), (BYTE *) srcdata[col]->data); dbnullbind(dbsrc, col + 1, &(srcdata[col]->nullind)); if (bcp_bind(dbdest, (BYTE *) srcdata[col]->data, 0, -1, NULL, 0, SYBREAL, col + 1) == FAIL) { printf("bcp_bind error\n"); return FALSE; } break; case SYBMONEY: srcdata[col]->data = malloc(sizeof(DBMONEY)); if (srcdata[col]->data == (char *) NULL) { printf("allocation error\n"); return FALSE; } dbbind(dbsrc, col + 1, MONEYBIND, sizeof(DBMONEY), (BYTE *) srcdata[col]->data); dbnullbind(dbsrc, col + 1, &(srcdata[col]->nullind)); if (bcp_bind(dbdest, (BYTE *) srcdata[col]->data, 0, -1, NULL, 0, SYBMONEY, col + 1) == FAIL) { printf("bcp_bind error\n"); return FALSE; } break; case SYBMONEY4: srcdata[col]->data = malloc(sizeof(DBMONEY4)); if (srcdata[col]->data == (char *) NULL) { printf("allocation error\n"); return FALSE; } dbbind(dbsrc, col + 1, SMALLMONEYBIND, sizeof(DBMONEY4), (BYTE *) srcdata[col]->data); dbnullbind(dbsrc, col + 1, &(srcdata[col]->nullind)); if (bcp_bind(dbdest, (BYTE *) srcdata[col]->data, 0, -1, NULL, 0, SYBMONEY4, col + 1) == FAIL) { printf("bcp_bind error\n"); return FALSE; } break; case SYBDATETIME: srcdata[col]->data = malloc(sizeof(DBDATETIME)); if (srcdata[col]->data == (char *) NULL) { printf("allocation error\n"); return FALSE; } dbbind(dbsrc, col + 1, DATETIMEBIND, sizeof(DBDATETIME), (BYTE *) srcdata[col]->data); dbnullbind(dbsrc, col + 1, &(srcdata[col]->nullind)); if (bcp_bind(dbdest, (BYTE *) srcdata[col]->data, 0, -1, NULL, 0, SYBDATETIME, col + 1) == FAIL) { printf("bcp_bind error\n"); return FALSE; } break; case SYBDATETIME4: srcdata[col]->data = malloc(sizeof(DBDATETIME4)); if (srcdata[col]->data == (char *) NULL) { printf("allocation error\n"); return FALSE; } dbbind(dbsrc, col + 1, SMALLDATETIMEBIND, sizeof(DBDATETIME), (BYTE *) srcdata[col]->data); dbnullbind(dbsrc, col + 1, &(srcdata[col]->nullind)); if (bcp_bind(dbdest, (BYTE *) srcdata[col]->data, 0, -1, NULL, 0, SYBDATETIME4, col + 1) == FAIL) { printf("bcp_bind error\n"); return FALSE; } break; case SYBNUMERIC: srcdata[col]->data = malloc(sizeof(DBNUMERIC)); if (srcdata[col]->data == (char *) NULL) { printf("allocation error\n"); return FALSE; } dbbind(dbsrc, col + 1, NUMERICBIND, sizeof(DBNUMERIC), (BYTE *) srcdata[col]->data); dbnullbind(dbsrc, col + 1, &(srcdata[col]->nullind)); if (bcp_bind(dbdest, (BYTE *) srcdata[col]->data, 0, sizeof(DBNUMERIC), NULL, 0, SYBNUMERIC, col + 1) == FAIL) { printf("bcp_bind error\n"); return FALSE; } break; case SYBDECIMAL: srcdata[col]->data = malloc(sizeof(DBDECIMAL)); if (srcdata[col]->data == (char *) NULL) { printf("allocation error\n"); return FALSE; } dbbind(dbsrc, col + 1, DECIMALBIND, sizeof(DBDECIMAL), (BYTE *) srcdata[col]->data); dbnullbind(dbsrc, col + 1, &(srcdata[col]->nullind)); if (bcp_bind(dbdest, (BYTE *) srcdata[col]->data, 0, sizeof(DBDECIMAL), NULL, 0, SYBDECIMAL, col + 1) == FAIL) { printf("bcp_bind error\n"); return FALSE; } break; case SYBTEXT: case SYBCHAR: srcdata[col]->data = malloc(srcdata[col]->collen + 1); if (srcdata[col]->data == (char *) NULL) { printf("allocation error\n"); return FALSE; } dbbind(dbsrc, col + 1, NTBSTRINGBIND, srcdata[col]->collen + 1, (BYTE *) srcdata[col]->data); dbnullbind(dbsrc, col + 1, &(srcdata[col]->nullind)); if (bcp_bind(dbdest, (BYTE *) srcdata[col]->data, 0, -1, NULL, 0, SYBCHAR, col + 1) == FAIL) { printf("bcp_bind error\n"); return FALSE; } break; } } gettimeofday(&start_time, 0); while (dbnextrow(dbsrc) != NO_MORE_ROWS) { rows_read++; for (col = 0; col < src_numcols; col++) { switch (srcdata[col]->coltype) { case SYBBIT: case SYBINT1: case SYBINT2: case SYBINT4: case SYBFLT8: case SYBREAL: case SYBDATETIME: case SYBDATETIME4: case SYBMONEY: case SYBMONEY4: if (srcdata[col]->nullind == -1) { /* NULL data retrieved from source */ bcp_collen(dbdest, 0, col + 1); } else { bcp_collen(dbdest, -1, col + 1); } break; case SYBNUMERIC: if (srcdata[col]->nullind == -1) { /* NULL data retrieved from source */ bcp_collen(dbdest, 0, col + 1); } else { bcp_collen(dbdest, sizeof(DBNUMERIC), col + 1); } break; case SYBDECIMAL: if (srcdata[col]->nullind == -1) { /* NULL data retrieved from source */ bcp_collen(dbdest, 0, col + 1); } else { bcp_collen(dbdest, sizeof(DBDECIMAL), col + 1); } break; case SYBTEXT: case SYBCHAR: if (srcdata[col]->nullind == -1) { /* NULL data retrieved from source */ bcp_collen(dbdest, 0, col + 1); } else { /* * if there is zero length data, then the * input data MUST have been all blanks, * trimmed down to nothing by the bind * type of NTBSTRINGBIND. * so find out the source data length and * re-set the data accordingly... */ if (strlen(srcdata[col]->data) == 0) { src_datlen = dbdatlen(dbsrc, col + 1); memset(srcdata[col]->data, ' ', src_datlen); srcdata[col]->data[src_datlen] = '\0'; } bcp_collen(dbdest, strlen(srcdata[col]->data), col + 1); } break; } } if (bcp_sendrow(dbdest) == FAIL) { fprintf(stderr, "bcp_sendrow failed. \n"); return FALSE; } else { rows_sent++; if (rows_sent == params.batchsize) { gettimeofday(&batch_start, 0); ret = bcp_batch(dbdest); gettimeofday(&batch_end, 0); elapsed_batch = elapsed_batch + ((double) (batch_end.tv_sec - batch_start.tv_sec) + ((double) (batch_end.tv_usec - batch_start.tv_usec) / 1000000.00) ); if (ret == -1) { printf("bcp_batch error\n"); return FALSE; } else { rows_done += ret; printf("%d rows successfully copied (total %d)\n", ret, rows_done); rows_sent = 0; } } } } if (rows_read) { gettimeofday(&batch_start, 0); ret = bcp_done(dbdest); gettimeofday(&batch_end, 0); elapsed_batch = elapsed_batch + ((double) (batch_end.tv_sec - batch_start.tv_sec) + ((double) (batch_end.tv_usec - batch_start.tv_usec) / 1000000.00) ); if (ret == -1) { fprintf(stderr, "bcp_done failed. \n"); return FALSE; } else { rows_done += ret; } } gettimeofday(&end_time, 0); elapsed_time = (double) (end_time.tv_sec - start_time.tv_sec) + ((double) (end_time.tv_usec - start_time.tv_usec) / 1000000.00); if (params.vflag) { printf("\n"); printf("rows read : %d\n", rows_read); printf("rows written : %d\n", rows_done); printf("elapsed time (secs) : %f\n", elapsed_time); printf("rows per second : %f\n", rows_done / elapsed_time); } 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; }