From: Vlad S. <ser...@us...> - 2005-05-26 04:09:44
|
Update of /cvsroot/naviserver/modules/nsfreetds In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18316 Modified Files: nsfreetds.c Log Message: Updated to FreeTDS 0.64+ and fixed error handling Index: nsfreetds.c =================================================================== RCS file: /cvsroot/naviserver/modules/nsfreetds/nsfreetds.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** nsfreetds.c 25 May 2005 22:13:41 -0000 1.2 --- nsfreetds.c 26 May 2005 04:09:35 -0000 1.3 *************** *** 2,6 **** * FreeTDS internal driver for NaviServer 4.x * ! * Requires FreeTDS version 0.63+ * * Vlad Seryakov vl...@cr... --- 2,6 ---- * FreeTDS internal driver for NaviServer 4.x * ! * Requires FreeTDS version 0.64+ * * Vlad Seryakov vl...@cr... *************** *** 49,54 **** static int Db_SpStart(Ns_DbHandle *handle,char *procname); static int Db_SpExec(Ns_DbHandle *handle); ! static int Db_Msg_Handler(TDSCONTEXT *,TDSSOCKET *,TDSMESSAGE *); ! static int Db_Err_Handler(TDSCONTEXT *,TDSSOCKET *tds,TDSMESSAGE *); static Ns_DbProc freetdsProcs[] = { --- 49,54 ---- static int Db_SpStart(Ns_DbHandle *handle,char *procname); static int Db_SpExec(Ns_DbHandle *handle); ! static int Db_Msg_Handler(const TDSCONTEXT *,TDSSOCKET *,TDSMESSAGE *); ! static int Db_Err_Handler(const TDSCONTEXT *,TDSSOCKET *tds,TDSMESSAGE *); static Ns_DbProc freetdsProcs[] = { *************** *** 115,119 **** login = tds_alloc_login(); ! context = tds_alloc_context(); tds = tds_alloc_socket(context,512); --- 115,119 ---- login = tds_alloc_login(); ! context = tds_alloc_context(0); tds = tds_alloc_socket(context,512); *************** *** 173,180 **** Db_Exec(Ns_DbHandle *handle, char *sql) { ! int rc, done = 0; TDS_INT resulttype; ! Db_Flush(handle); if(tds_submit_query(GET_TDS(handle),sql) != TDS_SUCCEED) { --- 173,180 ---- Db_Exec(Ns_DbHandle *handle, char *sql) { ! int status = TDS_SUCCEED, rc = NS_DML, done = 0; TDS_INT resulttype; ! Db_Cancel(handle); if(tds_submit_query(GET_TDS(handle),sql) != TDS_SUCCEED) { *************** *** 182,223 **** return NS_ERROR; } ! handle->statement = NULL; ! handle->fetchingRows = 0; ! ! while(1) { ! rc = tds_process_result_tokens(GET_TDS(handle),&resulttype,&done); ! switch(rc) { ! case TDS_SUCCEED: ! if(done == TDS_DONE_ERROR || done == TDS_DONE_SRVERROR) { ! return NS_ERROR; ! } ! switch(resulttype) { ! case TDS_NO_MORE_RESULTS: ! return NS_DML; ! case TDS_DONE_RESULT: ! case TDS_DONEPROC_RESULT: ! case TDS_DONEINPROC_RESULT: ! case TDS_ROWFMT_RESULT: ! case TDS_ROW_RESULT: ! case TDS_COMPUTE_RESULT: ! default: ! if((handle->statement = (void *)GET_TDS(handle)->res_info)) { ! handle->fetchingRows = 1; ! return NS_ROWS; ! } ! break; ! } ! break; ! case TDS_NO_MORE_RESULTS: ! if(done == TDS_DONE_ERROR || done == TDS_DONE_SRVERROR) { ! return NS_ERROR; ! } ! return NS_DML; ! case TDS_FAIL: ! case TDS_ERROR: ! return NS_ERROR; } } ! return NS_DML; } --- 182,210 ---- return NS_ERROR; } ! while(status == TDS_SUCCEED) { ! status = tds_process_tokens(GET_TDS(handle),&resulttype,&done,TDS_TOKEN_RESULTS); ! switch(resulttype) { ! case TDS_DONE_RESULT: ! case TDS_DONEPROC_RESULT: ! case TDS_DONEINPROC_RESULT: ! status = done & TDS_DONE_ERROR ? TDS_FAIL : TDS_NO_MORE_RESULTS; ! break; ! case TDS_ROW_RESULT: ! case TDS_COMPUTE_RESULT: ! handle->statement = (void *)GET_TDS(handle)->res_info; ! if(rc != NS_ERROR && handle->statement) { ! handle->fetchingRows = 1; ! rc = NS_ROWS; ! status = TDS_NO_MORE_RESULTS; ! } ! break; } } ! if((status != TDS_SUCCEED && status != TDS_NO_MORE_RESULTS) || handle->dsExceptionMsg.length) { ! handle->statement = NULL; ! handle->fetchingRows = 1; ! return NS_ERROR; ! } ! return rc; } *************** *** 229,244 **** CONV_RESULT dres; unsigned char *src; ! TDS_INT srclen,rowtype,computeid; ! if(!handle->fetchingRows) { ! Ns_Log(Error,"Db_GetRow(%s): No rows waiting to fetch.",handle->datasource); ! Ns_DbSetException(handle,"NSDB","no rows waiting to fetch."); return NS_ERROR; } ! ! if((rc = tds_process_row_tokens(GET_TDS(handle),&rowtype,&computeid)) != TDS_SUCCEED || ! GET_TDS(handle)->res_info == 0 || ! GET_TDS(handle)->res_info->num_cols == 0 || ! handle->row->size == 0) { handle->statement = NULL; handle->fetchingRows = 0; --- 216,235 ---- CONV_RESULT dres; unsigned char *src; ! TDS_INT srclen,resulttype,computeid; ! if(!handle->fetchingRows || !handle->row->size) { ! Ns_DbSetException(handle,"NSDB","no rows waiting to fetch"); return NS_ERROR; } ! rc = tds_process_tokens(GET_TDS(handle),&resulttype,&computeid,TDS_STOPAT_ROWFMT|TDS_RETURN_DONE|TDS_RETURN_ROW|TDS_RETURN_COMPUTE); ! if(rc != TDS_SUCCEED && rc != TDS_NO_MORE_RESULTS) { ! Ns_Log(Error,"Db_GetRow(%s): tds_process_row_tokens: %d",handle->datasource,rc); ! Db_Cancel(handle); ! return NS_ERROR; ! } ! if(rc == TDS_NO_MORE_RESULTS || ! !GET_TDS(handle)->res_info || ! !GET_TDS(handle)->current_results || ! (resulttype != TDS_ROW_RESULT && resulttype != TDS_COMPUTE_RESULT)) { handle->statement = NULL; handle->fetchingRows = 0; *************** *** 246,254 **** } for(i = 0; i < GET_TDS(handle)->res_info->num_cols; i++) { ! if(tds_get_null(GET_TDS(handle)->res_info->current_row,i)) { Ns_SetPutValue(row,i,""); continue; } - col = GET_TDS(handle)->res_info->columns[i]; ctype = tds_get_conversion_type(col->column_type,col->column_size); src = &(GET_TDS(handle)->res_info->current_row[col->column_offset]); --- 237,245 ---- } for(i = 0; i < GET_TDS(handle)->res_info->num_cols; i++) { ! col = GET_TDS(handle)->res_info->columns[i]; ! if(col->column_cur_size < 0) { Ns_SetPutValue(row,i,""); continue; } ctype = tds_get_conversion_type(col->column_type,col->column_size); src = &(GET_TDS(handle)->res_info->current_row[col->column_offset]); *************** *** 275,278 **** --- 266,272 ---- Db_Cancel(Ns_DbHandle *handle) { + if(handle->fetchingRows) { + tds_process_simple_query(GET_TDS(handle)); + } tds_free_all_results(GET_TDS(handle)); tds_send_cancel(GET_TDS(handle)); *************** *** 310,314 **** ! int Db_Err_Handler(TDSCONTEXT *ctx,TDSSOCKET *tds,TDSMESSAGE *msg) { Ns_DbHandle *handle = (Ns_DbHandle *)tds->parent; --- 304,308 ---- ! int Db_Err_Handler(const TDSCONTEXT *ctx,TDSSOCKET *tds,TDSMESSAGE *msg) { Ns_DbHandle *handle = (Ns_DbHandle *)tds->parent; *************** *** 320,329 **** } ! int Db_Msg_Handler(TDSCONTEXT *ctx,TDSSOCKET *tds,TDSMESSAGE *msg) { Ns_DbHandle *handle = (Ns_DbHandle *)tds->parent; ! Ns_Log(Notice, "Db_Msg_Handler(%s:%d,%d): %s", ! handle->datasource,msg->msg_level,msg->msg_state,msg->message); if(msg->msg_level > 10) Ns_DbSetException(handle, "NSDB", msg->message); --- 314,324 ---- } ! int Db_Msg_Handler(const TDSCONTEXT *ctx,TDSSOCKET *tds,TDSMESSAGE *msg) { Ns_DbHandle *handle = (Ns_DbHandle *)tds->parent; ! Ns_Log(Notice, "Db_Msg_Handler(%s:%d,%d,%s): %s", ! handle->datasource,msg->msg_level,msg->msg_state, ! msg->sql_state ? msg->sql_state : "0",msg->message); if(msg->msg_level > 10) Ns_DbSetException(handle, "NSDB", msg->message); |