| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675 |
- <?php
- /**
- * Phinx
- *
- * (The MIT license)
- * Copyright (c) 2015 Rob Morgan
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated * documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- *
- * @package Phinx
- * @subpackage Phinx\Db
- */
- namespace DDLWrapper\Db;
- use DDLWrapper\Db\Table\Column;
- use DDLWrapper\Db\Table\Index;
- use DDLWrapper\Db\Table\ForeignKey;
- use DDLWrapper\Db\Adapter\AdapterInterface;
- /**
- *
- * This object is based loosely on: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Table.html.
- */
- class Table
- {
- /**
- * @var string
- */
- protected $name;
- /**
- * @var array
- */
- protected $options = array();
- /**
- * @var AdapterInterface
- */
- protected $adapter;
- /**
- * @var array
- */
- protected $columns = array();
- /**
- * @var array
- */
- protected $indexes = array();
- /**
- * @var ForeignKey[]
- */
- protected $foreignKeys = array();
- /**
- * @var array
- */
- protected $data = array();
- /**
- * Class Constuctor.
- *
- * @param string $name Table Name
- * @param array $options Options
- * @param AdapterInterface $adapter Database Adapter
- */
- public function __construct($name, $options = array(), AdapterInterface $adapter = null)
- {
- $this->setName($name);
- $this->setOptions($options);
- if (null !== $adapter) {
- //echo 'Adapter definido';
- $this->setAdapter($adapter);
- }
- }
- /**
- * Sets the table name.
- *
- * @param string $name Table Name
- * @return Table
- */
- public function setName($name)
- {
- $this->name = $name;
- return $this;
- }
- /**
- * Gets the table name.
- *
- * @return string
- */
- public function getName()
- {
- return $this->name;
- }
- /**
- * Sets the table options.
- *
- * @param array $options
- * @return Table
- */
- public function setOptions($options)
- {
- $this->options = $options;
- return $this;
- }
- /**
- * Gets the table options.
- *
- * @return array
- */
- public function getOptions()
- {
- return $this->options;
- }
- /**
- * Sets the database adapter.
- *
- * @param AdapterInterface $adapter Database Adapter
- * @return Table
- */
- public function setAdapter(AdapterInterface $adapter)
- {
- $this->adapter = $adapter;
- return $this;
- }
- /**
- * Gets the database adapter.
- *
- * @return AdapterInterface
- */
- public function getAdapter()
- {
- return $this->adapter;
- }
- /**
- * Does the table exist?
- *
- * @return boolean
- */
- public function exists()
- {
- return $this->getAdapter()->hasTable($this->getName());
- }
- /**
- * Drops the database table.
- *
- * @return void
- */
- public function drop()
- {
- $this->getAdapter()->dropTable($this->getName());
- }
- /**
- * Renames the database table.
- *
- * @param string $newTableName New Table Name
- * @return Table
- */
- public function rename($newTableName)
- {
- $this->getAdapter()->renameTable($this->getName(), $newTableName);
- $this->setName($newTableName);
- return $this;
- }
- /**
- * Sets an array of columns waiting to be committed.
- * Use setPendingColumns
- *
- * @deprecated
- * @param array $columns Columns
- * @return Table
- */
- public function setColumns($columns)
- {
- $this->setPendingColumns($columns);
- }
- /**
- * Gets an array of the table columns.
- *
- * @return Column[]
- */
- public function getColumns()
- {
- return $this->getAdapter()->getColumns($this->getName());
- }
- /**
- * Sets an array of columns waiting to be committed.
- *
- * @param array $columns Columns
- * @return Table
- */
- public function setPendingColumns($columns)
- {
- $this->columns = $columns;
- return $this;
- }
- /**
- * Gets an array of columns waiting to be committed.
- *
- * @return Column[]
- */
- public function getPendingColumns()
- {
- return $this->columns;
- }
- /**
- * Sets an array of columns waiting to be indexed.
- *
- * @param array $indexes Indexes
- * @return Table
- */
- public function setIndexes($indexes)
- {
- $this->indexes = $indexes;
- return $this;
- }
- /**
- * Gets an array of indexes waiting to be committed.
- *
- * @return array
- */
- public function getIndexes()
- {
- return $this->indexes;
- }
- /**
- * Sets an array of foreign keys waiting to be commited.
- *
- * @param ForeignKey[] $foreignKeys foreign keys
- * @return Table
- */
- public function setForeignKeys($foreignKeys)
- {
- $this->foreignKeys = $foreignKeys;
- return $this;
- }
- /**
- * Gets an array of foreign keys waiting to be commited.
- *
- * @return array|ForeignKey[]
- */
- public function getForeignKeys()
- {
- return $this->foreignKeys;
- }
- /**
- * Sets an array of data to be inserted.
- *
- * @param array $data Data
- * @return Table
- */
- public function setData($data)
- {
- $this->data = $data;
- return $this;
- }
- /**
- * Gets the data waiting to be inserted.
- *
- * @return array
- */
- public function getData()
- {
- return $this->data;
- }
- /**
- * Resets all of the pending table changes.
- *
- * @return void
- */
- public function reset()
- {
- $this->setPendingColumns(array());
- $this->setIndexes(array());
- $this->setForeignKeys(array());
- $this->setData(array());
- }
- /**
- * Add a table column.
- *
- * Type can be: string, text, integer, float, decimal, datetime, timestamp,
- * time, date, binary, boolean.
- *
- * Valid options can be: limit, default, null, precision or scale.
- *
- * @param string|Column $columnName Column Name
- * @param string $type Column Type
- * @param array $options Column Options
- * @throws \RuntimeException
- * @throws \InvalidArgumentException
- * @return Table
- */
- public function addColumn($columnName, $type = null, $options = array())
- {
- // we need an adapter set to add a column
- if (null === $this->getAdapter()) {
- throw new \RuntimeException('An adapter must be specified to add a column.');
- }
- // create a new column object if only strings were supplied
- if (!$columnName instanceof Column) {
- $column = new Column();
- $column->setName($columnName);
- $column->setType($type);
- $column->setOptions($options); // map options to column methods
- } else {
- $column = $columnName;
- }
- // Delegate to Adapters to check column type
- if (!$this->getAdapter()->isValidColumnType($column)) {
- throw new \InvalidArgumentException(sprintf(
- 'An invalid column type "%s" was specified for column "%s".',
- $column->getType(),
- $column->getName()
- ));
- }
- $this->columns[] = $column;
- return $this;
- }
- /**
- * Remove a table column.
- *
- * @param string $columnName Column Name
- * @return Table
- */
- public function removeColumn($columnName)
- {
- $this->getAdapter()->dropColumn($this->getName(), $columnName);
- return $this;
- }
- /**
- * Rename a table column.
- *
- * @param string $oldName Old Column Name
- * @param string $newName New Column Name
- * @return Table
- */
- public function renameColumn($oldName, $newName)
- {
- $this->getAdapter()->renameColumn($this->getName(), $oldName, $newName);
- return $this;
- }
- /**
- * Change a table column type.
- *
- * @param string $columnName Column Name
- * @param string|Column $newColumnType New Column Type
- * @param array $options Options
- * @return Table
- */
- public function changeColumn($columnName, $newColumnType, $options = array())
- {
- // create a column object if one wasn't supplied
- if (!$newColumnType instanceof Column) {
- $newColumn = new Column();
- $newColumn->setType($newColumnType);
- $newColumn->setOptions($options);
- } else {
- $newColumn = $newColumnType;
- }
- // if the name was omitted use the existing column name
- if (null === $newColumn->getName() || strlen($newColumn->getName()) === 0) {
- $newColumn->setName($columnName);
- }
- $this->getAdapter()->changeColumn($this->getName(), $columnName, $newColumn);
- return $this;
- }
- /**
- * Checks to see if a column exists.
- *
- * @param string $columnName Column Name
- * @param array $options Options
- * @return boolean
- */
- public function hasColumn($columnName, $options = array())
- {
- return $this->getAdapter()->hasColumn($this->getName(), $columnName, $options);
- }
- /**
- * Add an index to a database table.
- *
- * In $options you can specific unique = true/false or name (index name).
- *
- * @param string|array|Index $columns Table Column(s)
- * @param array $options Index Options
- * @return Table
- */
- public function addIndex($columns, $options = array())
- {
- // create a new index object if strings or an array of strings were supplied
- if (!$columns instanceof Index) {
- $index = new Index();
- if (is_string($columns)) {
- $columns = array($columns); // str to array
- }
- $index->setColumns($columns);
- $index->setOptions($options);
- } else {
- $index = $columns;
- }
- $this->indexes[] = $index;
- return $this;
- }
- /**
- * Removes the given index from a table.
- *
- * @param array $columns Columns
- * @param array $options Options
- * @return Table
- */
- public function removeIndex($columns, $options = array())
- {
- $this->getAdapter()->dropIndex($this->getName(), $columns, $options);
- return $this;
- }
- /**
- * Removes the given index identified by its name from a table.
- *
- * @param string $name Index name
- * @return Table
- */
- public function removeIndexByName($name)
- {
- $this->getAdapter()->dropIndexByName($this->getName(), $name);
- return $this;
- }
- /**
- * Checks to see if an index exists.
- *
- * @param string|array $columns Columns
- * @param array $options Options
- * @return boolean
- */
- public function hasIndex($columns, $options = array())
- {
- return $this->getAdapter()->hasIndex($this->getName(), $columns, $options);
- }
- /**
- * Add a foreign key to a database table.
- *
- * In $options you can specify on_delete|on_delete = cascade|no_action ..,
- * on_update, constraint = constraint name.
- *
- * @param string|array $columns Columns
- * @param string|Table $referencedTable Referenced Table
- * @param string|array $referencedColumns Referenced Columns
- * @param array $options Options
- * @return Table
- */
- public function addForeignKey($columns, $referencedTable, $referencedColumns = array('id'), $options = array())
- {
- if (is_string($referencedColumns)) {
- $referencedColumns = array($referencedColumns); // str to array
- }
- $fk = new ForeignKey();
- if ($referencedTable instanceof Table) {
- $fk->setReferencedTable($referencedTable);
- } else {
- $fk->setReferencedTable(new Table($referencedTable, array(), $this->adapter));
- }
- $fk->setColumns($columns)
- ->setReferencedColumns($referencedColumns)
- ->setOptions($options);
- $this->foreignKeys[] = $fk;
- return $this;
- }
- /**
- * Removes the given foreign key from the table.
- *
- * @param string|array $columns Column(s)
- * @param null|string $constraint Constraint names
- * @return Table
- */
- public function dropForeignKey($columns, $constraint = null)
- {
- if (is_string($columns)) {
- $columns = array($columns);
- }
- if ($constraint) {
- $this->getAdapter()->dropForeignKey($this->getName(), array(), $constraint);
- } else {
- $this->getAdapter()->dropForeignKey($this->getName(), $columns);
- }
- return $this;
- }
- /**
- * Checks to see if a foreign key exists.
- *
- * @param string|array $columns Column(s)
- * @param null|string $constraint Constraint names
- * @return boolean
- */
- public function hasForeignKey($columns, $constraint = null)
- {
- return $this->getAdapter()->hasForeignKey($this->getName(), $columns, $constraint);
- }
- /**
- * Add timestamp columns created_at and updated_at to the table.
- *
- * @param string $createdAtColumnName
- * @param string $updatedAtColumnName
- *
- * @return Table
- */
- public function addTimestamps($createdAtColumnName = 'created_at', $updatedAtColumnName = 'updated_at')
- {
- $createdAtColumnName = is_null($createdAtColumnName) ? 'created_at' : $createdAtColumnName;
- $updatedAtColumnName = is_null($updatedAtColumnName) ? 'updated_at' : $updatedAtColumnName;
- $this->addColumn($createdAtColumnName, 'timestamp', array(
- 'default' => 'CURRENT_TIMESTAMP',
- 'update' => ''
- ))
- ->addColumn($updatedAtColumnName, 'timestamp', array(
- 'null' => true,
- 'default' => null
- ));
- return $this;
- }
- /**
- * Insert data into the table.
- *
- * @param $data array of data in the form:
- * array(
- * array("col1" => "value1", "col2" => "anotherValue1"),
- * array("col2" => "value2", "col2" => "anotherValue2"),
- * )
- * or array("col1" => "value1", "col2" => "anotherValue1")
- *
- * @return Table
- */
- public function insert($data)
- {
- // handle array of array situations
- if (isset($data[0]) && is_array($data[0])) {
- foreach ($data as $row) {
- $this->data[] = $row;
- }
- return $this;
- }
- $this->data[] = $data;
- return $this;
- }
- /**
- * Creates a table from the object instance.
- *
- * @return void
- */
- public function create()
- {
- $this->getAdapter()->createTable($this);
- $this->saveData();
- $this->reset(); // reset pending changes
- }
- /**
- * Updates a table from the object instance.
- *
- * @throws \RuntimeException
- * @return void
- */
- public function update()
- {
- if (!$this->exists()) {
- throw new \RuntimeException('Cannot update a table that doesn\'t exist!');
- }
- // update table
- foreach ($this->getPendingColumns() as $column) {
- $this->getAdapter()->addColumn($this, $column);
- }
- foreach ($this->getIndexes() as $index) {
- $this->getAdapter()->addIndex($this, $index);
- }
- foreach ($this->getForeignKeys() as $foreignKey) {
- $this->getAdapter()->addForeignKey($this, $foreignKey);
- }
- $this->saveData();
- $this->reset(); // reset pending changes
- }
- /**
- * Commit the pending data waiting for insertion.
- *
- * @return void
- */
- public function saveData()
- {
- foreach ($this->getData() as $row) {
- $this->getAdapter()->insert($this, $row);
- }
- }
- /**
- * Commits the table changes.
- *
- * If the table doesn't exist it is created otherwise it is updated.
- *
- * @return void
- */
- public function save()
- {
- if ($this->exists()) {
- $this->update(); // update the table
- } else {
- $this->create(); // create the table
- }
- $this->reset(); // reset pending changes
- }
- }
|