DBIx::DBO::Table - An OO interface to SQL queries and results. Encapsulates a table in an object.


DBIx-DBO documentation Contained in the DBIx-DBO distribution.

Index


Code Index:

NAME

Top

DBIx::DBO::Table - An OO interface to SQL queries and results. Encapsulates a table in an object.

SYNOPSIS

Top

  # Create a Table object
  my $table = $dbo->table('my_table');

  # Get a column reference
  my $column = $table ** 'employee_id';

  # Quickly display my employee id
  print $table->fetch_value('employee_id', name => 'Vernon');

  # Find the IDs of fired employees
  my @fired = @{ $table->fetch_column('id', status => 'fired');

  # Insert a new row into the table
  $table->insert(employee_id => 007, name => 'James Bond');

  # Remove rows from the table where the name IS NULL
  $table->delete(name => undef);

DESCRIPTION

Top

Table objects are mostly used for column references in a Query. They can also be used for INSERTs, DELETEs and simple lookups (fetch_*).

METHODS

Top

new

  DBIx::DBO::Table->new($dbo, $table);
  DBIx::DBO::Table->new($dbo, [$schema, $table]);
  DBIx::DBO::Table->new($dbo, $table_object);

Create and return a new Table object. Tables can be specified by their name or an arrayref of schema and table name or another Table object.

tables

Return a list of Table objects, which will always be this Table object.

columns

Return a list of column names.

column

  $table->column($column_name);
  $table ** $column_name;

Returns a reference to a column for use with other methods. The ** method is a shortcut for the column method.

row

Returns a new Row object for this table.

fetch_row

  $table->fetch_row(%where);

Fetch the first matching row from the table returning it as a Row object.

The %where is a hash of field/value pairs. The value can be a SCALAR ref, which will be used without quoting.

  $someone = $table->fetch_row(name => \'NOT NULL', age => 21, join_date => \'CURDATE()', end_date => undef);

fetch_value

  $table->fetch_value($column, %where);

Fetch the first matching row from the table returning the value in one column.

fetch_hash

  $table->fetch_hash(%where);

Fetch the first matching row from the table returning it as a hashref.

fetch_column

  $table->fetch_column($column, %where);

Fetch all matching rows from the table returning an arrayref of the values in one column.

insert

  $table->insert(name => 'Richard', age => 103);

Insert a row into the table. Returns true on success or undef on failure.

On supporting databases you may also use $table->last_insert_id to retreive the autogenerated ID (if there was one) from the last inserted row.

last_insert_id

  $table->insert(name => 'Quentin');
  my $row_id = $table->last_insert_id;

Retreive the autogenerated ID (if there was one) from the last inserted row.

Returns the ID or undef if it's unavailable.

delete

  $table->delete(name => 'Richard', age => 103);

Delete all rows from the table matching the criteria. Returns the number of rows deleted or undef on failure.

truncate

  $table->truncate;

Truncate the table. Returns true on success or undef on failure.

Common Methods

These methods are accessible from all DBIx::DBO* objects.

dbh

The read-write DBI handle.

rdbh

The read-only DBI handle, or if there is no read-only connection, the read-write DBI handle.

do

  $table->do($statement)         or die $table->dbh->errstr;
  $table->do($statement, \%attr) or die $table->dbh->errstr;
  $table->do($statement, \%attr, @bind_values) or die ...

This provides access to DBI->do method. It defaults to using the read-write DBI handle.

config

  $table_setting = $table->config($option);
  $table->config($option => $table_setting);

Get or set the Table config settings. When setting an option, the previous value is returned. When getting an option's value, if the value is undefined, the DBIx::DBO's value is returned.

See Available_config_options in DBIx::DBO.

TODO LIST

Top

SEE ALSO

Top

DBIx::DBO


DBIx-DBO documentation Contained in the DBIx-DBO distribution.
package DBIx::DBO::Table;

use strict;
use warnings;
use DBIx::DBO::Common;
use Carp 'croak';
our @ISA = qw(DBIx::DBO::Common);

use overload '**' => \&column, fallback => 1;

sub new {
    my $proto = shift;
    UNIVERSAL::isa($_[0], 'DBIx::DBO') or croak 'Invalid DBO Object';
    my $class = ref($proto) || $proto;
    $class = $class->_set_dbd_inheritance($_[0]{dbd});
    $class->_init(@_);
}

sub _init {
    my ($class, $dbo, $table) = @_;
    (my $schema, $table, my $me) = $dbo->table_info($table) or croak 'No such table: '.$table;
    bless { %$me, Schema => $schema, Name => $table, DBO => $dbo, LastInsertID => undef }, $class;
}

sub tables {
    wantarray ? $_[0] : 1;
}

sub _table_alias {
    return if $_[0] == $_[1];
    croak 'The table is not in this query';
}

sub _quoted_name {
    my $me = shift;
    defined $me->{_quoted_name} ? $me->{_quoted_name} : ($me->{_quoted_name} = $me->_qi(@$me{qw(Schema Name)}));
}

sub columns {
    @{$_[0]->{Columns}};
}

sub column {
    my ($me, $col) = @_;
    croak 'Invalid column '.$me->_qi($col).' in table '.$me->_quoted_name
        unless exists $me->{Column_Idx}{$col};
    $me->{Column}{$col} ||= bless [$me, $col], 'DBIx::DBO::Column';
}

sub _valid_col {
    my ($me, $col) = @_;
    return $col if $col->[0] == $me;
}

sub row {
    my $me = shift;
    $me->_row_class->new($me->{DBO}, $me);
}

sub fetch_row {
    my $me = shift;
    $me->row->load(@_);
}

sub fetch_value {
    my ($me, $col) = splice @_, 0, 2;
    $col = $me->_parse_col($col);
    my $sql = 'SELECT '.$me->_qi($col->[1]).' FROM '.$me->_quoted_name;
    my @bind;
    $sql .= ' WHERE '.$_ if $_ = $me->_build_quick_where(\@bind, @_);
    $me->_sql($sql, @bind);
    my $ref = $me->rdbh->selectrow_arrayref($sql, undef, @bind);
    return $ref && $ref->[0];
}

sub fetch_hash {
    my $me = shift;
    my $sql = 'SELECT * FROM '.$me->_quoted_name;
    my @bind;
    $sql .= ' WHERE '.$_ if $_ = $me->_build_quick_where(\@bind, @_);
    $me->_sql($sql, @bind);
    $me->rdbh->selectrow_hashref($sql, undef, @bind);
}

sub fetch_column {
    my ($me, $col) = splice @_, 0, 2;
    $col = $me->_parse_col($col);
    my $sql = 'SELECT '.$me->_qi($col->[1]).' FROM '.$me->_quoted_name;
    my @bind;
    $sql .= ' WHERE '.$_ if $_ = $me->_build_quick_where(\@bind, @_);
    $me->_sql($sql, @bind);
    return $me->rdbh->selectcol_arrayref($sql, undef, @bind);
}

sub insert {
    my $me = shift;
    croak 'Called insert() without args on table '.$me->_quoted_name unless @_;
    croak 'Wrong number of arguments' if @_ & 1;
    my @cols;
    my @vals;
    my @bind;
    while (my ($col, $val) = splice @_, 0, 2) {
        push @cols, $me->_build_col($me->_parse_col($col));
        push @vals, $me->_build_val(\@bind, $me->_parse_val($val));
    }
    my $sql = 'INSERT INTO '.$me->_quoted_name.' ('.join(', ', @cols).') VALUES ('.join(', ', @vals).')';
    $me->_sql($sql, @bind);
    my $sth = $me->dbh->prepare($sql) or return undef;
    my $rv = $sth->execute(@bind) or return undef;
    $me->{LastInsertID} = $me->_save_last_insert_id($sth);
    return $rv;
}

sub _save_last_insert_id {
    # Should be provided in a DBD specific method
    # It is called after insert and must return the autogenerated ID

    # my $me = shift;
    # my $sth = shift;
    # return $sth->{Database}->last_insert_id(undef, @$me{qw(Schema Name)}, undef);
}

sub last_insert_id {
    my $me = shift;
    $me->{LastInsertID};
}

sub delete {
    my $me = shift;
    my $sql = 'DELETE FROM '.$me->_quoted_name;
    my @bind;
    $sql .= ' WHERE '.$_ if $_ = $me->_build_quick_where(\@bind, @_);
    $me->do($sql, undef, @bind);
}

sub truncate {
    my $me = shift;
    $me->do('TRUNCATE TABLE '.$me->_quoted_name);
}

sub config {
    my $me = shift;
    my $opt = shift;
    return $me->_set_config($me->{Config} ||= {}, $opt, shift) if @_;
    return defined $me->{Config}{$opt} ? $me->{Config}{$opt} : $me->{DBO}->config($opt);
}

sub DESTROY {
    undef %{$_[0]};
}

1;

__END__