summaryrefslogtreecommitdiff
path: root/program/lib/MDB2/Driver/querysim.php
diff options
context:
space:
mode:
Diffstat (limited to 'program/lib/MDB2/Driver/querysim.php')
-rwxr-xr-xprogram/lib/MDB2/Driver/querysim.php684
1 files changed, 0 insertions, 684 deletions
diff --git a/program/lib/MDB2/Driver/querysim.php b/program/lib/MDB2/Driver/querysim.php
deleted file mode 100755
index 928a86bd1..000000000
--- a/program/lib/MDB2/Driver/querysim.php
+++ /dev/null
@@ -1,684 +0,0 @@
-<?php
-// vim: set et ts=4 sw=4 fdm=marker:
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2004 Manuel Lemos, Tomas V.V.Cox, |
-// | Stig. S. Bakken, Lukas Smith |
-// | All rights reserved. |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB |
-// | API as well as database abstraction for PHP applications. |
-// | This LICENSE is in the BSD license style. |
-// | |
-// | Redistribution and use in source and binary forms, with or without |
-// | modification, are permitted provided that the following conditions |
-// | are met: |
-// | |
-// | Redistributions of source code must retain the above copyright |
-// | notice, this list of conditions and the following disclaimer. |
-// | |
-// | Redistributions in binary form must reproduce the above copyright |
-// | notice, this list of conditions and the following disclaimer in the |
-// | documentation and/or other materials provided with the distribution. |
-// | |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken, |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission. |
-// | |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// | OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
-// | POSSIBILITY OF SUCH DAMAGE. |
-// +----------------------------------------------------------------------+
-// | Original QuerySim Concept & ColdFusion Author: Hal Helms |
-// | <hal.helms@teamallaire.com> |
-// | Bert Dawson <bdawson@redbanner.com> |
-// +----------------------------------------------------------------------+
-// | Original PHP Author: Alan Richmond <arichmond@bigfoot.com> |
-// | David Huyck <b@bombusbee.com> |
-// +----------------------------------------------------------------------+
-// | Special note concerning code documentation: |
-// | QuerySim was originally created for use during development of |
-// | applications built using the Fusebox framework. (www.fusebox.org) |
-// | Fusebox uses an XML style of documentation called Fusedoc. (Which |
-// | is admittedly not well suited to documenting classes and functions. |
-// | This short-coming is being addressed by the Fusebox community.) PEAR |
-// | uses a Javadoc style of documentation called PHPDoc. (www.phpdoc.de) |
-// | Since this class extension spans two groups of users, it is asked |
-// | that the members of each respect the documentation standard of the |
-// | other. So it is a further requirement that both documentation |
-// | standards be included and maintained. If assistance is required |
-// | please contact Alan Richmond. |
-// +----------------------------------------------------------------------+
-//
-// $Id$
-//
-
-/*
-<fusedoc fuse="querysim.php" language="PHP">
- <responsibilities>
- I take information and turn it into a recordset that can be accessed
- through the PEAR MDB2 API. Based on Hal Helms' QuerySim.cfm ColdFusion
- custom tag available at halhelms.com.
- </responsibilities>
- <properties>
- <property name="API" value="PEAR MDB2" />
- <property name="version" value="0.2.1" />
- <property name="status" value="beta" />
- <history author="Hal Helms" email="hal.helms@teamallaire.com" type="Create" />
- <history author="Bert Dawson" email="bdawson@redbanner.com" type="Update">
- Extensive revision that is backwardly compatible but eliminates the
- need for a separate .sim file.
- </history>
- <history author="Alan Richmond" email="arichmond@bigfoot.com" type="Create" date="10-July-2002">
- Rewrote in PHP as an extention to the PEAR DB API.
- Functions supported:
- connect, disconnect, query, fetchRow, freeResult,
- numCols, numRows, getSpecialQuery
- David Huyck (bombusbee.com) added ability to escape special
- characters (i.e., delimiters) using a '\'.
- Extended PEAR DB options[] for adding incoming parameters. Added
- options: columnDelim, dataDelim, eolDelim
- </history>
- <history author="David Huyck" email="b@bombusbee.com" type="Update" date="19-July-2002">
- Added the ability to set the QuerySim options at runtime.
- Default options are:
- 'columnDelim' => ',', // Commas split the column names
- 'dataDelim' => '|', // Pipes split the data fields
- 'eolDelim' => chr(13).chr(10) // Carriage returns split the
- // lines of data
- Affected functions are:
- DB_querysim(): set the default options when the
- constructor method is called
- _parseQuerySim($query): altered the parsing of lines, column
- names, and data fields
- _empty2null: altered the way this function is called
- to simplify calling it
- </history>
- <history author="Alan Richmond" email="arichmond@bigfoot.com" type="Update" date="24-July-2002">
- Added error catching for malformed QuerySim text.
- Bug fix _empty2null(): altered version was returning unmodified
- lineData.
- Cleanup:
- PEAR compliant formatting, finished PHPDocs and added 'out' to
- Fusedoc 'io'.
- Broke up _parseQuerySim() into _buildResult() and _parseOnDelim()
- to containerize duplicate parse code.
- </history>
- <history author="David Huyck" email="b@bombusbee.com" type="Update" date="25-July-2002">
- Edited the _buildResult() and _parseOnDelim() functions to improve
- reliability of special character escaping.
- Re-introduced a custom setOption() method to throw an error when a
- person tries to set one of the delimiters to '\'.
- </history>
- <history author="Alan Richmond" email="arichmond@bigfoot.com" type="Update" date="27-July-2002">
- Added '/' delimiter param to preg_quote() in _empty2null() and
- _parseOnDelim() so '/' can be used as a delimiter.
- Added error check for columnDelim == eolDelim or dataDelim == eolDelim.
- Renamed some variables for consistancy.
- </history>
- <history author="Alan Richmond" email="arichmond@bigfoot.com" type="Update" date="30-July-2002">
- Removed protected function _empty2null(). Turns out preg_split()
- deals with empty elemants by making them zero length strings, just
- what they ended up being anyway. This should speed things up a little.
- Affected functions:
- _parseOnDelim() perform trim on line here, instead of in
- _empty2null().
- _buildResult() remove call to _empty2null().
- _empty2null() removed function.
- </history>
- <history author="Alan Richmond" email="arichmond@bigfoot.com" type="Update" date="1-Jan-2003">
- Ported to PEAR MDB2.
- Methods supported:
- connect, query, getColumnNames, numCols, valid, fetch,
- numRows, free, fetchRow, nextResult, setLimit
- (inherited).
- </history>
- <history
- Removed array_change_key_case() work around for <4.2.0 in
- getColumnNames(), found it already done in MDB2/Common.php.
- </history>
- <history author="Alan Richmond" email="arichmond@bigfoot.com" type="Update" date="3-Feb-2003">
- Changed default eolDelim to a *nix file eol, since we're trimming
- the result anyway, it makes no difference for Windows. Now only
- Mac file eols should need to be set (and other kinds of chars).
- </history>
- <note author="Alan Richmond">
- Got WAY too long. See querysim_readme.txt for instructions and some
- examples.
- io section only documents elements of DB_result that DB_querysim uses,
- adds or changes; see MDB2 and MDB2_Driver_Common for more info.
- io section uses some elements that are not Fusedoc 2.0 compliant:
- object and resource.
- </note>
- </properties>
- <io>
- <in>
- <file path="MDB2/Common.php" action="require_once" />
- </in>
- <out>
- <object name="MDB2_querysim" extends="MDB2_Driver_Common" instantiatedby="MDB2::connect()">
- <resource type="file" name="connection" oncondition="source is external file" scope="class" />
- <string name="phptype" default="querysim" />
- <string name="dbsyntax" default="querysim" />
- <array name="supported" comments="most of these don't actually do anything, they are enabled to simulate the option being available if checked">
- <boolean name="sequences" default="true" />
- <boolean name="indexes" default="true" />
- <boolean name="affected_rows" default="true" />
- <boolean name="summary_functions" default="true" />
- <boolean name="order_by_text" default="true" />
- <boolean name="current_id" default="true" />
- <boolean name="limit_querys" default="true" comments="this one is functional" />
- <boolean name="LOBs" default="true" />
- <boolean name="replace" default="true" />
- <boolean name="sub_selects" default="true" />
- <boolean name="transactions" default="true" />
- </array>
- <string name="last_query" comments="last value passed in with query()" />
- <array name="options" comments="these can be changed at run time">
- <string name="columnDelim" default="," />
- <string name="dataDelim" default="|" />
- <string name="eolDelim" default="chr(13).chr(10)" />
- </array>
- </object>
- <array name="result" comments="the simulated record set returned by ::query()">
- <array comments="columns">
- <string comments="column name" />
- </array>
- <array comments="data">
- <array comments="row">
- <string comments="data element" />
- </array>
- </array>
- </array>
- </out>
- </io>
-</fusedoc>
-*/
-
-/**
- * MDB2 QuerySim driver
- *
- * @package MDB2
- * @category Database
- * @author Alan Richmond <arichmond@bigfoot.com>
- */
-class MDB2_Driver_querysim extends MDB2_Driver_Common
-{
- // {{{ properties
- var $escape_quotes = "\\";
- // }}}
-
- // {{{ constructor
-
- /**
- * Constructor
- */
- function __construct()
- {
- parent::__construct();
-
- $this->phptype = 'querysim';
- $this->dbsyntax = 'querysim';
-
- // Most of these are dummies to simulate availability if checked
- $this->supported['sequences'] = 'emulated';
- $this->supported['indexes'] = true;
- $this->supported['affected_rows'] = false;
- $this->supported['summary_functions'] = false;
- $this->supported['order_by_text'] = false;
- $this->supported['current_id'] = 'emulated';
- $this->supported['limit_queries'] = true;// this one is real
- $this->supported['LOBs'] = true;
- $this->supported['replace'] = 'emulated';
- $this->supported['sub_selects'] = 'emulated';
- $this->supported['transactions'] = false;
- $this->supported['auto_increment'] = false;
- $this->supported['primary_key'] = false;
-
- $this->options['columnDelim'] = ',';
- $this->options['dataDelim'] = '|';
- $this->options['eolDelim'] = "\n";
- }
-
- // }}}
-
- // {{{ connect()
-
- /**
- * Open a file or simulate a successful database connect
- *
- * @access public
- *
- * @return mixed MDB2_OK string on success, a MDB2 error object on failure
- */
- function connect()
- {
- if (is_resource($this->connection)) {
- if ($this->connected_database_name == $this->database_name
- && ($this->opened_persistent == $this->options['persistent'])
- ) {
- return MDB2_OK;
- }
- if ($this->connected_database_name) {
- $this->_close($this->connection);
- }
- $this->disconnect();
- }
-
- $connection = 1;// sim connect
- // if external, check file...
- if ($this->database_name) {
- $file = $this->database_name;
- if (!file_exists($file)) {
- return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, 'file not found');
- }
- if (!is_file($file)) {
- return $this->raiseError(MDB2_ERROR_INVALID, null, null, 'not a file');
- }
- if (!is_readable($file)) {
- return $this->raiseError(MDB2_ERROR_ACCESS_VIOLATION, null, null,
- 'could not open file - check permissions');
- }
- // ...and open if persistent
- if ($this->options['persistent']) {
- $connection = @fopen($file, 'r');
- }
- }
- $this->connection = $connection;
- $this->connected_database_name = $this->database_name;
- $this->opened_persistent = $this->options['persistent'];
- $this->dbsyntax = $this->dsn['dbsyntax'] ? $this->dsn['dbsyntax'] : $this->phptype;
-
- return MDB2_OK;
- }
- // }}}
-
- // {{{ disconnect()
-
- /**
- * Log out and disconnect from the database.
- *
- * @return mixed true on success, false if not connected and error
- * object on error
- * @access public
- */
- function disconnect()
- {
- if (is_resource($this->connection)) {
- if (($this->opened_persistent) && (is_resource($this->connection))) {
- if (!@fclose($this->connection)) {
- return $this->raiseError();
- }
- }
- $this->connection = 0;
- }
- return MDB2_OK;
- }
- // }}}
-
- // {{{ _doQuery()
-
- /**
- * Execute a query
- * @param string $query query
- * @param boolean $isManip if the query is a manipulation query
- * @param resource $connection
- * @param string $database_name
- * @return result or error object
- * @access protected
- */
- function _doQuery($query, $isManip = false, $connection = null, $database_name = null)
- {
- if ($isManip) {
- return $this->raiseError(MDB2_ERROR_UNSUPPORTED);
- }
-
- $this->last_query = $query;
- $this->debug($query, 'query');
- if ($this->options['disable_query']) {
- return null;
- }
-
- $result = $this->_buildResult($query);
- if (PEAR::isError($result)) {
- return $result;
- }
-
- if ($limit > 0) {
- $result[1] = array_slice($result[1], $offset-1, $limit);
- }
- return $result;
- }
- // }}}
-
- // {{{ _readFile()
-
- /**
- * Read an external file
- *
- * @param string filepath/filename
- *
- * @access protected
- *
- * @return string the contents of a file
- */
- function _readFile()
- {
- $buffer = '';
- if ($this->opened_persistent) {
- while (!feof($this->connection)) {
- $buffer.= fgets($this->connection, 1024);
- }
- } else {
- $this->connection = @fopen($this->connected_database_name, 'r');
- while (!feof($this->connection)) {
- $buffer.= fgets($this->connection, 1024);
- }
- $this->connection = @fclose($this->connection);
- }
- return $buffer;
- }
- // }}}
-
- // {{{ _buildResult()
-
- /**
- * Convert QuerySim text into an array
- *
- * @param string Text of simulated query
- *
- * @access protected
- *
- * @return multi-dimensional array containing the column names and data
- * from the QuerySim
- */
- function _buildResult($query)
- {
- $eolDelim = $this->options['eolDelim'];
- $columnDelim = $this->options['columnDelim'];
- $dataDelim = $this->options['dataDelim'];
-
- $columnNames = array();
- $data = array();
-
- if ($columnDelim == $eolDelim) {
- return $this->raiseError(MDB2_ERROR_INVALID, null, null,
- 'columnDelim and eolDelim must be different');
- } elseif ($dataDelim == $eolDelim){
- return $this->raiseError(MDB2_ERROR_INVALID, null, null,
- 'dataDelim and eolDelim must be different');
- }
-
- $query = trim($query);
- //tokenize escaped slashes
- $query = str_replace('\\\\', '[$double-slash$]', $query);
-
- if (!strlen($query)) {
- return $this->raiseError(MDB2_ERROR_SYNTAX, null, null,
- 'empty querysim text');
- }
- $lineData = $this->_parseOnDelim($query, $eolDelim);
- //kill the empty last row created by final eol char if it exists
- if (!strlen(trim($lineData[count($lineData) - 1]))) {
- unset($lineData[count($lineData) - 1]);
- }
- //populate columnNames array
- $thisLine = each($lineData);
- $columnNames = $this->_parseOnDelim($thisLine[1], $columnDelim);
- if ((in_array('', $columnNames)) || (in_array('NULL', $columnNames))) {
- return $this->raiseError(MDB2_ERROR_SYNTAX, null, null,
- 'all column names must be defined');
- }
- //replace double-slash tokens with single-slash
- $columnNames = str_replace('[$double-slash$]', '\\', $columnNames);
- $columnCount = count($columnNames);
- $rowNum = 0;
- //loop through data lines
- if (count($lineData) > 1) {
- while ($thisLine = each($lineData)) {
- $thisData = $this->_parseOnDelim($thisLine[1], $dataDelim);
- $thisDataCount = count($thisData);
- if ($thisDataCount != $columnCount) {
- $fileLineNo = $rowNum + 2;
- return $this->raiseError(MDB2_ERROR_SYNTAX, null, null,
- "number of data elements ($thisDataCount) in line $fileLineNo not equal to number of defined columns ($columnCount)");
- }
- //loop through data elements in data line
- foreach ($thisData as $thisElement) {
- if (strtoupper($thisElement) == 'NULL'){
- $thisElement = '';
- }
- //replace double-slash tokens with single-slash
- $data[$rowNum][] = str_replace('[$double-slash$]', '\\', $thisElement);
- }//end foreach
- ++$rowNum;
- }//end while
- }//end if
- return array($columnNames, $data);
- }//end function _buildResult()
- // }}}
-
- // {{{ _parseOnDelim()
-
- /**
- * Split QuerySim string into an array on a delimiter
- *
- * @param string $thisLine Text of simulated query
- * @param string $delim The delimiter to split on
- *
- * @access protected
- *
- * @return array containing parsed string
- */
- function _parseOnDelim($thisLine, $delim)
- {
- $delimQuoted = preg_quote($delim, '/');
- $thisLine = trim($thisLine);
-
- $parsed = preg_split('/(?<!\\\\)' .$delimQuoted. '/', $thisLine);
- //replaces escaped delimiters
- $parsed = preg_replace('/\\\\' .$delimQuoted. '/', $delim, $parsed);
- if ($delim != $this->options['eolDelim']) {
- //replaces escape chars
- $parsed = preg_replace('/\\\\/', '', $parsed);
- }
- return $parsed;
- }
- // }}}
-}
-
-class MDB2_Result_querysim extends MDB2_Result_Common
-{
- // }}}
- // {{{ fetchRow()
-
- /**
- * Fetch a row and insert the data into an existing array.
- *
- * @param int $fetchmode how the array data should be indexed
- * @param int $rownum number of the row where the data can be found
- * @return int data array on success, a MDB2 error on failure
- * @access public
- */
- function &fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null)
- {
- if (is_null($this->result)) {
- $err =& $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
- 'fetchRow: resultset has already been freed');
- return $err;
- }
- if (!is_null($rownum)) {
- $seek = $this->seek($rownum);
- if (PEAR::isError($seek)) {
- return $seek;
- }
- }
- $target_rownum = $this->rownum + 1;
- if ($fetchmode == MDB2_FETCHMODE_DEFAULT) {
- $fetchmode = $this->db->fetchmode;
- }
- if (!isset($this->result[1][$target_rownum])) {
- $null = null;
- return $null;
- }
- $row = $this->result[1][$target_rownum];
- // make row associative
- if ($fetchmode & MDB2_FETCHMODE_ASSOC) {
- $column_names = $this->getColumnNames();
- foreach ($column_names as $name => $i) {
- $column_names[$name] = $row[$i];
- }
- $row = $column_names;
- }
- if (($mode = ($this->db->options['portability'] & MDB2_PORTABILITY_RTRIM)
- + ($this->db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL))
- ) {
- $this->db->_fixResultArrayValues($row, $mode);
- }
- if (!empty($this->values)) {
- $this->_assignBindColumns($row);
- }
- if (!empty($this->types)) {
- $row = $this->db->datatype->convertResultRow($this->types, $row);
- }
- if ($fetchmode === MDB2_FETCHMODE_OBJECT) {
- $object_class = $this->db->options['fetch_class'];
- if ($object_class == 'stdClass') {
- $row = (object) $row;
- } else {
- $row = &new $object_class($row);
- }
- }
- ++$this->rownum;
- return $row;
- }
-
- // }}}
- // {{{ _getColumnNames()
-
- /**
- * Retrieve the names of columns returned by the DBMS in a query result.
- *
- * @return mixed an associative array variable
- * that will hold the names of columns. The
- * indexes of the array are the column names
- * mapped to lower case and the values are the
- * respective numbers of the columns starting
- * from 0. Some DBMS may not return any
- * columns when the result set does not
- * contain any rows.
- *
- * a MDB2 error on failure
- * @access private
- */
- function _getColumnNames()
- {
- if (is_null($this->result)) {
- return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
- 'getColumnNames: resultset has already been freed');
- }
- $columns = array_flip($this->result[0]);
- if ($this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
- $columns = array_change_key_case($columns, $this->db->options['field_case']);
- }
- return $columns;
- }
-
- // }}}
- // {{{ numCols()
-
- /**
- * Count the number of columns returned by the DBMS in a query result.
- *
- * @access public
- * @return mixed integer value with the number of columns, a MDB2 error
- * on failure
- */
- function numCols()
- {
- if (is_null($this->result)) {
- return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
- 'numCols: resultset has already been freed');
- }
- $cols = count($this->result[0]);
- return $cols;
- }
-}
-
-class MDB2_BufferedResult_querysim extends MDB2_Result_querysim
-{
- // {{{ seek()
-
- /**
- * seek to a specific row in a result set
- *
- * @param int $rownum number of the row where the data can be found
- * @return mixed MDB2_OK on success, a MDB2 error on failure
- * @access public
- */
- function seek($rownum = 0)
- {
- if (is_null($this->result)) {
- return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
- 'seek: resultset has already been freed');
- }
- $this->rownum = $rownum - 1;
- return MDB2_OK;
- }
-
- // }}}
- // {{{ valid()
-
- /**
- * check if the end of the result set has been reached
- *
- * @return mixed true or false on sucess, a MDB2 error on failure
- * @access public
- */
- function valid()
- {
- $numrows = $this->numRows();
- if (PEAR::isError($numrows)) {
- return $numrows;
- }
- return $this->rownum < ($numrows - 1);
- }
-
- // }}}
- // {{{ numRows()
-
- /**
- * returns the number of rows in a result object
- *
- * @return mixed MDB2 Error Object or the number of rows
- * @access public
- */
- function numRows()
- {
- if (is_null($this->result)) {
- return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
- 'numRows: resultset has already been freed');
- }
- $rows = count($this->result[1]);
- return $rows;
- }
-}
-
-
-class MDB2_Statement_querysim extends MDB2_Statement_Common
-{
-
-}
-
-?> \ No newline at end of file