
C:\dev\github\standards>xcopy \dev\github\adodb-master\*.php \dev\github\sddata /S /Y 
\dev\github\adodb-master\adodb-active-record.inc.php
\dev\github\adodb-master\adodb-active-recordx.inc.php
\dev\github\adodb-master\adodb-csvlib.inc.php
\dev\github\adodb-master\adodb-datadict.inc.php
\dev\github\adodb-master\adodb-error.inc.php
\dev\github\adodb-master\adodb-errorhandler.inc.php
\dev\github\adodb-master\adodb-errorpear.inc.php
\dev\github\adodb-master\adodb-exceptions.inc.php
\dev\github\adodb-master\adodb-iterator.inc.php
\dev\github\adodb-master\adodb-lib.inc.php
\dev\github\adodb-master\adodb-memcache.lib.inc.php
\dev\github\adodb-master\adodb-pager.inc.php
\dev\github\adodb-master\adodb-pear.inc.php
\dev\github\adodb-master\adodb-perf.inc.php
\dev\github\adodb-master\adodb-php4.inc.php
\dev\github\adodb-master\adodb-time.inc.php
\dev\github\adodb-master\adodb-xmlschema.inc.php
\dev\github\adodb-master\adodb-xmlschema03.inc.php
\dev\github\adodb-master\adodb.inc.php
\dev\github\adodb-master\pivottable.inc.php
\dev\github\adodb-master\rsfilter.inc.php
\dev\github\adodb-master\server.php
\dev\github\adodb-master\toexport.inc.php
\dev\github\adodb-master\tohtml.inc.php
\dev\github\adodb-master\contrib\toxmlrpc.inc.php
\dev\github\adodb-master\datadict\datadict-access.inc.php
\dev\github\adodb-master\datadict\datadict-db2.inc.php
\dev\github\adodb-master\datadict\datadict-firebird.inc.php
\dev\github\adodb-master\datadict\datadict-generic.inc.php
\dev\github\adodb-master\datadict\datadict-ibase.inc.php
\dev\github\adodb-master\datadict\datadict-informix.inc.php
\dev\github\adodb-master\datadict\datadict-mssql.inc.php
\dev\github\adodb-master\datadict\datadict-mssqlnative.inc.php
\dev\github\adodb-master\datadict\datadict-mysql.inc.php
\dev\github\adodb-master\datadict\datadict-oci8.inc.php
\dev\github\adodb-master\datadict\datadict-postgres.inc.php
\dev\github\adodb-master\datadict\datadict-sapdb.inc.php
\dev\github\adodb-master\datadict\datadict-sqlite.inc.php
\dev\github\adodb-master\datadict\datadict-sybase.inc.php
\dev\github\adodb-master\drivers\adodb-access.inc.php
\dev\github\adodb-master\drivers\adodb-ado.inc.php
\dev\github\adodb-master\drivers\adodb-ado5.inc.php
\dev\github\adodb-master\drivers\adodb-ado_access.inc.php
\dev\github\adodb-master\drivers\adodb-ado_mssql.inc.php
\dev\github\adodb-master\drivers\adodb-ads.inc.php
\dev\github\adodb-master\drivers\adodb-borland_ibase.inc.php
\dev\github\adodb-master\drivers\adodb-csv.inc.php
\dev\github\adodb-master\drivers\adodb-db2.inc.php
\dev\github\adodb-master\drivers\adodb-db2oci.inc.php
\dev\github\adodb-master\drivers\adodb-db2ora.inc.php
\dev\github\adodb-master\drivers\adodb-fbsql.inc.php
\dev\github\adodb-master\drivers\adodb-firebird.inc.php
\dev\github\adodb-master\drivers\adodb-ibase.inc.php
\dev\github\adodb-master\drivers\adodb-informix.inc.php
\dev\github\adodb-master\drivers\adodb-informix72.inc.php
\dev\github\adodb-master\drivers\adodb-ldap.inc.php
\dev\github\adodb-master\drivers\adodb-mssql.inc.php
\dev\github\adodb-master\drivers\adodb-mssqlnative.inc.php
\dev\github\adodb-master\drivers\adodb-mssqlpo.inc.php
\dev\github\adodb-master\drivers\adodb-mssql_n.inc.php
\dev\github\adodb-master\drivers\adodb-mysql.inc.php
\dev\github\adodb-master\drivers\adodb-mysqli.inc.php
\dev\github\adodb-master\drivers\adodb-mysqlpo.inc.php
\dev\github\adodb-master\drivers\adodb-mysqlt.inc.php
\dev\github\adodb-master\drivers\adodb-netezza.inc.php
\dev\github\adodb-master\drivers\adodb-oci8.inc.php
\dev\github\adodb-master\drivers\adodb-oci805.inc.php
\dev\github\adodb-master\drivers\adodb-oci8po.inc.php
\dev\github\adodb-master\drivers\adodb-oci8quercus.inc.php
\dev\github\adodb-master\drivers\adodb-odbc.inc.php
\dev\github\adodb-master\drivers\adodb-odbc_db2.inc.php
\dev\github\adodb-master\drivers\adodb-odbc_mssql.inc.php
\dev\github\adodb-master\drivers\adodb-odbc_oracle.inc.php
\dev\github\adodb-master\drivers\adodb-odbtp.inc.php
\dev\github\adodb-master\drivers\adodb-odbtp_unicode.inc.php
\dev\github\adodb-master\drivers\adodb-oracle.inc.php
\dev\github\adodb-master\drivers\adodb-pdo.inc.php
\dev\github\adodb-master\drivers\adodb-pdo_mssql.inc.php
\dev\github\adodb-master\drivers\adodb-pdo_mysql.inc.php
\dev\github\adodb-master\drivers\adodb-pdo_oci.inc.php
\dev\github\adodb-master\drivers\adodb-pdo_pgsql.inc.php
\dev\github\adodb-master\drivers\adodb-pdo_sqlite.inc.php
\dev\github\adodb-master\drivers\adodb-pdo_sqlsrv.inc.php
\dev\github\adodb-master\drivers\adodb-postgres.inc.php
\dev\github\adodb-master\drivers\adodb-postgres64.inc.php
\dev\github\adodb-master\drivers\adodb-postgres7.inc.php
\dev\github\adodb-master\drivers\adodb-postgres8.inc.php
\dev\github\adodb-master\drivers\adodb-postgres9.inc.php
\dev\github\adodb-master\drivers\adodb-proxy.inc.php
\dev\github\adodb-master\drivers\adodb-sapdb.inc.php
\dev\github\adodb-master\drivers\adodb-sqlanywhere.inc.php
\dev\github\adodb-master\drivers\adodb-sqlite.inc.php
\dev\github\adodb-master\drivers\adodb-sqlite3.inc.php
\dev\github\adodb-master\drivers\adodb-sqlitepo.inc.php
\dev\github\adodb-master\drivers\adodb-sybase.inc.php
\dev\github\adodb-master\drivers\adodb-sybase_ase.inc.php
\dev\github\adodb-master\drivers\adodb-text.inc.php
\dev\github\adodb-master\drivers\adodb-vfp.inc.php
\dev\github\adodb-master\lang\adodb-ar.inc.php
\dev\github\adodb-master\lang\adodb-bg.inc.php
\dev\github\adodb-master\lang\adodb-ca.inc.php
\dev\github\adodb-master\lang\adodb-cn.inc.php
\dev\github\adodb-master\lang\adodb-cz.inc.php
\dev\github\adodb-master\lang\adodb-da.inc.php
\dev\github\adodb-master\lang\adodb-de.inc.php
\dev\github\adodb-master\lang\adodb-en.inc.php
\dev\github\adodb-master\lang\adodb-eo.inc.php
\dev\github\adodb-master\lang\adodb-es.inc.php
\dev\github\adodb-master\lang\adodb-fa.inc.php
\dev\github\adodb-master\lang\adodb-fr.inc.php
\dev\github\adodb-master\lang\adodb-hu.inc.php
\dev\github\adodb-master\lang\adodb-it.inc.php
\dev\github\adodb-master\lang\adodb-nl.inc.php
\dev\github\adodb-master\lang\adodb-pl.inc.php
\dev\github\adodb-master\lang\adodb-pt-br.inc.php
\dev\github\adodb-master\lang\adodb-ro.inc.php
\dev\github\adodb-master\lang\adodb-ru.inc.php
\dev\github\adodb-master\lang\adodb-sv.inc.php
\dev\github\adodb-master\lang\adodb-th.inc.php
\dev\github\adodb-master\lang\adodb-uk.inc.php
\dev\github\adodb-master\pear\auth_adodb_example.php
\dev\github\adodb-master\pear\Auth\Container\ADOdb.php
\dev\github\adodb-master\perf\perf-db2.inc.php
\dev\github\adodb-master\perf\perf-informix.inc.php
\dev\github\adodb-master\perf\perf-mssql.inc.php
\dev\github\adodb-master\perf\perf-mssqlnative.inc.php
\dev\github\adodb-master\perf\perf-mysql.inc.php
\dev\github\adodb-master\perf\perf-oci8.inc.php
\dev\github\adodb-master\perf\perf-postgres.inc.php
\dev\github\adodb-master\replicate\adodb-replicate.inc.php
\dev\github\adodb-master\replicate\replicate-steps.php
\dev\github\adodb-master\replicate\test-tnb.php
\dev\github\adodb-master\session\adodb-compress-bzip2.php
\dev\github\adodb-master\session\adodb-compress-gzip.php
\dev\github\adodb-master\session\adodb-cryptsession.php
\dev\github\adodb-master\session\adodb-cryptsession2.php
\dev\github\adodb-master\session\adodb-encrypt-mcrypt.php
\dev\github\adodb-master\session\adodb-encrypt-md5.php
\dev\github\adodb-master\session\adodb-encrypt-secret.php
\dev\github\adodb-master\session\adodb-encrypt-sha1.php
\dev\github\adodb-master\session\adodb-session-clob.php
\dev\github\adodb-master\session\adodb-session-clob2.php
\dev\github\adodb-master\session\adodb-session.php
\dev\github\adodb-master\session\adodb-session2.php
\dev\github\adodb-master\session\crypt.inc.php
\dev\github\adodb-master\session\old\adodb-cryptsession.php
\dev\github\adodb-master\session\old\adodb-session-clob.php
\dev\github\adodb-master\session\old\adodb-session.php
\dev\github\adodb-master\session\old\crypt.inc.php
\dev\github\adodb-master\tests\benchmark.php
\dev\github\adodb-master\tests\client.php
\dev\github\adodb-master\tests\pdo.php
\dev\github\adodb-master\tests\test-active-record.php
\dev\github\adodb-master\tests\test-active-recs2.php
\dev\github\adodb-master\tests\test-active-relations.php
\dev\github\adodb-master\tests\test-active-relationsx.php
\dev\github\adodb-master\tests\test-datadict.php
\dev\github\adodb-master\tests\test-perf.php
\dev\github\adodb-master\tests\test-pgblob.php
\dev\github\adodb-master\tests\test-php5.php
\dev\github\adodb-master\tests\test-xmlschema.php
\dev\github\adodb-master\tests\test.php
\dev\github\adodb-master\tests\test2.php
\dev\github\adodb-master\tests\test3.php
\dev\github\adodb-master\tests\test4.php
\dev\github\adodb-master\tests\test5.php
\dev\github\adodb-master\tests\testcache.php
\dev\github\adodb-master\tests\testdatabases.inc.php
\dev\github\adodb-master\tests\testgenid.php
\dev\github\adodb-master\tests\testmssql.php
\dev\github\adodb-master\tests\testoci8.php
\dev\github\adodb-master\tests\testoci8cursor.php
\dev\github\adodb-master\tests\testpaging.php
\dev\github\adodb-master\tests\testpear.php
\dev\github\adodb-master\tests\testsessions.php
\dev\github\adodb-master\tests\test_rs_array.php
\dev\github\adodb-master\tests\time.php
\dev\github\adodb-master\tests\tmssql.php
178 File(s) copied

