onokazu
onoka****@users*****
2005年 6月 28日 (火) 16:45:06 JST
Index: xoops2jp/html/class/criteria.php diff -u xoops2jp/html/class/criteria.php:1.3 xoops2jp/html/class/criteria.php:1.4 --- xoops2jp/html/class/criteria.php:1.3 Sat Jun 11 11:32:38 2005 +++ xoops2jp/html/class/criteria.php Tue Jun 28 16:45:05 2005 @@ -1,381 +1,405 @@ -<?php -// $Id: criteria.php,v 1.3 2005/06/11 02:32:38 onokazu Exp $ -// ------------------------------------------------------------------------ // -// XOOPS - PHP Content Management System // -// Copyright (c) 2000 XOOPS.org // -// <http://www.xoops.org/> // -// ------------------------------------------------------------------------ // -// This program is free software; you can redistribute it and/or modify // -// it under the terms of the GNU General Public License as published by // -// the Free Software Foundation; either version 2 of the License, or // -// (at your option) any later version. // -// // -// You may not change or alter any portion of this comment or credits // -// of supporting developers from this source code or any supporting // -// source code which is considered copyrighted (c) material of the // -// original comment or credit authors. // -// // -// This program is distributed in the hope that it will be useful, // -// but WITHOUT ANY WARRANTY; without even the implied warranty of // -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // -// GNU General Public License for more details. // -// // -// You should have received a copy of the GNU General Public License // -// along with this program; if not, write to the Free Software // -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// ------------------------------------------------------------------------ // -// Author: Kazumi Ono (AKA onokazu) // -// URL: http://www.myweb.ne.jp/, http://www.xoops.org/, http://jp.xoops.org/ // -// Project: The XOOPS Project // -// ------------------------------------------------------------------------- // -// Modified by: Nathan Dial // -// Date: 20 March 2003 // -// Desc: added experimental LDAP filter generation code // -// also refactored to remove about 20 lines of redundant code. // -// ------------------------------------------------------------------------- // - -/** - * - * - * @package kernel - * @subpackage database - * - * @author Kazumi Ono <onoka****@xoops*****> - * @copyright copyright (c) 2000-2003 XOOPS.org - */ - -/** - * A criteria (grammar?) for a database query. - * - * Abstract base class should never be instantiated directly. - * - * @abstract - * - * @package kernel - * @subpackage database - * - * @author Kazumi Ono <onoka****@xoops*****> - * @copyright copyright (c) 2000-2003 XOOPS.org - */ -class CriteriaElement -{ - /** - * Sort order - * @var string - */ - var $order = 'ASC'; - - /** - * @var string - */ - var $sort = ''; - - /** - * Number of records to retrieve - * @var int - */ - var $limit = 0; - - /** - * Offset of first record - * @var int - */ - var $start = 0; - - /** - * @var string - */ - var $groupby = ''; - - /** - * Constructor - **/ - function CriteriaElement() - { - - } - - /** - * Render the criteria element - */ - function render() - { - - } - - /**#@+ - * Accessor - */ - /** - * @param string $sort - */ - function setSort($sort) - { - $this->sort = $sort; - } - - /** - * @return string - */ - function getSort() - { - return $this->sort; - } - - /** - * @param string $order - */ - function setOrder($order) - { - if ('DESC' == strtoupper($order)) { - $this->order = 'DESC'; - } - } - - /** - * @return string - */ - function getOrder() - { - return $this->order; - } - - /** - * @param int $limit - */ - function setLimit($limit=0) - { - $this->limit = intval($limit); - } - - /** - * @return int - */ - function getLimit() - { - return $this->limit; - } - - /** - * @param int $start - */ - function setStart($start=0) - { - $this->start = intval($start); - } - - /** - * @return int - */ - function getStart() - { - return $this->start; - } - - /** - * @param string $group - */ - function setGroupby($group){ - $this->groupby = $group; - } - - /** - * @return string - */ - function getGroupby(){ - return ' GROUP BY '.$this->groupby; - } - /**#@-*/ -} - -/** - * Collection of multiple {@link CriteriaElement}s - * - * @package kernel - * @subpackage database - * - * @author Kazumi Ono <onoka****@xoops*****> - * @copyright copyright (c) 2000-2003 XOOPS.org - */ -class CriteriaCompo extends CriteriaElement -{ - - /** - * The elements of the collection - * @var array Array of {@link CriteriaElement} objects - */ - var $criteriaElements = array(); - - /** - * Conditions - * @var array - */ - var $conditions = array(); - - /** - * Constructor - * - * @param object $ele - * @param string $condition - **/ - function CriteriaCompo($ele=null, $condition='AND') - { - if (isset($ele) && is_object($ele)) { - $this->add($ele, $condition); - } - } - - /** - * Add an element - * - * @param object &$criteriaElement - * @param string $condition - * - * @return object reference to this collection - **/ - function &add(&$criteriaElement, $condition='AND') - { - $this->criteriaElements[] =& $criteriaElement; - $this->conditions[] = $condition; - return $this; - } - - /** - * Make the criteria into a query string - * - * @return string - */ - function render() - { - $ret = ''; - $count = count($this->criteriaElements); - if ($count > 0) { - $ret = '('. $this->criteriaElements[0]->render(); - for ($i = 1; $i < $count; $i++) { - $ret .= ' '.$this->conditions[$i].' '.$this->criteriaElements[$i]->render(); - } - $ret .= ')'; - } - return $ret; - } - - /** - * Make the criteria into a SQL "WHERE" clause - * - * @return string - */ - function renderWhere() - { - $ret = $this->render(); - $ret = ($ret != '') ? 'WHERE ' . $ret : $ret; - return $ret; - } - - /** - * Generate an LDAP filter from criteria - * - * @return string - * @author Nathan Dial ndial****@trill***** - */ - function renderLdap(){ - $retval = ''; - $count = count($this->criteriaElements); - if ($count > 0) { - $retval = $this->criteriaElements[0]->renderLdap(); - for ($i = 1; $i < $count; $i++) { - $cond = $this->conditions[$i]; - if(strtoupper($cond) == 'AND'){ - $op = '&'; - } elseif (strtoupper($cond)=='OR'){ - $op = '|'; - } - $retval = "($op$retval" . $this->criteriaElements[$i]->renderLdap().")"; - } - } - return $retval; - } -} - - -/** - * A single criteria - * - * @package kernel - * @subpackage database - * - * @author Kazumi Ono <onoka****@xoops*****> - * @copyright copyright (c) 2000-2003 XOOPS.org - */ -class Criteria extends CriteriaElement -{ - - /** - * @var string - */ - var $prefix; - var $function; - var $column; - var $operator; - var $value; - - /** - * Constructor - * - * @param string $column - * @param string $value - * @param string $operator - **/ - function Criteria($column, $value='', $operator='=', $prefix = '', $function = '') { - $this->prefix = $prefix; - $this->function = $function; - $this->column = $column; - $this->value = $value; - $this->operator = $operator; - } - - /** - * Make a sql condition string - * - * @return string - **/ - function render() { - if (is_numeric($this->value) || in_array(strtoupper($this->operator), array('IN', 'NOT IN'))) { - $value = $this->value; - } else { - if ( '' === ($value = trim($this->value)) ) { - return ''; - } - if ( (substr($value, 0, 1) != '`') && (substr($value, -1) != '`') ) { - $value = "'$value'"; - } - } - $clause = (!empty($this->prefix) ? "{$this->prefix}." : "") . $this->column; - if ( !empty($this->function) ) { - $clause = sprintf($this->function, $clause); - } - $clause .= " {$this->operator} $value"; - return $clause; - } - - /** - * Generate an LDAP filter from criteria - * - * @return string - * @author Nathan Dial ndial****@trill***** - */ - function renderLdap(){ - $clause = "(" . $this->column . $this->operator . $this->value . ")"; - return $clause; - } - - /** - * Make a SQL "WHERE" clause - * - * @return string - */ - function renderWhere() { - $cond = $this->render(); - return empty($cond) ? '' : "WHERE $cond"; - } -} -?> +<?php +// $Id: criteria.php,v 1.4 2005/06/28 07:45:05 onokazu Exp $ +// ------------------------------------------------------------------------ // +// XOOPS - PHP Content Management System // +// Copyright (c) 2000 XOOPS.org // +// <http://www.xoops.org/> // +// ------------------------------------------------------------------------ // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation; either version 2 of the License, or // +// (at your option) any later version. // +// // +// You may not change or alter any portion of this comment or credits // +// of supporting developers from this source code or any supporting // +// source code which is considered copyrighted (c) material of the // +// original comment or credit authors. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program; if not, write to the Free Software // +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // +// ------------------------------------------------------------------------ // +// Author: Kazumi Ono (AKA onokazu) // +// URL: http://www.myweb.ne.jp/, http://www.xoops.org/, http://jp.xoops.org/ // +// Project: The XOOPS Project // +// ------------------------------------------------------------------------- // +// Modified by: Nathan Dial // +// Date: 20 March 2003 // +// Desc: added experimental LDAP filter generation code // +// also refactored to remove about 20 lines of redundant code. // +// ------------------------------------------------------------------------- // + +/** + * + * + * @package kernel + * @subpackage database + * + * @author Kazumi Ono <onoka****@xoops*****> + * @copyright copyright (c) 2000-2003 XOOPS.org + */ + +/** + * A criteria (grammar?) for a database query. + * + * Abstract base class should never be instantiated directly. + * + * @abstract + * + * @package kernel + * @subpackage database + * + * @author Kazumi Ono <onoka****@xoops*****> + * @copyright copyright (c) 2000-2003 XOOPS.org + */ +class CriteriaElement +{ + /** + * Sort order + * @var string + */ + var $order = 'ASC'; + + /** + * @var string + */ + var $sort = ''; + + /** + * Number of records to retrieve + * @var int + */ + var $limit = 0; + + /** + * Offset of first record + * @var int + */ + var $start = 0; + + /** + * @var string + */ + var $groupby = ''; + + /** + * Constructor + **/ + function CriteriaElement() + { + + } + + /** + * Render the criteria element + */ + function render() + { + + } + + /**#@+ + * Accessor + */ + /** + * @param string $sort + */ + function setSort($sort) + { + $this->sort = $sort; + } + + /** + * @return string + */ + function getSort() + { + return $this->sort; + } + + /** + * @param string $order + */ + function setOrder($order) + { + if ('DESC' == strtoupper($order)) { + $this->order = 'DESC'; + } + } + + /** + * @return string + */ + function getOrder() + { + return $this->order; + } + + /** + * @param int $limit + */ + function setLimit($limit=0) + { + $this->limit = intval($limit); + } + + /** + * @return int + */ + function getLimit() + { + return $this->limit; + } + + /** + * @param int $start + */ + function setStart($start=0) + { + $this->start = intval($start); + } + + /** + * @return int + */ + function getStart() + { + return $this->start; + } + + /** + * @param string $group + */ + function setGroupby($group){ + $this->groupby = $group; + } + + /** + * @return string + */ + function getGroupby(){ + return ' GROUP BY '.$this->groupby; + } + /**#@-*/ +} + +/** + * Collection of multiple {@link CriteriaElement}s + * + * @package kernel + * @subpackage database + * + * @author Kazumi Ono <onoka****@xoops*****> + * @copyright copyright (c) 2000-2003 XOOPS.org + */ +class CriteriaCompo extends CriteriaElement +{ + + /** + * The elements of the collection + * @var array Array of {@link CriteriaElement} objects + */ + var $criteriaElements = array(); + + /** + * Conditions + * @var array + */ + var $conditions = array(); + + /** + * Constructor + * + * @param object $ele + * @param string $condition + **/ + function CriteriaCompo($ele=null, $condition='AND') + { + if (isset($ele) && is_object($ele)) { + $this->add($ele, $condition); + } + } + + /** + * Add an element + * + * @param object &$criteriaElement + * @param string $condition + * + * @return object reference to this collection + **/ + function &add(&$criteriaElement, $condition='AND') + { + $this->criteriaElements[] =& $criteriaElement; + $this->conditions[] = $condition; + return $this; + } + + /** + * Make the criteria into a query string + * + * @return string + */ + function render() + { + $ret = ''; + $count = count($this->criteriaElements); + if ($count > 0) { + $ret = '('. $this->criteriaElements[0]->render(); + for ($i = 1; $i < $count; $i++) { + $ret .= ' '.$this->conditions[$i].' '.$this->criteriaElements[$i]->render(); + } + $ret .= ')'; + } + return $ret; + } + + /** + * Make the criteria into a SQL "WHERE" clause + * + * @return string + */ + function renderWhere() + { + $ret = $this->render(); + $ret = ($ret != '') ? 'WHERE ' . $ret : $ret; + return $ret; + } + + /** + * Generate an LDAP filter from criteria + * + * @return string + * @author Nathan Dial ndial****@trill***** + */ + function renderLdap(){ + $retval = ''; + $count = count($this->criteriaElements); + if ($count > 0) { + $retval = $this->criteriaElements[0]->renderLdap(); + for ($i = 1; $i < $count; $i++) { + $cond = $this->conditions[$i]; + if(strtoupper($cond) == 'AND'){ + $op = '&'; + } elseif (strtoupper($cond)=='OR'){ + $op = '|'; + } + $retval = "($op$retval" . $this->criteriaElements[$i]->renderLdap().")"; + } + } + return $retval; + } +} + + +/** + * A single criteria + * + * @package kernel + * @subpackage database + * + * @author Kazumi Ono <onoka****@xoops*****> + * @copyright copyright (c) 2000-2003 XOOPS.org + */ +class Criteria extends CriteriaElement +{ + + /** + * @var string + */ + var $prefix; + var $function; + var $column; + var $operator; + var $value; + + /** + * Constructor + * + * @param string $column + * @param string $value + * @param string $operator + **/ + function Criteria($column, $value='', $operator='=', $prefix = '', $function = '') { + $this->prefix = $prefix; + $this->function = $function; + $this->column = $column; + $this->value = $value; + $this->operator = $operator; + } + + /** + * Make a sql condition string + * + * @return string + **/ + function render() { + if (is_numeric($this->value) || in_array(strtoupper($this->operator), array('IN', 'NOT IN'))) { + $value = $this->value; + } else { + if ( '' === ($value = trim($this->value)) ) { + return ''; + } + if ( (substr($value, 0, 1) != '`') && (substr($value, -1) != '`') ) { + $value = "'$value'"; + } + } + $clause = (!empty($this->prefix) ? "{$this->prefix}." : "") . $this->column; + if ( !empty($this->function) ) { + $clause = sprintf($this->function, $clause); + } + $clause .= " {$this->operator} $value"; + return $clause; + } + + /** + * Generate an LDAP filter from criteria + * + * @return string + * @author Nathan Dial ndial****@trill***** + */ + function renderLdap(){ + $clause = "(" . $this->column . $this->operator . $this->value . ")"; + return $clause; + } + + /** + * Make a SQL "WHERE" clause + * + * @return string + */ + function renderWhere() { + $cond = $this->render(); + return empty($cond) ? '' : "WHERE $cond"; + } +} + +/** + * @Deprecated + */ +class CriteriaString extends Criteria { + function render() { + if (is_numeric($this->value) || in_array(strtoupper($this->operator), array('IN', 'NOT IN'))) { + $value = "'".$this->value."'"; + } else { + if ( '' === ($value = trim($this->value)) ) { + return ''; + } + if ( (substr($value, 0, 1) != '`') && (substr($value, -1) != '`') ) { + $value = "'$value'"; + } + } + $clause = (!empty($this->prefix) ? "{$this->prefix}." : "") . $this->column; + if ( !empty($this->function) ) { + $clause = sprintf($this->function, $clause); + } + $clause .= " {$this->operator} $value"; + return $clause; + } +} +?>