AnyEvent-Groonga
view release on metacpan or search on metacpan
lib/AnyEvent/Groonga.pm view on Meta::CPAN
my $groonga_command
= $self->_generate_groonga_command( $command, $args_ref );
my $cv = AnyEvent->condvar;
$self->_set_timeout( $cv, $args_ref->{timeout} ) if $args_ref->{timeout};
my $cmd_cv = run_cmd $groonga_command,
'>' => \my $stdout,
'2>' => \my $stderr;
$cmd_cv->cb(
sub {
my $json = $stdout;
my $result;
try {
my $data = JSON->new->utf8->decode($json);
$result = AnyEvent::Groonga::Result->new(
posted_command => $command,
data => $data
);
}
catch {
$result = $_;
};
$cv->send($result);
}
);
return $cv;
}
sub _post_to_local_db {
my $self = shift;
my $command = shift;
my $args_ref = shift;
# just a proxy!
return $self->_post_to_gqtp_server( $command, $args_ref );
}
sub _generate_groonga_url {
my $self = shift;
my $command = shift;
my $args_ref = shift;
my $uri = URI->new;
$uri->scheme("http");
$uri->host( $self->host );
$uri->port( $self->port );
$uri->path( "d/" . $command );
my @array;
while ( my ( $key, $value ) = each %$args_ref ) {
if ( $command eq 'load' && $key eq 'values' ) {
$value = $self->_load_filter($value);
}
elsif ( ref $value eq 'ARRAY' ) {
$value = join( ",", @$value );
}
$key = uri_escape($key);
$value = uri_escape($value);
push @array, $key . '=' . $value;
}
$uri->query( join( "&", @array ) );
return $uri->as_string;
}
sub _generate_groonga_command {
my $self = shift;
my $command = shift;
my $args_ref = shift;
my $groonga_command;
if ( $self->protocol eq 'gqtp' ) {
$groonga_command = join( " ",
$self->groonga_path, '-p', $self->port, '-c', $self->host );
}
else {
$groonga_command
= join( " ", $self->groonga_path, $self->database_path );
}
$groonga_command .= ' "' . $command . ' ';
my @array;
while ( my ( $key, $value ) = each %$args_ref ) {
if ( $command eq 'load' && $key eq 'values' ) {
$value = $self->_load_filter($value);
}
elsif (
$command eq 'select'
&& ( $key eq 'query'
|| $key eq 'filter'
|| $key eq 'sortby'
|| $key eq 'scorer' )
)
{
if ( ref $value eq 'ARRAY' ) {
$value = join( ",", @$value );
}
$value = $self->_select_filter($value);
}
elsif ( ref $value eq 'ARRAY' ) {
$value = join( ",", @$value );
}
$key = '--' . $key;
push @array, ( $key, $value );
}
$groonga_command .= join( " ", @array ) . '"';
warn($groonga_command) if $self->debug;
return $groonga_command;
}
sub _select_filter {
my $self = shift;
my $data = shift;
$data = decode( "utf8", $data ) unless utf8::is_utf8($data);
$data =~ /(^|[^\\])"|'/;
if ($1) {
( run in 0.801 second using v1.01-cache-2.11-cpan-39bf76dae61 )