#!/usr/bin/perl -w

use strict;
use CGI qw(:standard);
use CGI::Carp;
    # DBIモジュールを用いる。
use DBI;
CGI::use_named_parameters(1);

my ($db,$table)=@_;
my $output = new CGI;
$server = param('server') or $server = '';
$db = param('db') or die("Database not supplied!");

# 要求されたサーバへ接続する。
my $dbh = DBI->connect("DBI:mysql:$db:$server", undef, undef);

# テーブル内の全データを要求するクエリを
# サーバへ送る準備をする。
my $table_data = $dbh->prepare("select * from $table");
# クエリをサーバへ送る。
$table_data->execute;

# 戻り値が未定義の場合、テーブルは存在しない（または空である可能性がある。
# どちらかは確認されない）。
if (not $table_data) {
        print header, start_html('title'=>
        "Information on $host => $db => $table", 'BGCOLOR'=>'white');

        print <<END_OF_HTML;
<H1>$host</h1>
<H2>$db</h2>
テーブル'$table'は$host上の$dbに存在しません。
</body></html>
END_OF_HTML
        exit(0);
}

# この時点で表示するデータがある。
# まずテーブルの構造を示す。
print header, start_html('title'=>"Information on $host => $db => $table",
        'BGCOLOR'=>'white');
print <<END_OF_HTML;
<H1>$host</h1>
<H2>$db</h2>
<H3>$table</h3>
<p>
<TABLE BORDER>
<CAPTION>フィールド</caption>
<TR>
 <TH>フィールド<TH>型<TH>サイズ<TH>NOT NULL
</tr>
<UL>
END_OF_HTML

# $table_data->{NAME}により、データベースフィールド配列への
# リファレンスが返される。
my @fields = @{$table_data->{NAME}};
# $table_data->{TYPE}により、フィールド型の配列リファレンスが返される。
# ここで返される型は標準SQLで表記されており、MySQL特有ではない。

my @types = @{$table_data->{TYPE}};
# $table_data->is_not_nullにより、NOT NULLフラグを持つフィールド
# を示すブール配列リファレンスが返される。
my @not_null = @{$table_data->is_not_null};
# $table_data->lengthにより、フィールド長の配列リファレンスが返される。
# INT型やREAL型の場合は固定長であり、
# CHARの場合は可変長である（テーブルの作成時に定義）。
my @length = @{$table_data->length};

# 上記の配列はすべて同じ順序で返される。このため、$fields[0]、$types[0]、
# $not_null[0]、$length[0]はすべて同じフィールドを参照する。

foreach $field (0..$#fields) {
        print "<TR>\n";
print "<TD>$fields[$field]<TD>$types[$field]<TD>";
        print $length[$field] if $types[$field] eq 'SQL_CHAR';
        print "<TD>";
        print 'Y' if ($not_null[$field]);
        print "</tr>\n";
}

print <<END_OF_HTML;
</table>
<p>
<B>データ</b><br>
<OL>
END_OF_HTML

# DBI::fetchrow_array()を使って、データを1行ずつ検証する。
# データは、以前に作成した参考となる配列（@fields、@typesなど）
# と同じ順序で配列内に保存する。
while(my(@data)=$table_data->fetchrow_array) {
        print "<LI>\n<UL>";
        for (0..$#data) {
                print "<LI>$fields[$_] => $data[$_]</li>\n";
        }
        print "</ul></li>";
}

print <<END_OF_HTML;
</ol>
</body></html>
END_OF_HTML
