php-yaoi/php-yaoi

View on GitHub
src/Database/Definition/Column.php

Summary

Maintainability
B
4 hrs
Test Coverage
<?php

namespace Yaoi\Database\Definition;

use Yaoi\BaseClass;

class Column extends BaseClass
{

    const AUTO_ID = 1;
    const INTEGER = 2;
    const UNSIGNED = 4;
    const FLOAT = 8;
    const STRING = 16;

    const SIZE_1B = 32;
    const SIZE_2B = 64;
    const SIZE_3B = 128;
    const SIZE_4B = 256;
    const SIZE_8B = 512;

    const TIMESTAMP = 1024;
    const NOT_NULL = 2048;

    const AUTO_TYPE = 4096;

    const USE_PHP_DATETIME = 8192;

    const IS_REFLECTED = 16384; // Column built by reflection (for ALTER TABLE check)

    public $flags;
    public function __construct($flags = self::STRING)
    {
        if ($flags === self::AUTO_ID) {
            $flags += self::INTEGER;
            $flags += self::NOT_NULL;
        }

        $this->flags = $flags;
    }

    public function setFlag($flag, $add = true) {
        $flagSet = $this->flags & $flag;
        if ($add && !$flagSet) {
            $this->flags += $flag;
        }
        elseif (!$add && $flagSet) {
            $this->flags -= $flag;
        }
        return $this;
    }


    private $default = false; // todo properly deprecate false value in favour of null
    public function setDefault($value) {

        $this->default = $value;
        return $this;
    }

    public function getDefault() {
        if (is_string($this->default)) {
            if ($this->flags & Column::INTEGER) {
                $this->default = (int)$this->default;
            }
            elseif ($this->flags & Column::FLOAT) {
                $this->default = (float)$this->default;
            }
        }
        elseif ($this->flags & Column::STRING) {
            if (is_int($this->default) || is_float($this->default)) {
                $this->default = (string)$this->default;
            }
        }
        return $this->default;
    }

    public $stringLength;
    public $stringFixed;
    public function setStringLength($length, $fixed = false) {
        $this->stringLength = $length;
        $this->stringFixed = $fixed;
        return $this;
    }

    public $isUnique;
    public function setUnique($yes = true) {
        $this->isUnique = $yes;
        return $this;
    }

    public $isIndexed;
    public function setIndexed($yes = true) {
        $this->isIndexed = $yes;
        return $this;
    }


    /**
     * Name of mapped class property, usually in camelCase
     * @var string
     */
    public $propertyName;

    /**
     * Name of database table column, in underscore_lowercase
     * @var
     */
    public $schemaName;

    /** @var  Table */
    public $table;

    /** @var ForeignKey */
    public $foreignKey;

    public static function castField($value, $columnFlags, $import = true)
    {
        if (!($columnFlags & self::NOT_NULL) && $value === null) {
            return null;
        }

        if (is_object($value) && !$value instanceof \DateTime) {
            $value = (string)$value;
        }

        if ($columnFlags !== self::AUTO_TYPE) {
            switch (true) {
                case self::FLOAT & $columnFlags:
                    $value = (float)$value;
                    break;
                case self::INTEGER & $columnFlags && self::USE_PHP_DATETIME & $columnFlags:
                    if ($import) {
                        $datetime = new \DateTime();
                        $datetime->setTimestamp($value);
                        $value = $datetime;
                    } elseif ($value instanceof \DateTime) {
                        $value = $value->getTimestamp();
                    }
                    break;
                case self::INTEGER & $columnFlags:
                    $value = (int)$value;
                    break;
                case self::STRING & $columnFlags:
                    $value = (string)$value;
                    break;
                case self::TIMESTAMP & $columnFlags && self::USE_PHP_DATETIME & $columnFlags:
                    if ($import) {
                        $value = new \DateTime($value);
                    } elseif ($value instanceof \DateTime) {
                        $value = $value->format("Y-m-d H:i:s");
                    }
                    break;
            }
        }

        return $value;
    }


    public function getTypeString() {
        return $this->table->database()->getUtility()->getColumnTypeString($this);
    }
}