php-yaoi/php-yaoi

View on GitHub
src/Database/Mysql/Utility.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

namespace Yaoi\Database\Mysql;

use Yaoi\Database\Definition\Column;
use Yaoi\Database\Definition\Table;
use Yaoi\Sql\Raw;
use Yaoi\Sql\Symbol;
use Yaoi\String\Lexer;

class Utility extends \Yaoi\Database\Utility
{
    public function killSleepers($timeout = 30)
    {
        foreach ($this->database->query("SHOW PROCESSLIST") as $row) {
            if ($row['Time'] > $timeout) {
                $this->database->query("KILL $row[Id]");
            }
        }
        return $this;
    }



    /**
     * @param $tableName
     * @return Table
     */
    public function getTableDefinition($tableName)
    {
        $statement = $this->database->query("SHOW CREATE TABLE ?", new Symbol($tableName))->fetchRow('Create Table');
        $createTableReader = new CreateTableReader($statement, $this->database);
        return $createTableReader->getDefinition();

        /*
        $schemaReader = new SchemaReader($this->database);
        $definition = $schemaReader->getTableDefinition($tableName);
        return $definition;
        */
    }


    public function getColumnTypeString(Column $column)
    {
        $typeString = new TypeString($this->database);
        return $typeString->getByColumn($column);
    }

    /**
     * @inheritdoc
     */
    public function checkColumn(Column $column)
    {
        if ($column->flags & Column::TIMESTAMP) {
            if (!$column->getDefault()) {
                $column->setFlag(Column::NOT_NULL);
                $column->setDefault(new Raw('CURRENT_TIMESTAMP'));
            }
        }
    }


    public function generateCreateTableOnDefinition(Table $table) {
        $expression = new CreateTable($table);
        return $expression;
    }

    public function generateAlterTable(Table $before, Table $after)
    {
        return new AlterTable($before, $after);
    }

    public function tableExists($tableName)
    {
        $rows = $this->database->query("SHOW TABLES LIKE ?", $tableName)->fetchAll();
        return (bool)$rows;
    }


    /** @var  Lexer\Parser */
    private $tokenizer;
    public function getStatementTokenizer() {
        if (null === $this->tokenizer) {
            $this->tokenizer = $tokenizer = new Lexer\Parser();

            $tokenizer
                ->addQuote('`', '`', array('``' => '`'))
                ->addQuote(
                    "'", "'", array(
                        '\\\'' => '\'',
                        '\"' => '"',
                        '\r' => "\r",
                        '\n' => "\n",
                    )
                )
                ->addQuote(
                    '"', '"', array(
                        '\\\'' => '\'',
                        '\"' => '"',
                        '\r' => "\r",
                        '\n' => "\n",
                    )
                )
                ->addLineStopper('#')
                ->addLineStopper('-- ')
                ->addBracket('(', ')')
                ->addDelimiter(',')
                ;
        }
        return $this->tokenizer;
    }


}