ufsearch.c

来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 1,325 行 · 第 1/3 页

C
1,325
字号
		  tmp_ex_filt = *exfilt_ptr;		  exfilt_ptr = &tmp_ex_filt->flt_next;		}	      	      if (make_filter_items(curr_val_list->type,				    curr_val->string,				    exfilt_ptr,				    apfilt_ptr) != QERR_ok)		{		  filter_free(exact_filter);		  filter_free(approx_filter);		  		  if (get_attrs != NULLATTR)		    as_free(get_attrs);		  return QERR_bad_value_syntax;		}	      	      (void) strcat(valbuf, ", ");	      (void) strcat(valbuf, curr_val->string);	    }	  	  get_attrs = as_merge(get_attrs,			       as_comp_new(curr_val_list->type,					   NULLAV,					   NULLACL_INFO));	}    }  else    {      if (make_filter_items(search_vals->type,			    search_vals->values->string,			    &exact_filter,			    &approx_filter) != QERR_ok)	{	  filter_free(exact_filter);	  filter_free(approx_filter);	  	  if (get_attrs != NULLATTR) as_free(get_attrs);	  return QERR_bad_value_syntax;	}            (void) strcat(valbuf, ", ");      (void) strcat(valbuf, search_vals->values->string);            get_attrs = as_merge(get_attrs,			   as_comp_new(search_vals->type,				       NULLAV,				       NULLACL_INFO));    }    if (ufsrec->trying_target_search == TRUE && level_count >= 2)    search_arg.sra_subset = SRA_WHOLESUBTREE;  else    search_arg.sra_subset = SRA_ONELEVEL;      /* First invoke exact match, then invoke approx match. */  /* Record task invocation. */  /* Record task invocation for this particular request. */  for (count = 0;       ufsrec->exact_task_ids[count] != NO_TASK && count < MaxUfsearchTasks;       count++)    ;  if (count == MaxUfsearchTasks)    {      filter_free(exact_filter);      filter_free(approx_filter);      if (get_attrs != NULLATTR)	as_free(get_attrs);      return QERR_internal_limit_reached;    }    if (_task_invoked(SEARCH_TASK, baseobject, ufsrec->request_id, &task_id)      != QERR_ok)    {      filter_free(exact_filter);      filter_free(approx_filter);            if (get_attrs != NULLATTR)	as_free(get_attrs);      return QERR_internal_limit_reached;    }    /* Invoke search using exact match. */  search_arg.sra_filter = exact_filter;  search_arg.sra_eis.eis_select = get_attrs;  if (DapSearch(dsap_ad, task_id, &search_arg, &di, ROS_ASYNC) == NOTOK)    {      filter_free(exact_filter);      filter_free(approx_filter);            _task_complete(task_id);      if (get_attrs != NULLATTR)	as_free(get_attrs);      return QERR_request_failed;    }  else    {      ufsrec->exact_task_count++;      ufsrec->exact_task_ids[count] = task_id;      ufsrec->tasks_sent++;    }  #ifndef NO_STATS  LLOG (log_stat, LLOG_NOTICE,        ("EXACT MATCH +%s, task %d, extent %d%s",         baseobject, task_id, search_arg.sra_subset, valbuf));#endif  if (count == MaxUfsearchTasks)    {      filter_free(exact_filter);      filter_free(approx_filter);            if (get_attrs != NULLATTR)	as_free(get_attrs);      return QERR_internal_limit_reached;    }    /* Invoke approx match. */  /* Record task invocation. */  /* Record task invocation for this particular request. */  for (count = 0;       ufsrec->approx_task_ids[count] != NO_TASK && count < MaxUfsearchTasks;       count++)    ;  if (count == MaxUfsearchTasks)    {      filter_free(exact_filter);      filter_free(approx_filter);            if (get_attrs != NULLATTR)	as_free(get_attrs);      return QERR_internal_limit_reached;    }    if (_task_invoked(SEARCH_TASK, baseobject, ufsrec->request_id, &task_id)      != QERR_ok)    {      filter_free(exact_filter);      filter_free(approx_filter);            if (get_attrs != NULLATTR)	as_free(get_attrs);      return QERR_internal_limit_reached;    }    search_arg.sra_filter = approx_filter;  if (DapSearch(dsap_ad, task_id, &search_arg, &di, ROS_ASYNC) == NOTOK)    {      filter_free(exact_filter);      filter_free(approx_filter);            _task_complete(task_id);      if (get_attrs != NULLATTR) as_free(get_attrs);      return QERR_request_failed;    }  else    {      ufsrec->approx_task_count++;      ufsrec->approx_task_ids[count] = task_id;      ufsrec->tasks_sent++;    }#ifndef NO_STATS  LLOG (log_stat, LLOG_NOTICE,        ("APPROX MATCH +%s, task %d, extent %d, vals%s",         baseobject, task_id, search_arg.sra_subset, valbuf));#endif  	  if (get_attrs != NULLATTR)    as_free(get_attrs);  filter_free(exact_filter);  filter_free(approx_filter);  return QERR_ok;} /* do_directory_search *//* * - process_ufs_ds_result() - * * */request_state process_ufs_ds_result(request, task_id, ds_result)     requestRec request;     int task_id;     struct DSResult *ds_result;{  DsTask task_rec;  ufsearchRec ufsrec = request->UFSEARCH_REC;  int *ufs_task_array;  QBool is_exact_match_result;  QCardinal aindex, hit_count;  struct ds_search_result *search_result;  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_result = FALSE;    }  else    is_exact_match_result = TRUE;  /* If not an approx search, then something's wrong! */  if (aindex >= MaxUfsearchTasks)    {      _task_complete(task_id);      return RQ_processing;    }    /* Now get the search results. */  search_result = &ds_result->res_sr;  correlate_search_results(search_result);  search_result->srr_next = NULLSRR;  hit_count = 0;  if (search_result->CSR_entries != NULLENTRYINFO)    {      EntryInfo *entry_ptr;      register stringCell curr_attr;      attrValList got_attrs = NULLAVList, curr_av;      searchPair search_vals, curr_val_list;      stringCell curr_val;      char *curr_name;      void get_read_attrs();      QBool good_match;      search_vals = ufsrec->trying_target_search == TRUE?	ufsrec->target_data:	ufsrec->search_data;            /* Decode and add found entry names */      for (entry_ptr = search_result->CSR_entries;	   entry_ptr != NULLENTRYINFO;	   entry_ptr = entry_ptr->ent_next)	{	  curr_name = qy_dn2str(entry_ptr->ent_dn);	  good_match = FALSE;	  	  get_read_attrs(entry_ptr->ent_attr, &got_attrs, READOUT);	  	  if (!is_exact_match_result)	    {	      if (got_attrs != NULLAVList)		for (curr_av = got_attrs, good_match = FALSE;		     curr_av != NULLAVList && good_match == FALSE;		     curr_av = curr_av->next)		  for (curr_attr = curr_av->val_list;		       curr_attr != NULLStrCell && good_match == FALSE;		       curr_attr = curr_attr->next)		    for (curr_val_list = search_vals;			 curr_val_list != NULLSearchPair &&			 good_match == FALSE;			 curr_val_list = curr_val_list->next)		      for (curr_val = curr_val_list->values;			   curr_val != NULLStrCell;			   curr_val = curr_val->next)			if (is_good_match(curr_val->string, curr_attr->string))			  good_match = TRUE;	    }	  else	    good_match = TRUE;      	  /* It is a good_match. If it's objectClass can be found in the	     `ditmodel' or if it is a match against target data kep it */	  if (good_match == TRUE)	    {	      AttributeType val_type, oclass_type, target_type;	      objectclass *target_class, *val_class;	      ditRelation dit_objects;	      extern ditRelation ditmodel;	      objectclass *name2oc();	      	      oclass_type = AttrT_new("2.5.4.0");	      	      for (curr_av = got_attrs;		   curr_av != NULLAVList &&		   AttrT_new(curr_av->attr_name->string) != oclass_type;		   curr_av = curr_av->next)		;	      	      if (ufsrec->trying_target_search == FALSE)		{		  QBool is_dit_type = FALSE;		  		  if (AttrT_new(curr_av->attr_name->string) == oclass_type)		    {		      char *start, *end, save;		      		      for (curr_val = curr_av->val_list;			   curr_val != NULLStrCell && is_dit_type == FALSE;			   curr_val = curr_val->next)			{			  end = curr_val->string;			  			  while (*end != '\0' &&				 *end != '\n' &&				 is_dit_type == FALSE)			    {			      start = end;			      			      while (isspace(*start))				start++;			      end = start;			      			      while (!isspace(*end))				end++;			      save = *end;			      			      *end = '\0';			      			      val_class = name2oc(start);			      val_type = AttrT_new(val_class->oc_ot.ot_stroid);			      for (dit_objects = ditmodel;				   dit_objects != NULLDitRelation &&				   is_dit_type == FALSE;				   dit_objects = dit_objects->next)				if (val_type == dit_objects->parent_type ||				    (dit_objects->parent_type != NULLAttrT &&				     qy_in_hierarchy				     (name2oc(dit_objects->parent_type->oa_ot.					      ot_stroid),				      val_class)))				  {				    /* In case it's a subclass of				     * the dit type				     */				    val_type = dit_objects->parent_type;				    				    is_dit_type = TRUE;				  }			      			      *end = save;			      while (is_dit_type == FALSE &&				     *end != '\0' &&				     *end != '\n' &&				     !isalnum(*end))				end++;			    }			}		    }		  		  if (is_dit_type == TRUE)		    (void) dn_list_add(curr_name,				       &ufsrec->to_follow, val_type);		}	      else		{		  QBool is_target_type = FALSE;		  target_type = ufsrec->target_data->type;		  target_class = name2oc(target_type->oa_ot.ot_name);		  		  if (AttrT_new(curr_av->attr_name->string) == oclass_type)		    {		      char *start, *end, save;		      		      for (curr_val = curr_av->val_list;			   curr_val != NULLStrCell && is_target_type == FALSE;			   curr_val = curr_val->next)			{			  end = curr_val->string;			  			  while (*end != '\0' &&				 *end != '\n' &&				 is_target_type == FALSE)			    {			      start = end;			      			      while (isspace(*start))				start++;			      end = start;			      			      while (!isspace(*end))				end++;			      save = *end;			      			      *end = '\0';			      val_class = name2oc(start);			      if (val_class == target_class ||				  qy_in_hierarchy(target_class, val_class))				is_target_type = TRUE;			      			      *end = save;			      			      while (is_target_type == FALSE &&				     *end != '\0' &&				     *end != '\n' &&				     !isalnum(*end))				end++;			    }			}		    }		  		  if (is_target_type)		    (void) dn_list_add(curr_name,				       &ufsrec->to_follow, NULLAttrT);		}	    }	  	  if (got_attrs != NULLAVList)	    {	      free_string_seq(&(got_attrs->attr_name));	      free_string_seq(&(got_attrs->val_list));	      (void) free((char *) got_attrs);

⌨️ 快捷键说明

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