diff --git a/InterBase.pm b/InterBase.pm index bdd041e..f615cad 100644 --- a/InterBase.pm +++ b/InterBase.pm @@ -210,6 +210,55 @@ sub table_info return $sth; } + +sub column_info +{ + my $dbh = shift; + my ($catalog,$schema,$table,$column) = (@_); + my (@search)=(); + if(defined($table) && length($table)) { + push @search, "r.rdb\$relation_name ". ($table =~ /[_%]/ ? "LIKE " : "= ") .$dbh->quote($table); + } + if(defined($column) && length($column)) { + push @search, "rf.rdb\$field_name ". ($column =~ /[_%]/ ? "LIKE " : "= ") .$dbh->quote($column); + } + my $wherefilter = join ' AND ','',@search; + my $sql = qq! + SELECT + NULL TABLE_CAT, + r.rdb\$owner_name TABLE_SCHEM, + r.rdb\$relation_name TABLE_NAME, + rf.rdb\$field_name COLUMN_NAME, + t.rdb\$type_name DATA_TYPE, + t.rdb\$type_name TYPE_NAME, + f.rdb\$character_length COLUMN_SIZE, + f.rdb\$field_length BUFFER_LENGTH, + NULL DECIMAL_DIGITS, + NULL NUM_PREC_RADIX, + rf.rdb\$null_flag NULLABLE, + rf.rdb\$description REMARKS, + rf.rdb\$default_value COLUMN_DEF, + t.rdb\$type_name SQL_DATA_TYPE, + NULL SQL_DATETIME_SUB, + f.rdb\$field_length CHAR_OCTET_LENGTH, + rf.rdb\$field_position ORDINAL_POSITION, + rf.rdb\$null_flag IS_NULLABLE + FROM + rdb\$relations r + JOIN rdb\$relation_fields rf ON (r.rdb\$relation_name=rf.rdb\$relation_name) + JOIN rdb\$fields f ON (rf.rdb\$field_source=f.rdb\$field_name) + JOIN rdb\$types t ON (f.rdb\$field_type=t.rdb\$type) + WHERE + ((r.rdb\$system_flag=0) OR (r.rdb\$system_flag IS NULL)) AND (r.rdb\$view_source IS NULL) + $wherefilter + ORDER BY r.rdb\$owner_name, r.rdb\$relation_name, rf.rdb\$field_position + !; +#print "[[$sql]]"; + my $sth = $dbh->prepare($sql); + $sth->execute() or return undef; + + return $sth; +} sub ping {