?? ct.c
字號:
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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -