DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T s

⟦089db9d27⟧ TextFile

    Length: 6239 (0x185f)
    Types: TextFile
    Names: »search.c«

Derivation

└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
    └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« 
        └─⟦d3ac74d73⟧ 
            └─⟦this⟧ »isode-5.0/quipu/dish/search.c« 

TextFile

#include "quipu/util.h"
#include "quipu/ds_search.h"
#include "quipu/list.h"
#include "quipu/entry.h"
#include "quipu/sequence.h"

extern DN       dn,
		current_dn;
extern PS       opt;
extern PS       rps;
extern Entry	current_entry;
DN		rel_dn = NULLDN;

extern LLog    *log_dua;

Filter          get_filter ();
char           *TidyString ();
char		allow_move = TRUE;

call_search (argc, argv)
int             argc;
char          **argv;
{
	struct ds_search_arg search_arg;
	struct DSError  error;
	struct ds_search_result result;
	DN              save_dn;
	extern int      sizelimit;
	extern char     flag_show;
	int             x;
	Entry		save_entry;
	char 		rel_flag = TRUE;
	char	       *save_arg = NULLCP;
	extern char     doneget;
	extern char     value_flag;
	extern char	all_flag;
	extern char	show_all_flag;
	extern char	key_flag;
	static char    *nvec[2] = {"search"};
	extern Attr_Sequence as_flag;
	int		seqno;

	value_flag = TRUE;
	all_flag = FALSE;
	if (as_flag != NULLATTR) {
		as_free (as_flag);
		as_flag = NULLATTR;
	}
	flag_show = TRUE;
	key_flag = TRUE;

	search_arg.sra_filter = NULLFILTER;
	search_arg.sra_subset = SRA_ONELEVEL;
	search_arg.sra_common.ca_servicecontrol.svc_sizelimit = sizelimit;
	
 	if ((argc = service_control (opt, argc, argv, &search_arg.sra_common)) == -1)
		return;

	allow_move = FALSE;
	if ( (argc = set_read_flags (argc,argv)) == -1) {
		allow_move = TRUE;
		return;
	}
	allow_move = TRUE;

	for (x = 1; x < argc; x++) {
		if (test_arg (argv[x], "-baseobject",1)) {
			DLOG (log_dua, LLOG_TRACE, ("We have a -baseobject flag\n"));
			search_arg.sra_subset = SRA_BASEOBJECT;
		} else if (test_arg (argv[x], "-singlelevel",2)) {
			DLOG (log_dua, LLOG_TRACE, ("We have a -singlelevel flag\n"));
			search_arg.sra_subset = SRA_ONELEVEL;
		} else if (test_arg (argv[x], "-subtree",2)) {
			DLOG (log_dua, LLOG_TRACE, ("We have a -subtree flag\n"));
			search_arg.sra_subset = SRA_WHOLESUBTREE;
		} else if (test_arg (argv[x], "-relative",3)) 
			rel_flag = TRUE;
		else if (test_arg (argv[x], "-norelative",5)) 
			rel_flag = FALSE;
		else if (test_arg (argv[x], "-filter",1)) {
			if ((search_arg.sra_filter = get_filter (argv[++x])) == NULLFILTER) {
				ps_printf (opt,"Invalid filter %s\n",argv[x]);
				Usage (argv[0]);
				return;
			}
			shuffle_up (argc--,argv,x--);
		} else if (test_arg (argv[x], "-object",1)) {
			if (move (argv[++x]) != OK) {
				ps_printf (opt,"Invalid move object %s\n",argv[x]);
				Usage (argv[0]);
				return;
			}
			shuffle_up (argc--,argv,x--);
		} else if (*argv[x] != '-') {
			if (save_arg != NULLCP) {
				ps_printf (opt,"Need flags to parse argument '%s'!\n",argv[x]);
				Usage (argv[0]);
				return;
			} else 
				save_arg = argv[x];
		} else
			continue;  /* a read type flag !!! */
			
		shuffle_up (argc--,argv,x--);
	}

	if (save_arg != NULLCP) {
		/* There is an unflagged argument */
		if (search_arg.sra_filter == NULLFILTER) {
			if ((search_arg.sra_filter = get_filter (save_arg)) == NULLFILTER) {
				ps_printf (opt,"Invalid filter %s\n",save_arg);
				Usage (argv[0]);
				return;
			}
		} else if (move (save_arg) != OK) {
			ps_printf (opt,"Invalid move object %s\n",save_arg);
			Usage (argv[0]);
			return;
		}
	}
	
	if (search_arg.sra_filter == NULLFILTER) {
		/* set default */
		search_arg.sra_filter = filter_alloc ();
		search_arg.sra_filter->flt_next = NULLFILTER;
		search_arg.sra_filter->flt_type = FILTER_AND;
		search_arg.sra_filter->FUFILT = NULLFILTER;
	}

	if (argc != 1) {
		Usage (argv[0]);
		return;
	}

	search_arg.sra_eis.eis_infotypes = value_flag;
	search_arg.sra_eis.eis_allattributes = all_flag;	
	search_arg.sra_eis.eis_select = as_flag;
	search_arg.sra_baseobject = dn;

	DLOG (log_dua, LLOG_TRACE, ("Dish:- We are about to call the ds_search\n"));

	if (rebind () != OK)
		return;

	show_all_flag = FALSE;

	if (ds_search (&search_arg, &error, &result) != DS_OK) {
		DLOG (log_dua, LLOG_TRACE, ("Dealing with The error in searching.\n"));
		ds_error (opt, &error);	/* deal with error */
	} else {
		correlate_search_results (&result);
			
		if (result.CSR_entries == NULLENTRYINFO) 
			ps_printf (opt, "Search failed to find anything.\n");
		else {
			EntryInfo      *ptr;

			save_dn = dn_cpy(current_dn);
			save_entry = current_entry;
			doneget = TRUE;
			if (rel_flag)
				rel_dn = dn_cpy(dn);

			for (ptr = result.CSR_entries; ptr != NULLENTRYINFO; ptr = ptr->ent_next) {
				as_decode (ptr->ent_attr);	/* decode it immediately
								 * so we only have to do
								 * it once. */
				dn_decode (ptr->ent_dn);
				cache_entry (ptr, all_flag, value_flag);
				seqno = add_sequence (ptr->ent_dn);
				if (seqno != 0)
					ps_printf (rps,"%-3d ",seqno);
				nvec[1] = "-compact";
				if (flag_show) {
					call_showname (2, nvec);

					if (! all_flag) {
						Attr_Sequence   eptr;

						for (eptr = search_arg.sra_eis.eis_select; eptr != NULLATTR; eptr = eptr->attr_link)
							showattribute (eptr->attr_type);
					} else {
						nvec [1] = "-noname";
						call_showentry (2, nvec);
					}
				} else
					ps_print (rps,"\n");
			}
			if (rel_dn != NULLDN) {
				dn_free (rel_dn);
				rel_dn = NULLDN;
			}
			dn_free (current_dn);
			current_dn = save_dn;
			current_entry = save_entry;
			entryinfo_free (result.CSR_entries,0);
		}

		handle_problems (rps,result.CSR_cr,result.CSR_limitproblem);
	
	}
	filter_free (search_arg.sra_filter);
}

handle_problems (aps,cr,limit)
PS aps;
ContinuationRef cr;
int limit;
{
	if (limit != LSR_NOLIMITPROBLEM)
		switch (limit) {
		case LSR_TIMELIMITEXCEEDED:
			ps_print (aps, "(Time limit exceeded)\n");
			break;
		default: /* admin and user size limit */
			ps_print (aps, "(Size limit exceeded)\n");
			break;
		}
/* always give references for now 
 *	else 
 */
	if (cr != NULLCONTINUATIONREF) {
		ContinuationRef crptr;
		ps_print (aps, "NOTE partial results only:- could not contact following DSA(s):-\n");
		for (crptr=cr; crptr != NULLCONTINUATIONREF; crptr=crptr->cr_next) {
			dn_decode (crptr->cr_accesspoints.ap_name);
			ps_print (aps,"   ");
			dn_print (aps,crptr->cr_accesspoints.ap_name,EDBOUT);
			dn_decode (crptr->cr_name);
			ps_print (aps," (holding ");
			dn_print (aps,crptr->cr_name,EDBOUT);
			ps_print (aps,")\n");
		}
	}
			
}