| // +----------------------------------------------------------------------+ // // $Id: LOB.php,v 1.30.4.1 2004/01/08 13:43:03 lsmith Exp $ // if(!defined('MDB_LOB_INCLUDED')) { define('MDB_LOB_INCLUDED', 1); /** * MDB Large Object (BLOB/CLOB) classes * * @package MDB * @category Database * @access private * @author Lukas Smith */ class MDB_LOB { var $database; var $lob; var $data = ''; var $position = 0; function create(&$arguments) { if(isset($arguments['Data'])) { $this->data = $arguments['Data']; } return(MDB_OK); } function destroy() { $this->data = ''; } function endOfLob() { return($this->position >= strlen($this->data)); } function readLob(&$data, $length) { $length = min($length, strlen($this->data) - $this->position); $data = substr($this->data, $this->position, $length); $this->position += $length; return($length); } }; class MDB_LOB_Result extends MDB_LOB { var $result_lob = 0; function create(&$arguments) { if(!isset($arguments['ResultLOB'])) { return(PEAR::raiseError(NULL, MDB_ERROR_NEED_MORE_DATA, NULL, NULL, 'it was not specified a result Lob identifier', 'MDB_Error', TRUE)); } $this->result_lob = $arguments['ResultLOB']; return(MDB_OK); } function destroy() { $this->database->_destroyResultLob($this->result_lob); } function endOfLob() { return($this->database->endOfResultLob($this->result_lob)); } function readLob(&$data, $length) { $read_length = $this->database->_readResultLob($this->result_lob, $data, $length); if (MDB::isError($read_length)) { return($read_length); } if($read_length < 0) { return(PEAR::raiseError(NULL, MDB_ERROR_INVALID, NULL, NULL, 'data was read beyond end of data source', 'MDB_Error', TRUE)); } return($read_length); } }; class MDB_LOB_Input_File extends MDB_LOB { var $file = 0; var $opened_file = 0; function create(&$arguments) { if(isset($arguments['File'])) { if(intval($arguments['File']) == 0) { return(PEAR::raiseError(NULL, MDB_ERROR_INVALID, NULL, NULL, 'it was specified an invalid input file identifier', 'MDB_Error', TRUE)); } $this->file = $arguments['File']; } else { if(isset($arguments['FileName'])) { if((!$this->file = fopen($arguments['FileName'], 'rb'))) { return(PEAR::raiseError(NULL, MDB_ERROR_NOT_FOUND, NULL, NULL, 'could not open specified input file ("'.$arguments['FileName'].'")', 'MDB_Error', TRUE)); } $this->opened_file = 1; } else { return(PEAR::raiseError(NULL, MDB_ERROR_NEED_MORE_DATA, NULL, NULL, 'it was not specified the input file', 'MDB_Error', TRUE)); } } return(MDB_OK); } function destroy() { if($this->opened_file) { fclose($this->file); $this->file = 0; $this->opened_file = 0; } } function endOfLob() { return(feof($this->file)); } function readLob(&$data, $length) { if(gettype($data = @fread($this->file, $length))!= 'string') { return(PEAR::raiseError(NULL, MDB_ERROR, NULL, NULL, 'could not read from the input file', 'MDB_Error', TRUE)); } return(strlen($data)); } }; class MDB_LOB_Output_File extends MDB_LOB { var $file = 0; var $opened_file = 0; var $input_lob = 0; var $opened_lob = 0; var $buffer_length = 8000; function create(&$arguments) { if(isset($arguments['BufferLength'])) { if($arguments['BufferLength'] <= 0) { return(PEAR::raiseError(NULL, MDB_ERROR_INVALID, NULL, NULL, 'it was specified an invalid buffer length', 'MDB_Error', TRUE)); } $this->buffer_length = $arguments['BufferLength']; } if(isset($arguments['File'])) { if(intval($arguments['File']) == 0) { return(PEAR::raiseError(NULL, MDB_ERROR_INVALID, NULL, NULL, 'it was specified an invalid output file identifier', 'MDB_Error', TRUE)); } $this->file = $arguments['File']; } else { if(isset($arguments['FileName'])) { if((!$this->file = fopen($arguments['FileName'],'wb'))) { return(PEAR::raiseError(NULL, MDB_ERROR_NOT_FOUND, NULL, NULL, 'could not open specified output file ("'.$arguments['FileName'].'")', 'MDB_Error', TRUE)); } $this->opened_file = 1; } else { return(PEAR::raiseError(NULL, MDB_ERROR_NEED_MORE_DATA, NULL, NULL, 'it was not specified the output file', 'MDB_Error', TRUE)); } } if(isset($arguments['LOB'])) { if(!is_object($arguments['LOB'])) { $this->destroy(); return(PEAR::raiseError(NULL, MDB_ERROR_INVALID, NULL, NULL, 'it was specified an invalid input large object identifier', 'MDB_Error', TRUE)); } $this->input_lob = $arguments['LOB']; } else { if($this->database && isset($arguments['Result']) && isset($arguments['Row']) && isset($arguments['Field']) && isset($arguments['Binary'])) { if($arguments['Binary']) { $this->input_lob = $this->database->fetchBlob($arguments['Result'], $arguments['Row'], $arguments['Field']); } else { $this->input_lob = $this->database->fetchClob($arguments['Result'], $arguments['Row'], $arguments['Field']); } if($this->input_lob == 0) { $this->destroy(); return(PEAR::raiseError(NULL, MDB_ERROR, NULL, NULL, 'could not fetch the input result large object', 'MDB_Error', TRUE)); } $this->opened_lob = 1; } else { $this->destroy(); return(PEAR::raiseError(NULL, MDB_ERROR_NEED_MORE_DATA, NULL, NULL, 'it was not specified the input large object identifier', 'MDB_Error', TRUE)); } } return(MDB_OK); } function destroy() { if($this->opened_file) { fclose($this->file); $this->opened_file = 0; $this->file = 0; } if($this->opened_lob) { $this->database->destroyLob($this->input_lob); $this->input_lob = 0; $this->opened_lob = 0; } } function endOfLob() { return($this->database->endOfLob($this->input_lob)); } function readLob(&$data, $length) { $buffer_length = ($length == 0 ? $this->buffer_length : $length); $written_full = 0; do { for($written = 0; !$this->database->endOfLob($this->input_lob) && $written < $buffer_length; $written += $read) { if(MDB::isError($result = $this->database-> readLob($this->input_lob, $buffer, $buffer_length))) { return($result); } $read = strlen($buffer); if(@fwrite($this->file, $buffer, $read)!= $read) { return(PEAR::raiseError(NULL, MDB_ERROR, NULL, NULL, 'could not write to the output file', 'MDB_Error', TRUE)); } } $written_full += $written; } while($length == 0 && !$this->database->endOfLob($this->input_lob)); return($written_full); } } }; ?>