Merging fixes into the trunk.

Revision: [2618]
Adding fix for Ticket #609

Revision: [2617]
Added fix for Ticket #684

Revision: [2616]
Adding patch from Ticket #649

Revision: [2615]
Adding fix for Ticket #608

Revision: [2614]
Additional fix for Ticket #584

Revision: [2613]
Adding fix for Ticket #584

Revision: [2612]
Added fix for undefined index notices

Revision: [2609]
Adding fix for Ticket #658

Revision: [2608]
Adding fix for Ticket #635, and code formatting fixes in FormHelper

Revision: [2607]
Adding fix for Ticket #636

Revision: [2606]
Adding fix to allow associations to be defined through non-associative arrays

Revision: [2605]
Adding fix for Ticket #672

Revision: [2604]
Adding fix for Ticket #708

Revision: [2603]
Adding fix for Ticket #687

Revision: [2602]
Refactoring database drivers, and adding fix for Ticket #398

Revision: [2601]
Merging change from model_php5.php

Revision: [2600]
Adding ODBC driver

Revision: [2599]
Adding fix for Ticket #702

Revision: [2598]
Adding fix for Ticket #699

Revision: [2597]
Fixing an issue in Model::set(), and moving limit() to DboSource

Revision: [2595]
Fixing unit test download URL in Bake

Revision: [2594]
Adding fix for Ticket #698

Revision: [2593]
Adding fox for Ticket #231

Revision: [2592]
Adding fix for Ticket #630, and updating MS SQL driver docstring

Revision: [2577]
Adding $alias property to enable future Oracle support

Revision: [2568]
Merging changes to bake from old sandboxes

git-svn-id: https://svn.cakephp.org/repo/trunk/cake/1.x.x.x@2620 3807eeeb-6ff5-0310-8944-8be069107fe0
This commit is contained in:
phpnut 2006-04-27 10:04:08 +00:00
parent 1707fd8582
commit 4a8c03ef1c
20 changed files with 1507 additions and 633 deletions

View file

@ -6,4 +6,4 @@
// +---------------------------------------------------------------------------------------------------+ //
///////////////////////////////////////////////////////////////////////////////////////////////////////////
1.0.0.2560
1.0.0.2620

View file

@ -75,23 +75,26 @@ table {
width: 100%;
background-color: #fff;
border: 1px solid #333;
border-collapse: collapse;
clear:both;
margin: 0 0 2em 0;
white-space: normal;
}
tbody {
height: 400px;
overflow: auto;
}
th {
background-color: #ccc;
border-top: 1px solid #fff;
border-right: 1px solid #666;
border-bottom: 1px solid #666;
border: 1px solid #666;
text-align: center;
padding:3px;
border-bottom: 1px solid #666;
}
table tr td {
border-right: 1px solid #ccc;
padding:4px 4px;
vertical-align:top;
text-align: center;
border-bottom: 1px solid #666;
}
table tr.altRow td {
background: #f4f4f4;

View file

@ -44,16 +44,6 @@ class AclNode extends AppModel
var $cacheQueries = false;
/**
* Enter description here...
*
*/
function __construct()
{
$this->setSource();
parent::__construct();
}
/**
* Enter description here...
*
@ -262,7 +252,7 @@ class AclNode extends AppModel
function _resolveID($id)
{
extract($this->__dataVars());
$key = (is_string($id) ? 'alias' : $secondary_id);
$key = (is_numeric($id) ? $secondary_id : 'alias');
return array($this->name.'.'.$key => $id);
}
@ -322,15 +312,6 @@ class AclNode extends AppModel
$vars['class'] = ucwords($class);
return $vars;
}
/**
* Enter description here...
*
*/
function setSource()
{
$this->table = strtolower(get_class($this)) . "s";
}
}
?>

View file

@ -76,14 +76,35 @@ class PagesController extends AppController{
{
$this->redirect('/');
}
$path = func_get_args();
if (!count($path))
{
$this->redirect('/');
}
$this->set('page', $path[0]);
$this->set('subpage', empty($path[1])? null: $path[1]);
$this->set('title', ucfirst($path[count($path)-1]));
$count = count($path);
$page = null;
$subpage = null;
$title = null;
if(!empty($path[0]))
{
$page = $path[0];
}
if(!empty($path[1]))
{
$subpage = $path[1];
}
if(!empty($path[$count-1]))
{
$title = ucfirst($path[$count-1]);
}
$this->set('page', $page);
$this->set('subpage', $subpage);
$this->set('title', $title);
$this->render(join('/', $path));
}
}

View file

