<?php
/**
* @package DATA_MySQL5
*/
/**
* Default strategy for mapping an associative array
* index to rows in a database table.
*
* Either the primary key is used, or an uniquely indexed
* field if the primary key is auto-numeric and there is
* only one unique index.
*/
class DATA_MySQL5_DefaultIndexingStrategy implements DATA_AssociativeIndexingStrategy {
/**
* Stores table name on construction for future operations.
* @var string
*/
protected $table;
/**
* Constructor.
*
* @param string $table The table name.
*/
public function __construct($table) {
$this->table = $table;
}
public function isSingleRowIndexing() {
return true;
}
/**
* Returns the field used as index according to the offset supplied in the array access.
*
* Throws {@link DATA_PrimaryKeyNeeded}, {@link DATA_PrimaryKeyTooLarge}.
*
* @return string Index field name.
*/
protected function getIndexField() {
$keys = DATA_MySQL5_Schema::getPrimaryKey($this->table);
if (count($keys) == 0) throw new DATA_PrimaryKeyNeeded($this->table);
if (count($keys) > 1) throw new DATA_PrimaryKeyTooLarge($this->table);
$uniqueFields = DATA_MySQL5_Schema::getUniqueFields($this->table);
if (count($uniqueFields) == 1
&& DATA_MySQL5_Schema::isAutoIncrement($this->table, $keys[0])) {
return $uniqueFields[0];
} else {
return $keys[0];
}
}
/**
* Returns inboxed version of the row offset provided.
*
* Throws {@link DATA_PrimaryKeyNeeded}, {@link DATA_PrimaryKeyTooLarge}.
*
* @param string|DATA_SQLType $row The row offset.
* @return DATA_SQLType Inboxed row offset.
*/
public function inboxRowOffset($row) {
$indexField = $this->getIndexField();
try {
return DATA_MySQL5_Schema::getSQLTypeFactory($this->table, $indexField)->inbox($row);
} catch (DATA_SQLTypeConstraintFailed $exception) {
$exception->setTable($this->table);
$exception->setField($indexField);
throw $exception;
}
}
public function buildWhereConditions($row) {
$indexField = $this->getIndexField();
return "`{$indexField}` = " . DATA_MySQL5_Access::prepareData($row);
}
public function getAdditionalInsertFields($row) {
return array(
$this->getIndexField() => $row
);
}
}
?>
|