Ado

 view release on metacpan or  search on metacpan

lib/Ado/Plugin/AdoHelpers.pm  view on Meta::CPAN

package Ado::Plugin::AdoHelpers;
use Mojo::Base 'Ado::Plugin';
use Mojo::Util qw(decode);
use List::Util qw(first);
use Mojo::File 'path';

# allow plugins to process SQL scripts while loading
sub do_sql_file {
    my ($app, $sql_file) = @_;
    my $dbh = $app->dbix->dbh;

    #$app->log->debug('do_sql_file:' . $sql_file) if $Ado::Control::DEV_MODE;

    my $SQL = decode('UTF-8', path($sql_file)->slurp());

    #Remove multi-line comments
    $SQL =~ s|/\*+.+?\*/\s+?||gsmx;

    #$app->log->debug('$SQL:' . $SQL) if $Ado::Control::DEV_MODE;
    local $dbh->{RaiseError} = 1;
    my $last_statement = '';
    return eval {
        $dbh->begin_work;
        for my $st (split /;/smx, $SQL) {
            $last_statement = $st;
            $dbh->do($st) if ($st =~ /\S+/smx);
        }
        $dbh->commit;
    } || do {
        my $e = "\nError in statement:$last_statement\n$@";
        my $e2;
        eval { $dbh->rollback } || ($e2 = $/ . 'Additionally we have a rollback error:' . $@);
        $app->log->error($e . ($e2 ? $e2 : ''));
        Carp::croak($e . ($e2 ? $e2 : ''));
    };
}

sub register {
    my ($self, $app, $conf) = shift->initialise(@_);

    # Add helpers
    $app->helper(user => sub { shift->user(@_) });

    # http://irclog.perlgeek.de/mojo/2014-10-03#i_9453021
    $app->helper(to_json => sub { Mojo::JSON::to_json($_[1]) });
    Mojo::Util::monkey_patch(ref($app), do_sql_file => \&Ado::Plugin::AdoHelpers::do_sql_file);

    $app->helper('head_css'        => \&_head_css);
    $app->helper('head_javascript' => \&_head_javascript);

    return $self;
}    #end of register

my $file_re = qr/\w+\.\w+(\?.*)?$/;

sub _head_css {
    my ($c, $assets) = @_;
    my $assets_list = $c->stash('head_css');

    #append
    if ($assets) {
        $assets = [$assets] unless ref($assets) eq 'ARRAY';
        foreach my $a (@$assets) {
            push @$assets_list, $a unless first { $_ eq $a } @$assets_list;
        }
        return;
    }

    # render
    my $css = '';

    #everything in separate stylesheet begin end block or <link>
    foreach my $a (@$assets_list) {
        if ($a =~ $file_re) {    # a file
            $css .= qq|<link href="$a" rel='stylesheet' type='text/css' />\n|;
        }
        elsif (ref $a eq 'CODE') {    # a code
            $css .= $c->stylesheet($a) . $/;
        }
        else {                        # a string
            $css .= $c->stylesheet(sub {$a}) . $/;
        }
    }
    return $css;
}

sub _head_javascript {
    my ($c, $assets) = @_;
    my $assets_list = $c->stash('head_javascript');

    #append
    if ($assets) {
        $assets = [$assets] unless ref($assets) eq 'ARRAY';



( run in 0.732 second using v1.01-cache-2.11-cpan-39bf76dae61 )