diff options
Diffstat (limited to 'lib/Multi/API.pm')
-rw-r--r-- | lib/Multi/API.pm | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/lib/Multi/API.pm b/lib/Multi/API.pm index be1191c6..8d146d32 100644 --- a/lib/Multi/API.pm +++ b/lib/Multi/API.pm @@ -14,6 +14,7 @@ use POE::Filter::VNDBAPI 'encode_filters'; use Digest::SHA 'sha256_hex'; use Encode 'encode_utf8'; use Time::HiRes 'time'; # important for throttling +use VNDBUtil 'normalize_query'; use JSON::XS; @@ -134,6 +135,14 @@ sub filtertosql { # no further processing required for type=undef return $sql if !defined $type; + # split a string into an array of strings + if($type eq 'str' && $o{split}) { + $value = [ $o{split}->($value) ]; + # assume that this match failed if the function doesn't return anything useful + return 'false' if !@$value || grep(!defined($_) || ref($_), @$value); + $type = 'stra'; + } + # pre-process the argument(s) my @values = ref($value) eq 'ARRAY' ? @$value : $value; for my $v (!$o{process} ? () : @values) { @@ -349,7 +358,7 @@ sub client_input { } # unknown command - return cerr $c, 'parse', "Unkown command '$cmd'" if $cmd ne 'get'; + return cerr $c, 'parse', "Unknown command '$cmd'" if $cmd ne 'get'; } @@ -366,7 +375,7 @@ sub login { # note that 'true' and 'false' are also refs ref $arg->{$_} && return cerr $c, badarg => "Field '$_' must be a scalar", field => $_; } - return cerr $c, badarg => 'Unkonwn protocol version', field => 'protocol' if $arg->{protocol} ne '1'; + return cerr $c, badarg => 'Unknown protocol version', field => 'protocol' if $arg->{protocol} ne '1'; return cerr $c, badarg => 'Invalid client name', field => 'client' if $arg->{client} !~ /^[a-zA-Z0-9 _-]{3,50}$/; return cerr $c, badarg => 'Invalid client version', field => 'clientver' if $arg->{clientver} !~ /^\d+(\.\d+)?$/; return cerr $c, sesslimit => "Too many open sessions for user '$arg->{username}'", max_allowed => $_[HEAP]{sess_per_user} @@ -419,12 +428,12 @@ sub get_results { sub get_vn { my $get = $_[ARG0]; - return cerr $get->{c}, getinfo => "Unkown info flag '$_'", flag => $_ + return cerr $get->{c}, getinfo => "Unknown info flag '$_'", flag => $_ for (grep !/^(basic|details|anime|relations)$/, @{$get->{info}}); my $select = 'v.id, v.latest'; $select .= ', vr.title, vr.original, v.c_released, v.c_languages::text[], v.c_platforms' if grep /basic/, @{$get->{info}}; - $select .= ', vr.alias AS aliases, vr.length, vr.desc AS description, vr.l_wp, vr.l_encubed, vr.l_renai' if grep /details/, @{$get->{info}}; + $select .= ', vr.image, vr.alias AS aliases, vr.length, vr.desc AS description, vr.l_wp, vr.l_encubed, vr.l_renai' if grep /details/, @{$get->{info}}; my @placeholders; my $where = encode_filters $get->{filters}, \&filtertosql, $get->{c}, \@placeholders, [ @@ -444,17 +453,15 @@ sub get_vn { ], [ 'platforms', [ undef, "v.c_platforms :op: ''", {qw|= = != <>|} ], [ str => 'v.c_platforms :op: :value:', {'=' => 'LIKE', '!=' => 'NOT LIKE'}, process => \'like' ], - [ stra => '(:value:)', {'=', 1}, join => ' OR ', serialize => 'v.c_platforms LIKE :value:', \'like' ], - [ stra => '(:value:)', {'!=',1}, join => ' AND ', serialize => 'v.c_platforms NOT LIKE :value:', \'like' ], + [ stra => '(:value:)', {'=', 1}, join => ' OR ', serialize => 'v.c_platforms LIKE :value:', process => \'like' ], + [ stra => '(:value:)', {'!=',1}, join => ' AND ', serialize => 'v.c_platforms NOT LIKE :value:', process => \'like' ], ], [ 'languages', [ undef, "v.c_languages :op: '{}'", {qw|= = != <>|} ], [ str => ':op: (v.c_languages && ARRAY[:value:]::language[])', {'=' => '', '!=' => 'NOT'} ], [ stra => ':op: (v.c_languages && ARRAY[:value:]::language[])', {'=' => '', '!=' => 'NOT'}, join => ',' ], ], [ 'search', - [ str => '(vr.title ILIKE :value: OR vr.alias ILIKE :value: OR v.id IN( - SELECT rv.vid FROM releases r JOIN releases_rev rr ON rr.id = r.latest JOIN releases_vn rv ON rv.rid = rr.id - WHERE rr.title ILIKE :value: OR rr.original ILIKE :value: - ))', {'~', 1}, process => \'like' ], + [ str => '(:value:)', {'=',1}, split => \&normalize_query, + join => ' AND ', serialize => 'v.c_search LIKE :value:', process => \'like' ], ], ]; my $last = sqllast $get, 'id', { @@ -496,6 +503,7 @@ sub get_vn_res { encubed => delete($_->{l_encubed})||undef, renai => delete($_->{l_renai}) ||undef }; + $_->{image} = $_->{image} ? sprintf '%s/cv/%02d/%d.jpg', $VNDB::S{url_static}, $_->{image}%100, $_->{image} : undef; } } $get->{more} = pop(@$res)&&1 if @$res > $_[HEAP]{results}; @@ -552,7 +560,7 @@ sub get_vn_res { sub get_release { my $get = $_[ARG0]; - return cerr $get->{c}, getinfo => "Unkown info flag '$_'", flag => $_ for (grep !/^(basic|details|vn|producers)$/, @{$get->{info}}); + return cerr $get->{c}, getinfo => "Unknown info flag '$_'", flag => $_ for (grep !/^(basic|details|vn|producers)$/, @{$get->{info}}); my $select = 'r.id, r.latest'; $select .= ', rr.title, rr.original, rr.released, rr.type, rr.patch, rr.freeware, rr.doujin' if grep /basic/, @{$get->{info}}; @@ -715,7 +723,7 @@ sub get_release_res { sub get_producer { my $get = $_[ARG0]; - return cerr $get->{c}, getinfo => "Unkown info flag '$_'", flag => $_ + return cerr $get->{c}, getinfo => "Unknown info flag '$_'", flag => $_ for (grep !/^(basic|details|relations)$/, @{$get->{info}}); my $select = 'p.id, p.latest'; @@ -861,6 +869,8 @@ Filter definitions: 'bool' sql string: The relevant SQL string, with :op: and :value: subsistutions. :value: is not available for type=undef + split: (only when the type is str) + sub, splits the string into an array and further processes it as if it was of type 'stra' join: (only used when type is an array) scalar, join string used when joining multiple values. serialize: (serializes the values before join()'ing, only for arrays) |