Вход Регистрация
Файл: sys/library/goDB/Table.php
Строк: 209
<?php
/**
 * @package goDB
 */

namespace goDB;

use 
goDBHelpersMapFields;
use 
goDBHelpersFetchersArr as ArrFetcher;
use 
goDBFakesIFakeTable;

/**
 * Access to a specified table
 *
 * @author Oleg Grigoriev <go.vasac@gmail.com>
 */
class Table
{
    
/**
     * The constructor
     *
     * @param goDBDB $db
     *        the database of the table
     * @param string $tableName
     *        the table name
     * @param array $map [optional]
     *        a field map (a field => a real column name)
     */
    
public function __construct(DB $db$tableName, array $map null)
    {
        
$this->db $db;
        if (
$tableName instanceof IFakeTable) {
            
$this->fake $tableName;
        } else {
            
$this->name $tableName;
        }
        if (!empty(
$map)) {
            
$this->map = new MapFields($map);
        }
    }

    
/**
     * Returns the table name
     *
     * @return string
     */
    
public function getTableName()
    {
        return 
$this->name;
    }

    
/**
     * Returns a database of this table
     *
     * @return goDBDB
     */
    
public function getDB()
    {
        return 
$this->db;
    }

    
/**
     * Inserts a row to the table
     *
     * @param array $set
     *        the data for set (a field => a value)
     * @return int
     *         ID of the row
     */
    
public function insert(array $set)
    {
        if (empty(
$set)) {
            return 
null;
        }
        if (
$this->accum !== null) {
            
$this->accum[] = $set;
            if (
count($this->accum) >= $this->sizeAccum) {
                
$this->multiInsert($this->accumtrue);
                
$this->accum = array();
            }
            
$this->lastIdAccum++;
            return 
$this->lastIdAccum;
        }
        if (
$this->map) {
            
$set $this->map->set($set);
        }
        if (
$this->fake) {
            return 
$this->fake->insert($set);
        }
        
$pattern 'INSERT INTO ?t (?cols) VALUES (?ln)';
        
$data = array($this->namearray_keys($set), array_values($set));
        return 
$this->db->query($pattern$data)->id();
    }

    
/**
     * Multi insert
     *
     * @param array $sets
     *        a list of the rows
     * @param bool $imp [optional]
     *        TRUE if multi-insert is implemented in this db
     */
    
public function multiInsert(array $sets$imp true)
    {
        if (!
$imp) {
            foreach (
$sets as $set) {
                
$this->insert($set);
            }
            return;
        }
        if (empty(
$sets)) {
            return;
        }
        if (
$this->map) {
            foreach (
$sets as &$set) {
                
$set $this->map->set($set);
            }
            unset(
$set);
        }
        if (
$this->fake) {
            return 
$this->fake->multiInsert($sets);
        }
        if (isset(
$sets[0])) {
            
$first $sets[0];
        } else {
            
$first current($sets);
        }
        
$pattern 'INSERT INTO ?t (?cols) VALUES ?vn';
        
$data = array($this->namearray_keys($first), $sets);
        
$this->db->query($pattern$data);
    }

    
/**
     * Replaces or inserts a row
     *
     * @param array $set
     * @return int
     */
    
public function replace(array $set)
    {
        if (empty(
$set)) {
            return 
null;
        }
        if (
$this->map) {
            
$set $this->map->set($set);
        }
        if (
$this->fake) {
            return 
$this->fake->replace($set);
        }
        
$pattern 'REPLACE INTO ?t (?cols) VALUES (?ln)';
        
$data = array($this->namearray_keys($set), array_values($set));
        return 
$this->db->query($pattern$data)->id();
    }

    
/**
     * Multi replace
     *
     * @param array $sets
     * @param bool $imp
     *        TRUE if multi-insert is implemented in this db
     */
    
public function multiReplace(array $sets$imp true)
    {
        if (!
$imp) {
            foreach (
$sets as $set) {
                
$this->replace($set);
            }
            return;
        }
        if (empty(
$sets)) {
            return;
        }
        if (
$this->map) {
            foreach (
$sets as &$set) {
                
$set $this->map->set($set);
            }
            unset(
$set);
        }
        if (
$this->fake) {
            return 
$this->fake->multiReplace($sets);
        }
        if (isset(
$sets[0])) {
            
$first $sets[0];
        } else {
            
$first current($sets);
        }
        
$pattern 'REPLACE INTO ?t (?cols) VALUES ?vn';
        
$data = array($this->namearray_keys($first), $sets);
        
$this->db->query($pattern$data);
    }

    
/**
     * Updates the table
     *
     * @param array $set
     * @param mixed $where [optional]
     * @return int
     *         number of affected rows
     */
    
public function update(array $set$where true)
    {
        if (empty(
$set)) {
            return 
0;
        }
        if (
$this->map) {
            
$set $this->map->set($set);
            
$where $this->map->where($where);
        }
        if (
$this->fake) {
            return 
$this->fake->update($set$where);
        }
        
$pattern 'UPDATE ?t SET ?sn WHERE ?w';
        
$data = array($this->name$set$where);
        return 
$this->db->query($pattern$data)->ar();
    }

    
/**
     * Selects rows from the table
     *
     * @param mixed $cols [optional]
     * @param mixed $where [optional]
     * @param mixed $order [optional]
     * @param mixed $limit [optional]
     * @return goDBResult
     */
    
public function select($cols null$where true$order null$limit null)
    {
        if (
$this->map) {
            
$cols $this->map->cols($cols);
            
$where $this->map->where($where);
            
$order $this->map->order($order);
        }
        if (
$cols === null) {
            
$cols true;
        }
        if (
$this->fake) {
            
$result $this->fake->select($cols$where$order$limit);
            if (
$this->map) {
                return new 
ArrFetcher($this->map->assoc($result));
            }
            return 
$result;
        }
        
$pattern 'SELECT ?cols FROM ?t WHERE ?w';
        
$data = array($cols$this->name$where);
        if (
$order !== null) {
            
$pattern .= ' ORDER BY ?o';
            
$data[] = $order;
        }
        if (
$limit !== null) {
            if (
is_array($limit)) {
                
$offset = isset($limit[1]) ? $limit[1] : 0;
                
$limit $limit[0];
            } else {
                
$offset 0;
            }
            
$pattern .= ' LIMIT ?i,?i';
            
$data[] = $offset;
            
$data[] = $limit;
        }
        
$fetcher $this->db->query($pattern$data);
        if (
$this->map) {
            
$data $fetcher->assoc();
            
$data $this->map->assoc($data);
            
$fetcher = new ArrFetcher($data);
        }
        return 
$fetcher;
    }

    
/**
     * Deletes rows from the table
     *
     * @param mixed $where
     * @return int
     *         number of affected rows
     */
    
public function delete($where null)
    {
        if (
$this->map) {
            
$where $this->map->where($where);
        }
        if (
$this->fake) {
            return 
$this->fake->delete($where);
        }
        
$pattern 'DELETE FROM ?t WHERE ?w';
        
$data = array($this->name$where);
        return 
$this->db->query($pattern$data)->ar();
    }

    
/**
     * Truncates the table
     */
    
public function truncate()
    {
        if (
$this->fake) {
            return 
$this->fake->truncate();
        }
        
$pattern 'TRUNCATE TABLE ?t';
        
$data = array($this->name);
        
$this->db->query($pattern$data);
    }

    
/**
     * Returns COUNT()
     *
     * @param mixed $col [optional]
     * @param mixed $where [optional]
     * @return int
     */
    
public function getCount($col null$where true)
    {
        if (
$this->map) {
            
$where $this->map->where($where);
        }
        if (
$this->fake) {
            return 
$this->fake->getCount($col$where);
        }
        if (
$col !== null) {
            
$p '?c';
            if (
$this->map) {
                
$col $this->map->col($col);
            }
        } else {
            
$p '?q';
            
$col 1;
        }
        
$pattern 'SELECT COUNT('.$p.') FROM ?t WHERE ?w';
        
$data = array($col$this->name$where);
        return 
$this->db->query($pattern$data)->el();
    }

    
/**
     * Returns a columns map object
     *
     * @return goDBHelpersMapFields
     */
    
public function getMap()
    {
        return 
$this->map;
    }

    
/**
     * Begins to accumulate INSERT queries (for multi insert)
     *
     * @param int $lastId [optional]
     * @param int $size [optional]
     * @return boolean
     */
    
public function startAccumInsert($lastId 0$size 100)
    {
        
$ok = ($this->accum === null) && ($size 1);
        if (
$ok) {
            
$this->accum = array();
            
$this->lastIdAccum $lastId;
            
$this->sizeAccum $size;
        }
        return 
$ok;
    }

    
/**
     * Flushes the accumulated queries
     *
     * @return int
     */
    
public function flushAccumInsert()
    {
        if (
$this->accum === null) {
            return 
0;
        }
        
$count count($this->accum);
        if (
$count 0) {
            
$this->multiInsert($this->accumtrue);
        }
        
$this->accum null;
        
$this->lastIdAccum null;
        
$this->sizeAccum null;
        return 
$count;
    }

    
/**
     * The table name
     *
     * @var string
     */
    
private $name;

    
/**
     * The database instance
     *
     * @var goDBDB
     */
    
private $db;

    
/**
     * The field-to-column map
     *
     * @var goDBHelpersMapFields
     */
    
private $map;

    
/**
     * @var array
     */
    
private $accum;

    
/**
     * @var int
     */
    
private $lastIdAccum;

    
/**
     * @var int
     */
    
private $sizeAccum;

    
/**
     * @var goDBFakesFakeTable
     */
    
private $fake;
}
Онлайн: 1
Реклама