Update of /cvsroot/mantisbt/mantisbt/core/adodb In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18331 Modified Files: xmlschema.dtd tohtml.inc.php toexport.inc.php server.php rsfilter.inc.php readme.txt pivottable.inc.php license.txt adodb.inc.php adodb-xmlschema.inc.php adodb-time.inc.php adodb-php4.inc.php adodb-perf.inc.php adodb-pear.inc.php adodb-pager.inc.php adodb-lib.inc.php adodb-iterator.inc.php adodb-exceptions.inc.php adodb-errorpear.inc.php adodb-errorhandler.inc.php adodb-error.inc.php adodb-datadict.inc.php adodb-csvlib.inc.php Added Files: xmlschema03.dtd adodb-xmlschema03.inc.php adodb-active-record.inc.php Log Message: Sync: V4.80 8 Mar 2006 of adodb Index: adodb-pear.inc.php =================================================================== RCS file: /cvsroot/mantisbt/mantisbt/core/adodb/adodb-pear.inc.php,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- adodb-pear.inc.php 12 Feb 2005 20:01:20 -0000 1.5 +++ adodb-pear.inc.php 22 Apr 2006 11:05:29 -0000 1.6 @@ -1,12 +1,12 @@ <?php -/** - * @version V4.60 24 Jan 2005 (c) 2000-2005 John Lim (jl...@na...). All rights reserved. - * Released under both BSD license and Lesser GPL library license. - * Whenever there is any discrepancy between the two licenses, - * the BSD license will take precedence. +/** + * @version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jl...@na...). All rights reserved. + * Released under both BSD license and Lesser GPL library license. + * Whenever there is any discrepancy between the two licenses, + * the BSD license will take precedence. * * Set tabs to 4 for best viewing. - * + * * PEAR DB Emulation Layer for ADODB. * * The following code is modelled on PEAR DB code by Stig Bakken <ss...@fa...> | @@ -15,7 +15,7 @@ /* We support: - + DB_Common --------- query - returns PEAR_Error on error @@ -27,13 +27,13 @@ quote nextID disconnect - + getOne getAssoc getRow getCol getAll - + DB_Result --------- numRows - returns -1 if not supported @@ -42,7 +42,7 @@ fetchRows - does not support passing of fetchmode free */ - + define('ADODB_PEAR',dirname(__FILE__)); include_once "PEAR.php"; include_once ADODB_PEAR."/adodb-errorpear.inc.php"; @@ -183,10 +183,10 @@ if (isset($dsninfo['socket'])) $dsninfo['hostspec'] .= ':'.$dsninfo['socket']; else if (isset($dsninfo['port'])) $dsninfo['hostspec'] .= ':'.$dsninfo['port']; - + if($persist) $ok = $obj->PConnect($dsninfo['hostspec'], $dsninfo['username'],$dsninfo['password'],$dsninfo['database']); else $ok = $obj->Connect($dsninfo['hostspec'], $dsninfo['username'],$dsninfo['password'],$dsninfo['database']); - + if (!$ok) $obj = ADODB_PEAR_Error(); return $obj; } @@ -212,7 +212,7 @@ { if (!is_object($value)) return false; $class = get_class($value); - return $class == 'pear_error' || is_subclass_of($value, 'pear_error') || + return $class == 'pear_error' || is_subclass_of($value, 'pear_error') || $class == 'db_error' || is_subclass_of($value, 'db_error'); } @@ -371,4 +371,4 @@ } } -?> +?> \ No newline at end of file Index: adodb-datadict.inc.php =================================================================== RCS file: /cvsroot/mantisbt/mantisbt/core/adodb/adodb-datadict.inc.php,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- adodb-datadict.inc.php 28 Feb 2005 07:20:56 -0000 1.7 +++ adodb-datadict.inc.php 22 Apr 2006 11:05:29 -0000 1.8 @@ -1,15 +1,15 @@ <?php /** - V4.60 24 Jan 2005 (c) 2000-2005 John Lim (jl...@na...). All rights reserved. - Released under both BSD license and Lesser GPL library license. - Whenever there is any discrepancy between the two licenses, + V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jl...@na...). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, the BSD license will take precedence. - + Set tabs to 4 for best viewing. - + DOCUMENTATION: - + See adodb/tests/test-datadict.php for docs and examples. */ @@ -42,13 +42,13 @@ /** Parse arguments, treat "text" (text) and 'text' as quotation marks. To escape, use "" or '' or )) - + Will read in "abc def" sans quotes, as: abc def Same with 'abc def'. However if `abc def`, then will read in as `abc def` - + @param endstmtchar Character that indicates end of statement - @param tokenchars Include the following characters in tokens apart from A-Z and 0-9 + @param tokenchars Include the following characters in tokens apart from A-Z and 0-9 @returns 2 dimensional array containing parsed tokens. */ function Lens_ParseArgs($args,$endstmtchar=',',$tokenchars='_.-') @@ -61,7 +61,8 @@ $tokens[$stmtno] = array(); $max = strlen($args); $quoted = false; - + $tokarr = array(); + while ($pos < $max) { $ch = substr($args,$pos,1); switch($ch) { @@ -76,17 +77,17 @@ } break; } - + $tokarr[] = $ch; break; - + case '`': if ($intoken) $tokarr[] = $ch; case '(': - case ')': + case ')': case '"': case "'": - + if ($intoken) { if (empty($endquote)) { $tokens[$stmtno][] = implode('',$tokarr); @@ -108,9 +109,9 @@ } } else $tokarr[] = $ch; - + }else { - + if ($ch == '(') $endquote = ')'; else $endquote = $ch; $quoted = true; @@ -119,27 +120,27 @@ if ($ch == '`') $tokarr[] = '`'; } break; - + default: - + if (!$intoken) { if ($ch == $endstmtchar) { $stmtno += 1; $tokens[$stmtno] = array(); break; } - + $intoken = true; $quoted = false; $endquote = false; $tokarr = array(); - + } - + if ($quoted) $tokarr[] = $ch; else if (ctype_alnum($ch) || strpos($tokenchars,$ch) !== false) $tokarr[] = $ch; else { - if ($ch == $endstmtchar) { + if ($ch == $endstmtchar) { $tokens[$stmtno][] = implode('',$tokarr); $stmtno += 1; $tokens[$stmtno] = array(); @@ -155,7 +156,7 @@ $pos += 1; } if ($intoken) $tokens[$stmtno][] = implode('',$tokarr); - + return $tokens; } @@ -164,13 +165,14 @@ var $connection; var $debug = false; var $dropTable = 'DROP TABLE %s'; - var $renameTable = 'RENAME TABLE %s TO %s'; + var $renameTable = 'RENAME TABLE %s TO %s'; var $dropIndex = 'DROP INDEX %s'; var $addCol = ' ADD'; var $alterCol = ' ALTER COLUMN'; var $dropCol = ' DROP COLUMN'; var $renameColumn = 'ALTER TABLE %s RENAME COLUMN %s TO %s'; // table, old-column, new-column, column-definitions (not used by default) var $nameRegex = '\w'; + var $nameRegexBrackets = 'a-zA-Z0-9_\(\)'; var $schema = false; var $serverInfo = array(); var $autoIncrement = false; @@ -178,73 +180,75 @@ var $invalidResizeTypes4 = array('CLOB','BLOB','TEXT','DATE','TIME'); // for changetablesql var $blobSize = 100; /// any varchar/char field this size or greater is treated as a blob /// in other words, we use a text area for editting. - + function GetCommentSQL($table,$col) { return false; } - + function SetCommentSQL($table,$col,$cmt) { return false; } - - function &MetaTables() + + function MetaTables() { if (!$this->connection->IsConnected()) return array(); return $this->connection->MetaTables(); } - - function &MetaColumns($tab, $upper=true, $schema=false) + + function MetaColumns($tab, $upper=true, $schema=false) { if (!$this->connection->IsConnected()) return array(); return $this->connection->MetaColumns($this->TableName($tab), $upper, $schema); } - - function &MetaPrimaryKeys($tab,$owner=false,$intkey=false) + + function MetaPrimaryKeys($tab,$owner=false,$intkey=false) { if (!$this->connection->IsConnected()) return array(); return $this->connection->MetaPrimaryKeys($this->TableName($tab), $owner, $intkey); } - - function &MetaIndexes($table, $primary = false, $owner = false) + + function MetaIndexes($table, $primary = false, $owner = false) { if (!$this->connection->IsConnected()) return array(); return $this->connection->MetaIndexes($this->TableName($table), $primary, $owner); } - + function MetaType($t,$len=-1,$fieldobj=false) { return ADORecordSet::MetaType($t,$len,$fieldobj); } - - function NameQuote($name = NULL) + + function NameQuote($name = NULL,$allowBrackets=false) { if (!is_string($name)) { return FALSE; } - + $name = trim($name); - + if ( !is_object($this->connection) ) { return $name; } - + $quote = $this->connection->nameQuote; - + // if name is of the form `name`, quote it if ( preg_match('/^`(.+)`$/', $name, $matches) ) { return $quote . $matches[1] . $quote; } - + // if name contains special characters, quote it - if ( !preg_match('/^[' . $this->nameRegex . ']+$/', $name) ) { + $regex = ($allowBrackets) ? $this->nameRegexBrackets : $this->nameRegex; + + if ( !preg_match('/^[' . $regex . ']+$/', $name) ) { return $quote . $name . $quote; } - + return $name; } - + function TableName($name) { if ( $this->schema ) { @@ -252,7 +256,7 @@ } return $this->NameQuote($name); } - + // Executes the sql array returned by GetTableSQL and GetIndexSQL function ExecuteSQLArray($sql, $continueOnError = true) { @@ -260,7 +264,7 @@ $conn = &$this->connection; $saved = $conn->debug; foreach($sql as $line) { - + if ($this->debug) $conn->debug = true; $ok = $conn->Execute($line); $conn->debug = $saved; @@ -272,43 +276,43 @@ } return $rez; } - + /* Returns the actual type given a character code. - + C: varchar X: CLOB (character large object) or largest varchar size if CLOB is not supported C2: Multibyte varchar X2: Multibyte CLOB - + B: BLOB (binary large object) - + D: Date - T: Date-time + T: Date-time L: Integer field suitable for storing booleans (0 or 1) I: Integer F: Floating point number N: Numeric or decimal number */ - + function ActualType($meta) { return $meta; } - + function CreateDatabase($dbname,$options=false) { $options = $this->_Options($options); $sql = array(); - + $s = 'CREATE DATABASE ' . $this->NameQuote($dbname); if (isset($options[$this->upperName])) $s .= ' '.$options[$this->upperName]; - + $sql[] = $s; return $sql; } - + /* Generates the SQL to create index. Returns an array of sql strings. */ @@ -317,24 +321,25 @@ if (!is_array($flds)) { $flds = explode(',',$flds); } - + foreach($flds as $key => $fld) { - $flds[$key] = $this->NameQuote($fld); + # some indexes can use partial fields, eg. index first 32 chars of "name" with NAME(32) + $flds[$key] = $this->NameQuote($fld,$allowBrackets=true); } - + return $this->_IndexSQL($this->NameQuote($idxname), $this->TableName($tabname), $flds, $this->_Options($idxoptions)); } - + function DropIndexSQL ($idxname, $tabname = NULL) { return array(sprintf($this->dropIndex, $this->NameQuote($idxname), $this->TableName($tabname))); } - + function SetSchema($schema) { $this->schema = $schema; } - + function AddColumnSQL($tabname, $flds) { $tabname = $this->TableName ($tabname); @@ -346,7 +351,7 @@ } return $sql; } - + /** * Change the definition of one column * @@ -369,7 +374,7 @@ } return $sql; } - + /** * Rename one column * @@ -390,7 +395,7 @@ } return array(sprintf($this->renameColumn,$tabname,$this->NameQuote($oldcolumn),$this->NameQuote($newcolumn),$column_def)); } - + /** * Drop one column * @@ -413,36 +418,36 @@ } return $sql; } - + function DropTableSQL($tabname) { return array (sprintf($this->dropTable, $this->TableName($tabname))); } - + function RenameTableSQL($tabname,$newname) { return array (sprintf($this->renameTable, $this->TableName($tabname),$this->TableName($newname))); - } - + } + /* Generate the SQL to create table. Returns an array of sql strings. */ function CreateTableSQL($tabname, $flds, $tableoptions=false) { if (!$tableoptions) $tableoptions = array(); - + list($lines,$pkey) = $this->_GenFields($flds, true); - + $taboptions = $this->_Options($tableoptions); $tabname = $this->TableName ($tabname); $sql = $this->_TableSQL($tabname,$lines,$pkey,$taboptions); - + $tsql = $this->_Triggers($tabname,$taboptions); foreach($tsql as $s) $sql[] = $s; - + return $sql; } - + function _GenFields($flds,$widespacing=false) { if (is_string($flds)) { @@ -456,7 +461,7 @@ foreach($f0 as $token) { switch (strtoupper($token)) { case 'CONSTRAINT': - case 'DEFAULT': + case 'DEFAULT': $hasparam = $token; break; default: @@ -467,7 +472,7 @@ } } $flds[] = $f1; - + } } $this->autoIncrement = false; @@ -475,7 +480,7 @@ $pkey = array(); foreach($flds as $fld) { $fld = _array_change_key_case($fld); - + $fname = false; $fdefault = false; $fautoinc = false; @@ -489,20 +494,20 @@ $fconstraint = false; $fnotnull = false; $funsigned = false; - + //----------------- // Parse attributes foreach($fld as $attr => $v) { if ($attr == 2 && is_numeric($v)) $attr = 'SIZE'; else if (is_numeric($attr) && $attr > 1 && !is_numeric($v)) $attr = strtoupper($v); - + switch($attr) { case '0': case 'NAME': $fname = $v; break; case '1': case 'TYPE': $ty = $v; $ftype = $this->ActualType(strtoupper($v)); break; - - case 'SIZE': + + case 'SIZE': $dotat = strpos($v,'.'); if ($dotat === false) $dotat = strpos($v,','); if ($dotat === false) $fsize = $v; else { @@ -524,35 +529,33 @@ case 'CONSTRAINT': $fconstraint = $v; break; } //switch } // foreach $fld - + //-------------------- // VALIDATE FIELD INFO if (!strlen($fname)) { if ($this->debug) ADOConnection::outp("Undefined NAME"); return false; } - + $fid = strtoupper(preg_replace('/^`(.+)`$/', '$1', $fname)); $fname = $this->NameQuote($fname); - + if (!strlen($ftype)) { if ($this->debug) ADOConnection::outp("Undefined TYPE for field '$fname'"); return false; } else { $ftype = strtoupper($ftype); } - + $ftype = $this->_GetSize($ftype, $ty, $fsize, $fprec); - - // plr - allow this for now as we use this until we identify what DB's dont allow this - //if ($ty == 'X' || $ty == 'X2' || $ty == 'B') $fnotnull = false; // some blob types do not accept nulls - + + if ($ty == 'X' || $ty == 'X2' || $ty == 'B') $fnotnull = false; // some blob types do not accept nulls + if ($fprimary) $pkey[] = $fname; - - // plr - allow this for now as we use this until we identify what DB's dont allow this + // some databases do not allow blobs to have defaults - //if ($ty == 'X') $fdefault = false; - + if ($ty == 'X') $fdefault = false; + //-------------------- // CONSTRUCT FIELD SQL if ($fdefts) { @@ -567,21 +570,21 @@ } else { $fdefault = $this->connection->sysDate; } - } else if (strlen($fdefault) && !$fnoquote) - if ($ty == 'C' or $ty == 'X' or + } else if ($fdefault !== false && !$fnoquote) + if ($ty == 'C' or $ty == 'X' or ( substr($fdefault,0,1) != "'" && !is_numeric($fdefault))) - if (strlen($fdefault) != 1 && substr($fdefault,0,1) == ' ' && substr($fdefault,strlen($fdefault)-1) == ' ') + if (strlen($fdefault) != 1 && substr($fdefault,0,1) == ' ' && substr($fdefault,strlen($fdefault)-1) == ' ') $fdefault = trim($fdefault); else if (strtolower($fdefault) != 'null') $fdefault = $this->connection->qstr($fdefault); $suffix = $this->_CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned); - + if ($widespacing) $fname = str_pad($fname,24); $lines[$fid] = $fname.' '.$ftype.$suffix; - + if ($fautoinc) $this->autoIncrement = true; } // foreach $flds - + return array($lines,$pkey); } /* @@ -598,56 +601,56 @@ } return $ftype; } - - + + // return string must begin with space function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint) - { + { $suffix = ''; if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; if ($fnotnull) $suffix .= ' NOT NULL'; if ($fconstraint) $suffix .= ' '.$fconstraint; return $suffix; } - + function _IndexSQL($idxname, $tabname, $flds, $idxoptions) { $sql = array(); - + if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { $sql[] = sprintf ($this->dropIndex, $idxname); if ( isset($idxoptions['DROP']) ) return $sql; } - + if ( empty ($flds) ) { return $sql; } - + $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : ''; - + $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' '; - + if ( isset($idxoptions[$this->upperName]) ) $s .= $idxoptions[$this->upperName]; - + if ( is_array($flds) ) $flds = implode(', ',$flds); $s .= '(' . $flds . ')'; $sql[] = $s; - + return $sql; } - + function _DropAutoIncrement($tabname) { return false; } - + function _TableSQL($tabname,$lines,$pkey,$tableoptions) { $sql = array(); - + if (isset($tableoptions['REPLACE']) || isset ($tableoptions['DROP'])) { $sql[] = sprintf($this->dropTable,$tabname); if ($this->autoIncrement) { @@ -664,19 +667,19 @@ $s .= ",\n PRIMARY KEY ("; $s .= implode(", ",$pkey).")"; } - if (isset($tableoptions['CONSTRAINTS'])) + if (isset($tableoptions['CONSTRAINTS'])) $s .= "\n".$tableoptions['CONSTRAINTS']; - - if (isset($tableoptions[$this->upperName.'_CONSTRAINTS'])) + + if (isset($tableoptions[$this->upperName.'_CONSTRAINTS'])) $s .= "\n".$tableoptions[$this->upperName.'_CONSTRAINTS']; - + $s .= "\n)"; if (isset($tableoptions[$this->upperName])) $s .= $tableoptions[$this->upperName]; $sql[] = $s; - + return $sql; } - + /* GENERATE TRIGGERS IF NEEDED used when table has auto-incrementing field that is emulated using triggers @@ -685,7 +688,7 @@ { return array(); } - + /* Sanitize options, so that array elements with no keys are promoted to keys */ @@ -699,31 +702,34 @@ } return $newopts; } - + /* "Florian Buzin [ easywe ]" <florian.buzin#easywe.de> - + This function changes/adds new fields to your table. You don't have to know if the col is new or not. It will check on its own. */ function ChangeTableSQL($tablename, $flds, $tableoptions = false) { global $ADODB_FETCH_MODE; - + $save = $ADODB_FETCH_MODE; $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; if ($this->connection->fetchMode !== false) $savem = $this->connection->SetFetchMode(false); - + // check table exists - $cols = &$this->MetaColumns($tablename); - + $save_handler = $this->connection->raiseErrorFn; + $this->connection->raiseErrorFn = ''; + $cols = $this->MetaColumns($tablename); + $this->connection->raiseErrorFn = $save_handler; + if (isset($savem)) $this->connection->SetFetchMode($savem); $ADODB_FETCH_MODE = $save; - - if ( empty($cols)) { + + if ( empty($cols)) { return $this->CreateTableSQL($tablename, $flds, $tableoptions); } - + if (is_array($flds)) { // Cycle through the update fields, comparing // existing fields to fields to update. @@ -732,9 +738,14 @@ $holdflds = array(); foreach($flds as $k=>$v) { if ( isset($cols[$k]) && is_object($cols[$k]) ) { + // If already not allowing nulls, then don't change + $obj = $cols[$k]; + if (isset($obj->not_null) && $obj->not_null) + $v = str_replace('NOT NULL','',$v); + $c = $cols[$k]; $ml = $c->max_length; - $mt = &$this->MetaType($c->type,$ml); + $mt = $this->MetaType($c->type,$ml); if ($ml == -1) $ml = ''; if ($mt == 'X') $ml = $v['SIZE']; if (($mt != $v['TYPE']) || $ml != $v['SIZE']) { @@ -742,11 +753,11 @@ } } else { $holdflds[$k] = $v; - } + } } $flds = $holdflds; } - + // already exists, alter table instead list($lines,$pkey) = $this->_GenFields($flds); @@ -755,19 +766,19 @@ foreach ( $lines as $id => $v ) { if ( isset($cols[$id]) && is_object($cols[$id]) ) { - + $flds = Lens_ParseArgs($v,','); - + // We are trying to change the size of the field, if not allowed, simply ignore the request. - if ($flds && in_array(strtoupper(substr($flds[0][1],0,4)),$this->invalidResizeTypes4)) continue; - + if ($flds && in_array(strtoupper(substr($flds[0][1],0,4)),$this->invalidResizeTypes4)) continue; + $sql[] = $alter . $this->alterCol . ' ' . $v; } else { $sql[] = $alter . $this->addCol . ' ' . $v; } } - + return $sql; } } // class -?> +?> \ No newline at end of file Index: adodb-pager.inc.php =================================================================== RCS file: /cvsroot/mantisbt/mantisbt/core/adodb/adodb-pager.inc.php,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- adodb-pager.inc.php 12 Feb 2005 20:01:20 -0000 1.5 +++ adodb-pager.inc.php 22 Apr 2006 11:05:29 -0000 1.6 @@ -1,22 +1,22 @@ <?php /* - V4.60 24 Jan 2005 (c) 2000-2005 John Lim (jl...@na...). All rights reserved. - Released under both BSD license and Lesser GPL library license. - Whenever there is any discrepancy between the two licenses, - the BSD license will take precedence. + V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jl...@na...). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. Set tabs to 4 for best viewing. - This class provides recordset pagination with - First/Prev/Next/Last links. - + This class provides recordset pagination with + First/Prev/Next/Last links. + Feel free to modify this class for your own use as - it is very basic. To learn how to use it, see the + it is very basic. To learn how to use it, see the example in adodb/tests/testpaging.php. - + "Pablo Costa" <pa...@cb...> implemented Render_PageLinks(). - - Please note, this class is entirely unsupported, + + Please note, this class is entirely unsupported, and no free support requests except for bug reports will be entertained by the author. @@ -29,10 +29,10 @@ var $curr_page; // current page number before Render() called, calculated in constructor var $rows; // number of rows per page var $linksPerPage=10; // number of links per page in navigation bar - var $showPageLinks; + var $showPageLinks; var $gridAttributes = 'width=100% border=1 bgcolor=white'; - + // Localize text strings here var $first = '<code>|<</code>'; var $prev = '<code><<</code>'; @@ -45,39 +45,39 @@ var $page = 'Page'; var $linkSelectedColor = 'red'; var $cache = 0; #secs to cache with CachePageExecute() - + //---------------------------------------------- // constructor // // $db adodb connection object // $sql sql statement - // $id optional id to identify which pager, - // if you have multiple on 1 page. + // $id optional id to identify which pager, + // if you have multiple on 1 page. // $id should be only be [a-z0-9]* // function ADODB_Pager(&$db,$sql,$id = 'adodb', $showPageLinks = false) { - global $HTTP_SERVER_VARS,$PHP_SELF,$HTTP_SESSION_VARS,$HTTP_GET_VARS; - + global $PHP_SELF; + $curr_page = $id.'_curr_page'; - if (empty($PHP_SELF)) $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF']; - + if (empty($PHP_SELF)) $PHP_SELF = htmlspecialchars($_SERVER['PHP_SELF']); // htmlspecialchars() to prevent XSS attacks + $this->sql = $sql; $this->id = $id; $this->db = $db; $this->showPageLinks = $showPageLinks; - - $next_page = $id.'_next_page'; - - if (isset($HTTP_GET_VARS[$next_page])) { - $HTTP_SESSION_VARS[$curr_page] = $HTTP_GET_VARS[$next_page]; + + $next_page = $id.'_next_page'; + + if (isset($_GET[$next_page])) { + $_SESSION[$curr_page] = (integer) $_GET[$next_page]; } - if (empty($HTTP_SESSION_VARS[$curr_page])) $HTTP_SESSION_VARS[$curr_page] = 1; ## at first page - - $this->curr_page = $HTTP_SESSION_VARS[$curr_page]; - + if (empty($_SESSION[$curr_page])) $_SESSION[$curr_page] = 1; ## at first page + + $this->curr_page = $_SESSION[$curr_page]; + } - + //--------------------------- // Display link to first page function Render_First($anchor=true) @@ -85,51 +85,51 @@ global $PHP_SELF; if ($anchor) { ?> - <a href="<?php echo $PHP_SELF,'?',$this->id;?>_next_page=1"><?php echo $this->first;?></a> + <a href="<?php echo $PHP_SELF,'?',$this->id;?>_next_page=1"><?php echo $this->first;?></a> <?php } else { print "$this->first "; } } - + //-------------------------- // Display link to next page function render_next($anchor=true) { global $PHP_SELF; - + if ($anchor) { ?> - <a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->AbsolutePage() + 1 ?>"><?php echo $this->next;?></a> + <a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->AbsolutePage() + 1 ?>"><?php echo $this->next;?></a> <?php } else { print "$this->next "; } } - + //------------------ // Link to last page - // + // // for better performance with large recordsets, you can set // $this->db->pageExecuteCountRows = false, which disables // last page counting. function render_last($anchor=true) { global $PHP_SELF; - + if (!$this->db->pageExecuteCountRows) return; - + if ($anchor) { ?> - <a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->LastPageNo() ?>"><?php echo $this->last;?></a> + <a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->LastPageNo() ?>"><?php echo $this->last;?></a> <?php } else { print "$this->last "; } } - + //--------------------------------------------------- - // original code by "Pablo Costa" <pa...@cb...> + // original code by "Pablo Costa" <pa...@cb...> function render_pagelinks() { global $PHP_SELF; @@ -146,21 +146,21 @@ $end = $start+$linksperpage-1; $link = $this->id . "_next_page"; if($end > $pages) $end = $pages; - - + + if ($this->startLinks && $start > 1) { $pos = $start - 1; $numbers .= "<a href=$PHP_SELF?$link=$pos>$this->startLinks</a> "; - } - + } + for($i=$start; $i <= $end; $i++) { if ($this->rs->AbsolutePage() == $i) $numbers .= "<font color=$this->linkSelectedColor><b>$i</b></font> "; - else + else $numbers .= "<a href=$PHP_SELF?$link=$i>$i</a> "; - + } - if ($this->moreLinks && $end < $pages) + if ($this->moreLinks && $end < $pages) $numbers .= "<a href=$PHP_SELF?$link=$i>$this->moreLinks</a> "; print $numbers . ' '; } @@ -170,13 +170,13 @@ global $PHP_SELF; if ($anchor) { ?> - <a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->AbsolutePage() - 1 ?>"><?php echo $this->prev;?></a> - <?php + <a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->AbsolutePage() - 1 ?>"><?php echo $this->prev;?></a> + <?php } else { print "$this->prev "; } } - + //-------------------------------------------------------- // Simply rendering of grid. You should override this for // better control over the format of the grid @@ -193,7 +193,7 @@ ob_end_clean(); return $s; } - + //------------------------------------------------------- // Navigation bar // @@ -222,7 +222,7 @@ ob_end_clean(); return $s; } - + //------------------- // This is the footer function RenderPageCount() @@ -233,17 +233,17 @@ if ($this->curr_page > $lastPage) $this->curr_page = 1; return "<font size=-1>$this->page ".$this->curr_page."/".$lastPage."</font>"; } - + //----------------------------------- // Call this class to draw everything. function Render($rows=10) { global $ADODB_COUNTRECS; - + $this->rows = $rows; - + if ($this->db->dataProvider == 'informix') $this->db->cursorType = IFX_SCROLL; - + $savec = $ADODB_COUNTRECS; if ($this->db->pageExecuteCountRows) $ADODB_COUNTRECS = true; if ($this->cache) @@ -251,26 +251,27 @@ else $rs = &$this->db->PageExecute($this->sql,$rows,$this->curr_page); $ADODB_COUNTRECS = $savec; - + $this->rs = &$rs; if (!$rs) { print "<h3>Query failed: $this->sql</h3>"; return; } - - if (!$rs->EOF && (!$rs->AtFirstPage() || !$rs->AtLastPage())) + + if (!$rs->EOF && (!$rs->AtFirstPage() || !$rs->AtLastPage())) $header = $this->RenderNav(); else $header = " "; - + $grid = $this->RenderGrid(); $footer = $this->RenderPageCount(); + + $this->RenderLayout($header,$grid,$footer); + $rs->Close(); $this->rs = false; - - $this->RenderLayout($header,$grid,$footer); } - + //------------------------------------------------------ // override this to control overall layout and formating function RenderLayout($header,$grid,$footer,$attributes='border=1 bgcolor=beige') @@ -286,4 +287,4 @@ } -?> +?> \ No newline at end of file Index: readme.txt =================================================================== RCS file: /cvsroot/mantisbt/mantisbt/core/adodb/readme.txt,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- readme.txt 12 Feb 2005 20:01:21 -0000 1.5 +++ readme.txt 22 Apr 2006 11:05:28 -0000 1.6 @@ -1,62 +1,62 @@ ->> ADODB Library for PHP4 - -(c) 2000-2004 John Lim (jl...@na...) - -Released under both BSD and GNU Lesser GPL library license. -This means you can use it in proprietary products. - - ->> Introduction - -PHP's database access functions are not standardised. This creates a -need for a database class library to hide the differences between the -different databases (encapsulate the differences) so we can easily -switch databases. - -We currently support MySQL, Interbase, Sybase, PostgreSQL, Oracle, -Microsoft SQL server, Foxpro ODBC, Access ODBC, Informix, DB2, -Sybase SQL Anywhere, generic ODBC and Microsoft's ADO. - -We hope more people will contribute drivers to support other databases. - - ->> Documentation and Examples - -Refer to the adodb/docs directory for full documentation and examples. -There is also a tutorial tute.htm that contrasts ADODB code with -mysql code. - - ->>> Files -Adodb.inc.php is the main file. You need to include only this file. - -Adodb-*.inc.php are the database specific driver code. - -Test.php contains a list of test commands to exercise the class library. - -Adodb-session.php is the PHP4 session handling code. - -Testdatabases.inc.php contains the list of databases to apply the tests on. - -Benchmark.php is a simple benchmark to test the throughput of a simple SELECT -statement for databases described in testdatabases.inc.php. The benchmark -tables are created in test.php. - -readme.htm is the main documentation. - -tute.htm is the tutorial. - - ->> More Info - -For more information, including installation see readme.htm -or visit - http://adodb.sourceforge.net/ - - ->> Feature Requests and Bug Reports - -Email to jl...@na... - - - +>> ADODB Library for PHP4 + +(c) 2000-2004 John Lim (jl...@na...) + +Released under both BSD and GNU Lesser GPL library license. +This means you can use it in proprietary products. + + +>> Introduction + +PHP's database access functions are not standardised. This creates a +need for a database class library to hide the differences between the +different databases (encapsulate the differences) so we can easily +switch databases. + +We currently support MySQL, Interbase, Sybase, PostgreSQL, Oracle, +Microsoft SQL server, Foxpro ODBC, Access ODBC, Informix, DB2, +Sybase SQL Anywhere, generic ODBC and Microsoft's ADO. + +We hope more people will contribute drivers to support other databases. + + +>> Documentation and Examples + +Refer to the adodb/docs directory for full documentation and examples. +There is also a tutorial tute.htm that contrasts ADODB code with +mysql code. + + +>>> Files +Adodb.inc.php is the main file. You need to include only this file. + +Adodb-*.inc.php are the database specific driver code. + +Test.php contains a list of test commands to exercise the class library. + +Adodb-session.php is the PHP4 session handling code. + +Testdatabases.inc.php contains the list of databases to apply the tests on. + +Benchmark.php is a simple benchmark to test the throughput of a simple SELECT +statement for databases described in testdatabases.inc.php. The benchmark +tables are created in test.php. + +readme.htm is the main documentation. + +tute.htm is the tutorial. + + +>> More Info + +For more information, including installation see readme.htm +or visit + http://adodb.sourceforge.net/ + + +>> Feature Requests and Bug Reports + +Email to jl...@na... + + + \ No newline at end of file Index: tohtml.inc.php =================================================================== RCS file: /cvsroot/mantisbt/mantisbt/core/adodb/tohtml.inc.php,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- tohtml.inc.php 12 Feb 2005 20:01:22 -0000 1.5 +++ tohtml.inc.php 22 Apr 2006 11:05:28 -0000 1.6 @@ -1,16 +1,17 @@ -<?php +<?php /* - V4.60 24 Jan 2005 (c) 2000-2005 John Lim (jl...@na...). All rights reserved. - Released under both BSD license and Lesser GPL library license. - Whenever there is any discrepancy between the two licenses, + V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jl...@na...). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, the BSD license will take precedence. - + Some pretty-printing by Chris Oxenreider <oxe...@st...> -*/ - +*/ + // specific code for tohtml -GLOBAL $gSQLMaxRows,$gSQLBlockRows; +GLOBAL $gSQLMaxRows,$gSQLBlockRows,$ADODB_ROUND; +$ADODB_ROUND=4; // rounding $gSQLMaxRows = 1000; // max no of rows to download $gSQLBlockRows=20; // max no of rows per table block @@ -35,59 +36,72 @@ // $rs->Close(); // // RETURNS: number of rows displayed + + function rs2html(&$rs,$ztabhtml=false,$zheaderarray=false,$htmlspecialchars=true,$echo = true) { $s ='';$rows=0;$docnt = false; -GLOBAL $gSQLMaxRows,$gSQLBlockRows; +GLOBAL $gSQLMaxRows,$gSQLBlockRows,$ADODB_ROUND; if (!$rs) { printf(ADODB_BAD_RS,'rs2html'); return false; } - + if (! $ztabhtml) $ztabhtml = "BORDER='1' WIDTH='98%'"; //else $docnt = true; $typearr = array(); $ncols = $rs->FieldCount(); $hdr = "<TABLE COLS=$ncols $ztabhtml><tr>\n\n"; - for ($i=0; $i < $ncols; $i++) { + for ($i=0; $i < $ncols; $i++) { $field = $rs->FetchField($i); - if ($zheaderarray) $fname = $zheaderarray[$i]; - else $fname = htmlspecialchars($field->name); - $typearr[$i] = $rs->MetaType($field->type,$field->max_length); - //print " $field->name $field->type $typearr[$i] "; - + if ($field) { + if ($zheaderarray) $fname = $zheaderarray[$i]; + else $fname = htmlspecialchars($field->name); + $typearr[$i] = $rs->MetaType($field->type,$field->max_length); + //print " $field->name $field->type $typearr[$i] "; + } else { + $fname = 'Field '.($i+1); + $typearr[$i] = 'C'; + } if (strlen($fname)==0) $fname = ' '; $hdr .= "<TH>$fname</TH>"; } $hdr .= "\n</tr>"; if ($echo) print $hdr."\n\n"; else $html = $hdr; - + // smart algorithm - handles ADODB_FETCH_MODE's correctly by probing... $numoffset = isset($rs->fields[0]) ||isset($rs->fields[1]) || isset($rs->fields[2]); while (!$rs->EOF) { - + $s .= "<TR valign=top>\n"; - + for ($i=0; $i < $ncols; $i++) { if ($i===0) $v=($numoffset) ? $rs->fields[0] : reset($rs->fields); else $v = ($numoffset) ? $rs->fields[$i] : next($rs->fields); - + $type = $typearr[$i]; switch($type) { case 'D': - if (!strpos($v,':')) { + if (empty($v)) $s .= "<TD> </TD>\n"; + else if (!strpos($v,':')) { $s .= " <TD>".$rs->UserDate($v,"D d, M Y") ." </TD>\n"; - break; } + break; case 'T': - $s .= " <TD>".$rs->UserTimeStamp($v,"D d, M Y, h:i:s") ." </TD>\n"; + if (empty($v)) $s .= "<TD> </TD>\n"; + else $s .= " <TD>".$rs->UserTimeStamp($v,"D d, M Y, h:i:s") ." </TD>\n"; break; - case 'I': + case 'N': + if (abs($v) - round($v,0) < 0.00000001) + $v = round($v); + else + $v = round($v,$ADODB_ROUND); + case 'I': $s .= " <TD align=right>".stripslashes((trim($v))) ." </TD>\n"; - + break; /* case 'B': @@ -114,11 +128,11 @@ $v = trim($v); if (strlen($v) == 0) $v = ' '; $s .= " <TD>". str_replace("\n",'<br>',stripslashes($v)) ."</TD>\n"; - + } } // for $s .= "</TR>\n\n"; - + $rows += 1; if ($rows >= $gSQLMaxRows) { $rows = "<p>Truncated at $gSQLMaxRows</p>"; @@ -126,10 +140,10 @@ } // switch $rs->MoveNext(); - + // additional EOF check to prevent a widow header if (!$rs->EOF && $rows % $gSQLBlockRows == 0) { - + //if (connection_aborted()) break;// not needed as PHP aborts script, unlike ASP if ($echo) print $s . "</TABLE>\n\n"; else $html .= $s ."</TABLE>\n\n"; @@ -139,17 +153,17 @@ if ($echo) print $s."</TABLE>\n\n"; else $html .= $s."</TABLE>\n\n"; - + if ($docnt) if ($echo) print "<H2>".$rows." Rows</H2>"; - + return ($echo) ? $rows : $html; } - + // pass in 2 dimensional array function arr2html(&$arr,$ztabhtml='',$zheaderarray='') { if (!$ztabhtml) $ztabhtml = 'BORDER=1'; - + $s = "<TABLE $ztabhtml>";//';print_r($arr); if ($zheaderarray) { @@ -159,11 +173,11 @@ } $s .= "\n</TR>"; } - + for ($i=0; $i<sizeof($arr); $i++) { $s .= '<TR>'; $a = &$arr[$i]; - if (is_array($a)) + if (is_array($a)) for ($j=0; $j<sizeof($a); $j++) { $val = $a[$j]; if (empty($val)) $val = ' '; @@ -178,4 +192,4 @@ print $s; } -?> +?> \ No newline at end of file Index: adodb-time.inc.php =================================================================== RCS file: /cvsroot/mantisbt/mantisbt/core/adodb/adodb-time.inc.php,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- adodb-time.inc.php 12 Feb 2005 20:01:20 -0000 1.6 +++ adodb-time.inc.php 22 Apr 2006 11:05:29 -0000 1.7 @@ -1,34 +1,36 @@ <?php /** ADOdb Date Library, part of the ADOdb abstraction library -Download: http://php.weblogs.com/adodb_date_time_library +Download: http://phplens.com/phpeverywhere/ PHP native date functions use integer timestamps for computations. -Because of this, dates are restricted to the years 1901-2038 on Unix -and 1970-2038 on Windows due to integer overflow for dates beyond -those years. This library overcomes these limitations by replacing the -native function's signed integers (normally 32-bits) with PHP floating [...1259 lines suppressed...] + case 'w': $fmtdate .= '?w'; $parseu = true; break; // wrong strftime=1-based, date=0-based + case 'W': $fmtdate .= '?W'; $parseU = true; break;// wrong strftime=1-based, date=0-based + case 'y': $fmtdate .= 'y'; break; + case 'Y': $fmtdate .= 'Y'; break; + case 'Z': $fmtdate .= 'T'; break; + } + } else if (('A' <= ($ch) && ($ch) <= 'Z' ) || ('a' <= ($ch) && ($ch) <= 'z' )) + $fmtdate .= "\\".$ch; + else + $fmtdate .= $ch; + } + //echo "fmt=",$fmtdate,"<br>"; + if ($ts === false) $ts = time(); + $ret = adodb_date($fmtdate, $ts, $is_gmt); + return $ret; +} + + +?> \ No newline at end of file Index: adodb-errorhandler.inc.php =================================================================== RCS file: /cvsroot/mantisbt/mantisbt/core/adodb/adodb-errorhandler.inc.php,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- adodb-errorhandler.inc.php 12 Feb 2005 20:01:19 -0000 1.5 +++ adodb-errorhandler.inc.php 22 Apr 2006 11:05:29 -0000 1.6 @@ -1,6 +1,6 @@ <?php /** - * @version V4.60 24 Jan 2005 (c) 2000-2005 John Lim (jl...@na...). All rights reserved. + * @version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jl...@na...). All rights reserved. * Released under both BSD license and Lesser GPL library license. * Whenever there is any discrepancy between the two licenses, * the BSD license will take precedence. @@ -13,7 +13,7 @@ // added Claudio Bustos clbustos#entelchile.net -if (!defined('ADODB_ERROR_HANDLER_TYPE')) define('ADODB_ERROR_HANDLER_TYPE',E_USER_ERROR); +if (!defined('ADODB_ERROR_HANDLER_TYPE')) define('ADODB_ERROR_HANDLER_TYPE',E_USER_ERROR); if (!defined('ADODB_ERROR_HANDLER')) define('ADODB_ERROR_HANDLER','ADODB_Error_Handler'); @@ -74,6 +74,6 @@ //print "<p>$s</p>"; - trigger_error($s,ADODB_ERROR_HANDLER_TYPE); + trigger_error($s,ADODB_ERROR_HANDLER_TYPE); } ?> --- NEW FILE: xmlschema03.dtd --- <?xml version="1.0"?> <!DOCTYPE adodb_schema [ <!ELEMENT schema (table*, sql*)> <!ATTLIST schema version CDATA #REQUIRED> <!ELEMENT table (descr?, (field+|DROP), constraint*, opt*, index*, data*)> <!ATTLIST table name CDATA #REQUIRED platform CDATA #IMPLIED version CDATA #IMPLIED> <!ELEMENT field (descr?, (NOTNULL|KEY|PRIMARY)?, (AUTO|AUTOINCREMENT)?, (DEFAULT|DEFDATE|DEFTIMESTAMP)?, NOQUOTE?, UNSIGNED?, constraint*, opt*)> <!ATTLIST field name CDATA #REQUIRED type (C|C2|X|X2|B|D|T|L|I|F|N) #REQUIRED size CDATA #IMPLIED opts CDATA #IMPLIED> <!ELEMENT data (descr?, row+)> <!ATTLIST data platform CDATA #IMPLIED> <!ELEMENT row (f+)> <!ELEMENT f (#CDATA)> <!ATTLIST f name CDATA #IMPLIED> <!ELEMENT descr (#CDATA)> <!ELEMENT NOTNULL EMPTY> <!ELEMENT KEY EMPTY> <!ELEMENT PRIMARY EMPTY> <!ELEMENT AUTO EMPTY> <!ELEMENT AUTOINCREMENT EMPTY> <!ELEMENT DEFAULT EMPTY> <!ATTLIST DEFAULT value CDATA #REQUIRED> <!ELEMENT DEFDATE EMPTY> <!ELEMENT DEFTIMESTAMP EMPTY> <!ELEMENT NOQUOTE EMPTY> <!ELEMENT UNSIGNED EMPTY> <!ELEMENT DROP EMPTY> <!ELEMENT constraint (#CDATA)> <!ATTLIST constraint platform CDATA #IMPLIED> <!ELEMENT opt (#CDATA)> <!ATTLIST opt platform CDATA #IMPLIED> <!ELEMENT index ((col+|DROP), CLUSTERED?, BITMAP?, UNIQUE?, FULLTEXT?, HASH?, descr?)> <!ATTLIST index name CDATA #REQUIRED platform CDATA #IMPLIED> <!ELEMENT col (#CDATA)> <!ELEMENT CLUSTERED EMPTY> <!ELEMENT BITMAP EMPTY> <!ELEMENT UNIQUE EMPTY> <!ELEMENT FULLTEXT EMPTY> <!ELEMENT HASH EMPTY> <!ELEMENT sql (query+, descr?)> <!ATTLIST sql name CDATA #IMPLIED platform CDATA #IMPLIED, key CDATA, prefixmethod (AUTO|MANUAL|NONE)> <!ELEMENT query (#CDATA)> <!ATTLIST query platform CDATA #IMPLIED> ]> Index: adodb-perf.inc.php =================================================================== RCS file: /cvsroot/mantisbt/mantisbt/core/adodb/adodb-perf.inc.php,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- adodb-perf.inc.php 12 Feb 2005 20:01:20 -0000 1.3 +++ adodb-perf.inc.php 22 Apr 2006 11:05:29 -0000 1.4 @@ -1,24 +1,51 @@ <?php -/* -V4.60 24 Jan 2005 (c) 2000-2005 John Lim (jl...@na...). All rights reserved. - Released under both BSD license and Lesser GPL library license. - Whenever there is any discrepancy between the two licenses, - the BSD license will take precedence. See License.txt. +/* +V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jl...@na...). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. See License.txt. [...996 lines suppressed...] + $conn = $this->conn; + if ( !$conn) return false; + + $tables = $conn->MetaTables( 'TABLES'); + if ( !$tables ) return false; + foreach( $tables as $table) { + if ( !$this->optimizeTable( $table)) { + return false; + } + } + + return true; + } + // end hack +} -?> +?> \ No newline at end of file --- NEW FILE: adodb-active-record.inc.php --- <?php /* @version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved. Latest version is available at http://adodb.sourceforge.net Released under both BSD license and Lesser GPL library license. Whenever there is any discrepancy between the two licenses, the BSD license will take precedence. Active Record implementation. Superset of Zend Framework's. Version 0.02 */ global $_ADODB_ACTIVE_DBS; // array of ADODB_Active_DB's, indexed by ADODB_Active_Record->_dbat $_ADODB_ACTIVE_DBS = array(); class ADODB_Active_DB { var $db; // ADOConnection var $tables; // assoc array of ADODB_Active_Table objects, indexed by tablename } class ADODB_Active_Table { var $name; // table name var $flds; // assoc array of adofieldobjs, indexed by fieldname var $keys; // assoc array of primary keys, indexed by fieldname } // returns index into $_ADODB_ACTIVE_DBS function ADODB_SetDatabaseAdapter(&$db) { global $_ADODB_ACTIVE_DBS; foreach($_ADODB_ACTIVE_DBS as $k => $d) { if ($d->db == $db) return $k; } $obj = new ADODB_Active_DB(); $obj->db =& $db; $obj->tables = array(); $_ADODB_ACTIVE_DBS[] = $obj; return sizeof($_ADODB_ACTIVE_DBS)-1; } class ADODB_Active_Record { var $_dbat; // associative index pointing to ADODB_Active_DB eg. $ADODB_Active_DBS[_dbat] var $_table; // tablename var $_tableat; // associative index pointing to ADODB_Active_Table, eg $ADODB_Active_DBS[_dbat]->tables[$this->_tableat] var $_where; // where clause set in Load() var $_saved = false; // indicates whether data is already inserted. var $_lasterr = false; // last error message // should be static function SetDatabaseAdapter(&$db) { return ADODB_SetDatabaseAdapter($db); } // php4 constructor function ADODB_Active_Record($table = false, $pkeyarr=false, $db=false) { ADODB_Active_Record::__construct($table,$pkeyarr,$db); } // php5 constructor function __construct($table = false, $pkeyarr=false, $db=false) { global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS; if ($db == false && is_object($pkeyarr)) { $db = $pkeyarr; $pkeyarr = false; } if (!$table) $table = $this->_pluralize(get_class($this)); if ($db) { $this->_dbat = ADODB_Active_Record::SetDatabaseAdapter($db); } else $this->_dbat = sizeof($_ADODB_ACTIVE_DBS)-1; if ($this->_dbat < 0) $this->Error("No database connection set; use ADOdb_Active_Record::SetDatabaseAdapter(\$db)",'ADODB_Active_Record::__constructor'); $this->_table = $table; $this->_tableat = $table; # reserved for setting the assoc value to a non-table name, eg. the sql string in future $this->UpdateActiveTable($pkeyarr); } function _pluralize($table) { $ut = strtoupper($table); $len = strlen($table); $lastc = $ut[$len-1]; $lastc2 = substr($ut,$len-2); switch ($lastc) { case 'S': return $table.'es'; case 'Y': return substr($table,0,$len-1).'ies'; case 'X': return $table.'es'; case 'H': if ($lastc2 == 'CH' || $lastc2 == 'SH') return $table.'es'; default: return $table.'s'; } } ////////////////////////////////// // update metadata function UpdateActiveTable($pkeys=false,$forceUpdate=false) { global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS; $activedb =& $_ADODB_ACTIVE_DBS[$this->_dbat]; $table = $this->_table; $tables = $activedb->tables; $tableat = $this->_tableat; if (!$forceUpdate && !empty($tables[$tableat])) { $tobj =& $tables[$tableat]; foreach($tobj->flds as $name => $fld) $this->$name = null; return; } $activetab = new ADODB_Active_Table(); $activetab->name = $table; $db =& $activedb->db; $cols = $db->MetaColumns($table); if (!$cols) { $this->Error("Invalid table name: $table",'UpdateActiveTable'); return false; } $fld = reset($cols); if (!$pkeys) { if (isset($fld->primary_key)) { $pkeys = array(); foreach($cols as $name => $fld) { if (!empty($fld->primary_key)) $pkeys[] = $name; } } else $pkeys = $this->GetPrimaryKeys($db, $table); } if (empty($pkeys)) { $this->Error("No primary key found for table $table",'UpdateActiveTable'); return false; } $attr = array(); $keys = array(); switch($ADODB_ASSOC_CASE) { case 0: foreach($cols as $name => $fldobj) { $name = strtolower($name); $this->$name = null; $attr[$name] = $fldobj; } foreach($pkeys as $k => $name) { $keys[strtolower($name)] = strtolower($name); } break; case 1: foreach($cols as $name => $fldobj) { $name = strtoupper($name); $this->$name = null; $attr[$name] = $fldobj; } foreach($pkeys as $k => $name) { $keys[strtoupper($name)] = strtoupper($name); } break; default: foreach($cols as $name => $fldobj) { $name = ($name); $this->$name = null; $attr[$name] = $fldobj; } foreach($pkeys as $k => $name) { $keys[$name] = ($name); } break; } $activetab->keys = $keys; $activetab->flds = $attr; $activedb->tables[$table] = $activetab; } function GetPrimaryKeys(&$db, $table) { return $db->MetaPrimaryKeys($table); } // error handler for both PHP4+5. function Error($err,$fn) { global $_ADODB_ACTIVE_DBS; $fn = get_class($this).'::'.$fn; $this->_lasterr = $fn.': '.$err; if ($this->_dbat < 0) $db = false; else { $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; $db =& $activedb->db; } if (function_exists('adodb_throw')) { if (!$db) adodb_throw('ADOdb_Active_Record', $fn, -1, $err, 0, 0, false); else adodb_throw($db->databaseType, $fn, -1, $err, 0, 0, $db); } else if (!$db || $db->debug) ADOConnection::outp($this->_lasterr); } // return last error message function ErrorMsg() { if (!function_exists('adodb_throw')) { if ($this->_dbat < 0) $db = false; else $db = $this->DB(); // last error could be database error too if ($db && $db->ErrorMsg()) return $db->ErrorMsg(); } return $this->_lasterr; } // retrieve ADOConnection from _ADODB_Active_DBs function &DB() { global $_ADODB_ACTIVE_DBS; if ($this->_dbat < 0) { $false = false; $this->Error("No database connection set: use ADOdb_Active_Record::SetDatabaseAdaptor(\$db)", "DB"); return $false; } $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; $db =& $activedb->db; return $db; } // retrieve ADODB_Active_Table function &TableInfo() { global $_ADODB_ACTIVE_DBS; $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; $table =& $activedb->tables[$this->_tableat]; return $table; } // set a numeric array (using natural table field ordering) as object properties function Set(&$row) { $db =& $this->DB(); if (!$row) { $this->_saved = false; return false; } $this->_saved = true; $table =& $this->TableInfo(); if (sizeof($table->flds) != sizeof($row)) { $this->Error("Table structure of $this->_table has changed","Load"); return false; } $cnt = 0; foreach($table->flds as $name=>$fld) { $this->$name = $row[$cnt]; $cnt += 1; } #$this->_original =& $row; return true; } // get last inserted id for INSERT function LastInsertID(&$db,$fieldname) { if ($db->hasInsertID) $val = $db->Insert_ID($this->_table,$fieldname); else $val = false; if (is_null($val) || $val === false) { // this might not work reliably in multi-user environment return $db->GetOne("select max(".$fieldname.") from ".$this->_table); } return $val; } // quote data in where clause function doquote(&$db, $val,$t) { switch($t) { case 'D': case 'T': if (empty($val)) return 'null'; case 'C': case 'X': if (is_null($val)) return 'null'; if (strncmp($val,"'",1) != 0 && substr($val,strlen($val)-1,1) != "'") { return $db->qstr($val); break; } default: return $val; break; } } // generate where clause for an UPDATE/SELECT function GenWhere(&$db, &$table) { $keys = $table->keys; $parr = array(); foreach($keys as $k) { $f = $table->flds[$k]; if ($f) { $parr[] = $k.' = '.$this->doquote($db,$this->$k,$db->MetaType($f->type)); } } return implode(' and ', $parr); } //------------------------------------------------------------ Public functions below function Load($where,$bindarr=false) { $db =& $this->DB(); if (!$db) return false; $this->_where = $where; $save = $db->SetFetchMode(ADODB_FETCH_NUM); $row = $db->GetRow("select * from ".$this->_table.' WHERE '.$where,$bindarr); $db->SetFetchMode($save); return $this->Set($row); } // false on error function Save() { if ($this->_saved) $ok = $this->Update(); else $ok = $this->Insert(); return $ok; } // false on error function Insert() { $db =& $this->DB(); if (!$db) return false; $cnt = 0; $table =& $this->TableInfo(); foreach($table->flds as $name=>$fld) { $val = $this->$name; /* if (is_null($val)) { if (isset($fld->not_null) && $fld->not_null) { if (isset($fld->default_value) && strlen($fld->default_value)) continue; else $this->Error("Cannot insert null into $name","Insert"); } }*/ $valarr[] = $val; $names[] = $name; $valstr[] = $db->Param($cnt); $cnt += 1; } $sql = 'INSERT INTO '.$this->_table."(".implode(',',$names).') VALUES ('.implode(',',$valstr).')'; $ok = $db->Execute($sql,$valarr); if ($ok) { $this->_saved = true; $autoinc = false; foreach($table->keys as $k) { if (is_null($this->$k)) { $autoinc = true; break; } } if ($autoinc && sizeof($table->keys) == 1) { $k = reset($table->keys); $this->$k = $this->LastInsertID($db,$k); } } #$this->_original =& $valarr; return !empty($ok); } function Delete() { $db =& $this->DB(); if (!$db) return false; $table =& $this->TableInfo(); $where = $this->GenWhere($db,$table); $sql = 'DELETE FROM '.$this->_table.' WHERE '.$where; $db->Execute($sql); } // returns 0 on error, 1 on update, 2 on insert function Replace() { global $ADODB_ASSOC_CASE; $db =& $this->DB(); if (!$db) return false; $table =& $this->TableInfo(); $pkey = $table->keys; foreach($table->flds as $name=>$fld) { $val = $this->$name; /* if (is_null($val)) { if (isset($fld->not_null) && $fld->not_null) { if (isset($fld->default_value) && strlen($fld->default_value)) continue; else { $this->Error("Cannot update null into $name","Replace"); return false; } } }*/ $t = $db->MetaType($fld->type); $arr[$name] = $this->doquote($db,$val,$t); $valarr[] = $val; } if (!is_array($pkey)) $pkey = array($pkey); if ($ADODB_ASSOC_CASE == 0) foreach($pkey as $k => $v) $pkey[$k] = strtolower($v); elseif ($ADODB_ASSOC_CASE == 0) foreach($pkey as $k => $v) $pkey[$k] = strtoupper($v); $ok = $db->Replace($this->_table,$arr,$pkey); if ($ok) { $this->_saved = true; // 1= update 2=insert if ($ok == 2) { $autoinc = false; foreach($table->keys as $k) { if (is_null($this->$k)) { $autoinc = true; break; } } if ($autoinc && sizeof($table->keys) == 1) { $k = reset($table->keys); $this->$k = $this->LastInsertID($db,$k); } } #$this->_original =& $valarr; } return $ok; } // returns false on error function Update() { $db =& $this->DB(); if (!$db) return false; $table =& $this->TableInfo(); $where = $this->GenWhere($db, $table); if (!$where) { $this->error("Where missing for table $table", "Update"); return false; } $cnt = 0; foreach($table->flds as $name=>$fld) { if (isset($table->keys[$name])) continue; $val = $this->$name; if (is_null($val)) { if (isset($fld->not_null) && $fld->not_null) { if (isset($fld->default_value) && strlen($fld->default_value)) continue; else { $this->Error("Cannot set field $name to NULL","Update"); return false; } } } $valarr[] = $val; $pairs[] = $name.'='.$db->Param($cnt); $cnt += 1; } #$this->_original =& $valarr; $sql = 'UPDATE '.$this->_table." SET ".implode(",",$pairs)." WHERE ".$where; $ok = $db->Execute($sql,$valarr); return !empty($ok); } function GetAttributeNames() { $table =& $this->TableInfo(); if (!$table) return false; return array_keys($table->flds); } }; ?> Index: adodb-iterator.inc.php =================================================================== RCS file: /cvsroot/mantisbt/mantisbt/core/adodb/adodb-iterator.inc.php,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- adodb-iterator.inc.php 12 Feb 2005 20:01:20 -0000 1.3 +++ adodb-iterator.inc.php 22 Apr 2006 11:05:29 -0000 1.4 @@ -1,65 +1,65 @@ <?php /* - V4.60 24 Jan 2005 (c) 2000-2005 John Lim (jl...@na...). All rights reserved. - Released under both BSD license and Lesser GPL library license. - Whenever there is any discrepancy between the two licenses, + V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jl...@na...). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, the BSD license will take precedence. - + Set tabs to 4. - - Declares the ADODB Base Class for PHP5 "ADODB_BASE_RS", and supports iteration with + + Declares the ADODB Base Class for PHP5 "ADODB_BASE_RS", and supports iteration with the ADODB_Iterator class. - + $rs = $db->Execute("select * from adoxyz"); foreach($rs as $k => $v) { echo $k; print_r($v); echo "<br>"; } - - + + Iterator code based on http://cvs.php.net/cvs.php/php-src/ext/spl/examples/cachingiterator.inc?login=2 */ - + class ADODB_Iterator implements Iterator { private $rs; - function __construct($rs) + function __construct($rs) { $this->rs = $rs; } - function rewind() + function rewind() { $this->rs->MoveFirst(); } - function valid() + function valid() { return !$this->rs->EOF; } - - function key() + + function key() { return $this->rs->_currentRow; } - - function current() + + function current() { return $this->rs->fields; } - - function next() + + function next() { $this->rs->MoveNext(); } - + function __call($func, $params) { return call_user_func_array(array($this->rs, $func), $params); } - + function hasMore() { return !$this->rs->EOF; @@ -72,13 +72,14 @@ function getIterator() { return new ADODB_Iterator($this); } - + /* this is experimental - i don't really know what to return... */ function __toString() { include_once(ADODB_DIR.'/toexport.inc.php'); return _adodb_export($this,',',',',false,true); } -} +} -?> + +?> \ No newline at end of file Index: pivottable.inc.php =================================================================== RCS file: /cvsroot/mantisbt/mantisbt/core/adodb/pivottable.inc.php,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- pivottable.inc.php 12 Feb 2005 20:01:21 -0000 1.5 +++ pivottable.inc.php 22 Apr 2006 11:05:28 -0000 1.6 @@ -1,19 +1,19 @@ <?php -/** - * @version V4.50 6 July 2004 (c) 2000-2005 John Lim (jl...@na...). All rights reserved. - * Released under both BSD license and Lesser GPL library license. - * Whenever there is any discrepancy between the two licenses, - * the BSD license will take precedence. +/** + * @version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jl...@na...). All rights reserved. + * Released under both BSD license and Lesser GPL library license. + * Whenever there is any discrepancy between the two licenses, + * the BSD license will take precedence. * * Set tabs to 4 for best viewing. - * + * * Latest version is available at http://php.weblogs.... [truncated message content] |