The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
=head1 NAME

DBIx::DBO2::Schema - Group of tables and associated record classes

=head1 SYNOPSIS

  use DBIx::DBO2::Schema;
  my $ts = DBIx::DBO2::Schema->new();
  $ts->connect_datasource( $dsn, $user, $pass );
  $ts->packages( 'MyClassName' => 'mytablename' );
  $ts->require_packages;
  $ts->declare_tables;

=head1

This is an example use of the DBIx::DBO2 framework used for testing purposes.

=cut

package DBIx::DBO2::Schema;

use strict;
use Carp;
use Class::MakeMethods;

use DBIx::SQLEngine::Schema::Table;

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

use Class::MakeMethods::Standard::Hash (
  'new' => 'new', 
  'object' => { name=>'datasource', class=>'DBIx::SQLEngine::Driver::Default'},
  'hash' => 'packages',
);

sub connect_datasource {
  my $self = shift;
  $self->datasource( DBIx::SQLEngine->new( @_ ) );
}

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

sub require_packages {
  my $self = shift;
  my %tables = $self->packages;
  while ( my( $package, $tablename ) = each %tables  ) {
    $package =~ s{::}{/}g;
    $package .= '.pm';
    # warn "Loading $package...\n";
    require $package;
  }
}

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

sub declare_tables {
  my $self = shift;
  my $datasource = $self->datasource;
  my %tables = $self->packages;
  while ( my( $package, $tablename ) = each %tables  ) {
    $package->table( $datasource->table( $tablename ) )
  }
}

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

sub create_tables {
  my $self = shift;
  
  my %tables = $self->packages;
  while ( my( $package, $tablename ) = each %tables  ) {
    my $table = $package->table;
    $table->columnset( DBIx::SQLEngine::Schema::ColumnSet->new() );
    my $cols = $package->field_columns;
    $table->columnset( DBIx::SQLEngine::Schema::ColumnSet->new( @$cols ) );
    $table->create_table;
  }
}

sub ensure_tables_exist {
  my $self = shift;
  
  my %tables = $self->packages;
  while ( my( $package, $tablename ) = each %tables  ) {
    my $table = $package->table;
    next if $table->table_exists;
    my $cols = $package->field_columns;
    $table->columnset( DBIx::DBO2::ColumnSet->new( @$cols ) );
    $table->create_table;
  }
}

sub refresh_tables_schema {
  my $self = shift;
  
  my %tables = $self->packages;
  while ( my( $package, $tablename ) = each %tables  ) {
    my $table = $package->table;
    next if $table->table_exists;
    my $cols = $package->field_columns;
    $table->columnset( DBIx::DBO2::ColumnSet->new( @$cols ) );
    $table->recreate_table_with_rows;
  }
}

sub drop_tables {
  my $self = shift;
  
  my %tables = $self->packages;
  while ( my( $package, $tablename ) = each %tables  ) {
    my $table = $package->table	or next;
    $table->drop_table;
  }
}

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

1;