Apache-SWIT

 view release on metacpan or  search on metacpan

lib/Apache/SWIT/LargeObjectHandler.pm  view on Meta::CPAN

use strict;
use warnings FATAL => 'all';

package Apache::SWIT::LargeObjectHandler;
use base qw(Apache::SWIT);
use HTTP::Date;
use Carp;

sub serve_lo {
	my ($class, $r, $dbh, $loid, $bufsiz) = @_;
	my $lo_fd = $dbh->func($loid, $dbh->{'pg_INV_READ'}, 'lo_open');
	defined($lo_fd) or die "# Unable to lo_open $loid";
	my $buf = '';
	$dbh->func($lo_fd, $buf, $bufsiz, 'lo_read');
	my $ct = $r->param("ct");
	($ct, $buf) = HTML::Tested::ClassDBI::Upload->strip_mime_header($buf) if (!$ct);
	confess "No content type found!" unless $ct;
	$r->headers_out->add('Expires', HTTP::Date::time2str(
				time + 240*24*60*60));
	$class->swit_send_http_header($r, $ct);
	do {
		$r->print($buf);
	} while ($dbh->func($lo_fd, $buf, $bufsiz, 'lo_read'));
}

sub swit_render_handler($$) {
	my($class, $ar) = @_;
	my $r = Apache2::Request->new($ar);
	my $enc_loid = $r->param("loid") or confess "No loid was given";
	my $loid = HTML::Tested::Seal->instance->decrypt($enc_loid)
			or confess "Unable to decrypt loid: $enc_loid";
	my $dbh = Apache::SWIT::DB::Connection->instance->db_handle;
	$dbh->begin_work;
	eval { $class->serve_lo($r, $dbh, $loid, 4096 * 4); };
	if ($@) {
		$dbh->rollback;
		confess "Original error $@";
	} else {
		$dbh->commit;
	}
	return Apache2::Const::OK;
}

1;



( run in 1.959 second using v1.01-cache-2.11-cpan-39bf76dae61 )