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

📄 ct.c

📁 在Linux/Unix下面访问WINDOWS SQLSERVER 的ODBC驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
		return SYBBINARY;		break;	case CS_BIT_TYPE:		return SYBBIT;		break;	case CS_CHAR_TYPE:		return SYBCHAR;		break;	case CS_LONG_TYPE:		return SYBINT8;		break;	case CS_INT_TYPE:		return SYBINT4;		break;	case CS_SMALLINT_TYPE:		return SYBINT2;		break;	case CS_TINYINT_TYPE:		return SYBINT1;		break;	case CS_REAL_TYPE:		return SYBREAL;		break;	case CS_FLOAT_TYPE:		return SYBFLT8;		break;	case CS_MONEY_TYPE:		return SYBMONEY;		break;	case CS_MONEY4_TYPE:		return SYBMONEY4;		break;	case CS_DATETIME_TYPE:		return SYBDATETIME;		break;	case CS_DATETIME4_TYPE:		return SYBDATETIME4;		break;	case CS_NUMERIC_TYPE:		return SYBNUMERIC;		break;	case CS_DECIMAL_TYPE:		return SYBDECIMAL;		break;	case CS_VARBINARY_TYPE:		return SYBVARBINARY;		break;	case CS_TEXT_TYPE:		return SYBTEXT;		break;	case CS_UNIQUE_TYPE:		return SYBUNIQUE;		break;	case CS_LONGBINARY_TYPE:	/* vicm */		return SYBLONGBINARY;		break;	case CS_UNICHAR_TYPE:		return SYBVARCHAR;	default:		return -1;		break;	}}CS_RETCODEct_cancel(CS_CONNECTION * conn, CS_COMMAND * cmd, CS_INT type){	CS_RETCODE ret;	CS_COMMAND_LIST *cmds;	CS_COMMAND *conn_cmd;	CS_CONNECTION *cmd_conn;	tdsdump_log(TDS_DBG_FUNC, "ct_cancel()\n");	/*	 * Comments taken from Sybase ct-library reference manual	 * ------------------------------------------------------	 *	 * "To cancel current results, an application calls ct_cancel	 *  with type as CT_CANCEL CURRENT. This is equivalent to	 *  calling ct_fetch until it returns CS_END_DATA"	 *	 * "For CS_CANCEL_CURRENT cancels, cmd must be supplied"	 * "For CS_CANCEL_CURRENT cancels, connection must be NULL"	 */	if (type == CS_CANCEL_CURRENT) {		tdsdump_log(TDS_DBG_FUNC, "CS_CANCEL_CURRENT\n");		if (conn || !cmd)			return CS_FAIL;		if (!_ct_fetchable_results(cmd)) {			tdsdump_log(TDS_DBG_FUNC, "ct_cancel() no fetchable results - return()\n");			return CS_SUCCEED;		}		tdsdump_log(TDS_DBG_FUNC, "ct_cancel() - fetching results()\n");		do {			ret = ct_fetch(cmd, CS_UNUSED, CS_UNUSED, CS_UNUSED, NULL);		} while ((ret == CS_SUCCEED) || (ret == CS_ROW_FAIL));		if (cmd->con && cmd->con->tds_socket)			tds_free_all_results(cmd->con->tds_socket);		if (ret == CS_END_DATA) {			return CS_SUCCEED;		}		return CS_FAIL;	}	/*	 * Comments taken from Sybase ct-library reference manual	 * ------------------------------------------------------	 *	 * "To cancel the current command and all results generated	 *  by it, call ct_cancel with type as CS_CANCEL_ATTN or	 *  CS_CANCEL_ALL. Both of these calls tell client library	 *  to :	 *  * Send an attention to the server	 *  * discard any results already generated by the command	 *  Both types of cancel return CS_SUCCEED immediately, w/o	 *  sending an attention, if no command is in progress.	 *  If an application has not yet called ct_send to send an	 *  initiated command, a CS_CANCEL_ATTN has no effect.	 *	 *  If a command has been sent and ct_results has not been	 *  called, a ct_cancel (CS_CANCEL_ATTN) has no effect."	 *	 * "For CS_CANCEL_ATTN cancels, one of connection or cmd	 *  must be NULL. if cmd is supplied and connection is NULL	 *  the cancel operation applies only to the command pend-	 *  ing for this command structure. If cmd is NULL and	 *  connection is supplied, the cancel operation applies to	 *  all commands pending for this connection.	 */	if (type == CS_CANCEL_ATTN) {		if ((conn && cmd) || (!conn && !cmd)) {			return CS_FAIL;		}		if (cmd) {			tdsdump_log(TDS_DBG_FUNC, "CS_CANCEL_ATTN with cmd\n");			cmd_conn = cmd->con;			switch (cmd->command_state) {				case _CS_COMMAND_IDLE:				case _CS_COMMAND_READY:					tdsdump_log(TDS_DBG_FUNC, "ct_cancel() command state READY/IDLE\n");					break;				case _CS_COMMAND_SENT:					tdsdump_log(TDS_DBG_FUNC, "ct_cancel() command state SENT results_state %d\n", cmd->results_state);					if (cmd->results_state != _CS_RES_NONE) {						tdsdump_log(TDS_DBG_FUNC, "ct_cancel() sending a cancel \n");						tds_send_cancel(cmd_conn->tds_socket);						cmd->cancel_state = _CS_CANCEL_PENDING;					}					break;			}		}		if (conn) {			tdsdump_log(TDS_DBG_FUNC, "CS_CANCEL_ATTN with connection\n");			for (cmds = conn->cmds; cmds != NULL; cmds = cmds->next) {				conn_cmd = cmds->cmd;				switch (conn_cmd->command_state) {					case _CS_COMMAND_IDLE:					case _CS_COMMAND_READY:						tdsdump_log(TDS_DBG_FUNC, "ct_cancel() command state READY/IDLE\n");						break;					case _CS_COMMAND_SENT:						tdsdump_log(TDS_DBG_FUNC, "ct_cancel() command state SENT\n");						if (conn_cmd->results_state != _CS_RES_NONE) {							tdsdump_log(TDS_DBG_FUNC, "ct_cancel() sending a cancel \n");							tds_send_cancel(conn->tds_socket);							conn_cmd->cancel_state = _CS_CANCEL_PENDING;						}					break;				}			}		}		return CS_SUCCEED;	}	/*	 * Comments taken from Sybase ct-library reference manual	 * ------------------------------------------------------	 *	 * "To cancel the current command and all results generated	 *  by it, call ct_cancel with type as CS_CANCEL_ATTN or	 *  CS_CANCEL_ALL. Both of these calls tell client library	 *  to :	 *  * Send an attention to the server	 *  * discard any results already generated by the command	 *  Both types of cancel return CS_SUCCEED immediately, w/o	 *  sending an attention, if no command is in progress.	 *	 *  If an application has not yet called ct_send to send an	 *  initiated command, a CS_CANCEL_ALL cancel discards the	 *  initiated command without sending an attention to the	 *  server.	 *	 *  CS_CANCEL_ALL leaves the command structure in a 'clean'	 *  state, available for use in another operation.	 *	 * "For CS_CANCEL_ALL cancels, one of connection or cmd	 *  must be NULL. if cmd is supplied and connection is NULL	 *  the cancel operation applies only to the command pend-	 *  ing for this command structure. If cmd is NULL and	 *  connection is supplied, the cancel operation applies to	 *  all commands pending for this connection.	 */	if (type == CS_CANCEL_ALL) {		if ((conn && cmd) || (!conn && !cmd)) {			return CS_FAIL;		}		if (cmd) {			tdsdump_log(TDS_DBG_FUNC, "CS_CANCEL_ALL with cmd\n");			cmd_conn = cmd->con;			switch (cmd->command_state) {				case _CS_COMMAND_IDLE:				case _CS_COMMAND_BUILDING:				case _CS_COMMAND_READY:					tdsdump_log(TDS_DBG_FUNC, "ct_cancel() command state READY/IDLE\n");					_ct_initialise_cmd(cmd);					break;				case _CS_COMMAND_SENT:					tdsdump_log(TDS_DBG_FUNC, "ct_cancel() command state SENT\n");					tdsdump_log(TDS_DBG_FUNC, "ct_cancel() sending a cancel \n");					tds_send_cancel(cmd_conn->tds_socket);					tds_process_cancel(cmd_conn->tds_socket);					_ct_initialise_cmd(cmd);					break;			}		}		if (conn) {			tdsdump_log(TDS_DBG_FUNC, "CS_CANCEL_ALL with connection\n");			for (cmds = conn->cmds; cmds != NULL; cmds = cmds->next) {				tdsdump_log(TDS_DBG_FUNC, "ct_cancel() cancelling a command for a connection\n");				conn_cmd = cmds->cmd;				switch (conn_cmd->command_state) {					case _CS_COMMAND_IDLE:					case _CS_COMMAND_BUILDING:					case _CS_COMMAND_READY:						tdsdump_log(TDS_DBG_FUNC, "ct_cancel() command state SENT\n");						_ct_initialise_cmd(conn_cmd);						break;					case _CS_COMMAND_SENT:						tdsdump_log(TDS_DBG_FUNC, "ct_cancel() command state SENT\n");						tdsdump_log(TDS_DBG_FUNC, "ct_cancel() sending a cancel \n");						tds_send_cancel(conn->tds_socket);						tds_process_cancel(conn->tds_socket);						_ct_initialise_cmd(conn_cmd);					break;				}			}		}		return CS_SUCCEED;	}	return CS_FAIL;}static CS_RETCODE_ct_cancel_cleanup(CS_COMMAND * cmd){	CS_CONNECTION * con;	con = cmd->con;	if (con && !IS_TDSDEAD(con->tds_socket))		tds_process_cancel(con->tds_socket);	cmd->cancel_state = _CS_CANCEL_NOCANCEL;	return CS_SUCCEED;}CS_RETCODEct_describe(CS_COMMAND * cmd, CS_INT item, CS_DATAFMT * datafmt){	TDSSOCKET *tds;	TDSRESULTINFO *resinfo;	TDSCOLUMN *curcol;	int len;	tdsdump_log(TDS_DBG_FUNC, "ct_describe()\n");	if (!cmd->con || !cmd->con->tds_socket)		return CS_FAIL;	tds = cmd->con->tds_socket;	resinfo = tds->current_results;;	if (item < 1 || item > resinfo->num_cols)		return CS_FAIL;	curcol = resinfo->columns[item - 1];	len = curcol->column_namelen;	if (len >= CS_MAX_NAME)		len = CS_MAX_NAME - 1;	strncpy(datafmt->name, curcol->column_name, len);	/* name is always null terminated */	datafmt->name[len] = 0;	datafmt->namelen = len;	/* need to turn the SYBxxx into a CS_xxx_TYPE */	datafmt->datatype = _ct_get_client_type(curcol->column_type, curcol->column_usertype, curcol->column_size);	tdsdump_log(TDS_DBG_INFO1, "ct_describe() datafmt->datatype = %d server type %d\n", datafmt->datatype,		    curcol->column_type);	/* FIXME is ok this value for numeric/decimal? */	datafmt->maxlength = curcol->column_size;	datafmt->usertype = curcol->column_usertype;	datafmt->precision = curcol->column_prec;	datafmt->scale = curcol->column_scale;	/*	 * There are other options that can be returned, but these are the	 * only two being noted via the TDS layer.	 */	datafmt->status = 0;	if (curcol->column_nullable)		datafmt->status |= CS_CANBENULL;	if (curcol->column_identity)		datafmt->status |= CS_IDENTITY;	if (strcmp(datafmt->name, "txts") == 0)		datafmt->status |= CS_TIMESTAMP;	datafmt->count = 1;	datafmt->locale = NULL;	return CS_SUCCEED;}CS_RETCODEct_res_info(CS_COMMAND * cmd, CS_INT type, CS_VOID * buffer, CS_INT buflen, CS_INT * out_len){	TDSSOCKET *tds;	TDSRESULTINFO *resinfo;	TDSCOLUMN *curcol;	CS_INT int_val;	int i;	tdsdump_log(TDS_DBG_FUNC, "ct_res_info()\n");	if (!cmd->con || !cmd->con->tds_socket)		return CS_FAIL;	tds = cmd->con->tds_socket;	resinfo = tds->current_results;	switch (type) {	case CS_NUMDATA:		int_val = 0;		if (resinfo) {			for (i = 0; i < resinfo->num_cols; i++) {				curcol = resinfo->columns[i];				if (!curcol->column_hidden) {					int_val++;				}			}		}		tdsdump_log(TDS_DBG_FUNC, "ct_res_info(): Number of columns is %d\n", int_val);		memcpy(buffer, &int_val, sizeof(CS_INT));		break;	case CS_ROW_COUNT:		/* TODO 64 -> 32 bit conversion check overflow */		int_val = tds->rows_affected;		tdsdump_log(TDS_DBG_FUNC, "ct_res_info(): Number of rows is %d\n", int_val);		memcpy(buffer, &int_val, sizeof(CS_INT));		break;	default:		fprintf(stderr, "Unknown type in ct_res_info: %d\n", type);		return CS_FAIL;		break;	}	return CS_SUCCEED;}CS_RETCODEct_config(CS_CONTEXT * ctx, CS_INT action, CS_INT property, CS_VOID * buffer, CS_INT buflen, CS_INT * outlen){	CS_RETCODE ret = CS_SUCCEED;	CS_INT *buf = (CS_INT *) buffer;	tdsdump_log(TDS_DBG_FUNC, "ct_config() action = %s property = %d\n",		    CS_GET ? "CS_GET" : CS_SET ? "CS_SET" : CS_SUPPORTED ? "CS_SUPPORTED" : "CS_CLEAR", property);	switch (property) {	case CS_EXPOSE_FMTS:		switch (action) {		case CS_SUPPORTED:			*buf = CS_TRUE;			break;		case CS_SET:			if (*buf != CS_TRUE && *buf != CS_FALSE)				ret = CS_FAIL;			else				ctx->config.cs_expose_formats = *buf;			break;		case CS_GET:			if (buf)				*buf = ctx->config.cs_expose_formats;			else				ret = CS_FAIL;			break;		case CS_CLEAR:			ctx->config.cs_expose_formats = CS_FALSE;			break;		default:			ret = CS_FAIL;		}		break;	case CS_VER_STRING: {		ret = CS_FAIL;		switch (action) {			case CS_GET: {				if (buffer && buflen > 0 && outlen) {					const TDS_COMPILETIME_SETTINGS *settings= tds_get_compiletime_settings();					*outlen= snprintf((char*)buffer, buflen, "%s (%s, default tds version=%s)",						settings->freetds_version,						(settings->threadsafe ? "threadsafe" : "non-threadsafe"),						settings->tdsver					);					((char*)buffer)[buflen - 1]= 0;					if (*outlen < 0)						*outlen = strlen((char*) buffer);					ret = CS_SUCCEED;				}				break;				default:					ret = CS_FAIL;					break;				}			}		}		break;	case CS_VERSION:		ret = CS_FAIL;		switch (action) {			case CS_GET: {				if (buffer && buflen > 0 && outlen) {					const TDS_COMPILETIME_SETTINGS *settings= tds_get_compiletime_settings();					*outlen= snprintf(buffer, buflen, "%s", settings->freetds_version);					((char*)buffer)[buflen - 1]= 0;					if (*outlen < 0)						*outlen = strlen((char*) buffer);					ret = CS_SUCCEED;				}				break;			default:				ret = CS_FAIL;				break;			}		}		break;	default:		ret = CS_SUCCEED;		break;	}	return ret;}CS_RETCODEct_cmd_props(CS_COMMAND * cmd, CS_INT action, CS_INT property, CS_VOID * buffer, CS_INT buflen, CS_INT * outlen){	TDSSOCKET *tds;	TDSCURSOR *cursor;	int maxcp;	if (!cmd->con || !cmd->con->tds_socket)		return CS_FAIL;	tds = cmd->con->tds_socket;	tdsdump_log(TDS_DBG_FUNC, "ct_cmd_props() action = %s property = %d\n", CS_GET ? "CS_GET" : "CS_SET", property);	if (action == CS_SET) {		switch (property) {		case CS_USERDATA:			free(cmd->userdata);			cmd->userdata = (void *) malloc(buflen + 1);			tdsdump_log(TDS_DBG_INFO2, "setting userdata orig %p new %p\n", buffer, cmd->userdata);			cmd->userdata_len = buflen;			memcpy(cmd->userdata, buffer, buflen);			break;		default:			break;		}	}	if (action == CS_GET) {		switch (property) {		case CS_PARENT_HANDLE:			*(CS_CONNECTION **) buffer = cmd->con;			break;		case CS_C

⌨️ 快捷键说明

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