C:\dev\github\standards>rem copy \dev\github\adodb-master\adodb-active-record.inc.php \dev\github\sddata\adodb-active-record.inc.php 

C:\dev\github\standards>rem call phpcbf --standard=PEAR --no-patch \dev\github\sddata 

C:\dev\github\standards>rem call phpcs --standard=PEAR \dev\github\sddata \dev\github\standards\csout.txt 

C:\dev\github\standards>call phpcbf --standard=PEAR --no-patch \dev\github\sddata\adodb-active-record.inc.php 
Changing into directory C:\dev\github\sddata
Processing adodb-active-record.inc.php [PHP => 8622 tokens in 1140 lines]... DONE in 530ms (1899 fixable violations)
	=> Fixing file: 1899/1899 violations remaining
                                                                                
	=> Fixing file: 1029/1899 violations remaining [made 1 pass]... 
                                                                                
	=> Fixing file: 728/1899 violations remaining [made 2 passes]... 
                                                                                
	=> Fixing file: 385/1899 violations remaining [made 3 passes]... 
                                                                                
	=> Fixing file: 152/1899 violations remaining [made 4 passes]... 
                                                                                
	=> Fixing file: 40/1899 violations remaining [made 5 passes]... 
                                                                                
	=> Fixing file: 8/1899 violations remaining [made 6 passes]... 
                                                                                
	=> Fixing file: 0/1899 violations remaining [made 7 passes]... DONE in 3.72 secs
	=> File was overwritten
