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;