File Coverage

blib/lib/Mojolicious/Plugin/Marky/DbTableSet.pm
Criterion Covered Total %
statement 70 278 25.1
branch 1 34 2.9
condition 1 9 11.1
subroutine 16 38 42.1
pod 1 1 100.0
total 89 360 24.7


line stmt bran cond sub pod time code
1             package Mojolicious::Plugin::Marky::DbTableSet;
2             $Mojolicious::Plugin::Marky::DbTableSet::VERSION = '0.034';
3             #ABSTRACT: Mojolicious::Plugin::Marky::DbTableSet - querying one database table
4              
5 1     1   561 use Mojo::Base 'Mojolicious::Plugin';
  1         5  
  1         8  
6 1     1   496 use Marky::DbTable;
  1         5  
  1         57  
7 1     1   476 use Marky::Bookmarker;
  1         4  
  1         36  
8 1     1   9 use common::sense;
  1         2  
  1         9  
9 1     1   47 use DBI;
  1         2  
  1         36  
10 1     1   5 use Path::Tiny;
  1         3  
  1         46  
11 1     1   6 use Search::Query;
  1         2  
  1         21  
12 1     1   4 use Sort::Naturally;
  1         2  
  1         47  
13 1     1   9 use Text::NeatTemplate;
  1         3  
  1         31  
14 1     1   10 use YAML::Any;
  1         4  
  1         10  
15 1     1   532 use POSIX qw(ceil);
  1         2  
  1         8  
16 1     1   67 use HTML::TagCloud;
  1         1  
  1         20  
17 1     1   4 use Mojo::URL;
  1         2  
  1         12  