@ -72,16 +72,30 @@ class DboSource extends DataSource
*/
var $endQuote = null;
/**
* Enter description here...
*
* @var unknown_type
*/
var $alias = 'AS ';
/**
* Enter description here...
*
* @var unknown_type
*/
var $goofyLimit = false;
/**
* Constructor
*
*/
function __construct($config = null)
{
$this->debug = DEBUG > 0;
$this->fullDebug = DEBUG > 1;
parent::__construct($config);
return $this->connect();
$this->debug = DEBUG > 0;
$this->fullDebug = DEBUG > 1;
parent::__construct($config);
return $this->connect();
}
/**
@ -95,7 +109,7 @@ class DboSource extends DataSource
$this->disconnect();
if ($config != null)
{
$this->config = am($this->config, $config);
$this->config = am($this->_baseConfig, $config);
}
return $this->connect();
}
@ -326,7 +340,7 @@ class DboSource extends DataSource
* @param boolean $cache Enables returning/storing cached query results
* @return array Array of resultset rows, or false if no rows matched
*/
function fetchAll ($sql, $cache = true)
function fetchAll ($sql, $cache = true, $modelName = null)
{
if ($cache && isset($this->_queryCache[$sql]))
{
@ -409,8 +423,8 @@ class DboSource extends DataSource
{
$text = 'query';
}
print("<table border=\"1\">\n<tr><th colspan=\"7\">{$this->_queriesCnt} {$text} took {$this->_queriesTime} ms</th></tr>\n");
print("<tr><td>Nr</td><td>Query</td><td>Error</td><td>Affected</td><td>Num. rows</td><td>Took (ms)</td></tr>\n");
print("<table border=\"0\">\n<caption>{$this->_queriesCnt} {$text} took {$this->_queriesTime} ms</caption>\n");
print("<thead>\n<tr><th>Nr</th><th>Query</th><th>Error</th><th>Affected</th><th>Num. rows</th><th>Took (ms)</th></tr>\n</thead>\n<tbody>\n");
foreach($log as $k => $i)
{
@ -580,7 +594,7 @@ class DboSource extends DataSource
// Build final query SQL
$query = $this->generateAssociationQuery($model, $null, null, null, null, $queryData, false, $null);
$resultSet = $this->fetchAll($query, $model->cacheQueries);
$resultSet = $this->fetchAll($query, $model->cacheQueries, $model->name );
$filtered = $this->__filterResults($resultSet, $model);
if ($model->recursive > 0)
@ -613,7 +627,7 @@ class DboSource extends DataSource
}
if (isset($db) && $db != null)
{
$db->queryAssociation($model, $linkModel, $type, $assoc, $assocData, $array, true, $resultSet, $model->recursive);
$db->queryAssociation($model, $linkModel, $type, $assoc, $assocData, $array, true, $resultSet, $model->recursive - 1);
unset($db);
}
}
@ -628,12 +642,14 @@ class DboSource extends DataSource
return $resultSet;
}
/**
* Private method
* Enter description here...
*
* @param unknown_type $linkModel
* @param Model $model
* @return array
* @param unknown_type $results
* @param unknown_type $model
* @param unknown_type $filtered
* @return unknown
*/
function __filterResults(&$results, &$model, $filtered = array())
{
@ -706,7 +722,7 @@ class DboSource extends DataSource
{
$row =& $resultSet[$i];
$q = $this->insertQueryData($query, $resultSet, $association, $assocData, $model, $linkModel, $i);
$fetch = $this->fetchAll($q, $model->cacheQueries);
$fetch = $this->fetchAll($q, $model->cacheQueries, $model->name);
if (!empty($fetch) && is_array($fetch))
{
@ -726,10 +742,23 @@ class DboSource extends DataSource
}
$this->__mergeAssociation($resultSet[$i], $fetch, $association, $type);
}
else
{
$tempArray[0][$association] = false;
$this->__mergeAssociation($resultSet[$i], $tempArray, $association, $type);
}
}
}
}
/**
* Enter description here...
*
* @param unknown_type $data
* @param unknown_type $merge
* @param unknown_type $association
* @param unknown_type $type
*/
function __mergeAssociation(&$data, $merge, $association, $type)
{
if (isset($merge[0]) && !isset($merge[0][$association]))
@ -760,17 +789,24 @@ class DboSource extends DataSource
}
else
{
foreach ($merge as $i => $row)
if($merge[0][$association] === false)
{
if (count($row) == 1)
$data[$association] = null;
}
else
{
foreach ($merge as $i => $row)
{
$data[$association][] = $row[$association];
}
else
{
$tmp = array_merge($row[$association], $row);
unset($tmp[$association]);
$data[$association][] = $tmp;
if (count($row) == 1)
{
$data[$association][] = $row[$association];
}
else
{
$tmp = array_merge($row[$association], $row);
unset($tmp[$association]);
$data[$association][] = $tmp;
}
}
}
}
@ -798,8 +834,8 @@ class DboSource extends DataSource
$sql = 'SELECT ' . join(', ', $this->fields($model, $model->name, $queryData['fields'])). ', ';
$sql .= join(', ', $this->fields($linkModel, $alias, ''));
$sql .= ' FROM '.$this->name($model->table).' AS ' . $this->name($model->name);
$sql .= ' LEFT JOIN '.$this->name($linkModel->table).' AS ' . $this->name($alias);
$sql .= ' FROM '.$this->name($model->table).' '.$this->alias.$this->name($model->name);
$sql .= ' LEFT JOIN '.$this->name($linkModel->table).' '.$this->alias.$this->name($alias);
$sql .= ' ON ';
$sql .= $this->name($model->name).'.'.$this->name($assocData['foreignKey']);
$sql .= ' = '.$this->name($alias).'.'.$this->name($linkModel->primaryKey);
@ -868,12 +904,21 @@ class DboSource extends DataSource
{
$joinFields = null;
}
// Generates primary query
$sql = 'SELECT ' . join(', ', $this->fields($model, $model->name, $queryData['fields'])) .$joinFields. ' FROM ';
$sql .= $this->name($model->table).' AS ';
$sql .= $this->name($model->name).' ' . join(' ', $queryData['joins']).' ';
$sql .= $this->conditions($queryData['conditions']).' '.$this->order($queryData['order']);
$sql .= ' '.$this->limit($queryData['limit']);
$sql = 'SELECT ';
if ($this->goofyLimit)
{
$sql .= $this->limit($queryData['limit']);
}
$sql .= ' ' . join(', ', $this->fields($model, $model->name, $queryData['fields'])) .$joinFields. ' FROM ';
$sql .= $this->name($model->table).' '.$this->alias;
$sql .= $this->name($model->name).' ' . join(' ', $queryData['joins']).' ';
$sql .= $this->conditions($queryData['conditions']).' '.$this->order($queryData['order']);
if (!$this->goofyLimit)
{
$sql .= ' '.$this->limit($queryData['limit']);
}
}
return $sql;
}
@ -897,8 +942,18 @@ class DboSource extends DataSource
{
$assocData['fields'] = '';
}
$sql = 'SELECT '.join(', ', $this->fields($linkModel, $alias, $assocData['fields']));
$sql .= ' FROM '.$this->name($linkModel->table).' AS '.$this->name($alias).' ';
$limit = '';
if (isset($queryData['limit']) && !empty($queryData['limit']))
{
$limit = $this->limit($queryData['limit']);
}
$sql = 'SELECT ';
if ($this->goofyLimit)
{
$sql .= $limit;
}
$sql .= ' '.join(', ', $this->fields($linkModel, $alias, $assocData['fields']));
$sql .= ' FROM '.$this->name($linkModel->table).' '.$this->alias.$this->name($alias).' ';
$conditions = $queryData['conditions'];
$condition = $this->name($alias).'.'.$this->name($assocData['foreignKey']);
@ -920,7 +975,11 @@ class DboSource extends DataSource
$conditions .= $cond;
}
$sql .= $this->conditions($conditions) . $this->order($queryData['order']);
$sql .= $this->limit($queryData['limit']);
if (!$this->goofyLimit)
{
$sql .= $limit;
}
return $sql;
}
else
@ -939,7 +998,7 @@ class DboSource extends DataSource
$this->__assocJoins = null;
}
$sql = ' LEFT JOIN '.$this->name($linkModel->table);
$sql .= ' AS '.$this->name($alias).' ON '.$this->name($alias).'.';
$sql .= ' '.$this->alias.$this->name($alias).' ON '.$this->name($alias).'.';
$sql .= $this->name($assocData['foreignKey']).'='.$model->escapeField($model->primaryKey);
if ($assocData['order'] != null)
@ -969,12 +1028,23 @@ class DboSource extends DataSource
case 'belongsTo':
if ($external)
{
$limit = '';
if (isset($assocData['limit']))
{
$limit = $this->limit($assocData['limit']);
}
if(!isset($assocData['fields']))
{
$assocData['fields'] = '';
}
$sql = 'SELECT '.join(', ', $this->fields($linkModel, $alias, $assocData['fields']));
$sql .= ' FROM '.$this->name($linkModel->table).' AS '.$this->name($alias).' ';
$sql = 'SELECT ';
if ($this->goofyLimit)
{
$sql .= $limit;
}
$sql .= ' '.join(', ', $this->fields($linkModel, $alias, $assocData['fields']));
$sql .= ' FROM '.$this->name($linkModel->table).' '.$this->alias.$this->name($alias).' ';
$conditions = $assocData['conditions'];
@ -994,9 +1064,9 @@ class DboSource extends DataSource
$conditions .= $condition;
}
$sql .= $this->conditions($conditions) . $this->order($assocData['order']);
if (isset($assocData['limit']))
if (!$this->goofyLimit)
{
$sql .= $this->limit($assocData['limit']);
$sql .= $limit;
}
return $sql;
}
@ -1016,7 +1086,7 @@ class DboSource extends DataSource
$this->__assocJoins = null;
}
$sql = ' LEFT JOIN '.$this->name($linkModel->table);
$sql .= ' AS ' . $this->name($alias) . ' ON ';
$sql .= ' '.$this->alias . $this->name($alias) . ' ON ';
$sql .= $this->name($model->name).'.'.$this->name($assocData['foreignKey']);
$sql .= '='.$this->name($alias).'.'.$this->name($linkModel->primaryKey);
@ -1046,9 +1116,20 @@ class DboSource extends DataSource
}
else
{
$limit = '';
if (isset($assocData['limit']))
{
$limit = $this->limit($assocData['limit']);
}
$conditions = $assocData['conditions'];
$sql = 'SELECT '.join(', ', $this->fields($linkModel, $alias, $assocData['fields']));
$sql .= ' FROM '.$this->name($linkModel->table).' AS '. $this->name($alias);
$sql = 'SELECT ';
if ($this->goofyLimit)
{
$sql .= $limit;
}
$sql .= ' '.join(', ', $this->fields($linkModel, $alias, $assocData['fields']));
$sql .= ' FROM '.$this->name($linkModel->table).' '.$this->alias. $this->name($alias);
if (is_array($conditions))
{
@ -1068,9 +1149,9 @@ class DboSource extends DataSource
$sql .= $this->conditions($conditions);
$sql .= $this->order($assocData['order']);
if (isset($assocData['limit']))
if (!$this->goofyLimit)
{
$sql .= $this->limit($assocData['limit']);
$sql .= $limit;
}
}
return $sql;
@ -1084,8 +1165,18 @@ class DboSource extends DataSource
{
$joinTbl = $this->name($assocData['joinTable']);
$sql = 'SELECT '.join(', ', $this->fields($linkModel, $alias, $assocData['fields']));
$sql .= ' FROM '.$this->name($linkModel->table).' AS '.$this->name($alias);
$limit = '';
if (isset($assocData['limit']))
{
$limit = $this->limit($assocData['limit']);
}
$sql = 'SELECT ';
if ($this->goofyLimit)
{
$sql .= $limit;
}
$sql .= ' '.join(', ', $this->fields($linkModel, $alias, $assocData['fields']));
$sql .= ' FROM '.$this->name($linkModel->table).' '.$this->alias.$this->name($alias);
$sql .= ' JOIN '.$joinTbl.' ON '.$joinTbl;
$sql .= '.'.$this->name($assocData['foreignKey']).'={$__cakeID__$}';
$sql .= ' AND '.$joinTbl.'.'.$this->name($assocData['associationForeignKey']);
@ -1093,9 +1184,9 @@ class DboSource extends DataSource
$sql .= $this->conditions($assocData['conditions']);
$sql .= $this->order($assocData['order']);
if (isset($assocData['limit']))
if (!$this->goofyLimit)
{
$sql .= $this->limit($assocData['limit']);
$sql .= $limit;
}
}
return $sql;
@ -1112,7 +1203,7 @@ class DboSource extends DataSource
* @param array $values
* @return array
*/
function update (&$model, $fields = null, $values = null)
function update (&$model, $fields = array(), $values = array())
{
$updates = array();
$combined = array_combine($fields, $values);
@ -1413,13 +1504,30 @@ class DboSource extends DataSource
return $out;
}
/**
* To be overridden in subclasses.
* Returns a limit statement in the correct format for the particular database.
*
* @param int $limit Limit of results returned
* @param int $offset Offset from which to start results
* @return string SQL limit/offset statement
*/
function limit ()
function limit ($limit, $offset = null)
{
if ($limit)
{
$rt = '';
if (!strpos(strtolower($limit), 'limit') || strpos(strtolower($limit), 'limit') === 0)
{
$rt = ' LIMIT';
}
if ($offset)
{
$rt .= ' ' . $offset. ',';
}
$rt .= ' ' . $limit;
return $rt;
}
return null;
}
/**
@ -1565,8 +1673,8 @@ class DboSource extends DataSource
*/
function hasAny($table, $sql)
{
$out = $this->one("SELECT COUNT(*) AS count FROM {$table}".($sql? " WHERE {$sql}":""));
return is_array($out)? $out[0]['count']: false;
$out = $this->one("SELECT COUNT(*) ".$this->alias."count FROM {$table}".($sql? " WHERE {$sql}":""));
return is_array($out)? $out[0]['count']: false;
}
/**

View file

@ -61,6 +61,23 @@ class DboAdodb extends DboSource
*/
var $_adodb = null;
/**
* Array translating ADOdb column MetaTypes to cake-supported metatypes
*
* @var array
* @access private
*/
var $_adodb_column_types = array(
'C' => 'string',
'X' => 'text',
'D' => 'date',
'T' => 'timestamp',
'L' => 'boolean',
'N' => 'float',
'I' => 'integer',
'R' => 'integer', // denotes auto-increment or counter field
'B' => 'binary');
/**
* Connects to the database using options in the given configuration array.
*
@ -106,7 +123,7 @@ class DboAdodb extends DboSource
* @param string $sql SQL statement
* @return resource Result resource identifier
*/
function execute ($sql)
function _execute ($sql)
{
return $this->_adodb->execute($sql);
}
@ -116,10 +133,14 @@ class DboAdodb extends DboSource
*
* @return array The fetched row as an array
*/
function fetchRow ()
{
return $this->_result->FetchRow();
}
function fetchRow ()
{
if($this->_result->EOF)
{
return null;
}
return $this->_result->FetchRow();
}
/**
* Begin a transaction
@ -193,20 +214,27 @@ class DboAdodb extends DboSource
}
/**
* Returns an array of the fields in given table name.
* Returns an array of the fields in the table used by the given model.
*
* @param string $tableName Name of database table to inspect
*
* @param AppModel $model Model object
* @return array Fields in table. Keys are name and type
*/
function fields ($tableName)
function describe (&$model)
{
$data = $this->_adodb->MetaColumns($tableName);
$fields = false;
foreach ($data as $item)
$fields[] = array('name'=>$item->name, 'type'=>$item->type);
return $fields;
$cache = parent::describe($model);
if ($cache != null)
{
return $cache;
}
$fields = false;
$cols = $this->_adodb->MetaColumns($model->table);
foreach ($cols as $column)
{
$fields[] = array('name'=>$column->name, 'type'=>$column->type);
}
$this->__cacheDescription($model->table, $fields);
return $fields;
}
/**
@ -279,6 +307,87 @@ class DboAdodb extends DboSource
// adodb doesn't allow us to get the correct limit string out of it
}
}
/**
* Converts database-layer column types to basic types
*
* @param string $real Real database-layer column type (i.e. "varchar(255)")
* @return string Abstract column type (i.e. "string")
*/
function column($real)
{
if ( isset( $this->_result ))
{
$adodb_metatyper = & $this->_result;
}
else
{
$adodb_metatyper = & $this->_adodb->execute('Select 1');
}
$interpreted_type = $adodb_metatyper->MetaType($real);
if (!isset($this->_adodb_column_types[$interpreted_type]))
{
return 'text';
}
return $this->_adodb_column_types[ $interpreted_type ] ;
}
/**
* Returns a quoted and escaped string of $data for use in an SQL statement.
*
* @param string $data String to be prepared for use in an SQL statement
* @param string $column_type The type of the column into which this data will be inserted
* @param boolean $safe Whether or not numeric data should be handled automagically if no column data is provided
* @return string Quoted and escaped data
*/
function value ($data, $column = null, $safe = false)
{
$parent = parent::value($data, $column, $safe);
if ($parent != null)
{
return $parent;
}
if ($data === null)
{
return 'NULL';
}
if($data == '')
{
return "''";
}
if (ini_get('magic_quotes_gpc') == 1)
{
$data = stripslashes($data);
}
return $this->_adodb->qstr( $data );
}
/**
* Returns an array of all result rows for a given SQL query.
* Returns false if no rows matched.
*
* @param string $sql SQL statement
* @param boolean $cache Enables returning/storing cached query results
* @param string $modelName Name of model for first array dimension of results
* @return array Array of resultset rows, or false if no rows matched
*/
function fetchAll ($sql, $cache = true, $modelName = null)
{
$result = parent::fetchAll( $sql, $cache );
if (!$result)
{
return false;
}
foreach($result as $key => $value)
{
$return[$key][$modelName] = $value;
}
return $return;
}
}
?>

