I posted something like this a week ago, but typos in my message kept
anyone from understanding the issue.

        I am trying to return each row to the client as it comes from the
database, instead of waiting for all the rows to be returned before
displaying them.  

        I have set $|=1 and added $r->flush; after every print statement ( I
realize this is redundant ) but to no avail.  

This is the relevant code:

while ($sth->fetch) {
   $r->print ("<TR>",
       map("<TD>$_</TD>",@cols),
       "</TR>");
  $r->rflush;
}

Here is the complete package:

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

$|=1;

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

        $p_sql = 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));
        $r->print( "<TABLE BORDER>");
        $r->print ("<TR>",
                map("<TD>$_</TD>",@$titles),
                                                "</TR>");
        while ($sth->fetch) {
                $r->print ("<TR>",
                        map("<TD>$_</TD>",@cols),
                                                        "</TR>");
                $r->rflush;
        }
        $r->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
        $r->rflush;
        getarray($sql) unless $sql =~ /^SELECT$/;

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

Reply via email to