Changeset 468

Show
Ignore:
Timestamp:
01/27/08 13:34:16 (4 years ago)
Author:
bermiferrer
Message:

WARNING: IMPORTANT CHANGES AHEAD!


* Relocated Active Record database adapters, behaviors and associations into lib/AkActiveRecord/AkDbAdapters, AkActsAsBehaviours? and AkAssociations? respectively.

## Merging Kaste's branch with the trunk.

* [387] Refactored AkActiveRecord::find().
* [387] API-change: removed find('first', $id, $options) cause finding one id is always "first". Use find($id, $options); instead.
* [395] Deprecated AkActiveRecord::find($sql) which silently expanded to AkActiveRecord::find('first', $sql).
This was ambiguous because find($sql, $bind_variables*) expanded to find('all',*)
Use AkActiveRecord::find('first', $sql) instead.
* [396] Added AkDbAdapter? between ADODb and the Active Record.
* [396] Expanded AkUnitTest? so its easy to generate Models on the fly like:

$AkUnitTest->installAndIncludeModels(array('Article'=>'id,name,description'));

Creates the table 'articles' with specified columns and builds the ActiveRecord? Model (class) 'Article'.
* [396] AkActiveRecord::toYaml now handles ActiveRecord? collections.

User::toYaml($found_users);

* [407] Fixed typos on the Active Record like $asssociated_ids....
* [407] Improved and refactored Active Record unit tests.
* [405] Fixed AkHasAndBelongsToMany/AkHasMany::getAssociatedModelInstance which Singleton was badly implemented.
* [416] Avoided unsetting database profiles.
* [416] Added support for extra database profiles you can quickly test with different db-adapters like:

ActiveRecord::establishConnection('super_user');
./test _some_test_case.php sqlite_test_profile

* [417] Changed NewDataDictionary(db->connection) to db->getDictionary();
* [418] AkHasAndBelongsToMany? now uses AkInstaller? to create the join table. Because of that it creates the sequence_table for sqlite straight away.
* [419] Fixed singleton implementation of Ak::getLogger()
* [425] AkInstaller?: Added magic 'lock_version' column.

'lock_version' => 'lock_version int default=1'

* [427] Refactored the Active Record "callback"-chain. Fixes #95 and #94.
* [427] Added create, update and execute methods to AkDbAdapter?.
* [428] Adding support for late bindings on AkDbAdapter::execute()
This allows you to safely sanitize parameters before adding them to your custom SQL queries.

AkDbAdapter::execute(array('select * from articles where id=?', 1));

* [429] Added addLimitAndOffset method to AkDbAdapter? for delegating limits and offsets.
* [431] Implemented renameColumn in AkDbAdapter?. Closes #47 and #96.
* [436] Removed AkActiveRecord::sqlSelect* (now in AkDbAdapter?)
* [437] Moved transactions to AkDbAdapter?
* [439] Fixed a serious issue in a TEST that could lead to data loss in the development database.
* [441] Replacing MetaTables() and MetaColumns() with AkDbAdapter::availableTables() and AkDbAdapter::getColumnDetails($table).
* [446] Improved the MenuHeper?
* [446] Changed default options for AkPluginManager::updatePlugin(). Disables externals and checkout.
* [448] AkActiveRecord::findBySql now uses AkDbAdapter::select
* [450] AkActiveRecord::incrementCounter() and decrementCounter() now are pseudo-static.
* [450] AkActiveRecord::updateAttribute() now validates when saving by default. Pass 'false' as third argument to bypass validation.
* [451] AkInstaller? automatically sets '*_count'-columns => 'columnname int default 0'
* [458] Fixed #103, quoting strings on PostgreSQL.
* [459] Adding decimal-type support on Active Records.
* [459] Datatypes for PostgreSQL changed. You need to update/change your table schemas! Run migrations!
Before this, we kinda hacked Mysql-behavior into PostgreSQL. Thus we didnt used features of Postgre on one side.

In the long run we had to fix - better now than later - since the design problems only "multiply" when time goes by.

At this point we wanted to implement the decimal/numeric datatype. And so we had to decide whether to hack further or to solve the underlying issue. This means we HAD to correct a wrong implementation.

(simplified type>) Akelos Postgre (<Actual Type)

Until now we had:

boolean => numeric(1)
integer => numeric(X,0)


From now on we have:

boolean => bool
integer => integer (int4)
decimal => numeric


To guide you through this we'll have a test at test/unit/lib/AkActiveRecord/_PostgreSQL_datatype_migration.php.

First make you comfortably with this test and make it pass. This is a test against a dummy-table of course.
(When you're on Postgre 7 you have to modify this test. But you'll see that.)

Next write appropriate migrations/installers for your real tables. (Again: You should always begin with a test.)

Keep in mind that we typecast TINYINT as boolean on MySQL. So you cannot use tinyint for other things.
* [459] Boolean columns now actually have three possible states: true, false and null. Before that null=>false!
* [461] ActiveRecordHelper::error_messages_for and error_message_on now translate the error messages.
* [467] NULL values can be saved on boolean and decimal columns. Fixes #114 and #113.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/CHANGELOG.txt

    r423 r468  
    11SVN 
    22---------------------- 
     3 
     4* Relocated Active Record database adapters, behaviors and associations into lib/AkActiveRecord/AkDbAdapters, AkActsAsBehaviours and AkAssociations respectively. 
     5 
     6---------- 
     7 
     8## Merging Kaste's branch with the trunk. 
     9 
     10    WARNING: IMPORTANT CHANGES AHEAD! 
     11 
     12* [387] Refactored AkActiveRecord::find().  
     13* [387] API-change: removed find('first', $id, $options) cause finding one id is always "first". Use find($id, $options); instead. 
     14* [395] Deprecated AkActiveRecord::find($sql) which silently expanded to AkActiveRecord::find('first', $sql). 
     15This was ambiguous because find($sql, $bind_variables*) expanded to find('all',*) 
     16Use AkActiveRecord::find('first', $sql) instead. 
     17* [396] Added AkDbAdapter between ADODb and the Active Record. 
     18* [396] Expanded AkUnitTest so its easy to generate Models on the fly like:  
     19 
     20    $AkUnitTest->installAndIncludeModels(array('Article'=>'id,name,description')); 
     21 
     22Creates the table 'articles' with specified columns and builds the ActiveRecord Model (class) 'Article'. 
     23* [396] AkActiveRecord::toYaml now handles ActiveRecord collections. 
     24 
     25    User::toYaml($found_users); 
     26 
     27* [407] Fixed typos on the Active Record like $asssociated_ids.... 
     28* [407] Improved and refactored Active Record unit tests. 
     29* [405] Fixed AkHasAndBelongsToMany/AkHasMany::getAssociatedModelInstance which Singleton was badly implemented. 
     30* [416] Avoided unsetting database profiles. 
     31* [416] Added support for extra database profiles you can quickly test with different db-adapters like: 
     32 
     33    ActiveRecord::establishConnection('super_user'); 
     34    ./test _some_test_case.php sqlite_test_profile  
     35 
     36* [417] Changed NewDataDictionary(db->connection) to db->getDictionary(); 
     37* [418] AkHasAndBelongsToMany now uses AkInstaller to create the join table. Because of that it creates the sequence_table for sqlite straight away. 
     38* [419] Fixed singleton implementation of Ak::getLogger()  
     39* [425] AkInstaller: Added magic 'lock_version' column. 
     40 
     41    'lock_version' => 'lock_version int default=1' 
     42 
     43* [427] Refactored the Active Record "callback"-chain. Fixes #95 and #94. 
     44* [427] Added create, update and execute methods to AkDbAdapter. 
     45* [428] Adding support for late bindings on AkDbAdapter::execute() 
     46This allows you to safely sanitize parameters before adding them to your custom SQL queries. 
     47 
     48    AkDbAdapter::execute(array('select * from articles where id=?', 1)); 
     49 
     50* [429] Added addLimitAndOffset method to AkDbAdapter for delegating limits and offsets. 
     51* [431] Implemented renameColumn in AkDbAdapter. Closes #47 and #96. 
     52* [436] Removed AkActiveRecord::sqlSelect* (now in AkDbAdapter) 
     53* [437] Moved transactions to AkDbAdapter 
     54* [439] Fixed a serious issue in a TEST that could lead to data loss in the development database.  
     55* [441] Replacing MetaTables() and MetaColumns() with  AkDbAdapter::availableTables() and AkDbAdapter::getColumnDetails($table).  
     56* [446] Improved the MenuHeper 
     57* [446] Changed default options for AkPluginManager::updatePlugin(). Disables externals and checkout. 
     58* [448] AkActiveRecord::findBySql now uses AkDbAdapter::select 
     59* [450] AkActiveRecord::incrementCounter() and decrementCounter() now are pseudo-static. 
     60* [450] AkActiveRecord::updateAttribute() now validates when saving by default. Pass 'false' as third argument to bypass validation. 
     61* [451] AkInstaller automatically sets '*_count'-columns => 'columnname int default 0' 
     62* [458] Fixed #103, quoting strings on PostgreSQL. 
     63* [459] Adding decimal-type support on Active Records. 
     64* [459] Datatypes for PostgreSQL changed. You need to update/change your table schemas! Run migrations! 
     65Before this, we kinda hacked Mysql-behavior into PostgreSQL. Thus we didnt used features of Postgre on one side.  
     66 
     67In the long run we had to fix - better now than later - since the design problems only "multiply" when time goes by.   
     68 
     69At this point we wanted to implement the decimal/numeric datatype. And so we had to decide whether to hack further or to solve the underlying issue. This means we HAD to correct a wrong implementation.   
     70 
     71    (simplified type>) Akelos      Postgre (<Actual Type)  
     72 
     73Until now we had: 
     74 
     75    boolean  => numeric(1)  
     76    integer  => numeric(X,0)  
     77                        
     78From now on we have: 
     79    boolean  => bool  
     80    integer  => integer  (int4)  
     81    decimal  => numeric  
     82                                    
     83To guide you through this we'll have a test at test/unit/lib/AkActiveRecord/_PostgreSQL_datatype_migration.php.  
     84 
     85First make you comfortably with this test and make it pass. This is a test against a dummy-table of course.  
     86(When you're on Postgre 7 you have to modify this test. But you'll see that.)   
     87 
     88Next write appropriate migrations/installers for your real tables. (Again: You should always begin with a test.)  
     89 
     90Keep in mind that we typecast TINYINT as boolean on MySQL. So you cannot use tinyint for other things.                                               
     91* [459] Boolean columns now actually have three possible states: true, false and null. Before that null=>false! 
     92* [461] ActiveRecordHelper::error_messages_for and error_message_on now translate the error messages. 
     93* [467] NULL values can be saved on boolean and decimal columns. Fixes #114 and #113. 
     94 
     95#### End of Kaste merge 
     96 
     97----------- 
     98 
    399* AkInstaller::createTable() will now add created_at and updated_at columns automatically unless you have one of  
    4100  them in your table declaration or set the option 'timestamp' => false 
     
    75171 
    76172 * First public release 
     173 
     174 
  • trunk/app/models/framework_setup.php

    r408 r468  
    248248            $dsn = $this->_getDsn($mode); 
    249249            if(!isset($unique_dsn[$dsn])){ 
    250                 $db_conn =& Ak::db($dsn, $mode); 
     250                $db_conn =& Ak::db($dsn); 
    251251                $installer =& new FrameworkInstaller($db_conn); 
    252252                $installer->install(null, array('mode' => $mode)); 
  • trunk/config/environments/testing.php

    r290 r468  
    77@ini_set('memory_limit', -1); 
    88 
    9 $GLOBALS['ak_test_db_dns'] = isset($dsn) ? $dsn : $testing_database; 
    10  
    119?> 
  • trunk/lib/Ak.php

    r424 r468  
    4646 
    4747    /** 
    48     * Gets an instance of AdoDb database connection 
     48    * Gets an instance of AkDbAdapter 
    4949    * 
    5050    * Whenever a database connection is required you can get a 
    5151    * reference to the default database connection by doing: 
    5252    * 
    53     * $db =& Ak:db(); // get an adodb instance 
     53    * $db =& Ak::db(); // get an adodb instance 
    5454    *  
    5555    * AdoDB manual can be found at http://phplens.com/adodb/ 
     
    6262    * @return resource Php AdoDb instance. 
    6363    */ 
    64     function &db($dsn = null, $connection_id = null) 
    65     { 
    66         static $db, $default_connection_id; 
    67  
    68         // In order to retrieve a database connection we just need to provide its identifier 
    69         if(empty($default_connection_id)){ 
    70             $default_connection_id = md5($dsn); 
    71         } 
    72         $connection_id = empty($connection_id) ? $default_connection_id : $connection_id; 
    73          
    74         if(empty($db[$connection_id])){ 
    75             require_once(AK_CONTRIB_DIR.DS.'adodb'.DS.'adodb.inc.php'); 
    76  
    77             if(substr($dsn, 0, 6) == 'mysql:'){ 
    78                 $dsn = substr_replace($dsn, 'mysqlt:', 0, 6); 
    79             } 
    80  
    81             if (!$db[$connection_id] = (AK_DEBUG ? NewADOConnection($dsn) : @NewADOConnection($dsn))){ 
    82                 error_reporting(E_ALL); 
    83                 if(defined('AK_DATABASE_CONNECTION_FAILURE_CALLBACK') && function_exists(AK_DATABASE_CONNECTION_FAILURE_CALLBACK)){ 
    84                     $fn = AK_DATABASE_CONNECTION_FAILURE_CALLBACK; 
    85                     $fn(); 
    86                 } 
    87                 if(!AK_PHP5 && substr($dsn,0,6) == 'sqlite'){ 
    88                     echo "\nWarning, sqlite support is not available by default on PHP4.\n Check your PHP version by running \"env php -v\", and change the first line in your scripts/ so they point to a php5 binary\n\n"; 
    89                 } 
    90                 die(Ak::t('Connection to the database failed.').' '. 
    91                 (AK_DEBUG?preg_replace('/\/\/(\w+):(.*)@/i','//$1:******@', urldecode($dsn))."\n":'')); 
    92             } 
    93             $db[$connection_id]->debug = AK_DEBUG == 2; 
    94             defined('AK_DATABASE_CONNECTION_AVAILABLE') ? null : define('AK_DATABASE_CONNECTION_AVAILABLE', true); 
    95             $dsn = ''; 
    96         } 
    97         return $db[$connection_id]; 
    98     } 
    99  
    100  
     64    function &db($dsn = null) 
     65    { 
     66        require_once(AK_LIB_DIR.DS.'AkActiveRecord'.DS.'AkDbAdapter.php'); 
     67        if (empty($dsn) || !is_array($dsn)){ 
     68            return AkDbAdapter::getInstance(); 
     69        } 
     70        return AkDbAdapter::getInstance($dsn); 
     71    } 
     72 
     73    /** 
     74     * @param string $message 
     75     * @param [OPTIONAL] $fatal triggers even in production-mode 
     76     */ 
     77    function DeprecateWarning($message, $fatal=false) 
     78    { 
     79        if (!$fatal && AK_ENVIRONMENT == 'production'){ 
     80            return; 
     81        } 
     82        if (is_array($message)){ 
     83            trigger_error(Ak::t("DEPRECATED WARNING: ".array_shift($message),$message), E_USER_NOTICE); 
     84        } else { 
     85            trigger_error(Ak::t("DEPRECATED WARNING: ".$message), E_USER_NOTICE); 
     86        } 
     87    } 
    10188 
    10289    /** 
     
    510497        $origin = Ak::_getRestrictedPath($origin, $options); 
    511498        $target = Ak::_getRestrictedPath($target, $options); 
    512          
     499 
    513500        if(empty($origin) || empty($target)){ 
    514501            return false; 
     
    560547            $path = trim(str_replace(array(DS,'//'),array('/','/'), $path),'/'); 
    561548        } 
    562          
     549 
    563550        return $path; 
    564551    } 
     
    820807        if(empty($Logger)){ 
    821808            require_once(AK_LIB_DIR.DS.'AkLogger.php'); 
    822             $Logger =& new AkLogger(); 
    823         } 
     809            $Logger = new AkLogger(); 
     810        } 
     811        $return =& $Logger; 
    824812        return $Logger; 
    825813    } 
     
    870858                ([0-9\.]{0,4}) # seconds 
    871859            )?/x", ($iso_date_or_hour), $rr)){ 
    872             if (preg_match("|^(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|", ($iso_date_or_hour), $rr)){ 
    873                 return empty($rr[0]) ? Ak::time() : mktime($rr[2],$rr[3],$rr[4]); 
    874             } 
    875         }else{ 
    876             if($rr[1]>=2038 || $rr[1]<=1970){ 
    877                 require_once(AK_CONTRIB_DIR.DS.'adodb'.DS.'adodb-time.inc.php'); 
    878                 return isset($rr[5]) ? adodb_mktime($rr[5],$rr[6],(int)$rr[7],$rr[2],$rr[3],$rr[1]) : adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]); 
     860        if (preg_match("|^(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|", ($iso_date_or_hour), $rr)){ 
     861            return empty($rr[0]) ? Ak::time() : mktime($rr[2],$rr[3],$rr[4]); 
     862        } 
    879863            }else{ 
    880                 return isset($rr[5]) ? mktime($rr[5],$rr[6],(int)$rr[7],$rr[2],$rr[3],$rr[1]) : mktime(0,0,0,$rr[2],$rr[3],$rr[1]); 
    881             } 
    882         } 
    883         trigger_error(Ak::t('Invalid ISO date. You must supply date in one of the following formats: "year-month-day hour:min:sec", "year-month-day", "hour:min:sec"')); 
    884         return false; 
     864                if($rr[1]>=2038 || $rr[1]<=1970){ 
     865                    require_once(AK_CONTRIB_DIR.DS.'adodb'.DS.'adodb-time.inc.php'); 
     866                    return isset($rr[5]) ? adodb_mktime($rr[5],$rr[6],(int)$rr[7],$rr[2],$rr[3],$rr[1]) : adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]); 
     867                }else{ 
     868                    return isset($rr[5]) ? mktime($rr[5],$rr[6],(int)$rr[7],$rr[2],$rr[3],$rr[1]) : mktime(0,0,0,$rr[2],$rr[3],$rr[1]); 
     869                } 
     870            } 
     871            trigger_error(Ak::t('Invalid ISO date. You must supply date in one of the following formats: "year-month-day hour:min:sec", "year-month-day", "hour:min:sec"')); 
     872            return false; 
    885873    } 
    886874 
     
    16771665            $mime = false; 
    16781666        } 
    1679          
     1667 
    16801668        if(empty($mime)){ 
    16811669            empty($mime_types) ? require(AK_LIB_DIR.DS.'utils'.DS.'mime_types.php') : null; 
     
    18321820        return strtr($html, $translation_table_or_quote_style); 
    18331821    } 
    1834      
     1822 
    18351823    /** 
    18361824    * Loads the plugins found at app/vendor/plugins 
     
    18691857function ak_compat($function_name) 
    18701858{ 
    1871        if(!function_exists($function_name)){ 
     1859    if(!function_exists($function_name)){ 
    18721860        require_once(AK_VENDOR_DIR.DS.'pear'.DS.'PHP'.DS.'Compat'.DS.'Function'.DS.$function_name.'.php'); 
    18731861    } 
     
    18761864function ak_generate_mock($name) 
    18771865{ 
    1878        static $Mock; 
    1879        if(empty($Mock)){ 
    1880                $Mock = new Mock(); 
    1881        
    1882        $Mock->generate($name); 
     1866    static $Mock; 
     1867    if(empty($Mock)){ 
     1868        $Mock = new Mock(); 
     1869   
     1870    $Mock->generate($name); 
    18831871} 
    18841872 
  • trunk/lib/AkActionView/helpers/active_record_helper.php

    r376 r468  
    106106    { 
    107107        if($errors = $this->_controller->$object_name->getErrorsOn($method)){ 
    108             return TagHelper::content_tag('div', $prepend_text.(is_array($errors) ? array_shift($errors) : $errors).$append_text, array('class'=>$css_class)); 
     108            $text = $prepend_text.(is_array($errors) ? array_shift($errors) : $errors).$append_text; 
     109            return TagHelper::content_tag('div', Ak::t($text,array(),'helpers/active_record'), array('class'=>$css_class)); 
    109110        } 
    110111        return ''; 
     
    130131            foreach ($object->getFullErrorMessages() as $field=>$errors){ 
    131132                foreach ($errors as $error){ 
    132                     $error_list .= TagHelper::content_tag('li',$error); 
     133                    $error_list .= TagHelper::content_tag('li',Ak::t($error,array(),'helpers/active_record')); 
    133134                } 
    134135            } 
  • trunk/lib/AkActionView/helpers/url_helper.php

    r453 r468  
    4545    { 
    4646        $options_to_exclude = $remove_unnecesary_options ? array_merge(array('ak','lang',AK_SESSION_NAME,'AK_SESSID','PHPSESSID'), $options_to_exclude) : $options_to_exclude; 
    47         $url_params = $this->_controller->Request->getUrlParams(); 
    48         if(!empty($options_to_add['ak'])){ 
    49             $Router =& AkRouter(); 
    50             $url_params = array_merge($url_params, $Router->toParams($options_to_add['ak'])); 
    51         } 
    52         $options_to_add = array_merge(array_merge(array('action'=>$this->_controller->Request->getAction(), 'controller' => $this->_controller->Request->getController()),$url_params),$options_to_add); 
     47        $options_to_add = array_merge(array_merge(array('action'=>$this->_controller->Request->getAction(), 'controller' => $this->_controller->Request->getController()),$this->_controller->Request->getUrlParams()),$options_to_add); 
    5348        foreach ($options_to_exclude as $option_to_exclude){ 
    5449            unset($options_to_add[$option_to_exclude]); 
  • trunk/lib/AkActiveRecord.php

    r466 r468  
    2020 
    2121require_once(AK_LIB_DIR.DS.'AkActiveRecord'.DS.'AkAssociatedActiveRecord.php'); 
     22require_once(AK_LIB_DIR.DS.'AkActiveRecord'.DS.'AkDbAdapter.php'); 
    2223 
    2324/**#@+ 
    24  * Constants 
    25  */ 
     25* Constants 
     26*/ 
    2627// Akelos args is a short way to call functions that is only intended for fast prototyping 
    27 defined('AK_ENABLE_AKELOS_ARGS') ? null : define('AK_ENABLE_AKELOS_ARGS', false);  
     28defined('AK_ENABLE_AKELOS_ARGS') ? null : define('AK_ENABLE_AKELOS_ARGS', false); 
    2829// Use setColumnName if available when using set('column_name', $value); 
    29 defined('AK_ACTIVE_RECORD_INTERNATIONALIZE_MODELS_BY_DEFAULT') ? null : define('AK_ACTIVE_RECORD_INTERNATIONALIZE_MODELS_BY_DEFAULT', true);  
    30 defined('AK_ACTIVE_RECORD_ENABLE_AUTOMATIC_SETTERS_AND_GETTERS') ? null : define('AK_ACTIVE_RECORD_ENABLE_AUTOMATIC_SETTERS_AND_GETTERS', false);  
    31 defined('AK_ACTIVE_RECORD_ENABLE_CALLBACK_SETTERS') ? null : define('AK_ACTIVE_RECORD_ENABLE_CALLBACK_SETTERS', AK_ACTIVE_RECORD_ENABLE_AUTOMATIC_SETTERS_AND_GETTERS);  
    32 defined('AK_ACTIVE_RECORD_ENABLE_CALLBACK_GETTERS') ? null : define('AK_ACTIVE_RECORD_ENABLE_CALLBACK_GETTERS', AK_ACTIVE_RECORD_ENABLE_AUTOMATIC_SETTERS_AND_GETTERS);  
     30defined('AK_ACTIVE_RECORD_INTERNATIONALIZE_MODELS_BY_DEFAULT') ? null : define('AK_ACTIVE_RECORD_INTERNATIONALIZE_MODELS_BY_DEFAULT', true); 
     31defined('AK_ACTIVE_RECORD_ENABLE_AUTOMATIC_SETTERS_AND_GETTERS') ? null : define('AK_ACTIVE_RECORD_ENABLE_AUTOMATIC_SETTERS_AND_GETTERS', false); 
     32defined('AK_ACTIVE_RECORD_ENABLE_CALLBACK_SETTERS') ? null : define('AK_ACTIVE_RECORD_ENABLE_CALLBACK_SETTERS', AK_ACTIVE_RECORD_ENABLE_AUTOMATIC_SETTERS_AND_GETTERS); 
     33defined('AK_ACTIVE_RECORD_ENABLE_CALLBACK_GETTERS') ? null : define('AK_ACTIVE_RECORD_ENABLE_CALLBACK_GETTERS', AK_ACTIVE_RECORD_ENABLE_AUTOMATIC_SETTERS_AND_GETTERS); 
    3334defined('AK_ACTIVE_RECORD_ENABLE_PERSISTENCE') ? null : define('AK_ACTIVE_RECORD_ENABLE_PERSISTENCE', AK_ENVIRONMENT != 'testing'); 
    3435defined('AK_ACTIVE_RECORD_CACHE_DATABASE_SCHEMA') ? null : define('AK_ACTIVE_RECORD_CACHE_DATABASE_SCHEMA', AK_ACTIVE_RECORD_ENABLE_PERSISTENCE && AK_ENVIRONMENT != 'development'); 
     
    251252 
    252253    var $__activeRecordObject = true; 
    253      
     254 
    254255    /**#@-*/ 
    255      
     256 
    256257    function __construct() 
    257258    { 
     
    263264    { 
    264265        AK_LOG_EVENTS ? ($this->Logger =& Ak::getLogger()) : null; 
    265          
    266266        $this->_internationalize = is_null($this->_internationalize) && AK_ACTIVE_RECORD_INTERNATIONALIZE_MODELS_BY_DEFAULT ? count($this->getAvailableLocales()) > 1 : $this->_internationalize; 
    267267 
    268         @$this->_instatiateDefaultObserver(); 
     268        @$this->_instantiateDefaultObserver(); 
    269269 
    270270        $this->setConnection(); 
     
    382382 
    383383 
    384     /**  
     384    /** 
    385385                         Creating records 
    386386    ==================================================================== 
     
    409409    function createOrUpdate($validate = true) 
    410410    { 
    411         if($validate && !$this->isValid() || !($this->isNewRecord() ? $this->afterValidationOnCreate() : $this->afterValidationOnUpdate())){ 
     411        if($validate && !$this->isValid()){ 
    412412            $this->transactionFail(); 
    413413            return false; 
     
    415415        return $this->isNewRecord() ? $this->_create() : $this->_update(); 
    416416    } 
    417      
     417 
    418418    function &findOrCreateBy() 
    419419    { 
     
    422422        if(!$Item){ 
    423423            $attributes = array(); 
    424              
     424 
    425425            list($sql, $columns) = $this->_getFindBySqlAndColumns(array_shift($args), $args); 
    426              
     426 
    427427            if(!empty($columns)){ 
    428428                foreach ($columns as $column){ 
     
    447447    function _create() 
    448448    { 
    449         if($this->isFrozen()){ 
    450             $this->transactionFail(); 
     449        if (!$this->beforeCreate() || !$this->notifyObservers('beforeCreate')){ 
     450            return $this->transactionFail(); 
     451        } 
     452 
     453        $this->_setRecordTimestamps(); 
     454 
     455        // deprecated section 
     456        if($this->isLockingEnabled() && is_null($this->get('lock_version'))){ 
     457            Ak::DeprecateWarning(array("Column %lock_version_column should have a default setting. Assumed '1'.",'%lock_version_column'=>'lock_version')); 
     458            $this->setAttribute('lock_version',1); 
     459        } // end 
     460 
     461        $attributes = $this->getColumnsForAttributes($this->getAttributes()); 
     462        foreach ($attributes as $column=>$value){ 
     463            $attributes[$column] = $this->castAttributeForDatabase($column,$value); 
     464        } 
     465 
     466        $pk = $this->getPrimaryKey(); 
     467        $table = $this->getTableName(); 
     468 
     469        $id = $this->_db->incrementsPrimaryKeyAutomatically() ? null : $this->_db->getNextSequenceValueFor($table); 
     470        $attributes[$pk] = $id; 
     471 
     472        $attributes = array_diff($attributes, array('',"''")); 
     473 
     474        $sql = 'INSERT INTO '.$table.' '. 
     475        '('.join(', ',array_keys($attributes)).') '. 
     476        'VALUES ('.join(',',array_values($attributes)).')'; 
     477 
     478        $inserted_id = $this->_db->insert($sql, $id, $pk, $table, 'Create '.$this->getModelName()); 
     479        if ($this->transactionHasFailed()){ 
    451480            return false; 
    452481        } 
    453  
    454         if($this->beforeCreate()){ 
    455  
    456             $this->notifyObservers('beforeCreate'); 
    457  
    458             if($this->_recordTimestamps){ 
    459                 if ($this->hasColumn('created_at')){ 
    460                     $this->setAttribute('created_at', Ak::getDate()); 
    461                 } 
    462                 if ($this->hasColumn('created_on')){ 
    463                     $this->setAttribute('created_on', Ak::getDate(null, 'Y-m-d')); 
    464                 } 
    465  
    466                 if(isset($this->expires_on)){ 
    467                     if(isset($this->expires_at) && $this->hasColumn('expires_at')){ 
    468                         $this->setAttribute('expires_at',Ak::getDate(strtotime($this->expires_at) + (defined('AK_TIME_DIFFERENCE') ? AK_TIME_DIFFERENCE*60 : 0))); 
    469                     }elseif(isset($this->expires_on) && $this->hasColumn('expires_on')){ 
    470                         $this->setAttribute('expires_on',Ak::getDate(strtotime($this->expires_on) + (defined('AK_TIME_DIFFERENCE') ? AK_TIME_DIFFERENCE*60 : 0), 'Y-m-d')); 
    471                     } 
    472                 } 
    473             } 
    474  
    475             $attributes = $this->getColumnsForAtrributes($this->getAttributes()); 
    476  
    477             if($this->isLockingEnabled()){ 
    478                 $attributes['lock_version'] = 1; 
    479                 $this->setAttribute('lock_version',1); 
    480             } 
    481  
    482             $pk = $this->getPrimaryKey(); 
    483             $table = $this->getTableName(); 
    484  
    485             foreach ($attributes as $column=>$value){ 
    486                 $attributes[$column] = $this->castAttributeForDatabase($column,$value); 
    487             } 
    488  
    489             /** 
    490             * @todo sanitize attributes 
    491             * 'beforeValidationOnCreate', 'afterValidationOnCreate' 
    492             */ 
    493             if(!isset($this->_generateSequence) || (isset($this->_generateSequence) && $this->_generateSequence !== false)){ 
    494                 if((empty($attributes[$pk]) || (!empty($attributes[$pk]) && (integer)$attributes[$pk] > 0 ))){ 
    495                     if($this->_getDatabaseType() == 'sqlite'){ 
    496                         $table_details = $this->_databaseTableInternals('seq_'.$table); 
    497                         if(!isset($table_details['ID'])){ 
    498                             $this->_db->CreateSequence('seq_'.$table); 
    499                         } 
    500                         $attributes[$pk] = $this->_db->GenID('seq_'.$table); 
    501                     } 
    502                 } 
    503             } 
    504  
    505             $__attributes = $attributes; 
    506             $attributes = array_diff($attributes, array('',"''")); 
    507  
    508             $sql = 'INSERT INTO '.$table.' '. 
    509             '('.join(', ',array_keys($attributes)).') '. 
    510             'VALUES ('.join(',',array_values($attributes)).')'; 
    511  
    512             if(!$this->_executeSql($sql, false)){ 
    513                 AK_DEBUG ? trigger_error($this->_db->ErrorMsg(), E_USER_NOTICE) : null; 
    514             } 
    515  
    516             $id = !empty($attributes[$pk]) ? $attributes[$pk] : $this->_db->Insert_ID($table, $pk); 
    517             $this->setId($id); 
    518  
    519             if(!$this->transactionHasFailed()){ 
    520                 $this->_newRecord = false; 
    521                 if(!$this->afterCreate()){ 
    522                     $this->transactionFail(); 
    523                 }else{ 
    524                     $this->notifyObservers('afterCreate'); 
    525                 } 
     482        $this->setId($inserted_id); 
     483 
     484        if (!$this->afterCreate() || !$this->notifyObservers('afterCreate')){ 
     485            return $this->transactionFail(); 
     486        } 
     487        $this->_newRecord = false; 
     488        return true; 
     489    } 
     490 
     491    function _setRecordTimestamps() 
     492    { 
     493        if (!$this->_recordTimestamps){ 
     494            return; 
     495        } 
     496        if ($this->_newRecord){ 
     497            if ($this->hasColumn('created_at')){ 
     498                $this->setAttribute('created_at', Ak::getDate()); 
     499            } 
     500            if ($this->hasColumn('created_on')){ 
     501                $this->setAttribute('created_on', Ak::getDate(null, 'Y-m-d')); 
    526502            } 
    527503        }else{ 
    528             $this->transactionFail(); 
    529         } 
    530         return $this; 
     504            if ($this->hasColumn('updated_at')){ 
     505                $this->setAttribute('updated_at', Ak::getDate()); 
     506            } 
     507            if ($this->hasColumn('updated_on')){ 
     508                $this->setAttribute('updated_on', Ak::getDate(null, 'Y-m-d')); 
     509            } 
     510        } 
     511 
     512        if($this->_newRecord && isset($this->expires_on)){ 
     513            if(isset($this->expires_at) && $this->hasColumn('expires_at')){ 
     514                $this->setAttribute('expires_at',Ak::getDate(strtotime($this->expires_at) + (defined('AK_TIME_DIFFERENCE') ? AK_TIME_DIFFERENCE*60 : 0))); 
     515            }elseif(isset($this->expires_on) && $this->hasColumn('expires_on')){ 
     516                $this->setAttribute('expires_on',Ak::getDate(strtotime($this->expires_on) + (defined('AK_TIME_DIFFERENCE') ? AK_TIME_DIFFERENCE*60 : 0), 'Y-m-d')); 
     517            } 
     518        } 
     519 
    531520    } 
    532521 
     
    534523 
    535524 
    536     /**  
     525    /** 
    537526                         Saving records 
    538527    ==================================================================== 
     
    566555        $result = $this->transactionHasFailed() ? false : $result; 
    567556        $this->transactionComplete(); 
    568          
     557 
    569558        return $result; 
    570559    } 
    571      
     560 
    572561    /*/Saving records*/ 
    573      
    574     /**  
     562 
     563    /** 
    575564                            Counting Records 
    576565    ==================================================================== 
    577566    See also: Counting Attributes. 
    578567    */ 
    579      
     568 
    580569    /** 
    581570      * Returns the result of an SQL statement that should only include a COUNT(*) in the SELECT part. 
     
    594583            $this->setConnection(); 
    595584        } 
    596          
    597         AK_LOG_EVENTS ? ($this->Logger->message($this->getModelName().' executing SQL: '.$sql)) : null; 
    598         $rs = $this->_db->Execute($sql); 
    599  
    600         return @(integer)$rs->fields[0]; 
     585 
     586        return (integer)$this->_db->selectValue($sql); 
    601587    } 
    602588    /*/Counting Records*/ 
    603      
    604     /**  
     589 
     590    /** 
    605591                          Updating records 
    606592    ==================================================================== 
    607593    See also: Callbacks. 
    608594    */ 
    609      
     595 
    610596    /** 
    611597    * Finds the record from the passed id, instantly saves it with the passed attributes (if the validation permits it),  
     
    632618    /** 
    633619    * Updates a single attribute and saves the record. This is especially useful for boolean flags on existing records.  
    634     * Note: Make sure that updates made with this method doesn't get subjected to validation checks.  
    635     * Hence, attributes can be updated even if the full object isn't valid. 
    636     */ 
    637     function updateAttribute($name, $value) 
     620    */ 
     621    function updateAttribute($name, $value, $should_validate=true) 
    638622    { 
    639623        $this->setAttribute($name, $value); 
    640         return $this->save(false); 
     624        return $this->save($should_validate); 
    641625    } 
    642626 
     
    670654        */ 
    671655        $sql = 'UPDATE '.$this->getTableName().' SET '.$updates; 
    672         $sql  .= isset($conditions) ? ' WHERE '.$conditions : ''; 
    673         $this->_executeSql($sql); 
    674         return $this->_db->Affected_Rows(); 
     656        $this->addConditions($sql, $conditions); 
     657        return $this->_db->update($sql, $this->getModelName().' Update All'); 
    675658    } 
    676659 
     
    684667    function _update() 
    685668    { 
    686         if($this->isFrozen()){ 
    687             $this->transactionFail(); 
     669        if(!$this->beforeUpdate() || !$this->notifyObservers('beforeUpdate')){ 
     670            return $this->transactionFail(); 
     671        } 
     672 
     673        $this->_setRecordTimestamps(); 
     674 
     675        $lock_check_sql = ''; 
     676        if ($this->isLockingEnabled()){ 
     677            $previous_value = $this->lock_version; 
     678            $this->setAttribute('lock_version', $previous_value + 1); 
     679            $lock_check_sql = ' AND lock_version = '.$previous_value; 
     680        } 
     681 
     682        $quoted_attributes = $this->getAvailableAttributesQuoted(); 
     683        $sql = 'UPDATE '.$this->getTableName().' '. 
     684        'SET '.join(', ', $quoted_attributes) .' '. 
     685        'WHERE '.$this->getPrimaryKey().'='.$this->quotedId().$lock_check_sql; 
     686 
     687        $affected_rows = $this->_db->update($sql,'Updating '.$this->getModelName()); 
     688        if($this->transactionHasFailed()){ 
    688689            return false; 
    689690        } 
    690         if($this->beforeUpdate()){ 
    691             $this->notifyObservers('beforeUpdate'); 
    692  
    693             if($this->_recordTimestamps){ 
    694                 if ($this->hasColumn('updated_at')){ 
    695                     $this->setAttribute('updated_at', Ak::getDate()); 
    696                 } 
    697                 if ($this->hasColumn('updated_on')){ 
    698                     $this->setAttribute('updated_on', Ak::getDate(null, 'Y-m-d')); 
    699                 } 
    700             } 
    701  
    702  
    703             $lock_check = ''; 
    704             if ($this->isLockingEnabled()){ 
    705                 $previous_value = $this->lock_version; 
    706                 $this->setAttribute('lock_version', $previous_value + 1); 
    707                 $lock_check = ' AND lock_version = '.$previous_value; 
    708             } 
    709  
    710             $quoted_attributes = $this->getAvailableAttributesQuoted(); 
    711  
    712             if(!empty($quoted_attributes)){ 
    713                 $sql = 'UPDATE '.$this->getTableName().' '. 
    714                 'SET '.join(', ', $quoted_attributes) .' '. 
    715                 'WHERE '.$this->getPrimaryKey().'='.$this->quotedId().$lock_check; 
    716             } 
    717  
    718             if(!$this->_executeSql($sql, false)){ 
    719                 $this->transactionFail(); 
    720                 AK_DEBUG ? trigger_error($this->_db->ErrorMsg(), E_USER_NOTICE) : null; 
    721             } 
    722  
    723             if ($this->isLockingEnabled()){ 
    724                 if($this->_db->Affected_Rows() != 1){ 
    725                     $this->setAttribute('lock_version', $previous_value); 
    726                     $this->transactionFail(); 
    727                     trigger_error(Ak::t('Attempted to update a stale object'), E_USER_NOTICE); 
    728                     return false; 
    729                 } 
    730             } 
    731  
    732             if(!$this->transactionHasFailed()){ 
    733                 if($this->afterUpdate()){ 
    734                     $this->notifyObservers('afterUpdate'); 
    735                 }else { 
    736                     $this->transactionFail(); 
    737                 } 
    738             } 
    739  
    740         }else{ 
    741             $this->transactionFail(); 
    742         } 
    743         return $this; 
    744     } 
    745      
     691 
     692        if ($this->isLockingEnabled() && $affected_rows != 1){ 
     693            $this->setAttribute('lock_version', $previous_value); 
     694            trigger_error(Ak::t('Attempted to update a stale object'), E_USER_NOTICE); 
     695            return $this->transactionFail(); 
     696        } 
     697 
     698        if(!$this->afterUpdate() || !$this->notifyObservers('afterUpdate')){ 
     699            return $this->transactionFail(); 
     700        } 
     701 
     702        return true; 
     703    } 
     704 
    746705    /*/Updating records*/ 
    747      
    748      
    749      
    750     /**  
     706 
     707 
     708 
     709    /** 
    751710                          Deleting records 
    752711    ==================================================================== 
    753712    See also: Callbacks. 
    754713    */ 
    755      
     714 
    756715    /** 
    757716    * Deletes the record with the given id without instantiating an object first. If an array of  
     
    786745        */ 
    787746        $sql = 'DELETE FROM '.$this->getTableName(); 
    788  
    789         $sql  .= isset($conditions) ? ' WHERE '.$conditions : ($this->_getDatabaseType() == 'sqlite' ? ' WHERE 1' : ''); // (HACK) If where clause is not included sqlite_changes will not get the right result 
    790         $this->_executeSql($sql); 
    791         return $this->_db->Affected_Rows() > 0; 
     747        $this->addConditions($sql,$conditions); 
     748        return $this->_db->delete($sql,$this->getModelName().' Delete All'); 
    792749    } 
    793750 
     
    805762        } 
    806763 
    807         $this->transactionStart(); 
    808764        $id = func_num_args() > 1 ? func_get_args() : $id; 
    809765 
    810766        if(isset($id)){ 
     767            $this->transactionStart(); 
    811768            $id_arr = is_array($id) ? $id : array($id); 
    812769            if($objects = $this->find($id_arr)){ 
     
    826783        }else{ 
    827784            if(!$this->isNewRecord()){ 
    828                 if($this->beforeDestroy()){ 
    829                     $this->notifyObservers('beforeDestroy'); 
    830  
    831                     $sql = 'DELETE FROM '.$this->getTableName().' WHERE '.$this->getPrimaryKey().' = '.$this->_db->qstr($this->getId()); 
    832                     $this->_executeSql($sql); 
    833                     $had_success = ($this->_db->Affected_Rows() > 0); 
    834                     if(!$had_success || ($had_success && !$this->afterDestroy())){ 
    835                         $this->transactionFail(); 
    836                         $had_success = false; 
    837                     }else{ 
    838                         $had_success = $this->notifyObservers('afterDestroy') === false ? false : true; 
    839                     } 
    840                     $this->transactionComplete(); 
    841                     $this->freeze(); 
    842                     return  $had_success; 
    843                 }else { 
    844                     $this->transactionFail(); 
    845                     $this->transactionComplete(); 
    846                     return false; 
    847                 } 
    848             } 
    849         } 
    850  
    851         if(!$this->afterDestroy()){ 
    852             $this->transactionFail(); 
    853         }else{ 
    854             $this->notifyObservers('afterDestroy'); 
    855         } 
    856  
    857         $this->transactionComplete(); 
    858  
    859         return false; 
    860     } 
    861  
     785                $this->transactionStart(); 
     786                $return = $this->_destroy() && $this->freeze(); 
     787                $this->transactionComplete(); 
     788                return $return; 
     789            } 
     790        } 
     791    } 
     792 
     793    function _destroy() 
     794    { 
     795        if(!$this->beforeDestroy() || !$this->notifyObservers('beforeDestroy')){ 
     796            return $this->transactionFail(); 
     797        } 
     798 
     799        $sql = 'DELETE FROM '.$this->getTableName().' WHERE '.$this->getPrimaryKey().' = '.$this->_db->quote_string($this->getId()); 
     800        if ($this->_db->delete($sql,$this->getModelName().' Destroy') !== 1){ 
     801            return $this->transactionFail(); 
     802        } 
     803 
     804        if (!$this->afterDestroy() || !$this->notifyObservers('afterDestroy')){ 
     805            return $this->transactionFail(); 
     806        } 
     807        return true; 
     808    } 
    862809 
    863810    /** 
     
    884831        } 
    885832    } 
    886      
     833 
    887834    /*/Deleting records*/ 
    888835 
    889836 
    890837 
    891      
    892     /**  
     838 
     839    /** 
    893840                          Finding records 
    894841    ==================================================================== 
     
    945892    *   $Person->find('all'); // returns an array of objects for all the rows fetched by SELECT * FROM people 
    946893    *   $Person->find(); // Same as $Person->find('all'); 
    947     *   $Person->find('all', array('conditions => array("category IN (categories)", 'categories' => join(','$categories)), 'limit' => 50)); 
     894    *   $Person->find('all', array('conditions' => array("category IN (categories)", 'categories' => join(','$categories)), 'limit' => 50)); 
    948895    *   $Person->find('all', array('offset' => 10, 'limit' => 10)); 
    949896    *   $Person->find('all', array('include' => array('account', 'friends')); 
     
    956903        } 
    957904 
    958         $num_args = func_num_args(); 
    959         if($num_args === 2 && func_get_arg(0) == 'set arguments'){ 
    960             $args  = func_get_arg(1); 
    961             $num_args = count($args); 
    962         } 
    963  
    964         $args = $num_args > 0 ? (!isset($args) ? func_get_args() : $args) : array('all'); 
    965  
    966         // Handle find('first', 23) 
    967         if($num_args >= 2 && is_numeric($args[1]) && $args[0] == 'first'){ 
    968             array_shift($args); 
    969             $args[0] = (integer)$args[0]; 
    970             $num_args--; 
    971         } 
    972          
    973         if($num_args === 1 && is_numeric($args[0]) && $args[0] > 0){ 
    974             $args[0] = (integer)$args[0]; //Cast query by Id 
    975         } 
    976  
    977         $options = $num_args > 0 && (is_array($args[$num_args-1]) && isset($args[0][0]) && !is_numeric($args[0][0])) ? array_pop($args) : array(); 
    978  
    979         //$options = func_get_arg(func_num_args()-1); 
     905        $args = func_get_args(); 
     906 
     907        $options = $this->_extractOptionsFromArgs($args); 
     908        list($fetch,$options) = $this->_extractConditionsFromArgs($args,$options); 
     909 
     910        //$this->santizeSql(conditions); 
    980911        if(!empty($options['conditions']) && is_array($options['conditions'])){ 
    981912            if (isset($options['conditions'][0]) && strstr($options['conditions'][0], '?') && count($options['conditions']) > 1){ 
     913                //array('conditions' => array("name=?",$name)) 
    982914                $pattern = array_shift($options['conditions']); 
    983915                $options['bind'] = array_values($options['conditions']); 
    984916                $options['conditions'] = $pattern; 
    985917            }elseif (isset($options['conditions'][0])){ 
     918                //array('conditions' => array("user_name = :user_name", ':user_name' => 'hilario') 
    986919                $pattern = array_shift($options['conditions']); 
    987920                $options['conditions'] = str_replace(array_keys($options['conditions']), array_values($this->getSanitizedConditionsArray($options['conditions'])),$pattern); 
    988921            }else{ 
     922                //array('conditions' => array('user_name'=>'Hilario')) 
    989923                $options['conditions'] = join(' AND ',(array)$this->getAttributesQuoted($options['conditions'])); 
    990924            } 
    991925        } 
    992926 
    993         if ($num_args === 2 && !empty($args[0]) && !empty($args[1]) && is_string($args[0]) && ($args[0] == 'all' || $args[0] == 'first') && is_string($args[1])){ 
    994             if (!is_array($args[1]) && $args[1] > 0 && $args[0] == 'first'){ 
    995                 $num_args = 1; 
    996                 $args = array($args[1]); 
    997                 $options = array(); 
    998             }else{ 
    999                 $options['conditions'] = $args[1]; 
    1000                 $args = array($args[0]); 
    1001             } 
    1002         }elseif ($num_args === 1 && isset($args[0]) && is_string($args[0]) && $args[0] != 'all' && $args[0] != 'first'){ 
    1003             $options = array('conditions'=> $args[0]); 
    1004             $args = array('first'); 
    1005         } 
    1006  
    1007         if(!empty($options['conditions']) && is_numeric($options['conditions']) && $options['conditions'] > 0){ 
    1008             unset($options['conditions']); 
    1009         } 
    1010  
    1011         if($num_args > 1){ 
    1012             if(!empty($args[0]) && is_string($args[0]) && strstr($args[0],'?')){ 
    1013                 $options = array_merge(array('conditions' => array_shift($args)), $options); 
    1014                 $options['bind'] = $args; 
    1015                 $args = array('all'); 
    1016             }elseif (!empty($args[1]) && is_string($args[1]) && strstr($args[1],'?')){ 
    1017                 $_tmp_mode = array_shift($args); 
    1018                 $options = array_merge(array('conditions' => array_shift($args)),$options); 
    1019                 $options['bind'] = $args; 
    1020                 $args = array($_tmp_mode); 
    1021             } 
    1022         } 
    1023  
    1024         switch ($args[0]) { 
     927        switch ($fetch) { 
    1025928            case 'first': 
    1026  
    1027             $options = array_merge($options, array((!empty($options['include']) && $this->hasAssociations() ?'virtual_limit':'limit')=>1)); 
    1028             $result =& $this->find('all', $options); 
    1029  
    1030             if(!empty($result) && is_array($result)){ 
    1031                 $_result =& $result[0]; 
    1032             }else{ 
    1033                 $_result = false; 
    1034             } 
    1035             return  $_result; 
    1036             break; 
     929                // HACK: php4 pass by ref 
     930                $result =& $this->_findInitial($options); 
     931                return $result; 
     932                break; 
    1037933 
    1038934            case 'all': 
    1039  
    1040  
    1041             $limit = isset($options['limit']) ? $options['limit'] : null; 
    1042             $offset = isset($options['offset']) ? $options['offset'] : null; 
    1043             if((empty($options['conditions']) && empty($options['order']) && is_null($offset) && $this->_getDatabaseType() == 'postgre' ? 1 : 0)){ 
    1044                 $options['order'] = $this->getPrimaryKey(); 
    1045             } 
    1046             $sql = $this->constructFinderSql($options); 
    1047             if(!empty($options['bind']) && is_array($options['bind']) && strstr($sql,'?')){ 
    1048                 $sql = array_merge(array($sql),$options['bind']); 
    1049             } 
    1050  
    1051             if((!empty($options['include']) && $this->hasAssociations())){ 
    1052                 $result =& $this->findWithAssociations($options,  $limit, $offset); 
    1053             }else{ 
    1054                 $result =& $this->findBySql($sql, $limit, $offset); 
    1055             } 
    1056  
    1057             if(!empty($result) && is_array($result)){ 
    1058                 $_result =& $result; 
    1059             }else{ 
    1060                 $_result = false; 
    1061             } 
    1062             return  $_result; 
    1063             break; 
     935                // HACK: php4 pass by ref 
     936                $result =& $this->_findEvery($options); 
     937                return $result; 
     938                break; 
    1064939 
    1065940            default: 
    1066  
    1067             $ids = array_unique(isset($args[0]) ? (is_array($args[0]) ? $args[0] : (array)$args) : array()); 
    1068  
    1069             $num_ids = count($ids); 
    1070             $num_args = count($args); 
    1071  
    1072             if(isset($ids[$num_ids-1]) && is_array($ids[$num_ids-1])){ 
    1073                 $options =  array_merge($options, array_pop($ids)); 
    1074                 $num_ids--; 
    1075             } 
    1076  
    1077             if($num_args === 1 && !$args[0] > 0){ 
    1078                 $options['conditions'] = $args[0]; 
    1079             } 
    1080  
    1081             $conditions = !empty($options['conditions']) ? ' AND '.$options['conditions'] : ''; 
    1082  
    1083             if(empty($options) && !empty($args[0]) && !empty($args[1]) && is_array($args[0]) && is_array($args[1])){ 
    1084                 $options = array_pop($args); 
    1085             } 
    1086  
    1087             switch ($num_ids){ 
    1088  
    1089                 case 0 : 
     941                // HACK: php4 pass by ref 
     942                $result =& $this->_findFromIds($args, $options); 
     943                return $result; 
     944                break; 
     945        } 
     946        $result = false; 
     947        return $result; 
     948    } 
     949 
     950    function &_findInitial($options) 
     951    { 
     952        // TODO: virtual_limit is a hack 
     953        // actually we fetch_all and return only the first row 
     954        $options = array_merge($options, array((!empty($options['include']) ?'virtual_limit':'limit')=>1)); 
     955        $result =& $this->_findEvery($options); 
     956 
     957        if(!empty($result) && is_array($result)){ 
     958            $_result =& $result[0]; 
     959        }else{ 
     960            $_result = false; 
     961            // if we return an empty array instead of false we need to change this->exists()! 
     962            //$_result = array(); 
     963        } 
     964        return  $_result; 
     965 
     966    } 
     967 
     968    function &_findEvery($options) 
     969    { 
     970        $limit = isset($options['limit']) ? $options['limit'] : null; 
     971        $offset = isset($options['offset']) ? $options['offset'] : null; 
     972 
     973        $sql = $this->constructFinderSql($options); 
     974        if(!empty($options['bind']) && is_array($options['bind']) && strstr($sql,'?')){ 
     975            $sql = array_merge(array($sql),$options['bind']); 
     976        } 
     977 
     978        if((!empty($options['include']) && $this->hasAssociations())){ 
     979            $result =& $this->findWithAssociations($options); 
     980        }else{ 
     981            $result =& $this->findBySql($sql); 
     982        } 
     983 
     984        if(!empty($result) && is_array($result)){ 
     985            $_result =& $result; 
     986        }else{ 
     987            $_result = false; 
     988        } 
     989        return  $_result; 
     990 
     991    } 
     992 
     993    function &_findFromIds($ids, $options) 
     994    { 
     995        $expects_array = is_array($ids[0]); 
     996        $ids = array_unique($expects_array ? (isset($ids[1]) ? array_merge($ids[0],$ids) : $ids[0]) : $ids); 
     997 
     998        $num_ids = count($ids); 
     999 
     1000        //at this point $options['conditions'] can't be an array 
     1001        $conditions = !empty($options['conditions']) ? ' AND '.$options['conditions'] : ''; 
     1002 
     1003        switch ($num_ids){ 
     1004            case 0 : 
    10901005                trigger_error($this->t('Couldn\'t find %object_name without an ID%conditions',array('%object_name'=>$this->getModelName(),'%conditions'=>$conditions)), E_USER_ERROR); 
    10911006                break; 
    10921007 
    1093                 case 1 : 
     1008            case 1 : 
    10941009                $table_name = !empty($options['include']) && $this->hasAssociations() ? '__owner' : $this->getTableName(); 
    1095                 $result =& $this->find('first', array_merge($options, array('conditions' => $table_name.'.'.$this->getPrimaryKey().' = '.$ids[0].$conditions))); 
    1096                 if(is_array($args[0]) && $result !== false){ 
    1097                     //This is a dirty hack for avoiding PHP4 pass by reference error 
    1098                     $result_for_ref = array(&$result); 
    1099                     $_result =& $result_for_ref; 
    1100                 }else{ 
    1101                     $_result =& $result; 
    1102                 } 
    1103                 return  $_result; 
    1104  
     1010                $options['conditions'] = $table_name.'.'.$this->getPrimaryKey().' = '.$ids[0].$conditions; 
     1011                $result =& $this->_findEvery($options); 
     1012                if (!$expects_array && $result !== false){ 
     1013                    return $result[0]; 
     1014                } 
     1015                return  $result; 
    11051016                break; 
    11061017 
    1107                 default: 
    1108  
     1018            default: 
     1019                $without_conditions = empty($options['conditions']) ? true : false; 
    11091020                $ids_condition = $this->getPrimaryKey().' IN ('.join(', ',$ids).')'; 
    1110  
    1111                 if(!empty($options['conditions']) && is_array($options['conditions'])){ 
    1112                     $options['conditions'][0] = $ids_condition.' AND '.$options['conditions'][0]; 
    1113                 }elseif(!empty($options['conditions'])){ 
    1114                     $options['conditions'] = $ids_condition.' AND '.$options['conditions']; 
    1115                 }else{ 
    1116                     $without_conditions = true; 
    1117                     $options['conditions'] = $ids_condition; 
    1118                 } 
    1119  
    1120                 $result =& $this->find('all', $options); 
    1121                 if(is_array($result) && (count($result) == $num_ids || empty($without_conditions))){ 
    1122                     if($result === false){ 
    1123                         $_result = false; 
    1124                     }else{ 
    1125                         $_result =& $result; 
    1126                     } 
    1127                     return $_result; 
    1128                 }else{ 
     1021                $options['conditions'] = $ids_condition.$conditions; 
     1022 
     1023                $result =& $this->_findEvery($options); 
     1024                if(is_array($result) && (count($result) != $num_ids && $without_conditions)){ 
    11291025                    $result = false; 
    1130                     return $result; 
    1131                 } 
     1026                } 
     1027                return $result; 
    11321028                break; 
    1133             } 
    1134             break; 
    1135         } 
    1136         $result = false; 
    1137         return $result; 
     1029        } 
     1030 
     1031    } 
     1032 
     1033    function _extractOptionsFromArgs(&$args) 
     1034    { 
     1035        $last_arg = count($args)-1; 
     1036        return isset($args[$last_arg]) && is_array($args[$last_arg]) && $this->_isOptionsHash($args[$last_arg]) ? array_pop($args) : array(); 
     1037    } 
     1038 
     1039    function _isOptionsHash($options) 
     1040    { 
     1041        if (isset($options[0])){ 
     1042            return false; 
     1043        } 
     1044        $valid_keys = array('conditions', 'include', 'joins', 'limit', 'offset', 'order', 'bind', 'select','select_prefix', 'readonly'); 
     1045        foreach (array_keys($options) as $key){ 
     1046            if (!in_array($key,$valid_keys)){ 
     1047                return false; 
     1048            } 
     1049        } 
     1050        return true; 
     1051    } 
     1052 
     1053    function _extractConditionsFromArgs($args, $options) 
     1054    { 
     1055        if(empty($args)){ 
     1056            $fetch = 'all'; 
     1057        } else { 
     1058            $fetch = $args[0]; 
     1059        } 
     1060        $num_args = count($args); 
     1061 
     1062        // deprecated: acts like findFirstBySQL 
     1063        if ($num_args === 1 && !is_numeric($args[0]) && is_string($args[0]) && $args[0] != 'all' && $args[0] != 'first'){ 
     1064            //  $Users->find("last_name = 'Williams'");    => find('first',"last_name = 'Williams'"); 
     1065            Ak::DeprecateWarning(array("AR::find('%sql') is ambiguous and therefore deprecated, use AR::find('first',%sql) instead", '%sql'=>$args[0])); 
     1066            $options = array('conditions'=> $args[0]); 
     1067            return array('first',$options); 
     1068        } //end 
     1069 
     1070        // set fetch_mode to 'all' if none is given 
     1071        if (!is_numeric($fetch) && !is_array($fetch) && $fetch != 'all' && $fetch != 'first') { 
     1072            array_unshift($args, 'all'); 
     1073            $num_args = count($args); 
     1074        } 
     1075        if ($num_args > 1) { 
     1076            if (is_string($args[1])){ 
     1077                //  $Users->find(:fetch_mode,"first_name = ?",'Tim'); 
     1078                $fetch = array_shift($args); 
     1079                $options = array_merge($options, array('conditions'=>$args));   //TODO: merge_conditions 
     1080            }elseif (is_array($args[1])) { 
     1081                //  $Users->find(:fetch_mode,array('first_name = ?,'Tim')); 
     1082                $fetch = array_shift($args); 
     1083                $options = array_merge($options, array('conditions'=>$args[0]));   //TODO: merge_conditions 
     1084            } 
     1085        } 
     1086 
     1087        return array($fetch,$options); 
     1088    } 
     1089 
     1090    function _validateFindOptions(&$options) 
     1091    { 
     1092        $valid_keys = array('conditions', 'include', 'joins', 'limit', 'offset', 'order', 'bind', 'select','select_prefix', 'readonly'); 
     1093        foreach (array_keys($options) as $key){ 
     1094            if (!in_array($key,$valid_keys)) unset($options[$key]); 
     1095        } 
    11381096    } 
    11391097 
     
    11661124    function &findBySql($sql, $limit = null, $offset = null, $bindings = null) 
    11671125    { 
     1126        if ($limit || $offset){ 
     1127            Ak::DeprecateWarning("You're calling AR::findBySql with \$limit or \$offset parameters. This has been deprecated."); 
     1128            $this->_db->addLimitAndOffset($sql, array('limit'=>$limit,'offset'=>$offset)); 
     1129        } 
    11681130        if(!isset($this->_activeRecordHasBeenInstantiated)){ 
    11691131            return Ak::handleStaticCall(); 
    11701132        } 
    1171         if(is_array($sql)){ 
    1172             $sql_query = array_shift($sql); 
    1173             $bindings = is_array($sql) && count($sql) > 0 ? $sql : array($sql); 
    1174             $sql = $sql_query; 
    1175         } 
    1176         $this->setConnection(); 
    1177          
    1178         AK_LOG_EVENTS ? $this->_startSqlBlockLog() : null; 
    1179                  
    11801133        $objects = array(); 
    1181         if(is_integer($limit)){ 
    1182             if(is_integer($offset)){ 
    1183                 $results = !empty($bindings) ? $this->_db->SelectLimit($sql, $limit, $offset, $bindings) : $this->_db->SelectLimit($sql, $limit, $offset); 
    1184             }else { 
    1185                 $results = !empty($bindings) ? $this->_db->SelectLimit($sql, $limit, -1, $bindings) : $this->_db->SelectLimit($sql, $limit); 
    1186             } 
    1187         }else{ 
    1188             $results = !empty($bindings) ? $this->_db->Execute($sql, $bindings) : $this->_db->Execute($sql); 
    1189         } 
    1190          
    1191         AK_LOG_EVENTS ? $this->_endSqlBlockLog() : null; 
    1192  
    1193         if(!$results){ 
    1194             AK_DEBUG ? trigger_error($this->_db->ErrorMsg(), E_USER_NOTICE) : null; 
    1195         }else{ 
    1196             $objects = array(); 
    1197             while ($record = $results->FetchRow()) { 
    1198                 $objects[] =& $this->instantiate($this->getOnlyAvailableAtrributes($record), false); 
    1199             } 
    1200         } 
    1201  
     1134        $records = $this->_db->select ($sql,'selecting'); 
     1135        foreach ($records as $record){ 
     1136            $objects[] =& $this->instantiate($this->getOnlyAvailableAttributes($record), false); 
     1137        } 
    12021138        return $objects; 
    12031139    } 
     
    12131149        } 
    12141150        $args = func_get_args(); 
    1215         if($args[0] != 'first'){ 
    1216             array_unshift($args,'first'); 
    1217         } 
     1151        array_unshift($args,'first'); 
    12181152        $result =& Ak::call_user_func_array(array(&$this,'findBy'), $args); 
    12191153        return $result; 
     
    12261160        } 
    12271161        $args = func_get_args(); 
    1228         $options = array_pop($args); 
    1229         if(!is_array($options)){ 
    1230             array_push($args, $options); 
    1231             $options = array(); 
    1232         } 
     1162        $options = $this->_extractOptionsFromArgs($args); 
    12331163        $options['order'] = $this->getPrimaryKey().' DESC'; 
    12341164        array_push($args, $options); 
     
    12431173        } 
    12441174        $args = func_get_args(); 
    1245         if($args[0] == 'first'){ 
    1246             array_shift($args); 
    1247         } 
     1175        array_unshift($args,'all'); 
    12481176        $result =& Ak::call_user_func_array(array(&$this,'findBy'), $args); 
    12491177        return $result; 
     
    12711199            $fetch = 'all'; 
    12721200        } 
    1273      
    1274         $options = array_pop($args); 
    1275      
    1276         if(!is_array($options)){ 
    1277             array_push($args, $options); 
    1278             $options = array(); 
    1279         } 
    1280      
     1201 
     1202        $options = $this->_extractOptionsFromArgs($args); 
     1203 
    12811204        $query_values = $args; 
    12821205        $query_arguments_count = count($query_values); 
    1283      
     1206 
    12841207        list($sql, $requested_args) = $this->_getFindBySqlAndColumns($find_by_sql, $query_values); 
    1285      
     1208 
    12861209        if($query_arguments_count != count($requested_args)){ 
    12871210            trigger_error(Ak::t('Argument list did not match expected set. Requested arguments are:').join(', ',$requested_args),E_USER_ERROR); 
     
    12891212            return $false; 
    12901213        } 
    1291      
     1214 
    12921215        $true_bool_values = array(true,1,'true','True','TRUE','1','y','Y','yes','Yes','YES','s','Si','SI','V','v','T','t'); 
    1293      
     1216 
    12941217        foreach ($requested_args as $k=>$v){ 
    12951218            switch ($this->getColumnType($v)) { 
    12961219                case 'boolean': 
    1297                     $query_values[$k] = in_array($query_values[$k],$true_bool_values) ? 1 : 0
     1220                    $query_values[$k] = in_array($query_values[$k],$true_bool_values) ? true : false
    12981221                    break; 
    1299      
     1222 
    13001223                case 'date': 
    13011224                case 'datetime': 
    13021225                    $query_values[$k] = str_replace('/','-', $this->castAttributeForDatabase($k,$query_values[$k],false)); 
    13031226                    break; 
    1304      
     1227 
    13051228                default: 
    13061229                    break; 
    13071230            } 
    13081231        } 
    1309      
    1310         $_find_arguments = array(); 
    1311         $_find_arguments[] = $fetch; 
    1312         $_find_arguments[] = $sql
    1313         foreach ($query_values as $value){ 
    1314             $_find_arguments[] = $value; 
    1315         } 
    1316         $_find_arguments[] = $options; 
    1317      
    1318         $_result =& $this->find('set arguments', $_find_arguments); 
    1319         $result =& $_result; // Pass by reference hack 
     1232 
     1233        $conditions = array($sql); 
     1234        foreach ($query_values as $bind_value){ 
     1235            $conditions[] = $bind_value
     1236        } 
     1237        /** 
     1238        * @todo merge_conditions 
     1239        */ 
     1240        $options['conditions'] = $conditions; 
     1241 
     1242        $result =& Ak::call_user_func_array(array(&$this,'find'), array($fetch,$options)); 
    13201243        return $result; 
    13211244    } 
    1322      
    1323      
     1245 
     1246 
    13241247    function _getFindBySqlAndColumns($find_by_sql, &$query_values) 
    13251248    { 
     
    13301253        $params = array_diff($pieces,$operators); 
    13311254        $operators = array_diff($pieces,$params); 
    1332      
     1255 
    13331256        $new_sql = ''; 
    13341257        $parameter_count = 0; 
     
    13401263                $parameter_count++; 
    13411264            }elseif (!in_array($piece,$operators)){ 
    1342      
     1265 
    13431266                if(strstr($piece,':')){ 
    13441267                    $_tmp_parts = explode(':',$piece); 
     
    13891312            } 
    13901313        } 
    1391          
     1314 
    13921315        return array($new_sql, $requested_args); 
    13931316    } 
    1394      
    1395      
     1317 
     1318 
    13961319    /** 
    13971320     *  Given a condition that uses bindings like "user = ?  AND created_at > ?" will return a 
     
    14111334        return trim(preg_replace('/('.join('|',array_keys($replacements)).')\s+([^\?]+)\s+\?/e', "isset(\$replacements['\\1']) ? '\\1 \\2 '.\$replacements['\\1']:'\\1 \\2 null'", $sql)); 
    14121335    } 
    1413     
     1336 
    14141337 
    14151338    function constructFinderSql($options, $select_from_prefix = 'default') 
     
    14181341        $sql  .= !empty($options['joins']) ? ' '.$options['joins'] : ''; 
    14191342 
    1420  
    1421         if(isset($options['conditions'])){ 
    1422             $this->addConditions($sql, $options['conditions']); 
    1423         }elseif ($this->getInheritanceColumn() !== false){ 
    1424             $this->addConditions($sql, array()); 
    1425         } 
     1343        $this->addConditions($sql, isset($options['conditions']) ? $options['conditions'] : array()); 
    14261344 
    14271345        // Create an alias for order 
     
    14321350        $sql  .= !empty($options['order']) ? ' ORDER BY  '.$options['order'] : ''; 
    14331351 
     1352        $this->_db->addLimitAndOffset($sql,$options); 
     1353 
    14341354        return $sql; 
    14351355    } 
     
    14421362    { 
    14431363        $concat = empty($sql) ? '' : ' WHERE '; 
     1364        if (empty($conditions) && $this->_getDatabaseType() == 'sqlite') $conditions = '1';  // sqlite HACK 
    14441365        if(!empty($conditions)){ 
    14451366            $sql  .= $concat.$conditions; 
     
    14471368        } 
    14481369 
    1449         if($this->descendsFromActiveRecord($this) && $this->getInheritanceColumn() !== false){ 
     1370        if($this->getInheritanceColumn() !== false && $this->descendsFromActiveRecord($this)){ 
    14501371            $type_condition = $this->typeCondition(); 
    14511372            $sql .= !empty($type_condition) ? $concat.$type_condition : ''; 
     
    14531374        return $sql; 
    14541375    } 
    1455  
    14561376 
    14571377    /** 
     
    15821502        return $object; 
    15831503    } 
    1584      
     1504 
    15851505    /*/Finding records*/ 
    1586      
    1587  
    1588  
    1589     /**  
     1506 
     1507 
     1508 
     1509    /** 
    15901510                           Table inheritance 
    15911511     ==================================================================== 
    15921512     */ 
    1593     function descendsFromActiveRecord(&$object) 
    1594    
    1595         if(substr(strtolower(get_parent_class($object)),-12) == 'activerecord'){ 
    1596             return true; 
    1597        
    1598         if(!method_exists($object, 'getInheritanceColumn')){ 
    1599             return false; 
    1600        
    1601         $inheritance_column = $object->getInheritanceColumn(); 
    1602         return !empty($inheritance_column); 
    1603    
    1604  
    1605     /** 
     1513    function descendsFromActiveRecord(&$object) 
     1514   
     1515        if(substr(strtolower(get_parent_class($object)),-12) == 'activerecord'){ 
     1516            return true; 
     1517       
     1518        if(!method_exists($object, 'getInheritanceColumn')){ 
     1519            return false; 
     1520       
     1521        $inheritance_column = $object->getInheritanceColumn(); 
     1522        return !empty($inheritance_column); 
     1523   
     1524 
     1525    /** 
    16061526     * Gets the column name for use with single table inheritance. Can be overridden in subclasses. 
    16071527    */ 
    1608     function getInheritanceColumn() 
    1609    
    1610         return empty($this->_inheritanceColumn) ? ($this->hasColumn('type') ? 'type' : false ) : $this->_inheritanceColumn; 
    1611    
    1612  
    1613     /** 
     1528    function getInheritanceColumn() 
     1529   
     1530        return empty($this->_inheritanceColumn) ? ($this->hasColumn('type') ? 'type' : false ) : $this->_inheritanceColumn; 
     1531   
     1532 
     1533    /** 
    16141534     * Defines the column name for use with single table inheritance. Can be overridden in subclasses. 
    16151535     */ 
    1616     function setInheritanceColumn($column_name) 
    1617    
    1618         if(!$this->hasColumn($column_name)){ 
    1619             trigger_error(Ak::t('Could not set "%column_name" as the inheritance column as this column is not available on the database.',array('%column_name'=>$column_name)), E_USER_NOTICE); 
    1620             return false; 
    1621         }elseif($this->getColumnType($column_name) != 'string'){ 
    1622             trigger_error(Ak::t('Could not set %column_name as the inheritance column as this column type is "%column_type" instead of "string".',array('%column_name'=>$column_name,'%column_type'=>$this->getColumnType($column_name))), E_USER_NOTICE); 
    1623             return false; 
    1624         }else{ 
    1625             $this->_inheritanceColumn = $column_name; 
    1626             return true; 
    1627        
    1628    
    1629  
    1630  
    1631     function getSubclasses() 
    1632    
    1633         $current_class = get_class($this); 
    1634         $subclasses = array(); 
    1635         $classes = get_declared_classes(); 
    1636  
    1637         while ($class = array_shift($classes)) { 
    1638             $parent_class = get_parent_class($class); 
    1639             if($parent_class == $current_class || in_array($parent_class,$subclasses)){ 
    1640                 $subclasses[] = $class; 
    1641             }elseif(!empty($parent_class)){ 
    1642                 $classes[] = $parent_class; 
    1643            
    1644        
    1645         $subclasses = array_unique(array_map(array(&$this,'_getModelName'),$subclasses)); 
    1646         return $subclasses; 
    1647    
    1648  
    1649  
    1650     function typeCondition() 
    1651    
    1652         $inheritance_column = $this->getInheritanceColumn(); 
    1653         $type_condition = array(); 
    1654         $table_name = $this->getTableName(); 
    1655         $available_types = array_merge(array($this->getModelName()),$this->getSubclasses()); 
    1656         foreach ($available_types as $subclass){ 
    1657             $type_condition[] = ' '.$table_name.'.'.$inheritance_column.' = \''.AkInflector::humanize(AkInflector::underscore($subclass)).'\' '; 
    1658        
    1659         return empty($type_condition) ? '' : '('.join('OR',$type_condition).') '; 
    1660    
    1661  
    1662     /*/Table inheritance*/ 
    1663  
    1664  
    1665  
    1666     /**  
     1536    function setInheritanceColumn($column_name) 
     1537   
     1538        if(!$this->hasColumn($column_name)){ 
     1539            trigger_error(Ak::t('Could not set "%column_name" as the inheritance column as this column is not available on the database.',array('%column_name'=>$column_name)), E_USER_NOTICE); 
     1540            return false; 
     1541        }elseif($this->getColumnType($column_name) != 'string'){ 
     1542            trigger_error(Ak::t('Could not set %column_name as the inheritance column as this column type is "%column_type" instead of "string".',array('%column_name'=>$column_name,'%column_type'=>$this->getColumnType($column_name))), E_USER_NOTICE); 
     1543            return false; 
     1544        }else{ 
     1545            $this->_inheritanceColumn = $column_name; 
     1546            return true; 
     1547       
     1548   
     1549 
     1550 
     1551    function getSubclasses() 
     1552   
     1553        $current_class = get_class($this); 
     1554        $subclasses = array(); 
     1555        $classes = get_declared_classes(); 
     1556 
     1557        while ($class = array_shift($classes)) { 
     1558            $parent_class = get_parent_class($class); 
     1559            if($parent_class == $current_class || in_array($parent_class,$subclasses)){ 
     1560                $subclasses[] = $class; 
     1561            }elseif(!empty($parent_class)){ 
     1562                $classes[] = $parent_class; 
     1563           
     1564       
     1565        $subclasses = array_unique(array_map(array(&$this,'_getModelName'),$subclasses)); 
     1566        return $subclasses; 
     1567   
     1568 
     1569 
     1570    function typeCondition() 
     1571   
     1572        $inheritance_column = $this->getInheritanceColumn(); 
     1573        $type_condition = array(); 
     1574        $table_name = $this->getTableName(); 
     1575        $available_types = array_merge(array($this->getModelName()),$this->getSubclasses()); 
     1576        foreach ($available_types as $subclass){ 
     1577            $type_condition[] = ' '.$table_name.'.'.$inheritance_column.' = \''.AkInflector::humanize(AkInflector::underscore($subclass)).'\' '; 
     1578       
     1579        return empty($type_condition) ? '' : '('.join('OR',$type_condition).') '; 
     1580   
     1581 
     1582    /*/Table inheritance*/ 
     1583 
     1584 
     1585 
     1586    /** 
    16671587                         Setting Attributes 
    16681588    ==================================================================== 
     
    17471667    } 
    17481668 
    1749      
     1669 
    17501670    function setId($value) 
    17511671    { 
     
    17571677        return true; 
    17581678    } 
    1759      
    1760      
     1679 
     1680 
    17611681    /*/Setting Attributes*/ 
    17621682 
    1763     /**  
     1683    /** 
    17641684                         Getting Attributes 
    17651685    ==================================================================== 
    17661686    See also: Setting Attributes, Model Attributes, Toggling Attributes, Counting Attributes. 
    17671687    */ 
    1768      
     1688 
    17691689    function getAttribute($attribute, $inspect_for_callback_child_method = AK_ACTIVE_RECORD_ENABLE_CALLBACK_GETTERS) 
    17701690    { 
     
    18371757        return $attributes; 
    18381758    } 
    1839      
     1759 
    18401760 
    18411761    /** 
     
    18511771 
    18521772 
    1853     /**  
     1773    /** 
    18541774                         Toggling Attributes 
    18551775    ==================================================================== 
     
    18571777    */ 
    18581778    /** 
    1859     * Turns an attribute that?s currently true into false and vice versa. Returns attribute value. 
     1779    * Turns an attribute that's currently true into false and vice versa. Returns attribute value. 
    18601780    */ 
    18611781    function toggleAttribute($attribute) 
     
    18811801 
    18821802    /*/Toggling Attributes*/ 
    1883      
    1884      
    1885     /**  
     1803 
     1804 
     1805    /** 
    18861806                         Counting Attributes 
    18871807    ==================================================================== 
     
    18981818    function incrementCounter($counter_name, $id, $difference = 1) 
    18991819    { 
    1900         $new_value = $this->getAttribute($counter_name) + $difference; 
    1901         if($this->updateAll($counter_name.' = '.$new_value, $this->getPrimaryKey().' = '.$this->castAttributeForDatabase($this->getPrimaryKey(), $id)) === 0){ 
    1902             return false; 
    1903         } 
    1904         return $new_value; 
     1820        return $this->updateAll("$counter_name = $counter_name + $difference", $this->getPrimaryKey().' = '.$this->castAttributeForDatabase($this->getPrimaryKey(), $id)) === 1; 
    19051821    } 
    19061822 
     
    19101826    function decrementCounter($counter_name, $id, $difference = 1) 
    19111827    { 
    1912         $new_value = $this->getAttribute($counter_name) - $difference; 
    1913  
    1914         if(!$this->updateAll($counter_name.' = '.$new_value, $this->getPrimaryKey().' = '.$this->castAttributeForDatabase($this->getPrimaryKey(), $id)) === 0){ 
    1915             return false; 
    1916         } 
    1917         return $new_value; 
    1918     } 
    1919      
     1828        return $this->updateAll("$counter_name = $counter_name - $difference", $this->getPrimaryKey().' = '.$this->castAttributeForDatabase($this->getPrimaryKey(), $id)) === 1; 
     1829    } 
     1830 
    19201831    /** 
    19211832    * Initializes the attribute to zero if null and subtracts one. Only makes sense for number-based attributes. Returns attribute value. 
     
    19241835    { 
    19251836        if(!isset($this->$attribute)){ 
    1926             $this->setAttribute($attribute, 0); 
    1927             return 0; 
    1928         }else { 
    1929             $value = $this->getAttribute($attribute) -1; 
    1930             $this->setAttribute($attribute, $value); 
    1931             return $value; 
    1932         } 
     1837            $this->$attribute = 0; 
     1838        } 
     1839        return $this->$attribute -= 1; 
    19331840    } 
    19341841 
     
    19381845    function decrementAndSaveAttribute($attribute) 
    19391846    { 
    1940         $value = $this->decrementAttribute($attribute); 
    1941         if($this->updateAttribute($attribute, $value)){ 
    1942             return $value; 
    1943         } 
    1944         return false; 
     1847        return $this->updateAttribute($attribute,$this->decrementAttribute($attribute)); 
    19451848    } 
    19461849 
     
    19521855    { 
    19531856        if(!isset($this->$attribute)){ 
    1954             $this->setAttribute($attribute, 0); 
    1955             return 0; 
    1956         }else { 
    1957             $value = $this->getAttribute($attribute) +1; 
    1958             $this->setAttribute($attribute, $value); 
    1959             return $value; 
    1960         } 
     1857            $this->$attribute = 0; 
     1858        } 
     1859        return $this->$attribute += 1; 
    19611860    } 
    19621861 
     
    19661865    function incrementAndSaveAttribute($attribute) 
    19671866    { 
    1968         $value = $this->incrementAttribute($attribute); 
    1969         if($this->updateAttribute($attribute, $value)){ 
    1970             return $value; 
    1971         } 
    1972         return false; 
    1973     } 
    1974      
     1867        return $this->updateAttribute($attribute,$this->incrementAttribute($attribute)); 
     1868    } 
     1869 
    19751870    /*/Counting Attributes*/ 
    19761871 
    1977     /**  
     1872    /** 
    19781873                         Protecting attributes 
    19791874    ==================================================================== 
    19801875    */ 
    1981      
     1876 
    19821877    /** 
    19831878    * If this macro is used, only those attributed named in it will be accessible  
     
    20231918        $this->_protectedAttributes = array_unique(array_merge((array)$this->_protectedAttributes, $args)); 
    20241919    } 
    2025      
     1920 
    20261921    function removeAttributesProtectedFromMassAssignment($attributes) 
    20271922    { 
     
    20411936        return $attributes; 
    20421937    } 
    2043      
     1938 
    20441939    /*/Protecting attributes*/ 
    20451940 
    20461941 
    2047     /**  
     1942    /** 
    20481943                          Model Attributes 
    20491944     ==================================================================== 
     
    20621957        return array_merge($this->getColumns(), $this->getAvailableCombinedAttributes()); 
    20631958    } 
    2064      
     1959 
    20651960    function getAttributeCaption($attribute) 
    20661961    { 
    20671962        return $this->t(AkInflector::humanize($attribute)); 
    20681963    } 
    2069      
     1964 
    20701965    /** 
    20711966     * This function is useful in case you need to know if attributes have been assigned to an object. 
     
    20761971        return empty($attributes); 
    20771972    } 
    2078      
     1973 
    20791974 
    20801975    /** 
     
    21412036        return !empty($value); 
    21422037    } 
    2143      
     2038 
    21442039    /** 
    21452040    * Returns true if given attribute exists for this Model. 
     
    21502045    function hasAttribute ($attribute) 
    21512046    { 
    2152         empty($this->_columns) ? $this->getColumns() : $this->_columns; 
     2047        empty($this->_columns) ? $this->getColumns() : $this->_columns; // HINT: only used by HasAndBelongsToMany joinObjects, if the table is not present yet! 
    21532048        return isset($this->_columns[$attribute]) || (!empty($this->_combinedAttributes) && $this->isCombinedAttribute($attribute)); 
    21542049    } 
    2155      
     2050 
    21562051    /*/Model Attributes*/ 
    21572052 
    21582053 
    2159     /**  
     2054    /** 
    21602055                          Combined attributes 
    21612056    ==================================================================== 
     
    22782173        } 
    22792174    } 
    2280      
     2175 
    22812176    function composeCombinedAttribute($combined_attribute) 
    22822177    { 
     
    24002295        return !empty($this->_combinedAttributes) && is_array($this->_combinedAttributes) ? $combined_attributes : array(); 
    24012296    } 
    2402      
     2297 
    24032298    /*/Combined attributes*/ 
    24042299 
     
    24062301 
    24072302 
    2408     /**  
     2303    /** 
    24092304                         Database connection 
    24102305    ==================================================================== 
    24112306    */ 
    24122307    /** 
    2413     * Establishes the connection to the database. Accepts an array as input where the 'adapter'  
    2414     * key must be specified with the name of a database adapter (in lower-case) example for regular  
    2415     * databases (MySQL, Postgresql, etc): 
     2308    * Establishes the connection to the database. Accepts either a profile name specified in config/config.php or 
     2309    * an array as input where the 'type' key must be specified with the name of a database adapter (in lower-case)  
     2310    * example for regular databases (MySQL, Postgresql, etc): 
     2311    *  
     2312    *   $AkActiveRecord->establishConnection('development'); 
     2313    *   $AkActiveRecord->establishConnection('super_user'); 
    24162314    *  
    24172315    *   $AkActiveRecord->establishConnection( 
    24182316    *       array( 
    2419     *       'adapter'  => "mysql", 
     2317    *       'type'  => "mysql", 
    24202318    *       'host'     => "localhost", 
    24212319    *       'username' => "myuser", 
     
    24282326    *     $AkActiveRecord->establishConnection( 
    24292327    *       array( 
    2430     *       'adapter' => "sqlite", 
     2328    *       'type' => "sqlite", 
    24312329    *       'dbfile'  => "path/to/dbfile" 
    24322330    *       ) 
    24332331    *     ) 
    24342332    */ 
    2435     function &establishConnection($spec = null) 
    2436     { 
    2437         if(isset($spec)){ 
    2438             $dns = is_string($spec) ? $spec : ''; 
    2439             if(!empty($spec['adapter'])){ 
    2440                 $dsn = $spec['adapter'] == 'sqlite' ? 
    2441                 'sqlite://'.urlencode($spec['dbfile']).'/' : 
    2442                 $spec['adapter'].'://'.@$spec['username'].':'.@$spec['password'].'@'.@$spec['host'].'/'.@$spec['database']; 
    2443             } 
    2444             $dsn .= isset($spec['persist']) && $spec['persist'] === false ? '' : '?persist'; 
    2445             return $this->setConnection($dns); 
    2446         }else{ 
    2447             return false; 
    2448         } 
    2449     } 
    2450  
    2451  
    2452     /** 
    2453     * Returns true if a connection that?s accessible to this class have already been opened. 
     2333    function &establishConnection($specification_or_profile = AK_DEFAULT_DATABASE_PROFILE) 
     2334    { 
     2335        $adapter =& AkDbAdapter::getInstance($specification_or_profile); 
     2336        return $this->setConnection(&$adapter); 
     2337    } 
     2338 
     2339 
     2340    /** 
     2341    * Returns true if a connection that's accessible to this class have already been opened. 
    24542342    */  
    24552343    function isConnected() 
     
    24682356 
    24692357    /** 
    2470     * Set the connection for the class. 
    2471     */ 
    2472     function setConnection($dns = null, $connection_id = null) 
    2473     { 
    2474         $this->_db =& Ak::db($dns, $connection_id); 
    2475     } 
    2476      
     2358    * Sets the connection for the class. 
     2359    */ 
     2360    function &setConnection($db_adapter = null) 
     2361    { 
     2362        if (is_null($db_adapter)){ 
     2363            $db_adapter =& AkDbAdapter::getInstance(); 
     2364        } 
     2365        return $this->_db =& $db_adapter; 
     2366    } 
     2367 
    24772368    /** 
    24782369    * @access private 
     
    24802371    function _getDatabaseType() 
    24812372    { 
    2482         if(strstr($this->_db->databaseType,'mysql')){ 
    2483             return 'mysql'; 
    2484         }elseif(strstr($this->_db->databaseType,'sqlite')){ 
    2485             return 'sqlite'; 
    2486         }elseif(strstr($this->_db->databaseType,'post')){ 
    2487             return 'postgre'; 
    2488         }else{ 
    2489             return 'unknown'; 
    2490         } 
     2373        return $this->_db->type(); 
    24912374    } 
    24922375    /*/Database connection*/ 
    2493      
    2494      
    2495     /**  
     2376 
     2377 
     2378    /** 
    24962379                           Table Settings 
    24972380    ==================================================================== 
    24982381    See also: Database Reflection. 
    24992382    */ 
    2500      
     2383 
    25012384    /** 
    25022385    * Defines the primary key field ? can be overridden in subclasses. 
     
    25402423                    $this->setConnection(); 
    25412424                } 
    2542                 if(empty($_SESSION['__activeRecordColumnsSettingsCache']['available_tables']) ||  
     2425                if(empty($_SESSION['__activeRecordColumnsSettingsCache']['available_tables']) || 
    25432426                !AK_ACTIVE_RECORD_ENABLE_PERSISTENCE){ 
    2544                     $_SESSION['__activeRecordColumnsSettingsCache']['available_tables'] = $this->_db->MetaTables(); 
     2427                    $_SESSION['__activeRecordColumnsSettingsCache']['available_tables'] = $this->_db->availableTables(); 
    25452428                } 
    25462429                $available_tables = $_SESSION['__activeRecordColumnsSettingsCache']['available_tables']; 
     
    25602443    } 
    25612444 
    2562      
    2563     function getOnlyAvailableAtrributes($attributes) 
     2445 
     2446    function getOnlyAvailableAttributes($attributes) 
    25642447    { 
    25652448        $table_name = $this->getTableName(); 
     
    25672450        if(!empty($attributes) && is_array($attributes)){ 
    25682451            $available_attributes = $this->getAvailableAttributes(); 
    2569              
     2452 
    25702453            $keys = array_keys($attributes); 
    25712454            $size = sizeOf($keys); 
     
    25802463    } 
    25812464 
    2582     function getColumnsForAtrributes($attributes) 
     2465    function getColumnsForAttributes($attributes) 
    25832466    { 
    25842467        $ret_attributes = array(); 
     
    25952478        return $ret_attributes; 
    25962479    } 
    2597      
     2480 
    25982481    /** 
    25992482    * Returns true if given attribute exists for this Model. 
     
    26102493 
    26112494    /*/Table Settings*/ 
    2612      
    2613     /**  
     2495 
     2496    /** 
    26142497                           Database Reflection 
    26152498    ==================================================================== 
    26162499    See also: Table Settings, Type Casting. 
    26172500    */ 
    2618      
     2501 
    26192502 
    26202503    /** 
     
    26462529    { 
    26472530        if(empty($_SESSION['__activeRecordColumnsSettingsCache']['database_table_'.$table.'_internals']) || !AK_ACTIVE_RECORD_ENABLE_PERSISTENCE){ 
    2648             $_SESSION['__activeRecordColumnsSettingsCache']['database_table_'.$table.'_internals'] = $this->_db->MetaColumns($table); 
     2531            $_SESSION['__activeRecordColumnsSettingsCache']['database_table_'.$table.'_internals'] = $this->_db->getColumnDetails($table); 
    26492532        } 
    26502533        $cache[$table] = $_SESSION['__activeRecordColumnsSettingsCache']['database_table_'.$table.'_internals']; 
     
    26612544        return $columns; 
    26622545    } 
    2663      
     2546 
    26642547 
    26652548    /** 
     
    26912574    } 
    26922575 
    2693      
     2576 
    26942577    /** 
    26952578    * Returns an array of column objects for the table associated with this class. 
     
    27192602        } 
    27202603        $this->_columnsSettings = $force_reload ? null : $this->_getPersistedTableColumnSettings(); 
    2721          
     2604 
    27222605        if(empty($this->_columnsSettings) || !AK_ACTIVE_RECORD_ENABLE_PERSISTENCE){ 
    27232606            if(empty($this->_dataDictionary)){ 
    2724                 $this->_dataDictionary =& NewDataDictionary($this->_db); 
     2607                $this->_dataDictionary =& $this->_db->getDictionary(); 
    27252608            } 
    27262609 
     
    27752658            $this->_columnsSettings[$column_name]['maxLength'] = $column_object->max_length; 
    27762659        } 
     2660        if(!empty($column_object->scale) && $column_object->scale > 0){ 
     2661            $this->_columnsSettings[$column_name]['scale'] = $column_object->scale; 
     2662        } 
    27772663        if(isset($column_object->default_value)){ 
    27782664            $this->_columnsSettings[$column_name]['defaultValue'] = $column_object->default_value; 
     
    28722758        } 
    28732759    } 
    2874      
     2760 
    28752761 
    28762762    function initiateAttributeToNull($attribute) 
     
    29502836        'I8' => 'integer', // 8-byte integer 
    29512837        'F' => 'float', // Floating point number 
    2952         'N' => 'integer' //  Numeric or decimal number 
     2838        'N' => 'decimal' //  Numeric or decimal number 
    29532839        ); 
    29542840 
     
    29642850 
    29652851        if($this->_getDatabaseType() == 'mysql'){ 
    2966             if($result == 'integer' && (int)$adodb_column_object->max_length === 1 && 
    2967             stristr($adodb_column_object->type, 'TINYINT')){ 
     2852            if($result == 'integer' && stristr($adodb_column_object->type, 'TINYINT')){ 
    29682853                return 'boolean'; 
    29692854            } 
     
    29712856            if($adodb_column_object->type == 'timestamp' || $result == 'datetime'){ 
    29722857                $adodb_column_object->max_length = 19; 
    2973             } 
    2974  
    2975             if($result == 'boolean' && (int)$adodb_column_object->max_length !== 1 && stristr($adodb_column_object->type, 'NUMERIC')){ 
    2976                 return 'integer'; 
    29772858            } 
    29782859        }elseif($this->_getDatabaseType() == 'sqlite'){ 
     
    30342915 
    30352916 
    3036      
     2917 
    30372918    /*/Database Reflection*/ 
    30382919 
    3039     /**  
     2920    /** 
    30402921                               Localization 
    30412922    ==================================================================== 
    30422923    */ 
    3043      
     2924 
    30442925    function t($string, $array = null) 
    30452926    { 
    30462927        return Ak::t($string, $array, AkInflector::underscore($this->getModelName())); 
    30472928    } 
    3048      
     2929 
    30492930    function getInternationalizedColumns() 
    30502931    { 
     
    31403021        return $this->_isInternationalizeCandidate($attribute) ? substr($attribute,3) : $attribute; 
    31413022    } 
    3142      
     3023 
    31433024    /** 
    31443025    * @access private 
     
    31493030        return $pos === 2 && in_array(substr($column_name,0,$pos),$this->getAvailableLocales()); 
    31503031    } 
    3151      
     3032 
    31523033    /** 
    31533034    * @access private 
     
    31583039    } 
    31593040 
    3160      
     3041 
    31613042    /** 
    31623043     * Adds an internationalized attribute to an array containing other locales for the same column name 
     
    31813062        } 
    31823063    } 
    3183      
     3064 
    31843065    /*/Localization*/ 
    3185      
    3186  
    3187  
    3188  
    3189     /**  
     3066 
     3067 
     3068 
     3069 
     3070    /** 
    31903071                             Type Casting 
    31913072    ==================================================================== 
     
    32143095        return null; 
    32153096    } 
    3216      
     3097 
    32173098    function quotedId() 
    32183099    { 
     
    32533134    } 
    32543135 
     3136    function getColumnScale($column_name) 
     3137    { 
     3138        empty($this->_columns) ? $this->getColumns() : null; 
     3139        return empty($this->_columns[$column_name]['scale']) ? false : $this->_columns[$column_name]['scale']; 
     3140    } 
    32553141 
    32563142    function castAttributeForDatabase($column_name, $value, $add_quotes = true) 
    32573143    { 
    3258         $result = '';//$add_quotes ? "''" : ''; // $result = $add_quotes ? $this->_db->qstr('') : ''; 
     3144        $result = ''; 
    32593145        switch ($this->getColumnType($column_name)) { 
    32603146            case 'datetime': 
    3261             if(!empty($value)){ 
    3262                 $date_time = $this->_db->DBTimeStamp($this->getValueForDateColumn($column_name, $value)); 
    3263                 $result = $add_quotes ? $date_time : trim($date_time ,"'"); 
    3264             }else{ 
    3265                 $result = 'null'; 
    3266            
    3267             break; 
     3147                if(!empty($value)){ 
     3148                    $date_time = $this->_db->quote_datetime(Ak::getTimestamp($value)); 
     3149                    $result = $add_quotes ? $date_time : trim($date_time ,"'"); 
     3150                }else{ 
     3151                    $result = 'null'; 
     3152               
     3153                break; 
    32683154 
    32693155            case 'date': 
    3270             if(!empty($value)){ 
    3271                 $date = $this->_db->DBDate($this->getValueForDateColumn($column_name, $value)); 
    3272                 $result = $add_quotes ? $date : trim($date, "'"); 
    3273             }else{ 
    3274                 $result = 'null'; 
    3275            
    3276             break; 
     3156                if(!empty($value)){ 
     3157                    $date = $this->_db->quote_date(Ak::getTimestamp($value)); 
     3158                    $result = $add_quotes ? $date : trim($date, "'"); 
     3159                }else{ 
     3160                    $result = 'null'; 
     3161               
     3162                break; 
    32773163 
    32783164            case 'boolean': 
    3279             $result = !empty($value) ? '1' : '0'
    3280             break; 
     3165                $result = is_null($value) ? 'null' : (!empty($value) ? "'1'" : "'0'")
     3166                break; 
    32813167 
    32823168            case 'binary': 
    3283  
    3284             if($this->_getDatabaseType() == 'postgre'){ 
    3285                 $result =  " '".$this->_db->BlobEncode($value)."'::bytea "; 
    3286             }else{ 
    3287                 $result = $add_quotes ? $this->_db->qstr($value) : $value; 
    3288             } 
    3289  
    3290             break; 
     3169                if($this->_getDatabaseType() == 'postgre'){ 
     3170                    $result =  " '".$this->_db->escape_blob($value)."'::bytea "; 
     3171                }else{ 
     3172                    $result = $add_quotes ? $this->_db->quote_string($value) : $value; 
     3173                } 
     3174                break; 
     3175 
     3176            case 'decimal': 
     3177                if(is_null($value)){ 
     3178                    $result = 'null'; 
     3179                }else{ 
     3180                    if($scale = $this->getColumnScale($column_name)){ 
     3181                        $value = number_format($value, $scale); 
     3182                    } 
     3183                } 
     3184                $result = $add_quotes ? $this->_db->quote_string($value) : $value; 
     3185                break; 
    32913186 
    32923187            case 'serial': 
    32933188            case 'integer': 
    3294                 $value = is_null($value) ? null : (integer)$value; 
     3189                $result = is_null($value) ? 'null' : (integer)$value; 
     3190                break; 
     3191 
    32953192            case 'float': 
    3296             $result = (empty($value) && $value !== 0) ? 'null' : (is_numeric($value) ? $value : $this->_db->qstr($value)); 
    3297             $result = !empty($this->_columns[$column_name]['notNull']) && $result == 'null' && $this->_getDatabaseType() == 'sqlite' ? '0' : $result; 
    3298             break; 
     3193                $result = (empty($value) && $value !== 0) ? 'null' : (is_numeric($value) ? $value : $this->_db->quote_string($value)); 
     3194                $result = !empty($this->_columns[$column_name]['notNull']) && $result == 'null' && $this->_getDatabaseType() == 'sqlite' ? '0' : $result; 
     3195                break; 
    32993196 
    33003197            default: 
    3301             $result = $add_quotes ? $this->_db->qstr($value) : $value; 
    3302             break; 
    3303         } 
    3304  
    3305         return empty($this->_columns[$column_name]['notNull']) ? ($result === '' ? "''" : $result) : ($result === 'null' ? '' : $result);         
     3198                $result = $add_quotes ? $this->_db->quote_string($value) : $value; 
     3199                break; 
     3200        } 
     3201        //  !! null vs. not null !! 
     3202        return empty($this->_columns[$column_name]['notNull']) ? ($result === '' ? "''" : $result) : ($result === 'null' ? '' : $result); 
    33063203    } 
    33073204 
     
    33133210                if('integer' == $column_type){ 
    33143211                    return is_null($value) ? null : (integer)$value; 
     3212                    //return is_null($value) ? null : $value;    // maybe for bigint we can do this 
    33153213                }elseif('boolean' == $column_type){ 
     3214                    if (is_null($value)) { 
     3215                        return null; 
     3216                    } 
     3217                    if ($this->_getDatabaseType()=='postgre'){ 
     3218                        return $value=='t' ? true : false; 
     3219                    } 
    33163220                    return (integer)$value === 1 ? true : false; 
    33173221                }elseif(!empty($value) && 'date' == $column_type && strstr(trim($value),' ')){ 
     
    33203224                    return null; 
    33213225                }elseif ('binary' == $column_type && $this->_getDatabaseType() == 'postgre'){ 
    3322                     return $this->_db->BlobDecode($value); 
     3226                    return $this->_db->unescape_blob($value); 
    33233227                } 
    33243228            } 
     
    33513255        } 
    33523256    } 
    3353      
    3354      
    3355      
     3257 
    33563258    /** 
    33573259    * @access private 
     
    33753277    } 
    33763278 
    3377  
    3378  
    3379     function getValueForDateColumn($column_name, $value) 
    3380     { 
    3381         if(!$this->isNewRecord()){ 
    3382             if(($column_name == 'updated_on' || $column_name == 'updated_at') && empty($value)){ 
    3383                 return null; 
    3384             } 
    3385         }elseif(($column_name == 'created_on' || $column_name == 'created_at') && empty($value)){ 
    3386             return Ak::time(); 
    3387         }elseif($column_name == 'expires_on' || $column_name == 'expires_at'){ 
    3388             return empty($value) ? Ak::getTimestamp('9999-12-31 23:59:59') : Ak::getTimestamp($value); 
    3389         } 
    3390  
    3391         return Ak::getTimestamp($value); 
    3392     } 
    3393      
    33943279    /*/Type Casting*/ 
    3395      
    3396     /**  
     3280 
     3281    /** 
    33973282                             Optimistic Locking 
    33983283    ==================================================================== 
     
    34203305    function isLockingEnabled() 
    34213306    { 
    3422         return ((isset($this->lock_optimistically) && $this->lock_optimistically !== false) || !isset($this->lock_optimistically)) && $this->hasColumn('lock_version'); 
     3307        return (!isset($this->lock_optimistically) || $this->lock_optimistically !== false) && $this->hasColumn('lock_version'); 
    34233308    } 
    34243309    /*/Optimistic Locking*/ 
    34253310 
    34263311 
    3427     /**  
     3312    /** 
    34283313                                    Callbacks 
    34293314    ==================================================================== 
     
    35103395    * @access public 
    35113396    */ 
    3512      
     3397 
    35133398    function beforeCreate(){return true;} 
    35143399    function beforeValidation(){return true;} 
     
    35253410    function beforeDestroy(){return true;} 
    35263411    function afterSave(){return true;} 
    3527      
     3412 
    35283413    /*/Callbacks*/ 
    35293414 
    3530      
    3531     /**  
     3415 
     3416    /** 
    35323417                                    Transactions 
    35333418    ==================================================================== 
     
    35483433    *   $User->transactionComplete(); 
    35493434    */ 
    3550      
     3435 
    35513436    function transactionStart() 
    35523437    { 
    3553         if(!$this->isConnected()){ 
    3554             $this->setConnection(); 
    3555         } 
    3556         return $this->_db->StartTrans(); 
     3438        return $this->_db->startTransaction(); 
    35573439    } 
    35583440 
    35593441    function transactionComplete() 
    35603442    { 
    3561         return $this->_db->CompleteTrans(); 
     3443        return $this->_db->stopTransaction(); 
    35623444    } 
    35633445 
    35643446    function transactionFail() 
    35653447    { 
    3566         return $this->_db->FailTrans(); 
     3448        $this->_db->failTransaction(); 
     3449        return false; 
    35673450    } 
    35683451 
    35693452    function transactionHasFailed() 
    35703453    { 
    3571         return $this->_db->HasFailedTrans(); 
     3454        return $this->_db->hasTransactionFailed(); 
    35723455    } 
    35733456 
     
    35773460 
    35783461 
    3579     /**  
     3462    /** 
    35803463                                    Validators 
    35813464    ==================================================================== 
     
    38123695        switch (count($range_options)) { 
    38133696            case 0: 
    3814             trigger_error(Ak::t('Range unspecified.  Specify the "within", "maximum", "minimum, or "is" option.'), E_USER_ERROR); 
    3815             return false; 
    3816             break; 
     3697                trigger_error(Ak::t('Range unspecified.  Specify the "within", "maximum", "minimum, or "is" option.'), E_USER_ERROR); 
     3698                return false; 
     3699                break; 
    38173700            case 1: 
    3818             $options = array_merge($default_options, $options); 
    3819             break; 
     3701                $options = array_merge($default_options, $options); 
     3702                break; 
    38203703            default: 
    3821             trigger_error(Ak::t('Too many range options specified.  Choose only one.'), E_USER_ERROR); 
    3822             return false; 
    3823             break; 
     3704                trigger_error(Ak::t('Too many range options specified.  Choose only one.'), E_USER_ERROR); 
     3705                return false; 
     3706                break; 
    38243707        } 
    38253708 
     
    38283711            case 'within': 
    38293712            case 'in': 
    3830             if(empty($option_value) || !is_array($option_value) || count($option_value) != 2 || !is_numeric($option_value[0]) || !is_numeric($option_value[1])){ 
    3831                 trigger_error(Ak::t('%option must be a Range (array(min, max))',array('%option',$option)), E_USER_ERROR); 
    3832                 return false; 
    3833            
    3834             $attribute_names = is_array($attribute_names) ? $attribute_names : array($attribute_names); 
    3835             foreach ($attribute_names as $attribute_name){ 
    3836                 if((!empty($option['allow_null']) && !isset($this->$attribute_name)) || (Ak::size($this->$attribute_name)) < $option_value[0]){ 
    3837                     $this->addError($attribute_name, sprintf($options['too_short'], $option_value[0])); 
    3838                 }elseif((!empty($option['allow_null']) && !isset($this->$attribute_name)) || (Ak::size($this->$attribute_name)) > $option_value[1]){ 
    3839                     $this->addError($attribute_name, sprintf($options['too_long'], $option_value[1])); 
    3840                
    3841            
    3842             break; 
     3713                if(empty($option_value) || !is_array($option_value) || count($option_value) != 2 || !is_numeric($option_value[0]) || !is_numeric($option_value[1])){ 
     3714                    trigger_error(Ak::t('%option must be a Range (array(min, max))',array('%option',$option)), E_USER_ERROR); 
     3715                    return false; 
     3716               
     3717                $attribute_names = is_array($attribute_names) ? $attribute_names : array($attribute_names); 
     3718                foreach ($attribute_names as $attribute_name){ 
     3719                    if((!empty($option['allow_null']) && !isset($this->$attribute_name)) || (Ak::size($this->$attribute_name)) < $option_value[0]){ 
     3720                        $this->addError($attribute_name, sprintf($options['too_short'], $option_value[0])); 
     3721                    }elseif((!empty($option['allow_null']) && !isset($this->$attribute_name)) || (Ak::size($this->$attribute_name)) > $option_value[1]){ 
     3722                        $this->addError($attribute_name, sprintf($options['too_long'], $option_value[1])); 
     3723                   
     3724               
     3725                break; 
    38433726 
    38443727            case 'is': 
     
    38463729            case 'maximum': 
    38473730 
    3848             if(empty($option_value) || !is_numeric($option_value) || $option_value <= 0){ 
    3849                 trigger_error(Ak::t('%option must be a nonnegative Integer',array('%option',$option_value)), E_USER_ERROR); 
    3850                 return false; 
    3851            
    3852  
    3853             // Declare different validations per option. 
    3854             $validity_checks = array('is' => "==", 'minimum' => ">=", 'maximum' => "<="); 
    3855             $message_options = array('is' => 'wrong_length', 'minimum' => 'too_short', 'maximum' => 'too_long'); 
    3856  
    3857             $message = sprintf(!empty($options['message']) ? $options['message'] : $options[$message_options[$option]],$option_value); 
    3858  
    3859             $attribute_names = is_array($attribute_names) ? $attribute_names : array($attribute_names); 
    3860             foreach ($attribute_names as $attribute_name){ 
    3861                 if((!$options['allow_null'] && !isset($this->$attribute_name)) || 
    3862                 eval("return !(".Ak::size(@$this->$attribute_name)." {$validity_checks[$option]} $option_value);")){ 
    3863                     $this->addError($attribute_name, $message); 
    3864                
    3865            
    3866             break; 
     3731                if(empty($option_value) || !is_numeric($option_value) || $option_value <= 0){ 
     3732                    trigger_error(Ak::t('%option must be a nonnegative Integer',array('%option',$option_value)), E_USER_ERROR); 
     3733                    return false; 
     3734               
     3735 
     3736                // Declare different validations per option. 
     3737                $validity_checks = array('is' => "==", 'minimum' => ">=", 'maximum' => "<="); 
     3738                $message_options = array('is' => 'wrong_length', 'minimum' => 'too_short', 'maximum' => 'too_long'); 
     3739 
     3740                $message = sprintf(!empty($options['message']) ? $options['message'] : $options[$message_options[$option]],$option_value); 
     3741 
     3742                $attribute_names = is_array($attribute_names) ? $attribute_names : array($attribute_names); 
     3743                foreach ($attribute_names as $attribute_name){ 
     3744                    if((!$options['allow_null'] && !isset($this->$attribute_name)) || 
     3745                    eval("return !(".Ak::size(@$this->$attribute_name)." {$validity_checks[$option]} $option_value);")){ 
     3746                        $this->addError($attribute_name, $message); 
     3747                   
     3748               
     3749                break; 
    38673750            default: 
    3868             break; 
     3751                break; 
    38693752        } 
    38703753 
     
    41264009    function isValid() 
    41274010    { 
     4011        $this->clearErrors(); 
    41284012        if($this->beforeValidation() && $this->notifyObservers('beforeValidation')){ 
    41294013 
    4130             $this->clearErrors(); 
    41314014 
    41324015            if($this->_set_default_attribute_values_automatically){ 
    4133                 $this->_setDefaultAttributeValuesAutomatically(); 
     4016                //$this->_setDefaultAttributeValuesAutomatically(); 
    41344017            } 
    41354018 
     
    41374020 
    41384021            if($this->_automated_validators_enabled){ 
    4139                 $this->_runAutomatedValidators(); 
    4140             } 
     4022                //$this->_runAutomatedValidators(); 
     4023            } 
     4024 
     4025            $this->afterValidation(); 
     4026            $this->notifyObservers('afterValidation'); 
    41414027 
    41424028            if ($this->isNewRecord()){ 
     
    41444030                    $this->notifyObservers('beforeValidationOnCreate'); 
    41454031                    $this->validateOnCreate(); 
     4032                    $this->afterValidationOnCreate(); 
    41464033                    $this->notifyObservers('afterValidationOnCreate'); 
    41474034                } 
     
    41504037                    $this->notifyObservers('beforeValidationOnUpdate'); 
    41514038                    $this->validateOnUpdate(); 
     4039                    $this->afterValidationOnUpdate(); 
    41524040                    $this->notifyObservers('afterValidationOnUpdate'); 
    41534041                } 
    41544042            } 
    4155             $this->notifyObservers('afterValidation'); 
    41564043        } 
    41574044 
     
    41744061            empty($column_settings['primaryKey']) && 
    41754062            !empty($this->$column_name) && 
    4176             !empty($column_settings['maxLength']) && 
    4177             $column_settings['maxLength'] > 0 && 
     4063            !empty($column_settings['maxLength']) && $column_settings['maxLength'] > 0 && 
    41784064            strlen($this->$column_name) > $column_settings['maxLength']){ 
    41794065                $this->addError($column_name, sprintf($this->_defaultErrorMessages['too_long'], $column_settings['maxLength'])); 
     
    42304116 
    42314117 
    4232     /**  
     4118    /** 
    42334119                                  Observers 
    42344120    ==================================================================== 
    42354121    See also: Callbacks. 
    42364122    */ 
    4237      
     4123 
    42384124    /** 
    42394125    * $state store the state of this observable object 
     
    42464132    * @access private 
    42474133    */ 
    4248     function _instatiateDefaultObserver() 
     4134    function _instantiateDefaultObserver() 
    42494135    { 
    42504136        $default_observer_name = ucfirst($this->getModelName().'Observer'); 
     
    43214207        return $observers; 
    43224208    } 
    4323      
     4209 
    43244210    /*/Observers*/ 
    43254211 
     
    43274213 
    43284214 
    4329     /**  
     4215    /** 
    43304216                                    Error Handling 
    43314217    ==================================================================== 
    43324218    See also: Validators. 
    43334219    */ 
    4334      
     4220 
    43354221 
    43364222    /** 
     
    45524438        return $result; 
    45534439    } 
    4554      
     4440 
    45554441    /*/Error Handling*/ 
    4556      
    4557  
    4558  
    4559     /**  
     4442 
     4443 
     4444 
     4445    /** 
    45604446                            Act as Behaviours 
    45614447    ==================================================================== 
     
    45894475    { 
    45904476        $class_name = AkInflector::camelize($behaviour); 
    4591         return file_exists(AK_LIB_DIR.DS.'AkActiveRecord'.DS.'AkActsAs'.$class_name.'.php') && !class_exists('ActsAs'.$class_name) ?  
     4477        return file_exists(AK_LIB_DIR.DS.'AkActiveRecord'.DS.'AkActsAsBehaviours'.DS.'AkActsAs'.$class_name.'.php') && !class_exists('ActsAs'.$class_name) ? 
    45924478        'AkActsAs'.$class_name : 'ActsAs'.$class_name; 
    45934479    } 
     
    46004486        if(!class_exists($class_name)){ 
    46014487            if(substr($class_name,0,2) == 'Ak'){ 
    4602                 include_once(AK_LIB_DIR.DS.'AkActiveRecord'.DS.$class_name.'.php'); 
     4488                include_once(AK_LIB_DIR.DS.'AkActiveRecord'.DS.'AkActsAsBehaviours'.DS.$class_name.'.php'); 
    46034489            }else{ 
    46044490                include_once(AK_APP_PLUGINS_DIR.DS.AkInflector::underscore($class_name).DS.'lib'.DS.$class_name.'.php'); 
     
    46074493        if(!class_exists($class_name)){ 
    46084494            trigger_error(Ak::t('The class %class used for handling an "act_as %class" does not exist',array('%class'=>$class_name)), E_USER_ERROR); 
    4609             $false = false;  
     4495            $false = false; 
    46104496            return $false; 
    46114497        }else{ 
     
    46514537    /*/Act as Behaviours*/ 
    46524538 
    4653     /**  
     4539    /** 
    46544540                            Debugging 
    46554541    ==================================================================== 
    46564542    */ 
     4543 
    46574544     
    46584545    function dbug() 
     
    46614548            $this->setConnection(); 
    46624549        } 
    4663         $this->_db->debug = $this->_db->debug ? false : true; 
    4664         $this->db_debug =& $this->_db->debug; 
    4665     } 
    4666      
     4550        $this->_db->connection->debug = $this->_db->connection->debug ? false : true; 
     4551        $this->db_debug =& $this->_db->connection->debug; 
     4552    } 
     4553 
    46674554    function toString($print = false) 
    46684555    { 
     
    47044591        return !empty($this->_db->debug); 
    47054592    } 
    4706      
    4707      
     4593 
     4594 
    47084595 
    47094596    function debug ($data = 'active_record_class', $_functions=0) 
     
    47724659        } 
    47734660    } 
    4774      
     4661 
    47754662    /*/Debugging*/ 
    47764663 
    47774664 
    47784665 
    4779     /**  
     4666    /** 
    47804667                        Utilities 
    47814668    ==================================================================== 
     
    48414728        return Ak::toJson($this->getAttributes()); 
    48424729    } 
    4843      
    4844     function toYaml() 
    4845     { 
    4846         return Ak::convert('active_record', 'yaml', $this); 
    4847     } 
    4848      
     4730 
     4731    /** 
     4732     * converts to yaml-strings  
     4733     *  
     4734     * examples:  
     4735     * User::toYaml($users->find('all')); 
     4736     * $Bermi->toYaml(); 
     4737     * 
     4738     * @param array of ActiveRecords[optional] $data 
     4739     */ 
     4740    function toYaml($data = null) 
     4741    { 
     4742        return Ak::convert('active_record', 'yaml', empty($data) ? $this : $data); 
     4743    } 
     4744 
    48494745 
    48504746    /** 
     
    49064802    } 
    49074803    /*/Utilities*/ 
    4908      
    4909      
    4910     /**  
    4911                         Database statements 
    4912     ==================================================================== 
    4913     */ 
    4914  
    4915     /** 
    4916      * Returns a record array with the column names as keys and column values 
    4917      * as values. 
    4918      */ 
    4919     function sqlSelectOne($sql, $limit = false, $offset = false) 
    4920     { 
    4921         $result = $this->sqlSelect($sql, $limit, $offset); 
    4922         return  !is_null($result) ? array_shift($result) : null; 
    4923     } 
    4924  
    4925     /** 
    4926     * Returns a single value from a record 
    4927     */ 
    4928     function sqlSelectValue($sql, $limit = false, $offset = false) 
    4929     { 
    4930         $result = $this->sqlSelectOne($sql, $limit, $offset); 
    4931         return !is_null($result) ? array_shift($result) : null; 
    4932     } 
    4933  
    4934     /** 
    4935      * Returns an array of the values of the first column in a select: 
    4936      *   sqlSelectValues("SELECT id FROM companies LIMIT 3") => array(1,2,3) 
    4937      */ 
    4938     function sqlSelectValues($sql, $limit = false, $offset = false) 
    4939     { 
    4940         $values = array(); 
    4941         if($results = $this->sqlSelectAll($sql, $limit, $offset)){ 
    4942             foreach ($results as $result){ 
    4943                 $values[] = array_slice(array_values($result),0,1); 
    4944             } 
    4945         } 
    4946     } 
    4947  
    4948     /** 
    4949     * Returns an array of record hashes with the column names as keys and 
    4950     * column values as values. 
    4951     */ 
    4952     function sqlSelectAll($sql, $limit = false, $offset = false) 
    4953     { 
    4954         return $this->sqlSelect($sql, $limit, $offset); 
    4955     } 
    4956  
    4957     function sqlSelect($sql, $limit = false, $offset = false) 
    4958     { 
    4959         $results = array(); 
    4960         $previous_fetch_mode = $GLOBALS['ADODB_FETCH_MODE']; 
    4961         $GLOBALS['ADODB_FETCH_MODE'] = ADODB_FETCH_ASSOC; 
    4962         $ResultSet = $limit === false ? $this->_db->Execute($sql) :  $this->_db->SelectLimit($sql, $limit, empty($offset) ? 0 : $offset); 
    4963         if($ResultSet){ 
    4964             while ($record = $ResultSet->FetchRow()) { 
    4965                 $results[] = $record; 
    4966             } 
    4967         }else{ 
    4968             AK_DEBUG ? trigger_error($this->_db->ErrorMsg(), E_USER_NOTICE) : null; 
    4969         } 
    4970         $GLOBALS['ADODB_FETCH_MODE'] = $previous_fetch_mode; 
    4971         return empty($results) ? null : $results; 
    4972     } 
    4973      
     4804 
    49744805 
    49754806    function getAttributeCondition($argument) 
     
    49834814        } 
    49844815    } 
    4985     /*/Database statements*/ 
    4986  
    4987  
    4988  /**  
     4816 
     4817 
     4818    /** 
    49894819                     Calculations 
    49904820 ==================================================================== 
     
    51785008 
    51795009        $sql .= empty($options['order']) ? '' : " ORDER BY {$options['order']} "; 
     5010        $this->_db->addLimitAndOffset($sql, $options); 
    51805011        $sql .= $use_workaround ? ')' : ''; 
    51815012        return $sql; 
     
    51885019    function _executeSimpleCalculation($operation, $column_name, $column, $options) 
    51895020    { 
    5190         $value = $this->sqlSelectValue($this->_constructCalculationSql($operation, $column_name, $options), empty($options['limit']) ? false : $options['limit'], !isset($options['offset']) ? false : $options['offset']); 
     5021        $value = $this->_db->selectValue($this->_constructCalculationSql($operation, $column_name, $options)); 
    51915022        return $this->_typeCastCalculatedValue($value, $column, $operation); 
    51925023    } 
     
    51975028    function _executeGroupedCalculation($operation, $column_name, $column, $options) 
    51985029    { 
    5199         $group_attr  = $options['group']; 
    52005030        $group_field = $options['group']; 
    52015031        $group_alias = $this->_getColumnAliasFor($group_field); 
    52025032        $group_column = $this->_getColumnFor($group_field); 
    5203         $sql = $this->_constructCalculationSql($operation, $column_name, array_merge(array('group_field' => $group_field, 'group_alias' => $group_alias),$options)); 
    5204         $calculated_data = $this->sqlSelectAll($sql, empty($options['limit']) ? false : $options['limit'], !isset($options['offset']) ? false : $options['offset']); 
     5033        $options = array_merge(array('group_field' => $group_field, 'group_alias' => $group_alias),$options); 
     5034        $sql = $this->_constructCalculationSql($operation, $column_name, $options); 
     5035        $calculated_data = $this->_db->select($sql); 
    52055036        $aggregate_alias = $this->_getColumnAliasFor($operation, $column_name); 
    52065037 
     
    52235054        } 
    52245055    } 
    5225      
     5056 
    52265057    /** 
    52275058    * Converts a given key to the value that the database adapter returns as 
     
    52675098        } 
    52685099    } 
    5269      
     5100 
    52705101    /*/Calculations*/ 
    52715102 
    5272     function extractOptionsFromArgs(&$args) 
    5273     { 
    5274         $_tmp_options = !empty($args) && is_array($args) && is_array($args[count($args)]) ? array_pop($args) : array(); 
    5275         $options = array(); 
    5276         foreach (array('conditions', 'include', 'joins', 'limit', 'offset', 'order', 'bind', 'select', 'readonly') as $k){ 
    5277             if(isset($_tmp_options[$k])){ 
    5278                 $options[$k] = $_tmp_options[$k]; 
    5279             } 
    5280         } 
    5281         return $options; 
    5282     } 
    5283      
    5284      
    52855103    function hasBeenModified() 
    52865104    { 
    52875105        return Ak::objectHasBeenModified($this); 
    52885106    } 
    5289      
     5107 
    52905108    /** 
    52915109    * Just freeze the attributes hash, such that associations are still accessible even on destroyed records. 
     
    52955113    function freeze() 
    52965114    { 
    5297         $this->_freeze = true; 
     5115        return $this->_freeze = true; 
    52985116    } 
    52995117 
     
    53025120        return !empty($this->_freeze); 
    53035121    } 
    5304      
     5122 
    53055123    /** 
    53065124    * Alias for getModelName() 
     
    53105128        return $this->getModelName(); 
    53115129    } 
    5312      
     5130 
    53135131    function &objectCache() 
    53145132    { 
     
    53245142        return $cache[$args[0]]; 
    53255143    } 
    5326      
    5327      
    5328     /**  
     5144 
     5145 
     5146    /** 
    53295147                        Connection adapters 
    53305148    ==================================================================== 
     
    53395157                return $match[1]; 
    53405158            } 
     5159            // a postgre HACK; we dont know the column-type here 
     5160            if ($default=='true') { 
     5161                return true; 
     5162            } 
     5163            if ($default=='false') { 
     5164                return false; 
     5165            } 
    53415166        } 
    53425167        return $default; 
    53435168    } 
    5344      
     5169 
    53455170 
    53465171} 
  • trunk/lib/AkActiveRecord/AkAssociatedActiveRecord.php

    r408 r468  
    5151        if(empty($this->$association_type) && in_array($association_type, array('hasOne','belongsTo','hasMany','hasAndBelongsToMany'))){ 
    5252            $association_handler_class_name = 'Ak'.ucfirst($association_type); 
    53             require_once(AK_LIB_DIR.DS.'AkActiveRecord'.DS.$association_handler_class_name.'.php'); 
     53            require_once(AK_LIB_DIR.DS.'AkActiveRecord'.DS.'AkAssociations'.DS.$association_handler_class_name.'.php'); 
    5454            $this->$association_type =& new $association_handler_class_name($this); 
    5555        } 
     
    229229    } 
    230230 
    231     function &findWithAssociations($options, $limit = null, $offset = null
     231    function &findWithAssociations($options
    232232    { 
    233233        $result = false; 
     
    273273 
    274274        $sql = trim($this->constructFinderSqlWithAssociations($options)); 
    275         $sql = substr($sql, -5) == 'AND =' ? substr($sql, 0,-5) : $sql; 
    276275 
    277276        if(!empty($options['bind']) && is_array($options['bind']) && strstr($sql,'?')){ 
    278277            $sql = array_merge(array($sql),$options['bind']); 
    279278        } 
    280         $result =& $this->_findBySqlWithAssociations($sql, $limit, $offset, $options['include'], empty($options['virtual_limit']) ? false : $options['virtual_limit']); 
     279        $result =& $this->_findBySqlWithAssociations($sql, $options['include'], empty($options['virtual_limit']) ? false : $options['virtual_limit']); 
    281280 
    282281        return $result; 
     
    305304    function constructFinderSqlWithAssociations($options, $include_owner_as_selection = true) 
    306305    { 
     306        $sql = 'SELECT '; 
    307307        $selection = ''; 
    308308        if($include_owner_as_selection){ 
     
    310310                $selection .= '__owner.'.$column_name.' AS __owner_'.$column_name.', '; 
    311311            } 
    312  
    313             $sql  = 'SELECT '.trim($selection.@$options['selection'], ', ').' '. 
    314             'FROM '.$this->getTableName().' AS __owner '. 
    315             (!empty($options['joins']) ? $options['joins'].' ' : ''); 
     312            $selection .= (isset($options['selection']) ? $options['selection'].' ' : ''); 
     313            $selection = trim($selection,', ').' '; // never used by the unit tests 
    316314        }else{ 
    317             $sql  = 'SELECT '.$options['selection'].'.* '. 
    318             'FROM '.$options['selection'].' '. 
    319             (!empty($options['joins']) ? $options['joins'].' ' : ''); 
    320         } 
     315            // used only by HasOne::findAssociated 
     316            $selection .= $options['selection'].'.* '; 
     317        } 
     318        $sql .= $selection; 
     319        $sql .= 'FROM '.($include_owner_as_selection ? $this->getTableName().' AS __owner ' : $options['selection'].' '); 
     320        $sql .= (!empty($options['joins']) ? $options['joins'].' ' : ''); 
    321321 
    322322        empty($options['conditions']) ? null : $this->addConditions($sql, $options['conditions']); 
     
    327327        } 
    328328        $sql  .= !empty($options['order']) ? ' ORDER BY  '.$options['order'] : ''; 
     329 
     330        $this->_db->addLimitAndOffset($sql,$options); 
    329331        return $sql; 
    330332    } 
     
    334336     * @todo Refactor in order to increase performance of associated inclussions 
    335337     */ 
    336     function &_findBySqlWithAssociations($sql, $limit = null, $offset = null, $included_associations = array(), $virtual_limit = false) 
    337     { 
    338         if(is_array($sql)){ 
    339             $sql_query = array_shift($sql); 
    340             $bindings = is_array($sql) && count($sql) > 0 ? $sql : array($sql); 
    341             $sql = $sql_query; 
    342         } 
    343         $this->setConnection(); 
    344  
    345         AK_LOG_EVENTS ? $this->_startSqlBlockLog() : null; 
    346  
     338    function &_findBySqlWithAssociations($sql, $included_associations = array(), $virtual_limit = false) 
     339    { 
    347340        $objects = array(); 
     341        $results = $this->_db->execute ($sql,'find with associations'); 
     342        if (!$results){ 
     343            return $objects; 
     344        } 
     345         
     346        $i = 0; 
     347        $associated_ids = $this->getAssociatedIds(); 
     348        $number_of_associates = count($associated_ids); 
    348349        $_included_results = array(); // Used only in conjuntion with virtual limits for doing find('first',...include'=>... 
    349         if(is_integer($limit)){ 
    350             if(is_integer($offset)){ 
    351                 $results = !empty($bindings) ? 
    352                 $this->_db->SelectLimit($sql, $limit, $offset, $bindings) : 
    353                 $this->_db->SelectLimit($sql, $limit, $offset); 
    354             }else { 
    355                 $results = !empty($bindings) ? 
    356                 $this->_db->SelectLimit($sql, $limit, -1, $bindings) : 
    357                 $this->_db->SelectLimit($sql, $limit); 
    358             } 
    359         }else{ 
    360             $results = !empty($bindings) ? 
    361             $this->_db->Execute($sql, $bindings) : 
    362             $this->_db->Execute($sql); 
    363         } 
    364  
    365         AK_LOG_EVENTS ? $this->_endSqlBlockLog() : null; 
    366  
    367         if(!$results && AK_DEBUG){ 
    368             trigger_error($this->_db->ErrorMsg(), E_USER_NOTICE); 
    369         }else{ 
    370             $objects = array(); 
    371             $i = 0; 
    372             $associated_ids = $this->getAssociatedIds(); 
    373             $number_of_associates = count($associated_ids); 
    374             $object_associates_details = array(); 
    375  
    376             $ids = array(); 
    377             while ($record = $results->FetchRow()) { 
    378                 $this_item_attributes = array(); 
    379                 $associated_items = array(); 
    380                 foreach ($record as $column=>$value){ 
    381                     if(!is_numeric($column)){ 
    382                         if(substr($column,0,8) == '__owner_'){ 
    383                             $attribute_name = substr($column,8); 
    384                             $this_item_attributes[$attribute_name] = $value; 
    385                         }elseif(preg_match('/^_('.join('|',$associated_ids).')_(.+)/',$column, $match)){ 
    386                             $associated_items[$match[1]][$match[2]] = $value; 
    387                         } 
     350        $object_associates_details = array(); 
     351        $ids = array(); 
     352        while ($record = $results->FetchRow()) { 
     353            $this_item_attributes = array(); 
     354            $associated_items = array(); 
     355            foreach ($record as $column=>$value){ 
     356                if(!is_numeric($column)){ 
     357                    if(substr($column,0,8) == '__owner_'){ 
     358                        $attribute_name = substr($column,8); 
     359                        $this_item_attributes[$attribute_name] = $value; 
     360                    }elseif(preg_match('/^_('.join('|',$associated_ids).')_(.+)/',$column, $match)){ 
     361                        $associated_items[$match[1]][$match[2]] = $value; 
    388362                    } 
    389363                } 
    390  
    391  
    392                 // We need to keep a pointer to unique parent elements in order to add associates to the first loaded item 
    393                 $e = null; 
    394                 $object_id = $this_item_attributes[$this->getPrimaryKey()]; 
    395  
    396                 if(!empty($virtual_limit)){ 
    397                     $_included_results[$object_id] = $object_id; 
    398                     if(count($_included_results) > $virtual_limit * $number_of_associates){ 
    399                         continue; 
    400                     } 
    401                 } 
    402  
    403                 if(!isset($ids[$object_id])){ 
    404                     $ids[$object_id] = $i; 
    405                     $attributes_for_instantation = $this->getOnlyAvailableAtrributes($this_item_attributes); 
    406                     $attributes_for_instantation['load_associations'] = true; 
    407                     $objects[$i] =& $this->instantiate($attributes_for_instantation, false); 
    408                 }else{ 
    409                     $e = $i; 
    410                     $i = $ids[$object_id]; 
    411                 } 
    412  
    413                 foreach ($associated_items as $association_id=>$attributes){ 
    414                     if(count(array_diff($attributes, array(''))) > 0){ 
    415                         $object_associates_details[$i][$association_id][md5(serialize($attributes))] = $attributes; 
    416                     } 
    417                 } 
    418  
    419                 $i = !is_null($e) ? $e : $i+1; 
    420             } 
     364            } 
     365 
     366            // We need to keep a pointer to unique parent elements in order to add associates to the first loaded item 
     367            $e = null; 
     368            $object_id = $this_item_attributes[$this->getPrimaryKey()]; 
     369 
     370            if(!empty($virtual_limit)){ 
     371                $_included_results[$object_id] = $object_id; 
     372                if(count($_included_results) > $virtual_limit * $number_of_associates){ 
     373                    continue; 
     374                } 
     375            } 
     376 
     377            if(!isset($ids[$object_id])){ 
     378                $ids[$object_id] = $i; 
     379                $attributes_for_instantation = $this->getOnlyAvailableAttributes($this_item_attributes); 
     380                $attributes_for_instantation['load_associations'] = true; 
     381                $objects[$i] =& $this->instantiate($attributes_for_instantation, false); 
     382            }else{ 
     383                $e = $i; 
     384                $i = $ids[$object_id]; 
     385            } 
     386 
     387            foreach ($associated_items as $association_id=>$attributes){ 
     388                if(count(array_diff($attributes, array(''))) > 0){ 
     389                    $object_associates_details[$i][$association_id][md5(serialize($attributes))] = $attributes; 
     390                } 
     391            } 
     392 
     393            $i = !is_null($e) ? $e : $i+1; 
    421394        } 
    422395 
     
    439412        } 
    440413 
    441         if(!empty($objects)){ 
    442             $result =& $objects; 
    443         }else{ 
    444             $result = false; 
    445         } 
    446  
     414        $result =& $objects; 
    447415        return $result; 
    448416    } 
  • trunk/lib/AkActiveRecord/AkAssociation.php

    r285 r468  
    128128    { 
    129129        $this->Owner->_associationIds[$association_id]  = $associated_id; 
    130         $this->asssociated_ids[$association_id] = $associated_id; 
     130        $this->associated_ids[$association_id] = $associated_id; 
    131131    } 
    132132 
  • trunk/lib/AkActiveRecord/AkObserver.php

    r366 r468  
    9797            $target = func_get_arg($i); 
    9898            if(is_object($target)){ 
    99                 $this->observe($target); 
     99                $this->observe(&$target); 
    100100            }else{ 
    101101                $this->setObservedModels($target); 
     
    130130 
    131131        foreach ($models as $class_name) 
    132         { 
     132        {    
     133            /** 
     134            * @todo use Ak::import() instead. 
     135            */ 
    133136            $class_name = AkInflector::camelize($class_name); 
    134             include_once(AkInflector::toModelFilename($class_name)); 
    135             eval("\$model =& new $class_name();"); 
     137            if (!class_exists($class_name)){ 
     138                require_once(AkInflector::toModelFilename($class_name)); 
     139            } 
     140            $model =& new $class_name(); 
    136141            $this->observe(&$model); 
    137142        } 
  • trunk/lib/AkBaseModel.php

    r285 r468  
    145145        return $models; 
    146146    } 
    147      
    148     function _executeSql($sql, $trigger_error = true) 
    149     { 
    150         AK_LOG_EVENTS ? ($this->Logger->message($this->getModelName().' executing SQL: '.$sql)) : null; 
    151         $result = $this->_db->Execute($sql); 
    152         if(!$result && AK_DEBUG){ 
    153             AK_LOG_EVENTS ? ($this->Logger->error($this->getModelName().': '.$this->_db->ErrorMsg())) : null; 
    154             $trigger_error ? trigger_error($this->_db->ErrorMsg(), E_USER_NOTICE) : false; 
    155         } 
    156         return $result; 
    157     } 
    158      
    159     function _startSqlBlockLog() 
    160     { 
    161         $this->__original_dbug = $this->_db->debug; 
    162         $this->_db->debug = true; 
    163         ob_start(); 
    164     } 
    165      
    166     function _endSqlBlockLog() 
    167     { 
    168         $sql_debug = ob_get_clean(); 
    169         $this->Logger->message($this->Logger->formatText($this->getModelName(),'bold').' executing SQL: '. 
    170         $this->Logger->formatText(preg_replace('/^\([a-z]+\): /','',trim(Ak::html_entity_decode(strip_tags($sql_debug)),"\n- ")),'blue')); 
    171         if($this->__original_dbug){ 
    172             echo $sql_debug; 
    173         } 
    174         $this->_db->debug = $this->__original_dbug; 
    175     } 
    176147} 
    177148 
  • trunk/lib/AkCache.php

    r285 r468  
    1717 */ 
    1818 
    19 if(!defined('AK_CACHE_CLASS_INCLUDED')){ define('AK_CACHE_CLASS_INCLUDED',true); // Class overriding trick 
    2019 
    2120// ---- Required Files ---- // 
     
    8483class AkCache extends AkObject 
    8584{ 
    86     // {{{ properties 
    87  
    88  
    89     // --- Private properties --- // 
    90  
    9185 
    9286    /** 
     
    9791    */ 
    9892    var $_driverInstance = NULL; 
    99      
     93 
    10094    /** 
    10195    * Ecnables / Disables caching 
     
    10599    */ 
    106100    var $cache_enabled = true; 
    107      
    108      
    109  
    110     // }}} 
    111  
    112  
    113  
    114     // ------ CLASS METHODS ------ // 
    115  
    116  
    117  
    118  
    119     // ---- Public methods ---- // 
    120  
    121  
    122     // {{{ init() 
     101 
    123102 
    124103    /** 
     
    176155        switch ($cache_type) { 
    177156            case 1: 
    178             $this->cache_enabled = true; 
    179             if(!class_exists('Cache_Lite')){ 
    180                 require_once(AK_CONTRIB_DIR.'/pear/Cache_Lite/Lite.php'); 
    181            
    182             if(!isset($options['cacheDir'])){ 
    183                 $options['cacheDir'] = AK_CACHE_DIR.DS; 
    184            
    185             $this->_driverInstance =& new Cache_Lite($options); 
    186             break; 
     157                $this->cache_enabled = true; 
     158                if(!class_exists('Cache_Lite')){ 
     159                    require_once(AK_CONTRIB_DIR.'/pear/Cache_Lite/Lite.php'); 
     160               
     161                if(!isset($options['cacheDir'])){ 
     162                    $options['cacheDir'] = AK_CACHE_DIR.DS; 
     163               
     164                $this->_driverInstance =& new Cache_Lite($options); 
     165                break; 
    187166            case 2: 
    188             $this->cache_enabled = true; 
    189             require_once(AK_LIB_DIR.'/AkCache/AkAdodbCache.php'); 
    190             $this->_driverInstance =& new AkAdodbCache(); 
    191             $this->_driverInstance->init($options); 
    192             break; 
     167                $this->cache_enabled = true; 
     168                require_once(AK_LIB_DIR.'/AkCache/AkAdodbCache.php'); 
     169                $this->_driverInstance =& new AkAdodbCache(); 
     170                $this->_driverInstance->init($options); 
     171                break; 
    193172            default: 
    194             $this->cache_enabled = false; 
    195             break; 
     173                $this->cache_enabled = false; 
     174                break; 
    196175        } 
    197176    } 
    198177 
    199     // }}} 
    200     // {{{ get() 
    201178 
    202179    /** 
     
    213190    } 
    214191 
    215     // }}} 
    216     // {{{ save() 
    217192 
    218193    /** 
     
    230205    } 
    231206 
    232     // }}} 
    233     // {{{ remove() 
    234207 
    235208    /** 
     
    246219    } 
    247220 
    248     // }}} 
    249     // {{{ clean() 
    250221 
    251222    /** 
     
    273244    } 
    274245 
    275     // }}} 
    276  
    277246 
    278247} 
    279248 
    280 }// End of if(!defined('AK_CACHE_CLASS_INCLUDED')){ 
    281  
    282249?> 
  • trunk/lib/AkCache/AkAdodbCache.php

    r285 r468  
    1818 
    1919 
    20 if(!defined('AK_ADODBCACHE_CLASS_INCLUDED')){ define('AK_ADODBCACHE_CLASS_INCLUDED',true); // Class overriding trick 
    21  
    22 // ---- Required Files ---- // 
    2320require_once(AK_LIB_DIR.'/Ak.php'); 
    2421 
     
    3330class AkAdodbCache 
    3431{ 
    35     // {{{ properties 
    36  
    37  
    38     // --- Private properties --- // 
    39  
    4032 
    4133    /** 
     
    9789    */ 
    9890    var $_automaticSerialization = false; 
    99  
    100     // }}} 
    101  
    102  
    103  
    104     // ------ CLASS METHODS ------ // 
    105  
    106  
    107  
    108     // ---- Setters ---- // 
    109  
    110  
    111     // {{{ setDb() 
    11291 
    11392    /** 
     
    128107    } 
    129108 
    130     // }}} 
    131     // {{{ setRefreshTime() 
    132  
    133109    /** 
    134110    * $this->_refreshTime setter 
     
    147123    } 
    148124 
    149     // }}} 
    150     // {{{ setLifeTime() 
    151  
    152125    /** 
    153126    * $this->_lifeTime setter 
     
    166139    } 
    167140 
    168     // }}} 
    169     // {{{ setMemoryCaching() 
    170  
    171141    /** 
    172142    * $this->_memoryCaching setter 
     
    187157    } 
    188158 
    189     // }}} 
    190     // {{{ setAutomaticSerialization() 
    191  
    192159    /** 
    193160    * $this->_automaticSerialization setter 
     
    205172 
    206173    } 
    207  
    208     // }}} 
    209  
    210  
    211     // ---- Public methods ---- // 
    212  
    213  
    214     // {{{ init() 
    215174 
    216175    /** 
     
    243202    } 
    244203 
    245     // }}} 
    246     // {{{ get() 
    247  
    248204    /** 
    249205    * Test if a cache is available and (if yes) return it 
     
    264220        } 
    265221 
    266         $query_result = $this->_db->Execute(' 
     222        $query_result = $this->_db->selectValue(' 
    267223            SELECT cache_data  
    268224            FROM cache  
    269             WHERE id = '.$this->_db->qstr($cache_hash).'  
    270             AND cache_group = '.$this->_db->qstr($this->_group).'  
    271             AND expire > '.$this->_db->DBTimeStamp($this->_refreshTime) 
    272         ); 
    273          
    274         if(!$query_result && AK_DEBUG){ 
    275             trigger_error($this->_db->ErrorMsg(), E_USER_NOTICE); 
    276         }else{ 
    277  
    278             $data = $this->_db->BlobDecode($query_result->fields[0]); 
     225            WHERE id = '.$this->_db->quote_string($cache_hash).'  
     226            AND cache_group = '.$this->_db->quote_string($this->_group).'  
     227            AND expire > '.$this->_db->quote_datetime($this->_refreshTime) 
     228            ); 
     229            if (!$query_result) return false; 
     230 
     231            $data = $this->_db->unescape_blob($query_result); 
    279232 
    280233            if($this->_automaticSerialization == true){ 
     
    287240 
    288241            return $data; 
    289         } 
    290  
    291         return false; 
    292     } 
    293  
    294  
    295     // }}} 
    296     // {{{ save() 
     242    } 
    297243 
    298244    /** 
     
    318264        } 
    319265 
    320         $ret = $this->_db->Replace( 
     266        // TODO replace with AkDbAdapter statement 
     267        $ret = $this->_db->connection->Replace( 
    321268        'cache', array( 
    322         'id'=>$this->_db->qstr($cache_hash), 
    323         'cache_data'=>$this->_db->qstr($this->_db->BlobEncode($data)), 
    324         'cache_group'=>$this->_db->qstr($this->_group), 
    325         'expire'=>$this->_db->DBTimeStamp(time() + $this->_lifeTime)), 
     269        'id'=>$this->_db->quote_string($cache_hash), 
     270        'cache_data'=>$this->_db->quote_string($this->_db->escape_blob($data)), 
     271        'cache_group'=>$this->_db->quote_string($this->_group), 
     272        'expire'=>$this->_db->quote_datetime(time() + $this->_lifeTime)), 
    326273        'id'); 
    327274 
     
    336283    } 
    337284 
    338     // }}} 
    339     // {{{ remove() 
    340  
    341285    /** 
    342286    * Remove a cache item from the database 
     
    354298            unset($this->_memoryCachingArray[$cache_hash]); 
    355299        } 
    356         if(!$this->_db->Execute('DELETE FROM cache WHERE id = '.$this->_db->qstr($cache_hash)) && AK_DEBUG){ 
    357             trigger_error($this->_db->ErrorMsg(), E_USER_NOTICE); 
    358         } 
    359         return (bool)$this->_db->Affected_Rows(); 
    360     } 
    361  
    362     // }}} 
    363     // {{{ clean() 
     300        return (bool)$this->_db->delete('DELETE FROM cache WHERE id = '.$this->_db->quote_string($cache_hash)); 
     301    } 
    364302 
    365303    /** 
     
    385323        switch ($mode) { 
    386324            case 'ingroup': 
    387             if(!$this->_db->Execute('DELETE FROM cache WHERE cache_group = '.$this->_db->qstr($group)) && AK_DEBUG){ 
    388                 trigger_error($this->_db->ErrorMsg(), E_USER_NOTICE); 
    389             } 
    390             return (bool)$this->_db->Affected_Rows(); 
     325                return (bool)$this->_db->delete('DELETE FROM cache WHERE cache_group = '.$this->_db->quote_string($group)); 
    391326            case 'notingroup': 
    392  
    393             if(!$this->_db->Execute('DELETE FROM cache WHERE cache_group NOT LIKE '.$this->_db->qstr($group)) && AK_DEBUG){ 
    394                 trigger_error($this->_db->ErrorMsg(), E_USER_NOTICE); 
    395             } 
    396             return (bool)$this->_db->Affected_Rows(); 
     327                return (bool)$this->_db->delete('DELETE FROM cache WHERE cache_group NOT LIKE '.$this->_db->quote_string($group)); 
    397328            case 'old': 
    398  
    399             if(!$this->_db->Execute('DELETE FROM cache WHERE expire < '.$this->_db->DBTimeStamp(time())) && AK_DEBUG){ 
    400                 trigger_error($this->_db->ErrorMsg(), E_USER_NOTICE); 
    401             } 
    402             return (bool)$this->_db->Affected_Rows(); 
     329                return (bool)$this->_db->delete('DELETE FROM cache WHERE expire < '.$this->_db->quote_datetime(time())); 
    403330            default: 
    404             return true; 
    405         } 
    406     } 
    407  
    408     // }}} 
     331                return true; 
     332        } 
     333    } 
    409334 
    410335} 
    411336 
    412 }// End of if(!defined('AK_ADODBCACHE_CLASS_INCLUDED')){ 
    413337 
    414338?> 
  • trunk/lib/AkDbSession.php

    r285 r468  
    5656class AkDbSession extends AkObject 
    5757{ 
    58     // {{{ properties 
    59  
    60  
    61     // --- Public properties --- // 
    62  
    63  
    6458    /** 
    6559    * Secconds for the session to expire. 
     
    7064    */ 
    7165    var $sessionLife = AK_SESSION_EXPIRE; 
    72  
    73  
    74     // --- Protected properties --- // 
    75  
    7666 
    7767    /** 
     
    8575    var $_db; 
    8676 
    87     // }}} 
    88  
    89  
    9077    /** 
    9178    * Original session value for avoiding hitting the database in case nothing has changed 
     
    9582    */ 
    9683    var $_original_sess_value = ''; 
    97  
    98     // }}} 
    99  
    100  
    101     // ------ CLASS METHODS ------ // 
    102  
    103  
    104  
    105     // ---- Setters ---- // 
    106  
    107  
    108     // {{{ setSessionLife() 
    10984 
    11085    /** 
     
    125100    } 
    126101 
    127     // }}} 
    128  
    129  
    130102    // ---- Protected methods ---- // 
    131  
    132  
    133     // {{{ _open() 
    134103 
    135104    /** 
     
    144113        return true; 
    145114    } 
    146  
    147     // }}} 
    148     // {{{ _close() 
    149115 
    150116    /** 
     
    164130    } 
    165131 
    166     // }}} 
    167     // {{{ _read() 
    168  
    169132    /** 
    170133    * Session read handler 
     
    176139    function _read($id) 
    177140    { 
    178         $query_result = $this->_db->Execute("SELECT value FROM sessions WHERE id = ".$this->_db->qstr($id)); 
    179         if(!$query_result && AK_DEBUG){ 
    180             trigger_error($this->_db->ErrorMsg(), E_USER_NOTICE); 
    181         }else{ 
    182             $this->_original_sess_value = (string)$query_result->fields[0]; 
    183             return $this->_original_sess_value; 
    184         } 
    185         return ''; 
     141        $result = $this->_db->selectValue("SELECT value FROM sessions WHERE id = ".$this->_db->quote_string($id)); 
     142        return is_null($result) ? '' : (string)$result; 
    186143    } 
    187  
    188     // }}} 
    189     // {{{ _write() 
    190144 
    191145    /** 
     
    201155        // We don't want to hit the db if nothing has changed 
    202156        if($this->_original_sess_value != $data){ 
    203             $ret = $this->_db->Replace('sessions', array('id'=>$this->_db->qstr($id),'expire'=>$this->_db->DBTimeStamp(time()),'value'=>$this->_db->qstr($data)), 'id'); 
     157            /** 
     158            * @todo replace with dbAdapter-method 
     159            */ 
     160            $ret = $this->_db->connection->Replace('sessions', array('id'=>$this->_db->quote_string($id),'expire'=>$this->_db->quote_datetime(time()),'value'=>$this->_db->quote_string($data)), 'id'); 
    204161            if($ret == 0){ 
    205162                return false; 
     
    212169    } 
    213170 
    214     // }}} 
    215     // {{{ _destroy() 
    216  
    217171    /** 
    218172    * Session destroy handler 
     
    224178    function _destroy($id) 
    225179    { 
    226         if(!$this->_db->Execute('DELETE FROM sessions WHERE id = '.$this->_db->qstr($id)) && AK_DEBUG){ 
    227             trigger_error($this->_db->ErrorMsg(), E_USER_NOTICE); 
     180        return (bool)$this->_db->delete('DELETE FROM sessions WHERE id = '.$this->_db->quote_string($id)); 
    228181        } 
    229         return (bool)@$this->_db->Affected_Rows(); 
    230     } 
    231  
    232     // }}} 
    233     // {{{ _gc() 
    234182 
    235183    /** 
     
    241189    function _gc() 
    242190    { 
    243         if(!$this->_db->Execute('DELETE FROM sessions WHERE expire < '.$this->_db->DBTimeStamp(time()-$this->sessionLife)) && AK_DEBUG){ 
    244             trigger_error($this->_db->ErrorMsg(), E_USER_NOTICE); 
     191        return (bool)$this->_db->delete('DELETE FROM sessions WHERE expire < '.$this->_db->quote_datetime(time()-$this->sessionLife)); 
    245192        } 
    246         return (bool)$this->_db->Affected_Rows(); 
    247     } 
    248  
    249     // }}} 
    250193 
    251194 
  • trunk/lib/AkInstaller.php

    r423 r468  
    2525@ini_set('memory_limit', -1); 
    2626 
     27/** 
     28 *  
     29 * == Column Types == 
     30 *  
     31 * Akelos natively supports the following column data types. 
     32 *  
     33 * integer|int, float, decimal,  
     34 * string, text, 
     35 * datetime|timestamp, date, 
     36 * binary, 
     37 * boolean 
     38 *  
     39 * Caution: Because boolean is virtual tinyint on mysql, you can't use tinyint for other things!  
     40 *  
     41 *   
     42 * == Default settings for columns == 
     43 *  
     44 * AkInstaller suggests some default values for the column-details. 
     45 *  
     46 * So 
     47 * <code> 
     48 *     $this->createTable('Post','title,body,created_at,is_draft'); 
     49 * </code> 
     50 *  
     51 * will actually create something like this:  
     52 *  
     53 *     title => string(255), body => text, created_at => datetime, is_draft => boolean not null default 0 index 
     54 *    
     55 *  
     56 * column_name                    | default setting 
     57 * -------------------------------+-------------------------------------------- 
     58 * id                             | integer not null auto_increment primary_key 
     59 * *_id,*_by                      | integer index 
     60 * description,content,body       | text 
     61 * position                       | integer index 
     62 * *_count                        | integer default 0 
     63 * lock_version                   | integer default 1 
     64 * *_at                           | datetime 
     65 * *_on                           | date 
     66 * is_*,has_*,do_*,does_*,are_*   | boolean not null default 0 index 
     67 * *somename                      | multilingual column => en_somename, es_somename 
     68 * default                        | string 
     69 *  
     70 */ 
    2771class AkInstaller 
    2872{ 
    2973    var $db; 
    3074    var $data_dictionary; 
    31     var $debug = false; 
    3275    var $available_tables = array(); 
    3376    var $vervose = true; 
     
    3881    { 
    3982        if(empty($db_connection)){ 
    40             $this->db =& Ak::db(); 
     83            $this->db =& AkDbAdapter::getInstance(); 
    4184        }else { 
    4285            $this->db =& $db_connection; 
    4386        } 
    4487 
     88        $this->data_dictionary =& $this->db->getDictionary(); 
    4589        $this->available_tables = $this->getAvailableTables(); 
    46  
    47         $this->db->debug =& $this->debug; 
    48  
    49         $this->data_dictionary = NewDataDictionary($this->db); 
    5090    } 
    5191 
     
    61101    } 
    62102 
    63  
    64103    function uninstall($version = null, $options = array()) 
    65104    { 
     
    72111        return $this->_upgradeOrDowngrade('down', $version, $options); 
    73112    } 
    74  
    75113 
    76114    function _upgradeOrDowngrade($action, $version = null, $options = array()) 
     
    79117            $this->vervose = false; 
    80118        }elseif(!empty($this->vervose) && AK_ENVIRONMENT == 'development'){ 
    81             $this->db->debug = true
     119            $this->debug(true)
    82120        } 
    83121 
     
    101139 
    102140            if($current_version == 0){ 
    103                return true; 
     141                return true; 
    104142            }elseif($current_version < $version){ 
    105143                echo Ak::t("You can't downgrade to version %version, when you just have installed version %current_version", array('%version'=>$version,'%current_version'=>$current_version)); 
     
    130168    } 
    131169 
    132  
    133170    function installVersion($version, $options = array()) 
    134171    { 
     
    170207    } 
    171208 
    172  
    173209    function _versionPath($options = array()) 
    174210    { 
     
    181217    { 
    182218        $version_file = $this->_versionPath($options); 
    183          
     219 
    184220        if(!is_file($version_file)){ 
    185221            $this->setInstalledVersion(0, $options); 
     
    235271    function renameColumn($table_name, $old_column_name, $new_column_name) 
    236272    { 
    237         if(!strstr($this->db->databaseType,'mysql')){ 
    238             trigger_error(Ak::t('Column renaming is only supported when using MySQL databases'), E_USER_ERROR); 
    239         } 
    240         return $this->data_dictionary->ExecuteSQLArray($this->data_dictionary->RenameColumnSQL($table_name, $old_column_name, $new_column_name)); 
     273        return $this->db->renameColumn($table_name,$old_column_name,$new_column_name); 
    241274    } 
    242275 
     
    248281            return false; 
    249282        } 
    250         $this->timestamps = (!isset($table_options['timestamp']) || (isset($table_options['timestamp']) && $table_options['timestamp'])) &&  
    251                             (!strstr($column_options, 'created') && !strstr($column_options, 'updated')); 
     283        $this->timestamps = (!isset($table_options['timestamp']) || (isset($table_options['timestamp']) && $table_options['timestamp'])) && 
     284        (!strstr($column_options, 'created') && !strstr($column_options, 'updated')); 
    252285        return $this->_createOrModifyTable($table_name, $column_options, $table_options); 
    253286    } 
     
    263296 
    264297        $column_options = is_string($column_options) ? array('columns'=>$column_options) : $column_options; 
    265          
     298 
    266299        $default_column_options = array( 
    267300        'sequence_table' => false 
     
    276309 
    277310        $column_string = $this->_getColumnsAsAdodbDataDictionaryString($column_options['columns']); 
    278          
    279         $result = $this->data_dictionary->ExecuteSQLArray($this->data_dictionary->ChangeTableSQL($table_name, str_replace(array(' UNIQUE', ' INDEX', ' FULLTEXT', ' HASH'), '', $column_string), $table_options)); 
     311 
     312        $create_or_alter_table_sql = $this->data_dictionary->ChangeTableSQL($table_name, str_replace(array(' UNIQUE', ' INDEX', ' FULLTEXT', ' HASH'), '', $column_string), $table_options); 
     313        $result = $this->data_dictionary->ExecuteSQLArray($create_or_alter_table_sql, false); 
    280314 
    281315        if($result){ 
    282316            $this->available_tables[] = $table_name; 
     317        }else{ 
     318            trigger_error(Ak::t("Could not create or alter table %name using the SQL \n--------\n%sql\n--------\n", array('%name'=>$table_name, '%sql'=>$create_or_alter_table_sql[0])), E_USER_ERROR); 
    283319        } 
    284320 
     
    302338    function dropTable($table_name, $options = array()) 
    303339    { 
    304         $result = $this->tableExists($table_name) ? $this->db->Execute('DROP TABLE '.$table_name) : true; 
     340        $result = $this->tableExists($table_name) ? $this->db->execute('DROP TABLE '.$table_name) : true; 
    305341        if($result){ 
    306342            unset($this->available_tables[array_search($table_name, $this->available_tables)]); 
     
    337373    function removeIndex($table_name, $columns_or_index_name) 
    338374    { 
    339         if(!$this->tableExists($table_name)) return false; 
    340         $available_indexes =& $this->db->MetaIndexes($table_name); 
     375        if(!$this->tableExists($table_name)){ 
     376            return false; 
     377        } 
     378        $available_indexes = $this->db->getIndexes($table_name); 
    341379        $index_name = isset($available_indexes[$columns_or_index_name]) ? $columns_or_index_name : 'idx_'.$table_name.'_'.$columns_or_index_name; 
    342380        if(!isset($available_indexes[$index_name])){ 
     
    354392    function createSequence($table_name) 
    355393    { 
    356         $result = $this->tableExists('seq_'.$table_name) ? false : $this->db->CreateSequence('seq_'.$table_name); 
     394        $result = $this->tableExists('seq_'.$table_name) ? false : $this->db->connection->CreateSequence('seq_'.$table_name); 
    357395        $this->available_tables[] = 'seq_'.$table_name; 
    358396        return $result; 
     
    361399    function dropSequence($table_name) 
    362400    { 
    363         $result = $this->tableExists('seq_'.$table_name) ? $this->db->DropSequence('seq_'.$table_name) : true; 
     401        $result = $this->tableExists('seq_'.$table_name) ? $this->db->connection->DropSequence('seq_'.$table_name) : true; 
    364402        if($result){ 
    365403            unset($this->available_tables[array_search('seq_'.$table_name, $this->available_tables)]); 
     
    372410    { 
    373411        if(empty($this->available_tables)){ 
    374             $this->available_tables = array_diff((array)$this->db->MetaTables(), array('')); 
     412            $this->available_tables = $this->db->availableTables(); 
    375413        } 
    376414        return $this->available_tables; 
     
    390428        '/ ((limit|max|length) ?= ?)([0-9]+)([ \n\r,]+)/'=> ' (\3) ', 
    391429        '/([ \n\r,]+)default([ =]+)([^\'^,^\n]+)/i'=> ' DEFAULT \'\3\'', 
    392         '/([ \n\r,]+)(integer|int)([( \n\r,]*)/'=> '\1 I \3', 
     430        '/([ \n\r,]+)(integer|int)([( \n\r,]+)/'=> '\1 I \3', 
    393431        '/([ \n\r,]+)float([( \n\r,]+)/'=> '\1 F \2', 
    394         '/([ \n\r,]+)datetime([( \n\r,]*)/'=> '\1 T \2', 
    395         '/([ \n\r,]+)date([( \n\r,]*)/'=> '\1 D \2', 
    396         '/([ \n\r,]+)timestamp([( \n\r,]*)/'=> '\1 T \2', 
    397         '/([ \n\r,]+)time([( \n\r,]*)/'=> '\1 T \2', 
    398         '/([ \n\r,]+)text([( \n\r,]*)/'=> '\1 XL \2', 
    399         '/([ \n\r,]+)string([( \n\r,]*)/'=> '\1 C \2', 
    400         '/([ \n\r,]+)binary([( \n\r,]*)/'=> '\1 B \2', 
    401         '/([ \n\r,]+)boolean([( \n\r,]*)/'=> '\1 L(1) \2', 
     432        '/([ \n\r,]+)decimal([( \n\r,]+)/'=> '\1 N \2', 
     433        '/([ \n\r,]+)datetime([( \n\r,]+)/'=> '\1 T \2', 
     434        '/([ \n\r,]+)date([( \n\r,]+)/'=> '\1 D \2', 
     435        '/([ \n\r,]+)timestamp([( \n\r,]+)/'=> '\1 T \2', 
     436        '/([ \n\r,]+)time([( \n\r,]+)/'=> '\1 T \2', 
     437        '/([ \n\r,]+)text([( \n\r,]+)/'=> '\1 XL \2', 
     438        '/([ \n\r,]+)string([( \n\r,]+)/'=> '\1 C \2', 
     439        '/([ \n\r,]+)binary([( \n\r,]+)/'=> '\1 B \2', 
     440        '/([ \n\r,]+)boolean([( \n\r,]+)/'=> '\1 L'.($this->db->type()=='mysql'?'(1)':'').' \2', 
    402441        '/ NOT( |_)?NULL/i'=> ' NOTNULL', 
    403442        '/ AUTO( |_)?INCREMENT/i'=> ' AUTO ', 
     
    462501        '/^\*(.*)$/i' => array(&$this,'_castToMultilingualColumn'), 
    463502        '/^(description|content|body)$/i' => '\1 text', 
     503        '/^(lock_version)$/i' => '\1 integer default \'1\'', 
     504        '/^(.+_count)$/i' => '\1 integer default \'0\'', 
    464505        '/^(id)$/i' => 'id integer not null auto_increment primary_key', 
    465506        '/^(.+)_(id|by)$/i' => '\1_\2 integer index', 
     
    506547    function _requiresSequenceTable($column_string) 
    507548    { 
    508         if(preg_match('/mysql|postgres/', $this->db->databaseType)){ 
     549        if(in_array($this->db->type(),array('mysql','postgre'))){ 
    509550            return false; 
    510551        } 
     
    538579    function transactionStart() 
    539580    { 
    540         return $this->db->StartTrans(); 
     581        return $this->db->startTransaction(); 
    541582    } 
    542583 
    543584    function transactionComplete() 
    544585    { 
    545         return $this->db->CompleteTrans(); 
     586        return $this->db->stopTransaction(); 
    546587    } 
    547588 
    548589    function transactionFail() 
    549590    { 
    550         return $this->db->FailTrans(); 
     591        return $this->db->failTransaction(); 
    551592    } 
    552593 
    553594    function transactionHasFailed() 
    554595    { 
    555         return $this->db->HasFailedTrans(); 
     596        return $this->db->hasTransactionFailed(); 
    556597    } 
    557598 
     
    623664    function execute($sql) 
    624665    { 
    625         return $this->db->Execute($sql); 
    626     } 
    627  
     666        return $this->db->execute($sql); 
     667    } 
     668 
     669    function debug($toggle = null) 
     670    { 
     671        $this->db->connection->debug = $toggle === null ? !$this->db->connection->debug : $toggle; 
     672    } 
    628673 
    629674    function usage() 
  • trunk/lib/AkLogger.php

    r285 r468  
    165165        $message = $this->_getLogFormatedAsRawText($type, $error_mode, $error_message); 
    166166        $sql = 'INSERT INTO log (user_id, type, message, severity, location, hostname, created) '. 
    167         " VALUES (0, ".$db->qstr($type).", ".$db->qstr($message).', '.($this->mode & AK_MODE_DIE ? 100 : 0).', '. 
    168         $db->qstr(AK_CURRENT_URL).', '.$db->qstr($_SERVER['REMOTE_ADDR']).', '.$db->qstr(Ak::getTimestamp()).');'; 
    169         if ($db->Execute($sql) === false) { 
     167        " VALUES (0, ".$db->quote_string($type).", ".$db->quote_string($message).', '.($this->mode & AK_MODE_DIE ? 100 : 0).', '. 
     168        $db->quote_string(AK_CURRENT_URL).', '.$db->quote_string($_SERVER['REMOTE_ADDR']).', '.$db->quote_string(Ak::getTimestamp()).');'; 
     169        if ($db->execute($sql) === false) { 
    170170            die($this->internalError($this->t('Error inserting: ').$db->ErrorMsg(),__FILE__,__LINE__)); 
    171171        } 
  • trunk/lib/AkPlugin/AkPluginManager.php

    r393 r468  
    244244    { 
    245245        $options = array( 
    246         'externals' => true, 
    247         'checkout' => tru
     246        'externals' => false, 
     247        'checkout' => fals
    248248        ); 
    249249 
  • trunk/lib/AkRequest.php

    r412 r468  
    813813    function _connectToDatabase() 
    814814    { 
    815         global $dsn; 
    816815        if(AK_AUTOMATIC_DB_CONNECTION){ 
    817             if(!empty($dsn)){ 
    818                 Ak::db($dsn); 
    819             } 
     816            Ak::db(AK_DEFAULT_DATABASE_PROFILE); 
    820817        } 
    821818    } 
  • trunk/lib/AkUnitTest.php

    r420 r468  
    3232    var $insert_models_data = false; 
    3333    var $instantiate_models = false; 
    34      
     34 
    3535    function resetFrameworkDatabaseTables() 
    3636    { 
     
    4444    } 
    4545 
     46    /** 
     47     * Re-installs the table for a given Modelname and includes or even instantiates the Model. 
     48     * Looks in test/fixtures/app/models for the models and in test/fixtures/app/installers for the appropriate installers. 
     49     * If no class-file for Model is found, it generates a dumb one temporarily. 
     50     * For quick and dirty guys, the table can be generated on the fly. see below. 
     51     *   
     52     * examples: 
     53     * installAndIncludeModels('Article'); 
     54     * installAndIncludeModels(array('Article','Comment'=>'id,body')); 
     55     * 
     56     * @param mixed $models 
     57     */ 
    4658    function installAndIncludeModels($models = array()) 
    4759    { 
    4860        $args = func_get_args(); 
    49         $models = !empty($args) ? (is_array($args[0]) ? $args[0] : (count($args) > 1 ? $args : Ak::toArray($args[0]))) : array()
     61        $last_arg = count($args)-1
    5062 
     63        if (isset($args[$last_arg]) && is_array($args[$last_arg]) && (isset($args[$last_arg]['instantiate']) || isset($args[$last_arg]['populate']))){ 
     64            $options = array_pop($args); 
     65        } else $options = array(); 
    5166        $default_options = array('instantiate' => true); 
    52         $options = is_array($models[count($models)-1]) ? array_pop($models) : array(); 
    5367        $options = array_merge($default_options, $options); 
    5468 
    55         foreach ($models as $model){ 
    56             require_once(AK_APP_DIR.DS.'installers'.DS.(empty($this->module)?'':$this->module.DS).AkInflector::underscore($model).'_installer.php'); 
    57             require_once(AK_MODELS_DIR.DS.AkInflector::underscore($model).'.php'); 
    58             $installer_name = $model.'Installer'; 
    59             $installer = new $installer_name()
    60             $installer->uninstall(); 
    61             $installer->install(); 
     69        $models = !empty($args) ? (is_array($args[0]) ? array_shift($args) : (count($args) > 1 ? $args : Ak::toArray($args[0]))) : array(); 
     70 
     71        foreach ($models as $key=>$value){                               // handle array('Tag','Article')   <= array 
     72            $model = is_numeric($key) ? $value : $key;                   //  or    array('Tag'=>'id,name'); <= a hash! 
     73            $table_definition = is_numeric($key) ? '' : $value
     74            $this->_reinstallModel($model, $table_definition); 
     75            $this->_includeOrGenerateModel($model); 
    6276            if($this->insert_models_data || !empty($options['populate'])){ 
    6377                $this->populateTables(AkInflector::tableize($model)); 
     
    7084            unset($_SESSION['__activeRecordColumnsSettingsCache']); 
    7185        } 
     86    } 
     87 
     88    function _reinstallModel($model, $table_definition = '') 
     89    { 
     90        if (file_exists(AK_APP_DIR.DS.'installers'.DS.AkInflector::underscore($model).'_installer.php')){ 
     91            require_once(AK_APP_DIR.DS.'installers'.DS.AkInflector::underscore($model).'_installer.php'); 
     92            $installer_name = $model.'Installer'; 
     93            $installer = new $installer_name(); 
     94            $installer->uninstall(); 
     95            $installer->install(); 
     96        }else{ 
     97            $table_name = AkInflector::tableize($model); 
     98            if (empty($table_definition)) { 
     99                trigger_error(Ak::t('Could not install the table %tablename for the model %modelname',array('%tablename'=>$table_name, '%modelname'=>$model)),E_USER_ERROR); 
     100                return false; 
     101            } 
     102            $installer =& new AkInstaller(); 
     103            $installer->dropTable($table_name,array('sequence'=>true)); 
     104            $installer->createTable($table_name,$table_definition,array('timestamp'=>false)); 
     105        } 
     106    } 
     107 
     108    function _includeOrGenerateModel($model_name) 
     109    { 
     110        if (file_exists(AK_MODELS_DIR.DS.AkInflector::underscore($model_name).'.php')){ 
     111            require_once(AK_MODELS_DIR.DS.AkInflector::underscore($model_name).'.php'); 
     112        } else { 
     113            if (class_exists($model_name)){ 
     114                return true; 
     115            } 
     116            $model_source_code = "class ".$model_name." extends ActiveRecord { "; 
     117            if (!AK_PHP5) $model_source_code .= $this->__fix_for_PHP4($model_name); 
     118            $model_source_code .= "}"; 
     119            $has_errors = @eval($model_source_code) === false; 
     120            if ($has_errors) trigger_error(Ak::t('Could not declare the model %modelname.',array('%modelname'=>$model_name)),E_USER_ERROR); 
     121        } 
     122    } 
     123 
     124    function __fix_for_PHP4($model_name) 
     125    { 
     126        $table_name = AkInflector::tableize($model_name); 
     127        return "function $model_name() 
     128    { 
     129        \$this->setModelName('$model_name'); 
     130        \$attributes = (array)func_get_args(); 
     131        \$this->setTableName('$table_name'); 
     132        \$this->init(\$attributes); 
     133    }"; 
     134 
    72135    } 
    73136 
     
    88151                } 
    89152            } 
    90  
    91153        } 
    92154    } 
     
    94156    function instantiateModel($model_name) 
    95157    { 
    96         if(empty($this->$model_name)){ 
    97             Ak::import($model_name); 
    98             if(class_exists($model_name)){ 
    99                 $this->$model_name =& new $model_name(); 
    100             } 
     158        if(class_exists($model_name) || Ak::import($model_name)){ 
     159            $this->$model_name =& new $model_name(); 
     160        } else { 
     161            trigger_error(Ak::t('Could not instantiate %modelname',array('%modelname'=>$model_name)),E_USER_ERROR); 
    101162        } 
    102163        return !empty($this->$model_name) && is_object($this->$model_name) && strtolower(get_class($this->$model_name)) == strtolower($model_name); 
  • trunk/lib/constants.php

    r403 r468  
    2121// edit the files config/testing.php, config/development.php, config/production.php 
    2222if(AK_ENVIRONMENT != 'setup'){         
    23     $akdb = $database_settings[strtolower(AK_ENVIRONMENT)]; 
    24     $akdb['options'] = empty($akdb['options']) && !empty($akdb['socket']) ? 'socket='.urlencode($akdb['socket']) : $akdb['options']; 
    25     $dsn = $akdb['type'] == 'sqlite' ? 
    26     'sqlite://'.urlencode($akdb['database_file']).'/?persist' : 
    27     $akdb['type'].'://'.$akdb['user'].':'.$akdb['password'].'@'.$akdb['host']. 
    28     (empty($akdb['port'])?'':':'.$akdb['port']). 
    29     '/'.$akdb['database_name']. 
    30     (!empty($akdb['options'])?'?'.$akdb['options']:''); 
    31      
    3223    require_once(AK_CONFIG_DIR.DS.'environments'.DS.AK_ENVIRONMENT.'.php'); 
    3324} 
    3425 
    35 unset($environment, $database_settings, $akdb); 
    36  
     26if (!defined('AK_TEST_DATABASE_ON')) { 
     27    defined('AK_DEFAULT_DATABASE_PROFILE') ? null : define('AK_DEFAULT_DATABASE_PROFILE',AK_ENVIRONMENT); 
     28
    3729 
    3830// Locale settings ( you must create a file at /config/locales/ using en.php as departure point) 
     
    223215 
    224216defined('AK_ERROR_REPORTING_ON_SCRIPTS') ? null : define('AK_ERROR_REPORTING_ON_SCRIPTS', E_ALL); 
     217defined('AK_BEEP_ON_ERRORS_WHEN_TESTING') ? null : define('AK_BEEP_ON_ERRORS_WHEN_TESTING', false); 
    225218 
    226219?> 
  • trunk/test/fixtures/app/installers/location_installer.php

    r374 r468  
    88        id, 
    99        parent_id, 
    10         lft integer(10) index, 
    11         rgt integer(10) index, 
     10        lft integer index, 
     11        rgt integer index, 
    1212        owner_id int default 1, 
    1313        name' 
  • trunk/test/fixtures/app/installers/post_installer.php

    r404 r468  
    55    function install() 
    66    { 
    7         $this->createTable('posts', 'id, title, body, posted_on, expires_at'); 
     7        $this->createTable('posts', 'id, title, body, hip_factor int, comments_count, posted_on, expires_at'); 
    88    } 
    99 
  • trunk/test/fixtures/app/installers/thumbnail_installer.php

    r323 r468  
    77        $this->createTable('thumbnails', ' 
    88        id integer(11) auto increment primary key, 
    9         photo_id integer(10)
     9        photo_id integer
    1010        owner string (40) default \'Picture\', 
    1111        caption string (200) 
  • trunk/test/fixtures/app/installers/todo_task_installer.php

    r329 r468  
    55    function up_1() 
    66    { 
    7         $this->modifyTable('todo_tasks', " 
    8         id, 
     7        $this->createTable('todo_tasks', 
     8           "id, 
    99        todo_list_id, 
    1010        details, 
    1111        position integer default 0, 
    1212        is_done, 
    13         created_at"); 
     13            created_at" 
     14        ); 
    1415    } 
    1516     
  • trunk/test/fixtures/app/models/post.php

    r328 r468  
    55    var $has_many = 'comments'; 
    66    var $habtm = 'tags'; 
     7     
     8    function validate() 
     9    { 
     10        if ($this->comments_count<0){ 
     11            $this->addError('comments_count','can\'t be negative'); 
     12        } 
     13    } 
    714} 
    815 
  • trunk/test/fixtures/app/models/todo_task.php

    r329 r468  
    33class TodoTask extends ActiveRecord 
    44{ 
    5     var $acts_as = array('list'=> array('scope'=> array('todo_list_id','is_done = 0'))); 
     5    var $acts_as = array('list'=> array('scope'=> array('todo_list_id','is_done = \'0\'')));  
    66    var $belongs_to = array('todo_list'); 
    77} 
  • trunk/test/fixtures/config/config.php

    r335 r468  
    4141 
    4242if(defined('AK_TEST_DATABASE_ON')){ 
     43    $default_profile = array_key_exists($argv[count($argv)-1], $database_settings) ? array_pop($argv) : AK_ENVIRONMENT; 
     44    define('AK_DEFAULT_DATABASE_PROFILE', $default_profile); 
    4345    include_once(AK_LIB_DIR.DS.'Ak.php'); 
    44     Ak::db(&$dsn); 
     46    Ak::db(); 
     47    unset($default_profile); 
    4548} 
    4649 
  • trunk/test/mocks/test_script_AkDbSession.php

    r2 r468  
    1919 
    2020require_once(AK_LIB_DIR.DS.'Ak.php'); 
    21 Ak::db(&$dsn); 
     21Ak::db(); 
    2222 
    2323require_once(AK_LIB_DIR.DS.'AkDbSession.php'); 
  • trunk/test/unit/lib/AkActionView/helpers/menu_helper.php

    r217 r468  
    2020        $this->menu_helper =& $this->controller->menu_helper; 
    2121    } 
     22     
     23    function test_should_get_controller_methods() 
     24    { 
     25        $controller_file_name = 'authentication_controller.php'; 
     26        require_once(AK_CONTROLLERS_DIR.DS.$controller_file_name); 
     27        $this->assertTrue(in_array('authenticate',$this->menu_helper->_get_this_class_methods('AuthenticationController'))); 
     28    } 
     29 
     30    function test_should_get_all_controllers_with_their_actions() 
     31    { 
     32        $available_controllers = array_map('array_pop', (array)Ak::dir(AK_CONTROLLERS_DIR, array('files'=>false))); 
     33        $got = $this->menu_helper->_get_default_full_menu(); 
     34        foreach ($available_controllers as $controller_filename){ 
     35            $controller_name = str_replace('_controller.php','',$controller_filename); 
     36            $this->assertTrue(isset($got[$controller_name])); 
     37        } 
     38        $this->assertTrue(in_array('authenticate',$got['authentication'])); 
     39    } 
     40     
    2241    function tests_menu_for_controllers() 
    2342    { 
    24         $this->assertEqual( 
    25             $this->menu_helper->menu_for_controllers(), 
    26             file_get_contents(AK_TEST_HELPERS_DIR.DS.'menu_helper_all.txt') 
    27         ); 
    2843 
    2944        $this->assertEqual( 
  • trunk/test/unit/lib/AkActiveRecord.php

    r329 r468  
    1313} 
    1414 
     15//these partials are not refactored yet. so they must be run in sequence! 
    1516$partial_tests = array( 
    16 'AkActiveRecord_1', 
    17 'AkActiveRecord_2', 
    18 'AkActiveRecord_3', 
    19 'AkActiveRecord_finders', 
    20 'AkActiveRecord_locking', 
    21 'AkActiveRecord_table_inheritance', 
    22 'AkActiveRecord_i18n', 
    23 'AkActiveRecord_multiple_inclussion', 
    24 'AkActiveRecord_accessible_attributes', 
    25 'AkActiveRecord_calculations', 
    26 'AkActiveRecord_associated_inclusion', 
    27 'AkActiveRecord_findOrCreateBy', 
     17    '_AkActiveRecord_1.php', 
     18    '_AkActiveRecord_2.php', 
     19    '_AkActiveRecord_3.php' 
    2820); 
    2921 
    3022foreach ($partial_tests as $partial_test){ 
    31     $test->addTestFile(AK_LIB_TESTS_DIRECTORY.DS.'AkActiveRecord'.DS.'_'.$partial_test.'.php'); 
     23    $test->addTestFile(AK_LIB_TESTS_DIRECTORY.DS.'AkActiveRecord'.DS.$partial_test); 
    3224} 
    3325 
     
    3527if(!ALL_TESTS_RUNNER){ 
    3628    foreach (Ak::dir(AK_LIB_TESTS_DIRECTORY.DS.'AkActiveRecord') as $active_record_test){ 
    37         if($active_record_test[0] != '_'){ 
     29        if(!is_array($active_record_test) && !in_array($active_record_test, $partial_tests)){ 
    3830            $test->addTestFile(AK_LIB_TESTS_DIRECTORY.DS.'AkActiveRecord'.DS.$active_record_test); 
    3931        } 
    4032    } 
    4133} 
     34 
    4235 
    4336if(!ALL_TESTS_RUNNER){ 
  • trunk/test/unit/lib/AkActiveRecord/AkActsAsList.php

    r329 r468  
    11<?php 
     2 
     3defined('AK_TEST_DATABASE_ON') ? null : define('AK_TEST_DATABASE_ON', true); 
     4require_once(dirname(__FILE__).'/../../../fixtures/config/config.php'); 
     5 
     6if(!defined('AK_ACTIVE_RECORD_PROTECT_GET_RECURSION')){ 
     7    define('AK_ACTIVE_RECORD_PROTECT_GET_RECURSION', false); 
     8} 
    29 
    310class AkActiveRecord_actsAsListTestCase extends  AkUnitTest 
    411{ 
    5     /**/ 
    6     var $_testing_models_to_delete = array(); 
    7     var $_testing_model_databases_to_delete = array(); 
    812 
    913    function test_AkActiveRecord_actsAsList() 
    1014    { 
    11         parent::UnitTestCase(); 
    12         $this->_createNewTestingModelDatabase('AkTestTodoItem'); 
    13         $this->_createNewTestingModel('AkTestTodoItem'); 
    14     } 
    15  
    16     function tearDown() 
    17     { 
    18         unset($_SESSION['__activeRecordColumnsSettingsCache']); 
    19     } 
    20  
    21     function _createNewTestingModel($test_model_name) 
    22     { 
    23  
    24         static $shutdown_called; 
    25         switch ($test_model_name) { 
    26  
    27             case 'AkTestTodoItem': 
    28                 $model_source = 
    29                 '<?php 
    30     class AkTestTodoItem extends AkActiveRecord 
    31     { 
    32     var $act_as = "list"; 
    33     } 
    34     ?>'; 
    35                 break; 
    36  
    37             default: 
    38                 $model_source = '<?php class '.$test_model_name.' extends AkActiveRecord { } ?>'; 
    39                 break; 
    40         } 
    41  
    42         $file_name = AkInflector::toModelFilename($test_model_name); 
    43  
    44         if(!Ak::file_put_contents($file_name,$model_source)){ 
    45             die('Ooops!, in order to perform this test, you must set your app/model permissions so this can script can create and delete files into/from it'); 
    46         } 
    47         if(!in_array($file_name, get_included_files()) && !class_exists($test_model_name)){ 
    48             include($file_name); 
    49         }else { 
    50             return false; 
    51         } 
    52         $this->_testing_models_to_delete[] = $file_name; 
    53         if(!isset($shutdown_called)){ 
    54             $shutdown_called = true; 
    55             register_shutdown_function(array(&$this,'_deleteTestingModels')); 
    56         } 
    57         return true; 
    58     } 
    59  
    60     function _deleteTestingModels() 
    61     { 
    62         foreach ($this->_testing_models_to_delete as $file){ 
    63             Ak::file_delete($file); 
    64         } 
    65     } 
    66  
    67  
    68  
    69  
    70     function _createNewTestingModelDatabase($test_model_name) 
    71     { 
    72         static $shutdown_called; 
    73         // Create a data dictionary object, using this connection 
    74         $db =& AK::db(); 
    75         //$db->debug = true; 
    76         $table_name = AkInflector::tableize($test_model_name); 
    77         if(in_array($table_name, (array)$db->MetaTables())){ 
    78             return false; 
    79         } 
    80         switch ($table_name) { 
    81             case 'ak_test_todo_items': 
    82                 $table = 
    83                 array( 
    84                 'table_name' => 'ak_test_todo_items', 
    85                 'fields' => 'id I AUTO KEY, 
    86                             position I(20), 
    87                             task X, 
    88                             due_time T, 
    89                             created_at T, 
    90                             expires T, 
    91                             updated_at T, 
    92                             new_position I(10)', 
    93                             'index_fileds' => 'id', 
    94                             'table_options' => array('mysql' => 'TYPE=InnoDB', 'REPLACE') 
    95                             ); 
    96                             break; 
    97             default: 
    98                 return false; 
    99                 break; 
    100         } 
    101  
    102         $dict = NewDataDictionary($db); 
    103         $sqlarray = $dict->CreateTableSQL($table['table_name'], $table['fields'], $table['table_options']); 
    104         $dict->ExecuteSQLArray($sqlarray); 
    105         if(isset($table['index_fileds'])){ 
    106             $sqlarray = $dict->CreateIndexSQL('idx_'.$table['table_name'], $table['table_name'], $table['index_fileds']); 
    107             $dict->ExecuteSQLArray($sqlarray); 
    108         } 
    109  
    110         $db->CreateSequence('seq_'.$table['table_name']); 
    111  
    112         $this->_testing_model_databases_to_delete[] = $table_name; 
    113         if(!isset($shutdown_called)){ 
    114             $shutdown_called = true; 
    115             register_shutdown_function(array(&$this,'_deleteTestingModelDatabases')); 
    116         } 
    117         //$db->debug = false; 
    118         return true; 
    119     } 
    120  
    121     function _deleteTestingModelDatabases() 
    122     { 
    123         $db =& AK::db(); 
    124         foreach ($this->_testing_model_databases_to_delete as $table_name){ 
    125             $db->Execute('DROP TABLE '.$table_name); 
    126             $db->DropSequence('seq_'.$table_name); 
    127         } 
     15        $this->installAndIncludeModels(array( 
     16            'TodoItem'=>'id, position int, task text, due_time datetime, created_at, expires datetime, updated_at,new_position int' 
     17        )); 
    12818    } 
    12919 
    13020    function Test_of_actsAsList_instatiation() 
    13121    { 
    132         $TodoItems =& new AkTestTodoItem(); 
     22        $TodoItems =& new TodoItem(); 
    13323        $this->assertEqual($TodoItems->actsLike(), 'active record,list'); 
    13424        $this->assertFalse(empty($TodoItems->list->column)); 
    13525        $this->assertTrue(empty($TodoItems->list->scope)); 
    13626 
    137         $TodoItems =& new AkTestTodoItem(); 
     27        $TodoItems =& new TodoItem(); 
    13828        $this->assertErrorPattern('/not_available/',$TodoItems->actsAs('list', array('column'=>'not_available'))); 
    13929 
     
    14434    function Test_of_Test_of___construct() 
    14535    { 
    146         $TodoItems =& new AkTestTodoItem(); 
     36        $TodoItems =& new TodoItem(); 
    14737        $TodoItems->actsAs('list', 
    14838        array( 
     
    15747    function Test_of__ensureIsActiveRecordInstance() 
    15848    { 
    159         $TodoItems =& new AkTestTodoItem(); 
     49        $TodoItems =& new TodoItem(); 
    16050        $Object =& new AkObject(); 
    16151        $this->assertErrorPattern('/is not an active record/',$TodoItems->list->_ensureIsActiveRecordInstance(&$Object)); 
     
    16454    function Test_of_getType() 
    16555    { 
    166         $TodoItems =& new AkTestTodoItem(); 
     56        $TodoItems =& new TodoItem(); 
    16757        $this->assertEqual($TodoItems->list->getType(), 'list'); 
    16858    } 
     
    17060    function Test_of_getScopeCondition_and_setScopeCondition() 
    17161    { 
    172         $TodoItems =& new AkTestTodoItem(); 
    173         $this->assertEqual($TodoItems->list->getScopeCondition(), (substr($TodoItems->_db->databaseType,0,4) == 'post') ? 'true' : '1'); 
     62        $TodoItems =& new TodoItem(); 
     63        $this->assertEqual($TodoItems->list->getScopeCondition(), ($TodoItems->_db->type() == 'postgre') ? 'true' : '1'); 
    17464        $TodoItems->list->setScopeCondition('true'); 
    17565        $this->assertEqual($TodoItems->list->getScopeCondition(), 'true'); 
     
    17868    function Test_of_getBottomItem_1() 
    17969    { 
    180         $TodoItems =& new AkTestTodoItem(); 
     70        $TodoItems =& new TodoItem(); 
    18171        $this->assertFalse($TodoItems->list->getBottomItem()); 
    18272    } 
     
    18474    function Test_of_getBottomPosition_1() 
    18575    { 
    186         $TodoItems =& new AkTestTodoItem(); 
     76        $TodoItems =& new TodoItem(); 
    18777        $this->assertIdentical($TodoItems->list->getBottomPosition(), 0); 
    18878    } 
     
    19080    function Test_of__addToBottom_1() 
    19181    { 
    192         $TodoItems =& new AkTestTodoItem(); 
     82        $TodoItems =& new TodoItem(); 
    19383        $TodoItems->List->_addToBottom(); 
    19484        $this->assertIdentical($TodoItems->position, 1); 
     
    19888    function Test_of_beforeCreate() 
    19989    { 
    200         $TodoItems =& new AkTestTodoItem(); 
     90        $TodoItems =& new TodoItem(); 
    20191        $position = $TodoItems->getAttribute('position'); 
    20292        $TodoItems->List->beforeCreate($TodoItems); 
     
    20797    function Test_of_getBottomItem_2() 
    20898    { 
    209         $TodoItems =& new AkTestTodoItem('task->','Email Hilario with new product specs','due_time->',Ak::getDate(Ak::time()+(60*60*24*7))); 
     99        $TodoItems =& new TodoItem('task->','Email Hilario with new product specs','due_time->',Ak::getDate(Ak::time()+(60*60*24*7))); 
    210100        $this->assertPattern('/list/',$TodoItems->actsLike()); 
    211101        $this->assertTrue($TodoItems->isNewRecord()); 
     
    216106        $this->assertEqual($getBottomItem->toString(), $TodoItems->toString()); 
    217107 
    218         $TodoItems =& new AkTestTodoItem('task->','Book COMDEX trip','due_time->',Ak::getDate(Ak::time()+(60*60*24*3))); 
     108        $TodoItems =& new TodoItem('task->','Book COMDEX trip','due_time->',Ak::getDate(Ak::time()+(60*60*24*3))); 
    219109        $this->assertTrue($TodoItems->isNewRecord()); 
    220110        $this->assertTrue($TodoItems->save()); 
     
    223113        $this->assertEqual($getBottomItem->toString(), $TodoItems->toString()); 
    224114 
    225         $TodoItems =& new AkTestTodoItem(1); 
     115        $TodoItems =& new TodoItem(1); 
    226116        $this->assertTrue($getBottomItem = $TodoItems->List->getBottomItem(2)); 
    227117        $this->assertEqual($getBottomItem->toString(), $TodoItems->toString()); 
     
    231121    function Test_of_getBottomPosition_2() 
    232122    { 
    233         $TodoItems =& new AkTestTodoItem(); 
     123        $TodoItems =& new TodoItem(); 
    234124        $this->assertEqual($TodoItems->list->getBottomPosition(), 2); 
    235125 
     
    240130    function Test_of__addToBottom_2() 
    241131    { 
    242         $TodoItems =& new AkTestTodoItem(); 
     132        $TodoItems =& new TodoItem(); 
    243133        $TodoItems->list->_addToBottom(); 
    244134        $this->assertIdentical($TodoItems->position, 3); 
     
    249139    function Test_of_isInList() 
    250140    { 
    251         $TodoItems =& new AkTestTodoItem(); 
     141        $TodoItems =& new TodoItem(); 
    252142        $this->assertFalse($TodoItems->list->isInList()); 
    253143 
    254         $TodoItems =& new AkTestTodoItem(1); 
     144        $TodoItems =& new TodoItem(1); 
    255145        $this->assertTrue($TodoItems->list->isInList()); 
    256146    } 
     
    261151        for ($i = 0; $i <= 30; $i++){ 
    262152            $attributes = array('task'=>'Task number '.($i+3),'due_time'=>Ak::getDate(Ak::time()+(60*60*24*$i))); 
    263             $TodoTask =& new AkTestTodoItem($attributes); 
     153            $TodoTask =& new TodoItem($attributes); 
    264154            $this->assertTrue($TodoTask->save()); 
    265155            $this->assertTrue(($TodoTask->task == $attributes['task']) && $TodoTask->due_time == $attributes['due_time']); 
     
    270160    function Test_of_decrementPositionsOnLowerItems() 
    271161    { 
    272         $TodoItems =& new AkTestTodoItem(); 
     162        $TodoItems =& new TodoItem(); 
    273163        $TodoItems->transactionStart(); 
    274164        $this->assertFalse($TodoItems->list->decrementPositionsOnLowerItems()); 
     
    276166        $todo_list = $this->_getTodoList(); 
    277167        $this->assertEqual($todo_list[10] , 'Task number 10'); 
    278         $TodoItems =& new AkTestTodoItem(10); 
     168        $TodoItems =& new TodoItem(10); 
    279169 
    280170        $this->assertTrue($TodoItems->list->decrementPositionsOnLowerItems()); 
     
    293183    function Test_of_removeFromList() 
    294184    { 
    295         $TodoItems =& new AkTestTodoItem(10); 
     185        $TodoItems =& new TodoItem(10); 
    296186 
    297187        $TodoItems->transactionStart(); 
     
    307197    function Test_of_afterDestroy_and_beforeDestroy() 
    308198    { 
    309         $TodoItems =& new AkTestTodoItem(10); 
     199        $TodoItems =& new TodoItem(10); 
    310200 
    311201        $TodoItems->transactionStart(); 
     
    335225    function Test_of_getLowerItem() 
    336226    { 
    337         $TodoItems =& new AkTestTodoItem(); 
     227        $TodoItems =& new TodoItem(); 
    338228        $this->assertFalse($TodoItems->list->getLowerItem()); 
    339229        $TodoItem = $TodoItems->find(10); 
     
    346236 
    347237 
    348         $TodoItems =& new AkTestTodoItem(); 
     238        $TodoItems =& new TodoItem(); 
    349239        $TodoItems->transactionStart(); 
    350240        $this->assertTrue($TodoItems->deleteAll()); 
     
    358248    function Test_of_decrementPosition() 
    359249    { 
    360         $TodoItems =& new AkTestTodoItem(10); 
     250        $TodoItems =& new TodoItem(10); 
    361251        $TodoItems->transactionStart(); 
    362252 
     
    369259    function Test_of_incrementPosition() 
    370260    { 
    371         $TodoItems =& new AkTestTodoItem(10); 
     261        $TodoItems =& new TodoItem(10); 
    372262        $TodoItems->transactionStart(); 
    373263 
     
    380270    function Test_of_moveLower() 
    381271    { 
    382         $TodoItems =& new AkTestTodoItem(); 
     272        $TodoItems =& new TodoItem(); 
    383273        $this->assertFalse($TodoItems->list->moveLower()); 
    384274 
     
    387277        $this->assertEqual($todo_list[11] , 'Task number 11'); 
    388278 
    389         $TodoItems =& new AkTestTodoItem(10); 
     279        $TodoItems =& new TodoItem(10); 
    390280        $TodoItems->transactionStart(); 
    391281 
     
    396286        $this->assertEqual($todo_list[11] , 'Task number 10'); 
    397287 
    398         $TodoItems =& new AkTestTodoItem(33); 
     288        $TodoItems =& new TodoItem(33); 
    399289        $this->assertFalse($TodoItems->list->moveLower()); 
    400290 
     
    406296    function Test_of_getHigherItem() 
    407297    { 
    408         $TodoItems =& new AkTestTodoItem(); 
     298        $TodoItems =& new TodoItem(); 
    409299        $this->assertFalse($TodoItems->list->getHigherItem()); 
    410300 
     
    417307 
    418308 
    419         $TodoItems =& new AkTestTodoItem(); 
     309        $TodoItems =& new TodoItem(); 
    420310        $TodoItems->transactionStart(); 
    421311        $this->assertTrue($TodoItems->deleteAll()); 
     
    430320    function Test_of_moveHigher() 
    431321    { 
    432         $TodoItems =& new AkTestTodoItem(); 
     322        $TodoItems =& new TodoItem(); 
    433323        $this->assertFalse($TodoItems->list->moveHigher()); 
    434324 
     
    437327        $this->assertEqual($todo_list[10] , 'Task number 10'); 
    438328 
    439         $TodoItems =& new AkTestTodoItem(10); 
     329        $TodoItems =& new TodoItem(10); 
    440330        $TodoItems->transactionStart(); 
    441331 
     
    446336        $this->assertEqual($todo_list[10] , 'Task number 9'); 
    447337 
    448         $TodoItems =& new AkTestTodoItem(1); 
     338        $TodoItems =& new TodoItem(1); 
    449339        $this->assertFalse($TodoItems->list->moveHigher()); 
    450340 
     
    458348        $this->assertEqual($todo_list[10] , 'Task number 10'); 
    459349 
    460         $TodoItems =& new AkTestTodoItem(10); 
     350        $TodoItems =& new TodoItem(10); 
    461351        $TodoItems->transactionStart(); 
    462352 
     
    475365        $this->assertEqual($todo_list[10] , 'Task number 10'); 
    476366 
    477         $TodoItems =& new AkTestTodoItem(); 
     367        $TodoItems =& new TodoItem(); 
    478368        $this->assertFalse($TodoItems->list->moveToBottom()); 
    479369 
    480         $TodoItems =& new AkTestTodoItem(10); 
     370        $TodoItems =& new TodoItem(10); 
    481371        $TodoItems->transactionStart(); 
    482372 
     
    491381        $TodoItems->transactionComplete(); 
    492382 
    493         $TodoItems =& new AkTestTodoItem(33); 
     383        $TodoItems =& new TodoItem(33); 
    494384        $TodoItems->transactionStart(); 
    495385 
     
    505395    function Test_of_incrementPositionsOnHigherItems() 
    506396    { 
    507         $TodoItems =& new AkTestTodoItem(); 
     397        $TodoItems =& new TodoItem(); 
    508398        $TodoItems->transactionStart(); 
    509399        $this->assertFalse($TodoItems->list->incrementPositionsOnHigherItems()); 
     
    511401        $todo_list = $this->_getTodoList(); 
    512402        $this->assertEqual($todo_list[10] , 'Task number 10'); 
    513         $TodoItems =& new AkTestTodoItem(10); 
     403        $TodoItems =& new TodoItem(10); 
    514404        $this->assertTrue($TodoItems->list->incrementPositionsOnHigherItems()); 
    515405        $todo_list = $this->_getTodoList(); 
    516406        $this->assertEqual($todo_list[9] , 'Task number 8'); 
    517         $this->assertEqual($todo_list[10] , 'Task number 10'); 
     407        $this->assertEqual($todo_list[10] , 'Task number 10');  // Task 9&10 are on position 10, so this is ambigious; last one returned by find wins 
    518408        $TodoItems->transactionFail(); 
    519409        $TodoItems->transactionComplete(); 
     
    523413    function Test_of_assumeTopPosition() 
    524414    { 
    525         $TodoItems =& new AkTestTodoItem(); 
    526         $TodoItems->transactionStart(); 
    527  
    528         $todo_list = $this->_getTodoList(); 
    529         $this->assertEqual($todo_list[10] , 'Task number 10'); 
    530         $TodoItems =& new AkTestTodoItem(10); 
     415        $TodoItems =& new TodoItem(); 
     416        $TodoItems->transactionStart(); 
     417 
     418        $todo_list = $this->_getTodoList(); 
     419        $this->assertEqual($todo_list[10] , 'Task number 10'); 
     420        $TodoItems =& new TodoItem(10); 
    531421        $this->assertTrue($TodoItems->list->assumeTopPosition()); 
    532422        $todo_list = $this->_getTodoList(); 
     
    541431        $this->assertEqual($todo_list[10] , 'Task number 10'); 
    542432 
    543         $TodoItems =& new AkTestTodoItem(); 
     433        $TodoItems =& new TodoItem(); 
    544434        $this->assertFalse($TodoItems->list->moveToTop()); 
    545435 
    546         $TodoItems =& new AkTestTodoItem(10); 
     436        $TodoItems =& new TodoItem(10); 
    547437        $TodoItems->transactionStart(); 
    548438 
     
    557447        $TodoItems->transactionComplete(); 
    558448 
    559         $TodoItems =& new AkTestTodoItem(1); 
     449        $TodoItems =& new TodoItem(1); 
    560450        $TodoItems->transactionStart(); 
    561451 
     
    571461    function Test_of_isFirst() 
    572462    { 
    573         $TodoItems =& new AkTestTodoItem(1); 
     463        $TodoItems =& new TodoItem(1); 
    574464 
    575465        $this->assertTrue($TodoItems->list->isFirst()); 
    576466 
    577         $TodoItems =& new AkTestTodoItem(2); 
     467        $TodoItems =& new TodoItem(2); 
    578468        $this->assertFalse($TodoItems->list->isFirst()); 
    579469 
    580         $TodoItems =& new AkTestTodoItem(); 
     470        $TodoItems =& new TodoItem(); 
    581471        $this->assertFalse($TodoItems->list->isFirst()); 
    582472    } 
     
    585475    function Test_of_isLast() 
    586476    { 
    587         $TodoItems =& new AkTestTodoItem(33); 
     477        $TodoItems =& new TodoItem(33); 
    588478        $this->assertTrue($TodoItems->list->isLast()); 
    589479 
    590         $TodoItems =& new AkTestTodoItem(1); 
     480        $TodoItems =& new TodoItem(1); 
    591481        $this->assertFalse($TodoItems->list->isLast()); 
    592482 
    593         $TodoItems =& new AkTestTodoItem(); 
     483        $TodoItems =& new TodoItem(); 
    594484        $this->assertFalse($TodoItems->list->isLast()); 
    595485    } 
     
    598488    function Test_of_incrementPositionsOnLowerItems() 
    599489    { 
    600         $TodoItems =& new AkTestTodoItem(); 
    601         $TodoItems->transactionStart(); 
    602  
    603         $todo_list = $this->_getTodoList(); 
    604         $this->assertEqual($todo_list[10] , 'Task number 10'); 
    605         $TodoItems =& new AkTestTodoItem(10); 
     490        $TodoItems =& new TodoItem(); 
     491        $TodoItems->transactionStart(); 
     492 
     493        $todo_list = $this->_getTodoList(); 
     494        $this->assertEqual($todo_list[10] , 'Task number 10'); 
     495        $TodoItems =& new TodoItem(10); 
    606496        $this->assertTrue($TodoItems->list->incrementPositionsOnLowerItems(10)); 
    607497        $todo_list = $this->_getTodoList(); 
     
    615505    function Test_of_insertAtPosition() 
    616506    { 
    617         $TodoItems =& new AkTestTodoItem(10); 
     507        $TodoItems =& new TodoItem(10); 
    618508        $TodoItems->transactionStart(); 
    619509 
     
    623513 
    624514 
    625         $TodoItems =& new AkTestTodoItem('task->','ship new InmoEasy version'); 
     515        $TodoItems =& new TodoItem('task->','ship new InmoEasy version'); 
    626516        $TodoItems->list->insertAtPosition(1); 
    627517        $todo_list = $this->_getTodoList(); 
    628518        $this->assertEqual($todo_list[1] , 'ship new InmoEasy version'); 
    629519 
    630         $TodoItems =& new AkTestTodoItem(10); 
     520        $TodoItems =& new TodoItem(10); 
    631521        $TodoItems->list->insertAtPosition(10); 
    632522        $todo_list = $this->_getTodoList(); 
    633523        $this->assertEqual($todo_list[10] , 'Task number 10'); 
    634524 
    635         $TodoItems =& new AkTestTodoItem(33); 
     525        $TodoItems =& new TodoItem(33); 
    636526        $TodoItems->list->insertAtPosition(40); 
    637527        $todo_list = $this->_getTodoList(); 
     
    646536    function Test_of_incrementPositionsOnAllItems() 
    647537    { 
    648         $TodoItems =& new AkTestTodoItem(); 
     538        $TodoItems =& new TodoItem(); 
    649539        $TodoItems->transactionStart(); 
    650540 
     
    663553    function Test_of_decrementPositionsOnHigherItems() 
    664554    { 
    665         $TodoItems =& new AkTestTodoItem(); 
     555        $TodoItems =& new TodoItem(); 
    666556        $TodoItems->transactionStart(); 
    667557 
     
    679569    function _getTodoList($use_id_as_index = false) 
    680570    { 
    681         $TodoItems = new AkTestTodoItem(); 
    682         $TodoItems = $TodoItems->find(); 
     571        $TodoItems = new TodoItem(); 
     572        $TodoItems = $TodoItems->find('all',array('order'=>'id ASC')); 
    683573        $list = array(); 
    684574        foreach ($TodoItems as $TodoItem){ 
     
    692582    } 
    693583 
    694  
    695584    function test_should_move_up_the_item_with_the_same_position_as_the_inserted() 
    696585    { 
     
    699588        $ListA =& new TodoList(array('name' => 'A')); 
    700589        $this->assertTrue($ListA->save()); 
     590         
    701591        $ListA->task->create(array('details' => 1)); 
    702592 
     
    706596        $TodoTask =& $ListB->task->create(array('details' => 3)); 
    707597 
    708         $Task1 =& $TodoTask->findFirstBy('details', 1); 
     598        $Task1 =& $TodoTask->find('first',array('details'=>1)); 
    709599 
    710600        $Task1->list->removeFromList(); 
     
    712602        $Task1->todo_list->assign($ListB); 
    713603        $this->assertTrue($Task1->save()); 
    714         //$Task1->reload(); 
    715604        $Task1->list->insertAt(2); 
    716605 
    717         $ListB =& $ListB->findFirstBy('name', 'B', array('include'=>'tasks')); 
     606        $ListB =& $ListB->find('first',array('name'=>'B'), array('include'=>'tasks')); 
    718607 
    719608        foreach (array_keys($ListB->tasks) as $k){ 
     
    725614} 
    726615 
     616ak_test('AkActiveRecord_actsAsListTestCase',true); 
    727617 
    728618?> 
  • trunk/test/unit/lib/AkActiveRecord/AkActsAsNestedSet.php

    r374 r468  
    11<?php 
    2  
    32 
    43defined('AK_TEST_DATABASE_ON') ? null : define('AK_TEST_DATABASE_ON', true); 
    54require_once(dirname(__FILE__).'/../../../fixtures/config/config.php'); 
    6  
    7 require_once(AK_LIB_DIR.DS.'AkActiveRecord.php'); 
    85 
    96if(!defined('AK_ACTIVE_RECORD_PROTECT_GET_RECURSION')){ 
     
    118} 
    129 
    13  
    1410class test_AkActiveRecord_actsAsNestedSet extends  AkUnitTest 
    1511{ 
    16     /**/ 
    17     var $_testing_models_to_delete = array(); 
    18     var $_testing_model_databases_to_delete = array(); 
    19  
    20     function test_AkActiveRecord_actsAsNestedSet() 
    21     { 
    22         parent::UnitTestCase(); 
    23         $this->_createNewTestingModelDatabase('AkTestNestedCategory'); 
    24         $this->_createNewTestingModel('AkTestNestedCategory'); 
    25     } 
    26  
    27     function tearDown() 
    28     { 
    29         unset($_SESSION['__activeRecordColumnsSettingsCache']); 
    30     } 
    31  
    32     function _createNewTestingModel($test_model_name) 
    33     { 
    34  
    35         static $shutdown_called; 
    36         switch ($test_model_name) { 
    37  
    38             case 'AkTestNestedCategory': 
    39             $model_source = 
    40             '<?php 
    41     class AkTestNestedCategory extends AkActiveRecord  
    42     { 
    43         var $act_as = "nested_set"; 
    44     }  
    45 ?>'; 
    46             break; 
    47  
    48             default: 
    49             $model_source = '<?php class '.$test_model_name.' extends AkActiveRecord { } ?>'; 
    50             break; 
    51         } 
    52  
    53         $file_name = AkInflector::toModelFilename($test_model_name); 
    54  
    55         if(!Ak::file_put_contents($file_name,$model_source)){ 
    56             die('Ooops!, in order to perform this test, you must set your app/model permissions so this can script can create and delete files into/from it'); 
    57         } 
    58         if(!in_array($file_name, get_included_files()) && !class_exists($test_model_name)){ 
    59             include($file_name); 
    60         }else { 
    61             return false; 
    62         } 
    63         $this->_testing_models_to_delete[] = $file_name; 
    64         if(!isset($shutdown_called)){ 
    65             $shutdown_called = true; 
    66             register_shutdown_function(array(&$this,'_deleteTestingModels')); 
    67         } 
    68         return true; 
    69     } 
    70  
    71     function _deleteTestingModels() 
    72     { 
    73         foreach ($this->_testing_models_to_delete as $file){ 
    74             Ak::file_delete($file); 
    75         } 
    76     } 
    77  
    78  
    79  
    80  
    81     function _createNewTestingModelDatabase($test_model_name) 
    82     { 
    83         static $shutdown_called; 
    84         // Create a data dictionary object, using this connection 
    85         $db =& AK::db(); 
    86         //$db->debug = true; 
    87         $table_name = AkInflector::tableize($test_model_name); 
    88         if(in_array($table_name, (array)$db->MetaTables())){ 
    89             return false; 
    90         } 
    91         switch ($table_name) { 
    92             case 'ak_test_nested_categories': 
    93             $table = 
    94             array( 
    95             'table_name' => 'ak_test_nested_categories', 
    96             'fields' => 
    97             'id I AUTO KEY, 
    98             lft I(11), 
    99             rgt I(11), 
    100             parent_id I(11), 
    101             description C(250), 
    102             department C(25)', 
    103             'index_fileds' => 'id', 
    104             'table_options' => array('mysql' => 'TYPE=InnoDB', 'REPLACE') 
    105             ); 
    106  
    107             break; 
    108             default: 
    109             return false; 
    110             break; 
    111         } 
    112  
    113         $dict = NewDataDictionary($db); 
    114         $sqlarray = $dict->CreateTableSQL($table['table_name'], $table['fields'], $table['table_options']); 
    115         $dict->ExecuteSQLArray($sqlarray); 
    116         if(isset($table['index_fileds'])){ 
    117             $sqlarray = $dict->CreateIndexSQL('idx_'.$table['table_name'], $table['table_name'], $table['index_fileds']); 
    118             $dict->ExecuteSQLArray($sqlarray); 
    119         } 
    120  
    121         $db->CreateSequence('seq_'.$table['table_name']); 
    122  
    123         $this->_testing_model_databases_to_delete[] = $table_name; 
    124         if(!isset($shutdown_called)){ 
    125             $shutdown_called = true; 
    126             register_shutdown_function(array(&$this,'_deleteTestingModelDatabases')); 
    127         } 
    128         //$db->debug = false; 
    129         return true; 
    130     } 
    131  
    132     function _deleteTestingModelDatabases() 
    133     { 
    134         $db =& AK::db(); 
    135         foreach ($this->_testing_model_databases_to_delete as $table_name){ 
    136             $db->Execute('DROP TABLE '.$table_name); 
    137             $db->DropSequence('seq_'.$table_name); 
    138         } 
     12 
     13    function test_start() 
     14    { 
     15        $this->installAndIncludeModels(array( 
     16            'NestedCategory'=>'id,lft int,rgt int,parent_id,description,department string(25)' 
     17            )); 
    13918    } 
    14019 
    14120    function Test_of_actsAsNestedSet_instatiation() 
    14221    { 
    143         $Categories =& new AkTestNestedCategory(); 
     22        $Categories =& new NestedCategory(); 
    14423        $this->assertEqual($Categories->actsLike(), 'active record,nested set'); 
    14524 
     
    14827        $this->assertEqual($Categories->nested_set->_right_column_name,'rgt'); 
    14928 
    150         $Categories =& new AkTestNestedCategory(); 
     29        $Categories =& new NestedCategory(); 
    15130 
    15231        $this->assertErrorPattern('/columns are required/',$Categories->actsAs('nested_set', array('parent_column'=>'not_available'))); 
     
    15837    function Test_of_Test_of_init() 
    15938    { 
    160         $Categories =& new AkTestNestedCategory(); 
     39        $Categories =& new NestedCategory(); 
    16140        $Categories->nested_set->init(array('scope'=>array('category_id = ? AND completed = 0',$Categories->getId()),'custom_attribute'=>'This is not allowed here')); 
    16241 
     
    16847    function Test_of__ensureIsActiveRecordInstance() 
    16948    { 
    170         $Categories =& new AkTestNestedCategory(); 
     49        $Categories =& new NestedCategory(); 
    17150        $Object =& new AkObject(); 
    17251        $this->assertErrorPattern('/is not an active record/',$Categories->nested_set->_ensureIsActiveRecordInstance(&$Object)); 
     
    17554    function Test_of_getType() 
    17655    { 
    177         $Categories =& new AkTestNestedCategory(); 
     56        $Categories =& new NestedCategory(); 
    17857        $this->assertEqual($Categories->nested_set->getType(), 'nested set'); 
    17958    } 
     
    18261    function Test_of_getScopeCondition_and_setScopeCondition() 
    18362    { 
    184         $Categories =& new AkTestNestedCategory(); 
    185         $this->assertEqual($Categories->nested_set->getScopeCondition(), (substr($Categories->_db->databaseType,0,4) == 'post') ? 'true' : '1'); 
     63        $Categories =& new NestedCategory(); 
     64        $this->assertEqual($Categories->nested_set->getScopeCondition(), ($Categories->_db->type() == 'postgre') ? 'true' : '1'); 
    18665        $Categories->nested_set->setScopeCondition('true'); 
    18766        $this->assertEqual($Categories->nested_set->getScopeCondition(), 'true'); 
     
    19069    function Test_of_getters_and_setters() 
    19170    { 
    192         $Categories =& new AkTestNestedCategory(); 
     71        $Categories =& new NestedCategory(); 
    19372 
    19473        $Categories->nested_set->setLeftColumnName('column_name'); 
     
    485364    { 
    486365        $this->_deleteTestingModelDatabases(); 
    487         $this->_createNewTestingModelDatabase('AkTestNestedCategory'); 
     366        $this->_createNewTestingModelDatabase('NestedCategory'); 
    488367    } 
    489368 
     
    491370    { 
    492371        if(!isset($Categories)){ 
    493             $Categories = new AkTestNestedCategory(); 
     372            $Categories = new NestedCategory(); 
    494373            $Categories = $Categories->find('all',array('conditions'=>$Categories->nested_set->getScopeCondition(),'order'=>' lft ASC ')); 
    495374        } 
  • trunk/test/unit/lib/AkActiveRecord/AkActsAsTree.php

    r374 r468  
    44require_once(dirname(__FILE__).'/../../../fixtures/config/config.php'); 
    55 
    6 require_once(AK_LIB_DIR.DS.'AkActiveRecord.php'); 
    7  
    86if(!defined('AK_ACTIVE_RECORD_PROTECT_GET_RECURSION')){ 
    97    define('AK_ACTIVE_RECORD_PROTECT_GET_RECURSION', false); 
    108} 
    119 
     10class test_AkActiveRecord_actAsTree extends  AkUnitTest  
     11{ 
    1212 
    13 class test_AkActiveRecord_actAsTree extends  UnitTestCase 
    14 
    15     var $_testing_models_to_delete = array(); 
    16     var $_testing_model_databases_to_delete = array(); 
    17  
    18     function test_AkActiveRecord_actAsTree() 
     13    function test_start() 
    1914    { 
    20         parent::UnitTestCase(); 
    21         $this->_createNewTestingModelDatabase('AkTestCategory'); 
    22         $this->_createNewTestingModel('AkTestCategory'); 
    23         $this->_createNewTestingModel('AkDependentTestCategory'); 
    24     } 
    25  
    26     function setUp() 
    27     { 
    28         $this->_resetTable(); 
    29     } 
    30  
    31     function tearDown() 
    32     { 
    33         unset($_SESSION['__activeRecordColumnsSettingsCache']); 
    34     } 
    35  
    36     function _createNewTestingModel($test_model_name) 
    37     { 
    38  
    39         static $shutdown_called; 
    40         switch ($test_model_name) { 
    41  
    42             case 'AkTestCategory': 
    43                 $model_source = 
    44                 '<?php 
    45     class AkTestCategory extends AkActiveRecord  
    46     { 
    47         var $act_as = "tree"; 
    48     }  
    49 ?>'; 
    50                 break; 
    51  
    52             case 'AkDependentTestCategory': 
    53                 $model_source = 
    54                 '<?php 
    55     class AkDependentTestCategory extends AkActiveRecord  
    56     { 
    57         var $act_as = array("tree" => array("dependent" => true)); 
    58         var $table_name = "ak_test_categories"; 
    59     }  
    60 ?>'; 
    61                 break; 
    62  
    63             default: 
    64                 $model_source = '<?php class '.$test_model_name.' extends AkActiveRecord { } ?>'; 
    65                 break; 
    66         } 
    67  
    68         $file_name = AkInflector::toModelFilename($test_model_name); 
    69  
    70         if(!Ak::file_put_contents($file_name,$model_source)){ 
    71             die('Ooops!, in order to perform this test, you must set your app/model permissions so this can script can create and delete files into/from it'); 
    72         } 
    73         if(!in_array($file_name, get_included_files()) && !class_exists($test_model_name)){ 
    74             include($file_name); 
    75         }else { 
    76             return false; 
    77         } 
    78         $this->_testing_models_to_delete[] = $file_name; 
    79         if(!isset($shutdown_called)){ 
    80             $shutdown_called = true; 
    81             register_shutdown_function(array(&$this,'_deleteTestingModels')); 
    82         } 
    83         return true; 
    84     } 
    85  
    86     function _deleteTestingModels() 
    87     { 
    88         foreach ($this->_testing_models_to_delete as $file){ 
    89             Ak::file_delete($file); 
    90         } 
    91     } 
    92  
    93  
    94  
    95  
    96     function _createNewTestingModelDatabase($test_model_name) 
    97     { 
    98         static $shutdown_called; 
    99         // Create a data dictionary object, using this connection 
    100         $db =& AK::db(); 
    101         //$db->debug = true; 
    102         $table_name = AkInflector::tableize($test_model_name); 
    103         if(in_array($table_name, (array)$db->MetaTables())){ 
    104             return false; 
    105         } 
    106         switch ($table_name) { 
    107             case 'ak_test_categories': 
    108                 $table = 
    109                 array( 
    110                 'table_name' => 'ak_test_categories', 
    111                 'fields' => 
    112                 'id I AUTO KEY, 
    113             parent_id I(11), 
    114             description C(250), 
    115             department C(25)', 
    116             'index_fileds' => 'id', 
    117             'table_options' => array('mysql' => 'TYPE=InnoDB', 'REPLACE') 
    118             ); 
    119  
    120             break; 
    121             default: 
    122                 return false; 
    123                 break; 
    124         } 
    125  
    126         $dict = NewDataDictionary($db); 
    127         $sqlarray = $dict->CreateTableSQL($table['table_name'], $table['fields'], $table['table_options']); 
    128         $dict->ExecuteSQLArray($sqlarray); 
    129         if(isset($table['index_fileds'])){ 
    130             $sqlarray = $dict->CreateIndexSQL('idx_'.$table['table_name'], $table['table_name'], $table['index_fileds']); 
    131             $dict->ExecuteSQLArray($sqlarray); 
    132         } 
    133  
    134         $db->CreateSequence('seq_'.$table['table_name']); 
    135  
    136         $this->_testing_model_databases_to_delete[] = $table_name; 
    137         if(!isset($shutdown_called)){ 
    138             $shutdown_called = true; 
    139             register_shutdown_function(array(&$this,'_deleteTestingModelDatabases')); 
    140         } 
    141         //$db->debug = false; 
    142         return true; 
    143     } 
    144  
    145     function _deleteTestingModelDatabases() 
    146     { 
    147         $db =& AK::db(); 
    148         foreach ($this->_testing_model_databases_to_delete as $table_name){ 
    149             $db->Execute('DROP TABLE '.$table_name); 
    150             $db->DropSequence('seq_'.$table_name); 
    151         } 
     15        $this->installAndIncludeModels(array( 
     16            'Category'=>'id, parent_id, description, department string(25)' 
     17            )); 
     18        Ak::import('DependentCategory');         
    15219    } 
    15320 
    15421    function Test_of_actsAsTree_instatiation() 
    15522    { 
    156         $Categories =& new AkTestCategory(); 
     23        $Categories =& new Category(); 
    15724        $this->assertEqual($Categories->actsLike(), 'active record,tree'); 
    15825 
    15926        $this->assertEqual($Categories->tree->_parent_column_name,'parent_id'); 
    16027 
    161         $Categories =& new AkTestCategory(); 
     28        $Categories =& new Category(); 
    16229 
    16330        $this->assertErrorPattern('/columns are required/',$Categories->actsAs('tree', array('parent_column'=>'not_available'))); 
     
    16936    function Test_of_Test_of_init() 
    17037    { 
    171         $Categories =& new AkTestCategory(); 
     38        $Categories =& new Category(); 
    17239        $Categories->tree->init(array('scope'=> 'category_id = ? AND completed = 0','custom_attribute'=>'This is not allowed here')); 
    17340 
     
    17946    function Test_of__ensureIsActiveRecordInstance() 
    18047    { 
    181         $Categories =& new AkTestCategory(); 
     48        $Categories =& new Category(); 
    18249        $Object =& new AkObject(); 
    18350        $this->assertErrorPattern('/is not an active record/',$Categories->tree->_ensureIsActiveRecordInstance(&$Object)); 
     
    18653    function Test_of_getType() 
    18754    { 
    188         $Categories =& new AkTestCategory(); 
     55        $Categories =& new Category(); 
    18956        $this->assertEqual($Categories->tree->getType(), 'tree'); 
    19057    } 
     
    19360    function Test_of_getScopeCondition_and_setScopeCondition() 
    19461    { 
    195         $Categories =& new AkTestCategory(); 
    196         $this->assertEqual($Categories->tree->getScopeCondition(), (substr($Categories->_db->databaseType,0,4) == 'post') ? 'true' : '1'); 
     62        $Categories =& new Category(); 
     63        $this->assertEqual($Categories->tree->getScopeCondition(), ($Categories->_db->type() == 'postgre') ? 'true' : '1'); 
    19764        $Categories->tree->setScopeCondition('true'); 
    19865        $this->assertEqual($Categories->tree->getScopeCondition(), 'true'); 
     
    20168    function Test_of_getters_and_setters() 
    20269    { 
    203         $Categories =& new AkTestCategory(); 
     70        $Categories =& new Category(); 
    20471 
    20572        $Categories->tree->setParentColumnName('column_name'); 
     
    21481    function Test_of_hasChildren_and_hasParent() 
    21582    { 
    216         $CategoryA =& new AkTestCategory(); 
     83        $CategoryA =& new Category(); 
    21784        $CategoryA->description = "Cat A"; 
    21885 
    219         $CategoryAa =& new AkTestCategory(); 
     86        $CategoryAa =& new Category(); 
    22087        $CategoryAa->description = "Cat Aa"; 
    22188 
     
    236103    function Test_of_addChild_and_children() 
    237104    { 
    238         $CategoryA =& new AkTestCategory(); 
     105        $CategoryA =& new Category(); 
    239106        $CategoryA->description = "Cat A"; 
    240107 
    241         $CategoryAa =& new AkTestCategory(); 
     108        $CategoryAa =& new Category(); 
    242109        $CategoryAa->description = "Cat Aa"; 
    243110 
    244         $CategoryAb =& new AkTestCategory(); 
     111        $CategoryAb =& new Category(); 
    245112        $CategoryAb->description = "Cat Ab"; 
    246113 
     
    257124    function Test_of_childrenCount() 
    258125    { 
    259         $CategoryA =& new AkTestCategory(); 
     126        $CategoryA =& new Category(); 
    260127        $CategoryA->description = "Cat A"; 
    261128 
    262         $CategoryB =& new AkTestCategory(); 
     129        $CategoryB =& new Category(); 
    263130        $CategoryB->description = "Cat B"; 
    264131 
    265         $CategoryAa =& new AkTestCategory(); 
     132        $CategoryAa =& new Category(); 
    266133        $CategoryAa->description = "Cat Aa"; 
    267134 
    268         $CategoryAb =& new AkTestCategory(); 
     135        $CategoryAb =& new Category(); 
    269136        $CategoryAb->description = "Cat Ab"; 
    270137 
     
    280147    function Test_of_parent() 
    281148    { 
    282         $CategoryA =& new AkTestCategory(); 
     149        $CategoryA =& new Category(); 
    283150        $CategoryA->description = "Cat A"; 
    284151 
    285         $CategoryAa =& new AkTestCategory(); 
     152        $CategoryAa =& new Category(); 
    286153        $CategoryAa->description = "Cat Aa"; 
    287154 
    288         $CategoryAb =& new AkTestCategory(); 
     155        $CategoryAb =& new Category(); 
    289156        $CategoryAb->description = "Cat Ab"; 
    290157 
     
    300167    function Test_of_beforeDestroy() 
    301168    { 
    302         $CategoryA =& new AkDependentTestCategory(); 
     169        $CategoryA =& new DependentCategory(); 
    303170        $CategoryA->description = "Cat A"; 
    304171 
    305         $CategoryB =& new AkTestCategory(); 
     172        $CategoryB =& new Category(); 
    306173        $CategoryB->description = "Cat B"; 
    307174 
    308         $CategoryAa =& new AkDependentTestCategory(); 
     175        $CategoryAa =& new DependentCategory(); 
    309176        $CategoryAa->description = "Cat Aa"; 
    310177 
    311         $CategoryBa =& new AkTestCategory(); 
     178        $CategoryBa =& new Category(); 
    312179        $CategoryBa->description = "Cat Ba"; 
    313180 
     
    323190    } 
    324191 
    325  
    326     function _resetTable() 
    327     { 
    328         $this->_deleteTestingModelDatabases(); 
    329         $this->_createNewTestingModelDatabase('AkTestCategory'); 
    330     } 
    331  
    332192} 
    333  
    334193 
    335194ak_test('test_AkActiveRecord_actAsTree',true); 
  • trunk/test/unit/lib/AkActiveRecord/AkBelongsTo.php

    r329 r468  
    77defined('AK_TEST_DATABASE_ON') ? null : define('AK_TEST_DATABASE_ON', true); 
    88require_once(dirname(__FILE__).'/../../../fixtures/config/config.php'); 
    9  
    109 
    1110class test_AkActiveRecord_belongsTo_Associations extends  AkUnitTest  
     
    1413    function test_start() 
    1514    { 
    16         require_once(AK_LIB_DIR.DS.'AkActiveRecord.php'); 
    17         require_once(AK_LIB_DIR.DS.'AkInstaller.php'); 
    18         require_once(AK_LIB_DIR.DS.'AkActiveRecord'.DS.'AkHasOne.php'); 
    19         require_once(AK_LIB_DIR.DS.'AkActiveRecord'.DS.'AkBelongsTo.php'); 
    20         require_once(AK_APP_DIR.DS.'shared_model.php'); 
    21         require_once(AK_APP_DIR.DS.'installers'.DS.'framework_installer.php'); 
    22         $installer = new FrameworkInstaller(); 
    23         $installer->uninstall(); 
    24         $installer->install(); 
    25         $models = array('Picture', 'Thumbnail','Panorama', 'Property', 'PropertyType', 'Person', 'Account'); 
    2615        $this->installAndIncludeModels(array('Picture', 'Thumbnail','Panorama', 'Property', 'PropertyType', 'Person', 'Account')); 
    27         unset($_SESSION['__activeRecordColumnsSettingsCache']); 
    2816    } 
    2917 
  • trunk/test/unit/lib/AkActiveRecord/AkHasAndBelongsToMany.php

    r333 r468  
    11<?php 
     2 
     3defined('AK_TEST_DATABASE_ON') ? null : define('AK_TEST_DATABASE_ON', true); 
     4require_once(dirname(__FILE__).'/../../../fixtures/config/config.php'); 
    25 
    36class HasAndBelongsToManyTestCase extends  AkUnitTest 
    47{ 
    5     function setup() 
     8 
     9    function test_start() 
    610    { 
    711        $this->installAndIncludeModels(array('Post', 'Tag')); 
     
    913        @$Installer->dropTable('posts_tags'); 
    1014        @Ak::file_delete(AK_MODELS_DIR.DS.'post_tag.php'); 
    11     } 
    12     /**/ 
    13     function test_start() 
    14     { 
    15         require_once(AK_LIB_DIR.DS.'AkActiveRecord.php'); 
    16         require_once(AK_LIB_DIR.DS.'AkInstaller.php'); 
    17         require_once(AK_LIB_DIR.DS.'AkActiveRecord'.DS.'AkHasOne.php'); 
    18         require_once(AK_LIB_DIR.DS.'AkActiveRecord'.DS.'AkBelongsTo.php'); 
    19         require_once(AK_APP_DIR.DS.'shared_model.php'); 
    20         require_once(AK_APP_DIR.DS.'installers'.DS.'framework_installer.php'); 
    21         $installer = new FrameworkInstaller(); 
    22         $installer->uninstall(); 
    23         $installer->install(); 
    24          
    25          
    26         $models = array('Picture', 'Thumbnail','Panorama', 'Property', 'PropertyType'); 
    27         foreach ($models as $model){ 
    28             require_once(AK_APP_DIR.DS.'installers'.DS.AkInflector::underscore($model).'_installer.php'); 
    29             require_once(AK_MODELS_DIR.DS.AkInflector::underscore($model).'.php'); 
    30             $installer_name = $model.'Installer'; 
    31             $installer = new $installer_name(); 
    32             $installer->uninstall(); 
    33             $installer->install(); 
    34         } 
    35         unset($_SESSION['__activeRecordColumnsSettingsCache']); 
    36     } 
    37  
    38  
    39     function test_for_has_and_belons_to_many() 
     15 
     16        $this->installAndIncludeModels(array('Picture', 'Thumbnail','Panorama', 'Property', 'PropertyType')); 
     17    } 
     18     
     19    function test_getAssociatedModelInstance_should_return_a_single_instance()  // bug-fix 
     20    { 
     21        $this->assertReference($this->Post->tag->getAssociatedModelInstance(),$this->Post->tag->getAssociatedModelInstance()); 
     22    } 
     23 
     24 
     25    function test_for_has_and_belongs_to_many() 
    4026    { 
    4127 
     
    223209        $this->assertTrue($Property->destroy()); 
    224210 
    225         $RecordSet = $PropertyInAltea->_db->Execute('SELECT * FROM properties_property_types WHERE property_id = '.$property_id); 
     211        $RecordSet = $PropertyInAltea->_db->execute('SELECT * FROM properties_property_types WHERE property_id = '.$property_id); 
    226212        $this->assertEqual($RecordSet->RecordCount(), 0); 
    227213 
     
    414400            $Post =& new Post(array('title' => 'Post '.$i)); 
    415401            $Post->tag->create(array('name' => 'Tag '.$i)); 
    416             $Post->save(); 
    417             $this->assertEqual($Post->tag->count(), 1); 
     402            $this->assertTrue($Post->save());     
     403            $this->assertEqual($Post->tag->count(), 1);  // dont know why but this fails sometimes, randomly -kaste 
    418404        } 
    419405 
     
    423409        $Post->tag->setByIds(1,2,3,4,5); 
    424410         
    425         $this->assertTrue($Post =& $Post->find(10, array('include' => 'tags'))); 
     411        $this->assertTrue($Post =& $Post->find(10, array('include' => 'tags','order' => '_tags.id ASC'))); 
    426412 
    427413        foreach (array_keys($Post->tags) as $k){ 
     
    443429} 
    444430 
     431ak_test('HasAndBelongsToManyTestCase',true); 
    445432 
    446433?> 
  • trunk/test/unit/lib/AkActiveRecord/AkHasMany.php

    r328 r468  
    11<?php 
     2 
     3defined('AK_TEST_DATABASE_ON') ? null : define('AK_TEST_DATABASE_ON', true); 
     4require_once(dirname(__FILE__).'/../../../fixtures/config/config.php'); 
    25 
    36class HasManyTestCase extends AkUnitTest  
    47{ 
    5     /**/ 
     8 
    69    function test_start() 
    710    { 
    8         require_once(AK_LIB_DIR.DS.'AkActiveRecord.php'); 
    9         require_once(AK_LIB_DIR.DS.'AkInstaller.php'); 
    10         require_once(AK_LIB_DIR.DS.'AkActiveRecord'.DS.'AkHasOne.php'); 
    11         require_once(AK_LIB_DIR.DS.'AkActiveRecord'.DS.'AkBelongsTo.php'); 
    12         require_once(AK_APP_DIR.DS.'shared_model.php'); 
    13         require_once(AK_APP_DIR.DS.'installers'.DS.'framework_installer.php'); 
    14         $installer = new FrameworkInstaller(); 
    15         $installer->uninstall(); 
    16         $installer->install(); 
    17         $models = array('Picture', 'Thumbnail','Panorama', 'Property', 'PropertyType'); 
    18         foreach ($models as $model){ 
    19             require_once(AK_APP_DIR.DS.'installers'.DS.AkInflector::underscore($model).'_installer.php'); 
    20             require_once(AK_MODELS_DIR.DS.AkInflector::underscore($model).'.php'); 
    21             $installer_name = $model.'Installer'; 
    22             $installer = new $installer_name(); 
    23             $installer->uninstall(); 
    24             $installer->install(); 
    25         } 
    26         unset($_SESSION['__activeRecordColumnsSettingsCache']); 
     11        $this->installAndIncludeModels(array('Picture', 'Thumbnail','Panorama', 'Property', 'PropertyType')); 
    2712    } 
    2813 
     
    281266        $this->assertTrue($Post =& $Post->find(10, array('include' => 'comments'))); 
    282267         
    283          
     268        // order cannot be guaranteed!  
     269        $expected_ids = array(1,2,3,4,5);              // on my postgreSQL $Post->comment->associated_ids = array(5,4,3,2,1); 
    284270        foreach (array_keys($Post->comments) as $k){ 
    285             $this->assertEqual($Post->comments[$k]->getId(), $k+1); 
     271            $this->assertTrue(in_array($Post->comments[$k]->getId(),$expected_ids)); 
     272            unset($expected_ids[$Post->comments[$k]->getId()-1]); 
    286273        } 
    287          
     274        $this->assertTrue(empty($expected_ids)); 
     275 
    288276        // Comment 10 should exist but unrelated to a post 
    289277        $this->assertTrue($Comment =& $Post->comments[$k]->find(10)); 
     
    298286} 
    299287 
     288ak_test('HasManyTestCase',true); 
    300289 
    301290?> 
  • trunk/test/unit/lib/AkActiveRecord/AkObserver.php

    r217 r468  
    88 
    99 
    10 class test_AkActiveRecord_observer extends  UnitTestCase 
     10class test_AkActiveRecord_observer extends  AkUnitTest 
    1111{ 
    12     var $_testing_models_to_delete = array(); 
    13     var $_testing_model_databases_to_delete = array(); 
    1412 
    15     function test_AkActiveRecord_observer() 
     13    function test_start() 
    1614    { 
    17         parent::UnitTestCase(); 
    18         $this->_createNewTestingModelDatabase('AkTestObservedPerson'); 
    19         $this->_createNewTestingModelDatabase('AkTestObservedAccount'); 
    20         $this->_createNewTestingModel('AkTestObservedPerson'); 
    21         $this->_createNewTestingModel('AkTestObservedAccount'); 
    22         $this->_createNewTestingModel('AkTestObservedPersonObserver'); 
    23         $this->_createNewTestingModel('AkTestAuditor'); 
     15        $this->installAndIncludeModels(array( 
     16            'ObservedAccount'=>'id, balance, created_at, updated_at', 
     17            'ObservedPerson'=>'id, user_name, first_name, last_name, city, state')); 
     18        Ak::import('TestAuditor','ObservedPersonObserver'); 
    2419    } 
    2520 
    26     function setUp() 
     21    function Test_of__instantiateDefaultObserver() 
    2722    { 
    28     } 
    29  
    30     function tearDown() 
    31     { 
    32         unset($_SESSION['__activeRecordColumnsSettingsCache']); 
    33     } 
    34  
    35  
    36     function _createNewTestingModel($test_model_name) 
    37     { 
    38  
    39         static $shutdown_called; 
    40         switch ($test_model_name) { 
    41  
    42             case 'AkTestObservedPerson': 
    43             $model_source = 
    44             '<?php 
    45     class AkTestObservedPerson extends AkActiveRecord  
    46     {  
    47     }  
    48 ?>'; 
    49             break; 
    50  
    51             case 'AkTestObservedAccount': 
    52             $model_source = 
    53             '<?php 
    54     class AkTestObservedAccount extends AkActiveRecord  
    55     { 
    56     }  
    57 ?>'; 
    58             break; 
    59  
    60             case 'AkTestObservedPersonObserver': 
    61             $model_source = 
    62             '<?php 
    63     class AkTestObservedPersonObserver extends AkObserver  
    64     { 
    65         function update($state) 
    66         { 
    67             switch ($state) 
    68             { 
    69                 case "new person created" : 
    70                 echo $state; 
    71                 break; 
    72                 default: 
    73                 break; 
    74             } 
    75         } 
    76          
    77         function afterCreate(&$record) 
    78         { 
    79             echo $record->get("first_name")." has been email with account details"; 
    80             $this->logNotified($record,__FUNCTION__); 
    81         } 
    82          
    83         function afterSave(&$record){$this->logNotified($record,__FUNCTION__);} 
    84         function afterValidationOnCreate(&$record){$this->logNotified($record,__FUNCTION__);} 
    85         function afterValidationOnUpdate(&$record){$this->logNotified($record,__FUNCTION__);} 
    86         function beforeSave(&$record){$this->logNotified($record,__FUNCTION__); 
    87             if(!empty($record->city) && $record->city == "Carlet") 
    88             { 
    89                 $record->state = "Valencia"; 
    90             } 
    91         } 
    92         function beforeCreate(&$record){$this->logNotified($record,__FUNCTION__); } 
    93         function beforeValidationOnCreate(&$record){$this->logNotified($record,__FUNCTION__);} 
    94         function beforeValidation(&$record){$this->logNotified($record,__FUNCTION__);} 
    95         function afterValidation(&$record) {$this->logNotified($record,__FUNCTION__);} 
    96  
    97         function logNotified(&$record, $function) 
    98         { 
    99             if(!isset($record->notified_observers[$function])){ 
    100                 $record->notified_observers[$function] = 0; 
    101             } 
    102             $record->notified_observers[$function]++; 
    103         } 
    104  
    105     } 
    106 ?>'; 
    107             break; 
    108  
    109  
    110             case 'AkTestAuditor': 
    111             $model_source = 
    112             '<?php 
    113     class AkTestAuditor extends AkObserver  
    114     {  
    115         function update($state) 
    116         { 
    117             switch ($state) 
    118             { 
    119                 case "new person created" : 
    120                 echo $state; 
    121                 break; 
    122                 default: 
    123                 break; 
    124             } 
    125         } 
    126          
    127         function afterCreate(&$record) 
    128         { 
    129             $record->audited = true; 
    130         } 
    131  
    132     } 
    133 ?>'; 
    134             break; 
    135  
    136             default: 
    137             $model_source = '<?php class '.$test_model_name.' extends AkActiveRecord { } ?>'; 
    138             break; 
    139         } 
    140  
    141         $file_name = AkInflector::toModelFilename($test_model_name); 
    142  
    143         if(!Ak::file_put_contents($file_name,$model_source)){ 
    144             die('Ooops!, in order to perform this test, you must set your app/model permissions so this can script can create and delete files into/from it'); 
    145         } 
    146         if(!in_array($file_name, get_included_files()) && !class_exists($test_model_name)){ 
    147             include($file_name); 
    148         }else { 
    149             return false; 
    150         } 
    151         $this->_testing_models_to_delete[] = $file_name; 
    152         if(!isset($shutdown_called)){ 
    153             $shutdown_called = true; 
    154             register_shutdown_function(array(&$this,'_deleteTestingModels')); 
    155         } 
    156         return true; 
    157     } 
    158  
    159     function _deleteTestingModels() 
    160     { 
    161         foreach ($this->_testing_models_to_delete as $file){ 
    162             Ak::file_delete($file); 
    163         } 
    164     } 
    165  
    166  
    167  
    168  
    169     function _createNewTestingModelDatabase($test_model_name) 
    170     { 
    171         static $shutdown_called; 
    172         // Create a data dictionary object, using this connection 
    173         $db =& AK::db(); 
    174         //$db->debug = true; 
    175         $table_name = AkInflector::tableize($test_model_name); 
    176         if(in_array($table_name, (array)$db->MetaTables())){ 
    177             return false; 
    178         } 
    179         switch ($table_name) { 
    180             case 'ak_test_observed_people': 
    181             $table = 
    182             array( 
    183             'table_name' => 'ak_test_observed_people', 
    184             'fields' => 'id I AUTO KEY, 
    185             user_name C(32),  
    186             first_name C(200),  
    187             last_name C(200),  
    188             phone_number I(18),  
    189             city C(40),  
    190             state C(40),  
    191             email C(150),  
    192             country C(2),  
    193             sex C(1),  
    194             birth T,  
    195             age I(3),  
    196             password C(32),  
    197             tos L(1),  
    198             score I(3),  
    199             comments X,  
    200             created_at T,  
    201             updated_at T,  
    202             expires T', 
    203             'index_fileds' => 'id', 
    204             'table_options' => array('mysql' => 'TYPE=InnoDB', 'REPLACE') 
    205             ); 
    206             break; 
    207  
    208             case 'ak_test_observed_accounts': 
    209             $table = 
    210             array( 
    211             'table_name' => 'ak_test_observed_accounts', 
    212             'fields' => 'id I AUTO KEY, 
    213             balance C(32),  
    214             ak_test_observed_person_id I, 
    215             created_at T,  
    216             updated_at T', 
    217             'index_fileds' => 'id', 
    218             'table_options' => array('mysql' => 'TYPE=InnoDB', 'REPLACE') 
    219             ); 
    220             break; 
    221  
    222             default: 
    223             return false; 
    224             break; 
    225         } 
    226  
    227         $dict = NewDataDictionary($db); 
    228         $sqlarray = $dict->CreateTableSQL($table['table_name'], $table['fields'], $table['table_options']); 
    229         $dict->ExecuteSQLArray($sqlarray); 
    230         if(isset($table['index_fileds'])){ 
    231             $sqlarray = $dict->CreateIndexSQL('idx_'.$table['table_name'], $table['table_name'], $table['index_fileds']); 
    232             $dict->ExecuteSQLArray($sqlarray); 
    233         } 
    234  
    235         $db->CreateSequence('seq_'.$table['table_name']); 
    236  
    237         $this->_testing_model_databases_to_delete[] = $table_name; 
    238         if(!isset($shutdown_called)){ 
    239             $shutdown_called = true; 
    240             register_shutdown_function(array(&$this,'_deleteTestingModelDatabases')); 
    241         } 
    242         //$db->debug = false; 
    243         return true; 
    244     } 
    245  
    246     function _deleteTestingModelDatabases() 
    247     { 
    248         $db =& AK::db(); 
    249         foreach ($this->_testing_model_databases_to_delete as $table_name){ 
    250             $db->Execute('DROP TABLE '.$table_name); 
    251             $db->DropSequence('seq_'.$table_name); 
    252         } 
    253     } 
    254  
    255  
    256  
    257     function Test_of__instatiateDefaultObserver() 
    258     { 
    259         $Observed = new AkTestObservedPerson(); 
     23        $Observed = new ObservedPerson(); 
    26024        $ObeserversReference =& $Observed->getObservers(); 
    261         $this->assertEqual(strtolower(get_class($ObeserversReference[0])), 'aktestobservedpersonobserver'); 
     25        $this->assertEqual(strtolower(get_class($ObeserversReference[0])), 'observedpersonobserver'); 
    26226    } 
    26327 
    26428    function Test_of_addObserver() 
    26529    { 
    266         $Observed = new AkTestObservedPerson(); 
     30        $Observed = new ObservedPerson(); 
    26731 
    26832        $null = null; 
    269         $Observer =& Ak::singleton('AkTestObservedPersonObserver', $null); 
     33        $Observer =& Ak::singleton('ObservedPersonObserver', $null); 
    27034         
    271         $params = 'AkTestObservedAccount'; 
    272         $Auditor =& Ak::singleton('AkTestAuditor',$params); 
     35        $params = 'ObservedAccount'; 
     36        $Auditor =& Ak::singleton('TestAuditor',$params); 
    27337        $Auditor->observe(&$Observed); 
    27438 
     
    28448    function Test_of_addObserver2() 
    28549    { 
    286         $ObservedPerson =& new AkTestObservedPerson(); 
     50        $ObservedPerson =& new ObservedPerson(); 
    28751 
    28852        $ObeserversReference =& $ObservedPerson->getObservers(); 
    289         $this->assertEqual(strtolower(get_class($ObeserversReference[0])), 'aktestobservedpersonobserver'); 
     53        $this->assertEqual(strtolower(get_class($ObeserversReference[0])), 'observedpersonobserver'); 
    29054        $this->assertEqual($ObeserversReference[0]->message, 'Hello. I come from the past'); 
    291         $this->assertEqual(strtolower(get_class($ObeserversReference[1])), 'aktestauditor'); 
     55        $this->assertEqual(strtolower(get_class($ObeserversReference[1])), 'testauditor'); 
    29256 
    293         $ObservedAccount =& new AkTestObservedAccount(); 
     57        $ObservedAccount =& new ObservedAccount(); 
    29458        $ObeserversReference =& $ObservedAccount->getObservers(); 
    295         $this->assertEqual(strtolower(get_class($ObeserversReference[0])), 'aktestauditor'); 
     59        $this->assertEqual(strtolower(get_class($ObeserversReference[0])), 'testauditor'); 
    29660    } 
    29761 
    29862    function __Test_of_setObservableState_and_getObservableState() 
    29963    { 
    300         $ObservedAccount1 =& new AkTestObservedAccount(); 
     64        $ObservedAccount1 =& new ObservedAccount(); 
    30165        $ObservedAccount1->setObservableState('creating account 1'); 
    30266 
    303         $ObservedAccount2 =& new AkTestObservedAccount(); 
     67        $ObservedAccount2 =& new ObservedAccount(); 
    30468        $ObservedAccount2->setObservableState('creating account 2'); 
    30569 
     
    31074    function Test_of_notifyObservers() 
    31175    { 
    312         $ObservedPerson =& new AkTestObservedPerson(); 
     76        $ObservedPerson =& new ObservedPerson(); 
    31377        $ObservedPerson->setObservableState('new person created'); 
    31478 
     
    32690    function Test_of_default_Active_record_observer_triggers() 
    32791    { 
    328         $ObservedPerson =& new AkTestObservedPerson('first_name->','Bermi'); 
     92        $ObservedPerson =& new ObservedPerson('first_name->','Bermi'); 
    32993         
    33094        $this->assertTrue(empty($ObservedPerson->audited)); 
     
    358122    function Test_of_beforeSave_trigger() 
    359123    { 
    360         $ObservedPerson =& new AkTestObservedPerson(); 
     124        $ObservedPerson =& new ObservedPerson(); 
    361125         
    362126        $ObservedPerson->city = "Carlet"; 
     127        $ObservedPerson->state = "Madrid"; 
    363128         
    364129        ob_start(); 
    365         $ObservedPerson->save(); 
     130        $this->assertTrue($ObservedPerson->save()); 
    366131        ob_end_clean(); 
    367          
    368         $this->assertEqual($ObservedPerson->state, "Valencia"); 
    369          
     132        $this->assertTrue($ObservedPerson->reload()); 
     133        $this->assertEqual($ObservedPerson->get('state'), "Valencia"); 
    370134    } 
    371135     
  • trunk/test/unit/lib/AkActiveRecord/AkValidation.php

    r299 r468  
    1010class test_AkActiveRecord_validators extends  AkUnitTest 
    1111{ 
    12     var $_testing_models_to_delete = array(); 
    13     var $_testing_model_databases_to_delete = array(); 
    14  
    15     function test_AkActiveRecord_validators() 
    16     { 
    17         parent::UnitTestCase(); 
    18         $this->_createNewTestingModelDatabase('AkTestPerson'); 
    19         $this->_createNewTestingModel('AkTestPerson'); 
    20  
     12 
     13    function test_start() 
     14    { 
     15        $this->installAndIncludeModels( 
     16            array('TestPerson'=> 
     17               'id,  
     18                user_name string(32),  
     19                first_name string(200),  
     20                last_name string(200),  
     21                city string(40),  
     22                state string(40),  
     23                email string(150),  
     24                country string(2),  
     25                age int,  
     26                password string(32),  
     27                tos boolean,  
     28                score int'  
     29            )); 
     30         
    2131        $this->installAndIncludeModels(array('Picture', 'Landlord')); 
    2232    } 
    2333 
    24     function setUp() 
    25     { 
    26     } 
    27  
    28     function tearDown() 
    29     { 
    30         unset($_SESSION['__activeRecordColumnsSettingsCache']); 
    31     } 
    32  
    33  
    34     function _createNewTestingModel($test_model_name) 
    35     { 
    36  
    37         static $shutdown_called; 
    38         switch ($test_model_name) { 
    39  
    40             case 'AkTestPerson': 
    41             $model_source = 
    42             '<?php 
    43     class AkTestPerson extends AkActiveRecord  
    44     {  
    45         function validate() 
    46         { 
    47             $this->validatesPresenceOf("first_name");             
    48         } 
    49          
    50         function validateOnCreate() 
    51         { 
    52             $this->validatesAcceptanceOf("tos"); 
    53         } 
    54          
    55         function validateOnUpdate() 
    56         { 
    57             $this->validatesPresenceOf("email"); 
    58         } 
    59      
    60     }  
    61 ?>'; 
    62             break; 
    63  
    64             default: 
    65             $model_source = '<?php class '.$test_model_name.' extends AkActiveRecord { } ?>'; 
    66             break; 
    67         } 
    68  
    69         $file_name = AkInflector::toModelFilename($test_model_name); 
    70  
    71         if(!Ak::file_put_contents($file_name,$model_source)){ 
    72             die('Ooops!, in order to perform this test, you must set your app/model permissions so this can script can create and delete files into/from it'); 
    73         } 
    74         if(!in_array($file_name, get_included_files()) && !class_exists($test_model_name)){ 
    75             include($file_name); 
    76         }else { 
    77             return false; 
    78         } 
    79         $this->_testing_models_to_delete[] = $file_name; 
    80         if(!isset($shutdown_called)){ 
    81             $shutdown_called = true; 
    82             register_shutdown_function(array(&$this,'_deleteTestingModels')); 
    83         } 
    84         return true; 
    85     } 
    86  
    87     function _deleteTestingModels() 
    88     { 
    89         foreach ($this->_testing_models_to_delete as $file){ 
    90             Ak::file_delete($file); 
    91         } 
    92     } 
    93  
    94  
    95  
    96  
    97     function _createNewTestingModelDatabase($test_model_name) 
    98     { 
    99         static $shutdown_called; 
    100         // Create a data dictionary object, using this connection 
    101         $db =& AK::db(); 
    102         //$db->debug = true; 
    103         $table_name = AkInflector::tableize($test_model_name); 
    104         if(in_array($table_name, (array)$db->MetaTables())){ 
    105             return false; 
    106         } 
    107         switch ($table_name) { 
    108             case 'ak_test_people': 
    109             $table = 
    110             array( 
    111             'table_name' => 'ak_test_people', 
    112             'fields' => 'id I AUTO KEY, 
    113             user_name C(32),  
    114             first_name C(200),  
    115             last_name C(200),  
    116             phone_number I(18),  
    117             city C(40),  
    118             state C(40),  
    119             email C(150),  
    120             country C(2),  
    121             sex C(1),  
    122             birth T,  
    123             age I(3),  
    124             password C(32),  
    125             tos L(1),  
    126             score I(3),  
    127             comments X,  
    128             created_at T,  
    129             updated_at T,  
    130             expires T', 
    131             'index_fileds' => 'id', 
    132             'table_options' => array('mysql' => 'TYPE=InnoDB', 'REPLACE') 
    133             ); 
    134             break; 
    135             default: 
    136             return false; 
    137             break; 
    138         } 
    139  
    140         $dict = NewDataDictionary($db); 
    141         $sqlarray = $dict->CreateTableSQL($table['table_name'], $table['fields'], $table['table_options']); 
    142         $dict->ExecuteSQLArray($sqlarray); 
    143         if(isset($table['index_fileds'])){ 
    144             $sqlarray = $dict->CreateIndexSQL('idx_'.$table['table_name'], $table['table_name'], $table['index_fileds']); 
    145             $dict->ExecuteSQLArray($sqlarray); 
    146         } 
    147  
    148         $db->CreateSequence('seq_'.$table['table_name']); 
    149  
    150         $this->_testing_model_databases_to_delete[] = $table_name; 
    151         if(!isset($shutdown_called)){ 
    152             $shutdown_called = true; 
    153             register_shutdown_function(array(&$this,'_deleteTestingModelDatabases')); 
    154         } 
    155         //$db->debug = false; 
    156         return true; 
    157     } 
    158  
    159     function _deleteTestingModelDatabases() 
    160     { 
    161         $db =& AK::db(); 
    162         foreach ($this->_testing_model_databases_to_delete as $table_name){ 
    163             $db->Execute('DROP TABLE '.$table_name); 
    164             $db->DropSequence('seq_'.$table_name); 
    165         } 
    166     } 
    167  
    168  
    16934    function Test_of_isBlank() 
    17035    { 
    171         $Person = new AkTestPerson(); 
     36        $Person = new TestPerson(); 
    17237        $this->assertTrue($Person->isBlank()); 
    17338        $this->assertTrue($Person->isBlank('')); 
     
    18045    function Test_of_addError() 
    18146    { 
    182         $Person = new AkTestPerson(); 
     47        $Person = new TestPerson(); 
    18348        $Person->addError('user_name'); 
    18449        $this->assertTrue(count($Person->_errors['user_name']) == 1); 
     
    19358    function Test_of_clearErrors() 
    19459    { 
    195         $Person = new AkTestPerson(); 
     60        $Person = new TestPerson(); 
    19661        $Person->addError('user_name'); 
    19762        $Person->addError('user_name','has an error'); 
     
    20368    function Test_of_hasErrors() 
    20469    { 
    205         $Person = new AkTestPerson(); 
     70        $Person = new TestPerson(); 
    20671        $this->assertFalse($Person->hasErrors()); 
    20772        $Person->addError('user_name'); 
     
    21176    function Test_of_getErrorsOn() 
    21277    { 
    213         $Person = new AkTestPerson(); 
     78        $Person = new TestPerson(); 
    21479        $this->assertFalse($Person->getErrorsOn('user_name')); 
    21580        $Person->addError('user_name'); 
     
    22186    function Test_of_countErrors() 
    22287    { 
    223         $Person = new AkTestPerson(); 
     88        $Person = new TestPerson(); 
    22489        $this->assertEqual($Person->countErrors(), 0); 
    22590        $Person->addError('user_name'); 
     
    23398    function Test_of_isInvalid() 
    23499    { 
    235         $Person = new AkTestPerson(); 
     100        $Person = new TestPerson(); 
    236101        $this->assertFalse($Person->isInvalid('user_name')); 
    237102        $Person->addError('user_name'); 
     
    241106    function Test_of_getErrors() 
    242107    { 
    243         $Person = new AkTestPerson(); 
     108        $Person = new TestPerson(); 
    244109        $this->assertTrue(is_array($Person->getErrors())); 
    245110        $this->assertEqual(count($Person->getErrors()), 0); 
     
    260125    function Test_of_getFullErrorMessages() 
    261126    { 
    262         $Person = new AkTestPerson(); 
     127        $Person = new TestPerson(); 
    263128        $this->assertTrue(is_array($Person->getFullErrorMessages())); 
    264129        $this->assertEqual(count($Person->getFullErrorMessages()), 0); 
     
    280145    function Test_of_addErrorOnEmpty() 
    281146    { 
    282         $Person = new AkTestPerson(); 
     147        $Person = new TestPerson(); 
    283148        $Person->addErrorOnEmpty('user_name'); 
    284149        $expected = array('user_name'=>array($Person->_defaultErrorMessages['empty'])); 
     
    292157    function Test_of_addErrorOnBlank() 
    293158    { 
    294         $Person = new AkTestPerson(); 
     159        $Person = new TestPerson(); 
    295160        $Person->addErrorOnBlank('user_name'); 
    296161        $expected = array('user_name'=>array($Person->_defaultErrorMessages['blank'])); 
     
    304169    function Test_of_addErrorOnBoundaryBreaking() 
    305170    { 
    306         $Person = new AkTestPerson(); 
     171        $Person = new TestPerson(); 
    307172        $Person->set('age',17); 
    308173        $Person->addErrorOnBoundaryBreaking('age',18,65,'too old','too young'); 
     
    310175        $this->assertEqual($Person->getErrors(), $expected); 
    311176 
    312         $Person = new AkTestPerson(); 
     177        $Person = new TestPerson(); 
    313178        $Person->set('age',66); 
    314179        $Person->addErrorOnBoundaryBreaking('age',18,65,'too old','too young'); 
     
    316181        $this->assertEqual($Person->getErrors(), $expected); 
    317182 
    318         $Person = new AkTestPerson(); 
     183        $Person = new TestPerson(); 
    319184        $Person->set('age',65); 
    320185        $Person->addErrorOnBoundaryBreaking('age',18,65,'too old','too young'); 
     
    333198    function Test_of_addErrorToBase() 
    334199    { 
    335         $Person = new AkTestPerson(); 
     200        $Person = new TestPerson(); 
    336201        $Person->addErrorToBase('Nothing has changed'); 
    337         $expected = array('AkTestPerson'=>array('Nothing has changed')); 
    338         $this->assertEqual($Person->getErrors(), $expected); 
    339         $expected = array('AkTestPerson'=>array('Nothing has changed','Nothing has changed at all')); 
     202        $expected = array('TestPerson'=>array('Nothing has changed')); 
     203        $this->assertEqual($Person->getErrors(), $expected); 
     204        $expected = array('TestPerson'=>array('Nothing has changed','Nothing has changed at all')); 
    340205        $Person->addErrorToBase('Nothing has changed at all'); 
    341206        $this->assertEqual($Person->getErrors(), $expected); 
     
    344209    function Test_of_getBaseErrors() 
    345210    { 
    346         $Person = new AkTestPerson(); 
     211        $Person = new TestPerson(); 
    347212        $this->assertEqual($Person->getBaseErrors(), array()); 
    348213        $Person->addErrorToBase('Nothing has changed'); 
     
    358223    function Test_of_errorsToString() 
    359224    { 
    360         $Person = new AkTestPerson(); 
     225        $Person = new TestPerson(); 
    361226        $Person->addErrorOnBlank('user_name'); 
    362227        $Person->addErrorOnBlank('first_name'); 
     
    368233    function Test_of_validatesConfirmationOf() 
    369234    { 
    370         $Person = new AkTestPerson(); 
     235        $Person = new TestPerson(); 
    371236        $Person->validatesConfirmationOf('user_name'); 
    372237        $this->assertFalse($Person->hasErrors()); 
     
    380245        $this->assertEqual($Person->getErrorsOn('user_name'),$Person->_defaultErrorMessages['confirmation']); 
    381246 
    382         $Person = new AkTestPerson(); 
     247        $Person = new TestPerson(); 
    383248        $Person->set('user_name', 'Bermi'); 
    384249        $Person->user_name_confirmation = 'bermi'; 
     
    386251        $this->assertEqual($Person->getErrorsOn('user_name'),$Person->_defaultErrorMessages['confirmation']); 
    387252 
    388         $Person = new AkTestPerson(); 
     253        $Person = new TestPerson(); 
    389254        $Person->setAttributes(array('password'=>'abc','password_confirmation'=>'ake')); 
    390255        $Person->validatesConfirmationOf('password'); 
     
    395260    function Test_of_validatesAcceptanceOf() 
    396261    { 
    397         $Person = new AkTestPerson(); 
     262        $Person = new TestPerson(); 
    398263        $Person->validatesAcceptanceOf('tos'); 
    399264        $this->assertEqual($Person->getErrorsOn('tos'),$Person->_defaultErrorMessages['accepted']); 
    400265 
    401         $Person = new AkTestPerson(); 
     266        $Person = new TestPerson(); 
    402267        $Person->validatesAcceptanceOf('tos','You need to type down "I accept this terms and conditions"',"I accept this terms and conditions"); 
    403268        $this->assertEqual($Person->getErrorsOn('tos'),'You need to type down "I accept this terms and conditions"'); 
     
    410275    function Test_of_validatesPresenceOf() 
    411276    { 
    412         $Person = new AkTestPerson(); 
     277        $Person = new TestPerson(); 
    413278        $Person->validatesPresenceOf('user_name'); 
    414279        $this->assertEqual($Person->getErrorsOn('user_name'),$Person->_defaultErrorMessages['blank']); 
    415280 
    416         $Person = new AkTestPerson(); 
     281        $Person = new TestPerson(); 
    417282        $Person->validatesPresenceOf('user_name','is a compulsory field'); 
    418283        $this->assertEqual($Person->getErrorsOn('user_name'),'is a compulsory field'); 
     
    426291    function Test_of_validatesLengthOf() 
    427292    { 
    428         $Person = new AkTestPerson(); 
     293        $Person = new TestPerson(); 
    429294 
    430295        $Person->city = 'Vilanova i la Geltrí'; 
     
    516381    function Test_of_validatesUniquenessOf() 
    517382    { 
    518         $Person = new AkTestPerson('user_name->','bermi','first_name->','Bermi','last_name->','Ferrer','country->','ES','tos->',1); 
     383        $Person = new TestPerson('user_name->','bermi','first_name->','Bermi','last_name->','Ferrer','country->','ES','tos->',1); 
    519384        $this->assertTrue($Person->save()); 
    520385 
    521         $Person = new AkTestPerson('user_name->','bermi','first_name->','Bermi','last_name->','Ferrer'); 
     386        $Person = new TestPerson('user_name->','bermi','first_name->','Bermi','last_name->','Ferrer'); 
    522387        $Person->validatesUniquenessOf("user_name"); 
    523388        $this->assertTrue($Person->hasErrors()); 
    524389 
    525         $Person = $Person->findFirst(array('username = ?','bermi')); 
     390        $Person = $Person->findFirst(array('user_name' => 'bermi')); 
     391        $this->assertEqual($Person->user_name,'bermi'); 
    526392        $Person->validatesUniquenessOf("user_name"); 
    527393        $this->assertFalse($Person->hasErrors()); 
    528394 
    529395 
    530         $Person = $Person->findFirst(array('username = ?','bermi')); 
     396        $Person = $Person->findFirst(array('user_name = ?','bermi')); 
    531397        $Person->validatesUniquenessOf("user_name",array('scope'=>'country')); 
    532398        $this->assertFalse($Person->hasErrors()); 
    533399 
    534         $Person = new AkTestPerson('user_name->','bermi','first_name->','Bermi','last_name->','Ferrer','country->','US'); 
     400        $Person = new TestPerson('user_name->','bermi','first_name->','Bermi','last_name->','Ferrer','country->','US'); 
    535401        $Person->validatesUniquenessOf("user_name",array('scope'=>'country')); 
    536402        $this->assertFalse($Person->hasErrors()); 
    537403 
    538         $Person = new AkTestPerson('user_name->','bermi','first_name->','Bermi','last_name->','Ferrer','country->','ES'); 
     404        $Person = new TestPerson('user_name->','bermi','first_name->','Bermi','last_name->','Ferrer','country->','ES'); 
    539405        $Person->validatesUniquenessOf("user_name",array('scope'=>'country')); 
    540406        $this->assertTrue($Person->hasErrors()); 
     
    544410    function Test_of_validatesUniquenessOfUsingMultipleScopes() 
    545411    { 
    546         $Person = new AkTestPerson('user_name->','admin','first_name->','Sam','last_name->','','country->','ES','tos->',1); 
     412        $Person = new TestPerson('user_name->','admin','first_name->','Sam','last_name->','','country->','ES','tos->',1); 
    547413        $this->assertTrue($Person->save()); 
    548414 
    549         $Person = new AkTestPerson('user_name->','admin','first_name->','Sam','last_name->','','country->','FR','tos->',1); 
     415        $Person = new TestPerson('user_name->','admin','first_name->','Sam','last_name->','','country->','FR','tos->',1); 
    550416        $Person->validatesUniquenessOf("user_name",array('scope'=>'first_name')); 
    551417        $this->assertTrue($Person->hasErrors()); 
    552418 
    553         $Person = new AkTestPerson('user_name->','admin','first_name->','Sam','last_name->','','country->','FR','tos->',1); 
     419        $Person = new TestPerson('user_name->','admin','first_name->','Sam','last_name->','','country->','FR','tos->',1); 
    554420        $Person->validatesUniquenessOf("user_name",array('scope'=>array('first_name','country'))); 
    555421        $this->assertFalse($Person->hasErrors()); 
     
    559425    function Test_of_validatesUniquenessOfConditionally() 
    560426    { 
    561         $Person = new AkTestPerson('user_name->','james','first_name->','James','last_name->','','country->','ES','tos->',1); 
     427        $Person = new TestPerson('user_name->','james','first_name->','James','last_name->','','country->','ES','tos->',1); 
    562428        $this->assertTrue($Person->save()); 
    563429 
    564         $Person = new AkTestPerson('user_name->','james','first_name->','James','last_name->','','country->','ES','tos->',1); 
     430        $Person = new TestPerson('user_name->','james','first_name->','James','last_name->','','country->','ES','tos->',1); 
    565431        $Person->validatesUniquenessOf("user_name"); 
    566432        $this->assertTrue($Person->hasErrors()); 
    567433 
    568         $Person = new AkTestPerson('user_name->','james','first_name->','James','last_name->','','country->','ES','tos->',1); 
     434        $Person = new TestPerson('user_name->','james','first_name->','James','last_name->','','country->','ES','tos->',1); 
    569435        $Person->force_validation = false; 
    570436        $Person->validatesUniquenessOf("user_name", array('if'=>'$this->force_validation')); 
     
    577443    function Test_of_validatesFormatOf() 
    578444    { 
    579         $Person = new AkTestPerson(); 
     445        $Person = new TestPerson(); 
    580446        $Person->validatesFormatOf('email', AK_EMAIL_REGULAR_EXPRESSION); 
    581447        $this->assertEqual($Person->getErrorsOn('email'),$Person->_defaultErrorMessages['invalid']); 
     
    691557    function Test_of_validatesInclusionOf() 
    692558    { 
    693         $Person = new AkTestPerson(); 
     559        $Person = new TestPerson(); 
    694560        $Person->validatesInclusionOf('gender', array('male', 'female'), "woah! what are you then!??!!"); 
    695561        $this->assertEqual($Person->getErrorsOn('gender'),"woah! what are you then!??!!"); 
     
    710576        $this->assertFalse($Person->hasErrors()); 
    711577 
    712         $Person = new AkTestPerson(); 
     578        $Person = new TestPerson(); 
    713579        $Person->gender = '0'; 
    714580        $Person->validatesInclusionOf('gender', array('male', 'female'),'I need to know your gender', true); 
    715581        $this->assertTrue($Person->hasErrors()); 
    716582 
    717         $Person = new AkTestPerson(); 
     583        $Person = new TestPerson(); 
    718584        $Person->gender = 0; 
    719585        $Person->validatesInclusionOf('gender', array('male', 'female'),'I need to know your gender', true); 
    720586        $this->assertTrue($Person->hasErrors()); 
    721587 
    722         $Person = new AkTestPerson(); 
     588        $Person = new TestPerson(); 
    723589        $Person->gender = null; 
    724590        $Person->validatesInclusionOf('gender', array('male', 'female'),'I need to know your gender', true); 
     
    744610    function Test_of_validatesExclusionOf() 
    745611    { 
    746         $Person = new AkTestPerson(); 
     612        $Person = new TestPerson(); 
    747613        $Person->validatesExclusionOf('gender', array('too much'), "don't lie"); 
    748614        $this->assertEqual($Person->getErrorsOn('gender'),"don't lie"); 
     
    781647    function Test_of_validatesNumericalityOf() 
    782648    { 
    783         $Person = new AkTestPerson(); 
     649        $Person = new TestPerson(); 
    784650 
    785651        $Person->validatesNumericalityOf('age'); 
     
    815681    function Test_of_validateOnCreate() 
    816682    { 
    817         $Person = new AkTestPerson('user_name->','hilario','first_name->','Hilario','last_name->','Hervás','country->','ES','tos->',1); 
     683        $Person = new TestPerson('user_name->','hilario','first_name->','Hilario','last_name->','Hervás','country->','ES','tos->',1); 
    818684        $Person->validateOnCreate(); 
    819685        $this->assertFalse($Person->hasErrors()); 
    820686 
    821         $Person = new AkTestPerson('user_name->','hilario','first_name->','Hilario','last_name->','Hervás','country->','ES'); 
     687        $Person = new TestPerson('user_name->','hilario','first_name->','Hilario','last_name->','Hervás','country->','ES'); 
    822688        $Person->validateOnCreate(); 
    823689        $this->assertEqual($Person->getErrorsOn('tos'),$Person->_defaultErrorMessages['accepted']); 
     
    827693    function Test_of_validateOnUpdate() 
    828694    { 
    829         $Person = new AkTestPerson('email->','email@example.com'); 
     695        $Person = new TestPerson('email->','email@example.com'); 
    830696        $Person->validateOnUpdate(); 
    831697        $this->assertFalse($Person->hasErrors()); 
    832698 
    833         $Person = new AkTestPerson('user_name->','hilario','first_name->','Hilario','last_name->','Hervás','country->','ES'); 
     699        $Person = new TestPerson('user_name->','hilario','first_name->','Hilario','last_name->','Hervás','country->','ES'); 
    834700        $Person->validateOnUpdate(); 
    835701        $this->assertEqual($Person->getErrorsOn('email'),$Person->_defaultErrorMessages['blank']); 
     
    839705    function Test_of_validate() 
    840706    { 
    841         $Person = new AkTestPerson('first_name->','Alicia'); 
     707        $Person = new TestPerson('first_name->','Alicia'); 
    842708        $Person->validate(); 
    843709        $this->assertFalse($Person->hasErrors()); 
    844710 
    845         $Person = new AkTestPerson('last_name->','Sadurní','country->','ES'); 
     711        $Person = new TestPerson('last_name->','Sadurní','country->','ES'); 
    846712        $Person->validate(); 
    847713        $this->assertEqual($Person->getErrorsOn('first_name'),$Person->_defaultErrorMessages['blank']); 
     
    850716    function Test_of_isValid() 
    851717    { 
    852         $Person = new AkTestPerson('country->','ES'); 
     718        $Person = new TestPerson('country->','ES'); 
    853719        $this->assertFalse($Person->isValid()); 
    854720        $this->assertEqual($Person->getErrors(), array('first_name' => array("can't be blank"),'tos' =>array("must be accepted"))); 
    855721 
    856722        $Person->clearErrors(); 
    857         $Person = $Person->findFirst(array('username = ?','bermi')); 
     723        $Person = $Person->findFirst(array('user_name = ?','bermi')); 
    858724        $Person->set('tos',0); 
    859725        $this->assertFalse($Person->isValid()); 
  • trunk/test/unit/lib/AkActiveRecord/_AkActiveRecord_1.php

    r323 r468  
    44require_once(dirname(__FILE__).'/../../../fixtures/config/config.php'); 
    55 
    6 require_once(AK_LIB_DIR.DS.'AkActiveRecord.php'); 
    7  
    8 class test_AkActiveRecord extends  UnitTestCase 
     6class test_AkActiveRecord extends  AkUnitTest  
    97{ 
    10     var $_testing_models_to_delete = array(); 
    11     var $_testing_model_databases_to_delete = array(); 
    128 
    139    function test_AkActiveRecord() 
    1410    { 
    15         parent::UnitTestCase(); 
    16         $this->_createNewTestingModelDatabase('AkTestUser'); 
    17         $this->_createNewTestingModel('AkTestUser'); 
    18          
    19         $this->_createNewTestingModelDatabase('AkTestMember'); 
    20         $this->_createNewTestingModel('AkTestMember'); 
    21  
    22         $this->_createNewTestingModel('AkTestField'); 
    23         $this->_createNewTestingModelDatabase('AkTestField'); 
    24          
    25         $this->_createNewTestingModelDatabase('AkTestComment'); 
    26         $this->_createNewTestingModel('AkTestComment'); 
    27  
    28     } 
    29  
    30     function setUp() 
    31     { 
    32     } 
    33  
    34     function tearDown() 
    35     { 
    36         unset($_SESSION['__activeRecordColumnsSettingsCache']); 
    37     } 
    38  
    39  
    40     function _createNewTestingModel($test_model_name) 
    41     { 
    42  
    43         static $shutdown_called; 
    44         switch ($test_model_name) { 
    45             case 'AkTestUser': 
    46             $model_source = 
    47             '<?php 
    48     class AkTestUser extends AkActiveRecord  
    49     {  
    50         //var $expiresOnDataType = "date"; 
    51         function callBackFunctionCompose() 
    52         { 
    53             $args = func_get_arg(0);  
    54             return "<a href=\'mailto:{$args[\'email\']}\'>{$args[\'name\']}</a>";  
    55         }  
    56         function callBackFunctionDecompose($email_link)  
    57         {  
    58             $results = sscanf($email_link, "<a href=\'mailto:%[^\']\'>%[^<]</a>");  
    59             return array(\'email\'=>$results[0],\'name\'=>$results[1]);  
    60         }  
    61         function getPassword()  
    62         { 
    63             parent::get("password", false); 
    64             return "*********"; 
    65         } 
    66         function setPassword($password) 
    67         { 
    68             parent::set("password", md5($password), false); 
    69         } 
    70     }  
    71 ?>'; 
    72             break; 
    73              
    74             case 'AkTestComment': 
    75             $model_source = 
    76             '<?php class AkTestComment extends AkActiveRecord {  
    77             //var $belongsTo = "AkTestUser"; 
    78             //var $_inheritanceColumn = "ak_test_user_id"; 
    79             } ?>'; 
    80             break; 
    81              
    82              
    83             case 'AkTestMember': 
    84             $model_source = 
    85             '<?php class AkTestMember extends AkTestUser {  
    86             //var $_inheritanceColumn = "ak_test_user_id"; 
    87                 function AkTestMember(){ 
    88                     $this->setTableName("ak_test_members"); 
    89                     $this->init(@(array)func_get_args()); 
    90                 } 
    91             } ?>'; 
    92             break; 
    93  
    94             default: 
    95             $model_source = '<?php class '.$test_model_name.' extends AkActiveRecord { } ?>'; 
    96             break; 
    97         } 
    98  
    99         $file_name = AkInflector::toModelFilename($test_model_name); 
    100          
    101         if(!Ak::file_put_contents($file_name,$model_source)){ 
    102             die('Ooops!, in order to perform this test, you must set your app/model permissions so this can script can create and delete files into/from it'); 
    103         } 
    104         if(!in_array($file_name, get_included_files()) && !class_exists($test_model_name)){ 
    105             include($file_name); 
    106         }else { 
    107             return false; 
    108         } 
    109         $this->_testing_models_to_delete[] = $file_name; 
    110         if(!isset($shutdown_called)){ 
    111             $shutdown_called = true; 
    112             register_shutdown_function(array(&$this,'_deleteTestingModels')); 
    113         } 
    114         return true; 
    115     } 
    116  
    117     function _deleteTestingModels() 
    118     { 
    119         foreach ($this->_testing_models_to_delete as $file){ 
    120             Ak::file_delete($file); 
    121         } 
    122     } 
    123  
    124  
    125  
    126  
    127     function _createNewTestingModelDatabase($test_model_name) 
    128     { 
    129         static $shutdown_called; 
    130         // Create a data dictionary object, using this connection 
    131         $db =& AK::db(); 
    132         //$db->debug = true; 
    133         $table_name = AkInflector::tableize($test_model_name); 
    134         if(in_array($table_name, (array)$db->MetaTables())){ 
    135             return false; 
    136         } 
    137         switch ($table_name) { 
    138             case 'ak_test_users': 
    139             $table = 
    140             array( 
    141             'table_name' => 'ak_test_users', 
    142             'fields' => 'id I AUTO KEY, user_name C(32), first_name C(200), last_name C(200), email C(150), country I, password C(32), created_at T, updated_at T, expires_on T', 
    143             'index_fileds' => 'id', 
    144             'table_options' => array('mysql' => 'TYPE=InnoDB', 'REPLACE') 
    145             ); 
    146             break; 
    147             case 'ak_test_members': 
    148             $table = 
    149             array( 
    150             'table_name' => 'ak_test_members', 
    151             'fields' => 'ak_test_user_id I, role C(25)', 
    152             'table_options' => array('mysql' => 'TYPE=InnoDB', 'REPLACE') 
    153             ); 
    154             break; 
    155             case 'ak_test_comments': 
    156             $table = 
    157             array( 
    158             'table_name' => 'ak_test_comments', 
    159             'fields' => 'id I AUTO KEY, ak_test_user_id I, private_comment L(1), birth_date T', 
    160             'index_fileds' => 'id', 
    161             'table_options' => array('mysql' => 'TYPE=InnoDB', 'REPLACE') 
    162             ); 
    163             break; 
    164             case 'ak_test_fields': 
    165             $table = 
    166             array( 
    167             'table_name' => 'ak_test_fields', 
    168             'fields' => 'id I AUTO KEY, 
    169                     varchar_field C(255),  
    170                     longtext_field XL,  
    171                     text_field X,  
    172                     logblob_field B,             
    173                     date_field D,  
    174                     datetime_field T,  
    175                     tinyint_field L(2), 
    176                     integer_field I,  
    177                     smallint_field I2,  
    178                     bigint_field I8,  
    179                     double_field F, 
    180                     numeric_field N, 
    181                     bytea_field B, 
    182                     timestamp_field T, 
    183                     boolean_field L(1),  
    184                     int2_field I2,  
    185                     int4_field I4,  
    186                     int8_field I8,  
    187                     foat_field F, 
    188                     varchar4000_field X,  
    189                     clob_field XL,  
    190                     nvarchar2000_field X2, 
    191                     blob_field B, 
    192                     nvarchar_field C2(255), 
    193                     decimal1_field L(2),  
    194                     decimal3_field I1,  
    195                     decimal5_field I2,  
    196                     decimal10_field I4, 
    197                     decimal20_field I8, 
    198                     decimal_field N, 
    199                     created_at T,  
    200                     updated_at T,  
    201                     expires_on T', 
    202             'index_fileds' => 'id', 
    203             'table_options' => array('mysql' => 'TYPE=InnoDB', 'REPLACE') 
    204             ); 
    205             break; 
    206             default: 
    207             return false; 
    208             break; 
    209         } 
    210  
    211         $dict = NewDataDictionary($db); 
    212         $sqlarray = $dict->CreateTableSQL($table['table_name'], $table['fields'], $table['table_options']); 
    213         $dict->ExecuteSQLArray($sqlarray); 
    214         if(isset($table['index_fileds'])){ 
    215             $sqlarray = $dict->CreateIndexSQL('idx_'.$table['table_name'], $table['table_name'], $table['index_fileds']); 
    216             $dict->ExecuteSQLArray($sqlarray); 
    217         } 
    218          
    219         strstr($db->databaseType,'sqlite') ? $db->CreateSequence('seq_'.$table['table_name']) : null; 
    220  
    221         $this->_testing_model_databases_to_delete[] = $table_name; 
    222         if(!isset($shutdown_called)){ 
    223             $shutdown_called = true; 
    224             register_shutdown_function(array(&$this,'_deleteTestingModelDatabases')); 
    225         } 
    226         //$db->debug = false; 
    227         return true; 
    228     } 
    229  
    230     function _deleteTestingModelDatabases() 
    231     { 
    232         $db =& AK::db(); 
    233         foreach ($this->_testing_model_databases_to_delete as $table_name){ 
    234             $db->Execute('DROP TABLE '.$table_name); 
    235             strstr($db->databaseType,'sqlite') ? $db->DropSequence('seq_'.$table_name) : null; 
    236         } 
    237     } 
    238  
    239  
    240     /**/ 
    241      
     11        $this->installAndIncludeModels(array( 
     12            'AkTestUser'=>'id I AUTO KEY, user_name C(32), first_name C(200), last_name C(200), email C(150), country I, password C(32), created_at T, updated_at T, expires_on T', 
     13            'AkTestMember'=>'ak_test_user_id I, role C(25)', 
     14            'AkTestComment'=>'id I AUTO KEY, ak_test_user_id I, private_comment L, birth_date T', 
     15            'AkTestField'=>'id I AUTO KEY,varchar_field C(255),longtext_field XL,text_field X,logblob_field B,date_field D,  
     16                    datetime_field T,tinyint_field I2,integer_field I,smallint_field I2,bigint_field I8,double_field F, 
     17                    numeric_field N,bytea_field B,timestamp_field T, 
     18                    boolean_field L,int2_field I2,int4_field I4,int8_field I8,foat_field F,varchar4000_field X,  
     19                    clob_field XL,nvarchar2000_field X2,blob_field B,nvarchar_field C2(255), 
     20                    decimal1_field L,'.//*decimal3_field I1, 
     21                    'decimal5_field I2,decimal10_field I4,decimal20_field I8,decimal_field N, 
     22                    created_at T,updated_at T,expires_on T')); 
     23    } 
     24 
    24225    function Test_of_getArrayFromAkString() 
    24326    { 
     
    27659        $this->assertErrorPattern('/ak_test_user/',$AkTestUser->setTableName('ak_test_user')); 
    27760 
    278         $this->_createNewTestingModel('AkTestUnavailableDatabase'); 
     61        //$this->_createNewTestingModel('AkTestUnavailableDatabase'); 
    27962        //$AkTestUnavailableDatabase = new AkTestUnavailableDatabase(); 
    28063        //$this->assertEqual($AkTestUnavailableDatabase->getModelName(), 'AkTestUnavailableDatabase'); 
    281         ak_define('AK_ACTIVE_RECORD_VALIDATE_TABLE_NAMES', true); 
     64        //ak_define('AK_ACTIVE_RECORD_VALIDATE_TABLE_NAMES', true); 
    28265        //$this->assertErrorPattern('/Ooops! Could not fetch details for the table ak_test_unavailable_database./',$AkTestUnavailableDatabase->getTableName()); 
    28366    } 
     
    360143        $columns = array('id','varchar_field','longtext_field','text_field','logblob_field','date_field','datetime_field','tinyint_field','integer_field','smallint_field', 
    361144        'bigint_field','double_field','numeric_field','bytea_field','timestamp_field','boolean_field','int2_field','int4_field', 
    362         'int8_field','foat_field','varchar4000_field','clob_field','nvarchar2000_field','blob_field','nvarchar_field','decimal1_field','decimal3_field', 
     145        'int8_field','foat_field','varchar4000_field','clob_field','nvarchar2000_field','blob_field','nvarchar_field','decimal1_field',//'decimal3_field', 
    363146        'decimal5_field','decimal10_field','decimal20_field','decimal_field','created_at','updated_at','expires_on' 
    364147        ); 
     
    382165        $columns = array('id','varchar_field','longtext_field','text_field','logblob_field','date_field','datetime_field','tinyint_field','integer_field','smallint_field', 
    383166        'bigint_field','double_field','numeric_field','bytea_field','timestamp_field','boolean_field','int2_field','int4_field', 
    384         'int8_field','foat_field','varchar4000_field','clob_field','nvarchar2000_field','blob_field','nvarchar_field','decimal1_field','decimal3_field', 
     167        'int8_field','foat_field','varchar4000_field','clob_field','nvarchar2000_field','blob_field','nvarchar_field','decimal1_field',//'decimal3_field', 
    385168        'decimal5_field','decimal10_field','decimal20_field','decimal_field','created_at','updated_at','expires_on' 
    386169        ); 
     
    429212    { 
    430213        $AkTestField = new AkTestField(); 
    431         $expected = array ( 'id' => 'Id', 'varchar_field' => 'Varchar field', 'longtext_field' => 'Longtext field', 'text_field' => 'Text field', 'logblob_field' => 'Logblob field', 'date_field' => 'Date field', 'datetime_field' => 'Datetime field', 'tinyint_field' => 'Tinyint field', 'integer_field' => 'Integer field', 'smallint_field' => 'Smallint field', 'bigint_field' => 'Bigint field', 'double_field' => 'Double field', 'numeric_field' => 'Numeric field', 'bytea_field' => 'Bytea field', 'timestamp_field' => 'Timestamp field', 'boolean_field' => 'Boolean field', 'int2_field' => 'Int2 field', 'int4_field' => 'Int4 field', 'int8_field' => 'Int8 field', 'foat_field' => 'Foat field', 'varchar4000_field' => 'Varchar4000 field', 'clob_field' => 'Clob field', 'nvarchar2000_field' => 'Nvarchar2000 field', 'blob_field' => 'Blob field', 'nvarchar_field' => 'Nvarchar field', 'decimal1_field' => 'Decimal1 field', 'decimal3_field' => 'Decimal3 field', 'decimal5_field' => 'Decimal5 field', 'decimal10_field' => 'Decimal10 field', 'decimal20_field' => 'Decimal20 field', 'decimal_field' => 'Decimal field', 'created_at' => 'Created at', 'updated_at' => 'Updated at', 'expires_on' => 'Expires on' ); 
     214        $expected = array ( 'id' => 'Id', 'varchar_field' => 'Varchar field', 'longtext_field' => 'Longtext field', 'text_field' => 'Text field', 'logblob_field' => 'Logblob field', 'date_field' => 'Date field', 'datetime_field' => 'Datetime field', 'tinyint_field' => 'Tinyint field', 'integer_field' => 'Integer field', 'smallint_field' => 'Smallint field', 'bigint_field' => 'Bigint field', 'double_field' => 'Double field', 'numeric_field' => 'Numeric field', 'bytea_field' => 'Bytea field', 'timestamp_field' => 'Timestamp field', 'boolean_field' => 'Boolean field', 'int2_field' => 'Int2 field', 'int4_field' => 'Int4 field', 'int8_field' => 'Int8 field', 'foat_field' => 'Foat field', 'varchar4000_field' => 'Varchar4000 field', 'clob_field' => 'Clob field', 'nvarchar2000_field' => 'Nvarchar2000 field', 'blob_field' => 'Blob field', 'nvarchar_field' => 'Nvarchar field', 'decimal1_field' => 'Decimal1 field', /*'decimal3_field' => 'Decimal3 field',*/ 'decimal5_field' => 'Decimal5 field', 'decimal10_field' => 'Decimal10 field', 'decimal20_field' => 'Decimal20 field', 'decimal_field' => 'Decimal field', 'created_at' => 'Created at', 'updated_at' => 'Updated at', 'expires_on' => 'Expires on' ); 
    432215        $this->assertEqual($AkTestField->getColumnNames(), $expected); 
    433216    } 
     
    484267        'bigint_field'=>'integer', 
    485268        'double_field'=>'float', 
    486         'numeric_field'=>'integer', 
     269        'numeric_field'=>'decimal', 
    487270        'bytea_field'=>'binary', 
    488271        'timestamp_field'=>'datetime', 
     
    497280        'blob_field'=>'binary', 
    498281        'nvarchar_field'=>'string', 
    499         'decimal1_field'=>'integer', 
    500         'decimal3_field'=>'integer', 
     282        'decimal1_field'=>'boolean', 
     283        //'decimal3_field'=>'integer', 
    501284        'decimal5_field'=>'integer', 
    502285        'decimal10_field'=>'integer', 
    503286        'decimal20_field'=>'integer', 
    504         'decimal_field'=>'integer', 
     287        'decimal_field'=>'decimal', 
    505288        'created_at'=>'datetime', 
    506289        'updated_at'=>'datetime', 
     
    708491 
    709492 
    710     function Test_of_getOnlyAvailableAtrributes() 
     493    function Test_of_getOnlyAvailableAttributes() 
    711494    { 
    712495        $User = new AkTestUser(); 
    713496        $User->addCombinedAttributeConfiguration('name', "%s %s", 'first_name', 'last_name'); 
    714497        $attributes = array('name'=>'Bermi Ferrer', 'email' => 'bermi@example.com', 'invalid_field'=>'value'); 
    715         $attributes = $User->getOnlyAvailableAtrributes($attributes); 
     498        $attributes = $User->getOnlyAvailableAttributes($attributes); 
    716499        $this->assertEqual($attributes,array('name'=>'Bermi Ferrer', 'email' => 'bermi@example.com')); 
    717500    } 
    718501     
    719     function Test_of_getColumnsForAtrributes() 
     502    function Test_of_getColumnsForAttributes() 
    720503    { 
    721504        $User = new AkTestUser(); 
    722505        $User->addCombinedAttributeConfiguration('name', "%s %s", 'first_name', 'last_name'); 
    723506        $attributes = array('name'=>'Bermi Ferrer', 'email' => 'bermi@example.com', 'invalid_field'=>'value'); 
    724         $attributes = $User->getColumnsForAtrributes($attributes); 
     507        $attributes = $User->getColumnsForAttributes($attributes); 
    725508        $this->assertEqual($attributes,array('email' => 'bermi@example.com')); 
    726509    } 
     
    859642    } 
    860643 
    861     function Test_of_incrementAttribute() 
    862     { 
    863         $AkTestField = new AkTestField(); 
    864         $AkTestField->set('integer_field', 10); 
    865         $this->assertTrue($AkTestField->integer_field === 10); 
    866         $this->assertTrue($AkTestField->get('integer_field') === 10); 
    867  
    868         $AkTestField->incrementAttribute('integer_field'); 
    869         $this->assertTrue($AkTestField->integer_field === 11); 
    870         $this->assertTrue($AkTestField->get('integer_field') === 11); 
    871  
    872         $AkTestField->incrementAttribute('decimal_field'); 
    873         $this->assertTrue($AkTestField->decimal_field === 0); 
    874         $this->assertTrue($AkTestField->get('decimal_field') === 0); 
    875  
    876         $AkTestField->incrementAttribute('decimal_field'); 
    877         $this->assertTrue($AkTestField->decimal_field === 1); 
    878         $this->assertTrue($AkTestField->get('decimal_field') === 1); 
    879     } 
    880  
    881  
    882     function Test_of_decrementAttribute() 
    883     { 
    884         $AkTestField = new AkTestField(); 
    885         $AkTestField->set('integer_field', 10); 
    886         $this->assertTrue($AkTestField->integer_field === 10); 
    887         $this->assertTrue($AkTestField->get('integer_field') === 10); 
    888  
    889         $AkTestField->decrementAttribute('integer_field'); 
    890         $this->assertTrue($AkTestField->integer_field === 9); 
    891         $this->assertTrue($AkTestField->get('integer_field') === 9); 
    892  
    893         $AkTestField->decrementAttribute('decimal_field'); 
    894         $this->assertTrue($AkTestField->decimal_field === 0); 
    895         $this->assertTrue($AkTestField->get('decimal_field') === 0); 
    896  
    897         $AkTestField->decrementAttribute('decimal_field'); 
    898         $this->assertTrue($AkTestField->decimal_field === -1); 
    899         $this->assertTrue($AkTestField->get('decimal_field') === -1); 
    900     } 
    901  
    902  
    903  
    904  
    905  
    906644    function Test_of_get_and_set_DisplayField() 
    907645    { 
  • trunk/test/unit/lib/AkActiveRecord/_AkActiveRecord_2.php

    r323 r468  
    44require_once(dirname(__FILE__).'/../../../fixtures/config/config.php'); 
    55 
    6 require_once(AK_LIB_DIR.DS.'AkActiveRecord.php'); 
    7  
    8 class test_AkActiveRecord_2 extends  UnitTestCase 
     6class test_AkActiveRecord_2 extends  AkUnitTest  
    97{ 
    10  
    11  
    12     function tearDown() 
    13     { 
    14         unset($_SESSION['__activeRecordColumnsSettingsCache']); 
    15     } 
    16  
     8    function _test_AkActiveRecord() 
     9    { 
     10        $this->installAndIncludeModels(array( 
     11            'AkTestUser'=>'id I AUTO KEY, user_name C(32), first_name C(200), last_name C(200), email C(150), country I, password C(32), created_at T, updated_at T, expires_on T', 
     12            'AkTestMember'=>'ak_test_user_id I, role C(25)', 
     13            'AkTestComment'=>'id I AUTO KEY, ak_test_user_id I, private_comment L(1), birth_date T', 
     14            'AkTestField'=>'id I AUTO KEY,varchar_field C(255),longtext_field XL,text_field X,logblob_field B,date_field D,  
     15                    datetime_field T,tinyint_field L(2),integer_field I,smallint_field I2,bigint_field I8,double_field F, 
     16                    numeric_field N,bytea_field B,timestamp_field T, 
     17                    boolean_field L(1),int2_field I2,int4_field I4,int8_field I8,foat_field F,varchar4000_field X,  
     18                    clob_field XL,nvarchar2000_field X2,blob_field B,nvarchar_field C2(255), 
     19                    decimal1_field L(2),decimal3_field I1,decimal5_field I2,decimal10_field I4,decimal20_field I8,decimal_field N, 
     20                    created_at T,updated_at T,expires_on T')); 
     21    } 
     22     
    1723    function Test_of_newRecord() 
    1824    { 
     
    3137 
    3238    } 
    33      
    34  
    3539 
    3640    function Test_of_isNewRecord() 
     
    242246        $User->save(); 
    243247 
    244         $User = $Users->find("first_name = 'John' AND last_name = 'Smith'"); 
     248        $User = $Users->find('first', "first_name = 'John' AND last_name = 'Smith'"); 
    245249        $this->assertEqual($User->first_name,'John'); 
    246250        $this->assertEqual($User->last_name,'Smith'); 
     
    281285        $this->assertEqual($Got->first_name, 'Bermi'); 
    282286         
    283         $Got = $Users->findFirst(); 
     287        $Got = $Users->findFirst(array('order'=>'id ASC')); 
    284288         
    285289        $this->assertEqual($Got->first_name, 'Bermi'); 
     
    445449        $FoundUsers = $Users->findBySql("SELECT * FROM ak_test_users",6); 
    446450        $this->assertEqual(count($FoundUsers), 6); 
     451        $this->assertErrorPattern("/DEPRECATED WARNING.*findBySql.*/"); 
    447452         
    448453        $FoundUsers = $Users->findBySql("SELECT * FROM ak_test_users",6,6); 
    449454        $this->assertEqual(count($FoundUsers), 3); 
    450  
     455        $this->assertErrorPattern("/DEPRECATED WARNING.*findBySql.*/"); 
     456 
     457        $FoundUsers = $Users->findBySql("SELECT * FROM ak_test_users WHERE iad=123"); 
     458        $this->assertEqual(count($FoundUsers), 0); 
     459        $this->assertError(); 
     460         
    451461    } 
    452462 
    453463} 
    454464 
     465require_once('_AkActiveRecord_1.php'); 
    455466ak_test('test_AkActiveRecord_2',true); 
    456467 
    457  
    458468?> 
  • trunk/test/unit/lib/AkActiveRecord/_AkActiveRecord_3.php

    r303 r468  
    44require_once(dirname(__FILE__).'/../../../fixtures/config/config.php'); 
    55 
    6  
    7 require_once(AK_LIB_DIR.DS.'AkActiveRecord.php'); 
    8  
    9  
    10 class test_AkActiveRecord_3 extends  UnitTestCase 
     6class test_AkActiveRecord_3 extends  AkUnitTest 
    117{ 
    12  
    13     function setUp() 
    14     { 
    15     } 
    16  
    17     function tearDown() 
    18     { 
    19         unset($_SESSION['__activeRecordColumnsSettingsCache']); 
    20     } 
    21  
    22  
    23     function Test_of_incrementCounter() 
     8    function _test_AkActiveRecord()  // dont reinstall, this test relies on _AkActiveRecord_1.php 
     9    { 
     10        $this->installAndIncludeModels(array( 
     11        'AkTestUser'=>'id I AUTO KEY, user_name C(32), first_name C(200), last_name C(200), email C(150), country I, password C(32), created_at T, updated_at T, expires_on T', 
     12        'AkTestMember'=>'ak_test_user_id I, role C(25)', 
     13        'AkTestComment'=>'id I AUTO KEY, ak_test_user_id I, private_comment L(1), birth_date T', 
     14        'AkTestField'=>'id I AUTO KEY,varchar_field C(255),longtext_field XL,text_field X,logblob_field B,date_field D, 
     15                    datetime_field T,tinyint_field L(2),integer_field I,smallint_field I2,bigint_field I8,double_field F, 
     16                    numeric_field N,bytea_field B,timestamp_field T, 
     17                    boolean_field boolean,int2_field I2,int4_field I4,int8_field I8,foat_field F,varchar4000_field X,  
     18                    clob_field XL,nvarchar2000_field X2,blob_field B,nvarchar_field C2(255), 
     19                    decimal1_field L(2),decimal3_field I1,decimal5_field I2,decimal10_field I4,decimal20_field I8,decimal_field N, 
     20                    created_at T,updated_at T,expires_on T')); 
     21    } 
     22 
     23    function Test_of_toggleAttributeAndSave() 
    2424    { 
    2525        $AkTestFields = new AkTestField(); 
    2626 
    2727        $AkTestFields->transactionStart(); 
    28         for ($i=1; $i < 10; $i++){ 
    29             $AkTestFields->create(array('varchar_field' => 'test field '.$i)); 
     28        //$AkTestFields->_db->debug(); 
     29        for ($i=1; $i <= 10; $i++){ 
     30            $this->assertTrue($AkTestFields->create(array('varchar_field' => 'test field '.$i))); 
    3031        } 
    3132        $AkTestFields->transactionComplete(); 
    3233 
    33         $AkTestFields->integer_field = $AkTestFields->incrementCounter('integer_field', 5); 
    34  
    35         $AkTestField = $AkTestFields->find(5); 
    36         $this->assertEqual($AkTestField->integer_field, 1); 
    37  
    38         $AkTestFields->integer_field = $AkTestFields->incrementCounter('integer_field', 5); 
    39  
    40         $AkTestField = $AkTestFields->find(5); 
    41         $this->assertEqual($AkTestField->integer_field, 2); 
    42  
    43         $AkTestFields->integer_field = $AkTestFields->incrementCounter('integer_field', 5, 50); 
    44  
    45         $AkTestField = $AkTestFields->find(5); 
    46         $this->assertEqual($AkTestField->integer_field, 52); 
    47     } 
    48  
    49  
    50     function Test_of_decrementCounter() 
    51     { 
    52  
    53         $AkTestFields = new AkTestField(); 
    54         $AkTestFields = $AkTestFields->find(5); 
    55  
    56         $AkTestFields->integer_field = $AkTestFields->decrementCounter('integer_field', 5); 
    57  
    58         $AkTestField = $AkTestFields->find(5); 
    59         $this->assertEqual($AkTestField->integer_field, 51); 
    60  
    61         $AkTestFields->integer_field = $AkTestFields->decrementCounter('integer_field', 6); 
    62  
    63         $AkTestField = $AkTestFields->find(6); 
    64         $this->assertEqual($AkTestField->integer_field, 50); 
    65  
    66         $AkTestFields->integer_field = $AkTestFields->decrementCounter('integer_field', 2, 10); 
    67  
    68         $AkTestField = $AkTestFields->find(2); 
    69         $this->assertEqual($AkTestField->integer_field, 40); 
    70  
    71     } 
    72  
    73  
    74     function Test_of_incrementAndSaveAttribute() 
    75     { 
    76         $AkTestField = new AkTestField(); 
    77         $AkTestField->incrementAndSaveAttribute('integer_field'); 
    78  
    79         $AkTestField = $AkTestField->find(10); 
    80         $AkTestField->incrementAndSaveAttribute('integer_field'); 
    81         $AkTestField->incrementAndSaveAttribute('integer_field'); 
    82  
    83         $AkTestField = $AkTestField->find(10); 
    84         $this->assertEqual($AkTestField->integer_field, 2); 
    85     } 
    86  
    87  
    88     function Test_of_decrementAndSaveAttribute() 
    89     { 
    9034        $AkTestField = new AkTestField(); 
    9135        $AkTestField = $AkTestField->find(2); 
    92  
    93         $AkTestField->decrementAndSaveAttribute('integer_field'); 
     36        $this->assertEqual($AkTestField->boolean_field,null); 
     37 
     38        $AkTestField->set('boolean_field', false); 
     39        $this->assertEqual($AkTestField->boolean_field,false); 
     40        $AkTestField->toggleAttributeAndSave('boolean_field'); 
     41        $this->assertEqual($AkTestField->boolean_field,true); 
    9442 
    9543        $AkTestField = $AkTestField->find(2); 
    96         $this->assertEqual($AkTestField->integer_field, 39); 
    97     } 
    98  
    99  
    100     function Test_of_toggleAttributeAndSave() 
    101     { 
    102         $AkTestField = new AkTestField(); 
    103         $AkTestField = $AkTestField->find(2); 
    104         $AkTestField->set('boolean_field', false); 
    105         $AkTestField->toggleAttributeAndSave('boolean_field'); 
    106  
    107         $AkTestField = $AkTestField->find(2); 
     44        $this->assertEqual($AkTestField->boolean_field,true); 
    10845        $this->assertTrue($AkTestField->boolean_field); 
    10946 
     
    227164    { 
    228165        $AkTestUser = new AkTestUser(); 
    229         $User = $AkTestUser->find("first_name = 'Bermi'"); 
     166        $User = $AkTestUser->find('first'); 
    230167        $Cloned = $User->cloneRecord(); 
    231168 
     
    363300            'nvarchar2000_field'=>"$i text", 
    364301            'nvarchar_field'=>"$i", 
    365             'decimal1_field'=>"$i", 
     302            //'decimal1_field'=>"$i", 
    366303            'decimal3_field'=>$i, 
    367304            'decimal5_field'=>$i, 
     
    399336 
    400337        //$Users->findBy("user_name AND password",'tim_oreilly','1234'); 
    401          
     338 
    402339        $AkTestFields = new AkTestField(); 
    403340 
     
    405342        $this->assertEqual($AkTestField[0]->varchar_field, '2 string'); 
    406343        $this->assertEqual(count($AkTestField), 1); 
    407          
     344 
    408345        $this->assertTrue($AkTestField = $AkTestFields->findBy('varchar_field:begins',2)); 
    409346        $this->assertEqual($AkTestField[0]->varchar_field, '2 string'); 
    410347        $this->assertEqual(count($AkTestField), 1); 
    411          
     348 
    412349        $this->assertTrue($AkTestField = $AkTestFields->findBy('(varchar_field:begins OR int8_field OR timestamp_field:<) AND tinyint_field:>=', 2,3,'2005/05/04 23:00:00',2)); 
    413350        $this->assertEqual($AkTestField[0]->varchar_field, '2 string'); 
     
    440377        $this->assertErrorPattern('/Argument list did not match expected set/',$Users->findAllBy("username",'tim_oreilly')); 
    441378        $this->assertErrorPattern('/Argument list did not match expected set/',$Users->findAllBy("user_name AND password",'tim_oreilly')); 
    442          
     379 
    443380        $AkTestFields = new AkTestField(); 
    444381 
     
    446383        $this->assertEqual($AkTestField[0]->varchar_field, '2 string'); 
    447384        $this->assertEqual(count($AkTestField), 1); 
    448          
     385 
    449386        $this->assertTrue($AkTestField = $AkTestFields->findAllBy('varchar_field:begins',2)); 
    450387        $this->assertEqual($AkTestField[0]->varchar_field, '2 string'); 
    451388        $this->assertEqual(count($AkTestField), 1); 
    452          
     389 
    453390        $this->assertTrue($AkTestField = $AkTestFields->findAllBy('(varchar_field:begins OR int8_field OR timestamp_field:<) AND tinyint_field:>=', 2,3,'2005/05/04 23:00:00',2)); 
    454391        $this->assertEqual($AkTestField[0]->varchar_field, '2 string'); 
     
    464401        $this->assertEqual(count($AkTestField), 3); 
    465402    } 
    466      
     403 
    467404    function Test_of_findFirstBy() 
    468405    { 
     
    480417        $this->assertErrorPattern('/Argument list did not match expected set/',$Users->findFirstBy("username",'tim_oreilly')); 
    481418        $this->assertErrorPattern('/Argument list did not match expected set/',$Users->findFirstBy("user_name AND password",'tim_oreilly')); 
    482          
     419 
    483420        $AkTestFields = new AkTestField(); 
    484421 
    485422        $this->assertTrue($AkTestField = $AkTestFields->findFirstBy('numeric_field:< AND boolean_field',4,'yes')); 
    486423        $this->assertEqual($AkTestField->varchar_field, '2 string'); 
    487          
     424 
    488425        $this->assertTrue($AkTestField = $AkTestFields->findFirstBy('varchar_field:begins',2)); 
    489426        $this->assertEqual($AkTestField->varchar_field, '2 string'); 
    490          
     427 
    491428        $this->assertTrue($AkTestField = $AkTestFields->findFirstBy('(varchar_field:begins OR int8_field OR timestamp_field:<) AND tinyint_field:>=', 2,3,'2005/05/04 23:00:00',2)); 
    492429        $this->assertEqual($AkTestField->varchar_field, '2 string'); 
     
    496433        $this->assertEqual($AkTestField->varchar_field, '4 string'); 
    497434    } 
    498      
     435 
    499436    function Test_of_findLastBy() 
    500437    { 
    501438        $Users = new AkTestUser(); 
    502          
     439 
    503440        $this->assertErrorPattern('/Argument list did not match expected set/',$Users->findLastBy("username",'tim_oreilly')); 
    504441        $this->assertErrorPattern('/Argument list did not match expected set/',$Users->findLastBy("user_name AND password",'tim_oreilly')); 
    505          
    506         $AkTestFields = new AkTestField(); 
    507          
     442 
     443        $AkTestFields = new AkTestField(); 
     444 
    508445        $this->assertTrue($AkTestField = $AkTestFields->findLastBy('(varchar_field:begins OR int8_field OR timestamp_field:<) AND tinyint_field:>=', 2,3,'2005/05/04 23:00:00',2)); 
    509446        $this->assertEqual($AkTestField->varchar_field, '4 string'); 
     
    623560} 
    624561 
    625 ak_test('test_AkActiveRecord_locking',true); 
    626  
     562require_once('_AkActiveRecord_1.php'); 
     563require_once('_AkActiveRecord_2.php'); 
     564ak_test('test_AkActiveRecord_3',true); 
    627565 
    628566?> 
  • trunk/test/unit/lib/AkActiveRecord/_AkActiveRecord_accessible_attributes.php

    r217 r468  
    8686        $this->assertNull($ProtectedPerson->created_at); 
    8787        $this->assertTrue($ProtectedPerson->is_active); 
    88         $this->assertEqual($ProtectedPerson->is_active,1); 
     88        $this->assertEqual($ProtectedPerson->is_active,true); 
    8989        $this->assertEqual($ProtectedPerson->credit_points,1000); 
    9090         
  • trunk/test/unit/lib/AkActiveRecord/_AkActiveRecord_associated_inclusion.php

    r217 r468  
    3434 
    3535        $Property =& $this->Property->find($Apartment->id, array('include'=>'pictures')); 
    36         $this->assertEqual($Property->pictures[1]->title, $Picture->title); 
     36        //$this->assertEqual($Property->pictures[1]->title, $Picture->title); // fails on PostgreSQL 
     37        $this->assertTrue(in_array($Property->pictures[0]->title,array('Views from the living room','Living room'))); 
     38        $this->assertTrue(in_array($Property->pictures[1]->title,array('Views from the living room','Living room'))); 
    3739    } 
    3840} 
  • trunk/test/unit/lib/AkActiveRecord/_AkActiveRecord_findOrCreateBy.php

    r287 r468  
    2929        $SavedBermi =& $Account->findFirstBy('username', 'Bermi'); 
    3030        $this->assertEqual($SavedBermi->getId(), $Bermi->getId()); 
     31        $SavedBermi =& $Account->findOrCreateBy('username', 'Bermi'); 
     32        $this->assertEqual($SavedBermi->getId(), $Bermi->getId()); 
    3133 
    32         $SavedAlicia =& $Account->findFirstBy('username', 'Alicia'); 
     34        $SavedAlicia =& $Account->findOrCreateBy('username', 'Alicia'); 
    3335        $this->assertEqual($SavedAlicia->getId(), $Alicia->getId()); 
    3436    } 
  • trunk/test/unit/lib/AkActiveRecord/_AkActiveRecord_finders.php

    r333 r468  
    11<?php 
     2 
     3defined('AK_ACTIVE_RECORD_PROTECT_GET_RECURSION') ? null : define('AK_ACTIVE_RECORD_PROTECT_GET_RECURSION', false); 
     4defined('AK_TEST_DATABASE_ON') ? null : define('AK_TEST_DATABASE_ON', true); 
     5 
     6require_once(dirname(__FILE__).'/../../../fixtures/config/config.php'); 
    27 
    38class AkActiveRecord_finders_TestCase extends  AkUnitTest 
     
    1217    } 
    1318     
    14     function test_should_find_using_first_id_and_options() 
     19    function test_should_find_using_id_and_options() 
    1520    { 
    1621        $Tag =& new Tag(); 
     
    1924        $Two =& $Tag->create(array('name' => 'Two')); 
    2025 
    21         $Found =& $Tag->find('first', $Two->getId(), array('order'=>'name')); 
     26        //find by id is always 'first'; API-change 
     27        //$Found =& $Tag->find('first', $Two->getId(), array('order'=>'name')); 
     28        $Found =& $Tag->find($Two->getId(), array('order'=>'name')); 
    2229 
    2330        $this->assertEqual($Found->getId(), $Two->getId()); 
     
    3542        $this->assertTrue($Post->save()); 
    3643 
     44        // on PostgreSQL we get an unordered comments-list 
    3745        $this->assertTrue($Post =& $Post->find($Post->getId(), array('include'=>array('comments', 'tags')))); 
     46        $exptected = array('Comment 1','Comment 2'); 
     47        $this->assertTrue(in_array($Post->comments[0]->get('name'),$exptected)); 
     48        $this->assertTrue(in_array($Post->comments[1]->get('name'),$exptected)); 
     49         
     50        // so we could do this  
     51        $this->assertTrue($Post =& $Post->find($Post->getId(), array('include'=>array('comments', 'tags'),'order'=>'_comments.id ASC, _tags.id ASC'))); 
    3852        $this->assertEqual(count($Post->comments), 2); 
    3953        $this->assertEqual($Post->comments[0]->get('name'), 'Comment 1'); 
     
    4963} 
    5064 
     65ak_test('AkActiveRecord_finders_TestCase',true); 
     66 
    5167?> 
  • trunk/test/unit/lib/AkActiveRecord/_AkActiveRecord_i18n.php

    r217 r468  
    1111        $this->installAndIncludeModels(array('Article')); 
    1212    } 
    13  
    1413 
    1514    function test_multilingual_setting() 
  • trunk/test/unit/lib/AkActiveRecord/_AkActiveRecord_locking.php

    r217 r468  
    44require_once(dirname(__FILE__).'/../../../fixtures/config/config.php'); 
    55 
    6  
    76require_once(AK_LIB_DIR.DS.'AkActiveRecord.php'); 
    87 
    9  
    10 class test_AkActiveRecord_locking extends  UnitTestCase 
     8class test_AkActiveRecord_locking extends  AkUnitTest 
    119{ 
    12     var $_testing_models_to_delete = array(); 
    13     var $_testing_model_databases_to_delete = array(); 
    14  
    15     function test_AkActiveRecord_validators() 
     10    function test_should_give_a_deprecated_warning() 
    1611    { 
    17         parent::UnitTestCase(); 
    18         $this->_createNewTestingModelDatabase('AkTestBankAccount'); 
    19         $this->_createNewTestingModel('AkTestBankAccount'); 
    20     } 
    21  
    22     function setUp() 
     12        $this->installAndIncludeModels(array('BankAccount'=>'id,balance,lock_version int')); 
     13        $Account = new BankAccount(array('balance'=>2000)); 
     14        $Account->save(); 
     15        $this->assertError("DEPRECATED WARNING: Column lock_version should have a default setting. Assumed '1'."); 
     16    }  
     17         
     18    function test_start() 
    2319    { 
    24     } 
    25  
    26     function tearDown() 
    27     { 
    28         unset($_SESSION['__activeRecordColumnsSettingsCache']); 
    29     } 
    30  
    31  
    32     function _createNewTestingModel($test_model_name) 
    33     { 
    34  
    35         static $shutdown_called; 
    36         switch ($test_model_name) { 
    37  
    38             case 'AkTestBankAccount': 
    39             $model_source = 
    40             '<?php 
    41     class AkTestBankAccount extends AkActiveRecord  
    42     {      
    43     }  
    44 ?>'; 
    45             break; 
    46  
    47             default: 
    48             $model_source = '<?php class '.$test_model_name.' extends AkActiveRecord { } ?>'; 
    49             break; 
    50         } 
    51  
    52         $file_name = AkInflector::toModelFilename($test_model_name); 
    53  
    54         if(!Ak::file_put_contents($file_name,$model_source)){ 
    55             die('Ooops!, in order to perform this test, you must set your app/model permissions so this can script can create and delete files into/from it'); 
    56         } 
    57         if(!in_array($file_name, get_included_files()) && !class_exists($test_model_name)){ 
    58             include($file_name); 
    59         }else { 
    60             return false; 
    61         } 
    62         $this->_testing_models_to_delete[] = $file_name; 
    63         if(!isset($shutdown_called)){ 
    64             $shutdown_called = true; 
    65             register_shutdown_function(array(&$this,'_deleteTestingModels')); 
    66         } 
    67         return true; 
    68     } 
    69  
    70     function _deleteTestingModels() 
    71     { 
    72         foreach ($this->_testing_models_to_delete as $file){ 
    73             Ak::file_delete($file); 
    74         } 
    75     } 
    76  
    77  
    78  
    79  
    80     function _createNewTestingModelDatabase($test_model_name) 
    81     { 
    82         static $shutdown_called; 
    83         // Create a data dictionary object, using this connection 
    84         $db =& AK::db(); 
    85         //$db->debug = true; 
    86         $table_name = AkInflector::tableize($test_model_name); 
    87         if(in_array($table_name, (array)$db->MetaTables())){ 
    88             return false; 
    89         } 
    90         switch ($table_name) { 
    91             case 'ak_test_bank_accounts': 
    92             $table = 
    93             array( 
    94             'table_name' => 'ak_test_bank_accounts', 
    95             'fields' => 'id I AUTO KEY, 
    96             balance I(20), 
    97             lock_version I(20), 
    98             created_at T,  
    99             updated_at T', 
    100             'index_fileds' => 'id', 
    101             'table_options' => array('mysql' => 'TYPE=InnoDB', 'REPLACE') 
    102             ); 
    103             break; 
    104             default: 
    105             return false; 
    106             break; 
    107         } 
    108  
    109         $dict = NewDataDictionary($db); 
    110         $sqlarray = $dict->CreateTableSQL($table['table_name'], $table['fields'], $table['table_options']); 
    111         $dict->ExecuteSQLArray($sqlarray); 
    112         if(isset($table['index_fileds'])){ 
    113             $sqlarray = $dict->CreateIndexSQL('idx_'.$table['table_name'], $table['table_name'], $table['index_fileds']); 
    114             $dict->ExecuteSQLArray($sqlarray); 
    115         } 
    116  
    117         $db->CreateSequence('seq_'.$table['table_name']); 
    118  
    119         $this->_testing_model_databases_to_delete[] = $table_name; 
    120         if(!isset($shutdown_called)){ 
    121             $shutdown_called = true; 
    122             register_shutdown_function(array(&$this,'_deleteTestingModelDatabases')); 
    123         } 
    124         //$db->debug = false; 
    125         return true; 
    126     } 
    127  
    128     function _deleteTestingModelDatabases() 
    129     { 
    130         $db =& AK::db(); 
    131         foreach ($this->_testing_model_databases_to_delete as $table_name){ 
    132             $db->Execute('DROP TABLE '.$table_name); 
    133             $db->DropSequence('seq_'.$table_name); 
    134         } 
     20        $this->installAndIncludeModels(array('BankAccount'=>'id,balance,lock_version,created_at,updated_at')); 
    13521    } 
    13622 
    13723    function Test_of_isLockingEnabled() 
    13824    { 
    139         $Account = new AkTestBankAccount(); 
    140          
    141         $this->assertTrue($Account->isLockingEnabled()); 
     25        $Account = new BankAccount(); 
     26        $this->assertTrue($Account->isLockingEnabled(),'Optimistic locking is enabled by default.'); 
    14227         
    14328        $Account->lock_optimistically = false; 
    144          
    145         $this->assertFalse($Account->isLockingEnabled()); 
     29        $this->assertFalse($Account->isLockingEnabled(),'Optimistic locking can be turned off.'); 
    14630    } 
    14731 
    14832    function Test_of_OptimisticLock() 
    14933    { 
    150         $Account1 = new AkTestBankAccount('balance->',2000);  
    151         $Account1->save(); // version 1 
     34        $Account1 = new BankAccount(array('balance'=>2000));  
     35        $this->assertEqual($Account1->lock_version,1,'Version attribute initially starts at 1.'); 
     36        $Account1->save(); 
     37        $this->assertEqual($Account1->lock_version,1,'We are now on Version 1.'); 
    15238         
    153         $Account2 = new AkTestBankAccount($Account1->getId()); // version 1 
    154          
     39        $Account2 = new BankAccount($Account1->getId()); 
     40        $this->assertEqual($Account2->lock_version,1,'We reloaded Version 1.'); 
    15541         
    15642        $Account1->balance = 5; 
     43        $Account1->save(); 
     44        $this->assertEqual($Account1->lock_version,2,'We are now on Version 2.'); 
     45         
    15746        $Account2->balance = 3000000; 
    158          
    159         $Account1->save(); // version 2 
    160          
    161         //$Account2->_db->debug =true; 
    162          
    163         $this->assertFalse(@$Account2->save()); // version 1 
    164         $this->assertFalse(@$Account2->save()); // version 1 
    165         //$Account2->_db->debug = false; 
    166         $this->assertErrorPattern('/stale|modificado/',$Account2->save()); 
     47        $this->assertFalse($Account2->save(),'We cant save because version number is wrong.');  
     48        $this->assertError('Attempted to update a stale object'); 
    16749         
    16850        $Account1->balance = 1000;  
    169          
    170         $this->assertTrue($Account1->save()); // version 2 
    171          
    172         $Account3 = new AkTestBankAccount($Account1->getId()); 
    173          
     51        $this->assertTrue($Account1->save()); 
     52 
     53        $Account3 = new BankAccount($Account1->getId()); 
    17454        $this->assertEqual($Account3->balance, 1000); 
     55        $this->assertEqual($Account3->lock_version,3,'We are now on Version 3.'); 
    17556    } 
    17657 
  • trunk/test/unit/lib/AkActiveRecord/_AkActiveRecord_table_inheritance.php

    r217 r468  
    55 
    66require_once(dirname(__FILE__).'/../../../fixtures/config/config.php'); 
     7 
     8class Schedule extends ActiveRecord 
     9{ 
     10    var $belongs_to = 'event'; 
     11     
     12    //ugly PHP4 hack 
     13    function __construct() 
     14    { 
     15        $this->setModelName('Schedule'); 
     16        $this->setTableName('schedules'); 
     17        $attributes = (array)func_get_args(); 
     18        $this->init($attributes); 
     19     } 
     20} 
    721 
    822class test_AkActiveRecord_table_inheritance extends  AkUnitTest 
     
    2539        $OpenHouseMeeting = new OpenHouseMeeting('description->', 'Networking event at Akelos'); 
    2640        $this->assertTrue($OpenHouseMeeting->save()); 
    27                  
    2841        $this->assertEqual($OpenHouseMeeting->get('type'), 'Open house meeting'); 
    2942         
    3043        $this->assertTrue($OpenHouseMeeting = $Event->findFirstBy('description','Networking event at Akelos')); 
    31          
    3244        $this->assertEqual($OpenHouseMeeting->get('description'), 'Networking event at Akelos'); 
    33          
    3445        $this->assertEqual($OpenHouseMeeting->getType(), 'OpenHouseMeeting'); 
    3546         
     47    } 
     48     
     49    function test_find_should_return_appropriate_models() 
     50    { 
     51        $Events = $this->Event->find('all'); 
     52        $expected = array(1 => 'Event', 2 => 'Concert', 3 => 'OpenHouseMeeting'); 
     53        foreach ($Events as $event){ 
     54            $this->assertEqual($event->getType(),$expected[$event->getId()]); 
     55        } 
     56    } 
     57     
     58    function test_inheritance_should_lazy_load_right_model() 
     59    { 
     60        $this->installAndIncludeModels(array('Schedule'=>'id,name,event_id')); 
     61        $this->Schedule->create(array('name'=>'to OpenHouseMeeting','event_id'=>3)); 
     62        $this->Schedule->create(array('name'=>'to Event','event_id'=>1)); 
     63        $this->Schedule->create(array('name'=>'to Concert','event_id'=>2)); 
     64         
     65        $scheds = $this->Schedule->find('all'); 
     66        foreach ($scheds as $schedule){ 
     67            $schedule->event->load(); 
     68        } 
     69         
     70        $expected = array(1=>'OpenHouseMeeting',2=>'Event',3=>'Concert'); 
     71        foreach ($scheds as $schedule){ 
     72            $this->assertEqual($schedule->event->getType(),$expected[$schedule->getId()]); 
     73        } 
    3674    } 
    3775} 
  • trunk/test/unit/lib/AkCache.php

    r414 r468  
    77require_once(AK_LIB_DIR.DS.'AkCache.php'); 
    88 
    9 //$db =& Ak::db(); 
    10 //$db->debug = true; 
    11  
    12 class AkCaheTestCase extends AkUnitTest  
     9class AkCache_TestCase extends  AkUnitTest  
    1310{ 
    1411     
     
    1815    var $group = 'test case group to cacth'; 
    1916    var $text_to_catch = 'this is the text to catch on the test case of the AkCache class'; 
     17     
     18    function test_install_db_tables() 
     19    { 
     20        $this->resetFrameworkDatabaseTables(); 
     21    } 
    2022     
    2123    function setUp() 
     
    2830        unset($this->Cache); 
    2931    } 
    30      
    31     function test_setup() 
    32     { 
    33         require_once(AK_LIB_DIR.DS.'AkInstaller.php'); 
    34         require_once(AK_APP_DIR.DS.'installers'.DS.'framework_installer.php'); 
    35         $installer = new FrameworkInstaller(); 
    36         $installer->uninstall(); 
    37         $installer->install(); 
    38     } 
    39          
     32       
    4033    function Testinit() 
    4134    { 
     
    159152} 
    160153 
     154ak_test('AkCache_TestCase',true); 
    161155 
    162156?> 
  • trunk/test/unit/lib/AkDbSession.php

    r412 r468  
    1717    var $sessionLife = NULL; 
    1818    
     19    function test_install_db_tables() 
     20    { 
     21        require_once(dirname(__FILE__).'/../../fixtures/app/installers/framework_installer.php'); 
     22        $installer =& new FrameworkInstaller(); 
     23        $installer->uninstall(); 
     24        $installer->install(); 
     25         
     26    } 
     27 
    1928    function setUp() 
    2029    {    
  • trunk/test/unit/lib/AkInstaller.php

    r423 r468  
    1212    function setup() 
    1313    { 
    14         global $ADODB_FETCH_MODE; 
    15         $this->_original_ADODB_FETCH_MODE = $ADODB_FETCH_MODE; 
    16         $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; 
    17         $this->Installer = new AkInstaller(); 
    18     } 
    19  
    20     function tearDown() 
     14        $this->Installer = new AkInstaller(); 
     15    } 
     16 
     17    function __tearDown() 
    2118    { 
    2219        global $ADODB_FETCH_MODE; 
     
    2623    function Test_setup_expected_returns() 
    2724    { 
    28         if(strstr($this->Installer->db->databaseType, 'mysql')){ 
    29             $db_type = 'mysql'; 
    30         }elseif(strstr($this->Installer->db->databaseType, 'sqlite')){ 
    31             $db_type = 'sqlite'; 
    32         }elseif(strstr($this->Installer->db->databaseType, 'postgres')){ 
    33             $db_type = 'postgres'; 
    34         } 
     25        $db_type = $this->Installer->db->type(); 
    3526 
    3627        switch ($db_type) { 
    37             case 'postgres': 
     28            case 'postgre': 
    3829                $this->expected_for_creating_table = array( 
    3930                'ID' => array('type'=>'int4','not_null'=>1,'default_value'=>"nextval('test_pages_id_seq'::regclass)",'primary_key' => 1), 
    4031                'TITLE' => array('max_length'=>255,'has_default'=>null,'type'=>'varchar'), 
    4132                'BODY' => array('max_length'=>-1,'has_default'=>null,'type'=>'text'), 
    42                 'PARENT_ID' => array('max_length'=>11,'has_default'=>1,'default_value'=>0,'not_null'=>1,'type'=>'numeric'), 
     33                'PARENT_ID' => array('max_length'=>4,'has_default'=>1,'default_value'=>0,'not_null'=>1,'type'=>'int4'), 
    4334                'CREATED_AT' => array('type'=>'timestamp', 'max_length'=> 8,'has_default'=>null), 
    4435                'UPDATED_AT' => array('type'=>'timestamp', 'max_length'=> 8,'has_default'=>null), 
     
    5243                'EN_URL' => array('max_length'=>255,'has_default'=>null), 
    5344                'ES_URL' => array('max_length'=>255,'has_default'=>null), 
    54                 'OWNER_ID' => array('type'=>'numeric', 'max_length'=>-1), 
     45                'OWNER_ID' => array('type'=>'int4', 'max_length'=>4), 
    5546                'MODIFIED_AT' => array('type'=>'timestamp'), 
    5647                'CREATED_ON' => array('type'=>'date'), 
    57                 'IS_FEATURED' => array('max_length'=>1,'type'=>'numeric'), 
    58                 'POSITION' => array('max_length'=>-1), 
     48                'IS_FEATURED' => array('max_length'=>1,'type'=>'bool'), 
     49                'POSITION' => array('max_length'=>4), 
     50                'LOCK_VERSION' => array('type'=>'int4', 'max_length'=>4,'default_value' => 1),