PHP Classes
elePHPant
Icontem

File: DATA/MySQL5/DefaultIndexingStrategy.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Martin Alterisio  >  DATA  >  DATA/MySQL5/DefaultIndexingStrategy.php  >  Download  
File: DATA/MySQL5/DefaultIndexingStrategy.php
Role: Class source
Content type: text/plain
Description: Default strategy for mapping an associative array index to rows in a database table.
Class: DATA
Access data stored in MySQL tables like arrays
Author: By
Last change: + anonymous access
Date: 7 years ago
Size: 2,630 bytes
 

Contents

Class file image Download
<?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
       
);
    }
}
?>