summaryrefslogtreecommitdiff
path: root/includes/pear/HTTP/Download/PgLOB.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/pear/HTTP/Download/PgLOB.php')
-rw-r--r--includes/pear/HTTP/Download/PgLOB.php177
1 files changed, 177 insertions, 0 deletions
diff --git a/includes/pear/HTTP/Download/PgLOB.php b/includes/pear/HTTP/Download/PgLOB.php
new file mode 100644
index 0000000..d1c989e
--- /dev/null
+++ b/includes/pear/HTTP/Download/PgLOB.php
@@ -0,0 +1,177 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * HTTP::Download::PgLOB
+ *
+ * PHP versions 4 and 5
+ *
+ * @category HTTP
+ * @package HTTP_Download
+ * @author Michael Wallner <mike@php.net>
+ * @copyright 2003-2005 Michael Wallner
+ * @license BSD, revised
+ * @version CVS: $Id: PgLOB.php 304423 2010-10-15 13:36:46Z clockwerx $
+ * @link http://pear.php.net/package/HTTP_Download
+ */
+
+$GLOBALS['_HTTP_Download_PgLOB_Connection'] = null;
+stream_register_wrapper('pglob', 'HTTP_Download_PgLOB');
+
+/**
+ * PgSQL large object stream interface for HTTP_Download
+ *
+ * Usage:
+ * <code>
+ * require_once 'HTTP/Download.php';
+ * require_once 'HTTP/Download/PgLOB.php';
+ * $db = &DB::connect('pgsql://user:pass@host/db');
+ * // or $db = pg_connect(...);
+ * $lo = HTTP_Download_PgLOB::open($db, 12345);
+ * $dl = &new HTTP_Download;
+ * $dl->setResource($lo);
+ * $dl->send()
+ * </code>
+ *
+ * @access public
+ * @version $Revision: 304423 $
+ */
+class HTTP_Download_PgLOB
+{
+ /**
+ * Set Connection
+ *
+ * @static
+ * @access public
+ * @return bool
+ * @param mixed $conn
+ */
+ function setConnection($conn)
+ {
+ if (is_a($conn, 'DB_Common')) {
+ $conn = $conn->dbh;
+ } elseif ( is_a($conn, 'MDB_Common') ||
+ is_a($conn, 'MDB2_Driver_Common')) {
+ $conn = $conn->connection;
+ }
+ if ($isResource = is_resource($conn)) {
+ $GLOBALS['_HTTP_Download_PgLOB_Connection'] = $conn;
+ }
+ return $isResource;
+ }
+
+ /**
+ * Get Connection
+ *
+ * @static
+ * @access public
+ * @return resource
+ */
+ function getConnection()
+ {
+ if (is_resource($GLOBALS['_HTTP_Download_PgLOB_Connection'])) {
+ return $GLOBALS['_HTTP_Download_PgLOB_Connection'];
+ }
+ return null;
+ }
+
+ /**
+ * Open
+ *
+ * @static
+ * @access public
+ * @return resource
+ * @param mixed $conn
+ * @param int $loid
+ * @param string $mode
+ */
+ function open($conn, $loid, $mode = 'rb')
+ {
+ HTTP_Download_PgLOB::setConnection($conn);
+ return fopen('pglob:///'. $loid, $mode);
+ }
+
+ /**#@+
+ * Stream Interface Implementation
+ * @internal
+ */
+ var $ID = 0;
+ var $size = 0;
+ var $conn = null;
+ var $handle = null;
+
+ function stream_open($path, $mode)
+ {
+ if (!$this->conn = HTTP_Download_PgLOB::getConnection()) {
+ return false;
+ }
+ if (!preg_match('/(\d+)/', $path, $matches)) {
+ return false;
+ }
+ $this->ID = $matches[1];
+
+ if (!pg_query($this->conn, 'BEGIN')) {
+ return false;
+ }
+
+ $this->handle = pg_lo_open($this->conn, $this->ID, $mode);
+ if (!is_resource($this->handle)) {
+ return false;
+ }
+
+ // fetch size of lob
+ pg_lo_seek($this->handle, 0, PGSQL_SEEK_END);
+ $this->size = (int) pg_lo_tell($this->handle);
+ pg_lo_seek($this->handle, 0, PGSQL_SEEK_SET);
+
+ return true;
+ }
+
+ function stream_read($length)
+ {
+ return pg_lo_read($this->handle, $length);
+ }
+
+ function stream_seek($offset, $whence = SEEK_SET)
+ {
+ return pg_lo_seek($this->handle, $offset, $whence);
+ }
+
+ function stream_tell()
+ {
+ return pg_lo_tell($this->handle);
+ }
+
+ function stream_eof()
+ {
+ return pg_lo_tell($this->handle) >= $this->size;
+ }
+
+ function stream_flush()
+ {
+ return true;
+ }
+
+ function stream_stat()
+ {
+ return array('size' => $this->size, 'ino' => $this->ID);
+ }
+
+ function stream_write($data)
+ {
+ return pg_lo_write($this->handle, $data);
+ }
+
+ function stream_close()
+ {
+ if (pg_lo_close($this->handle)) {
+ return pg_query($this->conn, 'COMMIT');
+ } else {
+ pg_query($this->conn ,'ROLLBACK');
+ return false;
+ }
+ }
+ /**#@-*/
+}
+
+?>