summaryrefslogtreecommitdiff
path: root/lib/Multi/API.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Multi/API.pm')
-rw-r--r--lib/Multi/API.pm34
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)