| // +----------------------------------------------------------------------+ // // $Id$ /** * @package MDB2 * @category Database * @author Lukas Smith */ require_once 'MDB2.php'; /** * MDB2_LOB: user land stream wrapper implementation for LOB support * * @package MDB2 * @category Database * @author Lukas Smith */ class MDB2_LOB { /** * contains the key to the global MDB2 instance array of the associated * MDB2 instance * * @var integer * @access protected */ var $db_index; /** * contains the key to the global MDB2_LOB instance array of the associated * MDB2_LOB instance * * @var integer * @access protected */ var $lob_index; // {{{ stream_open() /** * open stream * * @param string specifies the URL that was passed to fopen() * @param string the mode used to open the file * @param int holds additional flags set by the streams API * @param string not used * * @return bool * @access public */ function stream_open($path, $mode, $options, &$opened_path) { if (!preg_match('/^rb?\+?$/', $mode)) { return false; } $url = parse_url($path); if (empty($url['host'])) { return false; } $this->db_index = (int)$url['host']; if (!isset($GLOBALS['_MDB2_databases'][$this->db_index])) { return false; } $db =& $GLOBALS['_MDB2_databases'][$this->db_index]; $this->lob_index = (int)$url['user']; if (!isset($db->datatype->lobs[$this->lob_index])) { return false; } return true; } // }}} // {{{ stream_read() /** * read stream * * @param int number of bytes to read * * @return string * @access public */ function stream_read($count) { if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) { $db =& $GLOBALS['_MDB2_databases'][$this->db_index]; $db->datatype->_retrieveLOB($db->datatype->lobs[$this->lob_index]); $data = $db->datatype->_readLOB($db->datatype->lobs[$this->lob_index], $count); $length = strlen($data); if ($length == 0) { $db->datatype->lobs[$this->lob_index]['endOfLOB'] = true; } $db->datatype->lobs[$this->lob_index]['position'] += $length; return $data; } } // }}} // {{{ stream_write() /** * write stream, note implemented * * @param string data * * @return int * @access public */ function stream_write($data) { return 0; } // }}} // {{{ stream_tell() /** * return the current position * * @return int current position * @access public */ function stream_tell() { if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) { $db =& $GLOBALS['_MDB2_databases'][$this->db_index]; return $db->datatype->lobs[$this->lob_index]['position']; } } // }}} // {{{ stream_eof() /** * Check if stream reaches EOF * * @return bool * @access public */ function stream_eof() { if (!isset($GLOBALS['_MDB2_databases'][$this->db_index])) { return true; } $db =& $GLOBALS['_MDB2_databases'][$this->db_index]; $result = $db->datatype->_endOfLOB($db->datatype->lobs[$this->lob_index]); if (version_compare(phpversion(), "5.0", ">=") && version_compare(phpversion(), "5.1", "<") ) { return !$result; } return $result; } // }}} // {{{ stream_seek() /** * Seek stream, not implemented * * @param int offset * @param int whence * * @return bool * @access public */ function stream_seek($offset, $whence) { return false; } // }}} // {{{ stream_stat() /** * return information about stream * * @access public */ function stream_stat() { if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) { $db =& $GLOBALS['_MDB2_databases'][$this->db_index]; return array( 'db_index' => $this->db_index, 'lob_index' => $this->lob_index, ); } } // }}} // {{{ stream_close() /** * close stream * * @access public */ function stream_close() { if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) { $db =& $GLOBALS['_MDB2_databases'][$this->db_index]; if (isset($db->datatype->lobs[$this->lob_index])) { $db->datatype->_destroyLOB($db->datatype->lobs[$this->lob_index]); unset($db->datatype->lobs[$this->lob_index]); } } } // }}} } // register streams wrapper if (!stream_wrapper_register("MDB2LOB", "MDB2_LOB")) { MDB2::raiseError(); return false; } ?>