View file

@ -66,6 +66,13 @@ class DboMssql extends DboSource
*/
var $endQuote = "]";
/**
* Enter description here...
*
* @var unknown_type
*/
var $goofyLimit = true;
/**
* Base configuration settings for MS SQL driver
*
@ -84,7 +91,7 @@ class DboMssql extends DboSource
*
* @var array
*/
var $columns = array('primary_key' => array('name' => 'int(11) DEFAULT NULL auto_increment'),
var $columns = array('primary_key' => array('name' => 'int(11) DEFAULT NULL auto_increment'),
'string' => array('name' => 'varchar', 'limit' => '255'),
'text' => array('name' => 'text'),
'integer' => array('name' => 'int', 'limit' => '11', 'formatter' => 'intval'),
@ -196,7 +203,7 @@ class DboMssql extends DboSource
if (!$result || empty($result))
{
return null;
return array();
}
else
{
@ -213,7 +220,7 @@ class DboMssql extends DboSource
/**
* Returns an array of the fields in given table name.
*
* @param string $tableName Name of database table to inspect
* @param Model $model Model object to describe
* @return array Fields in table. Keys are name and type
*/
function describe (&$model)
@ -414,6 +421,28 @@ class DboMssql extends DboSource
return false;
}
/**
* Removes Identity (primary key) column from update data before returning to parent
*
* @param Model $model
* @param array $fields
* @param array $values
* @return array
*/
function update (&$model, $fields = array(), $values = array())
{
foreach ($fields as $i => $field)
{
if ($field == $model->primaryKey)
{
unset($fields[$i]);
unset($values[$i]);
break;
}
}
return parent::update($model, $fields, $values);
}
/**
* Returns a formatted error message from previous database operation.
*
@ -486,13 +515,9 @@ class DboMssql extends DboSource
if ($limit)
{
$rt = '';
if (!strpos(strtolower($limit), 'limit') || strpos(strtolower($limit), 'limit') === 0)
if (!strpos(strtolower($limit), 'top') || strpos(strtolower($limit), 'top') === 0)
{
$rt = ' LIMIT';
}
if ($offset)
{
$rt .= ' ' . $offset. ',';
$rt = ' TOP';
}
$rt .= ' ' . $limit;
return $rt;
@ -508,6 +533,16 @@ class DboMssql extends DboSource
*/
function column($real)
{
if (is_array($real))
{
$col = $real['name'];
if (isset($real['limit']))
{
$col .= '('.$real['limit'].')';
}
return $col;
}
$col = r(')', '', $real);
$limit = null;
@list($col, $limit) = explode('(', $col);

View file

@ -181,7 +181,7 @@ class DboMysql extends DboSource
$result = mysql_list_tables($this->config['database'], $this->connection);
if (!$result)
{
return null;
return array();
}
else
{
@ -402,32 +402,6 @@ class DboMysql extends DboSource
return mysql_insert_id($this->connection);
}
/**
* Returns a limit statement in the correct format for the particular database.
*
* @param int $limit Limit of results returned
* @param int $offset Offset from which to start results
* @return string SQL limit/offset statement
*/
function limit ($limit, $offset = null)
{
if ($limit)
{
$rt = '';
if (!strpos(strtolower($limit), 'limit') || strpos(strtolower($limit), 'limit') === 0)
{
$rt = ' LIMIT';
}
if ($offset)
{
$rt .= ' ' . $offset. ',';
}
$rt .= ' ' . $limit;
return $rt;
}
return null;
}
/**
* Converts database-layer column types to basic types
*
@ -436,6 +410,16 @@ class DboMysql extends DboSource
*/
function column($real)
{
if (is_array($real))
{
$col = $real['name'];
if (isset($real['limit']))
{
$col .= '('.$real['limit'].')';
}
return $col;
}
$col = r(')', '', $real);
$limit = null;
@list($col, $limit) = explode('(', $col);

View file

@ -0,0 +1,503 @@
<?php
/* SVN FILE: $Id$ */
/**
* ODBC for DBO
*
* Long description for file
*
* PHP versions 4 and 5
*
* CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright (c) 2006, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @filesource
* @copyright Copyright (c) 2006, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage cake.cake.libs.model.dbo
* @since CakePHP v 0.10.5.1790
* @version $Revision$
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
/**
* Include DBO.
*/
uses('model'.DS.'datasources'.DS.'dbo_source');
classÊDboOdbcÊextendsÊDboSource
{
/**
Ê*ÊEnterÊdescriptionÊhere...
Ê*
Ê*Ê@varÊunknown_type
Ê*/
ÊÊÊÊvarÊ$descriptionÊ=Ê"ODBCÊDBOÊDriver";
/**
Ê*ÊEnterÊdescriptionÊhere...
Ê*
Ê*Ê@varÊunknown_type
Ê*/
ÊÊÊÊvarÊ$startQuoteÊ=Ê"`";
/**
Ê*ÊEnterÊdescriptionÊhere...
Ê*
Ê*Ê@varÊunknown_type
Ê*/
ÊÊÊÊvarÊ$endQuoteÊ=Ê"`";
/**
Ê*ÊEnterÊdescriptionÊhere...
Ê*
Ê*Ê@varÊunknown_type
Ê*/
ÊÊÊÊvarÊ$_baseConfigÊ=Êarray('persistent'Ê=>Êtrue,
ÊÊÊÊ 'login'ÊÊÊÊÊÊ=>Ê'root',
ÊÊ ÊÊ'password'ÊÊÊÊ=>Ê'',
ÊÊÊÊ 'database'ÊÊÊÊ=>Ê'cake');
/**
Ê*ÊEnterÊdescriptionÊhere...
Ê*
Ê*Ê@varÊunknown_type
Ê*/
ÊÊÊÊ
ÊÊÊÊvarÊ$columnsÊ=Êarray();
ÊÊÊÊ
//ÊÊÊÊvarÊ$columnsÊ=Êarray('primary_key'Ê=>Êarray('name'Ê=>Ê'int(11)ÊDEFAULTÊNULLÊauto_increment'),
//ÊÊÊÊ'string'ÊÊÊÊÊÊ=>Êarray('name'Ê=>Ê'varchar',Ê'limit'Ê=>Ê'255'),
//ÊÊÊÊ'text'ÊÊÊÊÊÊÊÊ=>Êarray('name'Ê=>Ê'text'),
//ÊÊÊÊ'integer'ÊÊÊÊÊ=>Êarray('name'Ê=>Ê'int',Ê'limit'Ê=>Ê'11'),
//ÊÊÊÊ'float'ÊÊÊÊÊÊÊ=>Êarray('name'Ê=>Ê'float'),
//ÊÊÊÊ'datetime'ÊÊÊÊ=>Êarray('name'Ê=>Ê'datetime',Ê'format'Ê=>Ê'Y-m-dÊh:i:s',Ê'formatter'Ê=>Ê'date'),
//ÊÊÊÊ'timestamp'ÊÊÊ=>Êarray('name'Ê=>Ê'datetime',Ê'format'Ê=>Ê'Y-m-dÊh:i:s',Ê'formatter'Ê=>Ê'date'),
//ÊÊÊÊ'time'ÊÊÊÊÊÊÊÊ=>Êarray('name'Ê=>Ê'time',Ê'format'Ê=>Ê'h:i:s',Ê'formatter'Ê=>Ê'date'),
//ÊÊÊÊ'date'ÊÊÊÊÊÊÊÊ=>Êarray('name'Ê=>Ê'date',Ê'format'Ê=>Ê'Y-m-d',Ê'formatter'Ê=>Ê'date'),
//ÊÊÊÊ'binary'ÊÊÊÊÊÊ=>Êarray('name'Ê=>Ê'blob'),
//ÊÊÊÊ'boolean'ÊÊÊÊÊ=>Êarray('name'Ê=>Ê'tinyint',Ê'limit'Ê=>Ê'1'));
/**
Ê*ÊEnterÊdescriptionÊhere...
Ê*
Ê*Ê@paramÊunknown_typeÊ$config
Ê*Ê@returnÊunknown
Ê*/
ÊÊÊÊfunctionÊ__constructÊ($config)
ÊÊÊÊ{
ÊÊÊÊÊÊÊÊreturn parent::__construct($config);
ÊÊÊÊ}
/**
Ê*ÊConnectsÊtoÊtheÊdatabaseÊusingÊoptionsÊinÊtheÊgivenÊconfigurationÊarray.
Ê*
Ê*Ê@returnÊbooleanÊTrueÊifÊtheÊdatabaseÊcouldÊbeÊconnected,ÊelseÊfalse
Ê*/
ÊÊÊÊfunctionÊconnectÊ()
ÊÊÊÊ{
ÊÊÊÊÊÊÊÊ$configÊ=Ê$this->config;
ÊÊÊÊÊÊÊÊ$connectÊ=Ê$config['connect'];
ÊÊÊÊÊÊÊÊ$this->connectedÊ=Êfalse;
ÊÊÊÊÊÊÊÊ$this->connectionÊ=Ê$connect($config['database'],Ê$config['login'],Ê$config['password']);
ÊÊÊÊÊÊÊÊifÊ($this->connection)
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊ$this->connectedÊ=Êtrue;
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊelse
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊ//die('CouldÊnotÊconnectÊtoÊDB.');
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊ}
/**
Ê*ÊDisconnectsÊfromÊdatabase.
Ê*
Ê*Ê@returnÊbooleanÊTrueÊifÊtheÊdatabaseÊcouldÊbeÊdisconnected,ÊelseÊfalse
Ê*/
ÊÊÊÊfunctionÊdisconnectÊ()
ÊÊÊÊ{
ÊÊÊÊÊÊÊÊreturnÊ@odbc_close($this->connection);
ÊÊÊÊ}
/**
Ê*ÊExecutesÊgivenÊSQLÊstatement.
Ê*
Ê*Ê@paramÊstringÊ$sqlÊSQLÊstatement
Ê*Ê@returnÊresourceÊResultÊresourceÊidentifier
Ê*Ê@accessÊprotected
Ê*/
ÊÊÊÊfunctionÊ_executeÊ($sql)
ÊÊÊÊ{
ÊÊÊÊÊÊÊÊreturnÊodbc_exec($this->connection,Ê$sql);
ÊÊÊÊ}
/**
Ê*ÊReturnsÊaÊrowÊfromÊgivenÊresultsetÊasÊanÊarrayÊ.
Ê*
Ê*Ê@paramÊboolÊ$assocÊAssociativeÊarrayÊonly,ÊorÊboth?
Ê*Ê@returnÊarrayÊTheÊfetchedÊrowÊasÊanÊarray
Ê*/
ÊÊÊÊfunctionÊfetchRowÊ($assocÊ=Êfalse)
ÊÊÊÊ{
ÊÊÊÊÊÊÊÊif(is_resource($this->_result))
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊ$this->resultSet($this->_result);
ÊÊÊÊÊÊÊÊÊÊÊÊ$resultRowÊ=Ê$this->fetchResult();
ÊÊÊÊÊÊÊÊÊÊÊÊreturnÊ$resultRow;
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊelse
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊreturnÊnull;
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊ}
/**
Ê*ÊReturnsÊanÊarrayÊofÊsourcesÊ(tables)ÊinÊtheÊdatabase.
Ê*
Ê*Ê@returnÊarrayÊArrayÊofÊtablenamesÊinÊtheÊdatabase
Ê*/
ÊÊÊÊfunctionÊlistSourcesÊ()
ÊÊÊÊ{
ÊÊÊÊÊÊÊÊ$resultÊ=Êodbc_tables($this->connection);
ÊÊÊÊÊÊÊÊifÊ(!$result)
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊreturnÊarray();
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊelse
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊ$tablesÊ=Êarray();
ÊÊÊÊÊÊÊÊÊÊÊÊwhileÊ($lineÊ=Êodbc_fetch_array($result))
ÊÊÊÊÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊ$tables[]Ê=Êstrtolower($line['TABLE_NAME']);
ÊÊÊÊÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊÊÊÊÊreturnÊ$tables;
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊ}
/**
* Returns an array of the fields in given table name.
*
* @param Model $model Model object to describe
* @return array Fields in table. Keys are name and type
*/
ÊÊÊÊfunctionÊ&describeÊ(&$model)
ÊÊÊÊ{
ÊÊÊÊÊÊÊÊ$cacheÊ=Êparent::describe($model);
ÊÊÊÊÊÊÊÊifÊ($cacheÊ!=Ênull)
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊreturnÊ$cache;
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊ$fieldsÊ=Êarray();
ÊÊÊÊÊÊÊÊ$sqlÊ=Ê'SELECTÊ*ÊFROMÊ'Ê.Ê$this->name($model->table) . ' LIMIT 1';
ÊÊÊÊÊÊÊÊ$resultÊ=Êodbc_exec($this->connection,Ê$sql);
$count = odbc_num_fields($result);
ÊÊÊÊÊÊÊÊforÊ($i = 1;Ê$iÊ<=Ê$count;Ê$i++)
{
$cols[$i - 1]Ê=Êodbc_field_name($result,Ê$i);
}
ÊÊÊÊÊÊÊÊforeachÊ($colsÊasÊ$column)
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊ$typeÊ=Êodbc_field_type(odbc_exec($this->connection,"SELECTÊ"Ê.Ê$columnÊ.Ê"ÊFROMÊ"Ê.Ê$model->table),Ê1);
ÊÊÊÊÊÊÊÊÊÊÊÊarray_push($fields,Êarray('name'Ê=>Ê$column,Ê'type'Ê=>Ê$type));
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊ$this->__cacheDescription($model->table,Ê$fields);
ÊÊÊÊÊÊÊÊreturnÊ$fields;
ÊÊÊÊ}
ÊÊÊÊÊÊÊÊ
ÊÊÊÊfunctionÊnameÊ($data)
ÊÊÊÊ{
ÊÊÊÊÊÊÊÊifÊ($dataÊ==Ê'*')
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊreturnÊ'*';
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊÊ$posÊ=Êstrpos($data,Ê'`');
ÊÊÊÊÊÊÊÊifÊ($posÊ===Êfalse)
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊ$dataÊ=Ê''Ê.Êstr_replace('.',Ê'.',Ê$data)Ê.'';
ÊÊÊÊÊÊÊÊÊÊÊÊ//$dataÊ=Ê'`'.Êstr_replace('.',Ê'`.`',Ê$data)Ê.'`';
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊreturnÊ$data;
ÊÊÊÊ}
/**
Ê*ÊReturnsÊaÊquotedÊandÊescapedÊstringÊofÊ$dataÊforÊuseÊinÊanÊSQLÊstatement.
Ê*
Ê*Ê@paramÊstringÊ$dataÊStringÊtoÊbeÊpreparedÊforÊuseÊinÊanÊSQLÊstatement
Ê*Ê@paramÊstringÊ$columnÊTheÊcolumnÊintoÊwhichÊthisÊdataÊwillÊbeÊinserted
Ê*Ê@returnÊstringÊQuotedÊandÊescaped
Ê*Ê@todoÊAddÊlogicÊthatÊformats/escapesÊdataÊbasedÊonÊcolumnÊtype
Ê*/
ÊÊÊÊfunctionÊvalueÊ($data,Ê$columnÊ=Ênull)
ÊÊÊÊ{
ÊÊÊÊÊÊÊÊ$parentÊ=Êparent::value($data,Ê$column);
ÊÊÊÊÊÊÊÊifÊ($parentÊ!=Ênull)
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊreturnÊ$parent;
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊifÊ($dataÊ===Ênull)
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊreturnÊ'NULL';
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊifÊ(ini_get('magic_quotes_gpc')Ê==Ê1)
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊ$dataÊ=Êstripslashes($data);
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊ//Ê$dataÊ=Êmysql_real_escape_string($data,Ê$this->connection);
ÊÊÊÊÊÊÊÊif(!is_numeric($data))
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊ$returnÊ=Ê"'"Ê.Ê$dataÊ.Ê"'";
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊelse
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊ$returnÊ=Ê$data;
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊreturnÊ$return;
ÊÊÊÊ}
/**
Ê*ÊNotÊsureÊaboutÊthisÊone,ÊMySQLÊneedsÊitÊbutÊdoesÊODBC?ÊÊSaferÊjustÊtoÊleaveÊit
Ê*ÊTranslatesÊbetweenÊPHPÊbooleanÊvaluesÊandÊMySQLÊ(faked)ÊbooleanÊvalues
Ê*ÊÊ
Ê*Ê@paramÊmixedÊ$dataÊValueÊtoÊbeÊtranslated
Ê*Ê@returnÊmixedÊConvertedÊbooleanÊvalue
Ê*/
ÊÊÊÊfunctionÊbooleanÊ($data)
ÊÊÊÊ{
ÊÊÊÊÊÊÊÊifÊ($dataÊ===ÊtrueÊ||Ê$dataÊ===Êfalse)
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊifÊ($dataÊ===Êtrue)
ÊÊÊÊÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊreturnÊ1;
ÊÊÊÊÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊÊÊÊÊreturnÊ0;
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊelse
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊifÊ(intval($dataÊ!==Ê0))
ÊÊÊÊÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊreturnÊtrue;
ÊÊÊÊÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊÊÊÊÊreturnÊfalse;
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊ}
/**
Ê*ÊBeginÊaÊtransaction
Ê*
Ê*Ê@paramÊunknown_typeÊ$model
Ê*Ê@returnÊbooleanÊTrueÊonÊsuccess,ÊfalseÊonÊfail
Ê*Ê(i.e.ÊifÊtheÊdatabase/modelÊdoesÊnotÊsupportÊtransactions).
Ê*/
ÊÊÊÊfunctionÊbeginÊ(&$model)
ÊÊÊÊ{
ÊÊÊÊÊÊÊÊifÊ(parent::begin($model))
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊifÊ(odbc_autocommit($this->connection, false))
ÊÊÊÊÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊ$this->__transactionStartedÊ=Êtrue;
ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊreturnÊtrue;
ÊÊÊÊÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊreturnÊfalse;
ÊÊÊÊ}
/**
Ê*ÊCommitÊaÊtransaction
Ê*
Ê*Ê@paramÊunknown_typeÊ$model
Ê*Ê@returnÊbooleanÊTrueÊonÊsuccess,ÊfalseÊonÊfail
Ê*Ê(i.e.ÊifÊtheÊdatabase/modelÊdoesÊnotÊsupportÊtransactions,
Ê*ÊorÊaÊtransactionÊhasÊnotÊstarted).
Ê*/
ÊÊÊÊfunctionÊcommitÊ(&$model)
ÊÊÊÊ{
ÊÊÊÊÊÊÊÊifÊ(parent::commit($model))
ÊÊÊÊÊÊÊÊ{
if (odbc_commit($this->connection))
{
ÊÊÊÊÊÊÊÊÊÊÊÊ $this->__transactionStarted = false;
return true;
}
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊreturnÊfalse;
ÊÊÊÊ}
/**
Ê*ÊRollbackÊaÊtransaction
Ê*
Ê*Ê@paramÊunknown_typeÊ$model
Ê*Ê@returnÊbooleanÊTrueÊonÊsuccess,ÊfalseÊonÊfail
Ê*Ê(i.e.ÊifÊtheÊdatabase/modelÊdoesÊnotÊsupportÊtransactions,
Ê*ÊorÊaÊtransactionÊhasÊnotÊstarted).
Ê*/
ÊÊÊÊfunctionÊrollbackÊ(&$model)
ÊÊÊÊ{
ÊÊÊÊÊÊÊÊifÊ(parent::rollback($model))
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊ$this->__transactionStarted = false;
returnÊodbc_rollback($this->connection);
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊreturnÊfalse;
ÊÊÊÊ}
/**
Ê*ÊReturnsÊaÊformattedÊerrorÊmessageÊfromÊpreviousÊdatabaseÊoperation.
Ê*
Ê*Ê@returnÊstringÊErrorÊmessageÊwithÊerrorÊnumber
Ê*/
ÊÊÊÊfunctionÊlastErrorÊ()
ÊÊÊÊ{
ÊÊÊÊÊÊÊÊifÊ(odbc_error($this->connection))
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊreturnÊodbc_error($this->connection).':Ê'.odbc_errormsg($this->connection);
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊreturnÊnull;
ÊÊÊÊ}
/**
Ê*ÊReturnsÊnumberÊofÊaffectedÊrowsÊinÊpreviousÊdatabaseÊoperation.ÊIfÊnoÊpreviousÊoperationÊexists,
Ê*ÊthisÊreturnsÊfalse.
Ê*
Ê*Ê@returnÊintÊNumberÊofÊaffectedÊrows
Ê*/
ÊÊÊÊfunctionÊlastAffectedÊ()
ÊÊÊÊ{
ÊÊÊÊÊÊÊÊifÊ($this->_result)
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊreturnÊnull;
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊreturnÊnull;
ÊÊÊÊ}
/**
Ê*ÊReturnsÊnumberÊofÊrowsÊinÊpreviousÊresultset.ÊIfÊnoÊpreviousÊresultsetÊexists,
Ê*ÊthisÊreturnsÊfalse.
Ê*
Ê*Ê@returnÊintÊNumberÊofÊrowsÊinÊresultset
Ê*/
ÊÊÊÊfunctionÊlastNumRowsÊ()
ÊÊÊÊ{
ÊÊÊÊÊÊÊÊifÊ($this->_result)
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊreturnÊ@odbc_num_rows($this->_result);
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊreturnÊnull;
ÊÊÊÊ}
/**
Ê*ÊReturnsÊtheÊIDÊgeneratedÊfromÊtheÊpreviousÊINSERTÊoperation.
Ê*
Ê*Ê@paramÊunknown_typeÊ$source
Ê*Ê@returnÊint
Ê*/
ÊÊÊÊfunctionÊlastInsertIdÊ($sourceÊ=Ênull)
ÊÊÊÊ{
$result = $this->fetchAll('SELECT @@IDENTITY');
return $result[0];
ÊÊÊÊ}
/**
Ê*ÊEnterÊdescriptionÊhere...
Ê*
Ê*Ê@paramÊstringÊ$realÊRealÊdatabase-layerÊcolumnÊtypeÊ(i.e.Ê"varchar(255)")
Ê*/
ÊÊÊÊfunctionÊcolumn($real)
ÊÊÊÊ{
if (is_array($real))
{
$col = $real['name'];
if (isset($real['limit']))
{
$col .= '('.$real['limit'].')';
}
return $col;
}
ÊÊÊÊÊÊÊÊreturnÊ$real;
ÊÊÊÊ}
/**
Ê*ÊEnterÊdescriptionÊhere...
Ê*
Ê*Ê@paramÊunknown_typeÊ$results
Ê*/
ÊÊÊÊfunctionÊresultSet(&$results)
ÊÊÊÊ{
ÊÊÊÊÊÊÊÊ$this->resultsÊ=&Ê$results;
ÊÊÊÊÊÊÊÊ$this->mapÊ=Êarray();
ÊÊÊÊÊÊÊÊ$num_fieldsÊ=Êodbc_num_fields($results);
ÊÊÊÊÊÊÊÊ$indexÊ=Ê0;
ÊÊÊÊÊÊÊÊ$jÊ=Ê0;
ÊÊÊÊÊÊÊÊwhileÊ($jÊ<Ê$num_fields)
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊ$columnÊ=Êodbc_fetch_array($results,$j);
ÊÊÊÊÊÊÊÊÊÊÊÊifÊ(!empty($column->table))
ÊÊÊÊÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊ$this->map[$index++]Ê=Êarray($column->table,Ê$column->name);
ÊÊÊÊÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊÊÊÊÊelse
ÊÊÊÊÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊechoÊarray(0,Ê$column->name);
ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊ$this->map[$index++]Ê=Êarray(0,Ê$column->name);
ÊÊÊÊÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊÊÊÊÊ$j++;
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊ}
/**
Ê*ÊFetchesÊtheÊnextÊrowÊfromÊtheÊcurrentÊresultÊset
Ê*
Ê*Ê@returnÊunknown
Ê*/
ÊÊÊÊfunctionÊfetchResult()
ÊÊÊÊ{
ÊÊÊÊÊÊÊÊifÊ($rowÊ=Êodbc_fetch_row($this->results))
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊ$resultRowÊ=Êarray();
ÊÊÊÊÊÊÊÊÊÊÊÊ$iÊ=0;
ÊÊÊÊÊÊÊÊÊÊÊÊforeachÊ($rowÊasÊ$indexÊ=>Ê$field)
ÊÊÊÊÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊlist($table,Ê$column)Ê=Ê$this->map[$index];
ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊ$resultRow[$table][$column]Ê=Ê$row[$index];
ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊ$i++;
ÊÊÊÊÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊÊÊÊÊreturnÊ$resultRow;
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊÊÊÊÊelse
ÊÊÊÊÊÊÊÊ{
ÊÊÊÊÊÊÊÊÊÊÊÊreturnÊfalse;
ÊÊÊÊÊÊÊÊ}
ÊÊÊÊ}
ÊÊÊÊfunctionÊbuildSchemaQuery($schema)
ÊÊÊÊ{
ÊÊÊÊÊÊÊÊ$searchÊÊ=Êarray('{AUTOINCREMENT}',Ê'{PRIMARY}',Ê'{UNSIGNED}',Ê'{FULLTEXT}',
ÊÊÊÊÊÊÊÊ'{FULLTEXT_MYSQL}',Ê'{BOOLEAN}',Ê'{UTF_8}');
ÊÊÊÊÊÊÊÊ$replaceÊ=Êarray('int(11)ÊnotÊnullÊauto_increment',Ê'primaryÊkey',Ê'unsigned',
ÊÊÊÊÊÊÊÊ'FULLTEXT',Ê'FULLTEXT',Ê'enumÊ(\'true\',Ê\'false\')ÊNOTÊNULLÊdefaultÊ\'true\'',
ÊÊÊÊÊÊÊÊ'/*!40100ÊCHARACTERÊSETÊutf8ÊCOLLATEÊutf8_unicode_ciÊ*/');
ÊÊÊÊÊÊÊÊ$queryÊ=Êtrim(str_replace($search,Ê$replace,Ê$schema));
ÊÊÊÊÊÊÊÊreturnÊ$query;
ÊÊÊÊ}
}
?>

View file

@ -55,13 +55,13 @@ class DboPostgres extends DboSource
'port' => 5432);
var $columns = array(
'primary_key' => array('name' => 'serial primary key'),
'string' => array('name' => 'character varying', 'limit' => '255'),
'primary_key' => array('name' => 'serial NOT NULL'),
'string' => array('name' => 'varchar', 'limit' => '255'),
'text' => array('name' => 'text'),
'integer' => array('name' => 'integer'),
'float' => array('name' => 'float'),
'float' => array('name' => 'float'),
'datetime' => array('name' => 'timestamp'),
'timestamp' => array('name' => 'timestamp'),
'timestamp' => array('name' => 'timestamp'),
'time' => array('name' => 'time'),
'date' => array('name' => 'date'),
'binary' => array('name' => 'bytea'),
@ -82,7 +82,7 @@ class DboPostgres extends DboSource
$config = $this->config;
$connect = $config['connect'];
$this->connection = $connect("dbname={$config['database']} user={$config['login']} password={$config['password']}");
$this->connection = $connect("host={$config['host']} port={$config['port']} dbname={$config['database']} user={$config['login']} password={$config['password']}");
if ($this->connection)
{
$this->connected = true;
@ -102,7 +102,7 @@ class DboPostgres extends DboSource
*/
function disconnect ()
{
return pg_close($this->connection);
return pg_close($this->connection);
}
/**
@ -113,28 +113,7 @@ class DboPostgres extends DboSource
*/
function _execute ($sql)
{
return pg_query($this->connection, $sql);
}
function query ()
{
$args = func_get_args();
if (count($args) == 1)
{
return $this->fetchAll($args[0]);
}
elseif (count($args) > 1 && strpos(strtolower($args[0]), 'findby') === 0)
{
$field = Inflector::underscore(preg_replace('/findBy/i', '', $args[0]));
$query = '"' . $args[2]->name . '"."' . $field . '" = ' . $this->value($args[1][0]);
return $args[2]->find($query);
}
elseif (count($args) > 1 && strpos(strtolower($args[0]), 'findallby') === 0)
{
$field = Inflector::underscore(preg_replace('/findAllBy/i', '', $args[0]));
$query = '"' . $args[2]->name . '"."' . $field . '" = ' . $this->value($args[1][0]);
return $args[2]->findAll($query);
}
return pg_query($this->connection, $sql);
}
/**
@ -163,23 +142,29 @@ class DboPostgres extends DboSource
*/
function listSources ()
{
$sql = "SELECT table_name as name FROM information_schema.tables WHERE table_schema = 'public';";
$cache = parent::listSources();
if ($cache != null)
{
return $cache;
}
$result = $this->query($sql);
$sql = "SELECT table_name as name FROM INFORMATION_SCHEMA.tables WHERE table_schema = 'public';";
$result = $this->fetchAll($sql);
if (!$result)
{
return null;
}
else
{
$tables = array();
foreach ($result as $item)
{
$tables[] = $item[0]['name'];
}
return $tables;
}
if (!$result)
{
return array();
}
else
{
$tables = array();
foreach ($result as $item)
{
$tables[] = $item[0]['name'];
}
parent::listSources($tables);
return $tables;
}
}
/**
@ -257,7 +242,7 @@ class DboPostgres extends DboSource
$fields = false;
$cols = $this->query("SELECT column_name AS name, data_type AS type, is_nullable AS null, column_default AS default FROM information_schema.columns WHERE table_name =".$this->value($model->table)." ORDER BY ordinal_position");
$cols = $this->fetchAll("SELECT DISTINCT column_name AS name, data_type AS type, is_nullable AS null, column_default AS default, ordinal_position FROM information_schema.columns WHERE table_name =".$this->value($model->table)." ORDER BY ordinal_position");
foreach ($cols as $column)
{
@ -316,19 +301,29 @@ class DboPostgres extends DboSource
}
switch ($column)
{
case 'integer':
if ($data == '')
{
return 'DEFAULT';
}
else
{
$data = pg_escape_string($data);
}
break;
case 'binary':
$data = pg_escape_bytea($data);
break;
break;
case 'boolean':
$data = $this->boolean((bool)$data);
break;
break;
default:
if (ini_get('magic_quotes_gpc') == 1)
{
$data = stripslashes($data);
}
$data = pg_escape_string($data);
break;
}
$return = "'" . $data . "'";
@ -443,10 +438,10 @@ class DboPostgres extends DboSource
*/
function lastInsertId ($source, $field='id')
{
$sql = "SELECT last_value AS max FROM {$source}_{$field}_seq";
$res = $this->rawQuery($sql);
$data = $this->fetchRow($res);
return $data[0]['max'];
$sql = "SELECT last_value AS max FROM {$source}_{$field}_seq";
$res = $this->rawQuery($sql);
$data = $this->fetchRow($res);
return $data[0]['max'];
}
/**
@ -483,6 +478,16 @@ class DboPostgres extends DboSource
*/
function column($real)
{
if (is_array($real))
{
$col = $real['name'];
if (isset($real['limit']))
{
$col .= '('.$real['limit'].')';
}
return $col;
}
$col = r(')', '', $real);
$limit = null;
@list($col, $limit) = explode('(', $col);
@ -499,7 +504,7 @@ class DboPostgres extends DboSource
{
return 'boolean';
}
if (strpos($col, 'integer') !== false)
if (strpos($col, 'int') !== false && $col != 'interval')
{
return 'integer';
}
@ -515,7 +520,7 @@ class DboPostgres extends DboSource
{
return 'binary';
}
if (in_array($col, array('float', 'double', 'decimal', 'real')))
if (in_array($col, array('float', 'float4', 'float8', 'double', 'decimal', 'real')))
{
return 'float';
}
@ -645,7 +650,15 @@ class DboPostgres extends DboSource
{
$insert = $this->value($value, $model->getColumnType($fields[$count]));
}
$valueInsert[] = $insert;
if ($insert === '\'\'')
{
unset($fieldInsert[$count]);
}
else
{
$valueInsert[] = $insert;
}
unset($insert);
$count++;
}

View file

@ -453,8 +453,15 @@ class Model extends Object
foreach ($this->{$type} as $assoc => $value)
{
if (is_numeric($assoc))
{
unset($this->{$type}[$assoc]);
$assoc = $value;
$value = array();
$this->{$type}[$assoc] = $value;
}
$className = $assoc;
if (isset($value['className']) && $value['className'] !== null)
if (isset($value['className']) && !empty($value['className']))
{
$className = $value['className'];
}
@ -480,11 +487,11 @@ class Model extends Object
$colKey = Inflector::underscore($className);
if(ClassRegistry::isKeySet($colKey))
{
$this->{$className} =& ClassRegistry::getObject($colKey);
$this->{$className} = ClassRegistry::getObject($colKey);
}
else
{
$this->{$className} =& new $className();
$this->{$className} = new $className();
}
$this->alias[$assoc] = $this->{$className}->table;
@ -590,15 +597,22 @@ class Model extends Object
* @param string $two Value string for the alternative indata method
* @return unknown
*/
function set ($one, $two=null)
function set ($one, $two = null)
{
if (is_array($one))
{
$data = $one;
if (countdim($one) == 1)
{
$data = array($this->name => $one);
}
else
{
$data = $one;
}
}
else
{
$data = array($one=>$two);
$data = array($this->name => array($one => $two));
}
foreach ($data as $n => $v)
@ -823,6 +837,7 @@ class Model extends Object
}
$whitelist = !(empty($fieldList) || count($fieldList) == 0);
$this->validationErrors = array();
if(!$this->beforeValidate())
{
@ -976,8 +991,8 @@ class Model extends Object
foreach ($y as $assoc => $value)
{
$joinTable[] = $this->hasAndBelongsToMany[$assoc]['joinTable'];
$mainKey = $this->hasAndBelongsToMany[$assoc]['foreignKey'];
$keys[] = $mainKey;
$mainKey[] = $this->hasAndBelongsToMany[$assoc]['foreignKey'];
$keys[] = $this->hasAndBelongsToMany[$assoc]['foreignKey'];
$keys[] = $this->hasAndBelongsToMany[$assoc]['associationForeignKey'];
$fields[] = join(',', $keys);
unset($keys);
@ -1005,7 +1020,7 @@ class Model extends Object
for ($count = 0; $count < $total; $count++)
{
$db =& ConnectionManager::getDataSource($this->useDbConfig);
$db->execute("DELETE FROM {$joinTable[$count]} WHERE $mainKey = '{$id}'");
$db->execute("DELETE FROM {$joinTable[$count]} WHERE {$mainKey[$count]} = '{$id}'");
if(!empty($newValue[$count]))
{
$db->execute("INSERT INTO {$joinTable[$count]} ({$fields[$count]}) VALUES {$newValue[$count]}");

View file

@ -449,8 +449,15 @@ class Model extends Object
foreach ($this->{$type} as $assoc => $value)
{
if (is_numeric($assoc))
{
unset($this->{$type}[$assoc]);
$assoc = $value;
$value = array();
$this->{$type}[$assoc] = $value;
}
$className = $assoc;
if (isset($value['className']) && $value['className'] !== null)
if (isset($value['className']) && !empty($value['className']))
{
$className = $value['className'];
}
@ -586,15 +593,22 @@ class Model extends Object
* @param string $two Value string for the alternative indata method
* @return unknown
*/
function set ($one, $two=null)
function set ($one, $two = null)
{
if (is_array($one))
{
$data = $one;
if (countdim($one) == 1)
{
$data = array($this->name => $one);
}
else
{
$data = $one;
}
}
else
{
$data = array($one=>$two);
$data = array($this->name => array($one => $two));
}
foreach ($data as $n => $v)
@ -819,6 +833,7 @@ class Model extends Object
}
$whitelist = !(empty($fieldList) || count($fieldList) == 0);
$this->validationErrors = array();
if(!$this->beforeValidate())
{
@ -972,8 +987,8 @@ class Model extends Object
foreach ($y as $assoc => $value)
{
$joinTable[] = $this->hasAndBelongsToMany[$assoc]['joinTable'];
$mainKey = $this->hasAndBelongsToMany[$assoc]['foreignKey'];
$keys[] = $mainKey;
$mainKey[] = $this->hasAndBelongsToMany[$assoc]['foreignKey'];
$keys[] = $this->hasAndBelongsToMany[$assoc]['foreignKey'];
$keys[] = $this->hasAndBelongsToMany[$assoc]['associationForeignKey'];
$fields[] = join(',', $keys);
unset($keys);
@ -1001,7 +1016,7 @@ class Model extends Object
for ($count = 0; $count < $total; $count++)
{
$db =& ConnectionManager::getDataSource($this->useDbConfig);
$db->execute("DELETE FROM {$joinTable[$count]} WHERE $mainKey = '{$id}'");
$db->execute("DELETE FROM {$joinTable[$count]} WHERE {$mainKey[$count]} = '{$id}'");
if(!empty($newValue[$count]))
{
$db->execute("INSERT INTO {$joinTable[$count]} ({$fields[$count]}) VALUES {$newValue[$count]}");

View file

@ -91,7 +91,7 @@ class Object
* Calls a controller's method from any location.
*
* @param string $url URL in the form of Cake URL ("/controller/method/parameter")
* @param array $extra If array includes the key "render" it sets the AutoRender to true.
* @param array $extra If array includes the key "return" it sets the AutoRender to true.
* @return boolean Success
*/
function requestAction ($url, $extra = array())

View file

@ -52,6 +52,23 @@ class Router extends Object {
*/
var $routes = array();
function __construct ()
{
if(defined('CAKE_ADMIN'))
{
$admin = CAKE_ADMIN;
if(!empty($admin))
{
$this->routes[] = array (
'/:'.$admin.'/:controller/:action/* (default)',
'/^(?:\/(?:('.$admin.')(?:\\/([a-zA-Z0-9_\\-\\.]+)(?:\\/([a-zA-Z0-9_\\-\\.]+)(?:[\\/\\?](.*))?)?)?))[\/]*$/',
array($admin, 'controller', 'action'),
array()
);
}
}
}
/**
* TODO: Better description. Returns this object's routes array. Returns false if there are no routes available.
*
@ -134,21 +151,6 @@ class Router extends Object {
array('controller', 'action'),
array());
if(defined('CAKE_ADMIN'))
{
$admin = CAKE_ADMIN;
if(!empty($admin))
{
$this->routes[] = array
(
'/:'.$admin.'/:controller/:action/* (default)',
'/^(?:\/(?:('.$admin.')(?:\\/([a-zA-Z0-9_\\-\\.]+)(?:\\/([a-zA-Z0-9_\\-\\.]+)(?:[\\/\\?](.*))?)?)?))[\/]*$/',
array($admin, 'controller', 'action'),
array());
}
}
$this->connect('/bare/:controller/:action/*', array('bare'=>'1'));
$this->connect('/ajax/:controller/:action/*', array('bare'=>'1'));

View file

@ -334,18 +334,19 @@ class FormHelper extends Helper
*/
function generateSelectDiv($tagName, $prompt, $options, $selected=null, $selectAttr=null, $optionAttr=null, $required=false, $errorMsg=null)
{
$selectAttr['id'] = strtolower(str_replace('/', '_',$tagName));;
$selectAttr['id'] = strtolower(str_replace('/', '_',$tagName));
$str = $this->Html->selectTag( $tagName, $options, $selected, $selectAttr, $optionAttr );
$strLabel = $this->labelTag( $tagName, $prompt );
$divClass = "optional";
if( $required )
$divClass = "required";
if($required)
{
$divClass = "required";
}
$strError = "";// initialize the error to empty.
if( $this->isFieldError( $tagName ) )
if($this->isFieldError($tagName))
{
// if it was an error that occured, then add the error message, and append " error" to the div tag.
$strError = $this->pTag( 'error', $errorMsg );

View file

@ -1083,7 +1083,7 @@ function url($url = null, $return = false)
}
}
// do not display the select tag if no option elements are avaible
if (!is_array($optionElements) || count($optionElements) == 0)
if (!is_array($optionElements))
{
return null;
}

View file

@ -214,33 +214,72 @@ class JavascriptHelper extends Helper
* @param string $q The type of quote to use
* @return string A JSON code block
*/
function object ($data = array(), $block = false, $prefix = '', $postfix = '', $stringKeys = array(), $quoteKeys = true, $q = "'")
function object ($data = array(), $block = false, $prefix = '', $postfix = '', $stringKeys = array(), $quoteKeys = true, $q = "\"")
{
if (is_object($data))
{
$data = get_object_vars($data);
}
$out = array();
$key = array();
if (is_array($data))
{
$keys = array_keys($data);
}
$numeric = true;
if (!empty($keys))
{
foreach ($keys as $key)
{
if (!is_numeric($key))
{
$numeric = false;
break;
}
}
}
foreach($data as $key => $val)
{
if (is_array($val))
{
$out[] = $key.':'.$this->object($val, false, '', '', $stringKeys, $quoteKeys, $q);
}
else
{
if ((!count($stringKeys) && !is_numeric($val) && !is_bool($val)) || ($quoteKeys && in_array($key, $stringKeys)) || (!$quoteKeys && !in_array($key, $stringKeys)))
{
$val = $q.$val.$q;
}
if (trim($val) == '')
{
$val = 'null';
}
$out[] = $key.':'.$val;
}
if (is_array($val) || is_object($val))
{
$val = $this->object($val, false, '', '', $stringKeys, $quoteKeys, $q);
$out[] = $val;
}
else
{
if ((!count($stringKeys) && !is_numeric($val) && !is_bool($val)) || ($quoteKeys && in_array($key, $stringKeys)) || (!$quoteKeys && !in_array($key, $stringKeys)))
{
$val = $q.$val.$q;
}
if (trim($val) == '')
{
$val = 'null';
}
}
if (!$numeric)
{
$val = $key.':'.$val;
}
$out[] = $val;
}
$rt = $prefix.'{'.join(', ', $out).'}'.$postfix;
if (!$numeric)
{
$rt = '{'.join(', ', $out).'}';
}
else
{
$rt = 'new Array('.join(', ', $out).')';
}
$rt = $prefix.$rt.$postfix;
if ($block)
{
return $this->codeBlock($rt);
$rt = $this->codeBlock($rt);
}
return $rt;
}

View file

@ -49,7 +49,8 @@ if(!empty($this->controller->{$model}->alias))
}
}
?>
<table class="inav" cellspacing="0">
<table class="inav" cellpadding="1">
<thead>
<tr>
<?php
foreach ($fieldNames as $fieldName)
@ -60,6 +61,8 @@ foreach ($fieldNames as $fieldName)
}
?>
<th>Actions</th>
</thead>
<tbody>
</tr>
<?php
$iRowIndex = 0;
@ -116,6 +119,7 @@ if(is_array($data))
}
}
?>
</tbody>
</table>
<ul class="actions">
<li><?php echo $html->link('New '.$humanSingularName, $path.$this->viewPath.'/add'); ?></li>

View file

@ -33,15 +33,39 @@ ini_set('error_reporting', '7');
define ('DS', DIRECTORY_SEPARATOR);
/**
* Change these setting only if your install
* is different from a distribution install.
*
*/
define ('ROOT', dirname(dirname(dirname(__FILE__))).DS);
define ('APP_DIR', 'app');
define('CAKE_CORE_INCLUDE_PATH', ROOT);
define('CORE_PATH', CAKE_CORE_INCLUDE_PATH);
$app = 'app';
$core = null;
$root = dirname(dirname(dirname(__FILE__)));
$here = $argv[0];
$dataSource = 'default';
for ($i = 1; $i < count($argv); $i += 2)
{
// Process command-line modifiers here
switch (strtolower($argv[$i]))
{
case '-app':
$app = $argv[$i + 1];
break;
case '-core':
$core = $argv[$i + 1];
break;
case '-root':
$root = $argv[$i + 1];
break;
case '-datasource':
$dataSource = $argv[$i + 1];
break;
}
}
define ('ROOT', $root.DS);
define ('APP_DIR', $app);
define ('APP_PATH', $app.DS);
define ('DEBUG', 1);
define ('CORE_PATH', $core);
define ('CAKE_CORE_INCLUDE_PATH', ROOT);
define('DATASOURCE', $dataSource);
define ('DEBUG', 1);
ini_set('include_path',ini_get('include_path').PATH_SEPARATOR.CAKE_CORE_INCLUDE_PATH.PATH_SEPARATOR.ROOT.DS.APP_DIR.DS);
@ -49,7 +73,14 @@ ini_set('include_path',ini_get('include_path').PATH_SEPARATOR.CAKE_CORE_INCLUDE_
require ('cake'.DS.'basics.php');
require ('cake'.DS.'config'.DS.'paths.php');
require (CONFIGS.'core.php');
require (CONFIGS.'database.php');
if (file_exists( CONFIGS.'database.php' ))
{
require_once (CONFIGS.'database.php');
}
else
{
die("Unable to find /app/config/database.php. Please create it before continuing.\n\n");
}
uses ('neat_array');
uses ('object');
uses ('session');
@ -143,6 +174,7 @@ class AclCLI {
*/
function __construct ($command, $args)
{
$this->dataSource = DATASOURCE;
$acl = new AclComponent();
$this->acl = $acl->getACL();
@ -255,7 +287,7 @@ class AclCLI {
extract($this->__dataVars());
$node = &new $class;
if (!$node->setParent(intval($this->args[2]), intval($this->args[1])))
if (!$node->setParent($this->args[2], $this->args[1]))
{
fwrite($this->stdout, "Error in setting new parent. Please make sure the parent node exists, and is not a descendant of the node specified.\n");
}
@ -377,37 +409,38 @@ class AclCLI {
$db =& ConnectionManager::getDataSource($this->dataSource);
fwrite($this->stdout, "Initializing Database...\n");
fwrite($this->stdout, "Creating access control objects table (acos)...\n");
$sql = " CREATE TABLE `acos` (
`id` int(11) NOT NULL auto_increment,
`object_id` int(11) default NULL,
`alias` varchar(255) NOT NULL default '',
`lft` int(11) default NULL,
`rght` int(11) default NULL,
PRIMARY KEY (`id`)
$sql = " CREATE TABLE ".$db->name('acos')." (
".$db->name('id')." ".$db->column($db->columns['primary_key']).",
".$db->name('object_id')." ".$db->column($db->columns['integer'])." default NULL,
".$db->name('alias')." ".$db->column($db->columns['string'])." NOT NULL default '',
".$db->name('lft')." ".$db->column($db->columns['integer'])." default NULL,
".$db->name('rght')." ".$db->column($db->columns['integer'])." default NULL,
PRIMARY KEY (".$db->name('id').")
);";
$db->query($sql);
fwrite($this->stdout, "Creating access request objects table (aros)...\n");
$sql2 = "CREATE TABLE `aros` (
`id` int(11) NOT NULL auto_increment,
`user_id` int(11) default NULL,
`alias` varchar(255) NOT NULL default '',
`lft` int(11) default NULL,
`rght` int(11) default NULL,
PRIMARY KEY (`id`)
$sql2 = "CREATE TABLE ".$db->name('aros')." (
".$db->name('id')." ".$db->column($db->columns['primary_key']).",
".$db->name('user_id')." ".$db->column($db->columns['integer'])." default NULL,
".$db->name('alias')." ".$db->column($db->columns['string'])." NOT NULL default '',
".$db->name('lft')." ".$db->column($db->columns['integer'])." default NULL,
".$db->name('rght')." ".$db->column($db->columns['integer'])." default NULL,
PRIMARY KEY (".$db->name('id').")
);";
$db->query($sql2);
fwrite($this->stdout, "Creating relationships table (aros_acos)...\n");
$sql3 = "CREATE TABLE `aros_acos` (
`id` int(11) NOT NULL auto_increment,
`aro_id` int(11) default NULL,
`aco_id` int(11) default NULL,
`_create` int(1) NOT NULL default '0',
`_read` int(1) NOT NULL default '0',
`_update` int(1) NOT NULL default '0',
`_delete` int(11) NOT NULL default '0',
PRIMARY KEY (`id`)
$sql3 = "CREATE TABLE ".$db->name('aros_acos')." (
".$db->name('id')." ".$db->column($db->columns['primary_key']).",
".$db->name('aro_id')." ".$db->column($db->columns['integer'])." default NULL,
".$db->name('aco_id')." ".$db->column($db->columns['integer'])." default NULL,
".$db->name('_create')." ".$db->column($db->columns['integer'])." NOT NULL default '0',
".$db->name('_read')." ".$db->column($db->columns['integer'])." NOT NULL default '0',
".$db->name('_update')." ".$db->column($db->columns['integer'])." NOT NULL default '0',
".$db->name('_delete')." ".$db->column($db->columns['integer'])." NOT NULL default '0',
PRIMARY KEY (".$db->name('id').")
);";
$db->query($sql3);

File diff suppressed because it is too large Load diff