/usr/local/CPAN/DBIx-Informix-Perform/DBIx/Informix/Perform/DoTable.pm


# FIX_ME get a better name for this.
use 5.6.0;
package DBIx::Informix::Perform::DoTable;

use strict;
use DBIx::Informix::Perform::DButils 'open_db';
use Exporter;

use base 'Exporter';

our $DB;
our @EXPORT_OK = qw(generate_per);

sub generate_per
{
    my $db = shift;
    my $table_name = shift;

    $DB = open_db($db);
    if (0)			# Don't think we really need this...
    { 
	local ($DB->{'RaiseError'},$DB->{'PrintError'}) = (1, 0);
	my $tblh = eval {$DB->table_info('', '%', $table_name, 'TABLE') };
	$tblh ||=    eval { $DB->table_info('', "'%'", $table_name, 'TABLE')};
	my $tblrows = $tblh->fetchall_arrayref({}); # the {} means return hashes.
	my @tblrows = grep { $_->{'TABLE_NAME'} eq $table_name ||
				 $_->{'relname'} eq $table_name}    @$tblrows;
	if (@tblrows > 1) {
	    print STDERR "Please select one table the following:\n";
	    foreach (@tblrows) {
		print STDERR "   ", $_->{'TABLE_NAME'}, $/;
	    }
	    return undef;
	}
    }

    my $colh;
    {
	local ($DB->{'RaiseError'},$DB->{'PrintError'}) = (1, 0);
	# Work around DBD::Pg breakage with wildcards
	$colh = eval {$DB->column_info('', '%', $table_name, '%')}  ||
	    eval {$DB->column_info('', "'%'", $table_name, "'%'")};
    }
    my $colrows = $colh->fetchall_arrayref({});	# {} for row hashes.
    my @colrows = @$colrows;
    my $maxlen = 0;		# length of name, that is.
    grep { my $l = length($_->{'COLUMN_NAME'});
	   $l > $maxlen && ($maxlen = $l) }
      @colrows;
    my $defsize = 75 - $maxlen;
    my $buf = "database $db\n\nscreen\n{\n";
    my $fxxx = "f000";		# Field name counter for roomy fields
    my $ax = "a0";		# Field name counter for short fields
    my $b = "b";		# Field name counter for VERY short fields.
    my @attrs;			# attributes section listings.
    foreach my $col (@colrows) {
	my ($cname, $size, $type)  =
	    @$col{'COLUMN_NAME', 'COLUMN_SIZE', 'DATA_TYPE'};
	if (!defined($size) || $size < 0) {
	    if ($type =~ /char/i) {
		$size = ($$col{'atttypmod'} && $$col{'atttypmod'} - 4)  ||
		    #  other database-specific heuristics here...
		    $defsize;
	    }
	    elsif ($type =~ /date/i) {
		$size = 10;	# e.g. 01-02-2000
	    }
	    elsif ($type =~ /bool/i) {
		$size = 1;
	    }
	    else {
		$size = $defsize;
	    }
	}
	my $fieldname =
	    $size >= 4 ? $fxxx++ :
		$size >= 2 ? $ax++ :
		    $b++;
	my $fnpadding = ' ' x ($size - length($fieldname));
	my $cnpadding = ' ' x ($maxlen - length($cname));
	$buf .=  " $cname:$cnpadding" . " [" . $fieldname . $fnpadding . "]\n";
	push (@attrs,  "    $fieldname = $table_name.$cname;\n");
    }				#  foreach
    $buf .= "}\nend\n\n";
    $buf .= "tables\n\t$table_name\n\n";
    $buf .= "attributes\n" . join('', @attrs) . "\nend\n\n";
    return $buf;
}