package SQL::Admin::Driver::Base::DBI;

use strict;
use warnings;

our $VERSION = v0.5.0;

######################################################################

use DBI;
use SQL::Abstract;

my $sqla;

######################################################################
######################################################################
sub new {                                # ;
    my $class = shift;
    bless { @_ }, ref $class || $class;
}


######################################################################
######################################################################
sub options {                            # ;
    (
        'dbdns=s',
        'dbusr=s',
        'dbpwd=s',
    );
}


######################################################################
######################################################################
sub sqla {                               # ;
    $sqla ||= SQL::Abstract->new;
}


######################################################################
######################################################################
sub dbh {                                # ;
    my $self = shift;
    $self->{dbh} || $self->connect;
}


######################################################################
######################################################################
sub execute {                            # ;
    my ($self, $sql, @bind) = @_;

    my $sth = $self->dbh->prepare ($sql);
    $sth->execute (@bind);

    $sth;
}


######################################################################
######################################################################
sub connect {                            # ;
    my ($self, $dsn, $user, $password) = @_;

    $self->{dbh} ||= DBI->connect (
        $dsn      || $self->{dbdsn},
        $user     || $self->{dbusr},
        $password || $self->{dbpwd},
        { FetchHashKeyName => 'NAME_lc' },
    ) || die "Unable to connect: $DBI::errstr";
}


######################################################################
######################################################################
sub load {                               # ;
    my ($self, $catalog, @params) = @_;
    $self->connect || return;

    map $self->$_ ($catalog, @params),
      grep $self->can ($_), (
          'load_sequence',
          'load_table',
          'load_index',
          'load_table_column',
          'load_table_column_not_null',
          'load_table_column_default',
          'load_table_column_autoincrement',
          'load_constraint_primary_key',
          'load_constraint_unique',
          'load_constraint_foreign_key',
          'load_constraint_check',
#          'load_view',
#          'load_function',
#          'load_trigger',
#          'load_rule',
      );

    1;
}


######################################################################
######################################################################

package SQL::Admin::Driver::Base::DBI;

1;