| File: | lib/OpenAPI/Handler/Action.pm |
| Coverage: | 84.2% |
| line | stmt | bran | cond | sub | pod | time | code |
|---|---|---|---|---|---|---|---|
| 1 | package OpenAPI; | ||||||
| 2 | |||||||
| 3 | #use Smart::Comments; | ||||||
| 4 | 22 22 22 | 185 84 205 | use strict; | ||||
| 5 | 22 22 22 | 264 79 179 | use warnings; | ||||
| 6 | 22 22 22 | 250 76 185 | use vars qw($Dumper); | ||||
| 7 | |||||||
| 8 | sub POST_action_exec { | ||||||
| 9 | 10 | 0 | 80 | my ($self, $bits) = @_; | |||
| 10 | 10 | 64 | my $action = $bits->[1]; | ||||
| 11 | 10 | 120 | my $params = { | ||||
| 12 | $bits->[2] => $bits->[3] | ||||||
| 13 | }; | ||||||
| 14 | 10 | 70 | my $lang = $params->{lang}; | ||||
| 15 | 10 | 75 | if (!defined $lang) { | ||||
| 16 | 0 | 0 | die "The 'lang' param is required in the Select action.\n"; | ||||
| 17 | } | ||||||
| 18 | 10 | 104 | if (lc($lang) ne 'minisql') { | ||||
| 19 | 0 | 0 | die "Only the miniSQL language is supported for Select.\n"; | ||||
| 20 | } | ||||||
| 21 | 10 | 70 | my $sql = $self->{_req_data}; | ||||
| 22 | ### Action sql: $sql | ||||||
| 23 | |||||||
| 24 | 10 | 87 | _STRING($sql) or | ||||
| 25 | die "miniSQL must be an non-empty literal string: ", $Dumper->($sql), "\n"; | ||||||
| 26 | #warn "SQL 1: $sql\n"; | ||||||
| 27 | 9 | 312 | my $select = MiniSQL::Select->new; | ||||
| 28 | 9 | 235 | my $res = $select->parse( | ||||
| 29 | $sql, | ||||||
| 30 | { | ||||||
| 31 | quote => \&Q, quote_ident => \&QI, | ||||||
| 32 | limit => $self->{_limit}, offset => $self->{_offset} | ||||||
| 33 | } | ||||||
| 34 | ); | ||||||
| 35 | 8 | 96 | if (_HASH($res)) { | ||||
| 36 | 8 | 307 | my $sql = $res->{sql}; | ||||
| 37 | 8 | 68 | $sql = $self->append_limit_offset($sql, $res); | ||||
| 38 | 8 8 | 35 72 | my @models = @{ $res->{models} }; | ||||
| 39 | 8 8 | 32 67 | my @cols = @{ $res->{columns} }; | ||||
| 40 | 8 | 76 | $self->validate_model_names(\@models); | ||||
| 41 | 7 | 199 | $self->validate_col_names(\@models, \@cols); | ||||
| 42 | #warn "SQL 2: $sql\n"; | ||||||
| 43 | 7 | 105 | $self->select("$sql", {use_hash => 1, read_only => 1}); | ||||
| 44 | } | ||||||
| 45 | } | ||||||
| 46 | |||||||
| 47 | sub append_limit_offset { | ||||||
| 48 | 8 | 0 | 59 | my ($self, $sql, $res) = @_; | |||
| 49 | #my $order_by $cgi->url | ||||||
| 50 | 8 | 50 | my $limit = $res->{limit}; | ||||
| 51 | 8 | 57 | if (defined $limit) { | ||||
| 52 | 5 | 79 | $sql =~ s/;\s*$/ limit $limit/s or | ||||
| 53 | $sql .= " limit $limit"; | ||||||
| 54 | } | ||||||
| 55 | 8 | 51 | my $offset = $res->{offset}; | ||||
| 56 | 8 | 52 | if (defined $offset) { | ||||
| 57 | 5 | 69 | $sql =~ s/;\s*$/ offset $offset;/s or | ||||
| 58 | $sql .= " offset $offset"; | ||||||
| 59 | } | ||||||
| 60 | 8 | 78 | return "$sql;\n"; | ||||
| 61 | } | ||||||
| 62 | |||||||
| 63 | sub validate_model_names { | ||||||
| 64 | 8 | 0 | 51 | my ($self, $models) = @_; | |||
| 65 | 8 | 59 | for my $model (@$models) { | ||||
| 66 | 6 | 46 | _IDENT($model) or die "Bad model name: \"$model\"\n"; | ||||
| 67 | 6 | 64 | if (!$self->has_model($model)) { | ||||
| 68 | 1 | 4 | die "Model \"$model\" not found.\n"; | ||||
| 69 | } | ||||||
| 70 | } | ||||||
| 71 | } | ||||||
| 72 | |||||||
| 73 | sub validate_col_names { | ||||||
| 74 | 7 | 0 | 60 | my ($self, $models, $cols) = @_; | |||
| 75 | # XXX TODO... | ||||||
| 76 | } | ||||||
| 77 | |||||||
| 78 | 1; | ||||||
| 79 | |||||||