Changeset 24913
- Timestamp:
- 11/26/08 10:17:00 (6 weeks ago)
- Location:
- development/main/includes/classes/adodb
- Files:
-
- 7 added
- 9 removed
- 113 modified
- 1 moved
-
adodb-active-record.inc.php (modified) (25 diffs)
-
adodb-active-recordx.inc.php (added)
-
adodb-csvlib.inc.php (modified) (4 diffs)
-
adodb-datadict.inc.php (modified) (4 diffs)
-
adodb-errorhandler.inc.php (modified) (1 diff)
-
adodb-error.inc.php (modified) (2 diffs)
-
adodb-errorpear.inc.php (modified) (1 diff)
-
adodb-exceptions.inc.php (modified) (1 diff)
-
adodb.inc.php (modified) (49 diffs)
-
adodb-iterator.inc.php (modified) (1 diff)
-
adodb-lib.inc.php (modified) (11 diffs)
-
adodb-memcache.lib.inc.php (modified) (2 diffs)
-
adodb-pager.inc.php (modified) (1 diff)
-
adodb-pear.inc.php (modified) (2 diffs)
-
adodb-perf.inc.php (modified) (10 diffs)
-
adodb-php4.inc.php (modified) (1 diff)
-
adodb-time.inc.php (modified) (16 diffs)
-
adodb-time.zip (deleted)
-
adodb-xmlschema03.inc.php (modified) (1 diff)
-
adodb-xmlschema.inc.php (modified) (1 diff)
-
datadict/datadict-access.inc.php (modified) (1 diff)
-
datadict/datadict-db2.inc.php (modified) (1 diff)
-
datadict/datadict-firebird.inc.php (modified) (1 diff)
-
datadict/datadict-generic.inc.php (modified) (1 diff)
-
datadict/datadict-ibase.inc.php (modified) (1 diff)
-
datadict/datadict-informix.inc.php (modified) (1 diff)
-
datadict/datadict-mssql.inc.php (modified) (2 diffs)
-
datadict/datadict-mssqlnative.inc.php (added)
-
datadict/datadict-mysql.inc.php (modified) (1 diff)
-
datadict/datadict-oci8.inc.php (modified) (2 diffs)
-
datadict/datadict-postgres.inc.php (modified) (5 diffs)
-
datadict/datadict-sapdb.inc.php (modified) (1 diff)
-
datadict/datadict-sybase.inc.php (modified) (1 diff)
-
docs-adodb.htm (deleted)
-
docs-datadict.htm (deleted)
-
docs/docs-active-record.htm (modified) (16 diffs)
-
docs/docs-adodb.htm (modified) (53 diffs)
-
docs/docs-datadict.htm (modified) (1 diff)
-
docs/docs-perf.htm (modified) (3 diffs)
-
docs/docs-session.htm (modified) (1 diff)
-
docs-perf.htm (deleted)
-
docs/readme_zikula.txt (moved) (moved from development/main/includes/classes/adodb/readme_postnuke.txt) (1 diff, 1 prop)
-
docs-session.htm (deleted)
-
drivers/adodb-access.inc.php (modified) (1 diff)
-
drivers/adodb-ado5.inc.php (modified) (2 diffs)
-
drivers/adodb-ado_access.inc.php (modified) (1 diff)
-
drivers/adodb-ado.inc.php (modified) (2 diffs)
-
drivers/adodb-ado_mssql.inc.php (modified) (2 diffs)
-
drivers/adodb-borland_ibase.inc.php (modified) (1 diff)
-
drivers/adodb-csv.inc.php (modified) (1 diff)
-
drivers/adodb-db2.inc.php (modified) (4 diffs)
-
drivers/adodb-fbsql.inc.php (modified) (1 diff)
-
drivers/adodb-firebird.inc.php (modified) (1 diff)
-
drivers/adodb-ibase.inc.php (modified) (1 diff)
-
drivers/adodb-informix72.inc.php (modified) (1 diff)
-
drivers/adodb-informix.inc.php (modified) (1 diff)
-
drivers/adodb-ldap.inc.php (modified) (5 diffs)
-
drivers/adodb-mssql.inc.php (modified) (13 diffs)
-
drivers/adodb-mssqlnative.inc.php (added)
-
drivers/adodb-mssql_n.inc.php (modified) (5 diffs)
-
drivers/adodb-mssqlpo.inc.php (modified) (1 diff)
-
drivers/adodb-mysqli.inc.php (modified) (19 diffs)
-
drivers/adodb-mysql.inc.php (modified) (9 diffs)
-
drivers/adodb-mysqlpo.inc.php (modified) (1 diff)
-
drivers/adodb-mysqlt.inc.php (modified) (1 diff)
-
drivers/adodb-netezza.inc.php (modified) (1 diff)
-
drivers/adodb-oci805.inc.php (modified) (1 diff)
-
drivers/adodb-oci8.inc.php (modified) (15 diffs)
-
drivers/adodb-oci8.old.inc.php (added)
-
drivers/adodb-oci8po.inc.php (modified) (2 diffs)
-
drivers/adodb-odbc_db2.inc.php (modified) (1 diff)
-
drivers/adodb-odbc.inc.php (modified) (1 diff)
-
drivers/adodb-odbc_mssql.inc.php (modified) (2 diffs)
-
drivers/adodb-odbc_oracle.inc.php (modified) (1 diff)
-
drivers/adodb-odbtp.inc.php (modified) (4 diffs)
-
drivers/adodb-odbtp_unicode.inc.php (modified) (1 diff)
-
drivers/adodb-oracle.inc.php (modified) (1 diff)
-
drivers/adodb-pdo.inc.php (modified) (4 diffs)
-
drivers/adodb-pdo_mssql.inc.php (modified) (1 diff)
-
drivers/adodb-pdo_mysql.inc.php (modified) (4 diffs)
-
drivers/adodb-pdo_oci.inc.php (modified) (1 diff)
-
drivers/adodb-pdo_pgsql.inc.php (modified) (1 diff)
-
drivers/adodb-pdo_sqlite.inc.php (added)
-
drivers/adodb-postgres64.inc.php (modified) (3 diffs)
-
drivers/adodb-postgres7.inc.php (modified) (2 diffs)
-
drivers/adodb-postgres8.inc.php (modified) (1 diff)
-
drivers/adodb-postgres.inc.php (modified) (1 diff)
-
drivers/adodb-proxy.inc.php (modified) (1 diff)
-
drivers/adodb-sapdb.inc.php (modified) (1 diff)
-
drivers/adodb-sqlanywhere.inc.php (modified) (1 diff)
-
drivers/adodb-sqlite.inc.php (modified) (1 diff)
-
drivers/adodb-sqlitepo.inc.php (modified) (1 diff)
-
drivers/adodb-sybase_ase.inc.php (modified) (1 diff)
-
drivers/adodb-sybase.inc.php (modified) (8 diffs)
-
drivers/adodb-vfp.inc.php (modified) (1 diff)
-
lang/adodb-ar.inc.php (modified) (1 diff)
-
lang/adodb-bg.inc.php (modified) (1 diff)
-
lang/adodb-bgutf8.inc.php (modified) (1 diff)
-
lang/adodb-ca.inc.php (modified) (1 diff)
-
lang/adodb-en.inc.php (modified) (1 diff)
-
lang/adodb-fa.inc.php (added)
-
lang/adodb-pl.inc.php (modified) (1 diff)
-
lang/adodb-ro.inc.php (modified) (1 diff)
-
lang/adodb_th.inc.php (modified) (1 diff)
-
old-changelog.htm (deleted)
-
perf/perf-db2.inc.php (modified) (1 diff)
-
perf/perf-informix.inc.php (modified) (1 diff)
-
perf/perf-mssql.inc.php (modified) (1 diff)
-
perf/perf-mssqlnative.inc.php (added)
-
perf/perf-mysql.inc.php (modified) (1 diff)
-
perf/perf-oci8.inc.php (modified) (11 diffs)
-
perf/perf-postgres.inc.php (modified) (2 diffs)
-
pivottable.inc.php (modified) (1 diff)
-
readme.htm (deleted)
-
rsfilter.inc.php (modified) (1 diff)
-
session/adodb-compress-bzip2.php (modified) (1 diff)
-
session/adodb-compress-gzip.php (modified) (1 diff)
-
session/adodb-cryptsession2.php (modified) (1 diff)
-
session/adodb-cryptsession.php (modified) (1 diff)
-
session/adodb-encrypt-mcrypt.php (modified) (1 diff)
-
session/adodb-encrypt-md5.php (modified) (1 diff)
-
session/adodb-encrypt-secret.php (modified) (1 diff)
-
session/adodb-session2.php (modified) (37 diffs)
-
session/adodb-session-clob2.php (modified) (1 diff)
-
session/adodb-session-clob.php (modified) (1 diff)
-
session/adodb-session.php (modified) (4 diffs)
-
tips_portable_sql.htm (deleted)
-
toexport.inc.php (modified) (2 diffs)
-
tohtml.inc.php (modified) (4 diffs)
-
tute.htm (deleted)
Legend:
- Unmodified
- Added
- Removed
-
development/main/includes/classes/adodb/adodb-active-record.inc.php
r22485 r24913 2 2 /* 3 3 4 @version V5.0 0 05 Feb 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.4 @version V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved. 5 5 Latest version is available at http://adodb.sourceforge.net 6 6 … … 11 11 Active Record implementation. Superset of Zend Framework's. 12 12 13 Version 0. 0713 Version 0.90 14 14 15 15 See http://www-128.ibm.com/developerworks/java/library/j-cb03076/?ca=dgr-lnxw01ActiveRecord … … 17 17 */ 18 18 19 19 20 global $_ADODB_ACTIVE_DBS; 20 21 global $ADODB_ACTIVE_CACHESECS; // set to true to enable caching of metadata such as field info 21 22 global $ACTIVE_RECORD_SAFETY; // set to false to disable safety checks 23 global $ADODB_ACTIVE_DEFVALS; // use default values of table definition when creating new active record. 22 24 23 25 // array of ADODB_Active_DB's, indexed by ADODB_Active_Record->_dbat 24 26 $_ADODB_ACTIVE_DBS = array(); 25 27 $ACTIVE_RECORD_SAFETY = true; 28 $ADODB_ACTIVE_DEFVALS = false; 26 29 27 30 class ADODB_Active_DB { … … 35 38 var $keys; // assoc array of primary keys, indexed by fieldname 36 39 var $_created; // only used when stored as a cached file 40 var $_belongsTo = array(); 41 var $_hasMany = array(); 37 42 } 38 43 … … 62 67 63 68 class ADODB_Active_Record { 69 static $_changeNames = true; // dynamically pluralize table names 70 static $_foreignSuffix = '_id'; // 64 71 var $_dbat; // associative index pointing to ADODB_Active_DB eg. $ADODB_Active_DBS[_dbat] 65 72 var $_table; // tablename, if set in class definition then use it as table name … … 69 76 var $_lasterr = false; // last error message 70 77 var $_original = false; // the original values loaded or inserted, refreshed on update 71 78 79 var $foreignName; // CFR: class name when in a relationship 80 81 static function UseDefaultValues($bool=null) 82 { 83 global $ADODB_ACTIVE_DEFVALS; 84 if (isset($bool)) $ADODB_ACTIVE_DEFVALS = $bool; 85 return $ADODB_ACTIVE_DEFVALS; 86 } 87 72 88 // should be static 73 function SetDatabaseAdapter(&$db)89 static function SetDatabaseAdapter(&$db) 74 90 { 75 91 return ADODB_SetDatabaseAdapter($db); 76 92 } 77 93 78 // php4 constructor 79 function ADODB_Active_Record($table = false, $pkeyarr=false, $db=false) 80 { 81 ADODB_Active_Record::__construct($table,$pkeyarr,$db); 94 95 public function __set($name, $value) 96 { 97 $name = str_replace(' ', '_', $name); 98 $this->$name = $value; 82 99 } 83 100 … … 96 113 else $table = $this->_pluralize(get_class($this)); 97 114 } 115 $this->foreignName = strtolower(get_class($this)); // CFR: default foreign name 98 116 if ($db) { 99 117 $this->_dbat = ADODB_Active_Record::SetDatabaseAdapter($db); … … 106 124 $this->_table = $table; 107 125 $this->_tableat = $table; # reserved for setting the assoc value to a non-table name, eg. the sql string in future 126 108 127 $this->UpdateActiveTable($pkeyarr); 109 128 } … … 117 136 function _pluralize($table) 118 137 { 138 if (!ADODB_Active_Record::$_changeNames) return $table; 139 119 140 $ut = strtoupper($table); 120 141 $len = strlen($table); … … 136 157 } 137 158 159 // CFR Lamest singular inflector ever - @todo Make it real! 160 // Note: There is an assumption here...and it is that the argument's length >= 4 161 function _singularize($tables) 162 { 163 164 if (!ADODB_Active_Record::$_changeNames) return $table; 165 166 $ut = strtoupper($tables); 167 $len = strlen($tables); 168 if($ut[$len-1] != 'S') 169 return $tables; // I know...forget oxen 170 if($ut[$len-2] != 'E') 171 return substr($tables, 0, $len-1); 172 switch($ut[$len-3]) 173 { 174 case 'S': 175 case 'X': 176 return substr($tables, 0, $len-2); 177 case 'I': 178 return substr($tables, 0, $len-3) . 'y'; 179 case 'H'; 180 if($ut[$len-4] == 'C' || $ut[$len-4] == 'S') 181 return substr($tables, 0, $len-2); 182 default: 183 return substr($tables, 0, $len-1); // ? 184 } 185 } 186 187 function hasMany($foreignRef, $foreignKey = false) 188 { 189 $ar = new ADODB_Active_Record($foreignRef); 190 $ar->foreignName = $foreignRef; 191 $ar->UpdateActiveTable(); 192 $ar->foreignKey = ($foreignKey) ? $foreignKey : $foreignRef.ADODB_Active_Record::$_foreignSuffix; 193 $table =& $this->TableInfo(); 194 $table->_hasMany[$foreignRef] = $ar; 195 # $this->$foreignRef = $this->_hasMany[$foreignRef]; // WATCHME Removed assignment by ref. to please __get() 196 } 197 198 function belongsTo($foreignRef,$foreignKey=false, $parentKey='') 199 { 200 global $inflector; 201 202 $ar = new ADODB_Active_Record($this->_pluralize($foreignRef)); 203 $ar->foreignName = $foreignRef; 204 $ar->parentKey = $parentKey; 205 $ar->UpdateActiveTable(); 206 $ar->foreignKey = ($foreignKey) ? $foreignKey : $foreignRef.ADODB_Active_Record::$_foreignSuffix; 207 208 $table =& $this->TableInfo(); 209 $table->_belongsTo[$foreignRef] = $ar; 210 # $this->$foreignRef = $this->_belongsTo[$foreignRef]; 211 } 212 213 /** 214 * __get Access properties - used for lazy loading 215 * 216 * @param mixed $name 217 * @access protected 218 * @return mixed 219 */ 220 function __get($name) 221 { 222 return $this->LoadRelations($name, '', -1, -1); 223 } 224 225 /** 226 * @param string $name 227 * @param string $whereOrderBy : eg. ' AND field1 = value ORDER BY field2' 228 * @param offset 229 * @param limit 230 * @return mixed 231 */ 232 function LoadRelations($name, $whereOrderBy='', $offset=-1,$limit=-1) 233 { 234 $extras = array(); 235 $table = $this->TableInfo(); 236 if ($limit >= 0) $extras['limit'] = $limit; 237 if ($offset >= 0) $extras['offset'] = $offset; 238 239 if (strlen($whereOrderBy)) 240 if (!preg_match('/^[ \n\r]*AND/i',$whereOrderBy)) 241 if (!preg_match('/^[ \n\r]*ORDER[ \n\r]/i',$whereOrderBy)) 242 $whereOrderBy = 'AND '.$whereOrderBy; 243 244 if(!empty($table->_belongsTo[$name])) 245 { 246 $obj = $table->_belongsTo[$name]; 247 $columnName = $obj->foreignKey; 248 if(empty($this->$columnName)) 249 $this->$name = null; 250 else 251 { 252 if ($obj->parentKey) $key = $obj->parentKey; 253 else $key = reset($table->keys); 254 255 $arrayOfOne = $obj->Find($key.'='.$this->$columnName.' '.$whereOrderBy,false,false,$extras); 256 if ($arrayOfOne) { 257 $this->$name = $arrayOfOne[0]; 258 return $arrayOfOne[0]; 259 } 260 } 261 } 262 if(!empty($table->_hasMany[$name])) 263 { 264 $obj = $table->_hasMany[$name]; 265 $objs = $obj->Find($obj->foreignKey.'='.$this->id. ' '.$whereOrderBy,false,false,$extras); 266 if (!$objs) $objs = array(); 267 $this->$name = $objs; 268 return $objs; 269 } 270 271 return array(); 272 } 138 273 ////////////////////////////////// 139 274 … … 142 277 { 143 278 global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS , $ADODB_CACHE_DIR, $ADODB_ACTIVE_CACHESECS; 144 279 global $ADODB_ACTIVE_DEFVALS; 280 145 281 $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; 146 282 … … 149 285 $tableat = $this->_tableat; 150 286 if (!$forceUpdate && !empty($tables[$tableat])) { 287 151 288 $tobj = $tables[$tableat]; 152 foreach($tobj->flds as $name => $fld) 289 foreach($tobj->flds as $name => $fld) { 290 if ($ADODB_ACTIVE_DEFVALS && isset($fld->default_value)) 291 $this->$name = $fld->default_value; 292 else 153 293 $this->$name = null; 294 } 154 295 return; 155 296 } 156 157 297 $db = $activedb->db; 158 298 $fname = $ADODB_CACHE_DIR . '/adodb_' . $db->databaseType . '_active_'. $table . '.cache'; … … 204 344 foreach($cols as $name => $fldobj) { 205 345 $name = strtolower($name); 206 $this->$name = null; 346 if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) 347 $this->$name = $fldobj->default_value; 348 else 349 $this->$name = null; 207 350 $attr[$name] = $fldobj; 208 351 } … … 215 358 foreach($cols as $name => $fldobj) { 216 359 $name = strtoupper($name); 217 $this->$name = null; 360 361 if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) 362 $this->$name = $fldobj->default_value; 363 else 364 $this->$name = null; 218 365 $attr[$name] = $fldobj; 219 366 } … … 226 373 foreach($cols as $name => $fldobj) { 227 374 $name = ($fldobj->name); 228 $this->$name = null; 375 376 if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) 377 $this->$name = $fldobj->default_value; 378 else 379 $this->$name = null; 229 380 $attr[$name] = $fldobj; 230 381 } … … 244 395 adodb_write_file($fname,$s); 245 396 } 397 if (isset($activedb->tables[$table])) { 398 $oldtab = $activedb->tables[$table]; 399 400 if ($oldtab) $activetab->_belongsTo = $oldtab->_belongsTo; 401 if ($oldtab) $activetab->_hasMany = $oldtab->_hasMany; 402 } 246 403 $activedb->tables[$table] = $activetab; 247 404 } … … 312 469 313 470 // retrieve ADODB_Active_Table 314 function TableInfo()471 function &TableInfo() 315 472 { 316 473 global $_ADODB_ACTIVE_DBS; … … 321 478 } 322 479 480 481 // I have an ON INSERT trigger on a table that sets other columns in the table. 482 // So, I find that for myTable, I want to reload an active record after saving it. -- Malcolm Cook 483 function Reload() 484 { 485 $db =& $this->DB(); if (!$db) return false; 486 $table =& $this->TableInfo(); 487 $where = $this->GenWhere($db, $table); 488 return($this->Load($where)); 489 } 490 491 323 492 // set a numeric array (using natural table field ordering) as object properties 324 493 function Set(&$row) … … 337 506 $table = $this->TableInfo(); 338 507 if ($ACTIVE_RECORD_SAFETY && sizeof($table->flds) != sizeof($row)) { 508 # <AP> 509 $bad_size = TRUE; 510 if (sizeof($row) == 2 * sizeof($table->flds)) { 511 // Only keep string keys 512 $keys = array_filter(array_keys($row), 'is_string'); 513 if (sizeof($keys) == sizeof($table->flds)) 514 $bad_size = FALSE; 515 } 516 if ($bad_size) { 339 517 $this->Error("Table structure of $this->_table has changed","Load"); 340 518 return false; 341 519 } 342 343 $cnt = 0; 520 # </AP> 521 } 522 else 523 $keys = array_keys($row); 524 525 # <AP> 526 reset($keys); 527 $this->_original = array(); 344 528 foreach($table->flds as $name=>$fld) { 345 $this->$name = $row[$cnt]; 346 $cnt += 1; 347 } 348 $this->_original
