package App::bif::sql;
use strict;
use warnings;
use App::bif::Context;

our $VERSION = '0.1.0_22';

sub run {
    my $ctx = App::bif::Context->new(shift);
    my $db = $ctx->{write} ? $ctx->dbw : $ctx->db;

    if ( !$ctx->{statement} ) {
        local $/;
        $ctx->{statement} = <STDIN>;
    }

    if ( $ctx->{statement} =~ m/^(select)|(pragma)|(explain)/i ) {
        my $sth = $db->prepare( $ctx->{statement} );
        $sth->execute(@_);

        if ( $ctx->{noprint} ) {
            return $sth->fetchall_arrayref;
        }

        my $header = join( ', ', @{ $sth->{NAME} } );
        print $header, "\n", ( '-' x length $header ), "\n";
        print DBI::neat_list($_) . "\n" for @{ $sth->fetchall_arrayref };
    }
    else {
        print $db->do( $ctx->{statement} ) . "\n";
    }

    return 'BifSQL';
}

1;
__END__

=head1 NAME

bif-sql -  run an SQL command against the database

=head1 VERSION

0.1.0_22 (2014-05-10)

=head1 SYNOPSIS

    bif sql [STATEMENT...]  [OPTIONS...]

=head1 DESCRIPTION

The C<bif sql> command runs an SQL statement directly against the
database. If the statement is not given on the command line it will be
read from I<stdin>.

If STATEMENT begins with "select", "pragma" or "explain" the results of
the statement will be fetched and displayed. Otherwise the return value
of the statement (DBI "do" method) will be printed.

By default a read-only handle for the database is used. Note that
"pragma" statements would therefore require the C<--write> flag to
succeed, even if they are only returning data.

=head1 ARGUMENTS & OPTIONS

=over

=item STATEMENT

The SQL statement text to execute. You will possibly want to use single
quotes around this argument (or escape shell characters like "*") to
prevent unwanted shell expansion messing with your query.

=item --noprint

Do not print results but return them to the calling subroutine as a
Perl data structure.  This option is only useful for internal test
scripts.

=item --write, -w

Run statement with a writeable database handle (default is read-only).

=back

=head1 SEE ALSO

L<bif>(1)

=head1 AUTHOR

Mark Lawrence E<lt>nomad@null.netE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright 2013-2014 Mark Lawrence <nomad@null.net>

This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3 of the License, or (at your
option) any later version.