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 + -
显示快捷键?