As a test of my new mod_perl abilities I wrote a trivial SQL client.
It works, but if the query returns many rows then it takes a while.
As a first step I thought I would call $r->rflush; with every row
printed but 
this does not work.  I also tried $|=0; with no effect.

Here is the full module, 100 lines.  The rows are printed in getarray
($$)

Any ideas would be appreciated
        ~quagly

package Sql::Client;

use Apache::Request;
use strict;
use warnings;
use Apache::Constants qw(:common);

my $r;                                      #request
my $apr;                                   #Apache::Request 
my $host;                                  #hostname of remote user
my $sql;                                    #sql to execute


sub getarray ($$) {

        my $dbh;              # Database handle
        my $sth;                # Statement handle
        my $p_sql;             # sql statement passed as parameter
        my @cols;              #column array to bind results
        my $titles;               # array ref to column headers
        my $r;                  # maybe if I pass the request it will
work 

        $p_sql = shift;
        $r = shift;

        # Connect
        $dbh = DBI->connect (
                "DBI:mysql:links_db::localhost",
                "nobody",
                "somebody",
                {
                        PrintError => 1,            # warn() on errors
                        RaiseError => 0,           # don't die on error
                        AutoCommit => 1,        # commit executes
immediately
                }
        );

        # prepare statment
        $sth = $dbh->prepare($p_sql);

        $sth->execute;

        $titles = $sth->{NAME_uc};
        #--------------
        # for minimal memory use, do it this way
        @cols[0..$#$titles] = ();
        $sth->bind_columns(\(@cols));
        print "<TABLE BORDER>";
        print "<TR>",
                map("<TD>$_</TD>",@$titles),
                                                "</TR>";
        while ($sth->fetch) {
                print "<TR>",
                        map("<TD>$_</TD>",@cols),
                         $r->rflush;
        }
        print "</TABLE>";
        return;
}


sub handler {
        $r = shift;
        $apr =  Apache::Request->new($r);
        $sql = $apr->param('sql') || 'SELECT';
        $sql='SELECT' if  $apr->param('reset');

        $r->content_type( 'text/html' );
        $r->send_http_header;
        return OK if $r->header_only;
        $host = $r->get_remote_host;
        $r->print(<<HTMLEND);
<HTML>
<HEAD>
<LINK REL="stylesheet" TYPE="text/css"
    HREF="/styles/lightstyle.css"
>
<TITLE>Hello $host</TITLE>
<BODY>
<H1>Sql Client</H1>
<FORM METHOD="POST">
<P>Enter your Select Statement:
<BR>
<TEXTAREA  NAME="sql" ROWS=8 COLS=60 WRAP>$sql</TEXTAREA>
<BR>
<INPUT TYPE="SUBMIT" VALUE="Submit">
<INPUT TYPE="SUBMIT" NAME="reset" VALUE="Reset">
</FORM>
HTMLEND

        getarray($sql,$r) unless $sql =~ /^SELECT$/;

        $r->print(<<HTMLEND);
</BODY>
</HTML>
HTMLEND
        return OK;
}
1;
~                                                                
"</TR>";

Reply via email to