⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bcp.c

📁 ncbi源码
💻 C
📖 第 1 页 / 共 5 页
字号:
                        ** column processing */						tds_put_smallint(tds, bcpcol->txptr_offset);						tds_put_int(tds, bcpcol->data_size);						tds_put_n(tds, bcpcol->data, bcpcol->data_size);						blob_cols++;					}				}			}	/* Not TDS  7.0 or 8.0 */			rows_written_so_far++;			if (dbproc->bcpbatch > 0 && rows_written_so_far == dbproc->bcpbatch) {				rows_written_so_far = 0;				tds_flush_packet(tds);				do {					marker = tds_get_byte(tds);					if (marker == TDS_DONE_TOKEN) {						tds_process_end(tds, marker, NULL,NULL);						rows_copied_this_batch = tds->rows_affected;						rows_copied_so_far += rows_copied_this_batch;                    }                     else {						tds_process_default_tokens(tds, marker);					}				} while (marker != TDS_DONE_TOKEN);				_bcp_start_new_batch(dbproc);			}		}	}	if (fclose(hostfile) != 0) {        _bcp_err_handler(dbproc, BCPEBCUC);		return (FAIL);	}	tds_flush_packet(tds);	do {		marker = tds_get_byte(tds);		if (marker == TDS_DONE_TOKEN) {			tds_process_end(tds, marker, NULL,NULL);			rows_copied_this_batch = tds->rows_affected;			rows_copied_so_far += rows_copied_this_batch;			*rows_copied = rows_copied_so_far;        }         else {			tds_process_default_tokens(tds, marker);		}	} while (marker != TDS_DONE_TOKEN);	return SUCCEED;}RETCODE bcp_exec(DBPROCESS *dbproc, DBINT *rows_copied){RETCODE ret;	if (dbproc->bcp_direction == 0) {        _bcp_err_handler(dbproc, BCPEBCPI);		return FAIL;	}	if (dbproc->bcp_hostfile) {		if (dbproc->bcp_direction == DB_OUT) {			ret = _bcp_exec_out(dbproc, rows_copied);        }         else if (dbproc->bcp_direction==DB_IN) {			ret = _bcp_exec_in(dbproc, rows_copied);		}		_bcp_clear_storage(dbproc);		return ret;    }    else {        _bcp_err_handler(dbproc, BCPEBCVH );		return FAIL;	}}static RETCODE _bcp_start_copy_in(DBPROCESS *dbproc){TDSSOCKET *tds = dbproc->tds_socket;BCP_COLINFO *bcpcol;    TDSCOLINFO      *curcol;    TDSRESULTINFO   *resinfo;int i;int marker;    char colstatus;#ifdef NCBI_FTDS    char query[2048];    char colclause[2048];#else    char query[256];    char colclause[256];#endifint firstcol;	if (IS_TDS7_PLUS(tds)) {		int erc;		char *hint;        firstcol = 1;#ifdef NCBI_FTDS        colclause[0]= '\0';        for(i= 0; i < dbproc->bcp_colcount; i++) {            if((!is_blob_type(dbproc->bcp_columns[i]->db_type)) &&               (dbproc->host_columns[i]->datatype != 0)){                _bcp_build_bulk_insert_stmt(colclause, dbproc->bcp_columns[i], firstcol);                firstcol = 0;            }        }        for(i= 0; i < dbproc->bcp_colcount; i++) {            if(is_blob_type(dbproc->bcp_columns[i]->db_type) &&               (dbproc->host_columns[i]->datatype != 0)) {                _bcp_build_bulk_insert_stmt(colclause, dbproc->bcp_columns[i], firstcol);                firstcol = 0;            }        }#else		strcpy(colclause, "");		for (i = 0; i < dbproc->bcp_colcount; i++) {			bcpcol = dbproc->bcp_columns[i];			if (IS_TDS7_PLUS(tds)) {				_bcp_build_bulk_insert_stmt(colclause, bcpcol, firstcol);				firstcol = 0;			}		}#endif		if (dbproc->bcp_hint) {			if (asprintf(&hint, " with (%s)", dbproc->bcp_hint) < 0) {				return FAIL;			}		} else {			hint = strdup("");		}		if (!hint) return FAIL;		sprintf(query, "insert bulk %s (%s)%s", dbproc->bcp_tablename, colclause, hint);		free(hint); 	}    else {       sprintf(query, "insert bulk %s", dbproc->bcp_tablename);	}	tds_submit_query(tds, query);	/* save the statement for later... */    dbproc->bcp_insert_stmt = (char *) malloc(strlen(query)+1);    strcpy(dbproc->bcp_insert_stmt, query);	/* In TDS 5 we get the column information as a */	/* result set from the "insert bulk" command.  */	/* we're going to ignore this....              */	if (IS_TDS50(tds)) {        if (tds_process_result_tokens(tds) == TDS_FAIL) {			return FAIL;		}		if (!tds->res_info) {			return FAIL;		}        while (tds_process_row_tokens(tds) == SUCCEED);     }    else {		marker = tds_get_byte(tds);		tds_process_default_tokens(tds, marker);		if (!is_end_token(marker)) {			return FAIL;		}	}	/* work out the number of "variable" columns -         */	/* either varying length type e.g. varchar or nullable */	dbproc->var_cols = 0;	for (i = 0; i < dbproc->bcp_colcount; i++) {		bcpcol = dbproc->bcp_columns[i];        if (is_nullable_type(bcpcol->db_type) ||            bcpcol->db_nullable) {			dbproc->var_cols++;		}	}	return SUCCEED;}static RETCODE _bcp_build_bulk_insert_stmt(char *clause, BCP_COLINFO *bcpcol, int first){	char column_type[32];	switch (bcpcol->db_type_save) {    case SYBINT1:      strcpy(column_type,"tinyint");		break;    case SYBBIT:       strcpy(column_type,"bit");		break;    case SYBINT2:      strcpy(column_type,"smallint");		break;    case SYBINT4:      strcpy(column_type,"int");		break;    case SYBDATETIME:  strcpy(column_type,"datetime");		break;    case SYBDATETIME4: strcpy(column_type,"smalldatetime");		break;    case SYBREAL:      strcpy(column_type,"real");		break;    case SYBMONEY:     strcpy(column_type,"money");		break;    case SYBMONEY4:    strcpy(column_type,"smallmoney");		break;    case SYBFLT8:      strcpy(column_type,"float");		break;    case SYBINT8:      strcpy(column_type,"bigint");		break;    case SYBINTN:      switch (bcpcol->db_length) {    case 1: strcpy(column_type,"tinyint");			break;    case 2: strcpy(column_type,"smallint");			break;    case 4: strcpy(column_type,"int");			break;    case 8: strcpy(column_type,"bigint");			break;		}		break;    case SYBBITN:      strcpy(column_type,"bit");		break;    case SYBFLTN:      switch (bcpcol->db_length) {    case 4: strcpy(column_type,"real");			break;    case 8: strcpy(column_type,"float");			break;		}		break;    case SYBMONEYN:    switch (bcpcol->db_length) {    case 4: strcpy(column_type,"smallmoney");			break;    case 8: strcpy(column_type,"money");			break;		}		break;    case SYBDATETIMN:  switch (bcpcol->db_length) {    case 4: strcpy(column_type,"smalldatetime");			break;    case 8: strcpy(column_type,"datetime");			break;		}		break;    case SYBDECIMAL:   sprintf(column_type,"decimal(%d,%d)", bcpcol->db_prec, bcpcol->db_scale);		break;    case SYBNUMERIC:   sprintf(column_type,"numeric(%d,%d)", bcpcol->db_prec, bcpcol->db_scale);		break;    case XSYBVARBINARY: sprintf(column_type,"varbinary(%d)", bcpcol->db_length);		break;    case XSYBVARCHAR  : sprintf(column_type,"varchar(%d)", bcpcol->db_length);		break;    case XSYBBINARY   : sprintf(column_type,"binary(%d)", bcpcol->db_length);		break;    case XSYBCHAR     : sprintf(column_type,"char(%d)", bcpcol->db_length);		break;    case SYBTEXT      : sprintf(column_type,"text");		break;    case SYBIMAGE     : sprintf(column_type,"image");		break;    case XSYBNVARCHAR : sprintf(column_type,"nvarchar(%d)", bcpcol->db_length);		break;    case XSYBNCHAR    : sprintf(column_type,"nchar(%d)", bcpcol->db_length);		break;    case SYBNTEXT     : sprintf(column_type,"ntext");		break;	}	if (!first)		strcat(clause, ", ");	strcat(clause, bcpcol->db_name);	strcat(clause, " ");	strcat(clause, column_type);#ifdef NCBI_FTDS	return SUCCEED;#endif}static RETCODE _bcp_start_new_batch(DBPROCESS *dbproc){TDSSOCKET *tds = dbproc->tds_socket;int marker;	if (IS_TDS50(tds)) {		tds_submit_query(tds, dbproc->bcp_insert_stmt);        if (tds_process_result_tokens(tds) == TDS_FAIL) {			return FAIL;		}		if (!tds->res_info) {			return FAIL;		}        while (tds_process_row_tokens(tds) == SUCCEED);     }       else {		tds_submit_query(tds, dbproc->bcp_insert_stmt);		marker = tds_get_byte(tds);		tds_process_default_tokens(tds, marker);		if (!is_end_token(marker)) {			return FAIL;		}	}	tds->out_flag = 0x07;	if (IS_TDS7_PLUS(tds)) {		_bcp_send_colmetadata(dbproc);	}	return SUCCEED;}static RETCODE _bcp_send_colmetadata(DBPROCESS *dbproc){TDSSOCKET *tds = dbproc->tds_socket;    int          marker;unsigned char colmetadata_token = 0x81;BCP_COLINFO *bcpcol;char unicode_string[256];int i;#ifdef NCBI_FTDS    int n;#endif	if (IS_TDS7_PLUS(tds)) {		/* Deep joy! - for TDS 8 we have to send a            colmetadata message followed by row data 		 */		tds_put_byte(tds, colmetadata_token);	/* 0x81 */#ifdef NCBI_FTDS        for (i = 0, n= 0; i < dbproc->bcp_colcount; i++) {            if(dbproc->host_columns[i]->datatype != 0) n++;        }        tds_put_smallint(tds, n);#else		tds_put_smallint(tds, dbproc->bcp_colcount);#endif#ifdef NCBI_FTDS        for(n= 2; n--;)#endif        for (i = 0; i < dbproc->bcp_colcount; i++) {#ifdef NCBI_FTDS            if(dbproc->host_columns[i]->datatype == 0) continue;            if(n) {                if(is_blob_type(dbproc->bcp_columns[i]->db_type)) continue;            }            else                if(!is_blob_type(dbproc->bcp_columns[i]->db_type)) continue;#endif			bcpcol = dbproc->bcp_columns[i];			tds_put_smallint(tds, bcpcol->db_usertype);			tds_put_smallint(tds, bcpcol->db_flags);			tds_put_byte(tds, bcpcol->db_type_save);			switch (bcpcol->db_varint_size) {            case 4: tds_put_int(tds, bcpcol->db_length);				break;            case 2: tds_put_smallint(tds, bcpcol->db_length);				break;            case 1: tds_put_byte(tds, bcpcol->db_length);				break;            case 0: break;			}			if (is_numeric_type(bcpcol->db_type)) {				tds_put_byte(tds, bcpcol->db_prec);				tds_put_byte(tds, bcpcol->db_scale);			}#ifndef NCBI_FTDS            if (IS_TDS80(tds) && is_collate_type(bcpcol->db_type_save)) {#else            if (IS_TDS80(tds) &&                 (((bcpcol->db_flags & 0x2) != 0) || is_collate_type(bcpcol->db_type_save))) {#endif				tds_put_n(tds, bcpcol->db_collate, 5);			}#ifdef NCBI_FTDS            if(is_blob_type(bcpcol->db_type)) {                tds_put_byte(tds, 0x0); tds_put_byte(tds, 0x0); /* don't know what it is */            }#endif			tds_put_byte(tds, strlen(bcpcol->db_name));			tds7_ascii2unicode(tds, bcpcol->db_name, unicode_string, 255);			tds_put_n(tds, unicode_string, strlen(bcpcol->db_name) * 2);		}	}	return SUCCEED;}RETCODE bcp_readfmt(DBPROCESS *dbproc, char *filename){FILE *ffile;char buffer[1024];float lf_version = 0.0;int li_numcols = 0;int colinfo_count = 0;    struct fflist {	struct fflist *nextptr;	BCP_HOSTCOLINFO colinfo;};struct fflist *topptr = (struct fflist *) NULL;struct fflist *curptr = (struct fflist *) NULL;BCP_HOSTCOLINFO *hostcol;	if (dbproc->bcp_direction == 0) {        _bcp_err_handler(dbproc, BCPEBCPI);		return FAIL;	}	if ((ffile = fopen(filename, "r")) == (FILE *) NULL) {        _bcp_err_handler(dbproc, BCPEBUOF);		return (FAIL);	}	if ((fgets(buffer, sizeof(buffer), ffile)) != (char *) NULL) {		buffer[strlen(buffer) - 1] = '\0';	/* discard newline */		lf_version = atof(buffer);	}	if ((fgets(buffer, sizeof(buffer), ffile)) != (char *) NULL) {		buffer[strlen(buffer) - 1] = '\0';	/* discard newline */		li_numcols = atoi(buffer);	}	while ((fgets(buffer, sizeof(buffer), ffile)) != (char *) NULL) {		buffer[strlen(buffer) - 1] = '\0';	/* discard newline */		if (topptr == (struct fflist *) NULL) {	/* first time */			if ((topptr = (struct fflist *) malloc(sizeof(struct fflist))) == (struct fflist *) NULL) {				fprintf(stderr, "out of memory\n");				return (FAIL);			}			curptr = topptr;			curptr->nextptr = NULL;			if (_bcp_readfmt_colinfo(dbproc, buffer, &(curptr->colinfo)))				colinfo_count++;			else				return (FAIL);		} else {			if ((curptr->nextptr = (struct fflist *) malloc(sizeof(struct fflist))) == (struct fflist *) NULL) {				fprintf(stderr, "out of memory\n");				return (FAIL);			}			curptr = curptr->nextptr;			curptr->nextptr = NULL;			if (_bcp_readfmt_colinfo(dbproc, buffer, &(curptr->colinfo)))				colinfo_count++;			else				return (FAIL);		}	}	if (fclose(ffile) != 0) {        _bcp_err_handler(dbproc, BCPEBUCF);		return (FAIL);	}	if (colinfo_count != li_numcols)		return (FAIL);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -