pro dbsearch,type,svals,values,good, FULLSTRING = fullstring, COUNT = count ;----------------------------------------------------------- On_error,2 compile_opt idl2 svals = strupcase(svals) ; ; determine data type of values to be searched ; datatype=size(values,/type) & nv = N_elements(values) ; ; convert svals to correct data type ; nvals = type>2 if datatype NE 7 then sv = replicate(values[0],nvals) else $ sv = replicate(' ',nvals) On_ioerror, BADVAL ;Trap any type conversions sv[0]= svals[0:nvals-1] On_ioerror, NULL sv0=sv[0] & sv1=sv[1] ; ; ----------------------------------------------------------- ; STRING SEARCHES (Must use STRPOS to search for substring match) ; if datatype EQ 7 then begin values = strupcase(strtrim(values)) case type of 0: if keyword_set(FULLSTRING) then $ ;Exact string match? valid = strtrim(values,2) EQ strtrim(sv0,2) else $ valid = strpos(values,strtrim(sv0,2)) GE 0 ;substring search -1: valid = values GE sv0 ;greater than -2: valid = values LE sv1 ;less than -3: valid = (values GE sv0) and (values LE sv1) ;in range -4: valid = strtrim(values) NE '' ;non zero (i.e. not null) -5: message, $ ;Tolerance value ' Tolerance specification for strings is not valid' else: begin sv = strtrim(sv,2) sv = sv[uniq(sv,sort(sv))] ;Remove duplicates type = N_elements(sv) valid = bytarr(nv) if keyword_set(FULLSTRING) then begin values = strtrim(values,2) for ii = 0l,type-1 do valid OR= (values EQ sv[ii]) endif else begin for ii=0L,type-1 do begin ;within set of substring valid OR= (strpos(values,sv[ii]) GE 0) endfor endelse end endcase good = where(valid, count) return end ; ;--------------------------------------------------------------------- ; ALL OTHER DATA TYPES case type of 0: good = where( values EQ sv0, count ) ;value=sv0 -1: good = where( values GE sv0, count ) ;value>sv0 -2: good = where( values LE sv1, count ) ;value<sv1 -3: begin ;sv0<value<sv1 if sv1 lt sv0 then begin temp=sv0 sv0=sv1 sv1=temp endif good=where((values GE sv0) and (values LE sv1), count) end -5: begin ;sv1 is tolerance minv=sv0-abs(sv1) maxv=sv0+abs(sv1) good=where( (values GE minv) and (values LE maxv), count) end -4: good=where(values, count) ;non-zero else: begin ;set of values sv = sv[uniq(sv,sort(sv))] ;Remove duplicates type = N_elements(sv) valid = bytarr(nv) for i=0L,type-1 do begin ;loop on possible values valid OR= (values EQ sv[i]) endfor good = where(valid, count) if count EQ 0 then good = intarr(1)-1 ;Make sure good is defined !err=count end endcase return BADVAL: !ERR=-2 ;Illegal search value supplied return end