<?php
  include_once '../doc-typo3-funcs.php';
  $doxygen_vars = array(	"title" => "TYPO3 4.0.1: typo3_src-4.0.1/typo3/sysext/adodb/adodb/adodb-active-record.inc.php Source File",
				"datetime" => "Sat Dec 2 19:22:24 2006",
				"date" => "2 Dec 2006",
				"doxygenversion" => "1.4.6",
				"projectname" => "TYPO3 4.0.1",
				"projectnumber" => "4.0.1"
			);
  get_header($doxygen_vars);
?>
<!-- Generated by Doxygen 1.4.6 -->
<div class="tabs">
  <ul>
    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
    <li><a href="classes.html"><span>Classes</span></a></li>
    <li id="current"><a href="files.html"><span>Files</span></a></li>
    <li><a href="dirs.html"><span>Directories</span></a></li>
    <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
    <li><a href="examples.html"><span>Examples</span></a></li>
    <li>
      <form action="search.php" method="get">
        <table cellspacing="0" cellpadding="0" border="0">
          <tr>
            <td><label>&nbsp;<u>S</u>earch&nbsp;for&nbsp;</label></td>
            <td><input type="text" name="query" value="" size="20" accesskey="s"/></td>
          </tr>
        </table>
      </form>
    </li>
  </ul></div>
