sub _AddSQL { my ($self, $sql, @bindvars) = @_; push @{$self->{'where'}}, $sql; push @{$self->{'bind'}}, @bindvars; } ... sub _SendSearch { my $self = shift; my $dp = $self->dataprovider(); my $db = $dp->GetDatabase() or return $self->_ThrowError('500 Database unavailable'); my $where = 'AND ('. join ( ') and (', @{$self->{'where'}}). ') '; ... my $sql = $dp->sql_prefix() . $where . $dp->sql_suffix(); $sth = $db->prepare( $sql ) or return $self->_ThrowError ( '500 Cannot prepare search', debug => $db->errstr ); $sth->execute( @{$self->{'bind'}} ) or return $self->_ThrowError ( '500 Cannot execute search', debug => $db->errstr ); my %fields; $sth->bind_columns( \(@fields{ @{ $sth->{'NAME_lc'} } } ) ); my @records = (); while ( $sth->fetch() ) { push @records, $self->_ProcessRecord( \%fields ); } return $self->dataprovider()->_PackageResults ( $numFound, \@records, debug => $where ); } #### sub _ProcessParam_time { my ($self, $time) = @_; $self->_AddSQL( 's.date_obs BETWEEN ? AND ?', $self->format_date( $time->{'start'} ), $self->format_date( $time->{'end'},1 ), ); return; } ... sub _ProcessParam_nickname { my ($self, $nicknames) = @_; if (!ref($nicknames)) { $nicknames = [$nicknames] } # deal with scalar values (should be an array) my %nicks = map { $_ => undef } @$nicknames; if ( %nicks ) { my %obsdirs = map { $_ => 1 } qw( FG FGSIQUV SP4D FGNG FGDG FGIV FGFOCUS FGSIV100 FGSIV200 FGSIV CL FGIQUV ); my @obs = grep { $obsdirs{$_} } @$nicknames; if ( @obs ) { $self->_AddSQL( 'obsdir IN ('.join(',',('?')x@obs).')', @obs ); delete @nicks{@obs}; } # everything else, we try to match against 'wave'. $self->_AddSQL( '('.join(' OR ', ('wave LIKE ?') x (keys %nicks)).')', map { "%$_%" } ( keys %nicks ) ); } return; } ... sub _ProcessParam_wave { my ($self, $wave) = @_; if (defined($wave->{'wavetype'})) { # return $self->_ProcessParam_wave_type( $wave->{'wavetype'} ); $self->_ProcessParam_wave_type( $wave->{'wavetype'} ); } # force the wave to Angstrom $wave = $self->_WaveConversion($wave) unless $wave->{'waveunit'} eq 'Angstrom'; if ($wave->{'waveunit'} ne 'Angstrom') { # conversion to Angstrom failed for some reason return $self->_PackageResults ( undef, [], debug => 'unknown waveunit' ); } if (defined($wave->{'wavemin'})) { $self->_AddSQL( 'l.wavemax >= ?', $wave->{'wavemin'}, ); } if (defined($wave->{'wavemax'})) { $self->_AddSQL( 'l.wavemin <= ?', $wave->{'wavemax'}, ); } return; }