ufsearch.c
来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 1,325 行 · 第 1/3 页
C
1,325 行
} got_attrs = NULLAVList; hit_count++; if (curr_name != NULLCP) (void) free(curr_name); } } if (search_result->CSR_limitproblem != LSR_NOLIMITPROBLEM) { QE_error_code limitproblem; switch (search_result->CSR_limitproblem) { case LSR_TIMELIMITEXCEEDED: limitproblem = QERR_time_limit_reached; break; case LSR_SIZELIMITEXCEEDED: limitproblem = QERR_size_limit_reached; break; case LSR_ADMINSIZEEXCEEDED: limitproblem = QERR_admin_limit_reached; break; } add_error_to_request_rec(request, task_rec->baseobject, limitproblem, (struct DSError *) NULL); } #ifndef NO_STATS LLOG (log_stat, LLOG_NOTICE, ("SEARCH RESULT from +%s, task %d, hits %d", task_rec->baseobject, task_id, hit_count));#endif /* Remove record of this task. */ ufs_task_array[aindex] = NO_TASK; if (is_exact_match_result == TRUE) ufsrec->exact_task_count--; else ufsrec->approx_task_count--; _task_complete(task_id); /* Check the status of this request. */ /* First check if this stage of matching has been completed */ if (ufsrec->exact_task_count == 0 && ufsrec->approx_task_count == 0) { ufsearchResult result; /* If have made good matches for target */ if (ufsrec->trying_target_search) { result = ufsearch_res_alloc(); if (ufsrec->to_follow != NULLEntryList) { result->tasks_sent = ufsrec->tasks_sent; result->tasks_failed = ufsrec->tasks_failed; result->hits = ufsrec->to_follow; ufsrec->to_follow = NULLEntryList; result->hit_num = 0; result->errors = request->errors; request->errors = NULLError; result->search_status = UFS_Succeeded; ufsrec->result = result; return RQ_results_returned; } else /* Failed to find anything */ { if (process_ufsearch(ufsrec) == QERR_ok) return RQ_processing; else { if (ufsrec->path != NULLEntryList) { ufsrec->to_follow = ufsrec->path; ufsrec->path = ufsrec->path->next; ufsrec->to_follow->next = NULLEntryList; if (process_ufsearch(ufsrec) == QERR_ok) return RQ_processing; } result->tasks_sent = ufsrec->tasks_sent; result->tasks_failed = ufsrec->tasks_failed; result->hits = NULLEntryList; result->hit_num = 0; result->errors = request->errors; request->errors = NULLError; result->search_status = UFS_Failed; ufsrec->result = result; return RQ_results_returned; } } } else /* Results from an intermediate search */ { if (ufsrec->to_follow == NULLEntryList) { if (ufsrec->path != NULLEntryList) { ufsrec->to_follow = ufsrec->path; ufsrec->path = ufsrec->path->next; ufsrec->to_follow->next = NULLEntryList; if (process_ufsearch(ufsrec) == QERR_ok) return RQ_processing; } result = ufsearch_res_alloc(); result->tasks_sent = ufsrec->tasks_sent; result->tasks_failed = ufsrec->tasks_failed; result->hits = NULLEntryList; result->hit_num = 0; result->errors = request->errors; request->errors = NULLError; result->search_status = UFS_Failed; ufsrec->result = result; return RQ_results_returned; } if (process_ufsearch(ufsrec) != QERR_ok) return RQ_results_returned; else return RQ_processing; } } return RQ_processing;} /* process_ufs_ds_result *//* * - process_ufs_ds_error() - * * */request_state process_ufs_ds_error(request, task_id, error) requestRec request; int task_id; struct DSError *error;{ DsTask task_rec; ufsearchRec ufsrec = request->UFSEARCH_REC; int *ufs_task_array; QBool is_exact_match_error; QCardinal aindex; QE_error_code error_type; task_rec = _get_task_of_id(task_id); /* * This shouldn't happen */ if (task_rec == NULLDsTask) return RQ_processing; /* * Check if result comes from a search using exact or approx match. */ for (aindex = 0, ufs_task_array = ufsrec->exact_task_ids; ufs_task_array[aindex] != task_id && aindex < MaxUfsearchTasks; aindex++) ; /* * Not an exact search, so must have been an approx search. */ if (aindex >= MAX_TASKS_PER_REQ) { for (aindex = 0, ufs_task_array = ufsrec->approx_task_ids; ufs_task_array[aindex] != task_id && aindex < MaxUfsearchTasks; aindex++) ; if (aindex < MaxUfsearchTasks) is_exact_match_error = FALSE; } else is_exact_match_error = TRUE; /* * If not an approx search, then something's wrong! */ if (aindex >= MaxUfsearchTasks) { _task_complete(task_id); return RQ_processing; } /* * Save error and log it */ error_type = get_log_error_type(error, task_id); add_error_to_request_rec(request, task_rec->baseobject, error_type, error); ufsrec->tasks_failed++; /* * Remove invocation record for this task */ _task_complete(task_id); ufs_task_array[aindex] = NO_TASK; if (is_exact_match_error) ufsrec->exact_task_count--; else ufsrec->approx_task_count--; /* * Check if this stage of matching has been completed */ if (ufsrec->exact_task_count == 0 && ufsrec->approx_task_count == 0) { ufsearchResult result; /* * If have made good matches for target */ if (ufsrec->trying_target_search) { result = ufsearch_res_alloc(); if (ufsrec->to_follow != NULLEntryList) { result->tasks_sent = ufsrec->tasks_sent; result->tasks_failed = ufsrec->tasks_failed; result->hits = ufsrec->to_follow; ufsrec->to_follow = NULLEntryList; result->hit_num = 0; result->errors = request->errors; request->errors = NULLError; result->search_status = UFS_Succeeded; ufsrec->result = result; return RQ_results_returned; } else /* Failed to find anything */ { if (process_ufsearch(ufsrec) == QERR_ok) return RQ_processing; else { if (ufsrec->path != NULLEntryList) { ufsrec->to_follow = ufsrec->path; ufsrec->path = ufsrec->path->next; ufsrec->to_follow->next = NULLEntryList; if (process_ufsearch(ufsrec) == QERR_ok) return RQ_processing; } result->tasks_sent = ufsrec->tasks_sent; result->tasks_failed = ufsrec->tasks_failed; result->hits = NULLEntryList; result->hit_num = 0; result->errors = request->errors; request->errors = NULLError; result->search_status = UFS_Failed; ufsrec->result = result; return RQ_results_returned; } } } else /* Results from an intermediate search */ { if (ufsrec->to_follow == NULLEntryList) { if (ufsrec->path != NULLEntryList) { ufsrec->to_follow = ufsrec->path; ufsrec->path = ufsrec->path->next; ufsrec->to_follow->next = NULLEntryList; if (process_ufsearch(ufsrec) == QERR_ok) return RQ_processing; } result = ufsearch_res_alloc(); result->tasks_sent = ufsrec->tasks_sent; result->tasks_failed = ufsrec->tasks_failed; result->hits = NULLEntryList; result->hit_num = 0; result->errors = request->errors; request->errors = NULLError; result->search_status = UFS_Failed; ufsrec->result = result; return RQ_results_returned; } return process_ufsearch(ufsrec) == QERR_ok ? RQ_processing : RQ_results_returned; } } return RQ_processing;} /* process_ufs_ds_result *//* * - ufsearch_result_free() - * * */void ufsearch_result_free(result_ptr) ufsearchResult *result_ptr;{ ufsearchResult ufs_result = *result_ptr; if (ufs_result == NULLUfsearchResult) return; *result_ptr = NULLUfsearchResult; dn_list_free(&ufs_result->hits); free((char *) ufs_result);}/* * - get_ufs_results() - * Copy and return results for the identified ufn request, then delete all * records for that request. * */ufsearchResult get_ufsearch_result(id) QCardinal id;{ requestRec ufs_request = _get_request_of_id(id); ufsearchRec ufsrec; ufsearchResult result; ufsrec = ufs_request->UFSEARCH_REC; result = ufsrec->result; result->tasks_sent = ufsrec->tasks_sent; result->tasks_failed = ufsrec->tasks_failed; search_pair_list_free(&ufsrec->search_data); search_pair_list_free(&ufsrec->target_data); ufsrec->result = NULLUfsearchResult; _request_complete(id); return result;} /* get_ufn_results *//* * - ufsearch_rec_free() - * * */void ufsearch_rec_free(record) ufsearchRec record;{ if (record == NULLUfsearchRec) return; if (record->search_data != NULLSearchPair) search_pair_list_free(&record->search_data); if (record->target_data != NULLSearchPair) search_pair_list_free(&record->target_data); free((char *) record);} /* ufsearch_rec_free */void search_pair_list_free(list) searchPair *list;{ searchPair curr, next; for (curr = *list; curr != NULLSearchPair; curr = next) { next = curr->next; free_string_seq(&curr->values); free((char *) curr); } *list = NULLSearchPair;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?