<div class="nav">
<a class="el" href="dir_c8daf1ad746050abf985cc546c89e248.html">typo3_src-4.0.1</a>&nbsp;&raquo&nbsp;<a class="el" href="dir_18071ae4545d8b3e0364d30c0659c74a.html">typo3</a>&nbsp;&raquo&nbsp;<a class="el" href="dir_57bf1ed8249c1fd5b014486d01bcb27a.html">sysext</a>&nbsp;&raquo&nbsp;<a class="el" href="dir_e81b1679233d44b74aed493d6fe8e943.html">adodb</a>&nbsp;&raquo&nbsp;<a class="el" href="dir_1f526b87ad011e46f671ba6e798564e1.html">adodb</a></div>
<h1>adodb-active-record.inc.php</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
<a name="l00002"></a>00002 <span class="comment">/*</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment">@version V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.</span>
<a name="l00005"></a>00005 <span class="comment">  Latest version is available at http://adodb.sourceforge.net</span>
<a name="l00006"></a>00006 <span class="comment"> </span>
<a name="l00007"></a>00007 <span class="comment">  Released under both BSD license and Lesser GPL library license. </span>
<a name="l00008"></a>00008 <span class="comment">  Whenever there is any discrepancy between the two licenses, </span>
<a name="l00009"></a>00009 <span class="comment">  the BSD license will take precedence.</span>
<a name="l00010"></a>00010 <span class="comment">  </span>
<a name="l00011"></a>00011 <span class="comment">  Active Record implementation. Superset of Zend Framework's.</span>
<a name="l00012"></a>00012 <span class="comment">  </span>
<a name="l00013"></a>00013 <span class="comment">  Version 0.04</span>
<a name="l00014"></a>00014 <span class="comment">  </span>
<a name="l00015"></a>00015 <span class="comment">  See http://www-128.ibm.com/developerworks/java/library/j-cb03076/?ca=dgr-lnxw01ActiveRecord </span>
<a name="l00016"></a>00016 <span class="comment">        for info on Ruby on Rails Active Record implementation</span>
<a name="l00017"></a>00017 <span class="comment">*/</span>
<a name="l00018"></a>00018 
<a name="l00019"></a>00019 global $_ADODB_ACTIVE_DBS;
<a name="l00020"></a>00020 global $ADODB_ACTIVE_CACHESECS; <span class="comment">// set to true to enable caching of metadata such as field info</span>
<a name="l00021"></a>00021 
<a name="l00022"></a>00022 <span class="comment">// array of ADODB_Active_DB's, indexed by ADODB_Active_Record-&gt;_dbat</span>
<a name="l00023"></a>00023 $_ADODB_ACTIVE_DBS = array();
<a name="l00024"></a>00024 
<a name="l00025"></a>00025 
<a name="l00026"></a><a class="code" href="classADODB__Active__DB.html">00026</a> <span class="keyword">class </span><a class="code" href="classADODB__Active__DB.html">ADODB_Active_DB</a> {
<a name="l00027"></a><a class="code" href="classADODB__Active__DB.html#e47e9649f2c507994fac1dfa55af65f3">00027</a>         var <a class="code" href="classADODB__Active__DB.html#e47e9649f2c507994fac1dfa55af65f3">$db</a>; <span class="comment">// ADOConnection</span>
<a name="l00028"></a><a class="code" href="classADODB__Active__DB.html#dc95934ead3afdb7d7f2e48d90e05273">00028</a>         var <a class="code" href="classADODB__Active__DB.html#dc95934ead3afdb7d7f2e48d90e05273">$tables</a>; <span class="comment">// assoc array of ADODB_Active_Table objects, indexed by tablename</span>
<a name="l00029"></a>00029 }
<a name="l00030"></a>00030 
<a name="l00031"></a><a class="code" href="classADODB__Active__Table.html">00031</a> <span class="keyword">class </span><a class="code" href="classADODB__Active__Table.html">ADODB_Active_Table</a> {
<a name="l00032"></a><a class="code" href="classADODB__Active__Table.html#9169ab656da6d4cb2656518ed6436ae9">00032</a>         var <a class="code" href="classADODB__Active__Table.html#9169ab656da6d4cb2656518ed6436ae9">$name</a>; <span class="comment">// table name</span>
<a name="l00033"></a><a class="code" href="classADODB__Active__Table.html#8647f94ddcd537cf19c913b8bca9e66b">00033</a>         var <a class="code" href="classADODB__Active__Table.html#8647f94ddcd537cf19c913b8bca9e66b">$flds</a>; <span class="comment">// assoc array of adofieldobjs, indexed by fieldname</span>
<a name="l00034"></a><a class="code" href="classADODB__Active__Table.html#4274c0201d63a74acf6dcb35601346e4">00034</a>         var <a class="code" href="classADODB__Active__Table.html#4274c0201d63a74acf6dcb35601346e4">$keys</a>; <span class="comment">// assoc array of primary keys, indexed by fieldname</span>
<a name="l00035"></a><a class="code" href="classADODB__Active__Table.html#af58cbc873d586b40b30dfcd498215f4">00035</a>         var <a class="code" href="classADODB__Active__Table.html#af58cbc873d586b40b30dfcd498215f4">$_created</a>; <span class="comment">// only used when stored as a cached file</span>
<a name="l00036"></a>00036 }
<a name="l00037"></a>00037 
<a name="l00038"></a>00038 <span class="comment">// returns index into $_ADODB_ACTIVE_DBS</span>
<a name="l00039"></a>00039 function ADODB_SetDatabaseAdapter(&amp;$db)
<a name="l00040"></a>00040 {
<a name="l00041"></a>00041         global $_ADODB_ACTIVE_DBS;
<a name="l00042"></a>00042         
<a name="l00043"></a>00043                 foreach($_ADODB_ACTIVE_DBS as $k =&gt; $d) {
<a name="l00044"></a>00044                         <span class="keywordflow">if</span> ($d-&gt;db == $db) <span class="keywordflow">return</span> $k;
<a name="l00045"></a>00045                 }
<a name="l00046"></a>00046                 
<a name="l00047"></a>00047                 $obj = <span class="keyword">new</span> <a class="code" href="classADODB__Active__DB.html">ADODB_Active_DB</a>();
<a name="l00048"></a>00048                 $obj-&gt;db =&amp; $db;
<a name="l00049"></a>00049                 $obj-&gt;tables = array();
<a name="l00050"></a>00050                 
<a name="l00051"></a>00051                 $_ADODB_ACTIVE_DBS[] = $obj;
<a name="l00052"></a>00052                 
<a name="l00053"></a>00053                 <span class="keywordflow">return</span> <span class="keyword">sizeof</span>($_ADODB_ACTIVE_DBS)-1;
<a name="l00054"></a>00054 }
<a name="l00055"></a>00055 
<a name="l00056"></a>00056 
<a name="l00057"></a><a class="code" href="classADODB__Active__Record.html">00057</a> <span class="keyword">class </span><a class="code" href="classADODB__Active__Record.html">ADODB_Active_Record</a> {
<a name="l00058"></a><a class="code" href="classADODB__Active__Record.html#b430dd7d170ecf74d41858bfb1c2c428">00058</a>         var <a class="code" href="classADODB__Active__Record.html#b430dd7d170ecf74d41858bfb1c2c428">$_dbat</a>; <span class="comment">// associative index pointing to ADODB_Active_DB eg. $ADODB_Active_DBS[_dbat]</span>
<a name="l00059"></a><a class="code" href="classADODB__Active__Record.html#1b28477c2f25415497b666877726feac">00059</a>         var <a class="code" href="classADODB__Active__Record.html#1b28477c2f25415497b666877726feac">$_table</a>; <span class="comment">// tablename, if set in class definition then use it as table name</span>
<a name="l00060"></a><a class="code" href="classADODB__Active__Record.html#4f4dd3e286d8e38c1b6ea86b390e4937">00060</a>         var <a class="code" href="classADODB__Active__Record.html#4f4dd3e286d8e38c1b6ea86b390e4937">$_tableat</a>; <span class="comment">// associative index pointing to ADODB_Active_Table, eg $ADODB_Active_DBS[_dbat]-&gt;tables[$this-&gt;_tableat]</span>
<a name="l00061"></a><a class="code" href="classADODB__Active__Record.html#88ac2b2fa01bb5296f2ad68bffdb6624">00061</a>         var <a class="code" href="classADODB__Active__Record.html#88ac2b2fa01bb5296f2ad68bffdb6624">$_where</a>; <span class="comment">// where clause set in Load()</span>
<a name="l00062"></a><a class="code" href="classADODB__Active__Record.html#51c46ee0885228e84297d29d3a4e8db1">00062</a>         var <a class="code" href="classADODB__Active__Record.html#51c46ee0885228e84297d29d3a4e8db1">$_saved</a> = <span class="keyword">false</span>; <span class="comment">// indicates whether data is already inserted.</span>
<a name="l00063"></a><a class="code" href="classADODB__Active__Record.html#b565208dfa3aa07d18fa51d216723bb2">00063</a>         var <a class="code" href="classADODB__Active__Record.html#b565208dfa3aa07d18fa51d216723bb2">$_lasterr</a> = <span class="keyword">false</span>; <span class="comment">// last error message</span>
<a name="l00064"></a><a class="code" href="classADODB__Active__Record.html#608f1cb8b69c54368a46a8e9194375b4">00064</a>         var <a class="code" href="classADODB__Active__Record.html#608f1cb8b69c54368a46a8e9194375b4">$_original</a> = <span class="keyword">false</span>; <span class="comment">// the original values loaded or inserted, refreshed on update</span>
<a name="l00065"></a>00065         
<a name="l00066"></a>00066         <span class="comment">// should be static</span>
<a name="l00067"></a><a class="code" href="classADODB__Active__Record.html#c59bde100c4f5338807941cd83265835">00067</a>         function <a class="code" href="classADODB__Active__Record.html#c59bde100c4f5338807941cd83265835">SetDatabaseAdapter</a>(&amp;$db) 
<a name="l00068"></a>00068         {
<a name="l00069"></a>00069                 <span class="keywordflow">return</span> ADODB_SetDatabaseAdapter($db);
<a name="l00070"></a>00070         }
<a name="l00071"></a>00071         
<a name="l00072"></a>00072         <span class="comment">// php4 constructor</span>
<a name="l00073"></a><a class="code" href="classADODB__Active__Record.html#6599064662c80f97e772555d6d5f8d0c">00073</a>         function <a class="code" href="classADODB__Active__Record.html#6599064662c80f97e772555d6d5f8d0c">ADODB_Active_Record</a>($table = <span class="keyword">false</span>, $pkeyarr=<span class="keyword">false</span>, $db=<span class="keyword">false</span>)
<a name="l00074"></a>00074         {
<a name="l00075"></a>00075                 <a class="code" href="classADODB__Active__Record.html#74a406be3a5faf4923014861265e567a">ADODB_Active_Record::__construct</a>($table,$pkeyarr,$db);
<a name="l00076"></a>00076         }
<a name="l00077"></a>00077         
<a name="l00078"></a>00078         <span class="comment">// php5 constructor</span>
<a name="l00079"></a><a class="code" href="classADODB__Active__Record.html#74a406be3a5faf4923014861265e567a">00079</a>         function <a class="code" href="classADODB__Active__Record.html#74a406be3a5faf4923014861265e567a">__construct</a>($table = <span class="keyword">false</span>, $pkeyarr=<span class="keyword">false</span>, $db=<span class="keyword">false</span>)
<a name="l00080"></a>00080         {
<a name="l00081"></a>00081         global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS;
<a name="l00082"></a>00082         
<a name="l00083"></a>00083                 <span class="keywordflow">if</span> ($db == <span class="keyword">false</span> &amp;&amp; is_object($pkeyarr)) {
<a name="l00084"></a>00084                         $db = $pkeyarr;
<a name="l00085"></a>00085                         $pkeyarr = <span class="keyword">false</span>;
<a name="l00086"></a>00086                 }
<a name="l00087"></a>00087                 
<a name="l00088"></a>00088                 <span class="keywordflow">if</span> (!$table) { 
<a name="l00089"></a>00089                         <span class="keywordflow">if</span> (!empty($this-&gt;_table)) $table = $this-&gt;_table;
<a name="l00090"></a>00090                         <span class="keywordflow">else</span> $table = $this-&gt;<a class="code" href="classADODB__Active__Record.html#48a2be3e26411dd95ada40a4d4211fb9">_pluralize</a>(get_class($this));
<a name="l00091"></a>00091                 }
<a name="l00092"></a>00092                 <span class="keywordflow">if</span> ($db) {
<a name="l00093"></a>00093                         $this-&gt;_dbat = <a class="code" href="classADODB__Active__Record.html#c59bde100c4f5338807941cd83265835">ADODB_Active_Record::SetDatabaseAdapter</a>($db);
<a name="l00094"></a>00094                 } <span class="keywordflow">else</span>
<a name="l00095"></a>00095                         $this-&gt;_dbat = <span class="keyword">sizeof</span>($_ADODB_ACTIVE_DBS)-1;
<a name="l00096"></a>00096                 
<a name="l00097"></a>00097                 
<a name="l00098"></a>00098                 <span class="keywordflow">if</span> ($this-&gt;_dbat &lt; 0) $this-&gt;<a class="code" href="classADODB__Active__Record.html#a18b7444cb41677403e0f39796a8abb6">Error</a>(<span class="stringliteral">"No database connection set; use ADOdb_Active_Record::SetDatabaseAdapter(\$db)"</span>,'ADODB_Active_Record::__constructor');
<a name="l00099"></a>00099                 
<a name="l00100"></a>00100                 $this-&gt;_table = $table;
<a name="l00101"></a>00101                 $this-&gt;_tableat = $table; # reserved <span class="keywordflow">for</span> setting the assoc value to a non-table name, eg. the sql string in future
<a name="l00102"></a>00102                 $this-&gt;<a class="code" href="classADODB__Active__Record.html#8d49fa9c1d1000a2e94326ad3974ec7c">UpdateActiveTable</a>($pkeyarr);
<a name="l00103"></a>00103         }
<a name="l00104"></a>00104         
<a name="l00105"></a><a class="code" href="classADODB__Active__Record.html#48a2be3e26411dd95ada40a4d4211fb9">00105</a>         function <a class="code" href="classADODB__Active__Record.html#48a2be3e26411dd95ada40a4d4211fb9">_pluralize</a>($table)
<a name="l00106"></a>00106         {
<a name="l00107"></a>00107                 $ut = strtoupper($table);
<a name="l00108"></a>00108                 $len = strlen($table);
<a name="l00109"></a>00109                 $lastc = $ut[$len-1];
<a name="l00110"></a>00110                 $lastc2 = substr($ut,$len-2);
<a name="l00111"></a>00111                 <span class="keywordflow">switch</span> ($lastc) {
<a name="l00112"></a>00112                 <span class="keywordflow">case</span> <span class="charliteral">'S'</span>:
<a name="l00113"></a>00113                         <span class="keywordflow">return</span> $table.'es';     
<a name="l00114"></a>00114                 <span class="keywordflow">case</span> <span class="charliteral">'Y'</span>:
<a name="l00115"></a>00115                         <span class="keywordflow">return</span> substr($table,0,$len-1).'ies';
<a name="l00116"></a>00116                 <span class="keywordflow">case</span> <span class="charliteral">'X'</span>:       
<a name="l00117"></a>00117                         <span class="keywordflow">return</span> $table.'es';
<a name="l00118"></a>00118                 <span class="keywordflow">case</span> <span class="charliteral">'H'</span>: 
<a name="l00119"></a>00119                         <span class="keywordflow">if</span> ($lastc2 == 'CH' || $lastc2 == 'SH')
<a name="l00120"></a>00120                                 <span class="keywordflow">return</span> $table.'es';
<a name="l00121"></a>00121                 <span class="keywordflow">default</span>:
<a name="l00122"></a>00122                         <span class="keywordflow">return</span> $table.<span class="charliteral">'s'</span>;
<a name="l00123"></a>00123                 }
<a name="l00124"></a>00124         }
<a name="l00125"></a>00125         
<a name="l00127"></a>00127         
<a name="l00128"></a>00128         <span class="comment">// update metadata</span>
<a name="l00129"></a><a class="code" href="classADODB__Active__Record.html#8d49fa9c1d1000a2e94326ad3974ec7c">00129</a>         function <a class="code" href="classADODB__Active__Record.html#8d49fa9c1d1000a2e94326ad3974ec7c">UpdateActiveTable</a>($pkeys=<span class="keyword">false</span>,$forceUpdate=<span class="keyword">false</span>)
<a name="l00130"></a>00130         {
<a name="l00131"></a>00131         global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS , $ADODB_CACHE_DIR, $ADODB_ACTIVE_CACHESECS;
<a name="l00132"></a>00132         
<a name="l00133"></a>00133                 $activedb =&amp; $_ADODB_ACTIVE_DBS[$this-&gt;_dbat];
<a name="l00134"></a>00134 
<a name="l00135"></a>00135                 $table = $this-&gt;_table;
<a name="l00136"></a>00136                 $tables = $activedb-&gt;tables;
<a name="l00137"></a>00137                 $tableat = $this-&gt;_tableat;
<a name="l00138"></a>00138                 <span class="keywordflow">if</span> (!$forceUpdate &amp;&amp; !empty($tables[$tableat])) {
<a name="l00139"></a>00139                         $tobj =&amp; $tables[$tableat];
<a name="l00140"></a>00140                         foreach($tobj-&gt;flds as $name =&gt; $fld) 
<a name="l00141"></a>00141                                 $this-&gt;$name = null;
<a name="l00142"></a>00142                         <span class="keywordflow">return</span>;
<a name="l00143"></a>00143                 }
<a name="l00144"></a>00144                 
<a name="l00145"></a>00145                 $db =&amp; $activedb-&gt;db;
<a name="l00146"></a>00146                 $fname = $ADODB_CACHE_DIR . '/adodb_' . $db-&gt;databaseType . '_active_'. $table . '.cache';
<a name="l00147"></a>00147                 <span class="keywordflow">if</span> (!$forceUpdate &amp;&amp; $ADODB_ACTIVE_CACHESECS &amp;&amp; $ADODB_CACHE_DIR &amp;&amp; file_exists($fname)) {
<a name="l00148"></a>00148                         $fp = fopen($fname,<span class="charliteral">'r'</span>);
<a name="l00149"></a>00149                         @flock($fp, LOCK_SH);
<a name="l00150"></a>00150                         $acttab = unserialize(fread($fp,100000));
<a name="l00151"></a>00151                         fclose($fp);
<a name="l00152"></a>00152                         <span class="keywordflow">if</span> ($acttab-&gt;_created + $ADODB_ACTIVE_CACHESECS - (abs(rand()) % 16) &gt; time()) { 
<a name="l00153"></a>00153                                 <span class="comment">// abs(rand()) randomizes deletion, reducing contention to delete/refresh file</span>
<a name="l00154"></a>00154                                 <span class="comment">// ideally, you should cache at least 32 secs</span>
<a name="l00155"></a>00155                                 $activedb-&gt;tables[$table] = $acttab;
<a name="l00156"></a>00156                                 
<a name="l00157"></a>00157                                 <span class="comment">//if ($db-&gt;debug) ADOConnection::outp("Reading cached active record file: $fname");</span>
<a name="l00158"></a>00158                                 <span class="keywordflow">return</span>;
<a name="l00159"></a>00159                         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ($db-&gt;debug) {
<a name="l00160"></a>00160                                 <a class="code" href="classADOConnection.html#4795dfab4c8ca2f1fa2499e22e974d9c">ADOConnection::outp</a>(<span class="stringliteral">"Refreshing cached active record file: $fname"</span>);
<a name="l00161"></a>00161                         }
<a name="l00162"></a>00162                 }
<a name="l00163"></a>00163                 $activetab = <span class="keyword">new</span> <a class="code" href="classADODB__Active__Table.html">ADODB_Active_Table</a>();
<a name="l00164"></a>00164                 $activetab-&gt;name = $table;
<a name="l00165"></a>00165                 
<a name="l00166"></a>00166                 
<a name="l00167"></a>00167                 $cols = $db-&gt;MetaColumns($table);
<a name="l00168"></a>00168                 <span class="keywordflow">if</span> (!$cols) {
<a name="l00169"></a>00169                         $this-&gt;<a class="code" href="classADODB__Active__Record.html#a18b7444cb41677403e0f39796a8abb6">Error</a>(<span class="stringliteral">"Invalid table name: $table"</span>,'<a class="code" href="classADODB__Active__Record.html#8d49fa9c1d1000a2e94326ad3974ec7c">UpdateActiveTable</a>'); 
<a name="l00170"></a>00170                         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00171"></a>00171                 }
<a name="l00172"></a>00172                 $fld = reset($cols);
<a name="l00173"></a>00173                 <span class="keywordflow">if</span> (!$pkeys) {
<a name="l00174"></a>00174                         <span class="keywordflow">if</span> (isset($fld-&gt;primary_key)) {
<a name="l00175"></a>00175                                 $pkeys = array();
<a name="l00176"></a>00176                                 foreach($cols as $name =&gt; $fld) {
<a name="l00177"></a>00177                                         <span class="keywordflow">if</span> (!empty($fld-&gt;primary_key)) $pkeys[] = $name;
<a name="l00178"></a>00178                                 }
<a name="l00179"></a>00179                         } <span class="keywordflow">else</span>  
<a name="l00180"></a>00180                                 $pkeys = $this-&gt;<a class="code" href="classADODB__Active__Record.html#792226c833136cdd18c2bfd3580b9d81">GetPrimaryKeys</a>($db, $table);
<a name="l00181"></a>00181                 }
<a name="l00182"></a>00182                 <span class="keywordflow">if</span> (empty($pkeys)) {
<a name="l00183"></a>00183                         $this-&gt;<a class="code" href="classADODB__Active__Record.html#a18b7444cb41677403e0f39796a8abb6">Error</a>(<span class="stringliteral">"No primary key found for table $table"</span>,'<a class="code" href="classADODB__Active__Record.html#8d49fa9c1d1000a2e94326ad3974ec7c">UpdateActiveTable</a>');
<a name="l00184"></a>00184                         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00185"></a>00185                 }
<a name="l00186"></a>00186                 
<a name="l00187"></a>00187                 $attr = array();
<a name="l00188"></a>00188                 $keys = array();
<a name="l00189"></a>00189                 
<a name="l00190"></a>00190                 <span class="keywordflow">switch</span>($ADODB_ASSOC_CASE) {
<a name="l00191"></a>00191                 <span class="keywordflow">case</span> 0:
<a name="l00192"></a>00192                         foreach($cols as $name =&gt; $fldobj) {
<a name="l00193"></a>00193                                 $name = strtolower($name);
<a name="l00194"></a>00194                                 $this-&gt;$name = null;
<a name="l00195"></a>00195                                 $attr[$name] = $fldobj;
<a name="l00196"></a>00196                         }
<a name="l00197"></a>00197                         foreach($pkeys as $k =&gt; $name) {
<a name="l00198"></a>00198                                 $keys[strtolower($name)] = strtolower($name);
<a name="l00199"></a>00199                         }
<a name="l00200"></a>00200                         <span class="keywordflow">break</span>;
<a name="l00201"></a>00201                         
<a name="l00202"></a>00202                 <span class="keywordflow">case</span> 1: 
<a name="l00203"></a>00203                         foreach($cols as $name =&gt; $fldobj) {
<a name="l00204"></a>00204                                 $name = strtoupper($name);
<a name="l00205"></a>00205                                 $this-&gt;$name = null;
<a name="l00206"></a>00206                                 $attr[$name] = $fldobj;
<a name="l00207"></a>00207                         }
<a name="l00208"></a>00208                         
<a name="l00209"></a>00209                         foreach($pkeys as $k =&gt; $name) {
<a name="l00210"></a>00210                                 $keys[strtoupper($name)] = strtoupper($name);
<a name="l00211"></a>00211                         }
<a name="l00212"></a>00212                         <span class="keywordflow">break</span>;
<a name="l00213"></a>00213                 <span class="keywordflow">default</span>:
<a name="l00214"></a>00214                         foreach($cols as $name =&gt; $fldobj) {
<a name="l00215"></a>00215                                 $name = ($name);
<a name="l00216"></a>00216                                 $this-&gt;$name = null;
<a name="l00217"></a>00217                                 $attr[$name] = $fldobj;
<a name="l00218"></a>00218                         }
<a name="l00219"></a>00219                         foreach($pkeys as $k =&gt; $name) {
<a name="l00220"></a>00220                                 $keys[$name] = ($name);
<a name="l00221"></a>00221                         }
<a name="l00222"></a>00222                         <span class="keywordflow">break</span>;
<a name="l00223"></a>00223                 }
<a name="l00224"></a>00224                 
<a name="l00225"></a>00225                 $activetab-&gt;keys = $keys;
<a name="l00226"></a>00226                 $activetab-&gt;flds = $attr;
<a name="l00227"></a>00227 
<a name="l00228"></a>00228                 <span class="keywordflow">if</span> ($ADODB_ACTIVE_CACHESECS &amp;&amp; $ADODB_CACHE_DIR) {
<a name="l00229"></a>00229                         $activetab-&gt;_created = time();
<a name="l00230"></a>00230                         $s = serialize($activetab);
<a name="l00231"></a>00231                         <span class="keywordflow">if</span> (!function_exists('adodb_write_file')) include(ADODB_DIR.'/adodb-csvlib.inc.php');
<a name="l00232"></a>00232                         adodb_write_file($fname,$s);
<a name="l00233"></a>00233                 }
<a name="l00234"></a>00234                 $activedb-&gt;tables[$table] = $activetab;
<a name="l00235"></a>00235         }
<a name="l00236"></a>00236         
<a name="l00237"></a><a class="code" href="classADODB__Active__Record.html#792226c833136cdd18c2bfd3580b9d81">00237</a>         function <a class="code" href="classADODB__Active__Record.html#792226c833136cdd18c2bfd3580b9d81">GetPrimaryKeys</a>(&amp;$db, $table)
<a name="l00238"></a>00238         {
<a name="l00239"></a>00239                 <span class="keywordflow">return</span> $db-&gt;MetaPrimaryKeys($table);
<a name="l00240"></a>00240         }
<a name="l00241"></a>00241         
<a name="l00242"></a>00242         <span class="comment">// error handler for both PHP4+5. </span>
<a name="l00243"></a><a class="code" href="classADODB__Active__Record.html#a18b7444cb41677403e0f39796a8abb6">00243</a>         function <a class="code" href="classADODB__Active__Record.html#a18b7444cb41677403e0f39796a8abb6">Error</a>($err,$fn)
<a name="l00244"></a>00244         {
<a name="l00245"></a>00245         global $_ADODB_ACTIVE_DBS;
<a name="l00246"></a>00246         
<a name="l00247"></a>00247                 $fn = get_class($this).'::'.$fn;
<a name="l00248"></a>00248                 $this-&gt;_lasterr = $fn.': '.$err;
<a name="l00249"></a>00249                 
<a name="l00250"></a>00250                 <span class="keywordflow">if</span> ($this-&gt;_dbat &lt; 0) $db = <span class="keyword">false</span>;
<a name="l00251"></a>00251                 <span class="keywordflow">else</span> {
<a name="l00252"></a>00252                         $activedb = $_ADODB_ACTIVE_DBS[$this-&gt;_dbat];
<a name="l00253"></a>00253                         $db =&amp; $activedb-&gt;db;
<a name="l00254"></a>00254                 }
<a name="l00255"></a>00255                 
<a name="l00256"></a>00256                 <span class="keywordflow">if</span> (function_exists('adodb_throw')) {   
<a name="l00257"></a>00257                         <span class="keywordflow">if</span> (!$db) adodb_throw('ADOdb_Active_Record', $fn, -1, $err, 0, 0, <span class="keyword">false</span>);
<a name="l00258"></a>00258                         <span class="keywordflow">else</span> adodb_throw($db-&gt;databaseType, $fn, -1, $err, 0, 0, $db);
<a name="l00259"></a>00259                 } <span class="keywordflow">else</span>
<a name="l00260"></a>00260                         <span class="keywordflow">if</span> (!$db || $db-&gt;debug) <a class="code" href="classADOConnection.html#4795dfab4c8ca2f1fa2499e22e974d9c">ADOConnection::outp</a>($this-&gt;_lasterr);
<a name="l00261"></a>00261                 
<a name="l00262"></a>00262         }
<a name="l00263"></a>00263         
<a name="l00264"></a>00264         <span class="comment">// return last error message</span>
<a name="l00265"></a><a class="code" href="classADODB__Active__Record.html#80759578afc6f12a9901a0faa80457e2">00265</a>         function <a class="code" href="classADODB__Active__Record.html#80759578afc6f12a9901a0faa80457e2">ErrorMsg</a>()
<a name="l00266"></a>00266         {
<a name="l00267"></a>00267                 <span class="keywordflow">if</span> (!function_exists('adodb_throw')) {
<a name="l00268"></a>00268                         <span class="keywordflow">if</span> ($this-&gt;_dbat &lt; 0) $db = <span class="keyword">false</span>;
<a name="l00269"></a>00269                         <span class="keywordflow">else</span> $db = $this-&gt;<a class="code" href="classADODB__Active__Record.html#dc3f14a6f247c1a260b91a236e0ae996">DB</a>();
<a name="l00270"></a>00270                 
<a name="l00271"></a>00271                         <span class="comment">// last error could be database error too</span>
<a name="l00272"></a>00272                         <span class="keywordflow">if</span> ($db &amp;&amp; $db-&gt;<a class="code" href="classADODB__Active__Record.html#80759578afc6f12a9901a0faa80457e2">ErrorMsg</a>()) <span class="keywordflow">return</span> $db-&gt;ErrorMsg();
<a name="l00273"></a>00273                 }
<a name="l00274"></a>00274                 <span class="keywordflow">return</span> $this-&gt;_lasterr;
<a name="l00275"></a>00275         }
<a name="l00276"></a>00276         
<a name="l00277"></a>00277         <span class="comment">// retrieve ADOConnection from _ADODB_Active_DBs</span>
<a name="l00278"></a><a class="code" href="classADODB__Active__Record.html#dc3f14a6f247c1a260b91a236e0ae996">00278</a>         function &amp;<a class="code" href="classADODB__Active__Record.html#dc3f14a6f247c1a260b91a236e0ae996">DB</a>()
<a name="l00279"></a>00279         {
<a name="l00280"></a>00280         global $_ADODB_ACTIVE_DBS;
<a name="l00281"></a>00281         
<a name="l00282"></a>00282                 <span class="keywordflow">if</span> ($this-&gt;_dbat &lt; 0) {
<a name="l00283"></a>00283                         $false = <span class="keyword">false</span>;
<a name="l00284"></a>00284                         $this-&gt;<a class="code" href="classADODB__Active__Record.html#a18b7444cb41677403e0f39796a8abb6">Error</a>(<span class="stringliteral">"No database connection set: use ADOdb_Active_Record::SetDatabaseAdaptor(\$db)"</span>, <span class="stringliteral">"DB"</span>);
<a name="l00285"></a>00285                         <span class="keywordflow">return</span> $false;
<a name="l00286"></a>00286                 }
<a name="l00287"></a>00287                 $activedb = $_ADODB_ACTIVE_DBS[$this-&gt;_dbat];
<a name="l00288"></a>00288                 $db =&amp; $activedb-&gt;db;
<a name="l00289"></a>00289                 <span class="keywordflow">return</span> $db;
<a name="l00290"></a>00290         }
<a name="l00291"></a>00291         
<a name="l00292"></a>00292         <span class="comment">// retrieve ADODB_Active_Table</span>
<a name="l00293"></a><a class="code" href="classADODB__Active__Record.html#579f956f0a711815f96eb101b993eff2">00293</a>         function &amp;<a class="code" href="classADODB__Active__Record.html#579f956f0a711815f96eb101b993eff2">TableInfo</a>()
<a name="l00294"></a>00294         {
<a name="l00295"></a>00295         global $_ADODB_ACTIVE_DBS;
<a name="l00296"></a>00296         
<a name="l00297"></a>00297                 $activedb = $_ADODB_ACTIVE_DBS[$this-&gt;_dbat];
<a name="l00298"></a>00298                 $table =&amp; $activedb-&gt;tables[$this-&gt;_tableat];
<a name="l00299"></a>00299                 <span class="keywordflow">return</span> $table;
<a name="l00300"></a>00300         }
<a name="l00301"></a>00301         
<a name="l00302"></a>00302         <span class="comment">// set a numeric array (using natural table field ordering) as object properties</span>
<a name="l00303"></a><a class="code" href="classADODB__Active__Record.html#d5f61fafebcf0fbd82c1ddac5f8777f0">00303</a>         function <a class="code" href="classADODB__Active__Record.html#d5f61fafebcf0fbd82c1ddac5f8777f0">Set</a>(&amp;$row)
<a name="l00304"></a>00304         {
<a name="l00305"></a>00305                 $db =&amp; $this-&gt;<a class="code" href="classADODB__Active__Record.html#dc3f14a6f247c1a260b91a236e0ae996">DB</a>();
<a name="l00306"></a>00306                 
<a name="l00307"></a>00307                 <span class="keywordflow">if</span> (!$row) {
<a name="l00308"></a>00308                         $this-&gt;_saved = <span class="keyword">false</span>;          
<a name="l00309"></a>00309                         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00310"></a>00310                 }
<a name="l00311"></a>00311                 
<a name="l00312"></a>00312                 $this-&gt;_saved = <span class="keyword">true</span>;
<a name="l00313"></a>00313                 
<a name="l00314"></a>00314                 $table =&amp; $this-&gt;<a class="code" href="classADODB__Active__Record.html#579f956f0a711815f96eb101b993eff2">TableInfo</a>();
<a name="l00315"></a>00315                 <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>($table-&gt;flds) != <span class="keyword">sizeof</span>($row)) {
<a name="l00316"></a>00316                         $this-&gt;<a class="code" href="classADODB__Active__Record.html#a18b7444cb41677403e0f39796a8abb6">Error</a>(<span class="stringliteral">"Table structure of $this-&gt;_table has changed"</span>,<span class="stringliteral">"Load"</span>);
<a name="l00317"></a>00317                         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00318"></a>00318                 }
<a name="l00319"></a>00319                 
<a name="l00320"></a>00320                 $cnt = 0;
<a name="l00321"></a>00321                 foreach($table-&gt;flds as $name=&gt;$fld) {
<a name="l00322"></a>00322                         $this-&gt;$name = $row[$cnt];
<a name="l00323"></a>00323                         $cnt += 1;
<a name="l00324"></a>00324                 }
<a name="l00325"></a>00325                 $this-&gt;_original = $row;
<a name="l00326"></a>00326                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00327"></a>00327         }
<a name="l00328"></a>00328         
<a name="l00329"></a>00329         <span class="comment">// get last inserted id for INSERT</span>
<a name="l00330"></a><a class="code" href="classADODB__Active__Record.html#7f90964e7dec7e2ac144427055f50a3d">00330</a>         function <a class="code" href="classADODB__Active__Record.html#7f90964e7dec7e2ac144427055f50a3d">LastInsertID</a>(&amp;$db,$fieldname)
<a name="l00331"></a>00331         {
<a name="l00332"></a>00332                 <span class="keywordflow">if</span> ($db-&gt;hasInsertID)
<a name="l00333"></a>00333                         $val = $db-&gt;Insert_ID($this-&gt;_table,$fieldname);
<a name="l00334"></a>00334                 <span class="keywordflow">else</span>
<a name="l00335"></a>00335                         $val = <span class="keyword">false</span>;
<a name="l00336"></a>00336                         
<a name="l00337"></a>00337                 <span class="keywordflow">if</span> (is_null($val) || $val === <span class="keyword">false</span>) {
<a name="l00338"></a>00338                         <span class="comment">// this might not work reliably in multi-user environment</span>
<a name="l00339"></a>00339                         <span class="keywordflow">return</span> $db-&gt;GetOne(<span class="stringliteral">"select max("</span>.$fieldname.<span class="stringliteral">") from "</span>.$this-&gt;_table);
<a name="l00340"></a>00340                 }
<a name="l00341"></a>00341                 <span class="keywordflow">return</span> $val;
<a name="l00342"></a>00342         }
<a name="l00343"></a>00343         
<a name="l00344"></a>00344         <span class="comment">// quote data in where clause</span>
<a name="l00345"></a><a class="code" href="classADODB__Active__Record.html#53db1f8eee0b017aa4531c42f263ce0c">00345</a>         function <a class="code" href="classADODB__Active__Record.html#53db1f8eee0b017aa4531c42f263ce0c">doquote</a>(&amp;$db, $val,$t)
<a name="l00346"></a>00346         {
<a name="l00347"></a>00347                 <span class="keywordflow">switch</span>($t) {
<a name="l00348"></a>00348                 <span class="keywordflow">case</span> <span class="charliteral">'D'</span>:
<a name="l00349"></a>00349                 <span class="keywordflow">case</span> <span class="charliteral">'T'</span>:
<a name="l00350"></a>00350                         <span class="keywordflow">if</span> (empty($val)) <span class="keywordflow">return</span> 'null';
<a name="l00351"></a>00351                         
<a name="l00352"></a>00352                 <span class="keywordflow">case</span> <span class="charliteral">'C'</span>:
<a name="l00353"></a>00353                 <span class="keywordflow">case</span> <span class="charliteral">'X'</span>:
<a name="l00354"></a>00354                         <span class="keywordflow">if</span> (is_null($val)) <span class="keywordflow">return</span> 'null';
<a name="l00355"></a>00355                         
<a name="l00356"></a>00356                         <span class="keywordflow">if</span> (strncmp($val,<span class="stringliteral">"'"</span>,1) != 0 &amp;&amp; substr($val,strlen($val)-1,1) != <span class="stringliteral">"'"</span>) { 
<a name="l00357"></a>00357                                 <span class="keywordflow">return</span> $db-&gt;qstr($val);
<a name="l00358"></a>00358                                 <span class="keywordflow">break</span>;
<a name="l00359"></a>00359                         }
<a name="l00360"></a>00360                 <span class="keywordflow">default</span>:
<a name="l00361"></a>00361                         <span class="keywordflow">return</span> $val;
<a name="l00362"></a>00362                         <span class="keywordflow">break</span>;
<a name="l00363"></a>00363                 }
<a name="l00364"></a>00364         }
<a name="l00365"></a>00365         
<a name="l00366"></a>00366         <span class="comment">// generate where clause for an UPDATE/SELECT</span>
<a name="l00367"></a><a class="code" href="classADODB__Active__Record.html#e6597909e2dcc65d189abff49339933e">00367</a>         function <a class="code" href="classADODB__Active__Record.html#e6597909e2dcc65d189abff49339933e">GenWhere</a>(&amp;$db, &amp;$table)
<a name="l00368"></a>00368         {
<a name="l00369"></a>00369                 $keys = $table-&gt;keys;
<a name="l00370"></a>00370                 $parr = array();
<a name="l00371"></a>00371                 
<a name="l00372"></a>00372                 foreach($keys as $k) {
<a name="l00373"></a>00373                         $f = $table-&gt;flds[$k];
<a name="l00374"></a>00374                         <span class="keywordflow">if</span> ($f) {
<a name="l00375"></a>00375                                 $parr[] = $k.' = '.$this-&gt;doquote($db,$this-&gt;$k,$db-&gt;MetaType($f-&gt;type));
<a name="l00376"></a>00376                         }
<a name="l00377"></a>00377                 }
<a name="l00378"></a>00378                 <span class="keywordflow">return</span> implode(' and ', $parr);
<a name="l00379"></a>00379         }
<a name="l00380"></a>00380         
<a name="l00381"></a>00381         
<a name="l00382"></a>00382         <span class="comment">//------------------------------------------------------------ Public functions below</span>
<a name="l00383"></a>00383         
<a name="l00384"></a><a class="code" href="classADODB__Active__Record.html#36eeaac79d0ec6ec504ccb39bf2ca6d7">00384</a>         function <a class="code" href="classADODB__Active__Record.html#36eeaac79d0ec6ec504ccb39bf2ca6d7">Load</a>($where,$bindarr=<span class="keyword">false</span>)
<a name="l00385"></a>00385         {
<a name="l00386"></a>00386                 $db =&amp; $this-&gt;<a class="code" href="classADODB__Active__Record.html#dc3f14a6f247c1a260b91a236e0ae996">DB</a>(); <span class="keywordflow">if</span> (!$db) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00387"></a>00387                 $this-&gt;_where = $where;
<a name="l00388"></a>00388                 
<a name="l00389"></a>00389                 $save = $db-&gt;SetFetchMode(ADODB_FETCH_NUM);
<a name="l00390"></a>00390                 $row = $db-&gt;GetRow(<span class="stringliteral">"select * from "</span>.$this-&gt;_table.' WHERE '.$where,$bindarr);
<a name="l00391"></a>00391                 $db-&gt;SetFetchMode($save);
<a name="l00392"></a>00392                 
<a name="l00393"></a>00393                 <span class="keywordflow">return</span> $this-&gt;<a class="code" href="classADODB__Active__Record.html#d5f61fafebcf0fbd82c1ddac5f8777f0">Set</a>($row);
<a name="l00394"></a>00394         }
<a name="l00395"></a>00395         
<a name="l00396"></a>00396         <span class="comment">// false on error</span>
<a name="l00397"></a><a class="code" href="classADODB__Active__Record.html#74fb513d2a22d14bb5da462464c9c65c">00397</a>         function <a class="code" href="classADODB__Active__Record.html#74fb513d2a22d14bb5da462464c9c65c">Save</a>()
<a name="l00398"></a>00398         {
<a name="l00399"></a>00399                 <span class="keywordflow">if</span> ($this-&gt;_saved) $ok = $this-&gt;<a class="code" href="classADODB__Active__Record.html#07fd51a43985b42a6c3cf950c1db6d0e">Update</a>();
<a name="l00400"></a>00400                 <span class="keywordflow">else</span> $ok = $this-&gt;<a class="code" href="classADODB__Active__Record.html#b1a26bbc4b3b6a57d1187127ddd23550">Insert</a>();
<a name="l00401"></a>00401                 
<a name="l00402"></a>00402                 <span class="keywordflow">return</span> $ok;
<a name="l00403"></a>00403         }
<a name="l00404"></a>00404         
<a name="l00405"></a>00405         <span class="comment">// false on error</span>
<a name="l00406"></a><a class="code" href="classADODB__Active__Record.html#b1a26bbc4b3b6a57d1187127ddd23550">00406</a>         function <a class="code" href="classADODB__Active__Record.html#b1a26bbc4b3b6a57d1187127ddd23550">Insert</a>()
<a name="l00407"></a>00407         {
<a name="l00408"></a>00408                 $db =&amp; $this-&gt;<a class="code" href="classADODB__Active__Record.html#dc3f14a6f247c1a260b91a236e0ae996">DB</a>(); <span class="keywordflow">if</span> (!$db) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00409"></a>00409                 $cnt = 0;
<a name="l00410"></a>00410                 $table =&amp; $this-&gt;<a class="code" href="classADODB__Active__Record.html#579f956f0a711815f96eb101b993eff2">TableInfo</a>();
<a name="l00411"></a>00411 
<a name="l00412"></a>00412                 foreach($table-&gt;flds as $name=&gt;$fld) {
<a name="l00413"></a>00413                         $val = $this-&gt;$name;
<a name="l00414"></a>00414                         <span class="comment">/*</span>
<a name="l00415"></a>00415 <span class="comment">                        if (is_null($val)) {</span>
<a name="l00416"></a>00416 <span class="comment">                                if (isset($fld-&gt;not_null) &amp;&amp; $fld-&gt;not_null) {</span>
<a name="l00417"></a>00417 <span class="comment">                                        if (isset($fld-&gt;default_value) &amp;&amp; strlen($fld-&gt;default_value)) continue;</span>
<a name="l00418"></a>00418 <span class="comment">                                        else $this-&gt;Error("Cannot insert null into $name","Insert");</span>
<a name="l00419"></a>00419 <span class="comment">                                }</span>
<a name="l00420"></a>00420 <span class="comment">                        }*/</span>
<a name="l00421"></a>00421                         
<a name="l00422"></a>00422                         $valarr[] = $val;
<a name="l00423"></a>00423                         $names[] = $name;
<a name="l00424"></a>00424                         $valstr[] = $db-&gt;Param($cnt);
<a name="l00425"></a>00425                         $cnt += 1;
<a name="l00426"></a>00426                 }
<a name="l00427"></a>00427                 
<a name="l00428"></a>00428                 $sql = 'INSERT INTO '.$this-&gt;_table.<span class="stringliteral">"("</span>.implode(<span class="charliteral">','</span>,$names).') VALUES ('.implode(<span class="charliteral">','</span>,$valstr).<span class="charliteral">')'</span>;
<a name="l00429"></a>00429                 $ok = $db-&gt;Execute($sql,$valarr);
<a name="l00430"></a>00430                 
<a name="l00431"></a>00431                 <span class="keywordflow">if</span> ($ok) {
<a name="l00432"></a>00432                         $this-&gt;_saved = <span class="keyword">true</span>;
<a name="l00433"></a>00433                         $autoinc = <span class="keyword">false</span>;
<a name="l00434"></a>00434                         foreach($table-&gt;keys as $k) {
<a name="l00435"></a>00435                                 <span class="keywordflow">if</span> (is_null($this-&gt;$k)) {
<a name="l00436"></a>00436                                         $autoinc = <span class="keyword">true</span>;
<a name="l00437"></a>00437                                         <span class="keywordflow">break</span>;
<a name="l00438"></a>00438                                 }
<a name="l00439"></a>00439                         }
<a name="l00440"></a>00440                         <span class="keywordflow">if</span> ($autoinc &amp;&amp; <span class="keyword">sizeof</span>($table-&gt;keys) == 1) {
<a name="l00441"></a>00441                                 $k = reset($table-&gt;keys);
<a name="l00442"></a>00442                                 $this-&gt;$k = $this-&gt;<a class="code" href="classADODB__Active__Record.html#7f90964e7dec7e2ac144427055f50a3d">LastInsertID</a>($db,$k);
<a name="l00443"></a>00443                         }
<a name="l00444"></a>00444                 }
<a name="l00445"></a>00445                 
<a name="l00446"></a>00446                 $this-&gt;_original = $valarr;
<a name="l00447"></a>00447                 <span class="keywordflow">return</span> !empty($ok);
<a name="l00448"></a>00448         }
<a name="l00449"></a>00449         
<a name="l00450"></a><a class="code" href="classADODB__Active__Record.html#68f4bcd17f5b81d8ec273fc2ae3d54ad">00450</a>         function <a class="code" href="classADODB__Active__Record.html#68f4bcd17f5b81d8ec273fc2ae3d54ad">Delete</a>()
<a name="l00451"></a>00451         {
<a name="l00452"></a>00452                 $db =&amp; $this-&gt;<a class="code" href="classADODB__Active__Record.html#dc3f14a6f247c1a260b91a236e0ae996">DB</a>(); <span class="keywordflow">if</span> (!$db) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00453"></a>00453                 $table =&amp; $this-&gt;<a class="code" href="classADODB__Active__Record.html#579f956f0a711815f96eb101b993eff2">TableInfo</a>();
<a name="l00454"></a>00454                 
<a name="l00455"></a>00455                 $where = $this-&gt;<a class="code" href="classADODB__Active__Record.html#e6597909e2dcc65d189abff49339933e">GenWhere</a>($db,$table);
<a name="l00456"></a>00456                 $sql = 'DELETE FROM '.$this-&gt;_table.' WHERE '.$where;
<a name="l00457"></a>00457                 $db-&gt;Execute($sql);
<a name="l00458"></a>00458         }
<a name="l00459"></a>00459         
<a name="l00460"></a>00460         <span class="comment">// returns an array of active record objects</span>
<a name="l00461"></a><a class="code" href="classADODB__Active__Record.html#cd805bfb5cbcbee2c8b1a9064831a7ad">00461</a>         function &amp;<a class="code" href="classADODB__Active__Record.html#cd805bfb5cbcbee2c8b1a9064831a7ad">Find</a>($whereOrderBy,$bindarr=<span class="keyword">false</span>,$pkeysArr=<span class="keyword">false</span>)
<a name="l00462"></a>00462         {
<a name="l00463"></a>00463                 $db =&amp; $this-&gt;<a class="code" href="classADODB__Active__Record.html#dc3f14a6f247c1a260b91a236e0ae996">DB</a>(); <span class="keywordflow">if</span> (!$db || empty($this-&gt;_table)) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00464"></a>00464                 $arr =&amp; $db-&gt;GetActiveRecordsClass(get_class($this),$this-&gt;_table, $whereOrderBy,$bindarr,$pkeysArr);
<a name="l00465"></a>00465                 <span class="keywordflow">return</span> $arr;
<a name="l00466"></a>00466         }
<a name="l00467"></a>00467         
<a name="l00468"></a>00468         <span class="comment">// returns 0 on error, 1 on update, 2 on insert</span>
<a name="l00469"></a><a class="code" href="classADODB__Active__Record.html#760ff2e5ea8284e6306a1a0c25554f82">00469</a>         function <a class="code" href="classADODB__Active__Record.html#760ff2e5ea8284e6306a1a0c25554f82">Replace</a>()
<a name="l00470"></a>00470         {
<a name="l00471"></a>00471         global $ADODB_ASSOC_CASE;
<a name="l00472"></a>00472                 
<a name="l00473"></a>00473                 $db =&amp; $this-&gt;<a class="code" href="classADODB__Active__Record.html#dc3f14a6f247c1a260b91a236e0ae996">DB</a>(); <span class="keywordflow">if</span> (!$db) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00474"></a>00474                 $table =&amp; $this-&gt;<a class="code" href="classADODB__Active__Record.html#579f956f0a711815f96eb101b993eff2">TableInfo</a>();
<a name="l00475"></a>00475                 
<a name="l00476"></a>00476                 $pkey = $table-&gt;keys;
<a name="l00477"></a>00477                 
<a name="l00478"></a>00478                 foreach($table-&gt;flds as $name=&gt;$fld) {
<a name="l00479"></a>00479                         $val = $this-&gt;$name;
<a name="l00480"></a>00480                         <span class="comment">/*</span>
<a name="l00481"></a>00481 <span class="comment">                        if (is_null($val)) {</span>
<a name="l00482"></a>00482 <span class="comment">                                if (isset($fld-&gt;not_null) &amp;&amp; $fld-&gt;not_null) {</span>
<a name="l00483"></a>00483 <span class="comment">                                        if (isset($fld-&gt;default_value) &amp;&amp; strlen($fld-&gt;default_value)) continue;</span>
<a name="l00484"></a>00484 <span class="comment">                                        else {</span>
<a name="l00485"></a>00485 <span class="comment">                                                $this-&gt;Error("Cannot update null into $name","Replace");</span>
<a name="l00486"></a>00486 <span class="comment">                                                return false;</span>
<a name="l00487"></a>00487 <span class="comment">                                        }</span>
<a name="l00488"></a>00488 <span class="comment">                                }</span>
<a name="l00489"></a>00489 <span class="comment">                        }*/</span>
<a name="l00490"></a>00490                         <span class="keywordflow">if</span> (is_null($val) &amp;&amp; !empty($fld-&gt;auto_increment)) {
<a name="l00491"></a>00491                 <span class="keywordflow">continue</span>;
<a name="l00492"></a>00492             }
<a name="l00493"></a>00493                         $t = $db-&gt;MetaType($fld-&gt;type);
<a name="l00494"></a>00494                         $arr[$name] = $this-&gt;<a class="code" href="classADODB__Active__Record.html#53db1f8eee0b017aa4531c42f263ce0c">doquote</a>($db,$val,$t);
<a name="l00495"></a>00495                         $valarr[] = $val;
<a name="l00496"></a>00496                 }
<a name="l00497"></a>00497                 
<a name="l00498"></a>00498                 <span class="keywordflow">if</span> (!is_array($pkey)) $pkey = array($pkey);
<a name="l00499"></a>00499                 
<a name="l00500"></a>00500                 
<a name="l00501"></a>00501                 <span class="keywordflow">if</span> ($ADODB_ASSOC_CASE == 0) 
<a name="l00502"></a>00502                         foreach($pkey as $k =&gt; $v)
<a name="l00503"></a>00503                                 $pkey[$k] = strtolower($v);
<a name="l00504"></a>00504                 elseif ($ADODB_ASSOC_CASE == 0) 
<a name="l00505"></a>00505                         foreach($pkey as $k =&gt; $v)
<a name="l00506"></a>00506                                 $pkey[$k] = strtoupper($v);
<a name="l00507"></a>00507                                 
<a name="l00508"></a>00508                 $ok = $db-&gt;Replace($this-&gt;_table,$arr,$pkey);
<a name="l00509"></a>00509                 <span class="keywordflow">if</span> ($ok) {
<a name="l00510"></a>00510                         $this-&gt;_saved = <span class="keyword">true</span>; <span class="comment">// 1= update 2=insert</span>
<a name="l00511"></a>00511                         <span class="keywordflow">if</span> ($ok == 2) {
<a name="l00512"></a>00512                                 $autoinc = <span class="keyword">false</span>;
<a name="l00513"></a>00513                                 foreach($table-&gt;keys as $k) {
<a name="l00514"></a>00514                                         <span class="keywordflow">if</span> (is_null($this-&gt;$k)) {
<a name="l00515"></a>00515                                                 $autoinc = <span class="keyword">true</span>;
<a name="l00516"></a>00516                                                 <span class="keywordflow">break</span>;
<a name="l00517"></a>00517                                         }
<a name="l00518"></a>00518                                 }
<a name="l00519"></a>00519                                 <span class="keywordflow">if</span> ($autoinc &amp;&amp; <span class="keyword">sizeof</span>($table-&gt;keys) == 1) {
<a name="l00520"></a>00520                                         $k = reset($table-&gt;keys);
<a name="l00521"></a>00521                                         $this-&gt;$k = $this-&gt;<a class="code" href="classADODB__Active__Record.html#7f90964e7dec7e2ac144427055f50a3d">LastInsertID</a>($db,$k);
<a name="l00522"></a>00522                                 }
<a name="l00523"></a>00523                         }
<a name="l00524"></a>00524                         
<a name="l00525"></a>00525                         $this-&gt;_original =&amp; $valarr;
<a name="l00526"></a>00526                 } 
<a name="l00527"></a>00527                 <span class="keywordflow">return</span> $ok;
<a name="l00528"></a>00528         }
<a name="l00529"></a>00529 
<a name="l00530"></a>00530         <span class="comment">// returns 0 on error, 1 on update, -1 if no change in data (no update)</span>
<a name="l00531"></a><a class="code" href="classADODB__Active__Record.html#07fd51a43985b42a6c3cf950c1db6d0e">00531</a>         function <a class="code" href="classADODB__Active__Record.html#07fd51a43985b42a6c3cf950c1db6d0e">Update</a>()
<a name="l00532"></a>00532         {
<a name="l00533"></a>00533                 $db =&amp; $this-&gt;<a class="code" href="classADODB__Active__Record.html#dc3f14a6f247c1a260b91a236e0ae996">DB</a>(); <span class="keywordflow">if</span> (!$db) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00534"></a>00534                 $table =&amp; $this-&gt;<a class="code" href="classADODB__Active__Record.html#579f956f0a711815f96eb101b993eff2">TableInfo</a>();
<a name="l00535"></a>00535                 
<a name="l00536"></a>00536                 $where = $this-&gt;<a class="code" href="classADODB__Active__Record.html#e6597909e2dcc65d189abff49339933e">GenWhere</a>($db, $table);
<a name="l00537"></a>00537                 
<a name="l00538"></a>00538                 <span class="keywordflow">if</span> (!$where) {
<a name="l00539"></a>00539                         $this-&gt;error(<span class="stringliteral">"Where missing for table $table"</span>, <span class="stringliteral">"Update"</span>);
<a name="l00540"></a>00540                         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00541"></a>00541                 }
<a name="l00542"></a>00542                 $valarr = array(); 
<a name="l00543"></a>00543                 $neworig = array();
<a name="l00544"></a>00544                 $pairs = array();
<a name="l00545"></a>00545                 $i = -1;
<a name="l00546"></a>00546                 $cnt = 0;
<a name="l00547"></a>00547                 foreach($table-&gt;flds as $name=&gt;$fld) {
<a name="l00548"></a>00548                         $i += 1;
<a name="l00549"></a>00549                         $val = $this-&gt;$name;
<a name="l00550"></a>00550                         $neworig[] = $val;
<a name="l00551"></a>00551                         
<a name="l00552"></a>00552                         <span class="keywordflow">if</span> (isset($table-&gt;keys[$name])) {
<a name="l00553"></a>00553                                 <span class="keywordflow">continue</span>;
<a name="l00554"></a>00554                         }
<a name="l00555"></a>00555                         
<a name="l00556"></a>00556                         
<a name="l00557"></a>00557                         <span class="keywordflow">if</span> (is_null($val)) {
<a name="l00558"></a>00558                                 <span class="keywordflow">if</span> (isset($fld-&gt;not_null) &amp;&amp; $fld-&gt;not_null) {
<a name="l00559"></a>00559                                         <span class="keywordflow">if</span> (isset($fld-&gt;default_value) &amp;&amp; strlen($fld-&gt;default_value)) <span class="keywordflow">continue</span>;
<a name="l00560"></a>00560                                         <span class="keywordflow">else</span> {
<a name="l00561"></a>00561                                                 $this-&gt;<a class="code" href="classADODB__Active__Record.html#a18b7444cb41677403e0f39796a8abb6">Error</a>(<span class="stringliteral">"Cannot set field $name to NULL"</span>,<span class="stringliteral">"Update"</span>);
<a name="l00562"></a>00562                                                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00563"></a>00563                                         }
<a name="l00564"></a>00564                                 }
<a name="l00565"></a>00565                         }
<a name="l00566"></a>00566                         
<a name="l00567"></a>00567                         <span class="keywordflow">if</span> ( $val == $this-&gt;_original[$i]) {
<a name="l00568"></a>00568                                 <span class="keywordflow">continue</span>;
<a name="l00569"></a>00569                         }                       
<a name="l00570"></a>00570                         $valarr[] = $val;
<a name="l00571"></a>00571                         $pairs[] = $name.<span class="charliteral">'='</span>.$db-&gt;Param($cnt);
<a name="l00572"></a>00572                         $cnt += 1;
<a name="l00573"></a>00573                 }
<a name="l00574"></a>00574                 
<a name="l00575"></a>00575                 
<a name="l00576"></a>00576                 <span class="keywordflow">if</span> (!$cnt) <span class="keywordflow">return</span> -1;
<a name="l00577"></a>00577                 $sql = 'UPDATE '.$this-&gt;_table.<span class="stringliteral">" SET "</span>.implode(<span class="stringliteral">","</span>,$pairs).<span class="stringliteral">" WHERE "</span>.$where;
<a name="l00578"></a>00578                 $ok = $db-&gt;Execute($sql,$valarr);
<a name="l00579"></a>00579                 <span class="keywordflow">if</span> ($ok) {
<a name="l00580"></a>00580                         $this-&gt;_original =&amp; $neworig;
<a name="l00581"></a>00581                         <span class="keywordflow">return</span> 1;
<a name="l00582"></a>00582                 }
<a name="l00583"></a>00583                 <span class="keywordflow">return</span> 0;
<a name="l00584"></a>00584         }
<a name="l00585"></a>00585         
<a name="l00586"></a><a class="code" href="classADODB__Active__Record.html#545b5189d3395336d1def0a8ef2a3b70">00586</a>         function <a class="code" href="classADODB__Active__Record.html#545b5189d3395336d1def0a8ef2a3b70">GetAttributeNames</a>()
<a name="l00587"></a>00587         {
<a name="l00588"></a>00588                 $table =&amp; $this-&gt;<a class="code" href="classADODB__Active__Record.html#579f956f0a711815f96eb101b993eff2">TableInfo</a>();
<a name="l00589"></a>00589                 <span class="keywordflow">if</span> (!$table) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00590"></a>00590                 <span class="keywordflow">return</span> array_keys($table-&gt;flds);
<a name="l00591"></a>00591         }
<a name="l00592"></a>00592         
<a name="l00593"></a>00593 };
<a name="l00594"></a>00594 
<a name="l00595"></a>00595 ?&gt;
</pre></div><?php
  include_once '../doc-typo3-funcs.php';
  get_footer();
?>