File Coverage

File:lib/OpenAPI/Handler/Action.pm
Coverage:84.2%

linestmtbrancondsubpodtimecode
1package 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
8sub 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
47sub 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
63sub 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
73sub validate_col_names {
74
7
0
60
    my ($self, $models, $cols) = @_;
75    # XXX TODO...
76}
77
781;
79