'adodb' . DS . 'adodb.inc.php')); /** * Included cake libraries */ uses ('model' . DS . 'datasources' . DS . 'dbo' . DS . 'dbo_adodb'); /** * MS Access AdoDB DBO implementation. * * Database abstraction implementation for the AdoDB library. * * @package cake * @subpackage cake.app.models.datasources.dbo */ class DboAdodbAccess extends DboAdodb { /** * Enter description here... * * @var string */ var $description = "ADOdb DBO Driver for MS Access"; /** * Returns an array of the fields in the table used by the given model. * * @param AppModel $model Model object * @return array Fields in table. Keys are name and type */ function describe(&$model) { $cache = DataSource::describe($model); if ($cache != null) { return $cache; } $fields = false; $cols = $this->_adodb->MetaColumns($this->fullTableName($model, false)); foreach ($cols as $column) { $fields[$column->name] = array( 'type' => $this->column($column->type), 'null' => !$column->not_null, 'length' => $column->max_length, ); /* extra test otherwise causes ADOFieldObject error - the properties do not exist */ if (isset($column->has_default) && $column->has_default) { $fields[$column->name]['default'] = $column->default_value; } if (isset($column->primary_key) && $column->primary_key == 1) { $fields[$column->name]['key'] = 'primary'; } } $this->__cacheDescription($this->fullTableName($model, false), $fields); return $fields; } /** * Returns a limit statement in the correct format for the particular database. * * @param integer $limit Limit of results returned * @param integer $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), 'top') || strpos(strtolower($limit), 'top') === 0) { $rt = ' TOP'; } $rt .= ' ' . $limit; if (is_int($offset) && $offset > 0) { $rt .= ' OFFSET ' . $offset; } return $rt; } return null; } /** * 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 = DboSource::value($data, $column, $safe); if ($parent != null) { return $parent; } if ($data === null) { return 'NULL'; } if ($data === '') { return "''"; } switch($column) { case 'boolean': $data = $this->boolean((bool)$data); break; default: if (get_magic_quotes_gpc()) { $data = stripslashes(str_replace("'", "''", $data)); } else { $data = str_replace("'", "''", $data); } break; } if ((in_array($column, array('integer', 'float')) && is_numeric($data)) || (empty($column) && is_numeric($data))) { return $data; } return "'" . $data . "'"; } /** * Builds final SQL statement * * @param string $type Query type * @param array $data Query data * @return string */ function renderStatement($type, $data) { switch (strtolower($type)) { case 'select': extract($data); $fields = trim($fields); if (strpos($limit, 'TOP') !== false && strpos($fields, 'DISTINCT ') === 0) { $limit = 'DISTINCT ' . trim($limit); $fields = substr($fields, 9); } return "SELECT {$limit} {$fields} FROM {$table} {$alias} {$joins} {$conditions} {$group} {$order}"; break; default: return DboSource::renderStatement($type, $data); break; } } /** * 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 DboSource::update($model, $fields, $values); } function buildStatement($query, $model) { $join_parentheses = ''; $query = array_merge(array('offset' => null, 'joins' => array()), $query); if (!empty($query['joins'])) { for ($i = 0; $i < count($query['joins']); $i++) { if (is_array($query['joins'][$i])) { $query['joins'][$i] = $this->buildJoinStatement($query['joins'][$i]); if ($i > 0) $join_parentheses = $join_parentheses . '('; } } } $join_parentheses = $join_parentheses . ' '; return $this->renderStatement('select', array( 'conditions' => $this->conditions($query['conditions']), 'fields' => join(', ', $query['fields']), 'table' => $join_parentheses . $query['table'], 'alias' => $this->alias . $this->name($query['alias']), 'order' => $this->order($query['order']), 'limit' => $this->limit($query['limit'], $query['offset']), 'joins' => join(' ) ', $query['joins']), 'group' => $this->group($query['group']) )); } function renderJoinStatement($data) { extract($data); if (empty($type)) { return trim("INNER JOIN {$table} {$alias} ON ({$conditions})"); } else { return trim("{$type} JOIN {$table} {$alias} ON ({$conditions})"); } } } ?>