The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package DB2::db::TableCreator;

use XML::Parser;
use IO::File;

my $data;
my $cur_str = "";
my @depth;

my $cur_table = undef;
my $cur_column = undef;

sub create_table
{
    my $tbl = shift;
    my $xml = shift;

    my $p = XML::Parser->new(
                             Handlers => {
                                 Start => \&tag_start,
                                 End   => \&tag_end,
                                 Char  => \&char,
                             },
                            );

    my $if = IO::File->new($xml, "r");
    die "Can't read $xml: $!" unless $if;

    $p->parse($if);

}

sub tag_start
{
    my $expat = shift;
    my $el    = shift;
    my %attr  = @_;

    unless (scalar @depth or $el eq 'table')
    {
        die "Malformed: outtermost tags must be <table>...</table>";
    }

    if ($el eq 'table')
    {
        $cur_table = { %attr };
    }

    push @depth, $el;
}

sub tag_end
{
    my $expat = shift;
    my $el    = shift;

    die "Malformed: expected </$depth[$#]>, got </$el>" unless $el eq pop @depth;

    if ($el eq 'table')
    {
        # check that it has something useful.
        die "Malformed: table without package"
            unless (exists $cur_table->{package});
        die "Malformed: table with no columns"
            unless exists $cur_table->{column} and scalar @{$cur_table->{column}};
        $cur_table = undef;
    }
}

sub char
{
    my $expat = shift;
    my $str   = shift;

    $cur_str .= $str;
}

1;