diff --git a/cake/libs/controller/components/acl.php b/cake/libs/controller/components/acl.php index f7ef4a3ea..1de18c7b3 100644 --- a/cake/libs/controller/components/acl.php +++ b/cake/libs/controller/components/acl.php @@ -300,11 +300,11 @@ class DB_ACL extends AclBase { for ($i = 0 ; $i < count($aroPath); $i++) { $permAlias = $this->Aro->Permission->alias; - $perms = $this->Aro->Permission->findAll(array( + $perms = $this->Aro->Permission->find('all', array('conditions' => array( "{$permAlias}.aro_id" => $aroPath[$i][$this->Aro->alias]['id'], "{$permAlias}.aco_id" => $acoIDs), null, array($this->Aco->alias . '.lft' => 'desc'), null, null, 0 - ); + )); if (empty($perms)) { continue; @@ -362,7 +362,6 @@ class DB_ACL extends AclBase { trigger_error(__('DB_ACL::allow() - Invalid node', true), E_USER_WARNING); return false; } - if (isset($perms[0])) { $save = $perms[0][$this->Aro->Permission->alias]; } @@ -385,15 +384,12 @@ class DB_ACL extends AclBase { } } } - - $save['aro_id'] = $perms['aro']; - $save['aco_id'] = $perms['aco']; + list($save['aro_id'], $save['aco_id']) = array($perms['aro'], $perms['aco']); if ($perms['link'] != null && count($perms['link']) > 0) { $save['id'] = $perms['link'][0][$this->Aro->Permission->alias]['id']; } - $this->Aro->Permission->create($save); - return $this->Aro->Permission->save(); + return ($this->Aro->Permission->create($save) && $this->Aro->Permission->save()); } /** * Deny access for $aro to action $action in $aco @@ -465,10 +461,10 @@ class DB_ACL extends AclBase { return array( 'aro' => Set::extract($obj, 'Aro.0.'.$this->Aro->alias.'.id'), 'aco' => Set::extract($obj, 'Aco.0.'.$this->Aco->alias.'.id'), - 'link' => $this->Aro->Permission->findAll(array( + 'link' => $this->Aro->Permission->find('all', array('conditions' => array( $this->Aro->Permission->alias . '.aro_id' => Set::extract($obj, 'Aro.0.'.$this->Aro->alias.'.id'), $this->Aro->Permission->alias . '.aco_id' => Set::extract($obj, 'Aco.0.'.$this->Aco->alias.'.id') - )) + ))) ); } /** diff --git a/cake/libs/model/behaviors/tree.php b/cake/libs/model/behaviors/tree.php index 8e69ee809..895b859d4 100644 --- a/cake/libs/model/behaviors/tree.php +++ b/cake/libs/model/behaviors/tree.php @@ -52,7 +52,7 @@ class TreeBehavior extends ModelBehavior { /*if (in_array($settings['scope'], $model->getAssociated('belongsTo'))) { $data = $model->getAssociated($settings['scope']); $parent =& $model->{$data['className']}; - $settings['scope'] = $model->escapeField($data['foreignKey']) . ' = ' . $parent->escapeField($parent->primaryKey, $settings['scope']); + $settings['scope'] = $model->alias . '.' . $data['foreignKey']) . ' = ' . $parent->alias . '.' . $parent->primaryKey, $settings['scope']); }*/ $this->settings[$model->alias] = $settings; } @@ -820,7 +820,7 @@ class TreeBehavior extends ModelBehavior { $conditions= array_merge($conditions, $scope); } } - $model->updateAll(array($model->escapeField($field) => $model->escapeField($field) . ' ' . $dir . ' ' . $shift), $conditions); + $model->updateAll(array($model->alias . '.' . $field => $model->alias . '.' . $field . ' ' . $dir . ' ' . $shift), $conditions); } } ?> diff --git a/cake/libs/model/datasources/dbo/dbo_mssql.php b/cake/libs/model/datasources/dbo/dbo_mssql.php index 8f9802c54..7ea974057 100644 --- a/cake/libs/model/datasources/dbo/dbo_mssql.php +++ b/cake/libs/model/datasources/dbo/dbo_mssql.php @@ -356,23 +356,7 @@ class DboMssql extends DboSource { break; } } - if (empty($conditions)) { - return parent::update($model, $fields, $values, null); - } - return parent::_update($model, $fields, $values, $conditions); - } -/** - * Generates and executes an SQL DELETE statement - * - * @param Model $model - * @param mixed $conditions - * @return boolean Success - */ - function delete(&$model, $conditions = null) { - if (empty($conditions)) { - return parent::delete($model, null); - } - return parent::_delete($model, $conditions); + return parent::update($model, $fields, $values, null); } /** * Returns a formatted error message from previous database operation. diff --git a/cake/libs/model/datasources/dbo/dbo_mysql.php b/cake/libs/model/datasources/dbo/dbo_mysql.php index 14496f34e..6d27c9d37 100644 --- a/cake/libs/model/datasources/dbo/dbo_mysql.php +++ b/cake/libs/model/datasources/dbo/dbo_mysql.php @@ -203,13 +203,9 @@ class DboMysql extends DboSource { if ($parent != null) { return $parent; - } - - if ($data === null) { + } elseif ($data === null) { return 'NULL'; - } - - if ($data === '') { + } elseif ($data === '') { return "''"; } @@ -227,9 +223,71 @@ class DboMysql extends DboSource { $data = "'" . mysql_real_escape_string($data, $this->connection) . "'"; break; } - return $data; } +/** + * Generates and executes an SQL UPDATE statement for given model, fields, and values. + * + * @param Model $model + * @param array $fields + * @param array $values + * @param mixed $conditions + * @return array + */ + function update(&$model, $fields = array(), $values = null, $conditions = null) { + if ($values == null) { + $combined = $fields; + } else { + $combined = array_combine($fields, $values); + } + + $fields = join(', ', $this->_prepareUpdateFields($model, $combined, empty($conditions), !empty($conditions))); + $table = $this->fullTableName($model); + $alias = $this->name($model->alias); + $joins = implode(' ', $this->_getJoins($model)); + + if (empty($conditions)) { + $alias = $joins = false; + } + $conditions = $this->conditions($this->defaultConditions($model, $conditions, $alias)); + + if ($conditions === false) { + return false; + } + + if (!$this->execute($this->renderStatement('update', compact('table', 'alias', 'joins', 'fields', 'conditions')))) { + $model->onError(); + return false; + } + return true; + } +/** + * Generates and executes an SQL DELETE statement for given id/conditions on given model. + * + * @param Model $model + * @param mixed $conditions + * @return boolean Success + */ + function delete(&$model, $conditions = null) { + $alias = $this->name($model->alias); + $table = $this->fullTableName($model); + $joins = implode(' ', $this->_getJoins($model)); + + if (empty($conditions)) { + $alias = $joins = false; + } + $conditions = $this->conditions($this->defaultConditions($model, $conditions, $alias)); + + if ($conditions === false) { + return false; + } + + if ($this->execute($this->renderStatement('delete', compact('alias', 'table', 'joins', 'conditions'))) === false) { + $model->onError(); + return false; + } + return true; + } /** * Begin a transaction * diff --git a/cake/libs/model/datasources/dbo/dbo_postgres.php b/cake/libs/model/datasources/dbo/dbo_postgres.php index 0b2ea1cd7..0d85f31c6 100644 --- a/cake/libs/model/datasources/dbo/dbo_postgres.php +++ b/cake/libs/model/datasources/dbo/dbo_postgres.php @@ -397,34 +397,6 @@ class DboPostgres extends DboSource { } return false; } -/** - * Generates and executes an SQL UPDATE statement for given model, fields, and values. - * - * @param Model $model - * @param array $fields - * @param array $values - * @param mixed $conditions - * @return array - */ - function update(&$model, $fields = array(), $values = null, $conditions = null) { - if (empty($conditions)) { - return parent::update($model, $fields, $values, null); - } - return parent::_update($model, $fields, $values, $conditions); - } -/** - * Generates and executes an SQL DELETE statement - * - * @param Model $model - * @param mixed $conditions - * @return boolean Success - */ - function delete(&$model, $conditions = null) { - if (empty($conditions)) { - return parent::delete($model, null); - } - return parent::_delete($model, $conditions); - } /** * Prepares field names to be quoted by parent * diff --git a/cake/libs/model/datasources/dbo/dbo_sqlite.php b/cake/libs/model/datasources/dbo/dbo_sqlite.php index 2cd30e173..410f6c253 100644 --- a/cake/libs/model/datasources/dbo/dbo_sqlite.php +++ b/cake/libs/model/datasources/dbo/dbo_sqlite.php @@ -218,23 +218,17 @@ class DboSqlite extends DboSource { * @return array */ function update(&$model, $fields = array(), $values = null, $conditions = null) { - if (empty($conditions)) { - return parent::update($model, $fields, $values, null); + if (empty($values) && !empty($fields)) { + foreach ($fields as $field => $value) { + if (strpos($field, $model->alias . '.') !== false) { + unset($fields[$field]); + $field = str_replace($model->alias . '.', "", $field); + $field = str_replace($model->alias . '.', "", $field); + $fields[$field] = $value; + } + } } - return parent::_update($model, $fields, $values, $conditions); - } -/** - * Generates and executes an SQL DELETE statement - * - * @param Model $model - * @param mixed $conditions - * @return boolean Success - */ - function delete(&$model, $conditions = null) { - if (empty($conditions)) { - return parent::delete($model, null); - } - return parent::_delete($model, $conditions); + return parent::update($model, $fields, $values, $conditions); } /** * Begin a transaction diff --git a/cake/libs/model/datasources/dbo_source.php b/cake/libs/model/datasources/dbo_source.php index 2ee91cff5..20afef4d9 100644 --- a/cake/libs/model/datasources/dbo_source.php +++ b/cake/libs/model/datasources/dbo_source.php @@ -1210,7 +1210,14 @@ class DboSource extends DataSource { } return array(); } - +/** + * Builds and generates a JOIN statement from an array. Handles final clean-up before conversion. + * + * @param array $join An array defining a JOIN statement in a query + * @return string An SQL JOIN statement to be used in a query + * @see DboSource::renderJoinStatement() + * @see DboSource::buildStatement() + */ function buildJoinStatement($join) { $data = array_merge(array( 'type' => null, @@ -1227,7 +1234,14 @@ class DboSource extends DataSource { } return $this->renderJoinStatement($data); } - +/** + * Builds and generates an SQL statement from an array. Handles final clean-up before conversion. + * + * @param array $query An array defining an SQL query + * @param object $model The model object which initiated the query + * @return string An executable SQL statement + * @see DboSource::renderStatement() + */ function buildStatement($query, $model) { $query = array_merge(array('offset' => null, 'joins' => array()), $query); if (!empty($query['joins'])) { @@ -1308,6 +1322,7 @@ class DboSource extends DataSource { } /** * Generates and executes an SQL UPDATE statement for given model, fields, and values. + * For databases that do not support aliases in UPDATE queries. * * @param Model $model * @param array $fields @@ -1321,59 +1336,11 @@ class DboSource extends DataSource { } else { $combined = array_combine($fields, $values); } - - $fields = join(', ', $this->_prepareUpdateFields($model, $combined, empty($conditions), !empty($conditions))); - $table = $this->fullTableName($model); - $alias = $this->name($model->alias); - $joins = implode(' ', $this->_getJoins($model)); - - if (empty($conditions)) { - $alias = $joins = false; - } - $conditions = $this->conditions($this->defaultConditions($model, $conditions, $alias)); - - if ($conditions === false) { - return false; - } - - if (!$this->execute($this->renderStatement('update', compact('table', 'alias', 'joins', 'fields', 'conditions')))) { - $model->onError(); - return false; - } - return true; - } -/** - * Generates and executes an SQL UPDATE statement for given model, fields, and values. - * For databases that do not support aliases in UPDATE queries. - * - * @param Model $model - * @param array $fields - * @param array $values - * @param mixed $conditions - * @return array - */ - function _update(&$model, $fields = array(), $values = null, $conditions = null) { - if ($conditions === true) { - $conditions = $this->conditions(true); - } else { - $idList = $model->find('all', array('fields' => $model->escapeField(), 'conditions' => $conditions)); - - if (empty($idList)) { - return false; - } - $conditions = $this->conditions(array( - $model->primaryKey => Set::extract($idList, "{n}.{$model->alias}.{$model->primaryKey}") - )); - } - if ($values == null) { - $combined = $fields; - } else { - $combined = array_combine($fields, $values); - } - $fields = join(', ', $this->_prepareUpdateFields($model, $combined, false, false)); + $fields = join(', ', $this->_prepareUpdateFields($model, $combined, empty($conditions))); $alias = $joins = null; $table = $this->fullTableName($model); + $conditions = $this->_matchRecords($model, $conditions); if (!$this->execute($this->renderStatement('update', compact('table', 'alias', 'joins', 'fields', 'conditions')))) { $model->onError(); @@ -1391,10 +1358,15 @@ class DboSource extends DataSource { * @return array Fields and values, quoted and preparted * @access protected */ - function _prepareUpdateFields(&$model, $fields, $quoteValues, $alias) { + function _prepareUpdateFields(&$model, $fields, $quoteValues = true, $alias = false) { + $quotedAlias = $this->startQuote . $model->alias . $this->startQuote; foreach ($fields as $field => $value) { - if ($alias) { + if ($alias && strpos($field, '.') === false) { $quoted = $model->escapeField($field); + } elseif (!$alias && strpos($field, '.') !== false) { + $quoted = $this->name(str_replace($quotedAlias . '.', '', str_replace( + $model->alias . '.', '', $field + ))); } else { $quoted = $this->name($field); } @@ -1405,6 +1377,10 @@ class DboSource extends DataSource { $update = $quoted . ' = '; if ($quoteValues) { $update .= $this->value($value, $model->getColumnType($field)); + } elseif (!$alias) { + $update .= str_replace($quotedAlias . '.', '', str_replace( + $model->alias . '.', '', $value + )); } else { $update .= $value; } @@ -1414,25 +1390,17 @@ class DboSource extends DataSource { return $updates; } /** - * Generates and executes an SQL DELETE statement for given id on given model. + * Generates and executes an SQL DELETE statement. + * For databases that do not support aliases in UPDATE queries. * * @param Model $model * @param mixed $conditions * @return boolean Success */ function delete(&$model, $conditions = null) { - $alias = $this->name($model->alias); + $alias = $joins = null; + $conditions = $this->_matchRecords($model, $conditions); $table = $this->fullTableName($model); - $joins = implode(' ', $this->_getJoins($model)); - - if (empty($conditions)) { - $alias = $joins = false; - } - $conditions = $this->conditions($this->defaultConditions($model, $conditions, $alias)); - - if ($conditions === false) { - return false; - } if ($this->execute($this->renderStatement('delete', compact('alias', 'table', 'joins', 'conditions'))) === false) { $model->onError(); @@ -1441,16 +1409,19 @@ class DboSource extends DataSource { return true; } /** - * Generates and executes an SQL DELETE statement. - * For databases that do not support aliases in UPDATE queries. + * Gets a list of record IDs for the given conditions. Used for multi-record updates and deletes + * in databases that do not support aliases in UPDATE/DELETE queries. * * @param Model $model * @param mixed $conditions - * @return boolean Success + * @return array List of record IDs + * @access protected */ - function _delete(&$model, $conditions = null) { + function _matchRecords(&$model, $conditions = null) { if ($conditions === true) { $conditions = $this->conditions(true); + } elseif ($conditions === null) { + $conditions = $this->conditions($this->defaultConditions($model, $conditions, false)); } else { $idList = $model->find('all', array('fields' => $model->escapeField(), 'conditions' => $conditions)); @@ -1461,14 +1432,7 @@ class DboSource extends DataSource { $model->primaryKey => Set::extract($idList, "{n}.{$model->alias}.{$model->primaryKey}") )); } - $alias = $joins = null; - $table = $this->fullTableName($model); - - if ($this->execute($this->renderStatement('delete', compact('alias', 'table', 'joins', 'conditions'))) === false) { - $model->onError(); - return false; - } - return true; + return $conditions; } /** * Returns an array of SQL JOIN fragments from a model's associations diff --git a/cake/libs/model/model.php b/cake/libs/model/model.php index b3f98179d..9739b3fbd 100644 --- a/cake/libs/model/model.php +++ b/cake/libs/model/model.php @@ -1883,13 +1883,11 @@ class Model extends Overloadable { return true; } /** - * Runs a direct query against the bound DataSource, and returns the result. - * - * @param string $data Query data - * @return array Result of the query - * @access public + * @deprecated + * @see Model::query */ function execute($data) { + trigger_error(__('(Model::execute) Deprecated, use Model::query', true), E_USER_WARNING); $db =& ConnectionManager::getDataSource($this->useDbConfig); $data = $db->fetchAll($data, $this->cacheQueries); diff --git a/cake/tests/cases/libs/controller/components/acl.test.php b/cake/tests/cases/libs/controller/components/acl.test.php index 6f7e4f51d..4c98a4800 100644 --- a/cake/tests/cases/libs/controller/components/acl.test.php +++ b/cake/tests/cases/libs/controller/components/acl.test.php @@ -122,17 +122,17 @@ class AclComponentTest extends CakeTestCase { $parent = $this->Acl->Aro->id; - $this->Acl->Aro->create(array('parent_id' => $parent, 'alias'=>'Account')); + $this->Acl->Aro->create(array('parent_id' => $parent, 'alias' => 'Account')); $result = $this->Acl->Aro->save(); $this->assertTrue($result); - $this->Acl->Aro->create(array('parent_id' => $parent, 'alias'=>'Manager')); + $this->Acl->Aro->create(array('parent_id' => $parent, 'alias' => 'Manager')); $result = $this->Acl->Aro->save(); $this->assertTrue($result); $parent = $this->Acl->Aro->id; - $this->Acl->Aro->create(array('parent_id' => $parent, 'alias'=>'Secretary')); + $this->Acl->Aro->create(array('parent_id' => $parent, 'alias' => 'Secretary')); $result = $this->Acl->Aro->save(); $this->assertTrue($result); @@ -198,7 +198,6 @@ class AclComponentTest extends CakeTestCase { } function testDbAclCheck() { - $result = $this->Acl->check('Secretary','Links','read'); $this->assertTrue($result); diff --git a/cake/tests/cases/libs/model/model.test.php b/cake/tests/cases/libs/model/model.test.php index 64f8514d9..9cdb6cd72 100644 --- a/cake/tests/cases/libs/model/model.test.php +++ b/cake/tests/cases/libs/model/model.test.php @@ -140,19 +140,20 @@ class ModelTest extends CakeTestCase { $this->Project->recursive = 3; $result = $this->Project->findAll(); - $expected = array(array('Project' => array('id' => 1, 'name' => 'Project 1'), - 'Thread' => array(array('id' => 1, 'project_id' => 1, 'name' => 'Project 1, Thread 1', - 'Message' => array(array('id' => 1, 'thread_id' => 1, 'name' => 'Thread 1, Message 1', - 'Bid' => array('id' => 1, 'message_id' => 1, 'name' => 'Bid 1.1')))), - array('id' => 2, 'project_id' => 1, 'name' => 'Project 1, Thread 2', - 'Message' => array(array('id' => 2, 'thread_id' => 2, 'name' => 'Thread 2, Message 1', - 'Bid' => array('id' => 4, 'message_id' => 2, 'name' => 'Bid 2.1')))))), - array('Project' => array('id' => 2, 'name' => 'Project 2'), - 'Thread' => array(array('id' => 3, 'project_id' => 2, 'name' => 'Project 2, Thread 1', - 'Message' => array(array('id' => 3, 'thread_id' => 3, 'name' => 'Thread 3, Message 1', - 'Bid' => array('id' => 3, 'message_id' => 3, 'name' => 'Bid 3.1')))))), - array('Project' => array('id' => 3, 'name' => 'Project 3'), - 'Thread' => array())); + $expected = array( + array('Project' => array('id' => 1, 'name' => 'Project 1'), + 'Thread' => array(array('id' => 1, 'project_id' => 1, 'name' => 'Project 1, Thread 1', + 'Message' => array(array('id' => 1, 'thread_id' => 1, 'name' => 'Thread 1, Message 1', + 'Bid' => array('id' => 1, 'message_id' => 1, 'name' => 'Bid 1.1')))), + array('id' => 2, 'project_id' => 1, 'name' => 'Project 1, Thread 2', + 'Message' => array(array('id' => 2, 'thread_id' => 2, 'name' => 'Thread 2, Message 1', + 'Bid' => array('id' => 4, 'message_id' => 2, 'name' => 'Bid 2.1')))))), + array('Project' => array('id' => 2, 'name' => 'Project 2'), + 'Thread' => array(array('id' => 3, 'project_id' => 2, 'name' => 'Project 2, Thread 1', + 'Message' => array(array('id' => 3, 'thread_id' => 3, 'name' => 'Thread 3, Message 1', + 'Bid' => array('id' => 3, 'message_id' => 3, 'name' => 'Bid 3.1')))))), + array('Project' => array('id' => 3, 'name' => 'Project 3'), + 'Thread' => array())); $this->assertEqual($result, $expected); unset($this->Project); } @@ -172,7 +173,6 @@ class ModelTest extends CakeTestCase { array('SomethingElse' => array('id' => '3', 'title' => 'Third Post', 'body' => 'Third Post Body', 'published' => 'Y', 'created' => '2007-03-18 10:43:23', 'updated' => '2007-03-18 10:45:31'), 'Something' => array (array('id' => '2', 'title' => 'Second Post', 'body' => 'Second Post Body', 'published' => 'Y', 'created' => '2007-03-18 10:41:23', 'updated' => '2007-03-18 10:43:31', 'JoinThing' => array('id' => '2', 'something_id' => '2', 'something_else_id' => '3', 'doomed' => '0', 'created' => '2007-03-18 10:41:23', 'updated' => '2007-03-18 10:43:31'))))); - $this->assertEqual($result, $expected); $result = $this->model->find('all'); @@ -189,7 +189,6 @@ class ModelTest extends CakeTestCase { 'SomethingElse' => array( array('id' => '1', 'title' => 'First Post', 'body' => 'First Post Body', 'published' => 'Y', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31', 'JoinThing' => array('doomed' => '1', 'something_id' => '3', 'something_else_id' => '1'))))); - $this->assertEqual($result, $expected); $result = $this->model->findById(1); @@ -749,6 +748,21 @@ class ModelTest extends CakeTestCase { $this->assertTrue($result); } + function testUpdateMultiple() { + $this->loadFixtures('Comment', 'Article', 'User', 'Attachment'); + $this->model =& new Comment(); + $result = Set::extract($this->model->find('all'), '{n}.Comment.user_id'); + $expected = array('2', '4', '1', '1', '1', '2'); + $this->assertEqual($result, $expected); + + $this->model->updateAll(array('Comment.user_id' => 5), array('Comment.user_id' => 2)); + $result = Set::extract($this->model->find('all'), '{n}.Comment.user_id'); + $expected = array('5', '4', '1', '1', '1', '5'); + $this->assertEqual($result, $expected); + + //pr($this->model->find('all')); + } + function testBindUnbind() { $this->loadFixtures('User', 'Comment', 'FeatureSet'); $this->model =& new User(); @@ -1952,7 +1966,7 @@ class ModelTest extends CakeTestCase { $result = $this->model->findById(1); $this->assertIdentical($result['Syfile']['item_count'], null); - $this->model2->save(array('name' => 'Item 7', 'syfile_id' => 1)); + $this->model2->save(array('name' => 'Item 7', 'syfile_id' => 1, 'published' => false)); $result = $this->model->findById(1); $this->assertIdentical($result['Syfile']['item_count'], '2'); @@ -2785,6 +2799,12 @@ class ModelTest extends CakeTestCase { } function testAutoSaveUuid() { + // SQLite does not support non-integer primary keys + $db =& ConnectionManager::getDataSource('test_suite'); + if ($db->config['driver'] == 'sqlite') { + return; + } + $this->loadFixtures('Uuid'); $this->model =& new Uuid(); $this->model->save(array('title' => 'Test record')); diff --git a/cake/tests/fixtures/aros_aco_fixture.php b/cake/tests/fixtures/aros_aco_fixture.php index 9a9e24b12..d9430dd99 100644 --- a/cake/tests/fixtures/aros_aco_fixture.php +++ b/cake/tests/fixtures/aros_aco_fixture.php @@ -38,13 +38,12 @@ class ArosAcoFixture extends CakeTestFixture { 'id' => array('type' => 'integer', 'key' => 'primary'), 'aro_id' => array('type' => 'integer', 'length' => 10, 'null' => false), 'aco_id' => array('type' => 'integer', 'length' => 10, 'null' => false), - '_create' => array('type' => 'string', 'length' => 2, 'null' => false, 'default' => '0'), - '_read' => array('type' => 'string', 'length' => 2, 'null' => false, 'default' => '0'), - '_update' => array('type' => 'string', 'length' => 2, 'null' => false, 'default' => '0'), - '_delete' => array('type' => 'string', 'length' => 2, 'null' => false, 'default' => '0') - ); - var $records = array( + '_create' => array('type' => 'string', 'length' => 2, 'default' => 0), + '_read' => array('type' => 'string', 'length' => 2, 'default' => 0), + '_update' => array('type' => 'string', 'length' => 2, 'default' => 0), + '_delete' => array('type' => 'string', 'length' => 2, 'default' => 0) ); + var $records = array(); } ?> \ No newline at end of file