18              
19              
20             sub register {
21 1     1 1 63 my ( $self, $app, $conf ) = @_;
22              
23 1         5 $self->_init($app,$conf);
24              
25             $app->helper( 'marky_do_query' => sub {
26 0     0   0 my $c = shift;
27 0         0 my %args = @_;
28              
29 0         0 return $self->_do_query($c);
30 1         11 } );
31              
32             $app->helper( 'marky_table_list' => sub {
33 0     0   0 my $c = shift;
34 0         0 my %args = @_;
35              
36 0         0 return $self->_make_table_list($c);
37 1         48 } );
38              
39             $app->helper( 'marky_table_array' => sub {
40 1     1   160 my $c = shift;
41 1         2 my %args = @_;
42              
43 1         3 my @tables = sort keys %{$self->{dbtables}};
  1         5  
44 1         7 return \@tables;
45 1         17 } );
46             $app->helper( 'marky_total_records' => sub {
47 0     0   0 my $c = shift;
48 0         0 my %args = @_;
49              
50 0         0 return $self->_total_records($c,%args);
51 1         25 } );
52              
53             $app->helper( 'marky_db_related_list' => sub {
54 0     0   0 my $c = shift;
55 0         0 my %args = @_;
56              
57 0         0 return $self->_make_db_related_list($c,%args);
58 1         27 } );
59              
60             $app->helper( 'marky_taglist' => sub {
61 0     0   0 my $c = shift;
62 0         0 my %args = @_;
63              
64 0         0 return $self->_taglist($c,%args);
65 1         37 } );
66              
67             $app->helper( 'marky_tagcloud' => sub {
68 0     0   0 my $c = shift;
69 0         0 my %args = @_;
70              
71 0         0 return $self->_tagcloud($c,%args);
72 1         19 } );
73              
74             $app->helper( 'marky_set_options' => sub {
75 0     0   0 my $c = shift;
76 0         0 my %args = @_;
77              
78 0         0 return $self->_set_options($c,%args);
79 1         15 } );
80             $app->helper( 'marky_settings' => sub {
81 0     0   0 my $c = shift;
82 0         0 my %args = @_;
83              
84 0         0 return $self->_settings($c,%args);
85 1         15 } );
86             $app->helper( 'marky_add_bookmark_form' => sub {
87 0     0   0 my $c = shift;
88 0         0 my %args = @_;
89              
90 0         0 return $self->_add_bookmark_form($c,%args);
91 1         14 } );
92             $app->helper( 'marky_add_bookmark_bookmarklet' => sub {
93 0     0   0 my $c = shift;
94 0         0 my %args = @_;
95              
96 0         0 return $self->_add_bookmark_bookmarklet($c,%args);
97 1         15 } );
98             $app->helper( 'marky_save_new_bookmark' => sub {
99 0     0   0 my $c = shift;
100 0         0 my %args = @_;
101              
102 0         0 return $self->_save_new_bookmark($c,%args);
103 1         14 } );
104             }
105              
106              
107             sub _init {
108 1     1   32 my $self = shift;
109 1         2 my $app = shift;
110 1         3 my $conf = shift;
111              
112 1         11 $self->{route_prefix} = $app->config->{route_prefix};
113 1         21 $self->{dbtables} = {};
114 1         2 $self->{edit_tables} = {};
115 1         2 foreach my $t (sort keys %{$app->config->{tables}})
  1         3  
116             {
117 1         9 $self->{dbtables}->{$t} = Marky::DbTable->new(%{$app->config->{tables}->{$t}});
  1         3  
118 1 50 33     4 if (exists $app->config->{tables}->{$t}->{editing}
119             and ref $app->config->{tables}->{$t}->{editing} eq 'HASH')
120             {
121 0         0 $self->{edit_tables}->{$t} = Marky::Bookmarker->new(%{$app->config->{tables}->{$t}->{editing}});
  0         0  
122             }
123             }
124 1         10 return $self;
125             } # _init
126              
127              
128             sub _do_query {
129 0     0     my $self = shift;
130 0           my $c = shift;
131 0           my $app = $c->app;
132              
133 0           my $db = $c->param('db');
134 0 0         if (!exists $self->{dbtables}->{$db})
135             {
136 0           $c->render(template => 'apperror',
137             errormsg=>"

No such db: $db

");
138 0           return undef;
139             }
140              
141 0           my $tags = $c->param('tags');
142 0           my $q = $c->param('q');
143 0           my $p = $c->param('p');
144 0           my $where = $c->param('where');
145              
146 0           my $n = $c->session('n');
147 0           my $sort_by = $c->session("${db}_sort_by");
148 0           my $sort_by2 = $c->session("${db}_sort_by2");
149 0           my $sort_by3 = $c->session("${db}_sort_by3");
150              
151 0           my $delterm = $c->param('delterm');
152 0 0 0       if ($delterm && $q)
153             {
154 0           $q =~ s/\b[ +]?$delterm\b//;
155 0           $q =~ s/[ +]$//;
156 0           $q =~ s/^[ +]//;
157 0           $c->param('q'=>$q);
158 0           $c->param(delterm=>undef);
159             }
160 0           my $deltag = $c->param('deltag');
161 0 0 0       if ($deltag && $tags)
162             {
163 0           $tags =~ s/\b[ +]?$deltag\b//;
164 0           $tags =~ s/[ +]$//;
165 0           $tags =~ s/^[ +]//;
166 0           $c->param('tags'=>$tags);
167 0           $c->param(deltag=>undef);
168             }
169 0           my $opt_url = $c->url_for("/db/$db/opt");
170 0           my $location = $c->url_for("/db/$db");
171             my $res = $self->{dbtables}->{$db}->query(location=>$location,
172             opt_url=>$opt_url,
173             db=>$db,
174             q=>$q,
175             tags=>$tags,
176             where=>$where,
177             n=>$n,
178             p=>$p,
179             sort_by=>$sort_by,
180             sort_by2=>$sort_by2,
181             sort_by3=>$sort_by3,
182             show_sql=>$app->config->{tables}->{$db}->{show_sql},
183 0           );
184 0 0         if (!defined $res)
185             {
186             $c->render(template => 'apperror',
187 0           errormsg=>$self->{dbtables}->{$db}->what_error());
188 0           return undef;
189             }
190              
191 0           $c->content('footer',$res->{pagination});
192 0           $c->content_for('footer',$res->{searchform});
193 0           $c->stash('query_taglist', $res->{query_tags});
194              
195 0           $c->stash('results' => $res->{results});
196 0           $c->render(template => 'results');
197             } # _do_query
198              
199              
200             sub _total_records {
201 0     0     my $self = shift;
202 0           my $c = shift;
203              
204 0           my $db = $c->param('db');
205              
206 0           my $total = $self->{dbtables}->{$db}->total_records();
207 0 0         if (!defined $total)
208             {
209             $c->render(template => 'apperror',
210 0           errormsg=>$self->{dbtables}->{$db}->what_error());
211 0           return undef;
212             }
213 0           return $total;
214             } # _total_records
215              
216              
217             sub _make_db_related_list {
218 0     0     my $self = shift;
219 0           my $c = shift;
220              
221 0           my $db = $c->param('db');
222 0           my $db_url = $c->url_for("/db/$db");
223 0           my @out = ();
224 0           push @out, "
    ";
225 0           push @out, "
  • $db
  • ";
    226 0           foreach my $t (qw(taglist tagcloud))
    227             {
    228 0           push @out, "
  • $db $t
  • ";
    229             }
    230 0           push @out, "";
    231 0           my $out = join("\n", @out);
    232 0           return $out;
    233             } # _make_db_related_list
    234              
    235              
    236             sub _make_table_list {
    237 0     0     my $self = shift;
    238 0           my $c = shift;
    239              
    240 0           my @out = ();
    241 0           push @out, "
      ";
    242 0           foreach my $t (sort keys %{$self->{dbtables}})
      0            
    243             {
    244 0           my $url = $c->url_for("/db/$t");
    245 0           push @out, "
  • $t
  • ";
    246             }
    247 0           push @out, "";
    248 0           my $out = join("\n", @out);
    249 0           return $out;
    250             } # _make_table_list
    251              
    252              
    253             sub _taglist {
    254 0     0     my $self = shift;
    255 0           my $c = shift;
    256              
    257 0           my $db = $c->param('db');
    258 0           my $opt_url = $c->url_for("/db/$db/opt");
    259 0           my $location = $c->url_for("/db/$db");
    260 0           my $res = $self->{dbtables}->{$db}->taglist(location=>$location,
    261             opt_url=>$opt_url,
    262             db=>$db,
    263             n=>0,
    264             );
    265 0 0         if (!defined $res)
    266             {
    267             $c->render(template => 'apperror',
    268 0           errormsg=>$self->{dbtables}->{$db}->what_error());
    269 0           return undef;
    270             }
    271 0           return $res->{results};
    272             } # _taglist
    273              
    274              
    275             sub _tagcloud {
    276 0     0     my $self = shift;
    277 0           my $c = shift;
    278              
    279 0           my $db = $c->param('db');
    280 0           my $opt_url = $c->url_for("/db/$db/opt");
    281 0           my $location = $c->url_for("/db/$db");
    282 0           my $res = $self->{dbtables}->{$db}->tagcloud(location=>$location,
    283             opt_url=>$opt_url,
    284             db=>$db,
    285             n=>0,
    286             );
    287 0 0         if (!defined $res)
    288             {
    289             $c->render(template => 'apperror',
    290 0           errormsg=>$self->{dbtables}->{$db}->what_error());
    291 0           return undef;
    292             }
    293 0           return $res->{results};
    294             } # _tagcloud
    295              
    296              
    297             sub _set_options {
    298 0     0     my $self = shift;
    299 0           my $c = shift;
    300 0           my %args = @_;
    301              
    302             # Set options for things like n
    303 0           my @db = (sort keys %{$self->{dbtables}});
      0            
    304              
    305 0           my @fields = (qw(n));
    306 0           foreach my $db (@db)
    307             {
    308 0           push @fields, "${db}_sort_by";
    309 0           push @fields, "${db}_sort_by2";
    310 0           push @fields, "${db}_sort_by3";
    311             }
    312 0           my %fields_set = ();
    313 0           foreach my $field (@fields)
    314             {
    315 0           my $val = $c->param($field);
    316 0 0         if ($val)
    317             {
    318 0           $c->session->{$field} = $val;
    319 0           $fields_set{$field} = 1;
    320             }
    321             else
    322             {
    323 0 0         if ($field =~ /(\w+)_sort_by./)
    324             {
    325             # We want to delete later sort-by values
    326             # if they are blank and the first one was set,
    327             # because we want to be able to sort by just
    328             # one or two fields if we want.
    329 0           my $db = $1;
    330 0 0         if ($fields_set{"${db}_sort_by"})
    331             {
    332 0           delete $c->session->{$field};
    333             }
    334             }
    335             }
    336             }
    337 0           my $referrer = $c->req->headers->referrer;
    338             } # _set_options
    339              
    340              
    341             sub _settings {
    342 0     0     my $self = shift;
    343 0           my $c = shift;
    344 0           my %args = @_;
    345              
    346 0           my $db = $c->param('db');
    347              
    348 0           my @fields = (qw(n));
    349 0           push @fields, "${db}_sort_by";
    350 0           push @fields, "${db}_sort_by2";
    351 0           push @fields, "${db}_sort_by3";
    352            
    353 0           my @out = ();
    354 0           foreach my $field (@fields)
    355             {
    356 0           my $val = $c->session->{$field};
    357 0           push @out, "

    $field: $val

    ";
    358             }
    359 0           my $referrer = $c->req->headers->referrer;
    360 0           print STDERR "_settings referrer=$referrer\n";
    361 0           push @out, "

    Back: $referrer

    ";
    362              
    363 0           return join("\n", @out);
    364             } # _settings
    365              
    366              
    367             sub _add_bookmark_form {
    368 0     0     my $self = shift;
    369 0           my $c = shift;
    370 0           my %args = @_;
    371              
    372 0           my $db = $c->param('db');
    373 0 0         if (!exists $self->{edit_tables}->{$db})
    374             {
    375 0           $c->render(template => 'apperror',
    376             errormsg=>"

    No such editable db: $db

    ");
    377 0           return;
    378             }
    379              
    380 0           my %data = ();
    381 0           my @fields = $self->{edit_tables}->{$db}->fields();
    382 0           foreach my $fn (@fields)
    383             {
    384 0           my $val = $c->param($fn);
    385 0 0         if (defined $val)
    386             {
    387 0           $data{$fn} = $val;
    388             }
    389             }
    390 0           my $add_url = $c->url_for("/db/$db/add");
    391 0           return $self->{edit_tables}->{$db}->bookmark_form(
    392             action=>$add_url,
    393             %data,
    394             );
    395             } # _add_bookmark_form
    396              
    397              
    398             sub _add_bookmark_bookmarklet {
    399 0     0     my $self = shift;
    400 0           my $c = shift;
    401 0           my %args = @_;
    402              
    403 0           my $db = $c->param('db');
    404 0 0         if (!exists $self->{edit_tables}->{$db})
    405             {
    406 0           $c->render(template => 'apperror',
    407             errormsg=>"

    No such editable db: $db

    ");
    408 0           return;
    409             }
    410              
    411 0           my $add_url = $c->url_for("/db/$db/add")->to_abs;
    412 0           return $self->{edit_tables}->{$db}->bookmarklet(
    413             %args,
    414             action=>$add_url,
    415             );
    416             } # _add_bookmark_bookmarklet
    417              
    418              
    419             sub _save_new_bookmark {
    420 0     0     my $self = shift;
    421 0           my $c = shift;
    422 0           my %args = @_;
    423              
    424 0           my $db = $c->param('db');
    425 0 0         if (!exists $self->{edit_tables}->{$db})
    426             {
    427 0           $c->render(template => 'apperror',
    428             errormsg=>"

    No such editable db: $db

    ");
    429 0           return;
    430             }
    431 0           my @status = ();
    432 0           push @status, "
    ";
    433 0           my %data = ();
    434 0           my @fields = $self->{edit_tables}->{$db}->fields();
    435 0           foreach my $fn (@fields)
    436             {
    437 0           my $val = $c->param($fn);
    438 0 0         if (defined $val)
    439             {
    440 0           $data{$fn} = $val;
    441 0           push @status, "

    $fn: $val

    ";
    442             }
    443             }
    444 0           push @status, "";
    445 0           $c->content('results', join("\n", @status));
    446 0 0         if (!$self->{edit_tables}->{$db}->save_new_bookmark(data=>\%data))
    447             {
    448 0           $c->content_for('results',"

    Bookmark-save failed.

    ");
    449             }
    450             else
    451             {
    452 0           $c->content_for('results',"

    Bookmark saved.

    ");
    453             }
    454             } # _save_new_bookmark
    455              
    456             1; # End of Mojolicious::Plugin::Marky::DbTableSet
    457              
    458             __END__