Fixed 1 files
Time: 4.32 secs; Memory: 23.5Mb


FILE: C:\dev\github\sddata\adodb-active-record.inc.php
----------------------------------------------------------------------
FOUND 133 ERRORS AND 44 WARNINGS AFFECTING 135 LINES
----------------------------------------------------------------------
    2 | ERROR   | You must use "/**" style comments for a file
      |         | comment
    4 | WARNING | Line exceeds 85 characters; contains 95 characters
   15 | WARNING | Line exceeds 85 characters; contains 93 characters
   21 | WARNING | Line exceeds 85 characters; contains 95 characters
   23 | WARNING | Line exceeds 85 characters; contains 104 characters
   31 | ERROR   | Missing class doc comment
   37 | ERROR   | Missing class doc comment
   51 | ERROR   | You must use "/**" style comments for a function
      |         | comment
   51 | ERROR   | Function name "ADODB_SetDatabaseAdapter" is
      |         | invalid; consider "ADODB_setDatabaseAdapter"
      |         | instead
   55 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
   61 | WARNING | Line exceeds 85 characters; contains 100 characters
   81 | ERROR   | Missing class doc comment
   87 | WARNING | Line exceeds 85 characters; contains 93 characters
   89 | WARNING | Line exceeds 85 characters; contains 124 characters
   93 | WARNING | Line exceeds 85 characters; contains 90 characters
   99 | ERROR   | Missing function doc comment
   99 | ERROR   | Method name "ADODB_Active_Record::UseDefaultValues"
      |         | is not in camel caps format
  109 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  109 | ERROR   | Method name
      |         | "ADODB_Active_Record::SetDatabaseAdapter" is not in
      |         | camel caps format
  115 | ERROR   | Missing function doc comment
  122 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  135 | ERROR   | Expected "} else {\n"; found "}\n            else {
      |         | "
  138 | WARNING | Line exceeds 85 characters; contains 87 characters
  144 | WARNING | Line exceeds 85 characters; contains 100 characters
  153 | WARNING | Line exceeds 85 characters; contains 123 characters
  158 | ERROR   | Missing function doc comment
  164 | ERROR   | Missing function doc comment
  192 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  201 | ERROR   | Expected "if (...) {\n"; found "if(...) {\n"
  204 | ERROR   | Expected "if (...) {\n"; found "if(...) {\n"
  214 | ERROR   | Expected "if (...) {\n"; found "if(...) {\n"
  222 | ERROR   | Missing function doc comment
  222 | WARNING | Line exceeds 85 characters; contains 93 characters
  227 | WARNING | Line exceeds 85 characters; contains 105 characters
  230 | WARNING | Line exceeds 85 characters; contains 118 characters
  234 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  234 | ERROR   | Method name "ADODB_Active_Record::TableHasMany" is
      |         | not in camel caps format
  234 | WARNING | Line exceeds 85 characters; contains 113 characters
  241 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  241 | ERROR   | Method name "ADODB_Active_Record::TableKeyHasMany"
      |         | is not in camel caps format
  241 | WARNING | Line exceeds 85 characters; contains 128 characters
  251 | WARNING | Line exceeds 85 characters; contains 112 characters
  253 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  253 | ERROR   | Method name "ADODB_Active_Record::ClassHasMany" is
      |         | not in camel caps format
  253 | WARNING | Line exceeds 85 characters; contains 119 characters
  260 | ERROR   | Missing function doc comment
  260 | WARNING | Line exceeds 85 characters; contains 106 characters
  268 | WARNING | Line exceeds 85 characters; contains 105 characters
  275 | ERROR   | Missing function doc comment
  275 | ERROR   | Method name "ADODB_Active_Record::ClassBelongsTo"
      |         | is not in camel caps format
  275 | WARNING | Line exceeds 85 characters; contains 127 characters
  281 | ERROR   | Missing function doc comment
  281 | ERROR   | Method name "ADODB_Active_Record::TableBelongsTo"
      |         | is not in camel caps format
  281 | WARNING | Line exceeds 85 characters; contains 127 characters
  287 | ERROR   | Missing function doc comment
  287 | ERROR   | Method name
      |         | "ADODB_Active_Record::TableKeyBelongsTo" is not in
      |         | camel caps format
  287 | WARNING | Line exceeds 85 characters; contains 142 characters
  300 | ERROR   | Missing parameter comment
  301 | ERROR   | Tag cannot be grouped with parameter tags in a doc
      |         | comment
  302 | ERROR   | Tag cannot be grouped with parameter tags in a doc
      |         | comment
  309 | ERROR   | Missing short description in doc comment
  309 | ERROR   | Doc comment for parameter "$offset" missing
  309 | ERROR   | Doc comment for parameter "$limit" missing
  310 | ERROR   | Missing parameter comment
  312 | ERROR   | Missing parameter name
  313 | ERROR   | Missing parameter name
  316 | ERROR   | Method name "ADODB_Active_Record::LoadRelations" is
      |         | not in camel caps format
  335 | ERROR   | Expected "if (...) {\n"; found "if(...) {\n"
  338 | ERROR   | Expected "if (...) {\n"; found "if(...) {\n"
  341 | ERROR   | Expected "} else {\n"; found "}\n            else
      |         | {\n"
  345 | ERROR   | Expected "} else {\n"; found "}\n               
      |         | else {\n"
  349 | WARNING | Line exceeds 85 characters; contains 111 characters
  356 | ERROR   | Expected "if (...) {\n"; found "if(...) {\n"
  364 | WARNING | Line exceeds 85 characters; contains 99 characters
  377 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  377 | ERROR   | Method name
      |         | "ADODB_Active_Record::UpdateActiveTable" is not in
      |         | camel caps format
  379 | WARNING | Line exceeds 85 characters; contains 96 characters
  390 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
  394 | ERROR   | Expected "} else {\n"; found "}\n               
      |         | else {\n"
  401 | WARNING | Line exceeds 85 characters; contains 98 characters
  402 | WARNING | Line exceeds 85 characters; contains 98 characters
  407 | WARNING | Line exceeds 85 characters; contains 92 characters
  408 | WARNING | Line exceeds 85 characters; contains 94 characters
  411 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
  415 | ERROR   | Expected "} else {\n"; found "}\n                  
      |         |  else {\n"
  422 | WARNING | Line exceeds 85 characters; contains 99 characters
  452 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
  462 | WARNING | Line exceeds 85 characters; contains 87 characters
  471 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
  476 | ERROR   | Expected "} else {\n"; found "}\n               
      |         | else {\n"
  481 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
  487 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
  493 | ERROR   | Expected "} else {\n"; found "}\n               
      |         | else {\n"
  499 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
  504 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
  510 | ERROR   | Expected "} else {\n"; found "}\n               
      |         | else {\n"
  515 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
  543 | ERROR   | Missing function doc comment
  543 | ERROR   | Method name "ADODB_Active_Record::GetPrimaryKeys"
      |         | is not in camel caps format
  549 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  549 | ERROR   | Method name "ADODB_Active_Record::Error" is not in
      |         | camel caps format
  559 | ERROR   | Expected "} else {\n"; found "}\n        else {\n"
  568 | ERROR   | Expected "} else {\n"; found "}\n            else
      |         | {\n"
  580 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  580 | ERROR   | Method name "ADODB_Active_Record::ErrorMsg" is not
      |         | in camel caps format
  586 | ERROR   | Expected "} else {\n"; found "}\n            else
      |         | {\n"
  598 | ERROR   | Missing function doc comment
  598 | ERROR   | Method name "ADODB_Active_Record::ErrorNo" is not
      |         | in camel caps format
  610 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  616 | WARNING | Line exceeds 85 characters; contains 112 characters
  625 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  625 | ERROR   | Method name "ADODB_Active_Record::TableInfo" is not
      |         | in camel caps format
  635 | WARNING | Line exceeds 85 characters; contains 102 characters
  636 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  636 | ERROR   | Method name "ADODB_Active_Record::Reload" is not in
      |         | camel caps format
  649 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  649 | ERROR   | Method name "ADODB_Active_Record::Set" is not in
      |         | camel caps format
  679 | ERROR   | Expected "} else {\n"; found "}\n        else {\n"
  686 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
  698 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  698 | ERROR   | Method name "ADODB_Active_Record::LastInsertID" is
      |         | not in camel caps format
  703 | ERROR   | Expected "} else {\n"; found "}\n        else {\n"
  715 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  736 | WARNING | Line exceeds 85 characters; contains 89 characters
  748 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  748 | ERROR   | Method name "ADODB_Active_Record::GenWhere" is not
      |         | in camel caps format
  753 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
  756 | WARNING | Line exceeds 85 characters; contains 91 characters
  763 | ERROR   | Missing function doc comment
  777 | WARNING | Line exceeds 85 characters; contains 89 characters
  779 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  779 | ERROR   | Method name "ADODB_Active_Record::Load" is not in
      |         | camel caps format
  797 | ERROR   | Expected "if (...) {\n"; found "if(...) {\n"
  814 | ERROR   | Missing function doc comment
  814 | ERROR   | Method name "ADODB_Active_Record::LoadLocked" is
      |         | not in camel caps format
  821 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  821 | ERROR   | Method name "ADODB_Active_Record::Reset" is not in
      |         | camel caps format
  828 | ERROR   | Expected "foreach (...) {\n"; found
      |         | "foreach(...){\n"
  829 | ERROR   | Expected "if (...) {\n"; found "if(...) {\n"
  838 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  838 | ERROR   | Method name "ADODB_Active_Record::Save" is not in
      |         | camel caps format
  843 | ERROR   | Expected "} else {\n"; found "}\n        else {\n"
  852 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  852 | ERROR   | Method name "ADODB_Active_Record::Insert" is not in
      |         | camel caps format
  865 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
  867 | ERROR   | Expected "if (...) {\n"; found "if(...) {\n"
  867 | WARNING | Line exceeds 85 characters; contains 93 characters
  876 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
  883 | WARNING | Line exceeds 85 characters; contains 108 characters
  889 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
  905 | ERROR   | Missing function doc comment
  905 | ERROR   | Method name "ADODB_Active_Record::Delete" is not in
      |         | camel caps format
  921 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  921 | ERROR   | Method name "ADODB_Active_Record::Find" is not in
      |         | camel caps format
  927 | WARNING | Line exceeds 85 characters; contains 119 characters
  932 | ERROR   | You must use "/**" style comments for a function
      |         | comment
  932 | ERROR   | Method name "ADODB_Active_Record::Replace" is not
      |         | in camel caps format
  944 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
  976 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
  980 | ERROR   | Expected "} elseif (...) {\n"; found "}\n       
      |         | elseif (...) {\n"
  981 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
  991 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
 1009 | ERROR   | You must use "/**" style comments for a function
      |         | comment
 1009 | ERROR   | Method name "ADODB_Active_Record::Update" is not in
      |         | camel caps format
 1028 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
 1042 | ERROR   | Expected "} else {\n"; found "}\n                  
      |         |  else {\n"
 1049 | WARNING | Line exceeds 85 characters; contains 89 characters
 1076 | ERROR   | Missing function doc comment
 1076 | ERROR   | Method name
      |         | "ADODB_Active_Record::GetAttributeNames" is not in
      |         | camel caps format
 1087 | ERROR   | Missing function doc comment
 1087 | ERROR   | Function name "adodb_GetActiveRecordsClass" is
      |         | prefixed with a package name but does not begin
      |         | with a capital letter
 1087 | WARNING | Line exceeds 85 characters; contains 94 characters
 1099 | ERROR   | Expected "if (...) {\n"; found "if(...) {\n"
 1101 | ERROR   | Expected "if (...) {\n"; found "if(...) {\n"
 1102 | WARNING | Line exceeds 85 characters; contains 86 characters
 1126 | WARNING | Line exceeds 85 characters; contains 100 characters
 1136 | ERROR   | Expected "foreach (...) {\n"; found "foreach(...)
      |         | {\n"
----------------------------------------------------------------------

Time: 505ms; Memory: 13Mb

/dev/github/sddata/adodb-active-record.inc.php
<?php
/*

@version V5.20dev  ??-???-2014  (c) 2000-2014 John Lim (jlim#natsoft.com). 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.92

  See http://www-128.ibm.com/developerworks/java/library/j-cb03076/?ca=dgr-lnxw01ActiveRecord
  	for info on Ruby on Rails Active Record implementation
*/


global $_ADODB_ACTIVE_DBS;
global $ADODB_ACTIVE_CACHESECS; // set to true to enable caching of metadata such as field info
global $ACTIVE_RECORD_SAFETY; // set to false to disable safety checks
global $ADODB_ACTIVE_DEFVALS; // use default values of table definition when creating new active record.

// array of ADODB_Active_DB's, indexed by ADODB_Active_Record->_dbat
$_ADODB_ACTIVE_DBS = array();
$ACTIVE_RECORD_SAFETY = true;
$ADODB_ACTIVE_DEFVALS = false;
$ADODB_ACTIVE_CACHESECS = 0;

/**
* This is the short description placeholder for the class docblock 
*
* This is the long description placeholder for the class docblock 
* Please see the ADOdb website for how to maintain adodb custom tags
*
* @category FIXME
* @package ADODB
* @author John Lim <author@domain.com>
* @license BSD (Primary) LGPL (Secondary)
* @release 5.21.0
* @link FIXME
* @adodb-class-status FIXME
*/
class  ADODB_Active_DB
{
    var $db; // ADOConnection
    var $tables; // assoc array of ADODB_Active_Table objects, indexed by tablename
}

/**
* This is the short description placeholder for the class docblock 
*
* This is the long description placeholder for the class docblock 
* Please see the ADOdb website for how to maintain adodb custom tags
*
* @category FIXME
* @package ADODB
* @author John Lim <author@domain.com>
* @license BSD (Primary) LGPL (Secondary)
* @release 5.21.0
* @link FIXME
* @adodb-class-status FIXME
*/
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
    var $_created; // only used when stored as a cached file
    var $_belongsTo = array();
    var $_hasMany = array();
}

// $db = database connection
// $index = name of index - can be associative, for an example see
//    http://phplens.com/lens/lensforum/msgs.php?id=17790
// returns index into $_ADODB_ACTIVE_DBS
function ADODB_SetDatabaseAdapter(&$db, $index=false)
{
    global $_ADODB_ACTIVE_DBS;

    foreach($_ADODB_ACTIVE_DBS as $k => $d) {
        if (PHP_VERSION >= 5) {
            if ($d->db === $db) {
                return $k;
            }
        } else {
            if ($d->db->_connectionID === $db->_connectionID && $db->database == $d->db->database) {
                return $k;
            }
        }
    }

    $obj = new ADODB_Active_DB();
    $obj->db = $db;
    $obj->tables = array();

    if ($index == false) {
        $index = sizeof($_ADODB_ACTIVE_DBS);
    }

    $_ADODB_ACTIVE_DBS[$index] = $obj;

    return sizeof($_ADODB_ACTIVE_DBS)-1;
}


/**
* This is the short description placeholder for the class docblock 
*
* This is the long description placeholder for the class docblock 
* Please see the ADOdb website for how to maintain adodb custom tags
*
* @category FIXME
* @package ADODB
* @author John Lim <author@domain.com>
* @license BSD (Primary) LGPL (Secondary)
* @release 5.21.0
* @link FIXME
* @adodb-class-status FIXME
*/
class  ADODB_Active_Record
{
    static $_changeNames = true; // dynamically pluralize table names
    static $_quoteNames = false;

    static $_foreignSuffix = '_id'; //
    var $_dbat; // associative index pointing to ADODB_Active_DB eg. $ADODB_Active_DBS[_dbat]
    var $_table; // tablename, if set in class definition then use it as table name
    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
    var $_original = false; // the original values loaded or inserted, refreshed on update

    var $foreignName; // CFR: class name when in a relationship

    var $lockMode = ' for update '; // you might want to change to

    static function UseDefaultValues($bool=null)
    {
        global $ADODB_ACTIVE_DEFVALS;
        if (isset($bool)) {
            $ADODB_ACTIVE_DEFVALS = $bool;
        }
        return $ADODB_ACTIVE_DEFVALS;
    }

    // should be static
    static function SetDatabaseAdapter(&$db, $index=false)
    {
        return ADODB_SetDatabaseAdapter($db, $index);
    }


    public function __set($name, $value)
    {
        $name = str_replace(' ', '_', $name);
        $this->$name = $value;
    }

    // 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) {
            if (!empty($this->_table)) {
                $table = $this->_table;
            }
            else { $table = $this->_pluralize(get_class($this)); 
            }
        }
        $this->foreignName = strtolower(get_class($this)); // CFR: default foreign name
        if ($db) {
            $this->_dbat = ADODB_Active_Record::SetDatabaseAdapter($db);
        } else if (!isset($this->_dbat)) {
            if (sizeof($_ADODB_ACTIVE_DBS) == 0) {
                $this->Error(
                    "No database connection set; use ADOdb_Active_Record::SetDatabaseAdapter(\$db)",
                    'ADODB_Active_Record::__constructor'
                );
            }
            end($_ADODB_ACTIVE_DBS);
            $this->_dbat = key($_ADODB_ACTIVE_DBS);
        }

        $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 __wakeup()
    {
        $class = get_class($this);
        new $class;
    }

    function _pluralize($table)
    {
        if (!ADODB_Active_Record::$_changeNames) {
            return $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';
        }
    }

    // CFR Lamest singular inflector ever - @todo Make it real!
    // Note: There is an assumption here...and it is that the argument's length >= 4
    function _singularize($tables)
    {

        if (!ADODB_Active_Record::$_changeNames) {
            return $table;
        }

        $ut = strtoupper($tables);
        $len = strlen($tables);
        if($ut[$len-1] != 'S') {
            return $tables; // I know...forget oxen
        }
        if($ut[$len-2] != 'E') {
            return substr($tables, 0, $len-1);
        }
        switch($ut[$len-3]) {
        case 'S':
        case 'X':
            return substr($tables, 0, $len-2);
        case 'I':
            return substr($tables, 0, $len-3) . 'y';
        case 'H';
            if($ut[$len-4] == 'C' || $ut[$len-4] == 'S') {
                return substr($tables, 0, $len-2);
            }
        default:
            return substr($tables, 0, $len-1); // ?
        }
    }

    function hasMany($foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record')
    {
        $ar = new $foreignClass($foreignRef);
        $ar->foreignName = $foreignRef;
        $ar->UpdateActiveTable();
        $ar->foreignKey = ($foreignKey) ? $foreignKey : $foreignRef.ADODB_Active_Record::$_foreignSuffix;
        $table =& $this->TableInfo();
        $table->_hasMany[$foreignRef] = $ar;
        // 	$this->$foreignRef = $this->_hasMany[$foreignRef]; // WATCHME Removed assignment by ref. to please __get()
    }

    // use when you don't want ADOdb to auto-pluralize tablename
    static function TableHasMany($table, $foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record')
    {
        $ar = new ADODB_Active_Record($table);
        $ar->hasMany($foreignRef, $foreignKey, $foreignClass);
    }

    // use when you don't want ADOdb to auto-pluralize tablename
    static function TableKeyHasMany($table, $tablePKey, $foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record')
    {
        if (!is_array($tablePKey)) {
            $tablePKey = array($tablePKey);
        }
        $ar = new ADODB_Active_Record($table, $tablePKey);
        $ar->hasMany($foreignRef, $foreignKey, $foreignClass);
    }


    // use when you want ADOdb to auto-pluralize tablename for you. Note that the class must already be defined.
    // e.g. class Person will generate relationship for table Persons
    static function ClassHasMany($parentclass, $foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record')
    {
        $ar = new $parentclass();
        $ar->hasMany($foreignRef, $foreignKey, $foreignClass);
    }


    function belongsTo($foreignRef,$foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record')
    {
        global $inflector;

        $ar = new $parentClass($this->_pluralize($foreignRef));
        $ar->foreignName = $foreignRef;
        $ar->parentKey = $parentKey;
        $ar->UpdateActiveTable();
        $ar->foreignKey = ($foreignKey) ? $foreignKey : $foreignRef.ADODB_Active_Record::$_foreignSuffix;

        $table =& $this->TableInfo();
        $table->_belongsTo[$foreignRef] = $ar;
        // 	$this->$foreignRef = $this->_belongsTo[$foreignRef];
    }

    static function ClassBelongsTo($class, $foreignRef, $foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record')
    {
        $ar = new $class();
        $ar->belongsTo($foreignRef, $foreignKey, $parentKey, $parentClass);
    }

    static function TableBelongsTo($table, $foreignRef, $foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record')
    {
        $ar = new ADOdb_Active_Record($table);
        $ar->belongsTo($foreignRef, $foreignKey, $parentKey, $parentClass);
    }

    static function TableKeyBelongsTo($table, $tablePKey, $foreignRef, $foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record')
    {
        if (!is_array($tablePKey)) {
            $tablePKey = array($tablePKey);
        }
        $ar = new ADOdb_Active_Record($table, $tablePKey);
        $ar->belongsTo($foreignRef, $foreignKey, $parentKey, $parentClass);
    }


    /**
     * __get Access properties - used for lazy loading
     *
     * @param  mixed $name
     * @access protected
     * @return mixed
     */
    function __get($name)
    {
        return $this->LoadRelations($name, '', -1, -1);
    }

    /**
     * @param string $name
     * @param string $whereOrderBy : eg. ' AND field1 = value ORDER BY field2'
     * @param offset
     * @param limit
     * @return mixed
     */
    function LoadRelations($name, $whereOrderBy='', $offset=-1,$limit=-1)
    {
        $extras = array();
        $table = $this->TableInfo();
        if ($limit >= 0) {
            $extras['limit'] = $limit;
        }
        if ($offset >= 0) {
            $extras['offset'] = $offset;
        }

        if (strlen($whereOrderBy)) {
            if (!preg_match('/^[ \n\r]*AND/i', $whereOrderBy)) {
                if (!preg_match('/^[ \n\r]*ORDER[ \n\r]/i', $whereOrderBy)) {
                    $whereOrderBy = 'AND ' . $whereOrderBy;
                }
            }
        }

        if(!empty($table->_belongsTo[$name])) {
            $obj = $table->_belongsTo[$name];
            $columnName = $obj->foreignKey;
            if(empty($this->$columnName)) {
                $this->$name = null;
            }
            else {
                if ($obj->parentKey) {
                    $key = $obj->parentKey;
                }
                else {
                    $key = reset($table->keys);
                }

                $arrayOfOne = $obj->Find($key.'='.$this->$columnName.' '.$whereOrderBy, false, false, $extras);
                if ($arrayOfOne) {
                    $this->$name = $arrayOfOne[0];
                    return $arrayOfOne[0];
                }
            }
        }
        if(!empty($table->_hasMany[$name])) {
            $obj = $table->_hasMany[$name];
            $key = reset($table->keys);
            $id = @$this->$key;
            if (!is_numeric($id)) {
                $db = $this->DB();
                $id = $db->qstr($id);
            }
            $objs = $obj->Find($obj->foreignKey.'='.$id. ' '.$whereOrderBy, false, false, $extras);
            if (!$objs) {
                $objs = array();
            }
            $this->$name = $objs;
            return $objs;
        }

        return array();
    }
    //////////////////////////////////

    // update metadata
    function UpdateActiveTable($pkeys=false,$forceUpdate=false)
    {
        global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS , $ADODB_CACHE_DIR, $ADODB_ACTIVE_CACHESECS;
        global $ADODB_ACTIVE_DEFVALS,$ADODB_FETCH_MODE;

        $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat];

        $table = $this->_table;
        $tables = $activedb->tables;
        $tableat = $this->_tableat;
        if (!$forceUpdate && !empty($tables[$tableat])) {

            $acttab = $tables[$tableat];
            foreach($acttab->flds as $name => $fld) {
                if ($ADODB_ACTIVE_DEFVALS && isset($fld->default_value)) {
                    $this->$name = $fld->default_value;
                }
                else {
                    $this->$name = null;
                }
            }
            return;
        }
        $db = $activedb->db;
        $fname = $ADODB_CACHE_DIR . '/adodb_' . $db->databaseType . '_active_'. $table . '.cache';
        if (!$forceUpdate && $ADODB_ACTIVE_CACHESECS && $ADODB_CACHE_DIR && file_exists($fname)) {
            $fp = fopen($fname, 'r');
            @flock($fp, LOCK_SH);
            $acttab = unserialize(fread($fp, 100000));
            fclose($fp);
            if ($acttab->_created + $ADODB_ACTIVE_CACHESECS - (abs(rand()) % 16) > time()) {
                // abs(rand()) randomizes deletion, reducing contention to delete/refresh file
                // ideally, you should cache at least 32 secs

                foreach($acttab->flds as $name => $fld) {
                    if ($ADODB_ACTIVE_DEFVALS && isset($fld->default_value)) {
                        $this->$name = $fld->default_value;
                    }
                    else {
                        $this->$name = null;
                    }
                }

                $activedb->tables[$table] = $acttab;

                //if ($db->debug) ADOConnection::outp("Reading cached active record file: $fname");
                return;
            } else if ($db->debug) {
                ADOConnection::outp("Refreshing cached active record file: $fname");
            }
        }
        $activetab = new ADODB_Active_Table();
        $activetab->name = $table;

        $save = $ADODB_FETCH_MODE;
        $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
        if ($db->fetchMode !== false) {
            $savem = $db->SetFetchMode(false);
        }

        $cols = $db->MetaColumns($table);

        if (isset($savem)) {
            $db->SetFetchMode($savem);
        }
        $ADODB_FETCH_MODE = $save;

        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);
                if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) {
                    $this->$name = $fldobj->default_value;
                }
                else {
                    $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);

                if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) {
                    $this->$name = $fldobj->default_value;
                }
                else {
                    $this->$name = null;
                }
                $attr[$name] = $fldobj;
            }

            foreach($pkeys as $k => $name) {
                $keys[strtoupper($name)] = strtoupper($name);
            }
            break;
        default:
            foreach($cols as $name => $fldobj) {
                $name = ($fldobj->name);

                if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) {
                    $this->$name = $fldobj->default_value;
                }
                else {
                    $this->$name = null;
                }
                $attr[$name] = $fldobj;
            }
            foreach($pkeys as $k => $name) {
                $keys[$name] = $cols[$name]->name;
            }
            break;
        }

        $activetab->keys = $keys;
        $activetab->flds = $attr;

        if ($ADODB_ACTIVE_CACHESECS && $ADODB_CACHE_DIR) {
            $activetab->_created = time();
            $s = serialize($activetab);
            if (!function_exists('adodb_write_file')) {
                include ADODB_DIR.'/adodb-csvlib.inc.php';
            }
            adodb_write_file($fname, $s);
        }
        if (isset($activedb->tables[$table])) {
            $oldtab = $activedb->tables[$table];

            if ($oldtab) {
                $activetab->_belongsTo = $oldtab->_belongsTo;
                $activetab->_hasMany = $oldtab->_hasMany;
            }
        }
        $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;
    }

    function ErrorNo()
    {
        if ($this->_dbat < 0) {
            return -9999; // no database connection...
        }
        $db = $this->DB();

        return (int) $db->ErrorNo();
    }


    // 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;
    }


    // I have an ON INSERT trigger on a table that sets other columns in the table.
    // So, I find that for myTable, I want to reload an active record after saving it. -- Malcolm Cook
    function Reload()
    {
        $db = $this->DB();
        if (!$db) {
            return false;
        }
        $table = $this->TableInfo();
        $where = $this->GenWhere($db, $table);
        return($this->Load($where));
    }


    // set a numeric array (using natural table field ordering) as object properties
    function Set(&$row)
    {
        global $ACTIVE_RECORD_SAFETY;

        $db = $this->DB();

        if (!$row) {
            $this->_saved = false;
            return false;
        }

        $this->_saved = true;

        $table = $this->TableInfo();
        if ($ACTIVE_RECORD_SAFETY && sizeof($table->flds) != sizeof($row)) {
            // <AP>
            $bad_size = true;
            if (sizeof($row) == 2 * sizeof($table->flds)) {
                // Only keep string keys
                $keys = array_filter(array_keys($row), 'is_string');
                if (sizeof($keys) == sizeof($table->flds)) {
                    $bad_size = false;
                }
            }
            if ($bad_size) {
                $this->Error("Table structure of $this->_table has changed", "Load");
                return false;
            }
            // </AP>
        }
        else {
            $keys = array_keys($row); 
        }

        // <AP>
        reset($keys);
        $this->_original = array();
        foreach($table->flds as $name=>$fld) {
            $value = $row[current($keys)];
            $this->$name = $value;
            $this->_original[] = $value;
            next($keys);
        }

        // </AP>
        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 'L':
            if (strpos($db->databaseType, 'postgres') !== false) {
                return $db->qstr($val);
            }
        case 'D':
        case 'T':
            if (empty($val)) {
                return 'null';
            }
        case 'B':
        case 'N':
        case 'C':
        case 'X':
            if (is_null($val)) {
                return 'null';
            }

            if (strlen($val)>0 
                && (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);
    }


    function _QName($n,$db=false)
    {
        if (!ADODB_Active_Record::$_quoteNames) {
            return $n;
        }
        if (!$db) {
            $db = $this->DB();
            if (!$db) {
                return false;
            }
        }
        return $db->nameQuote.$n.$db->nameQuote;
    }

    //------------------------------------------------------------ Public functions below

    function Load($where=null,$bindarr=false, $lock = false)
    {
        global $ADODB_FETCH_MODE;

        $db = $this->DB();
        if (!$db) {
            return false;
        }
        $this->_where = $where;

        $save = $ADODB_FETCH_MODE;
        $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
        if ($db->fetchMode !== false) {
            $savem = $db->SetFetchMode(false);
        }

        $qry = "select * from ".$this->_table;

        if($where) {
            $qry .= ' WHERE '.$where;
        }
        if ($lock) {
            $qry .= $this->lockMode;
        }

        $row = $db->GetRow($qry, $bindarr);

        if (isset($savem)) {
            $db->SetFetchMode($savem);
        }
        $ADODB_FETCH_MODE = $save;

        return $this->Set($row);
    }

    function LoadLocked($where=null, $bindarr=false)
    {
        $this->Load($where, $bindarr, true);
    }

    // useful for multiple record inserts
    // see http://phplens.com/lens/lensforum/msgs.php?id=17795
    function Reset()
    {
        $this->_where=null;
        $this->_saved = false;
        $this->_lasterr = false;
        $this->_original = false;
        $vars=get_object_vars($this);
        foreach($vars as $k=>$v){
            if(substr($k, 0, 1)!=='_') {
                $this->{$k}=null;
            }
        }
        $this->foreignName=strtolower(get_class($this));
        return true;
    }

    // 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();

        $valarr = array();
        $names = array();
        $valstr = array();

        foreach($table->flds as $name=>$fld) {
            $val = $this->$name;
            if(!is_array($val) || !is_null($val) || !array_key_exists($name, $table->keys)) {
                $valarr[] = $val;
                $names[] = $this->_QName($name, $db);
                $valstr[] = $db->Param($cnt);
                $cnt += 1;
            }
        }

        if (empty($names)) {
            foreach($table->flds as $name=>$fld) {
                $valarr[] = null;
                $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;
        $ok = $db->Execute($sql);

        return $ok ? true : false;
    }

    // returns an array of active record objects
    function Find($whereOrderBy,$bindarr=false,$pkeysArr=false,$extra=array())
    {
        $db = $this->DB();
        if (!$db || empty($this->_table)) {
            return false;
        }
        $arr = $db->GetActiveRecordsClass(get_class($this), $this->_table, $whereOrderBy, $bindarr, $pkeysArr, $extra);
        return $arr;
    }

    // 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;
            }
            }
            }*/
            if (is_null($val) && !empty($fld->auto_increment)) {
                continue;
            }

            if (is_array($val)) {
                continue;
            }

            $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 == 1) {
            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 0 on error, 1 on update, -1 if no change in data (no update)
    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;
        }
        $valarr = array();
        $neworig = array();
        $pairs = array();
        $i = -1;
        $cnt = 0;
        foreach($table->flds as $name=>$fld) {
            $i += 1;
            $val = $this->$name;
            $neworig[] = $val;

            if (isset($table->keys[$name]) || is_array($val)) {
                continue;
            }

            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;
                    }
                }
            }

            if (isset($this->_original[$i]) && strcmp($val, $this->_original[$i]) == 0) {
                continue;
            }

            if (is_null($this->_original[$i]) && is_null($val)) {
                continue;
            }

            $valarr[] = $val;
            $pairs[] = $this->_QName($name, $db).'='.$db->Param($cnt);
            $cnt += 1;
        }


        if (!$cnt) {
            return -1;
        }

        $sql = 'UPDATE '.$this->_table." SET ".implode(",", $pairs)." WHERE ".$where;
        $ok = $db->Execute($sql, $valarr);
        if ($ok) {
            $this->_original = $neworig;
            return 1;
        }
        return 0;
    }

    function GetAttributeNames()
    {
        $table = $this->TableInfo();
        if (!$table) {
            return false;
        }
        return array_keys($table->flds);
    }

};

function adodb_GetActiveRecordsClass(&$db, $class, $table,$whereOrderBy,$bindarr, $primkeyArr,
    $extra
) {
    global $_ADODB_ACTIVE_DBS;


    $save = $db->SetFetchMode(ADODB_FETCH_NUM);
    $qry = "select * from ".$table;

    if (!empty($whereOrderBy)) {
        $qry .= ' WHERE '.$whereOrderBy;
    }
    if(isset($extra['limit'])) {
        $rows = false;
        if(isset($extra['offset'])) {
            $rs = $db->SelectLimit($qry, $extra['limit'], $extra['offset'], $bindarr);
        } else {
            $rs = $db->SelectLimit($qry, $extra['limit'], -1, $bindarr);
        }
        if ($rs) {
            while (!$rs->EOF) {
                $rows[] = $rs->fields;
                $rs->MoveNext();
            }
        }
    } else {
        $rows = $db->GetAll($qry, $bindarr); 
    }

    $db->SetFetchMode($save);

    $false = false;

    if ($rows === false) {
        return $false;
    }


    if (!class_exists($class)) {
        $db->outp_throw("Unknown class $class in GetActiveRecordsClass()", 'GetActiveRecordsClass');
        return $false;
    }
    $arr = array();
    // arrRef will be the structure that knows about our objects.
    // It is an associative array.
    // We will, however, return arr, preserving regular 0.. order so that
    // obj[0] can be used by app developpers.
    $arrRef = array();
    $bTos = array(); // Will store belongTo's indices if any
    foreach($rows as $row) {

        $obj = new $class($table,$primkeyArr,$db);
        if ($obj->ErrorNo()) {
            $db->_errorMsg = $obj->ErrorMsg();
            return $false;
        }
        $obj->Set($row);
        $arr[] = $obj;
    } // foreach($rows as $row)

    return $arr;
}
