init without trunk
This commit is contained in:
parent
ed24ac4994
commit
bb809e7233
14652 changed files with 177862 additions and 94817 deletions
135
vendor/doctrine/migrations/CHANGELOG.md
vendored
Normal file
135
vendor/doctrine/migrations/CHANGELOG.md
vendored
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
# Change Log
|
||||
All notable changes to this project will be documented in this file.
|
||||
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
|
||||
## [1.5.0] - 2016-12-25
|
||||
|
||||
### Fixed
|
||||
- [447: Fix typo in error code](https://github.com/doctrine/migrations/pull/447) thanks to @funivan
|
||||
- [448: Removed unused import](https://github.com/doctrine/migrations/pull/448) thanks to @localheinz
|
||||
- [451: Case insensitive method calls and types](https://github.com/doctrine/migrations/pull/451) thanks to @localheinz
|
||||
- [449: Use the class keyword](https://github.com/doctrine/migrations/pull/449) thanks to @localheinz
|
||||
- [453: Use better assertions](https://github.com/doctrine/migrations/pull/453) thanks to @localheinz
|
||||
- [452: Fix the visibility of the AbstractTest](https://github.com/doctrine/migrations/pull/452) thanks to @localheinz
|
||||
- [450: Use the short array syntax](https://github.com/doctrine/migrations/pull/450) thanks to @localheinz
|
||||
- [464: Clean the github autogenerated zip archive](https://github.com/doctrine/migrations/pull/464) thanks to @mlocati
|
||||
- [457: Fix an issue where the migration wheren't sorted propely](https://github.com/doctrine/migrations/pull/457) thanks to @JHGitty, @Charles68
|
||||
- [451: Case insensitive method calls and types](https://github.com/doctrine/migrations/pull/451) thanks to @localheinz
|
||||
- [471: Fix loading the configuration from a php file](https://github.com/doctrine/migrations/pull/471) thanks to @aaa2000
|
||||
- [451: Case insensitive method calls and types](https://github.com/doctrine/migrations/pull/451) thanks to @localheinz
|
||||
- [472: Change comment marker a cross platform one ](https://github.com/doctrine/migrations/pull/472) thanks to @aaa2000
|
||||
- [476: Add test for the execute command](https://github.com/doctrine/migrations/pull/476) thanks to @chrisguitarguy
|
||||
- [470: Case insensitive method calls and types](https://github.com/doctrine/migrations/pull/470) thanks to @abacaphiliac
|
||||
- [489: Better help message in the execute command](https://github.com/doctrine/migrations/pull/489) thanks to @eko
|
||||
- [500: Updating the dev dependencies](https://github.com/doctrine/migrations/pull/500) thanks to @mikeSimonson
|
||||
- [501: Fix a bug in a rarely used message call](https://github.com/doctrine/migrations/pull/501) thanks to @Seldaek
|
||||
|
||||
### Changed
|
||||
- [478: Changed the default generated version number to UTC](https://github.com/doctrine/migrations/pull/446) thanks to @c960657
|
||||
- [479: Explicitly connecting to support master slave connections](https://github.com/doctrine/migrations/pull/479) thanks to @chrisguitarguy
|
||||
- [482: Use strict comparaison in the generated migrations](https://github.com/doctrine/migrations/pull/482) thanks to @tifabien
|
||||
|
||||
### Added
|
||||
- [470: Add uptodate command](https://github.com/doctrine/migrations/pull/470) thanks to @abacaphiliac
|
||||
- [477: Add parameters to the output of the dry run migrations](https://github.com/doctrine/migrations/pull/477) thanks to @chrisguitarguy
|
||||
- [497: Show the content of the generated file on the console](https://github.com/doctrine/migrations/pull/497) thanks to @ErikTrapman
|
||||
- [480: Don't prompt the user for confirmation when there is nothing to do](https://github.com/doctrine/migrations/pull/480) thanks to @chrisguitarguy
|
||||
|
||||
|
||||
## [1.4.1] - 2016-03-14
|
||||
### Fixed
|
||||
- [439: Add missing dependency in the phar build](https://github.com/doctrine/migrations/pull/439)
|
||||
|
||||
|
||||
## [1.4.0] - 2016-02-23
|
||||
### Fixed
|
||||
### Changed
|
||||
### Added
|
||||
- [431: Formatted diffs](https://github.com/doctrine/migrations/pull/431)
|
||||
- [437: Allowing to set the column name from config too](https://github.com/doctrine/migrations/pull/437)
|
||||
|
||||
## [1.3.1] - 2016-02-23
|
||||
### Fixed
|
||||
- [433: Fix: ExecuteCommand by making sure that it autoload the versions](https://github.com/doctrine/migrations/pull/433)
|
||||
- [434: Fixing an issue in the order at which some configuration key are loaded](https://github.com/doctrine/migrations/pull/434)
|
||||
|
||||
### Changed
|
||||
- [429: code refactoring for clarity](https://github.com/doctrine/migrations/pull/429)
|
||||
- [428: code refactoring for clarity](https://github.com/doctrine/migrations/pull/428)
|
||||
|
||||
### Added
|
||||
- [425: ProxyManager ~2.0 is also compatible with migrations](https://github.com/doctrine/migrations/pull/425)
|
||||
|
||||
|
||||
## [1.3.0] - 2016-01-23
|
||||
### Fixed
|
||||
- [421: Fix issue with some method when the migrations were not loaded](https://github.com/doctrine/migrations/pull/421)
|
||||
- [405: Correcting composer constraints: allowing PHP 7, dropping 5.4 support](https://github.com/doctrine/migrations/pull/405)
|
||||
- [406: putting the composer.json back in the archive](https://github.com/doctrine/migrations/pull/406)
|
||||
|
||||
### Changed
|
||||
- [233: Separate Configuration Objects from Configuration File Loading](https://github.com/doctrine/migrations/issues/233)
|
||||
- [407: Replacing the Schema by a proxy](https://github.com/doctrine/migrations/pull/407)
|
||||
- [422: Refactor the getConnection into a chainloader](https://github.com/doctrine/migrations/pull/422)
|
||||
- [Dropped the support for php 5.4](https://github.com/doctrine/migrations/pull/393)
|
||||
- [Again make the phar more than 3 times smaller](https://github.com/doctrine/migrations/pull/396)
|
||||
|
||||
### Added
|
||||
- [404: add possibility to read doctrine's config/cli-config.php](https://github.com/doctrine/migrations/pull/404)
|
||||
- [409: Add a failing test case for an edge case with the write-sql option](https://github.com/doctrine/migrations/pull/409)
|
||||
- [424: Adding a regression test for the configuration](https://github.com/doctrine/migrations/pull/424)
|
||||
- [391: Give the possibility to override the Migration template](https://github.com/doctrine/migrations/pull/391)
|
||||
|
||||
## [1.2.2] - 2016-01-07
|
||||
### Fixed
|
||||
- [Fix the write-sql option in the version class too](https://github.com/doctrine/migrations/commit/91043f742da8506ab7115a1d14247ce26375f6f5)
|
||||
|
||||
## [1.2.1] - 2015-12-23
|
||||
### Fixed
|
||||
- [Fix the write-sql option](https://github.com/doctrine/migrations/pull/400)
|
||||
|
||||
## [1.2.0] - 2015-12-15
|
||||
### Fixed
|
||||
- [fix "all migrated versions shown as unavailable executed" ](https://github.com/doctrine/migrations/commit/875849e2a80d37dc8bf5dd0663e464b6789e3b56)
|
||||
- [Prevent the use of 0 as migration name as it is used internally and conflict](http://github.com/doctrine/migrations/commit/5df49c5ad5dc2265401a54a3b9e6ecb3e7cda8d0)
|
||||
- [composer: drop symfony/console from suggested packages, since it's required package](http://github.com/doctrine/migrations/commit/d263c7bfac7188009ab0717ed5aa6577e80)
|
||||
- [fix spaces and complete missing file-docblocks](http://github.com/doctrine/migrations/commit/4b68a69c3e35492b36ec140ebb216cdb80ffe655)
|
||||
- [RecursiveDirectoryIterator don't obtain some order of the file list.](http://github.com/doctrine/migrations/commit/ed95c05c14381e64404f1135763fcc9b65317b96)
|
||||
- [Fix the yml parser issue with unescaped backslash in double quoted string](http://github.com/doctrine/migrations/commit/af3cce7d2e490ead821fcbdb54b4772b4913ee1d)
|
||||
|
||||
### Changed
|
||||
- [Adding compression to the generation of the phar](http://github.com/doctrine/migrations/commit/70730ff8655f0be89ce0f06d1e279930d7eb2550)
|
||||
- [tests: move autoload of tests to composer](http://github.com/doctrine/migrations/commit/3a4f8368e4b7b95d2e6c51c26f6dc41bb05a5ce5)
|
||||
- [travis: drop PHP 7.0 from allowed failures, it passes well](http://github.com/doctrine/migrations/commit/57ec2f071a7a840c554058b77f2089893d06ba23)
|
||||
- [Revert the use of exec to run sql queries](http://github.com/doctrine/migrations/commit/0af6e6e705b905a56cbed26cb5c17faad4c2c04f)
|
||||
|
||||
### Added
|
||||
- [Adding a little script to prepare and generate the phar](http://github.com/doctrine/migrations/commit/3a8ef413e7f8a42d4e0f3d32d30601b26fb27e60)
|
||||
- [Configuration: check if migration class exists added](http://github.com/doctrine/migrations/commit/a53d7c83b319341c985d2a21950e260fa55b0b8d)
|
||||
- [Made composer.json compatible with SF 3.0](http://github.com/doctrine/migrations/commit/4e909f2e661a8414a3e04ce987a09c9e849cd13f)
|
||||
- [Added configurable version column name](http://github.com/doctrine/migrations/commit/02ddf4318b84a20bb0e3486acfc6e6f41cc63426)
|
||||
|
||||
## [1.1.0] - 2015-09-29
|
||||
### Fixed
|
||||
- [Switch unexisting <warning> tag to <comment>](http://github.com/doctrine/migrations/commit/93a81ff0dcc858de4df5c17d97f2f24b3bfa3c36)
|
||||
- [Ensure that Yaml::parse return an array as it can apparently return a string](http://github.com/doctrine/migrations/commit/1499f0cc3e5f5b20a510ba8f0779d5c68a9e5084)
|
||||
- [Avoid uploading code coverage to Scrutinizer for HHVM and PHP 7](http://github.com/doctrine/migrations/commit/d47d65021dcb711480bf27f6d0bbba138e220f12)
|
||||
- [Improve the Travis configuration by persisting the composer cache](http://github.com/doctrine/migrations/commit/bda0509b479ae6605b8fa749b0999b4ce2ff8c04)
|
||||
- [Keep the license file in the downloadable archives](https://github.com/doctrine/migrations/commit/dfbee38e004899bc078d5d47b13bea53799fca1e#diff-fc723d30b02a4cca7a534518111c1a66)
|
||||
|
||||
### Changed
|
||||
- [Use short array syntax](http://github.com/doctrine/migrations/commit/50a6e18c95ff617325229a4a649d65c1a11445bc)
|
||||
- [composer: use PSR-4 autoload](http://github.com/doctrine/migrations/commit/7fb8d301b2f4d4a564433165e0604b7d34013844)
|
||||
- [refactoring the configuration loading](http://github.com/doctrine/migrations/commit/e95b277111c74cfe65eb959d4471f45a815e1ece)
|
||||
- [Drop support for php 5.3](https://github.com/doctrine/migrations/commit/0e60856a10e8b510daa612fe25f6245aece77e68)
|
||||
- [compressing the phar so that it's half the size now](https://github.com/doctrine/migrations/commit/70730ff8655f0be89ce0f06d1e279930d7eb2550)
|
||||
|
||||
### Added
|
||||
- [Added the ability to auto create migrations in a folder by month and year](http://github.com/doctrine/migrations/commit/0b8e40868e12a36de7f689add61857b9ba29c4bc)
|
||||
- [Set default name for configuration helper](http://github.com/doctrine/migrations/commit/1f3592f2f126a022db275192f17b8d5c01f19822)
|
||||
- [Added ability to load config from php array or json files.](http://github.com/doctrine/migrations/commit/8cf01d623f9eb3728ba86c22970347107a8f0be7)
|
||||
- [Added the possibility to inject the OutputWriter after instantiation](https://github.com/doctrine/migrations/pull/342)
|
||||
- [Added the --allow-no-migration option to avoid throwing an exception if no migrations are found](https://github.com/doctrine/migrations/commit/a9ec86faa3a3f7f592a633af43b6ef6c9f358239#diff-0a4648a19ba565cda76b349e89552a9b)
|
||||
502
vendor/doctrine/migrations/LICENSE
vendored
Normal file
502
vendor/doctrine/migrations/LICENSE
vendored
Normal file
|
|
@ -0,0 +1,502 @@
|
|||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
109
vendor/doctrine/migrations/README.md
vendored
Normal file
109
vendor/doctrine/migrations/README.md
vendored
Normal file
|
|
@ -0,0 +1,109 @@
|
|||
# Doctrine Database Migrations
|
||||
|
||||
## Status
|
||||
|
||||
[](https://travis-ci.org/doctrine/migrations)
|
||||
[](https://www.versioneye.com/php/doctrine:migrations/)
|
||||
[](https://scrutinizer-ci.com/g/doctrine/migrations/?branch=master)
|
||||
[](https://scrutinizer-ci.com/g/doctrine/migrations/?branch=master)
|
||||
|
||||
|
||||
## Official Documentation
|
||||
|
||||
All available documentation can be found [here](http://docs.doctrine-project.org/projects/doctrine-migrations/en/latest/).
|
||||
|
||||
The repository containing the documentation is [there](https://github.com/doctrine/migrations-documentation).
|
||||
|
||||
## Working with Doctrine Migrations
|
||||
|
||||
### Using the integration of your framework
|
||||
|
||||
* [symfony 2](https://packagist.org/packages/doctrine/doctrine-migrations-bundle)
|
||||
* [ZF2](https://packagist.org/packages/doctrine/doctrine-orm-module)
|
||||
* [laravel](https://packagist.org/packages/laravel-doctrine/migrations)
|
||||
* [Silex](https://packagist.org/packages/kurl/silex-doctrine-migrations-provider)
|
||||
* [Silex](https://packagist.org/packages/dbtlr/silex-doctrine-migrations)
|
||||
* [nette](https://packagist.org/packages/zenify/doctrine-migrations)
|
||||
* others...
|
||||
|
||||
### Using composer
|
||||
|
||||
```composer require doctrine/migrations```
|
||||
|
||||
### Downloading the latest phar release
|
||||
|
||||
You can download the [doctrine migrations phar](https://github.com/doctrine/migrations/releases) directly on the release page
|
||||
|
||||
### Building Your own Phar
|
||||
|
||||
Make sure Composer and all necessary dependencies are installed:
|
||||
|
||||
```bash
|
||||
curl -s https://getcomposer.org/installer | php
|
||||
php composer.phar install
|
||||
```
|
||||
|
||||
Make sure that the Box project is installed:
|
||||
|
||||
```bash
|
||||
curl -LSs http://box-project.github.io/box2/installer.php | php
|
||||
```
|
||||
|
||||
Build the PHAR archive:
|
||||
|
||||
```bash
|
||||
php box.phar build
|
||||
```
|
||||
|
||||
The `doctrine-migrations.phar` archive is built in the `build` directory.
|
||||
|
||||
#### Creating archive disabled by INI setting
|
||||
|
||||
If you receive an error that looks like:
|
||||
|
||||
creating archive "build/doctrine-migrations.phar" disabled by INI setting
|
||||
|
||||
This can be fixed by setting the following in your php.ini:
|
||||
|
||||
```ini
|
||||
; http://php.net/phar.readonly
|
||||
phar.readonly = Off
|
||||
```
|
||||
|
||||
## Installing Dependencies
|
||||
|
||||
To install dependencies run a composer update:
|
||||
|
||||
```composer update```
|
||||
|
||||
## symfony 2.3 users
|
||||
|
||||
Doctrine migration need the doctrine/orm 2.4, you need to [update your composer.json](https://github.com/symfony/symfony-standard/blob/v2.3.28/composer.json#L12) to the last version of it for symfony 2.3.
|
||||
|
||||
That version is compatible with the doctrine/orm 2.4 and there are [very little upgrade needed](https://github.com/doctrine/doctrine2/blob/master/UPGRADE.md#upgrade-to-24).
|
||||
|
||||
## Running the unit tests
|
||||
|
||||
To run the tests, you need the sqlite extension for php.
|
||||
On Unix-like systems, install:
|
||||
- php5-sqlite
|
||||
|
||||
On Windows, enable the extension by uncommenting the following lines in php.ini
|
||||
```
|
||||
extension = php_pdo_sqlite.dll
|
||||
extension = php_sqlite3.dll
|
||||
extension_dir = ext
|
||||
```
|
||||
|
||||
Running the tests from the project root:
|
||||
```
|
||||
./vendor/bin/phpunit
|
||||
```
|
||||
|
||||
On Windows run phpunit from the full path
|
||||
```
|
||||
php vendor/phpunit/phpunit/phpunit
|
||||
```
|
||||
This appears to be some bug.
|
||||
|
||||
Happy testing :-)
|
||||
39
vendor/doctrine/migrations/UPGRADE-1.0.md
vendored
Normal file
39
vendor/doctrine/migrations/UPGRADE-1.0.md
vendored
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
UPGRADE FROM 1.0-alpha1 to 1.0.0-alpha3
|
||||
=======================================
|
||||
|
||||
## AbstractMigration
|
||||
|
||||
### Before:
|
||||
|
||||
The method `getName()` was defined and it's implementation would change the order in which the migration would be processed.
|
||||
It would cause discrepancies between the file order in a file browser and the order of execution of the migrations.
|
||||
|
||||
### After:
|
||||
|
||||
The `getName()` method as been removed | set final and new `getDescription()` method has been added.
|
||||
The goal of this method is to be able to provide context for the migration.
|
||||
This context is shown for the last migrated migration when the status command is called.
|
||||
|
||||
## --write-sql option from the migrate command
|
||||
|
||||
### Before:
|
||||
|
||||
The `--write-sql` option would only output sql contained in the migration and would not update the table containing the migrated migrations.
|
||||
|
||||
### After:
|
||||
|
||||
That option now also output the sql queries necessary to update the table containing the state of the migrations.
|
||||
If you want to go back to the previous behavior just make a request on the bug tracker as for now the need for it is not very clear.
|
||||
|
||||
## MigrationsVersion::VERSION
|
||||
|
||||
### Before:
|
||||
|
||||
`MigrationsVersion::VERSION` used to be a property.
|
||||
The returned value was fanciful.
|
||||
|
||||
### After:
|
||||
|
||||
It is now a a function so that a different value can be automatically send back if it's a modified version that's used.
|
||||
The returned value is now the git tag.
|
||||
The tag is in lowercase as the other doctrine projects.
|
||||
3
vendor/doctrine/migrations/bin/doctrine-migrations
vendored
Executable file
3
vendor/doctrine/migrations/bin/doctrine-migrations
vendored
Executable file
|
|
@ -0,0 +1,3 @@
|
|||
#!/usr/bin/env php
|
||||
<?php
|
||||
include('doctrine-migrations.php');
|
||||
89
vendor/doctrine/migrations/bin/doctrine-migrations.php
vendored
Normal file
89
vendor/doctrine/migrations/bin/doctrine-migrations.php
vendored
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
$autoloadFiles = [
|
||||
__DIR__ . '/../vendor/autoload.php',
|
||||
__DIR__ . '/../../../autoload.php'
|
||||
];
|
||||
|
||||
$autoloader = false;
|
||||
foreach ($autoloadFiles as $autoloadFile) {
|
||||
if (file_exists($autoloadFile)) {
|
||||
require_once $autoloadFile;
|
||||
$autoloader = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$autoloader) {
|
||||
if (extension_loaded('phar') && ($uri = Phar::running())) {
|
||||
echo 'The phar has been built without dependencies' . PHP_EOL;
|
||||
}
|
||||
die('vendor/autoload.php could not be found. Did you run `php composer.phar install`?');
|
||||
}
|
||||
|
||||
// Support for using the Doctrine ORM convention of providing a `cli-config.php` file.
|
||||
$directories = [getcwd(), getcwd() . DIRECTORY_SEPARATOR . 'config'];
|
||||
|
||||
$configFile = null;
|
||||
foreach ($directories as $directory) {
|
||||
$configFile = $directory . DIRECTORY_SEPARATOR . 'cli-config.php';
|
||||
|
||||
if (file_exists($configFile)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$helperSet = null;
|
||||
if (file_exists($configFile)) {
|
||||
if ( ! is_readable($configFile)) {
|
||||
trigger_error(
|
||||
'Configuration file [' . $configFile . '] does not have read permission.', E_USER_ERROR
|
||||
);
|
||||
}
|
||||
|
||||
$helperSet = require $configFile;
|
||||
|
||||
if ( ! ($helperSet instanceof \Symfony\Component\Console\Helper\HelperSet)) {
|
||||
foreach ($GLOBALS as $helperSetCandidate) {
|
||||
if ($helperSetCandidate instanceof \Symfony\Component\Console\Helper\HelperSet) {
|
||||
$helperSet = $helperSetCandidate;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$helperSet = ($helperSet) ?: new \Symfony\Component\Console\Helper\HelperSet();
|
||||
|
||||
if(class_exists('\Symfony\Component\Console\Helper\QuestionHelper')) {
|
||||
$helperSet->set(new \Symfony\Component\Console\Helper\QuestionHelper(), 'question');
|
||||
} else {
|
||||
$helperSet->set(new \Symfony\Component\Console\Helper\DialogHelper(), 'dialog');
|
||||
}
|
||||
|
||||
|
||||
$input = file_exists('migrations-input.php')
|
||||
? include 'migrations-input.php' : null;
|
||||
|
||||
$output = file_exists('migrations-output.php')
|
||||
? include 'migrations-output.php' : null;
|
||||
|
||||
$cli = \Doctrine\DBAL\Migrations\Tools\Console\ConsoleRunner::createApplication($helperSet);
|
||||
$cli->run($input, $output);
|
||||
|
||||
17
vendor/doctrine/migrations/build-phar.sh
vendored
Executable file
17
vendor/doctrine/migrations/build-phar.sh
vendored
Executable file
|
|
@ -0,0 +1,17 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
git fetch origin master --tags
|
||||
|
||||
if [ -f composer.lock ]; then
|
||||
rm composer.lock
|
||||
fi
|
||||
|
||||
composer install --no-dev --optimize-autoloader
|
||||
|
||||
mkdir -p build
|
||||
|
||||
if [ ! -f box.phar ]; then
|
||||
wget https://github.com/box-project/box2/releases/download/2.6.0/box-2.6.0.phar -O box.phar
|
||||
fi
|
||||
|
||||
php box.phar build -vv
|
||||
51
vendor/doctrine/migrations/composer.json
vendored
Normal file
51
vendor/doctrine/migrations/composer.json
vendored
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
{
|
||||
"name": "doctrine/migrations",
|
||||
"type": "library",
|
||||
"description": "Database Schema migrations using Doctrine DBAL",
|
||||
"keywords": ["migrations", "database"],
|
||||
"homepage": "http://www.doctrine-project.org",
|
||||
"license": "LGPL-2.1",
|
||||
"authors": [
|
||||
{"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"},
|
||||
{"name": "Jonathan Wage", "email": "jonwage@gmail.com"},
|
||||
{"name": "Michael Simonson", "email": "contact@mikesimonson.com" }
|
||||
],
|
||||
"require": {
|
||||
"php": "^5.5|^7.0",
|
||||
"doctrine/dbal": "~2.2",
|
||||
"symfony/yaml": "~2.3|~3.0",
|
||||
"symfony/console": "~2.3|~3.0",
|
||||
"ocramius/proxy-manager": "^1.0|^2.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"doctrine/orm": "2.*",
|
||||
"phpunit/phpunit": "~4.7",
|
||||
"satooshi/php-coveralls": "^1.0",
|
||||
"doctrine/coding-standard": "dev-master",
|
||||
"mockery/mockery": "^0.9.4",
|
||||
"johnkary/phpunit-speedtrap": "~1.0@dev",
|
||||
"jdorn/sql-formatter": "~1.1",
|
||||
"mikey179/vfsStream": "^1.6"
|
||||
},
|
||||
"suggest": {
|
||||
"jdorn/sql-formatter": "Allows to generate formatted SQL with the diff command."
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Doctrine\\DBAL\\Migrations\\": "lib/Doctrine/DBAL/Migrations"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Doctrine\\DBAL\\Migrations\\Tests\\": "tests/Doctrine/DBAL/Migrations/Tests"
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "v1.6.x-dev"
|
||||
}
|
||||
},
|
||||
"bin": [
|
||||
"bin/doctrine-migrations"
|
||||
]
|
||||
}
|
||||
24
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/AbortMigrationException.php
vendored
Normal file
24
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/AbortMigrationException.php
vendored
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations;
|
||||
|
||||
class AbortMigrationException extends MigrationException
|
||||
{
|
||||
}
|
||||
189
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/AbstractMigration.php
vendored
Normal file
189
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/AbstractMigration.php
vendored
Normal file
|
|
@ -0,0 +1,189 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations;
|
||||
|
||||
use Doctrine\DBAL\Schema\Schema;
|
||||
|
||||
/**
|
||||
* Abstract class for individual migrations to extend from.
|
||||
*
|
||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||
* @link www.doctrine-project.org
|
||||
* @since 2.0
|
||||
* @author Jonathan H. Wage <jonwage@gmail.com>
|
||||
*/
|
||||
abstract class AbstractMigration
|
||||
{
|
||||
/**
|
||||
* Reference to the Version instance representing this migration
|
||||
*
|
||||
* @var Version
|
||||
*/
|
||||
protected $version;
|
||||
|
||||
/**
|
||||
* The Doctrine\DBAL\Connection instance we are migrating
|
||||
*
|
||||
* @var \Doctrine\DBAL\Connection
|
||||
*/
|
||||
protected $connection;
|
||||
|
||||
/**
|
||||
* Reference to the SchemaManager instance referenced by $_connection
|
||||
*
|
||||
* @var \Doctrine\DBAL\Schema\AbstractSchemaManager
|
||||
*/
|
||||
protected $sm;
|
||||
|
||||
/**
|
||||
* Reference to the DatabasePlatform instance referenced by $_connection
|
||||
*
|
||||
* @var \Doctrine\DBAL\Platforms\AbstractPlatform
|
||||
*/
|
||||
protected $platform;
|
||||
|
||||
/**
|
||||
* The OutputWriter object instance used for outputting information
|
||||
*
|
||||
* @var OutputWriter
|
||||
*/
|
||||
private $outputWriter;
|
||||
|
||||
public function __construct(Version $version)
|
||||
{
|
||||
$config = $version->getConfiguration();
|
||||
|
||||
$this->version = $version;
|
||||
$this->connection = $config->getConnection();
|
||||
$this->sm = $this->connection->getSchemaManager();
|
||||
$this->platform = $this->connection->getDatabasePlatform();
|
||||
$this->outputWriter = $config->getOutputWriter();
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates the transactional mode of this migration.
|
||||
* If this function returns true (default) the migration will be executed in one transaction,
|
||||
* otherwise non-transactional state will be used to execute each of the migration SQLs.
|
||||
*
|
||||
* Extending class should override this function to alter the return value
|
||||
*
|
||||
* @return bool TRUE by default.
|
||||
*/
|
||||
public function isTransactional()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get migration description
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getDescription()
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Print a warning message if the condition evaluates to TRUE.
|
||||
*
|
||||
* @param boolean $condition
|
||||
* @param string $message
|
||||
*/
|
||||
public function warnIf($condition, $message = '')
|
||||
{
|
||||
if ($condition) {
|
||||
$message = $message ?: 'Unknown Reason';
|
||||
$this->outputWriter->write(sprintf(
|
||||
' <comment>Warning during %s: %s</comment>',
|
||||
$this->version->getExecutionState(),
|
||||
$message
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Abort the migration if the condition evaluates to TRUE.
|
||||
*
|
||||
* @param boolean $condition
|
||||
* @param string $message
|
||||
*
|
||||
* @throws AbortMigrationException
|
||||
*/
|
||||
public function abortIf($condition, $message = '')
|
||||
{
|
||||
if ($condition) {
|
||||
throw new AbortMigrationException($message ?: 'Unknown Reason');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Skip this migration (but not the next ones) if condition evaluates to TRUE.
|
||||
*
|
||||
* @param boolean $condition
|
||||
* @param string $message
|
||||
*
|
||||
* @throws SkipMigrationException
|
||||
*/
|
||||
public function skipIf($condition, $message = '')
|
||||
{
|
||||
if ($condition) {
|
||||
throw new SkipMigrationException($message ?: 'Unknown Reason');
|
||||
}
|
||||
}
|
||||
|
||||
public function preUp(Schema $schema)
|
||||
{
|
||||
}
|
||||
|
||||
public function postUp(Schema $schema)
|
||||
{
|
||||
}
|
||||
|
||||
public function preDown(Schema $schema)
|
||||
{
|
||||
}
|
||||
|
||||
public function postDown(Schema $schema)
|
||||
{
|
||||
}
|
||||
|
||||
abstract public function up(Schema $schema);
|
||||
abstract public function down(Schema $schema);
|
||||
|
||||
protected function addSql($sql, array $params = [], array $types = [])
|
||||
{
|
||||
$this->version->addSql($sql, $params, $types);
|
||||
}
|
||||
|
||||
protected function write($message)
|
||||
{
|
||||
$this->outputWriter->write($message);
|
||||
}
|
||||
|
||||
protected function throwIrreversibleMigrationException($message = null)
|
||||
{
|
||||
if (null === $message) {
|
||||
$message = 'This migration is irreversible and cannot be reverted.';
|
||||
}
|
||||
|
||||
throw new IrreversibleMigrationException($message);
|
||||
}
|
||||
}
|
||||
149
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Configuration/AbstractFileConfiguration.php
vendored
Normal file
149
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Configuration/AbstractFileConfiguration.php
vendored
Normal file
|
|
@ -0,0 +1,149 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Configuration;
|
||||
|
||||
use Doctrine\DBAL\Migrations\MigrationException;
|
||||
|
||||
/**
|
||||
* Abstract Migration Configuration class for loading configuration information
|
||||
* from a configuration file (xml or yml).
|
||||
*
|
||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||
* @link www.doctrine-project.org
|
||||
* @since 2.0
|
||||
* @author Jonathan H. Wage <jonwage@gmail.com>
|
||||
*/
|
||||
abstract class AbstractFileConfiguration extends Configuration
|
||||
{
|
||||
/**
|
||||
* The configuration file used to load configuration information
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $file;
|
||||
|
||||
/**
|
||||
* Whether or not the configuration file has been loaded yet or not
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
private $loaded = false;
|
||||
|
||||
/**
|
||||
* @var array of possible configuration properties in migrations configuration.
|
||||
*/
|
||||
private $configurationProperties = [
|
||||
'migrations_namespace' => 'setMigrationsNamespace',
|
||||
'table_name' => 'setMigrationsTableName',
|
||||
'column_name' => 'setMigrationsColumnName',
|
||||
'organize_migrations' => 'setMigrationOrganisation',
|
||||
'name' => 'setName',
|
||||
'migrations_directory' => 'loadMigrationsFromDirectory',
|
||||
'migrations' => 'loadMigrations',
|
||||
];
|
||||
|
||||
protected function setConfiguration(array $config)
|
||||
{
|
||||
foreach($config as $configurationKey => $configurationValue) {
|
||||
if (!isset($this->configurationProperties[$configurationKey])) {
|
||||
$msg = sprintf('Migrations configuration key "%s" does not exists.', $configurationKey);
|
||||
throw MigrationException::configurationNotValid($msg);
|
||||
}
|
||||
}
|
||||
foreach($this->configurationProperties as $configurationKey => $configurationSetter) {
|
||||
if (isset($config[$configurationKey])) {
|
||||
$this->{$configurationSetter}($config[$configurationKey]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function loadMigrationsFromDirectory($migrationsDirectory)
|
||||
{
|
||||
$this->setMigrationsDirectory($migrationsDirectory);
|
||||
$this->registerMigrationsFromDirectory($migrationsDirectory);
|
||||
}
|
||||
|
||||
private function loadMigrations($migrations)
|
||||
{
|
||||
if (is_array($migrations)) {
|
||||
foreach ($migrations as $migration) {
|
||||
$this->registerMigration($migration['version'], $migration['class']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function setMigrationOrganisation($migrationOrganisation)
|
||||
{
|
||||
if (strcasecmp($migrationOrganisation, static::VERSIONS_ORGANIZATION_BY_YEAR) == 0) {
|
||||
$this->setMigrationsAreOrganizedByYear();
|
||||
} else if (strcasecmp($migrationOrganisation, static::VERSIONS_ORGANIZATION_BY_YEAR_AND_MONTH) == 0) {
|
||||
$this->setMigrationsAreOrganizedByYearAndMonth();
|
||||
} else {
|
||||
$msg = 'Unknown ' . var_export($migrationOrganisation, true) . ' for configuration "organize_migrations".';
|
||||
throw MigrationException::configurationNotValid($msg);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the information from the passed configuration file
|
||||
*
|
||||
* @param string $file The path to the configuration file
|
||||
*
|
||||
* @throws MigrationException Throws exception if configuration file was already loaded
|
||||
*/
|
||||
public function load($file)
|
||||
{
|
||||
if ($this->loaded) {
|
||||
throw MigrationException::configurationFileAlreadyLoaded();
|
||||
}
|
||||
if (file_exists($path = getcwd() . '/' . $file)) {
|
||||
$file = $path;
|
||||
}
|
||||
$this->file = $file;
|
||||
|
||||
if (!file_exists($file)) {
|
||||
throw new \InvalidArgumentException('Given config file does not exist');
|
||||
}
|
||||
|
||||
$this->doLoad($file);
|
||||
$this->loaded = true;
|
||||
}
|
||||
|
||||
protected function getDirectoryRelativeToFile($file, $input)
|
||||
{
|
||||
$path = realpath(dirname($file) . '/' . $input);
|
||||
|
||||
return ($path !== false) ? $path : $input;
|
||||
}
|
||||
|
||||
public function getFile()
|
||||
{
|
||||
return $this->file;
|
||||
}
|
||||
|
||||
/**
|
||||
* Abstract method that each file configuration driver must implement to
|
||||
* load the given configuration file whether it be xml, yaml, etc. or something
|
||||
* else.
|
||||
*
|
||||
* @param string $file The path to a configuration file.
|
||||
*/
|
||||
abstract protected function doLoad($file);
|
||||
}
|
||||
45
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Configuration/ArrayConfiguration.php
vendored
Normal file
45
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Configuration/ArrayConfiguration.php
vendored
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Configuration;
|
||||
|
||||
/**
|
||||
* Load migration configuration information from a PHP configuration file.
|
||||
*
|
||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||
* @link www.doctrine-project.org
|
||||
* @since 2.0
|
||||
* @author David Havl <contact@davidhavl.com>
|
||||
*/
|
||||
class ArrayConfiguration extends AbstractFileConfiguration
|
||||
{
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
protected function doLoad($file)
|
||||
{
|
||||
$config = require $file;
|
||||
|
||||
if (isset($config['migrations_directory'])) {
|
||||
$config['migrations_directory'] = $this->getDirectoryRelativeToFile($file, $config['migrations_directory']);
|
||||
}
|
||||
|
||||
$this->setConfiguration($config);
|
||||
}
|
||||
}
|
||||
894
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Configuration/Configuration.php
vendored
Normal file
894
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Configuration/Configuration.php
vendored
Normal file
|
|
@ -0,0 +1,894 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Configuration;
|
||||
|
||||
use Doctrine\DBAL\Connection;
|
||||
use Doctrine\DBAL\Connections\MasterSlaveConnection;
|
||||
use Doctrine\DBAL\Migrations\Finder\MigrationDeepFinderInterface;
|
||||
use Doctrine\DBAL\Migrations\MigrationException;
|
||||
use Doctrine\DBAL\Migrations\OutputWriter;
|
||||
use Doctrine\DBAL\Migrations\Version;
|
||||
use Doctrine\DBAL\Migrations\Finder\MigrationFinderInterface;
|
||||
use Doctrine\DBAL\Migrations\Finder\RecursiveRegexFinder;
|
||||
use Doctrine\DBAL\Schema\Column;
|
||||
use Doctrine\DBAL\Schema\Table;
|
||||
use Doctrine\DBAL\Types\Type;
|
||||
|
||||
/**
|
||||
* Default Migration Configuration object used for configuring an instance of
|
||||
* the Migration class. Set the connection, version table name, register migration
|
||||
* classes/versions, etc.
|
||||
*
|
||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||
* @link www.doctrine-project.org
|
||||
* @since 2.0
|
||||
* @author Jonathan H. Wage <jonwage@gmail.com>
|
||||
*/
|
||||
class Configuration
|
||||
{
|
||||
/**
|
||||
* Configure versions to be organized by year.
|
||||
*/
|
||||
const VERSIONS_ORGANIZATION_BY_YEAR = 'year';
|
||||
|
||||
/**
|
||||
* Configure versions to be organized by year and month.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const VERSIONS_ORGANIZATION_BY_YEAR_AND_MONTH = 'year_and_month';
|
||||
|
||||
/**
|
||||
* The date format for new version numbers
|
||||
*/
|
||||
const VERSION_FORMAT = 'YmdHis';
|
||||
|
||||
/**
|
||||
* Name of this set of migrations
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $name;
|
||||
|
||||
/**
|
||||
* Flag for whether or not the migration table has been created
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
private $migrationTableCreated = false;
|
||||
|
||||
/**
|
||||
* Connection instance to use for migrations
|
||||
*
|
||||
* @var Connection
|
||||
*/
|
||||
private $connection;
|
||||
|
||||
/**
|
||||
* OutputWriter instance for writing output during migrations
|
||||
*
|
||||
* @var OutputWriter
|
||||
*/
|
||||
private $outputWriter;
|
||||
|
||||
/**
|
||||
* The migration finder implementation -- used to load migrations from a
|
||||
* directory.
|
||||
*
|
||||
* @var MigrationFinderInterface
|
||||
*/
|
||||
private $migrationFinder;
|
||||
|
||||
/**
|
||||
* The migration table name to track versions in
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $migrationsTableName = 'doctrine_migration_versions';
|
||||
|
||||
/**
|
||||
* The migration column name to track versions in
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $migrationsColumnName = 'version';
|
||||
|
||||
/**
|
||||
* The path to a directory where new migration classes will be written
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $migrationsDirectory;
|
||||
|
||||
/**
|
||||
* Namespace the migration classes live in
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $migrationsNamespace;
|
||||
|
||||
/**
|
||||
* Array of the registered migrations
|
||||
*
|
||||
* @var Version[]
|
||||
*/
|
||||
private $migrations = [];
|
||||
|
||||
/**
|
||||
* Versions are organized by year.
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
private $migrationsAreOrganizedByYear = false;
|
||||
|
||||
/**
|
||||
* Versions are organized by year and month.
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
private $migrationsAreOrganizedByYearAndMonth = false;
|
||||
|
||||
/**
|
||||
* Construct a migration configuration object.
|
||||
*
|
||||
* @param Connection $connection A Connection instance
|
||||
* @param OutputWriter $outputWriter A OutputWriter instance
|
||||
* @param MigrationFinderInterface $finder Migration files finder
|
||||
*/
|
||||
public function __construct(Connection $connection, OutputWriter $outputWriter = null, MigrationFinderInterface $finder = null)
|
||||
{
|
||||
$this->connection = $connection;
|
||||
if ($outputWriter === null) {
|
||||
$outputWriter = new OutputWriter();
|
||||
}
|
||||
$this->outputWriter = $outputWriter;
|
||||
if ($finder === null) {
|
||||
$finder = new RecursiveRegexFinder();
|
||||
}
|
||||
$this->migrationFinder = $finder;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function areMigrationsOrganizedByYear()
|
||||
{
|
||||
return $this->migrationsAreOrganizedByYear;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function areMigrationsOrganizedByYearAndMonth()
|
||||
{
|
||||
return $this->migrationsAreOrganizedByYearAndMonth;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validation that this instance has all the required properties configured
|
||||
*
|
||||
* @throws MigrationException
|
||||
*/
|
||||
public function validate()
|
||||
{
|
||||
if (!$this->migrationsNamespace) {
|
||||
throw MigrationException::migrationsNamespaceRequired();
|
||||
}
|
||||
if (!$this->migrationsDirectory) {
|
||||
throw MigrationException::migrationsDirectoryRequired();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the name of this set of migrations
|
||||
*
|
||||
* @param string $name The name of this set of migrations
|
||||
*/
|
||||
public function setName($name)
|
||||
{
|
||||
$this->name = $name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of this set of migrations
|
||||
*
|
||||
* @return string $name The name of this set of migrations
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the output writer.
|
||||
*
|
||||
* @param OutputWriter $outputWriter
|
||||
*/
|
||||
public function setOutputWriter(OutputWriter $outputWriter)
|
||||
{
|
||||
$this->outputWriter = $outputWriter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the OutputWriter instance
|
||||
*
|
||||
* @return OutputWriter $outputWriter The OutputWriter instance
|
||||
*/
|
||||
public function getOutputWriter()
|
||||
{
|
||||
return $this->outputWriter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a timestamp version as a formatted date
|
||||
*
|
||||
* @param string $version
|
||||
*
|
||||
* @return string The formatted version
|
||||
* @deprecated
|
||||
*/
|
||||
public function formatVersion($version)
|
||||
{
|
||||
return $this->getDateTime($version);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the datetime of a migration
|
||||
*
|
||||
* @param $version
|
||||
* @return string
|
||||
*/
|
||||
public function getDateTime($version)
|
||||
{
|
||||
$datetime = str_replace('Version', '', $version);
|
||||
$datetime = \DateTime::createFromFormat('YmdHis', $datetime);
|
||||
|
||||
if ($datetime === false) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return $datetime->format('Y-m-d H:i:s');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Connection instance
|
||||
*
|
||||
* @return Connection $connection The Connection instance
|
||||
*/
|
||||
public function getConnection()
|
||||
{
|
||||
return $this->connection;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the migration table name
|
||||
*
|
||||
* @param string $tableName The migration table name
|
||||
*/
|
||||
public function setMigrationsTableName($tableName)
|
||||
{
|
||||
$this->migrationsTableName = $tableName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the migration table name
|
||||
*
|
||||
* @return string $migrationsTableName The migration table name
|
||||
*/
|
||||
public function getMigrationsTableName()
|
||||
{
|
||||
return $this->migrationsTableName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the migration column name
|
||||
*
|
||||
* @param string $columnName The migration column name
|
||||
*/
|
||||
public function setMigrationsColumnName($columnName)
|
||||
{
|
||||
$this->migrationsColumnName = $columnName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the migration column name
|
||||
*
|
||||
* @return string $migrationsColumnName The migration column name
|
||||
*/
|
||||
public function getMigrationsColumnName()
|
||||
{
|
||||
return $this->migrationsColumnName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the new migrations directory where new migration classes are generated
|
||||
*
|
||||
* @param string $migrationsDirectory The new migrations directory
|
||||
*/
|
||||
public function setMigrationsDirectory($migrationsDirectory)
|
||||
{
|
||||
$this->migrationsDirectory = $migrationsDirectory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the new migrations directory where new migration classes are generated
|
||||
*
|
||||
* @return string $migrationsDirectory The new migrations directory
|
||||
*/
|
||||
public function getMigrationsDirectory()
|
||||
{
|
||||
return $this->migrationsDirectory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the migrations namespace
|
||||
*
|
||||
* @param string $migrationsNamespace The migrations namespace
|
||||
*/
|
||||
public function setMigrationsNamespace($migrationsNamespace)
|
||||
{
|
||||
$this->migrationsNamespace = $migrationsNamespace;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the migrations namespace
|
||||
*
|
||||
* @return string $migrationsNamespace The migrations namespace
|
||||
*/
|
||||
public function getMigrationsNamespace()
|
||||
{
|
||||
return $this->migrationsNamespace;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the implementation of the migration finder.
|
||||
*
|
||||
* @param MigrationFinderInterface $finder The new migration finder
|
||||
* @throws MigrationException
|
||||
*/
|
||||
public function setMigrationsFinder(MigrationFinderInterface $finder)
|
||||
{
|
||||
if (($this->migrationsAreOrganizedByYear || $this->migrationsAreOrganizedByYearAndMonth) &&
|
||||
!($finder instanceof MigrationDeepFinderInterface)) {
|
||||
|
||||
throw MigrationException::configurationIncompatibleWithFinder(
|
||||
'organize-migrations',
|
||||
$finder
|
||||
);
|
||||
}
|
||||
|
||||
$this->migrationFinder = $finder;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register migrations from a given directory. Recursively finds all files
|
||||
* with the pattern VersionYYYYMMDDHHMMSS.php as the filename and registers
|
||||
* them as migrations.
|
||||
*
|
||||
* @param string $path The root directory to where some migration classes live.
|
||||
*
|
||||
* @return Version[] The array of migrations registered.
|
||||
*/
|
||||
public function registerMigrationsFromDirectory($path)
|
||||
{
|
||||
$this->validate();
|
||||
|
||||
return $this->registerMigrations($this->findMigrations($path));
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a single migration version to be executed by a AbstractMigration
|
||||
* class.
|
||||
*
|
||||
* @param string $version The version of the migration in the format YYYYMMDDHHMMSS.
|
||||
* @param string $class The migration class to execute for the version.
|
||||
*
|
||||
* @return Version
|
||||
*
|
||||
* @throws MigrationException
|
||||
*/
|
||||
public function registerMigration($version, $class)
|
||||
{
|
||||
$this->ensureMigrationClassExists($class);
|
||||
|
||||
$version = (string) $version;
|
||||
$class = (string) $class;
|
||||
if (isset($this->migrations[$version])) {
|
||||
throw MigrationException::duplicateMigrationVersion($version, get_class($this->migrations[$version]));
|
||||
}
|
||||
$version = new Version($this, $version, $class);
|
||||
$this->migrations[$version->getVersion()] = $version;
|
||||
ksort($this->migrations, SORT_STRING);
|
||||
|
||||
return $version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register an array of migrations. Each key of the array is the version and
|
||||
* the value is the migration class name.
|
||||
*
|
||||
*
|
||||
* @param array $migrations
|
||||
*
|
||||
* @return Version[]
|
||||
*/
|
||||
public function registerMigrations(array $migrations)
|
||||
{
|
||||
$versions = [];
|
||||
foreach ($migrations as $version => $class) {
|
||||
$versions[] = $this->registerMigration($version, $class);
|
||||
}
|
||||
|
||||
return $versions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the array of registered migration versions.
|
||||
*
|
||||
* @return Version[] $migrations
|
||||
*/
|
||||
public function getMigrations()
|
||||
{
|
||||
return $this->migrations;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Version instance for a given version in the format YYYYMMDDHHMMSS.
|
||||
*
|
||||
* @param string $version The version string in the format YYYYMMDDHHMMSS.
|
||||
*
|
||||
* @return Version
|
||||
*
|
||||
* @throws MigrationException Throws exception if migration version does not exist.
|
||||
*/
|
||||
public function getVersion($version)
|
||||
{
|
||||
if (empty($this->migrations)) {
|
||||
$this->registerMigrationsFromDirectory($this->getMigrationsDirectory());
|
||||
}
|
||||
|
||||
if (!isset($this->migrations[$version])) {
|
||||
throw MigrationException::unknownMigrationVersion($version);
|
||||
}
|
||||
|
||||
return $this->migrations[$version];
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a version exists.
|
||||
*
|
||||
* @param string $version
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function hasVersion($version)
|
||||
{
|
||||
if (empty($this->migrations)) {
|
||||
$this->registerMigrationsFromDirectory($this->getMigrationsDirectory());
|
||||
}
|
||||
|
||||
return isset($this->migrations[$version]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a version has been migrated or not yet
|
||||
*
|
||||
* @param Version $version
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function hasVersionMigrated(Version $version)
|
||||
{
|
||||
$this->connect();
|
||||
$this->createMigrationTable();
|
||||
|
||||
$version = $this->connection->fetchColumn(
|
||||
"SELECT " . $this->migrationsColumnName . " FROM " . $this->migrationsTableName . " WHERE " . $this->migrationsColumnName . " = ?",
|
||||
[$version->getVersion()]
|
||||
);
|
||||
|
||||
return $version !== false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all migrated versions from the versions table, in an array.
|
||||
*
|
||||
* @return Version[]
|
||||
*/
|
||||
public function getMigratedVersions()
|
||||
{
|
||||
$this->connect();
|
||||
$this->createMigrationTable();
|
||||
|
||||
$ret = $this->connection->fetchAll("SELECT " . $this->migrationsColumnName . " FROM " . $this->migrationsTableName);
|
||||
|
||||
return array_map('current', $ret);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of available migration version numbers.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getAvailableVersions()
|
||||
{
|
||||
$availableVersions = [];
|
||||
|
||||
if (empty($this->migrations)) {
|
||||
$this->registerMigrationsFromDirectory($this->getMigrationsDirectory());
|
||||
}
|
||||
|
||||
foreach ($this->migrations as $migration) {
|
||||
$availableVersions[] = $migration->getVersion();
|
||||
}
|
||||
|
||||
return $availableVersions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current migrated version from the versions table.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getCurrentVersion()
|
||||
{
|
||||
$this->connect();
|
||||
$this->createMigrationTable();
|
||||
|
||||
if (empty($this->migrations)) {
|
||||
$this->registerMigrationsFromDirectory($this->getMigrationsDirectory());
|
||||
}
|
||||
|
||||
$where = null;
|
||||
if (!empty($this->migrations)) {
|
||||
$migratedVersions = [];
|
||||
foreach ($this->migrations as $migration) {
|
||||
$migratedVersions[] = sprintf("'%s'", $migration->getVersion());
|
||||
}
|
||||
$where = " WHERE " . $this->migrationsColumnName . " IN (" . implode(', ', $migratedVersions) . ")";
|
||||
}
|
||||
|
||||
$sql = sprintf("SELECT %s FROM %s%s ORDER BY %s DESC",
|
||||
$this->migrationsColumnName, $this->migrationsTableName, $where, $this->migrationsColumnName
|
||||
);
|
||||
|
||||
$sql = $this->connection->getDatabasePlatform()->modifyLimitQuery($sql, 1);
|
||||
$result = $this->connection->fetchColumn($sql);
|
||||
|
||||
return $result !== false ? (string) $result : '0';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the version prior to the current version.
|
||||
*
|
||||
* @return string|null A version string, or null if the current version is
|
||||
* the first.
|
||||
*/
|
||||
public function getPrevVersion()
|
||||
{
|
||||
return $this->getRelativeVersion($this->getCurrentVersion(), -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the version following the current version.
|
||||
*
|
||||
* @return string|null A version string, or null if the current version is
|
||||
* the latest.
|
||||
*/
|
||||
public function getNextVersion()
|
||||
{
|
||||
return $this->getRelativeVersion($this->getCurrentVersion(), 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the version with the specified offset to the specified version.
|
||||
*
|
||||
* @return string|null A version string, or null if the specified version
|
||||
* is unknown or the specified delta is not within the
|
||||
* list of available versions.
|
||||
*/
|
||||
public function getRelativeVersion($version, $delta)
|
||||
{
|
||||
if (empty($this->migrations)) {
|
||||
$this->registerMigrationsFromDirectory($this->getMigrationsDirectory());
|
||||
}
|
||||
|
||||
$versions = array_map('strval', array_keys($this->migrations));
|
||||
array_unshift($versions, '0');
|
||||
$offset = array_search((string)$version, $versions);
|
||||
if ($offset === false || !isset($versions[$offset + $delta])) {
|
||||
// Unknown version or delta out of bounds.
|
||||
return null;
|
||||
}
|
||||
|
||||
return $versions[$offset + $delta];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the version number from an alias.
|
||||
*
|
||||
* Supported aliases are:
|
||||
* - first: The very first version before any migrations have been run.
|
||||
* - current: The current version.
|
||||
* - prev: The version prior to the current version.
|
||||
* - next: The version following the current version.
|
||||
* - latest: The latest available version.
|
||||
*
|
||||
* If an existing version number is specified, it is returned verbatimly.
|
||||
*
|
||||
* @return string|null A version number, or null if the specified alias
|
||||
* does not map to an existing version, e.g. if "next"
|
||||
* is passed but the current version is already the
|
||||
* latest.
|
||||
*/
|
||||
public function resolveVersionAlias($alias)
|
||||
{
|
||||
if ($this->hasVersion($alias)) {
|
||||
return $alias;
|
||||
}
|
||||
switch ($alias) {
|
||||
case 'first':
|
||||
return '0';
|
||||
case 'current':
|
||||
return $this->getCurrentVersion();
|
||||
case 'prev':
|
||||
return $this->getPrevVersion();
|
||||
case 'next':
|
||||
return $this->getNextVersion();
|
||||
case 'latest':
|
||||
return $this->getLatestVersion();
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the total number of executed migration versions
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
public function getNumberOfExecutedMigrations()
|
||||
{
|
||||
$this->connect();
|
||||
$this->createMigrationTable();
|
||||
|
||||
$result = $this->connection->fetchColumn("SELECT COUNT(" . $this->migrationsColumnName . ") FROM " . $this->migrationsTableName);
|
||||
|
||||
return $result !== false ? $result : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the total number of available migration versions
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
public function getNumberOfAvailableMigrations()
|
||||
{
|
||||
if (empty($this->migrations)) {
|
||||
$this->registerMigrationsFromDirectory($this->getMigrationsDirectory());
|
||||
}
|
||||
|
||||
return count($this->migrations);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the latest available migration version.
|
||||
*
|
||||
* @return string The version string in the format YYYYMMDDHHMMSS.
|
||||
*/
|
||||
public function getLatestVersion()
|
||||
{
|
||||
if (empty($this->migrations)) {
|
||||
$this->registerMigrationsFromDirectory($this->getMigrationsDirectory());
|
||||
}
|
||||
|
||||
$versions = array_keys($this->migrations);
|
||||
$latest = end($versions);
|
||||
|
||||
return $latest !== false ? (string) $latest : '0';
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the migration table to track migrations with.
|
||||
*
|
||||
* @return boolean Whether or not the table was created.
|
||||
*/
|
||||
public function createMigrationTable()
|
||||
{
|
||||
$this->validate();
|
||||
|
||||
if ($this->migrationTableCreated) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->connect();
|
||||
if ($this->connection->getSchemaManager()->tablesExist([$this->migrationsTableName])) {
|
||||
$this->migrationTableCreated = true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
$columns = [
|
||||
$this->migrationsColumnName => new Column($this->migrationsColumnName, Type::getType('string'), ['length' => 255]),
|
||||
];
|
||||
$table = new Table($this->migrationsTableName, $columns);
|
||||
$table->setPrimaryKey([$this->migrationsColumnName]);
|
||||
$this->connection->getSchemaManager()->createTable($table);
|
||||
|
||||
$this->migrationTableCreated = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the array of migrations to executed based on the given direction
|
||||
* and target version number.
|
||||
*
|
||||
* @param string $direction The direction we are migrating.
|
||||
* @param string $to The version to migrate to.
|
||||
*
|
||||
* @return Version[] $migrations The array of migrations we can execute.
|
||||
*/
|
||||
public function getMigrationsToExecute($direction, $to)
|
||||
{
|
||||
if (empty($this->migrations)) {
|
||||
$this->registerMigrationsFromDirectory($this->getMigrationsDirectory());
|
||||
}
|
||||
|
||||
if ($direction === Version::DIRECTION_DOWN) {
|
||||
if (count($this->migrations)) {
|
||||
$allVersions = array_reverse(array_keys($this->migrations));
|
||||
$classes = array_reverse(array_values($this->migrations));
|
||||
$allVersions = array_combine($allVersions, $classes);
|
||||
} else {
|
||||
$allVersions = [];
|
||||
}
|
||||
} else {
|
||||
$allVersions = $this->migrations;
|
||||
}
|
||||
$versions = [];
|
||||
$migrated = $this->getMigratedVersions();
|
||||
foreach ($allVersions as $version) {
|
||||
if ($this->shouldExecuteMigration($direction, $version, $to, $migrated)) {
|
||||
$versions[$version->getVersion()] = $version;
|
||||
}
|
||||
}
|
||||
|
||||
return $versions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find all the migrations in a given directory.
|
||||
*
|
||||
* @param string $path the directory to search.
|
||||
* @return array
|
||||
*/
|
||||
protected function findMigrations($path)
|
||||
{
|
||||
return $this->migrationFinder->findMigrations($path, $this->getMigrationsNamespace());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $migrationsAreOrganizedByYear
|
||||
* @throws MigrationException
|
||||
*/
|
||||
public function setMigrationsAreOrganizedByYear($migrationsAreOrganizedByYear = true)
|
||||
{
|
||||
$this->ensureOrganizeMigrationsIsCompatibleWithFinder();
|
||||
|
||||
$this->migrationsAreOrganizedByYear = $migrationsAreOrganizedByYear;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $migrationsAreOrganizedByYearAndMonth
|
||||
* @throws MigrationException
|
||||
*/
|
||||
public function setMigrationsAreOrganizedByYearAndMonth($migrationsAreOrganizedByYearAndMonth = true)
|
||||
{
|
||||
$this->ensureOrganizeMigrationsIsCompatibleWithFinder();
|
||||
|
||||
$this->migrationsAreOrganizedByYear = $migrationsAreOrganizedByYearAndMonth;
|
||||
$this->migrationsAreOrganizedByYearAndMonth = $migrationsAreOrganizedByYearAndMonth;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a new migration version. A version is (usually) a datetime string.
|
||||
*
|
||||
* @param DateTimeInterface|null $now Defaults to the current time in UTC
|
||||
* @return string The newly generated version
|
||||
*/
|
||||
public function generateVersionNumber(\DateTimeInterface $now=null)
|
||||
{
|
||||
$now = $now ?: new \DateTime('now', new \DateTimeZone('UTC'));
|
||||
|
||||
return $now->format(self::VERSION_FORMAT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Explicitely opens the database connection. This is done to play nice
|
||||
* with DBAL's MasterSlaveConnection. Which, in some cases, connects to a
|
||||
* follower when fetching the executed migrations. If a follower is lagging
|
||||
* significantly behind that means the migrations system may see unexecuted
|
||||
* migrations that were actually executed earlier.
|
||||
*
|
||||
* @return bool The same value returned from the `connect` method
|
||||
*/
|
||||
protected function connect()
|
||||
{
|
||||
if ($this->connection instanceof MasterSlaveConnection) {
|
||||
return $this->connection->connect('master');
|
||||
}
|
||||
|
||||
return $this->connection->connect();
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws MigrationException
|
||||
*/
|
||||
private function ensureOrganizeMigrationsIsCompatibleWithFinder()
|
||||
{
|
||||
if (!($this->migrationFinder instanceof MigrationDeepFinderInterface)) {
|
||||
throw MigrationException::configurationIncompatibleWithFinder(
|
||||
'organize-migrations',
|
||||
$this->migrationFinder
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if we should execute a migration for a given direction and target
|
||||
* migration version.
|
||||
*
|
||||
* @param string $direction The direction we are migrating.
|
||||
* @param Version $version The Version instance to check.
|
||||
* @param string $to The version we are migrating to.
|
||||
* @param array $migrated Migrated versions array.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
private function shouldExecuteMigration($direction, Version $version, $to, $migrated)
|
||||
{
|
||||
if ($direction === Version::DIRECTION_DOWN) {
|
||||
if (!in_array($version->getVersion(), $migrated)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $version->getVersion() > $to;
|
||||
}
|
||||
|
||||
if ($direction === Version::DIRECTION_UP) {
|
||||
if (in_array($version->getVersion(), $migrated)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $version->getVersion() <= $to;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $class
|
||||
*/
|
||||
private function ensureMigrationClassExists($class)
|
||||
{
|
||||
if ( ! class_exists($class)) {
|
||||
throw MigrationException::migrationClassNotFound($class, $this->getMigrationsNamespace());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Configuration\Connection;
|
||||
|
||||
|
||||
use Doctrine\DBAL\Connection;
|
||||
|
||||
interface ConnectionLoaderInterface
|
||||
{
|
||||
/**
|
||||
* read the input and return a Configuration, returns `false` if the config
|
||||
* is not supported
|
||||
* @return Connection|null
|
||||
*/
|
||||
public function chosen();
|
||||
}
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Configuration\Connection\Loader;
|
||||
|
||||
|
||||
use Doctrine\DBAL\Connection;
|
||||
use Doctrine\DBAL\DriverManager;
|
||||
use Doctrine\DBAL\Migrations\Configuration\Connection\ConnectionLoaderInterface;
|
||||
|
||||
class ArrayConnectionConfigurationLoader implements ConnectionLoaderInterface
|
||||
{
|
||||
private $filename;
|
||||
|
||||
public function __construct($filename)
|
||||
{
|
||||
$this->filename = $filename;
|
||||
}
|
||||
|
||||
/**
|
||||
* read the input and return a Configuration, returns `false` if the config
|
||||
* is not supported
|
||||
* @return Connection|null
|
||||
*/
|
||||
public function chosen()
|
||||
{
|
||||
if (empty($this->filename)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!file_exists($this->filename)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$params = include $this->filename;
|
||||
if (!is_array($params)) {
|
||||
throw new \InvalidArgumentException('The connection file has to return an array with database configuration parameters.');
|
||||
}
|
||||
|
||||
return DriverManager::getConnection($params);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Configuration\Connection\Loader;
|
||||
|
||||
|
||||
use Doctrine\DBAL\Connection;
|
||||
use Doctrine\DBAL\Migrations\Configuration\Connection\ConnectionLoaderInterface;
|
||||
|
||||
final class ConnectionConfigurationChainLoader implements ConnectionLoaderInterface
|
||||
{
|
||||
/** @var ConnectionLoaderInterface[] */
|
||||
private $loaders;
|
||||
|
||||
|
||||
public function __construct(array $loaders)
|
||||
{
|
||||
$this->loaders = $loaders;
|
||||
}
|
||||
|
||||
/**
|
||||
* read the input and return a Configuration, returns `false` if the config
|
||||
* is not supported
|
||||
* @return Connection|null
|
||||
*/
|
||||
public function chosen()
|
||||
{
|
||||
foreach($this->loaders as $loader) {
|
||||
if (null !== $confObj = $loader->chosen()) {
|
||||
return $confObj;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Configuration\Connection\Loader;
|
||||
|
||||
|
||||
use Doctrine\DBAL\Connection;
|
||||
use Doctrine\DBAL\Migrations\Configuration\Configuration;
|
||||
use Doctrine\DBAL\Migrations\Configuration\Connection\ConnectionLoaderInterface;
|
||||
|
||||
class ConnectionConfigurationLoader implements ConnectionLoaderInterface
|
||||
{
|
||||
/** @var Configuration */
|
||||
private $configuration;
|
||||
|
||||
public function __construct(Configuration $configuration=null)
|
||||
{
|
||||
if ($configuration !== null) {
|
||||
$this->configuration = $configuration;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* read the input and return a Configuration, returns `false` if the config
|
||||
* is not supported
|
||||
* @return Connection|null
|
||||
*/
|
||||
public function chosen()
|
||||
{
|
||||
if ($this->configuration) {
|
||||
|
||||
return $this->configuration->getConnection();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Configuration\Connection\Loader;
|
||||
|
||||
|
||||
use Doctrine\DBAL\Connection;
|
||||
use Doctrine\DBAL\Migrations\Configuration\Connection\ConnectionLoaderInterface;
|
||||
use Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper;
|
||||
use Symfony\Component\Console\Helper\HelperSet;
|
||||
|
||||
class ConnectionHelperLoader implements ConnectionLoaderInterface
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $helperName;
|
||||
|
||||
/** @var HelperSet */
|
||||
private $helperSet;
|
||||
|
||||
|
||||
/**
|
||||
* ConnectionHelperLoader constructor.
|
||||
* @param HelperSet $helperSet
|
||||
* @param string $helperName
|
||||
*/
|
||||
public function __construct(HelperSet $helperSet = null, $helperName)
|
||||
{
|
||||
$this->helperName = $helperName;
|
||||
if ($helperSet === null) {
|
||||
$helperSet = new HelperSet();
|
||||
}
|
||||
$this->helperSet = $helperSet;
|
||||
}
|
||||
|
||||
/**
|
||||
* read the input and return a Configuration, returns `false` if the config
|
||||
* is not supported
|
||||
* @return Connection|null
|
||||
*/
|
||||
public function chosen()
|
||||
{
|
||||
if ($this->helperSet->has($this->helperName)) {
|
||||
$connectionHelper = $this->helperSet->get($this->helperName);
|
||||
if ($connectionHelper instanceof ConnectionHelper) {
|
||||
|
||||
return $connectionHelper->getConnection();
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
46
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Configuration/JsonConfiguration.php
vendored
Normal file
46
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Configuration/JsonConfiguration.php
vendored
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Configuration;
|
||||
|
||||
/**
|
||||
* Load migration configuration information from a PHP configuration file.
|
||||
*
|
||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||
* @link www.doctrine-project.org
|
||||
* @since 2.0
|
||||
* @author David Havl <contact@davidhavl.com>
|
||||
*/
|
||||
class JsonConfiguration extends AbstractFileConfiguration
|
||||
{
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
protected function doLoad($file)
|
||||
{
|
||||
$config = json_decode(file_get_contents($file), true);
|
||||
|
||||
if (isset($config['migrations_directory'])) {
|
||||
$config['migrations_directory'] = $this->getDirectoryRelativeToFile($file, $config['migrations_directory']);
|
||||
}
|
||||
|
||||
$this->setConfiguration($config);
|
||||
|
||||
}
|
||||
}
|
||||
40
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Configuration/XML/configuration.xsd
vendored
Normal file
40
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Configuration/XML/configuration.xsd
vendored
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
<xs:schema
|
||||
attributeFormDefault="unqualified"
|
||||
elementFormDefault="qualified"
|
||||
targetNamespace="http://doctrine-project.org/schemas/migrations/configuration"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
||||
<xs:element name="doctrine-migrations">
|
||||
<xs:complexType>
|
||||
<xs:all minOccurs="0">
|
||||
<xs:element type="xs:string" name="name" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element type="xs:string" name="migrations-namespace" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="table" minOccurs="0" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:attribute type="xs:string" name="name"/>
|
||||
<xs:attribute type="xs:string" name="column"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="organize-migrations" minOccurs="0" maxOccurs="1">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="((y|Y)(e|E)(a|A)(r|R))|((y|Y)(e|E)(a|A)(r|R)_(a|A)(n|N)(d|D)_(m|M)(o|O)(n|N)(t|T)(h|H))"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element type="xs:string" name="migrations-directory" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="migrations" minOccurs="0" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:element name="migration">
|
||||
<xs:complexType mixed="true">
|
||||
<xs:attribute name="version" type="xs:string"/>
|
||||
<xs:attribute name="class" type="xs:string"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:schema>
|
||||
74
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Configuration/XmlConfiguration.php
vendored
Normal file
74
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Configuration/XmlConfiguration.php
vendored
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Configuration;
|
||||
|
||||
use Doctrine\DBAL\Migrations\MigrationException;
|
||||
|
||||
/**
|
||||
* Load migration configuration information from a XML configuration file.
|
||||
*
|
||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||
* @link www.doctrine-project.org
|
||||
* @since 2.0
|
||||
* @author Jonathan H. Wage <jonwage@gmail.com>
|
||||
*/
|
||||
class XmlConfiguration extends AbstractFileConfiguration
|
||||
{
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
protected function doLoad($file)
|
||||
{
|
||||
libxml_use_internal_errors(true);
|
||||
$xml = new \DOMDocument();
|
||||
$xml->load($file);
|
||||
if (!$xml->schemaValidate(__DIR__ . DIRECTORY_SEPARATOR . "XML" . DIRECTORY_SEPARATOR . "configuration.xsd")) {
|
||||
libxml_clear_errors();
|
||||
throw MigrationException::configurationNotValid('XML configuration did not pass the validation test.');
|
||||
}
|
||||
|
||||
$xml = simplexml_load_file($file, "SimpleXMLElement", LIBXML_NOCDATA);
|
||||
$config = [];
|
||||
|
||||
if (isset($xml->name)) {
|
||||
$config['name'] = (string) $xml->name;
|
||||
}
|
||||
if (isset($xml->table['name'])) {
|
||||
$config['table_name'] = (string) $xml->table['name'];
|
||||
}
|
||||
if (isset($xml->table['column'])) {
|
||||
$config['column_name'] = (string) $xml->table['column'];
|
||||
}
|
||||
if (isset($xml->{'migrations-namespace'})) {
|
||||
$config['migrations_namespace'] = (string) $xml->{'migrations-namespace'};
|
||||
}
|
||||
if (isset($xml->{'organize-migrations'})) {
|
||||
$config['organize_migrations'] = $xml->{'organize-migrations'};
|
||||
}
|
||||
if (isset($xml->{'migrations-directory'})) {
|
||||
$config['migrations_directory'] = $this->getDirectoryRelativeToFile($file, (string) $xml->{'migrations-directory'});
|
||||
}
|
||||
if (isset($xml->migrations->migration)) {
|
||||
$config['migrations'] = $xml->migrations->migration;
|
||||
}
|
||||
|
||||
$this->setConfiguration($config);
|
||||
}
|
||||
}
|
||||
51
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Configuration/YamlConfiguration.php
vendored
Normal file
51
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Configuration/YamlConfiguration.php
vendored
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Configuration;
|
||||
|
||||
use Symfony\Component\Yaml\Yaml;
|
||||
|
||||
/**
|
||||
* Load migration configuration information from a YAML configuration file.
|
||||
*
|
||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||
* @link www.doctrine-project.org
|
||||
* @since 2.0
|
||||
* @author Jonathan H. Wage <jonwage@gmail.com>
|
||||
*/
|
||||
class YamlConfiguration extends AbstractFileConfiguration
|
||||
{
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
protected function doLoad($file)
|
||||
{
|
||||
$config = Yaml::parse(file_get_contents($file));
|
||||
|
||||
if (!is_array($config)) {
|
||||
throw new \InvalidArgumentException('Not valid configuration.');
|
||||
}
|
||||
|
||||
if (isset($config['migrations_directory'])) {
|
||||
$config['migrations_directory'] = $this->getDirectoryRelativeToFile($file, $config['migrations_directory']);
|
||||
}
|
||||
|
||||
$this->setConfiguration($config);
|
||||
}
|
||||
}
|
||||
86
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Finder/AbstractFinder.php
vendored
Normal file
86
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Finder/AbstractFinder.php
vendored
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Finder;
|
||||
|
||||
/**
|
||||
* Abstract base class for MigrationFinders
|
||||
*
|
||||
* @since 1.0.0-alpha3
|
||||
*/
|
||||
abstract class AbstractFinder implements MigrationFinderInterface
|
||||
{
|
||||
protected static function requireOnce($path)
|
||||
{
|
||||
require_once $path;
|
||||
}
|
||||
|
||||
protected function getRealPath($directory)
|
||||
{
|
||||
$dir = realpath($directory);
|
||||
if (false === $dir || !is_dir($dir)) {
|
||||
throw new \InvalidArgumentException(sprintf(
|
||||
'Cannot load migrations from "%s" because it is not a valid directory',
|
||||
$directory
|
||||
));
|
||||
}
|
||||
|
||||
return $dir;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the migrations and return an array of thoses loaded migrations
|
||||
* @param $files array of migration filename found
|
||||
* @param $namespace namespace of thoses migrations
|
||||
* @return array constructed with the migration name as key and the value is the fully qualified name of the migration
|
||||
*/
|
||||
protected function loadMigrations($files, $namespace)
|
||||
{
|
||||
$migrations = [];
|
||||
|
||||
uasort($files, $this->getFileSortCallback());
|
||||
|
||||
foreach ($files as $file) {
|
||||
static::requireOnce($file);
|
||||
$className = basename($file, '.php');
|
||||
$version = (string) substr($className, 7);
|
||||
if ($version === '0') {
|
||||
throw new \InvalidArgumentException(sprintf(
|
||||
'Cannot load a migrations with the name "%s" because it is a reserved number by doctrine migraitons' . PHP_EOL .
|
||||
'It\'s used to revert all migrations including the first one.',
|
||||
$version
|
||||
));
|
||||
}
|
||||
$migrations[$version] = sprintf('%s\\%s', $namespace, $className);
|
||||
}
|
||||
|
||||
return $migrations;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return callable for files basename uasort
|
||||
*
|
||||
* @return callable
|
||||
*/
|
||||
protected function getFileSortCallback(){
|
||||
return function ($a, $b) {
|
||||
return (basename($a) < basename($b)) ? -1 : 1;
|
||||
};
|
||||
}
|
||||
}
|
||||
45
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Finder/GlobFinder.php
vendored
Normal file
45
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Finder/GlobFinder.php
vendored
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Finder;
|
||||
|
||||
/**
|
||||
* A MigrationFinderInterface implementation that uses `glob` and some special file and
|
||||
* class names to load migrations from a directory.
|
||||
*
|
||||
* The migrations are expected to reside in files with the filename
|
||||
* `VersionYYYYMMDDHHMMSS.php`. Each file should contain one class named
|
||||
* `VersionYYYYMMDDHHMMSS`.
|
||||
*
|
||||
* @since 1.0.0-alpha3
|
||||
*/
|
||||
final class GlobFinder extends AbstractFinder
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function findMigrations($directory, $namespace = null)
|
||||
{
|
||||
$dir = $this->getRealPath($directory);
|
||||
|
||||
$files = glob(rtrim($dir, '/') . '/Version*.php');
|
||||
|
||||
return $this->loadMigrations($files, $namespace);
|
||||
}
|
||||
}
|
||||
29
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Finder/MigrationDeepFinderInterface.php
vendored
Normal file
29
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Finder/MigrationDeepFinderInterface.php
vendored
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Finder;
|
||||
|
||||
/**
|
||||
* A MigrationDeepFinderInterface is a MigrationFinderInterface, which locates
|
||||
* migrations not only in a directory itself, but in subdirectories of this directory,
|
||||
* too.
|
||||
*/
|
||||
interface MigrationDeepFinderInterface extends MigrationFinderInterface
|
||||
{
|
||||
}
|
||||
40
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Finder/MigrationFinderInterface.php
vendored
Normal file
40
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Finder/MigrationFinderInterface.php
vendored
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Finder;
|
||||
|
||||
/**
|
||||
* MigrationFinderInterface implementations locate migrations (classes that extend
|
||||
* `Doctrine\DBAL\Migrations\AbstractMigration`) in a directory.
|
||||
*
|
||||
* @since 1.0.0-alpha3
|
||||
*/
|
||||
interface MigrationFinderInterface
|
||||
{
|
||||
/**
|
||||
* Find all the migrations in a directory for the given path and namespace.
|
||||
*
|
||||
* @param string $directory The directory in which to look for migrations
|
||||
* @param string|null $namespace The namespace of the classes to load
|
||||
* @throws \InvalidArgumentException if the directory does not exist
|
||||
* @return string[] An array of class names that were found with the version
|
||||
* as keys.
|
||||
*/
|
||||
public function findMigrations($directory, $namespace = null);
|
||||
}
|
||||
77
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Finder/RecursiveRegexFinder.php
vendored
Normal file
77
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Finder/RecursiveRegexFinder.php
vendored
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Finder;
|
||||
|
||||
/**
|
||||
* A MigrationFinderInterface implementation that uses a RegexIterator along with a
|
||||
* RecursiveDirectoryIterator.
|
||||
*
|
||||
* @since 1.0.0-alpha3
|
||||
*/
|
||||
final class RecursiveRegexFinder extends AbstractFinder implements MigrationDeepFinderInterface
|
||||
{
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function findMigrations($directory, $namespace = null)
|
||||
{
|
||||
$dir = $this->getRealPath($directory);
|
||||
|
||||
return $this->loadMigrations($this->getMatches($this->createIterator($dir)), $namespace);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a recursive iterator to find all the migrations in the subdirectories.
|
||||
* @param $dir
|
||||
* @return \RegexIterator
|
||||
*/
|
||||
private function createIterator($dir)
|
||||
{
|
||||
return new \RegexIterator(
|
||||
new \RecursiveIteratorIterator(
|
||||
new \RecursiveDirectoryIterator($dir, \FilesystemIterator::SKIP_DOTS),
|
||||
\RecursiveIteratorIterator::LEAVES_ONLY
|
||||
),
|
||||
$this->getPattern(),
|
||||
\RegexIterator::GET_MATCH
|
||||
);
|
||||
}
|
||||
|
||||
private function getPattern()
|
||||
{
|
||||
return sprintf('#^.+\\%sVersion[^\\%s]{1,255}\\.php$#i', DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR);
|
||||
}
|
||||
|
||||
/**
|
||||
* Transform the recursiveIterator result array of array into the expected array of migration file
|
||||
* @param $iteratorFilesMatch
|
||||
* @return array
|
||||
*/
|
||||
private function getMatches($iteratorFilesMatch)
|
||||
{
|
||||
$files = [];
|
||||
foreach ($iteratorFilesMatch as $file) {
|
||||
$files[] = $file[0];
|
||||
}
|
||||
|
||||
return $files;
|
||||
}
|
||||
}
|
||||
33
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/IrreversibleMigrationException.php
vendored
Normal file
33
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/IrreversibleMigrationException.php
vendored
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations;
|
||||
|
||||
/**
|
||||
* Exception to be thrown in the down() methods of migrations that signifies it
|
||||
* is an irreversible migration and stops execution.
|
||||
*
|
||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||
* @link www.doctrine-project.org
|
||||
* @since 2.0
|
||||
* @author Jonathan H. Wage <jonwage@gmail.com>
|
||||
*/
|
||||
class IrreversibleMigrationException extends \Exception
|
||||
{
|
||||
}
|
||||
206
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Migration.php
vendored
Normal file
206
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Migration.php
vendored
Normal file
|
|
@ -0,0 +1,206 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations;
|
||||
|
||||
use Doctrine\DBAL\Migrations\Configuration\Configuration;
|
||||
|
||||
/**
|
||||
* Class for running migrations to the current version or a manually specified version.
|
||||
*
|
||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||
* @link www.doctrine-project.org
|
||||
* @since 2.0
|
||||
* @author Jonathan H. Wage <jonwage@gmail.com>
|
||||
*/
|
||||
class Migration
|
||||
{
|
||||
/**
|
||||
* The OutputWriter object instance used for outputting information
|
||||
*
|
||||
* @var OutputWriter
|
||||
*/
|
||||
private $outputWriter;
|
||||
|
||||
/**
|
||||
* @var Configuration
|
||||
*/
|
||||
private $configuration;
|
||||
|
||||
/**
|
||||
* @var boolean
|
||||
*/
|
||||
private $noMigrationException;
|
||||
|
||||
/**
|
||||
* Construct a Migration instance
|
||||
*
|
||||
* @param Configuration $configuration A migration Configuration instance
|
||||
*/
|
||||
public function __construct(Configuration $configuration)
|
||||
{
|
||||
$this->configuration = $configuration;
|
||||
$this->outputWriter = $configuration->getOutputWriter();
|
||||
$this->noMigrationException = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the array of versions and SQL queries that would be executed for
|
||||
* each version but do not execute anything.
|
||||
*
|
||||
* @param string $to The version to migrate to.
|
||||
*
|
||||
* @return array $sql The array of SQL queries.
|
||||
*/
|
||||
public function getSql($to = null)
|
||||
{
|
||||
return $this->migrate($to, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a migration SQL file to the given path
|
||||
*
|
||||
* @param string $path The path to write the migration SQL file.
|
||||
* @param string $to The version to migrate to.
|
||||
*
|
||||
* @return boolean $written
|
||||
*/
|
||||
public function writeSqlFile($path, $to = null)
|
||||
{
|
||||
$sql = $this->getSql($to);
|
||||
|
||||
$from = $this->configuration->getCurrentVersion();
|
||||
if ($to === null) {
|
||||
$to = $this->configuration->getLatestVersion();
|
||||
}
|
||||
|
||||
$direction = $from > $to ? Version::DIRECTION_DOWN : Version::DIRECTION_UP;
|
||||
|
||||
$this->outputWriter->write(sprintf("-- Migrating from %s to %s\n", $from, $to));
|
||||
|
||||
$sqlWriter = new SqlFileWriter(
|
||||
$this->configuration->getMigrationsColumnName(),
|
||||
$this->configuration->getMigrationsTableName(),
|
||||
$path,
|
||||
$this->outputWriter
|
||||
);
|
||||
|
||||
return $sqlWriter->write($sql, $direction);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param boolean $noMigrationException Throw an exception or not if no migration is found. Mostly for Continuous Integration.
|
||||
*/
|
||||
public function setNoMigrationException($noMigrationException = false)
|
||||
{
|
||||
$this->noMigrationException = $noMigrationException;
|
||||
}
|
||||
|
||||
/**
|
||||
* Run a migration to the current version or the given target version.
|
||||
*
|
||||
* @param string $to The version to migrate to.
|
||||
* @param boolean $dryRun Whether or not to make this a dry run and not execute anything.
|
||||
* @param boolean $timeAllQueries Measuring or not the execution time of each SQL query.
|
||||
* @param callable|null $confirm A callback to confirm whether the migrations should be executed.
|
||||
*
|
||||
* @return array An array of migration sql statements. This will be empty if the the $confirm callback declines to execute the migration
|
||||
*
|
||||
* @throws MigrationException
|
||||
*/
|
||||
public function migrate($to = null, $dryRun = false, $timeAllQueries = false, callable $confirm = null)
|
||||
{
|
||||
/**
|
||||
* If no version to migrate to is given we default to the last available one.
|
||||
*/
|
||||
if ($to === null) {
|
||||
$to = $this->configuration->getLatestVersion();
|
||||
}
|
||||
|
||||
$from = (string) $this->configuration->getCurrentVersion();
|
||||
$to = (string) $to;
|
||||
|
||||
/**
|
||||
* Throw an error if we can't find the migration to migrate to in the registered
|
||||
* migrations.
|
||||
*/
|
||||
$migrations = $this->configuration->getMigrations();
|
||||
if (!isset($migrations[$to]) && $to > 0) {
|
||||
throw MigrationException::unknownMigrationVersion($to);
|
||||
}
|
||||
|
||||
$direction = $from > $to ? Version::DIRECTION_DOWN : Version::DIRECTION_UP;
|
||||
$migrationsToExecute = $this->configuration->getMigrationsToExecute($direction, $to);
|
||||
|
||||
/**
|
||||
* If
|
||||
* there are no migrations to execute
|
||||
* and there are migrations,
|
||||
* and the migration from and to are the same
|
||||
* means we are already at the destination return an empty array()
|
||||
* to signify that there is nothing left to do.
|
||||
*/
|
||||
if ($from === $to && empty($migrationsToExecute) && !empty($migrations)) {
|
||||
return $this->noMigrations();
|
||||
}
|
||||
|
||||
if (!$dryRun && false === $this->migrationsCanExecute($confirm)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$output = $dryRun ? 'Executing dry run of migration' : 'Migrating';
|
||||
$output .= ' <info>%s</info> to <comment>%s</comment> from <comment>%s</comment>';
|
||||
$this->outputWriter->write(sprintf($output, $direction, $to, $from));
|
||||
|
||||
/**
|
||||
* If there are no migrations to execute throw an exception.
|
||||
*/
|
||||
if (empty($migrationsToExecute) && !$this->noMigrationException) {
|
||||
throw MigrationException::noMigrationsToExecute();
|
||||
} elseif (empty($migrationsToExecute)) {
|
||||
return $this->noMigrations();
|
||||
}
|
||||
|
||||
$sql = [];
|
||||
$time = 0;
|
||||
foreach ($migrationsToExecute as $version) {
|
||||
$versionSql = $version->execute($direction, $dryRun, $timeAllQueries);
|
||||
$sql[$version->getVersion()] = $versionSql;
|
||||
$time += $version->getTime();
|
||||
}
|
||||
|
||||
$this->outputWriter->write("\n <comment>------------------------</comment>\n");
|
||||
$this->outputWriter->write(sprintf(" <info>++</info> finished in %ss", $time));
|
||||
$this->outputWriter->write(sprintf(" <info>++</info> %s migrations executed", count($migrationsToExecute)));
|
||||
$this->outputWriter->write(sprintf(" <info>++</info> %s sql queries", count($sql, true) - count($sql)));
|
||||
|
||||
return $sql;
|
||||
}
|
||||
|
||||
private function noMigrations()
|
||||
{
|
||||
$this->outputWriter->write('<comment>No migrations to execute.</comment>');
|
||||
return [];
|
||||
}
|
||||
|
||||
private function migrationsCanExecute(callable $confirm=null)
|
||||
{
|
||||
return null === $confirm ? true : $confirm();
|
||||
}
|
||||
}
|
||||
119
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/MigrationException.php
vendored
Normal file
119
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/MigrationException.php
vendored
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations;
|
||||
|
||||
use \Doctrine\DBAL\Migrations\Finder\MigrationFinderInterface;
|
||||
|
||||
/**
|
||||
* Class for Migrations specific exceptions
|
||||
*
|
||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||
* @link www.doctrine-project.org
|
||||
* @since 2.0
|
||||
* @author Jonathan H. Wage <jonwage@gmail.com>
|
||||
*/
|
||||
class MigrationException extends \Exception
|
||||
{
|
||||
public static function migrationsNamespaceRequired()
|
||||
{
|
||||
return new self('Migrations namespace must be configured in order to use Doctrine migrations.', 2);
|
||||
}
|
||||
|
||||
public static function migrationsDirectoryRequired()
|
||||
{
|
||||
return new self('Migrations directory must be configured in order to use Doctrine migrations.', 3);
|
||||
}
|
||||
|
||||
public static function noMigrationsToExecute()
|
||||
{
|
||||
return new self('Could not find any migrations to execute.', 4);
|
||||
}
|
||||
|
||||
public static function unknownMigrationVersion($version)
|
||||
{
|
||||
return new self(sprintf('Could not find migration version %s', $version), 5);
|
||||
}
|
||||
|
||||
public static function alreadyAtVersion($version)
|
||||
{
|
||||
return new self(sprintf('Database is already at version %s', $version), 6);
|
||||
}
|
||||
|
||||
public static function duplicateMigrationVersion($version, $class)
|
||||
{
|
||||
return new self(sprintf('Migration version %s already registered with class %s', $version, $class), 7);
|
||||
}
|
||||
|
||||
public static function configurationFileAlreadyLoaded()
|
||||
{
|
||||
return new self(sprintf('Migrations configuration file already loaded'), 8);
|
||||
}
|
||||
|
||||
public static function configurationIncompatibleWithFinder(
|
||||
$configurationParameterName,
|
||||
MigrationFinderInterface $finder
|
||||
) {
|
||||
return new self(
|
||||
sprintf(
|
||||
'Configuration-parameter "%s" cannot be used with finder of type "%s"',
|
||||
$configurationParameterName,
|
||||
get_class($finder)
|
||||
),
|
||||
9
|
||||
);
|
||||
}
|
||||
|
||||
public static function configurationNotValid($msg)
|
||||
{
|
||||
return new self($msg, 10);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $migrationClass
|
||||
* @param string $migrationNamespace
|
||||
* @return MigrationException
|
||||
*/
|
||||
public static function migrationClassNotFound($migrationClass, $migrationNamespace)
|
||||
{
|
||||
return new self(
|
||||
sprintf(
|
||||
'Migration class "%s" was not found. Is it placed in "%s" namespace?',
|
||||
$migrationClass,
|
||||
$migrationNamespace
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $migrationClass
|
||||
* @return MigrationException
|
||||
*/
|
||||
public static function migrationNotConvertibleToSql($migrationClass)
|
||||
{
|
||||
return new self(
|
||||
sprintf(
|
||||
'Migration class "%s" contains a prepared statement.
|
||||
Unfortunately there is no cross platform way of outputing it as an sql string.
|
||||
Do you want to write a PR for it ?',
|
||||
$migrationClass
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
45
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/MigrationsVersion.php
vendored
Normal file
45
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/MigrationsVersion.php
vendored
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations;
|
||||
|
||||
class MigrationsVersion
|
||||
{
|
||||
private static $version = 'v1.5.0';
|
||||
|
||||
public static function VERSION() {
|
||||
$gitversion = '@git-version@';
|
||||
|
||||
if (self::isACustomPharBuild($gitversion)) {
|
||||
return $gitversion;
|
||||
}
|
||||
return self::$version;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $gitversion
|
||||
* @return bool
|
||||
*
|
||||
* Check if doctrine migration is installed by composer or
|
||||
* in a modified (not tagged) phar version.
|
||||
*/
|
||||
private static function isACustomPharBuild($gitversion) {
|
||||
return $gitversion !== '@' . 'git-version@';
|
||||
}
|
||||
}
|
||||
52
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/OutputWriter.php
vendored
Normal file
52
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/OutputWriter.php
vendored
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations;
|
||||
|
||||
/**
|
||||
* Simple class for outputting information from migrations.
|
||||
*
|
||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||
* @link www.doctrine-project.org
|
||||
* @since 2.0
|
||||
* @author Jonathan H. Wage <jonwage@gmail.com>
|
||||
*/
|
||||
class OutputWriter
|
||||
{
|
||||
private $closure;
|
||||
|
||||
public function __construct(\Closure $closure = null)
|
||||
{
|
||||
if ($closure === null) {
|
||||
$closure = function($message) {};
|
||||
}
|
||||
$this->closure = $closure;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write output using the configured closure.
|
||||
*
|
||||
* @param string $message The message to write.
|
||||
*/
|
||||
public function write($message)
|
||||
{
|
||||
$closure = $this->closure;
|
||||
$closure($message);
|
||||
}
|
||||
}
|
||||
109
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Provider/LazySchemaDiffProvider.php
vendored
Normal file
109
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Provider/LazySchemaDiffProvider.php
vendored
Normal file
|
|
@ -0,0 +1,109 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Provider;
|
||||
|
||||
use Doctrine\DBAL\Schema\Schema;
|
||||
use ProxyManager\Configuration;
|
||||
use ProxyManager\Factory\LazyLoadingValueHolderFactory;
|
||||
use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
|
||||
use ProxyManager\Proxy\LazyLoadingInterface;
|
||||
|
||||
class LazySchemaDiffProvider implements SchemaDiffProviderInterface
|
||||
{
|
||||
/** @var LazyLoadingValueHolderFactory */
|
||||
private $proxyFactory;
|
||||
|
||||
/** @var SchemaDiffProviderInterface */
|
||||
private $originalSchemaManipulator;
|
||||
|
||||
public function __construct(LazyLoadingValueHolderFactory $proxyFactory, SchemaDiffProviderInterface $originalSchemaManipulator)
|
||||
{
|
||||
$this->proxyFactory = $proxyFactory;
|
||||
$this->originalSchemaManipulator = $originalSchemaManipulator;
|
||||
}
|
||||
|
||||
public static function fromDefaultProxyFacyoryConfiguration(SchemaDiffProviderInterface $originalSchemaManipulator)
|
||||
{
|
||||
$proxyConfig = new Configuration();
|
||||
$proxyConfig->setGeneratorStrategy(new EvaluatingGeneratorStrategy());
|
||||
$proxyFactory = new LazyLoadingValueHolderFactory($proxyConfig);
|
||||
|
||||
return new LazySchemaDiffProvider($proxyFactory, $originalSchemaManipulator);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Schema
|
||||
*/
|
||||
public function createFromSchema()
|
||||
{
|
||||
$originalSchemaManipulator = $this->originalSchemaManipulator;
|
||||
|
||||
return $this->proxyFactory->createProxy(
|
||||
Schema::class,
|
||||
function (& $wrappedObject, $proxy, $method, array $parameters, & $initializer) use ($originalSchemaManipulator) {
|
||||
$initializer = null;
|
||||
$wrappedObject = $originalSchemaManipulator->createFromSchema();
|
||||
|
||||
return true;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Schema $fromSchema
|
||||
* @return Schema
|
||||
*/
|
||||
public function createToSchema(Schema $fromSchema)
|
||||
{
|
||||
$originalSchemaManipulator = $this->originalSchemaManipulator;
|
||||
|
||||
if ($fromSchema instanceof LazyLoadingInterface && ! $fromSchema->isProxyInitialized()) {
|
||||
return $this->proxyFactory->createProxy(
|
||||
Schema::class,
|
||||
function (& $wrappedObject, $proxy, $method, array $parameters, & $initializer) use ($originalSchemaManipulator, $fromSchema) {
|
||||
$initializer = null;
|
||||
$wrappedObject = $originalSchemaManipulator->createToSchema($fromSchema);
|
||||
|
||||
return true;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
return $this->originalSchemaManipulator->createToSchema($fromSchema);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Schema $fromSchema
|
||||
* @param Schema $toSchema
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
public function getSqlDiffToMigrate(Schema $fromSchema, Schema $toSchema)
|
||||
{
|
||||
if (
|
||||
$toSchema instanceof LazyLoadingInterface
|
||||
&& ! $toSchema->isProxyInitialized()
|
||||
) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return $this->originalSchemaManipulator->getSqlDiffToMigrate($fromSchema, $toSchema);
|
||||
}
|
||||
}
|
||||
82
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Provider/OrmSchemaProvider.php
vendored
Normal file
82
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Provider/OrmSchemaProvider.php
vendored
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Provider;
|
||||
|
||||
use Doctrine\ORM\EntityManager;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Doctrine\ORM\Tools\SchemaTool;
|
||||
|
||||
/**
|
||||
* A schema provider that uses the doctrine ORM to generate schemas.
|
||||
*
|
||||
* @since 1.0.0-alpha3
|
||||
*/
|
||||
final class OrmSchemaProvider implements SchemaProviderInterface
|
||||
{
|
||||
/**
|
||||
* @var EntityManagerInterface
|
||||
*/
|
||||
private $entityManager;
|
||||
|
||||
public function __construct($em)
|
||||
{
|
||||
if (!$this->isEntityManager($em)) {
|
||||
throw new \InvalidArgumentException(sprintf(
|
||||
'$em is not a valid Doctrine ORM Entity Manager, got "%s"',
|
||||
is_object($em) ? get_class($em) : gettype($em)
|
||||
));
|
||||
}
|
||||
|
||||
$this->entityManager = $em;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function createSchema()
|
||||
{
|
||||
$metadata = $this->entityManager->getMetadataFactory()->getAllMetadata();
|
||||
if (empty($metadata)) {
|
||||
throw new \UnexpectedValueException('No mapping information to process');
|
||||
}
|
||||
|
||||
$tool = new SchemaTool($this->entityManager);
|
||||
|
||||
return $tool->getSchemaFromMetadata($metadata);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Doctrine's EntityManagerInterface was introduced in version 2.4, since this
|
||||
* library allows those older version we need to be able to check for those
|
||||
* old ORM versions. Hence the helper method.
|
||||
*
|
||||
* No need to check to see if EntityManagerInterface exists first here, PHP
|
||||
* doesn't care.
|
||||
*
|
||||
* @param mixed $manager Hopefully an entity manager, but it may be anything
|
||||
* @return boolean
|
||||
*/
|
||||
private function isEntityManager($manager)
|
||||
{
|
||||
return $manager instanceof EntityManagerInterface || $manager instanceof EntityManager;
|
||||
}
|
||||
|
||||
}
|
||||
66
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Provider/SchemaDiffProvider.php
vendored
Normal file
66
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Provider/SchemaDiffProvider.php
vendored
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Provider;
|
||||
|
||||
use Doctrine\DBAL\Platforms\AbstractPlatform;
|
||||
use Doctrine\DBAL\Schema\AbstractSchemaManager;
|
||||
use Doctrine\DBAL\Schema\Schema;
|
||||
|
||||
class SchemaDiffProvider implements SchemaDiffProviderInterface
|
||||
{
|
||||
/** @var AbstractPlatform */
|
||||
private $platform;
|
||||
|
||||
/** @var AbstractSchemaManager */
|
||||
private $schemaManager;
|
||||
|
||||
public function __construct(AbstractSchemaManager $schemaManager, AbstractPlatform $platform)
|
||||
{
|
||||
$this->schemaManager = $schemaManager;
|
||||
$this->platform = $platform;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Schema
|
||||
*/
|
||||
public function createFromSchema()
|
||||
{
|
||||
return $this->schemaManager->createSchema();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Schema $fromSchema
|
||||
* @return Schema
|
||||
*/
|
||||
public function createToSchema(Schema $fromSchema)
|
||||
{
|
||||
return clone $fromSchema;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Schema $fromSchema
|
||||
* @param Schema $toSchema
|
||||
* @return string[]
|
||||
*/
|
||||
public function getSqlDiffToMigrate(Schema $fromSchema, Schema $toSchema)
|
||||
{
|
||||
return $fromSchema->getMigrateToSql($toSchema, $this->platform);
|
||||
}
|
||||
}
|
||||
56
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Provider/SchemaDiffProviderInterface.php
vendored
Normal file
56
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Provider/SchemaDiffProviderInterface.php
vendored
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Provider;
|
||||
|
||||
use Doctrine\DBAL\Schema\Schema;
|
||||
|
||||
/**
|
||||
* Generates `Schema` objects to be passed to the migrations class.
|
||||
*
|
||||
* @since 1.3
|
||||
*/
|
||||
interface SchemaDiffProviderInterface
|
||||
{
|
||||
/**
|
||||
* Create the schema that represent the current state of the database.
|
||||
*
|
||||
* @return Schema
|
||||
*/
|
||||
public function createFromSchema();
|
||||
|
||||
/**
|
||||
* Create the schema that will represent the future state of the database
|
||||
*
|
||||
* @param Schema $fromSchema
|
||||
* @return Schema
|
||||
*/
|
||||
public function createToSchema(Schema $fromSchema);
|
||||
|
||||
/**
|
||||
* Return an array of sql statement that migrate the database state from the
|
||||
* fromSchema to the toSchema.
|
||||
*
|
||||
* @param Schema $fromSchema
|
||||
* @param Schema $toSchema
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
public function getSqlDiffToMigrate(Schema $fromSchema, Schema $toSchema);
|
||||
}
|
||||
36
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Provider/SchemaProviderInterface.php
vendored
Normal file
36
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Provider/SchemaProviderInterface.php
vendored
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Provider;
|
||||
|
||||
/**
|
||||
* Generates `Schema` objects for the diff command. A schema provider should
|
||||
* return the schema to which the database should be migrated.
|
||||
*
|
||||
* @since 1.0.0-alpha3
|
||||
*/
|
||||
interface SchemaProviderInterface
|
||||
{
|
||||
/**
|
||||
* Create the schema to which the database should be migrated.
|
||||
*
|
||||
* @return \Doctrine\DBAL\Schema\Schema
|
||||
*/
|
||||
public function createSchema();
|
||||
}
|
||||
48
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Provider/StubSchemaProvider.php
vendored
Normal file
48
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Provider/StubSchemaProvider.php
vendored
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Provider;
|
||||
|
||||
use Doctrine\DBAL\Schema\Schema;
|
||||
|
||||
/**
|
||||
* A schemea provider implementation that just returns the schema its given.
|
||||
*
|
||||
* @since 1.0.0-alpha3
|
||||
*/
|
||||
final class StubSchemaProvider implements SchemaProviderInterface
|
||||
{
|
||||
/**
|
||||
* @var Schema
|
||||
*/
|
||||
private $toSchema;
|
||||
|
||||
public function __construct(Schema $schema)
|
||||
{
|
||||
$this->toSchema = $schema;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function createSchema()
|
||||
{
|
||||
return $this->toSchema;
|
||||
}
|
||||
}
|
||||
24
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/SkipMigrationException.php
vendored
Normal file
24
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/SkipMigrationException.php
vendored
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations;
|
||||
|
||||
class SkipMigrationException extends MigrationException
|
||||
{
|
||||
}
|
||||
128
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/SqlFileWriter.php
vendored
Normal file
128
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/SqlFileWriter.php
vendored
Normal file
|
|
@ -0,0 +1,128 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations;
|
||||
|
||||
use Doctrine\DBAL\DBALException;
|
||||
use Doctrine\DBAL\Exception\InvalidArgumentException;
|
||||
|
||||
class SqlFileWriter
|
||||
{
|
||||
private $migrationsColumnName;
|
||||
|
||||
private $migrationsTableName;
|
||||
|
||||
private $destPath;
|
||||
|
||||
/** @var null|OutputWriter */
|
||||
private $outputWriter;
|
||||
|
||||
/**
|
||||
* @param string $migrationsColumnName
|
||||
* @param string $migrationsTableName
|
||||
* @param string $destPath
|
||||
* @param \Doctrine\DBAL\Migrations\OutputWriter $outputWriter
|
||||
*/
|
||||
public function __construct($migrationsColumnName, $migrationsTableName, $destPath, OutputWriter $outputWriter = null)
|
||||
{
|
||||
if (empty($migrationsColumnName)) {
|
||||
$this->throwInvalidArgumentException('Migrations column name cannot be empty.');
|
||||
}
|
||||
$this->migrationsColumnName = $migrationsColumnName;
|
||||
if (empty($migrationsTableName)) {
|
||||
$this->throwInvalidArgumentException('Migrations table name cannot be empty.');
|
||||
}
|
||||
$this->migrationsTableName = $migrationsTableName;
|
||||
|
||||
if (empty($destPath)) {
|
||||
$this->throwInvalidArgumentException('Destination file must be specified.');
|
||||
}
|
||||
$this->destPath = $destPath;
|
||||
|
||||
$this->outputWriter = $outputWriter;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $queriesByVersion array Keys are versions and values are arrays of SQL queries (they must be castable to string)
|
||||
* @param string $direction
|
||||
* @return int|bool
|
||||
*/
|
||||
public function write(array $queriesByVersion, $direction)
|
||||
{
|
||||
$path = $this->buildMigrationFilePath();
|
||||
$string = $this->buildMigrationFile($queriesByVersion, $direction);
|
||||
|
||||
if ($this->outputWriter) {
|
||||
$this->outputWriter->write("\n" . sprintf('Writing migration file to "<info>%s</info>"', $path));
|
||||
}
|
||||
|
||||
return file_put_contents($path, $string);
|
||||
}
|
||||
|
||||
private function buildMigrationFile(array $queriesByVersion, $direction)
|
||||
{
|
||||
$string = sprintf("-- Doctrine Migration File Generated on %s\n", date('Y-m-d H:i:s'));
|
||||
|
||||
foreach ($queriesByVersion as $version => $queries) {
|
||||
$string .= "\n-- Version " . $version . "\n";
|
||||
foreach ($queries as $query) {
|
||||
$string .= $query . ";\n";
|
||||
}
|
||||
|
||||
|
||||
$string .= $this->getVersionUpdateQuery($version, $direction);
|
||||
}
|
||||
|
||||
return $string;
|
||||
}
|
||||
|
||||
private function getVersionUpdateQuery($version, $direction)
|
||||
{
|
||||
if ($direction == Version::DIRECTION_DOWN) {
|
||||
$query = "DELETE FROM %s WHERE %s = '%s';\n";
|
||||
} else {
|
||||
$query = "INSERT INTO %s (%s) VALUES ('%s');\n";
|
||||
}
|
||||
|
||||
return sprintf($query, $this->migrationsTableName, $this->migrationsColumnName, $version);
|
||||
}
|
||||
|
||||
private function buildMigrationFilePath()
|
||||
{
|
||||
$path = $this->destPath;
|
||||
if (is_dir($path)) {
|
||||
$path = realpath($path);
|
||||
$path = $path . '/doctrine_migration_' . date('YmdHis') . '.sql';
|
||||
}
|
||||
|
||||
return $path;
|
||||
}
|
||||
|
||||
/**
|
||||
* This only exists for backwards-compatibiliy with DBAL 2.4
|
||||
*/
|
||||
protected function throwInvalidArgumentException($message)
|
||||
{
|
||||
if (class_exists('Doctrine\DBAL\Exception\InvalidArgumentException')) {
|
||||
throw new InvalidArgumentException($message);
|
||||
} else {
|
||||
throw new DBALException($message);
|
||||
}
|
||||
}
|
||||
}
|
||||
182
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/Command/AbstractCommand.php
vendored
Normal file
182
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/Command/AbstractCommand.php
vendored
Normal file
|
|
@ -0,0 +1,182 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Tools\Console\Command;
|
||||
|
||||
use Doctrine\DBAL\Migrations\Configuration\Configuration;
|
||||
use Doctrine\DBAL\Migrations\Configuration\Connection\Loader\ArrayConnectionConfigurationLoader;
|
||||
use Doctrine\DBAL\Migrations\Configuration\Connection\Loader\ConnectionConfigurationLoader;
|
||||
use Doctrine\DBAL\Migrations\Configuration\Connection\Loader\ConnectionHelperLoader;
|
||||
use Doctrine\DBAL\Migrations\Configuration\Connection\Loader\ConnectionConfigurationChainLoader;
|
||||
use Doctrine\DBAL\Migrations\OutputWriter;
|
||||
use Doctrine\DBAL\Migrations\Tools\Console\Helper\ConfigurationHelper;
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Question\ConfirmationQuestion;
|
||||
|
||||
/**
|
||||
* CLI Command for adding and deleting migration versions from the version table.
|
||||
*
|
||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||
* @link www.doctrine-project.org
|
||||
* @since 2.0
|
||||
* @author Jonathan Wage <jonwage@gmail.com>
|
||||
*/
|
||||
abstract class AbstractCommand extends Command
|
||||
{
|
||||
/**
|
||||
* The configuration property only contains the configuration injected by the setter.
|
||||
*
|
||||
* @var Configuration
|
||||
*/
|
||||
private $configuration;
|
||||
|
||||
/**
|
||||
* The migrationConfiguration property contains the configuration
|
||||
* created taking into account the command line options.
|
||||
*
|
||||
* @var Configuration
|
||||
*/
|
||||
private $migrationConfiguration;
|
||||
|
||||
/**
|
||||
* @var OutputWriter
|
||||
*/
|
||||
private $outputWriter;
|
||||
|
||||
/**
|
||||
* @var \Doctrine\DBAL\Connection
|
||||
*/
|
||||
private $connection;
|
||||
|
||||
protected function configure()
|
||||
{
|
||||
$this->addOption('configuration', null, InputOption::VALUE_OPTIONAL, 'The path to a migrations configuration file.');
|
||||
$this->addOption('db-configuration', null, InputOption::VALUE_OPTIONAL, 'The path to a database connection configuration file.');
|
||||
}
|
||||
|
||||
protected function outputHeader(Configuration $configuration, OutputInterface $output)
|
||||
{
|
||||
$name = $configuration->getName();
|
||||
$name = $name ? $name : 'Doctrine Database Migrations';
|
||||
$name = str_repeat(' ', 20) . $name . str_repeat(' ', 20);
|
||||
$output->writeln('<question>' . str_repeat(' ', strlen($name)) . '</question>');
|
||||
$output->writeln('<question>' . $name . '</question>');
|
||||
$output->writeln('<question>' . str_repeat(' ', strlen($name)) . '</question>');
|
||||
$output->writeln('');
|
||||
}
|
||||
|
||||
public function setMigrationConfiguration(Configuration $config)
|
||||
{
|
||||
$this->configuration = $config;
|
||||
}
|
||||
|
||||
/**
|
||||
* When any (config) command line option is passed to the migration the migrationConfiguration
|
||||
* property is set with the new generated configuration.
|
||||
* If no (config) option is passed the migrationConfiguration property is set to the value
|
||||
* of the configuration one (if any).
|
||||
* Else a new configuration is created and assigned to the migrationConfiguration property.
|
||||
*
|
||||
* @param InputInterface $input
|
||||
* @param OutputInterface $output
|
||||
*
|
||||
* @return Configuration
|
||||
*/
|
||||
protected function getMigrationConfiguration(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
if (!$this->migrationConfiguration) {
|
||||
if ($this->getHelperSet()->has('configuration')
|
||||
&& $this->getHelperSet()->get('configuration') instanceof ConfigurationHelper) {
|
||||
$configHelper = $this->getHelperSet()->get('configuration');
|
||||
} else {
|
||||
$configHelper = new ConfigurationHelper($this->getConnection($input), $this->configuration);
|
||||
}
|
||||
$this->migrationConfiguration = $configHelper->getMigrationConfig($input, $this->getOutputWriter($output));
|
||||
}
|
||||
|
||||
return $this->migrationConfiguration;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method ensure that we stay compatible with symfony console 2.3 by using the deprecated dialog helper
|
||||
* but use the ConfirmationQuestion when available.
|
||||
*
|
||||
* @param $question
|
||||
* @param InputInterface $input
|
||||
* @param OutputInterface $output
|
||||
* @return mixed
|
||||
*/
|
||||
protected function askConfirmation($question, InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
if (!$this->getHelperSet()->has('question')) {
|
||||
return $this->getHelper('dialog')->askConfirmation($output, '<question>' . $question . '</question>', false);
|
||||
}
|
||||
|
||||
return $this->getHelper('question')->ask($input, $output, new ConfirmationQuestion($question));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \Symfony\Component\Console\Output\OutputInterface $output
|
||||
*
|
||||
* @return \Doctrine\DBAL\Migrations\OutputWriter
|
||||
*/
|
||||
private function getOutputWriter(OutputInterface $output)
|
||||
{
|
||||
if (!$this->outputWriter) {
|
||||
$this->outputWriter = new OutputWriter(function($message) use ($output) {
|
||||
return $output->writeln($message);
|
||||
});
|
||||
}
|
||||
|
||||
return $this->outputWriter;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \Symfony\Component\Console\Input\InputInterface $input
|
||||
*
|
||||
* @return \Doctrine\DBAL\Connection
|
||||
* @throws \Doctrine\DBAL\DBALException
|
||||
*/
|
||||
private function getConnection(InputInterface $input)
|
||||
{
|
||||
if ($this->connection) {
|
||||
return $this->connection;
|
||||
}
|
||||
|
||||
$chainLoader = new ConnectionConfigurationChainLoader(
|
||||
[
|
||||
new ArrayConnectionConfigurationLoader($input->getOption('db-configuration')),
|
||||
new ArrayConnectionConfigurationLoader('migrations-db.php'),
|
||||
new ConnectionHelperLoader($this->getHelperSet(), 'connection'),
|
||||
new ConnectionConfigurationLoader($this->configuration),
|
||||
]
|
||||
);
|
||||
$connection = $chainLoader->chosen();
|
||||
|
||||
if ($connection) {
|
||||
return $this->connection = $connection;
|
||||
}
|
||||
|
||||
throw new \InvalidArgumentException('You have to specify a --db-configuration file or pass a Database Connection as a dependency to the Migrations.');
|
||||
}
|
||||
|
||||
}
|
||||
197
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/Command/DiffCommand.php
vendored
Normal file
197
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/Command/DiffCommand.php
vendored
Normal file
|
|
@ -0,0 +1,197 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Tools\Console\Command;
|
||||
|
||||
use Doctrine\DBAL\Migrations\Configuration\Configuration;
|
||||
use Doctrine\DBAL\Version as DbalVersion;
|
||||
use Doctrine\DBAL\Migrations\Provider\SchemaProviderInterface;
|
||||
use Doctrine\DBAL\Migrations\Provider\OrmSchemaProvider;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
|
||||
/**
|
||||
* Command for generate migration classes by comparing your current database schema
|
||||
* to your mapping information.
|
||||
*
|
||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||
* @link www.doctrine-project.org
|
||||
* @since 2.0
|
||||
* @author Jonathan Wage <jonwage@gmail.com>
|
||||
*/
|
||||
class DiffCommand extends GenerateCommand
|
||||
{
|
||||
/**
|
||||
* @var SchemaProviderInterface
|
||||
*/
|
||||
protected $schemaProvider;
|
||||
|
||||
public function __construct(SchemaProviderInterface $schemaProvider=null)
|
||||
{
|
||||
$this->schemaProvider = $schemaProvider;
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
protected function configure()
|
||||
{
|
||||
parent::configure();
|
||||
|
||||
$this
|
||||
->setName('migrations:diff')
|
||||
->setDescription('Generate a migration by comparing your current database to your mapping information.')
|
||||
->setHelp(<<<EOT
|
||||
The <info>%command.name%</info> command generates a migration by comparing your current database to your mapping information:
|
||||
|
||||
<info>%command.full_name%</info>
|
||||
|
||||
You can optionally specify a <comment>--editor-cmd</comment> option to open the generated file in your favorite editor:
|
||||
|
||||
<info>%command.full_name% --editor-cmd=mate</info>
|
||||
EOT
|
||||
)
|
||||
->addOption('filter-expression', null, InputOption::VALUE_OPTIONAL, 'Tables which are filtered by Regular Expression.')
|
||||
->addOption('formatted', null, InputOption::VALUE_NONE, 'Format the generated SQL.')
|
||||
->addOption('line-length', null, InputOption::VALUE_OPTIONAL, 'Max line length of unformatted lines.', 120)
|
||||
;
|
||||
}
|
||||
|
||||
public function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$isDbalOld = (DbalVersion::compare('2.2.0') > 0);
|
||||
$configuration = $this->getMigrationConfiguration($input, $output);
|
||||
|
||||
$conn = $configuration->getConnection();
|
||||
$platform = $conn->getDatabasePlatform();
|
||||
|
||||
if ($filterExpr = $input->getOption('filter-expression')) {
|
||||
if ($isDbalOld) {
|
||||
throw new \InvalidArgumentException('The "--filter-expression" option can only be used as of Doctrine DBAL 2.2');
|
||||
}
|
||||
|
||||
$conn->getConfiguration()
|
||||
->setFilterSchemaAssetsExpression($filterExpr);
|
||||
}
|
||||
|
||||
$fromSchema = $conn->getSchemaManager()->createSchema();
|
||||
$toSchema = $this->getSchemaProvider()->createSchema();
|
||||
|
||||
//Not using value from options, because filters can be set from config.yml
|
||||
if ( ! $isDbalOld && $filterExpr = $conn->getConfiguration()->getFilterSchemaAssetsExpression()) {
|
||||
foreach ($toSchema->getTables() as $table) {
|
||||
$tableName = $table->getName();
|
||||
if ( ! preg_match($filterExpr, $this->resolveTableName($tableName))) {
|
||||
$toSchema->dropTable($tableName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$up = $this->buildCodeFromSql(
|
||||
$configuration,
|
||||
$fromSchema->getMigrateToSql($toSchema, $platform),
|
||||
$input->getOption('formatted'),
|
||||
$input->getOption('line-length')
|
||||
);
|
||||
$down = $this->buildCodeFromSql(
|
||||
$configuration,
|
||||
$fromSchema->getMigrateFromSql($toSchema, $platform),
|
||||
$input->getOption('formatted'),
|
||||
$input->getOption('line-length')
|
||||
);
|
||||
|
||||
if (! $up && ! $down) {
|
||||
$output->writeln('No changes detected in your mapping information.');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$version = $configuration->generateVersionNumber();
|
||||
$path = $this->generateMigration($configuration, $input, $version, $up, $down);
|
||||
|
||||
$output->writeln(sprintf('Generated new migration class to "<info>%s</info>" from schema differences.', $path));
|
||||
$output->writeln(file_get_contents($path));
|
||||
}
|
||||
|
||||
private function buildCodeFromSql(Configuration $configuration, array $sql, $formatted=false, $lineLength=120)
|
||||
{
|
||||
$currentPlatform = $configuration->getConnection()->getDatabasePlatform()->getName();
|
||||
$code = [];
|
||||
foreach ($sql as $query) {
|
||||
if (stripos($query, $configuration->getMigrationsTableName()) !== false) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($formatted) {
|
||||
if (!class_exists('\SqlFormatter')) {
|
||||
throw new \InvalidArgumentException(
|
||||
'The "--formatted" option can only be used if the sql formatter is installed.'.
|
||||
'Please run "composer require jdorn/sql-formatter".'
|
||||
);
|
||||
}
|
||||
|
||||
$maxLength = $lineLength - 18 - 8; // max - php code length - indentation
|
||||
|
||||
if (strlen($query) > $maxLength) {
|
||||
$query = \SqlFormatter::format($query, false);
|
||||
}
|
||||
}
|
||||
|
||||
$code[] = sprintf("\$this->addSql(%s);", var_export($query, true));
|
||||
}
|
||||
|
||||
if (!empty($code)) {
|
||||
array_unshift(
|
||||
$code,
|
||||
sprintf(
|
||||
"\$this->abortIf(\$this->connection->getDatabasePlatform()->getName() !== %s, %s);",
|
||||
var_export($currentPlatform, true),
|
||||
var_export(sprintf("Migration can only be executed safely on '%s'.", $currentPlatform), true)
|
||||
),
|
||||
""
|
||||
);
|
||||
}
|
||||
|
||||
return implode("\n", $code);
|
||||
}
|
||||
|
||||
private function getSchemaProvider()
|
||||
{
|
||||
if (!$this->schemaProvider) {
|
||||
$this->schemaProvider = new OrmSchemaProvider($this->getHelper('entityManager')->getEntityManager());
|
||||
}
|
||||
|
||||
return $this->schemaProvider;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve a table name from its fully qualified name. The `$name` argument
|
||||
* comes from Doctrine\DBAL\Schema\Table#getName which can sometimes return
|
||||
* a namespaced name with the form `{namespace}.{tableName}`. This extracts
|
||||
* the table name from that.
|
||||
*
|
||||
* @param string $name
|
||||
* @return string
|
||||
*/
|
||||
private function resolveTableName($name)
|
||||
{
|
||||
$pos = strpos($name, '.');
|
||||
|
||||
return false === $pos ? $name : substr($name, $pos + 1);
|
||||
}
|
||||
}
|
||||
102
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/Command/ExecuteCommand.php
vendored
Normal file
102
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/Command/ExecuteCommand.php
vendored
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Tools\Console\Command;
|
||||
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
|
||||
/**
|
||||
* Command for executing single migrations up or down manually.
|
||||
*
|
||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||
* @link www.doctrine-project.org
|
||||
* @since 2.0
|
||||
* @author Jonathan Wage <jonwage@gmail.com>
|
||||
*/
|
||||
class ExecuteCommand extends AbstractCommand
|
||||
{
|
||||
protected function configure()
|
||||
{
|
||||
$this
|
||||
->setName('migrations:execute')
|
||||
->setDescription('Execute a single migration version up or down manually.')
|
||||
->addArgument('version', InputArgument::REQUIRED, 'The version to execute.', null)
|
||||
->addOption('write-sql', null, InputOption::VALUE_NONE, 'The path to output the migration SQL file instead of executing it.')
|
||||
->addOption('dry-run', null, InputOption::VALUE_NONE, 'Execute the migration as a dry run.')
|
||||
->addOption('up', null, InputOption::VALUE_NONE, 'Execute the migration up.')
|
||||
->addOption('down', null, InputOption::VALUE_NONE, 'Execute the migration down.')
|
||||
->addOption('query-time', null, InputOption::VALUE_NONE, 'Time all the queries individually.')
|
||||
->setHelp(<<<EOT
|
||||
The <info>%command.name%</info> command executes a single migration version up or down manually:
|
||||
|
||||
<info>%command.full_name% YYYYMMDDHHMMSS</info>
|
||||
|
||||
If no <comment>--up</comment> or <comment>--down</comment> option is specified it defaults to up:
|
||||
|
||||
<info>%command.full_name% YYYYMMDDHHMMSS --down</info>
|
||||
|
||||
You can also execute the migration as a <comment>--dry-run</comment>:
|
||||
|
||||
<info>%command.full_name% YYYYMMDDHHMMSS --dry-run</info>
|
||||
|
||||
You can output the would be executed SQL statements to a file with <comment>--write-sql</comment>:
|
||||
|
||||
<info>%command.full_name% YYYYMMDDHHMMSS --write-sql</info>
|
||||
|
||||
Or you can also execute the migration without a warning message which you need to interact with:
|
||||
|
||||
<info>%command.full_name% YYYYMMDDHHMMSS --no-interaction</info>
|
||||
EOT
|
||||
);
|
||||
|
||||
parent::configure();
|
||||
}
|
||||
|
||||
public function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$version = $input->getArgument('version');
|
||||
$direction = $input->getOption('down') ? 'down' : 'up';
|
||||
|
||||
$configuration = $this->getMigrationConfiguration($input, $output);
|
||||
$version = $configuration->getVersion($version);
|
||||
|
||||
$timeAllqueries = $input->getOption('query-time');
|
||||
|
||||
if ($path = $input->getOption('write-sql')) {
|
||||
$path = is_bool($path) ? getcwd() : $path;
|
||||
$version->writeSqlFile($path, $direction);
|
||||
} else {
|
||||
if ($input->isInteractive()) {
|
||||
$question = 'WARNING! You are about to execute a database migration that could result in schema changes and data lost. Are you sure you wish to continue? (y/n)';
|
||||
$execute = $this->askConfirmation($question, $input, $output);
|
||||
} else {
|
||||
$execute = true;
|
||||
}
|
||||
|
||||
if ($execute) {
|
||||
$version->execute($direction, (boolean) $input->getOption('dry-run'), $timeAllqueries);
|
||||
} else {
|
||||
$output->writeln('<error>Migration cancelled!</error>');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
136
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/Command/GenerateCommand.php
vendored
Normal file
136
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/Command/GenerateCommand.php
vendored
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Tools\Console\Command;
|
||||
|
||||
use Doctrine\DBAL\Migrations\Configuration\Configuration;
|
||||
use Doctrine\DBAL\Migrations\Tools\Console\Helper\MigrationDirectoryHelper;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
|
||||
/**
|
||||
* Command for generating new blank migration classes
|
||||
*
|
||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||
* @link www.doctrine-project.org
|
||||
* @since 2.0
|
||||
* @author Jonathan Wage <jonwage@gmail.com>
|
||||
*/
|
||||
class GenerateCommand extends AbstractCommand
|
||||
{
|
||||
|
||||
private static $_template =
|
||||
'<?php
|
||||
|
||||
namespace <namespace>;
|
||||
|
||||
use Doctrine\DBAL\Migrations\AbstractMigration;
|
||||
use Doctrine\DBAL\Schema\Schema;
|
||||
|
||||
/**
|
||||
* Auto-generated Migration: Please modify to your needs!
|
||||
*/
|
||||
class Version<version> extends AbstractMigration
|
||||
{
|
||||
/**
|
||||
* @param Schema $schema
|
||||
*/
|
||||
public function up(Schema $schema)
|
||||
{
|
||||
// this up() migration is auto-generated, please modify it to your needs
|
||||
<up>
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Schema $schema
|
||||
*/
|
||||
public function down(Schema $schema)
|
||||
{
|
||||
// this down() migration is auto-generated, please modify it to your needs
|
||||
<down>
|
||||
}
|
||||
}
|
||||
';
|
||||
|
||||
protected function configure()
|
||||
{
|
||||
$this
|
||||
->setName('migrations:generate')
|
||||
->setDescription('Generate a blank migration class.')
|
||||
->addOption('editor-cmd', null, InputOption::VALUE_OPTIONAL, 'Open file with this command upon creation.')
|
||||
->setHelp(<<<EOT
|
||||
The <info>%command.name%</info> command generates a blank migration class:
|
||||
|
||||
<info>%command.full_name%</info>
|
||||
|
||||
You can optionally specify a <comment>--editor-cmd</comment> option to open the generated file in your favorite editor:
|
||||
|
||||
<info>%command.full_name% --editor-cmd=mate</info>
|
||||
EOT
|
||||
);
|
||||
|
||||
parent::configure();
|
||||
}
|
||||
|
||||
public function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$configuration = $this->getMigrationConfiguration($input, $output);
|
||||
|
||||
$version = $configuration->generateVersionNumber();
|
||||
$path = $this->generateMigration($configuration, $input, $version);
|
||||
|
||||
$output->writeln(sprintf('Generated new migration class to "<info>%s</info>"', $path));
|
||||
}
|
||||
|
||||
protected function getTemplate()
|
||||
{
|
||||
return self::$_template;
|
||||
}
|
||||
|
||||
protected function generateMigration(Configuration $configuration, InputInterface $input, $version, $up = null, $down = null)
|
||||
{
|
||||
$placeHolders = [
|
||||
'<namespace>',
|
||||
'<version>',
|
||||
'<up>',
|
||||
'<down>',
|
||||
];
|
||||
$replacements = [
|
||||
$configuration->getMigrationsNamespace(),
|
||||
$version,
|
||||
$up ? " " . implode("\n ", explode("\n", $up)) : null,
|
||||
$down ? " " . implode("\n ", explode("\n", $down)) : null
|
||||
];
|
||||
$code = str_replace($placeHolders, $replacements, $this->getTemplate());
|
||||
$code = preg_replace('/^ +$/m', '', $code);
|
||||
$migrationDirectoryHelper = new MigrationDirectoryHelper($configuration);
|
||||
$dir = $migrationDirectoryHelper->getMigrationDirectory();
|
||||
$path = $dir . '/Version' . $version . '.php';
|
||||
|
||||
file_put_contents($path, $code);
|
||||
|
||||
if ($editorCmd = $input->getOption('editor-cmd')) {
|
||||
proc_open($editorCmd . ' ' . escapeshellarg($path), [], $pipes);
|
||||
}
|
||||
|
||||
return $path;
|
||||
}
|
||||
}
|
||||
48
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/Command/LatestCommand.php
vendored
Normal file
48
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/Command/LatestCommand.php
vendored
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Tools\Console\Command;
|
||||
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
|
||||
/**
|
||||
* Outputs the latest version number.
|
||||
*
|
||||
* @author Kris Wallsmith <kris.wallsmith@gmail.com>
|
||||
*/
|
||||
class LatestCommand extends AbstractCommand
|
||||
{
|
||||
protected function configure()
|
||||
{
|
||||
$this
|
||||
->setName('migrations:latest')
|
||||
->setDescription('Outputs the latest version number')
|
||||
;
|
||||
|
||||
parent::configure();
|
||||
}
|
||||
|
||||
public function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$configuration = $this->getMigrationConfiguration($input, $output);
|
||||
|
||||
$output->writeln($configuration->getLatestVersion());
|
||||
}
|
||||
}
|
||||
204
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/Command/MigrateCommand.php
vendored
Normal file
204
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/Command/MigrateCommand.php
vendored
Normal file
|
|
@ -0,0 +1,204 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Tools\Console\Command;
|
||||
|
||||
use Doctrine\DBAL\Migrations\Configuration\Configuration;
|
||||
use Doctrine\DBAL\Migrations\Migration;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
|
||||
/**
|
||||
* Command for executing a migration to a specified version or the latest available version.
|
||||
*
|
||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||
* @link www.doctrine-project.org
|
||||
* @since 2.0
|
||||
* @author Jonathan Wage <jonwage@gmail.com>
|
||||
*/
|
||||
class MigrateCommand extends AbstractCommand
|
||||
{
|
||||
protected function configure()
|
||||
{
|
||||
$this
|
||||
->setName('migrations:migrate')
|
||||
->setDescription('Execute a migration to a specified version or the latest available version.')
|
||||
->addArgument('version', InputArgument::OPTIONAL, 'The version number (YYYYMMDDHHMMSS) or alias (first, prev, next, latest) to migrate to.', 'latest')
|
||||
->addOption('write-sql', null, InputOption::VALUE_NONE, 'The path to output the migration SQL file instead of executing it.')
|
||||
->addOption('dry-run', null, InputOption::VALUE_NONE, 'Execute the migration as a dry run.')
|
||||
->addOption('query-time', null, InputOption::VALUE_NONE, 'Time all the queries individually.')
|
||||
->addOption('allow-no-migration', null, InputOption::VALUE_NONE, 'Don\'t throw an exception if no migration is available (CI).')
|
||||
->setHelp(<<<EOT
|
||||
The <info>%command.name%</info> command executes a migration to a specified version or the latest available version:
|
||||
|
||||
<info>%command.full_name%</info>
|
||||
|
||||
You can optionally manually specify the version you wish to migrate to:
|
||||
|
||||
<info>%command.full_name% YYYYMMDDHHMMSS</info>
|
||||
|
||||
You can specify the version you wish to migrate to using an alias:
|
||||
|
||||
<info>%command.full_name% prev</info>
|
||||
|
||||
You can also execute the migration as a <comment>--dry-run</comment>:
|
||||
|
||||
<info>%command.full_name% YYYYMMDDHHMMSS --dry-run</info>
|
||||
|
||||
You can output the would be executed SQL statements to a file with <comment>--write-sql</comment>:
|
||||
|
||||
<info>%command.full_name% YYYYMMDDHHMMSS --write-sql</info>
|
||||
|
||||
Or you can also execute the migration without a warning message which you need to interact with:
|
||||
|
||||
<info>%command.full_name% --no-interaction</info>
|
||||
|
||||
You can also time all the different queries if you wanna know which one is taking so long:
|
||||
|
||||
<info>%command.full_name% --query-time</info>
|
||||
EOT
|
||||
);
|
||||
|
||||
parent::configure();
|
||||
}
|
||||
|
||||
public function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$configuration = $this->getMigrationConfiguration($input, $output);
|
||||
$migration = $this->createMigration($configuration);
|
||||
|
||||
$this->outputHeader($configuration, $output);
|
||||
|
||||
$timeAllqueries = $input->getOption('query-time');
|
||||
|
||||
$executedMigrations = $configuration->getMigratedVersions();
|
||||
$availableMigrations = $configuration->getAvailableVersions();
|
||||
|
||||
$version = $this->getVersionNameFromAlias($input->getArgument('version'), $output, $configuration);
|
||||
if ($version === false) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
$executedUnavailableMigrations = array_diff($executedMigrations, $availableMigrations);
|
||||
if (!empty($executedUnavailableMigrations)) {
|
||||
$output->writeln(sprintf(
|
||||
'<error>WARNING! You have %s previously executed migrations'
|
||||
. ' in the database that are not registered migrations.</error>',
|
||||
count($executedUnavailableMigrations)
|
||||
));
|
||||
|
||||
foreach ($executedUnavailableMigrations as $executedUnavailableMigration) {
|
||||
$output->writeln(sprintf(
|
||||
' <comment>>></comment> %s (<comment>%s</comment>)',
|
||||
$configuration->getDateTime($executedUnavailableMigration),
|
||||
$executedUnavailableMigration
|
||||
));
|
||||
}
|
||||
|
||||
$question = 'Are you sure you wish to continue? (y/n)';
|
||||
if (! $this->canExecute($question, $input, $output)) {
|
||||
$output->writeln('<error>Migration cancelled!</error>');
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if ($path = $input->getOption('write-sql')) {
|
||||
$path = is_bool($path) ? getcwd() : $path;
|
||||
$migration->writeSqlFile($path, $version);
|
||||
return 0;
|
||||
}
|
||||
|
||||
$dryRun = (boolean) $input->getOption('dry-run');
|
||||
|
||||
$cancelled = false;
|
||||
$migration->setNoMigrationException($input->getOption('allow-no-migration'));
|
||||
$result = $migration->migrate($version, $dryRun, $timeAllqueries, function () use ($input, $output, &$cancelled) {
|
||||
$question = 'WARNING! You are about to execute a database migration'
|
||||
. ' that could result in schema changes and data lost.'
|
||||
. ' Are you sure you wish to continue? (y/n)';
|
||||
$canContinue = $this->canExecute($question, $input, $output);
|
||||
$cancelled = !$canContinue;
|
||||
|
||||
return $canContinue;
|
||||
});
|
||||
|
||||
if ($cancelled) {
|
||||
$output->writeln('<error>Migration cancelled!</error>');
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new migration instance to execute the migrations.
|
||||
*
|
||||
* @param $configuration The configuration with which the migrations will be executed
|
||||
* @return Migration a new migration instance
|
||||
*/
|
||||
protected function createMigration(Configuration $configuration)
|
||||
{
|
||||
return new Migration($configuration);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $question
|
||||
* @param InputInterface $input
|
||||
* @param OutputInterface $output
|
||||
* @return bool
|
||||
*/
|
||||
private function canExecute($question, InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
if ($input->isInteractive() && ! $this->askConfirmation($question, $input, $output)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $versionAlias
|
||||
* @param OutputInterface $output
|
||||
* @param Configuration $configuration
|
||||
* @return bool|string
|
||||
*/
|
||||
private function getVersionNameFromAlias($versionAlias, OutputInterface $output, Configuration $configuration)
|
||||
{
|
||||
$version = $configuration->resolveVersionAlias($versionAlias);
|
||||
if ($version === null) {
|
||||
if ($versionAlias == 'prev') {
|
||||
$output->writeln('<error>Already at first version.</error>');
|
||||
return false;
|
||||
}
|
||||
if ($versionAlias == 'next') {
|
||||
$output->writeln('<error>Already at latest version.</error>');
|
||||
return false;
|
||||
}
|
||||
|
||||
$output->writeln(sprintf(
|
||||
'<error>Unknown version: %s</error>',
|
||||
$output->getFormatter()->escape($versionAlias)
|
||||
));
|
||||
return false;
|
||||
}
|
||||
|
||||
return $version;
|
||||
}
|
||||
}
|
||||
117
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/Command/StatusCommand.php
vendored
Normal file
117
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/Command/StatusCommand.php
vendored
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Tools\Console\Command;
|
||||
|
||||
use Doctrine\DBAL\Migrations\Configuration\Configuration;
|
||||
use Doctrine\DBAL\Migrations\Tools\Console\Helper\MigrationStatusInfosHelper;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
|
||||
/**
|
||||
* Command to view the status of a set of migrations.
|
||||
*
|
||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||
* @link www.doctrine-project.org
|
||||
* @since 2.0
|
||||
* @author Jonathan Wage <jonwage@gmail.com>
|
||||
*/
|
||||
class StatusCommand extends AbstractCommand
|
||||
{
|
||||
protected function configure()
|
||||
{
|
||||
$this
|
||||
->setName('migrations:status')
|
||||
->setDescription('View the status of a set of migrations.')
|
||||
->addOption('show-versions', null, InputOption::VALUE_NONE, 'This will display a list of all available migrations and their status')
|
||||
->setHelp(<<<EOT
|
||||
The <info>%command.name%</info> command outputs the status of a set of migrations:
|
||||
|
||||
<info>%command.full_name%</info>
|
||||
|
||||
You can output a list of all available migrations and their status with <comment>--show-versions</comment>:
|
||||
|
||||
<info>%command.full_name% --show-versions</info>
|
||||
EOT
|
||||
);
|
||||
|
||||
parent::configure();
|
||||
}
|
||||
|
||||
public function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$configuration = $this->getMigrationConfiguration($input, $output);
|
||||
|
||||
$infos = new MigrationStatusInfosHelper($configuration);
|
||||
|
||||
$output->writeln("\n <info>==</info> Configuration\n");
|
||||
foreach ($infos->getMigrationsInfos() as $name => $value) {
|
||||
if ($name == 'New Migrations') {
|
||||
$value = $value > 0 ? '<question>' . $value . '</question>' : 0;
|
||||
}
|
||||
if($name == 'Executed Unavailable Migrations') {
|
||||
$value = $value > 0 ? '<error>' . $value . '</error>' : 0;
|
||||
}
|
||||
$this->writeStatusInfosLineAligned($output, $name, $value);
|
||||
}
|
||||
|
||||
if ($input->getOption('show-versions')) {
|
||||
if ($migrations = $configuration->getMigrations()) {
|
||||
$output->writeln("\n <info>==</info> Available Migration Versions\n");
|
||||
|
||||
$this->showVersions($migrations, $configuration, $output);
|
||||
}
|
||||
|
||||
if (count($infos->getExecutedUnavailableMigrations())) {
|
||||
$output->writeln("\n <info>==</info> Previously Executed Unavailable Migration Versions\n");
|
||||
foreach ($infos->getExecutedUnavailableMigrations() as $executedUnavailableMigration) {
|
||||
$output->writeln(' <comment>>></comment> ' . $configuration->getDateTime($executedUnavailableMigration) .
|
||||
' (<comment>' . $executedUnavailableMigration . '</comment>)');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function writeStatusInfosLineAligned(OutputInterface $output, $title, $value)
|
||||
{
|
||||
$output->writeln(' <comment>>></comment> ' . $title . ': ' . str_repeat(' ', 50 - strlen($title)) . $value);
|
||||
}
|
||||
|
||||
private function showVersions($migrations, Configuration $configuration, OutputInterface $output)
|
||||
{
|
||||
$migratedVersions = $configuration->getMigratedVersions();
|
||||
|
||||
foreach($migrations as $version) {
|
||||
$isMigrated = in_array($version->getVersion(), $migratedVersions);
|
||||
$status = $isMigrated ? '<info>migrated</info>' : '<error>not migrated</error>';
|
||||
|
||||
$migrationDescription = $version->getMigration()->getDescription()
|
||||
? str_repeat(' ', 5) . $version->getMigration()->getDescription()
|
||||
: '';
|
||||
|
||||
$formattedVersion = $configuration->getDateTime($version->getVersion());
|
||||
|
||||
$output->writeln(' <comment>>></comment> ' . $formattedVersion .
|
||||
' (<comment>' . $version->getVersion() . '</comment>)' .
|
||||
str_repeat(' ', 49 - strlen($formattedVersion) - strlen($version->getVersion())) .
|
||||
$status . $migrationDescription);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
<?php
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Tools\Console\Command;
|
||||
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
|
||||
/**
|
||||
* Command to show if your schema is up-to-date.
|
||||
*/
|
||||
class UpToDateCommand extends AbstractCommand
|
||||
{
|
||||
protected function configure()
|
||||
{
|
||||
$this
|
||||
->setName('migrations:up-to-date')
|
||||
->setDescription('Tells you if your schema is up-to-date.')
|
||||
->setHelp(<<<EOT
|
||||
The <info>%command.name%</info> command tells you if your schema is up-to-date:
|
||||
|
||||
<info>%command.full_name%</info>
|
||||
EOT
|
||||
);
|
||||
|
||||
parent::configure();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param InputInterface $input
|
||||
* @param OutputInterface $output
|
||||
* @return int|null
|
||||
*/
|
||||
public function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$configuration = $this->getMigrationConfiguration($input, $output);
|
||||
|
||||
$migrations = count($configuration->getMigrations());
|
||||
$migratedVersions = count($configuration->getMigratedVersions());
|
||||
$availableMigrations = $migrations - $migratedVersions;
|
||||
|
||||
if ($availableMigrations === 0) {
|
||||
$output->writeln('<comment>Up-to-date! No migrations to execute.</comment>');
|
||||
return 0;
|
||||
}
|
||||
|
||||
$output->writeln(sprintf(
|
||||
'<comment>Out-of-date! %u migration%s available to execute.</comment>',
|
||||
$availableMigrations,
|
||||
$availableMigrations > 1 ? 's are' : ' is'
|
||||
));
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
179
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/Command/VersionCommand.php
vendored
Normal file
179
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/Command/VersionCommand.php
vendored
Normal file
|
|
@ -0,0 +1,179 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Tools\Console\Command;
|
||||
|
||||
use Doctrine\DBAL\Migrations\MigrationException;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
|
||||
/**
|
||||
* Command for manually adding and deleting migration versions from the version table.
|
||||
*
|
||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||
* @link www.doctrine-project.org
|
||||
* @since 2.0
|
||||
* @author Jonathan Wage <jonwage@gmail.com>
|
||||
*/
|
||||
class VersionCommand extends AbstractCommand
|
||||
{
|
||||
/**
|
||||
* The Migrations Configuration instance
|
||||
*
|
||||
* @var \Doctrine\DBAL\Migrations\Configuration\Configuration
|
||||
*/
|
||||
private $configuration;
|
||||
|
||||
/**
|
||||
* Whether or not the versions have to be marked as migrated or not
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
private $markMigrated;
|
||||
|
||||
protected function configure()
|
||||
{
|
||||
$this
|
||||
->setName('migrations:version')
|
||||
->setDescription('Manually add and delete migration versions from the version table.')
|
||||
->addArgument('version', InputArgument::OPTIONAL, 'The version to add or delete.', null)
|
||||
->addOption('add', null, InputOption::VALUE_NONE, 'Add the specified version.')
|
||||
->addOption('delete', null, InputOption::VALUE_NONE, 'Delete the specified version.')
|
||||
->addOption('all', null, InputOption::VALUE_NONE, 'Apply to all the versions.')
|
||||
->addOption('range-from', null, InputOption::VALUE_OPTIONAL, 'Apply from specified version.')
|
||||
->addOption('range-to', null, InputOption::VALUE_OPTIONAL, 'Apply to specified version.')
|
||||
->setHelp(<<<EOT
|
||||
The <info>%command.name%</info> command allows you to manually add, delete or synchronize migration versions from the version table:
|
||||
|
||||
<info>%command.full_name% YYYYMMDDHHMMSS --add</info>
|
||||
|
||||
If you want to delete a version you can use the <comment>--delete</comment> option:
|
||||
|
||||
<info>%command.full_name% YYYYMMDDHHMMSS --delete</info>
|
||||
|
||||
If you want to synchronize by adding or deleting all migration versions available in the version table you can use the <comment>--all</comment> option:
|
||||
|
||||
<info>%command.full_name% --add --all</info>
|
||||
<info>%command.full_name% --delete --all</info>
|
||||
|
||||
If you want to synchronize by adding or deleting some range of migration versions available in the version table you can use the <comment>--range-from/--range-to</comment> option:
|
||||
|
||||
<info>%command.full_name% --add --range-from=YYYYMMDDHHMMSS --range-to=YYYYMMDDHHMMSS</info>
|
||||
<info>%command.full_name% --delete --range-from=YYYYMMDDHHMMSS --range-to=YYYYMMDDHHMMSS</info>
|
||||
|
||||
You can also execute this command without a warning message which you need to interact with:
|
||||
|
||||
<info>%command.full_name% --no-interaction</info>
|
||||
EOT
|
||||
);
|
||||
|
||||
parent::configure();
|
||||
}
|
||||
|
||||
public function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$this->configuration = $this->getMigrationConfiguration($input, $output);
|
||||
|
||||
if ( ! $input->getOption('add') && ! $input->getOption('delete')) {
|
||||
throw new \InvalidArgumentException('You must specify whether you want to --add or --delete the specified version.');
|
||||
}
|
||||
|
||||
$this->markMigrated = (boolean) $input->getOption('add');
|
||||
|
||||
if ($input->isInteractive()) {
|
||||
$question = 'WARNING! You are about to add, delete or synchronize migration versions from the version table that could result in data lost. Are you sure you wish to continue? (y/n)';
|
||||
|
||||
$confirmation = $this->askConfirmation($question, $input, $output);
|
||||
|
||||
if ($confirmation) {
|
||||
$this->markVersions($input);
|
||||
} else {
|
||||
$output->writeln('<error>Migration cancelled!</error>');
|
||||
}
|
||||
} else {
|
||||
$this->markVersions($input);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private function markVersions(InputInterface $input)
|
||||
{
|
||||
$affectedVersion = $input->getArgument('version');
|
||||
|
||||
$allOption = $input->getOption('all');
|
||||
$rangeFromOption = $input->getOption('range-from');
|
||||
$rangeToOption = $input->getOption('range-to');
|
||||
|
||||
if ($allOption && ($rangeFromOption !== null || $rangeToOption !== null)) {
|
||||
throw new \InvalidArgumentException('Options --all and --range-to/--range-from both used. You should use only one of them.');
|
||||
}
|
||||
|
||||
if ($rangeFromOption !== null ^ $rangeToOption !== null) {
|
||||
throw new \InvalidArgumentException('Options --range-to and --range-from should be used together.');
|
||||
}
|
||||
|
||||
if ($allOption === true) {
|
||||
$availableVersions = $this->configuration->getAvailableVersions();
|
||||
foreach ($availableVersions as $version) {
|
||||
$this->mark($version, true);
|
||||
}
|
||||
} elseif ($rangeFromOption !== null && $rangeToOption !== null) {
|
||||
$availableVersions = $this->configuration->getAvailableVersions();
|
||||
foreach ($availableVersions as $version) {
|
||||
if ($version >= $rangeFromOption && $version <= $rangeToOption) {
|
||||
$this->mark($version, true);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$this->mark($affectedVersion);
|
||||
}
|
||||
}
|
||||
|
||||
private function mark($version, $all = false)
|
||||
{
|
||||
if ( ! $this->configuration->hasVersion($version)) {
|
||||
throw MigrationException::unknownMigrationVersion($version);
|
||||
}
|
||||
|
||||
$version = $this->configuration->getVersion($version);
|
||||
if ($this->markMigrated && $this->configuration->hasVersionMigrated($version)) {
|
||||
if (! $all) {
|
||||
throw new \InvalidArgumentException(sprintf('The version "%s" already exists in the version table.', $version));
|
||||
}
|
||||
$marked = true;
|
||||
}
|
||||
|
||||
if ( ! $this->markMigrated && ! $this->configuration->hasVersionMigrated($version)) {
|
||||
if (! $all) {
|
||||
throw new \InvalidArgumentException(sprintf('The version "%s" does not exists in the version table.', $version));
|
||||
}
|
||||
$marked = false;
|
||||
}
|
||||
|
||||
if ( ! isset($marked)) {
|
||||
if ($this->markMigrated) {
|
||||
$version->markMigrated();
|
||||
} else {
|
||||
$version->markNotMigrated();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
86
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/ConsoleRunner.php
vendored
Normal file
86
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/ConsoleRunner.php
vendored
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the MIT license. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Tools\Console;
|
||||
|
||||
use Doctrine\DBAL\Migrations\MigrationsVersion;
|
||||
use Symfony\Component\Console\Application;
|
||||
use Symfony\Component\Console\Helper\HelperSet;
|
||||
|
||||
/**
|
||||
* Handles running the Console Tools inside Symfony Console context.
|
||||
*/
|
||||
class ConsoleRunner
|
||||
{
|
||||
/**
|
||||
* Runs console with the given helperset.
|
||||
*
|
||||
* @param \Symfony\Component\Console\Helper\HelperSet $helperSet
|
||||
* @param \Symfony\Component\Console\Command\Command[] $commands
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function run(HelperSet $helperSet, $commands = [])
|
||||
{
|
||||
$cli = self::createApplication($helperSet, $commands);
|
||||
$cli->run();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a console application with the given helperset and
|
||||
* optional commands.
|
||||
*
|
||||
* @param \Symfony\Component\Console\Helper\HelperSet $helperSet
|
||||
* @param array $commands
|
||||
*
|
||||
* @return \Symfony\Component\Console\Application
|
||||
*/
|
||||
public static function createApplication(HelperSet $helperSet, $commands = [])
|
||||
{
|
||||
$cli = new Application('Doctrine Migrations', MigrationsVersion::VERSION());
|
||||
$cli->setCatchExceptions(true);
|
||||
$cli->setHelperSet($helperSet);
|
||||
self::addCommands($cli);
|
||||
$cli->addCommands($commands);
|
||||
|
||||
return $cli;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Application $cli
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function addCommands(Application $cli)
|
||||
{
|
||||
$cli->addCommands([
|
||||
new Command\ExecuteCommand(),
|
||||
new Command\GenerateCommand(),
|
||||
new Command\LatestCommand(),
|
||||
new Command\MigrateCommand(),
|
||||
new Command\StatusCommand(),
|
||||
new Command\VersionCommand(),
|
||||
new Command\UpToDateCommand(),
|
||||
]);
|
||||
|
||||
if ($cli->getHelperSet()->has('em')) {
|
||||
$cli->add(new Command\DiffCommand());
|
||||
}
|
||||
}
|
||||
}
|
||||
134
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/Helper/ConfigurationHelper.php
vendored
Normal file
134
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Tools/Console/Helper/ConfigurationHelper.php
vendored
Normal file
|
|
@ -0,0 +1,134 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Tools\Console\Helper;
|
||||
|
||||
use Doctrine\DBAL\Connection;
|
||||
use Doctrine\DBAL\Migrations\Configuration\ArrayConfiguration;
|
||||
use Doctrine\DBAL\Migrations\Configuration\Configuration;
|
||||
use Doctrine\DBAL\Migrations\Configuration\JsonConfiguration;
|
||||
use Doctrine\DBAL\Migrations\Configuration\XmlConfiguration;
|
||||
use Doctrine\DBAL\Migrations\Configuration\YamlConfiguration;
|
||||
use Doctrine\DBAL\Migrations\OutputWriter;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Helper\Helper;
|
||||
|
||||
/**
|
||||
* Class ConfigurationHelper
|
||||
* @package Doctrine\DBAL\Migrations\Tools\Console\Helper
|
||||
* @internal
|
||||
*/
|
||||
class ConfigurationHelper extends Helper
|
||||
{
|
||||
|
||||
/**
|
||||
* @var Connection
|
||||
*/
|
||||
private $connection;
|
||||
|
||||
/**
|
||||
* @var Configuration
|
||||
*/
|
||||
private $configuration;
|
||||
|
||||
public function __construct(Connection $connection = null, Configuration $configuration = null)
|
||||
{
|
||||
$this->connection = $connection;
|
||||
$this->configuration = $configuration;
|
||||
}
|
||||
|
||||
public function getMigrationConfig(InputInterface $input, OutputWriter $outputWriter)
|
||||
{
|
||||
/**
|
||||
* If a configuration option is passed to the command line, use that configuration
|
||||
* instead of any other one.
|
||||
*/
|
||||
if ($input->getOption('configuration')) {
|
||||
$outputWriter->write("Loading configuration from command option: " . $input->getOption('configuration'));
|
||||
|
||||
return $this->loadConfig($input->getOption('configuration'), $outputWriter);
|
||||
}
|
||||
|
||||
/**
|
||||
* If a configuration has already been set using DI or a Setter use it.
|
||||
*/
|
||||
if ($this->configuration) {
|
||||
$outputWriter->write("Loading configuration from the integration code of your framework (setter).");
|
||||
|
||||
return $this->configuration;
|
||||
}
|
||||
|
||||
/**
|
||||
* If no any other config has been found, look for default config file in the path.
|
||||
*/
|
||||
$defaultConfig = [
|
||||
'migrations.xml',
|
||||
'migrations.yml',
|
||||
'migrations.yaml',
|
||||
'migrations.json',
|
||||
'migrations.php',
|
||||
];
|
||||
foreach ($defaultConfig as $config) {
|
||||
if ($this->configExists($config)) {
|
||||
$outputWriter->write("Loading configuration from file: $config");
|
||||
|
||||
return $this->loadConfig($config, $outputWriter);
|
||||
}
|
||||
}
|
||||
|
||||
return new Configuration($this->connection, $outputWriter);
|
||||
}
|
||||
|
||||
|
||||
private function configExists($config)
|
||||
{
|
||||
return file_exists($config);
|
||||
}
|
||||
|
||||
private function loadConfig($config, OutputWriter $outputWriter)
|
||||
{
|
||||
$map = [
|
||||
'xml' => XmlConfiguration::class,
|
||||
'yaml' => YamlConfiguration::class,
|
||||
'yml' => YamlConfiguration::class,
|
||||
'php' => ArrayConfiguration::class,
|
||||
'json' => JsonConfiguration::class,
|
||||
];
|
||||
|
||||
$info = pathinfo($config);
|
||||
// check we can support this file type
|
||||
if (empty($map[$info['extension']])) {
|
||||
throw new \InvalidArgumentException('Given config file type is not supported');
|
||||
}
|
||||
|
||||
$class = $map[$info['extension']];
|
||||
$configuration = new $class($this->connection, $outputWriter);
|
||||
$configuration->load($config);
|
||||
|
||||
return $configuration;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'configuration';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,90 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Tools\Console\Helper;
|
||||
|
||||
use Doctrine\DBAL\Migrations\Configuration\Configuration;
|
||||
use Symfony\Component\Console\Helper\Helper;
|
||||
|
||||
/**
|
||||
* Class ConfigurationHelper
|
||||
* @package Doctrine\DBAL\Migrations\Tools\Console\Helper
|
||||
* @internal
|
||||
*/
|
||||
class MigrationDirectoryHelper extends Helper
|
||||
{
|
||||
|
||||
/**
|
||||
* @var Configuration
|
||||
*/
|
||||
private $configuration;
|
||||
|
||||
public function __construct(Configuration $configuration = null)
|
||||
{
|
||||
$this->configuration = $configuration;
|
||||
}
|
||||
|
||||
public function getMigrationDirectory()
|
||||
{
|
||||
$dir = $this->configuration->getMigrationsDirectory();
|
||||
$dir = $dir ? $dir : getcwd();
|
||||
$dir = rtrim($dir, '/');
|
||||
|
||||
if (!file_exists($dir)) {
|
||||
throw new \InvalidArgumentException(sprintf('Migrations directory "%s" does not exist.', $dir));
|
||||
}
|
||||
|
||||
if ($this->configuration->areMigrationsOrganizedByYear()) {
|
||||
$dir .= $this->appendDir(date('Y'));
|
||||
}
|
||||
|
||||
if ($this->configuration->areMigrationsOrganizedByYearAndMonth()) {
|
||||
$dir .= $this->appendDir(date('m'));
|
||||
}
|
||||
$this->createDirIfNotExists($dir);
|
||||
|
||||
return $dir;
|
||||
}
|
||||
|
||||
private function appendDir($dir)
|
||||
{
|
||||
return DIRECTORY_SEPARATOR . $dir;
|
||||
}
|
||||
|
||||
private function createDirIfNotExists($dir)
|
||||
{
|
||||
if (!file_exists($dir)) {
|
||||
mkdir($dir, 0755, true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the canonical name of this helper.
|
||||
*
|
||||
* @return string The canonical name
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'MigrationDirectory';
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
<?php
|
||||
|
||||
namespace Doctrine\DBAL\Migrations\Tools\Console\Helper;
|
||||
|
||||
|
||||
use Doctrine\DBAL\Migrations\Configuration\AbstractFileConfiguration;
|
||||
use Doctrine\DBAL\Migrations\Configuration\Configuration;
|
||||
use Doctrine\DBAL\Migrations\Version;
|
||||
|
||||
class MigrationStatusInfosHelper
|
||||
{
|
||||
/** @var Version[] */
|
||||
private $executedMigrations;
|
||||
|
||||
/** @var Version[] */
|
||||
private $availableMigrations;
|
||||
|
||||
/** @var Version[] */
|
||||
private $executedUnavailableMigrations;
|
||||
|
||||
/** @var Configuration */
|
||||
private $configuration;
|
||||
|
||||
public function __construct(Configuration $configuration)
|
||||
{
|
||||
$this->configuration = $configuration;
|
||||
$this->executedMigrations = $this->configuration->getMigratedVersions();
|
||||
$this->availableMigrations = $this->configuration->getAvailableVersions();
|
||||
$this->executedUnavailableMigrations = array_diff($this->executedMigrations, $this->availableMigrations);
|
||||
}
|
||||
|
||||
public function getMigrationsInfos()
|
||||
{
|
||||
$numExecutedUnavailableMigrations = count($this->executedUnavailableMigrations);
|
||||
$numNewMigrations = count(array_diff($this->availableMigrations, $this->executedMigrations));
|
||||
|
||||
$infos = [
|
||||
'Name' => $this->configuration->getName() ? $this->configuration->getName() : 'Doctrine Database Migrations',
|
||||
'Database Driver' => $this->configuration->getConnection()->getDriver()->getName(),
|
||||
'Database Name' => $this->configuration->getConnection()->getDatabase(),
|
||||
'Configuration Source' => $this->configuration instanceof AbstractFileConfiguration ? $this->configuration->getFile() : 'manually configured',
|
||||
'Version Table Name' => $this->configuration->getMigrationsTableName(),
|
||||
'Version Column Name' => $this->configuration->getMigrationsColumnName(),
|
||||
'Migrations Namespace' => $this->configuration->getMigrationsNamespace(),
|
||||
'Migrations Directory' => $this->configuration->getMigrationsDirectory(),
|
||||
'Previous Version' => $this->getFormattedVersionAlias('prev'),
|
||||
'Current Version' => $this->getFormattedVersionAlias('current'),
|
||||
'Next Version' => $this->getFormattedVersionAlias('next'),
|
||||
'Latest Version' => $this->getFormattedVersionAlias('latest'),
|
||||
'Executed Migrations' => count($this->executedMigrations),
|
||||
'Executed Unavailable Migrations' => $numExecutedUnavailableMigrations,
|
||||
'Available Migrations' => count($this->availableMigrations),
|
||||
'New Migrations' => $numNewMigrations,
|
||||
];
|
||||
|
||||
return $infos;
|
||||
}
|
||||
|
||||
private function getFormattedVersionAlias($alias)
|
||||
{
|
||||
$version = $this->configuration->resolveVersionAlias($alias);
|
||||
//No version found
|
||||
if ($version === null) {
|
||||
if ($alias === 'next') {
|
||||
return 'Already at latest version';
|
||||
}
|
||||
|
||||
if ($alias === 'prev') {
|
||||
return 'Already at first version';
|
||||
}
|
||||
}
|
||||
//Before first version "virtual" version number
|
||||
if ($version === '0') {
|
||||
return '<comment>0</comment>';
|
||||
}
|
||||
|
||||
//Show normal version number
|
||||
return $this->configuration->getDateTime($version) . ' (<comment>' . $version . '</comment>)';
|
||||
}
|
||||
|
||||
/** @var Version[] */
|
||||
public function getExecutedUnavailableMigrations()
|
||||
{
|
||||
return $this->executedUnavailableMigrations;
|
||||
}
|
||||
}
|
||||
473
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Version.php
vendored
Normal file
473
vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Version.php
vendored
Normal file
|
|
@ -0,0 +1,473 @@
|
|||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\DBAL\Migrations;
|
||||
|
||||
use Doctrine\DBAL\Types\Type;
|
||||
use Doctrine\DBAL\Migrations\Configuration\Configuration;
|
||||
use Doctrine\DBAL\Migrations\Provider\LazySchemaDiffProvider;
|
||||
use Doctrine\DBAL\Migrations\Provider\SchemaDiffProvider;
|
||||
use Doctrine\DBAL\Migrations\Provider\SchemaDiffProviderInterface;
|
||||
|
||||
/**
|
||||
* Class which wraps a migration version and allows execution of the
|
||||
* individual migration version up or down method.
|
||||
*
|
||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||
* @link www.doctrine-project.org
|
||||
* @since 2.0
|
||||
* @author Jonathan H. Wage <jonwage@gmail.com>
|
||||
*/
|
||||
class Version
|
||||
{
|
||||
const STATE_NONE = 0;
|
||||
const STATE_PRE = 1;
|
||||
const STATE_EXEC = 2;
|
||||
const STATE_POST = 3;
|
||||
|
||||
const DIRECTION_UP = 'up';
|
||||
const DIRECTION_DOWN = 'down';
|
||||
|
||||
/**
|
||||
* The Migrations Configuration instance for this migration
|
||||
*
|
||||
* @var Configuration
|
||||
*/
|
||||
private $configuration;
|
||||
|
||||
/**
|
||||
* The OutputWriter object instance used for outputting information
|
||||
*
|
||||
* @var OutputWriter
|
||||
*/
|
||||
private $outputWriter;
|
||||
|
||||
/**
|
||||
* The version in timestamp format (YYYYMMDDHHMMSS)
|
||||
*
|
||||
* @param int
|
||||
*/
|
||||
private $version;
|
||||
|
||||
/**
|
||||
* The migration instance for this version
|
||||
*
|
||||
* @var AbstractMigration
|
||||
*/
|
||||
private $migration;
|
||||
|
||||
/**
|
||||
* @var \Doctrine\DBAL\Connection
|
||||
*/
|
||||
private $connection;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $class;
|
||||
|
||||
/** The array of collected SQL statements for this version */
|
||||
private $sql = [];
|
||||
|
||||
/** The array of collected parameters for SQL statements for this version */
|
||||
private $params = [];
|
||||
|
||||
/** The array of collected types for SQL statements for this version */
|
||||
private $types = [];
|
||||
|
||||
/** The time in seconds that this migration version took to execute */
|
||||
private $time;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $state = self::STATE_NONE;
|
||||
|
||||
/** @var SchemaDiffProviderInterface */
|
||||
private $schemaProvider;
|
||||
|
||||
public function __construct(Configuration $configuration, $version, $class, SchemaDiffProviderInterface $schemaProvider=null)
|
||||
{
|
||||
$this->configuration = $configuration;
|
||||
$this->outputWriter = $configuration->getOutputWriter();
|
||||
$this->class = $class;
|
||||
$this->connection = $configuration->getConnection();
|
||||
$this->migration = new $class($this);
|
||||
$this->version = $version;
|
||||
|
||||
if ($schemaProvider !== null) {
|
||||
$this->schemaProvider = $schemaProvider;
|
||||
}
|
||||
if($schemaProvider === null) {
|
||||
$schemaProvider = new SchemaDiffProvider($this->connection->getSchemaManager(),
|
||||
$this->connection->getDatabasePlatform());
|
||||
$this->schemaProvider = LazySchemaDiffProvider::fromDefaultProxyFacyoryConfiguration($schemaProvider);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the string version in the format YYYYMMDDHHMMSS
|
||||
*
|
||||
* @return string $version
|
||||
*/
|
||||
public function getVersion()
|
||||
{
|
||||
return $this->version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Migrations Configuration object instance
|
||||
*
|
||||
* @return Configuration $configuration
|
||||
*/
|
||||
public function getConfiguration()
|
||||
{
|
||||
return $this->configuration;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if this version has been migrated or not.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isMigrated()
|
||||
{
|
||||
return $this->configuration->hasVersionMigrated($this);
|
||||
}
|
||||
|
||||
public function markMigrated()
|
||||
{
|
||||
$this->markVersion('up');
|
||||
}
|
||||
|
||||
private function markVersion($direction)
|
||||
{
|
||||
$action = $direction === 'up' ? 'insert' : 'delete';
|
||||
|
||||
$this->configuration->createMigrationTable();
|
||||
$this->connection->$action(
|
||||
$this->configuration->getMigrationsTableName(),
|
||||
[$this->configuration->getMigrationsColumnName() => $this->version]
|
||||
);
|
||||
}
|
||||
|
||||
public function markNotMigrated()
|
||||
{
|
||||
$this->markVersion('down');
|
||||
}
|
||||
|
||||
/**
|
||||
* Add some SQL queries to this versions migration
|
||||
*
|
||||
* @param array|string $sql
|
||||
* @param array $params
|
||||
* @param array $types
|
||||
*/
|
||||
public function addSql($sql, array $params = [], array $types = [])
|
||||
{
|
||||
if (is_array($sql)) {
|
||||
foreach ($sql as $key => $query) {
|
||||
$this->sql[] = $query;
|
||||
if (!empty($params[$key])) {
|
||||
$queryTypes = isset($types[$key]) ? $types[$key] : [];
|
||||
$this->addQueryParams($params[$key], $queryTypes);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$this->sql[] = $sql;
|
||||
if (!empty($params)) {
|
||||
$this->addQueryParams($params, $types);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed[] $params Array of prepared statement parameters
|
||||
* @param string[] $types Array of the types of each statement parameters
|
||||
*/
|
||||
private function addQueryParams($params, $types)
|
||||
{
|
||||
$index = count($this->sql) - 1;
|
||||
$this->params[$index] = $params;
|
||||
$this->types[$index] = $types;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a migration SQL file to the given path
|
||||
*
|
||||
* @param string $path The path to write the migration SQL file.
|
||||
* @param string $direction The direction to execute.
|
||||
*
|
||||
* @return boolean $written
|
||||
*/
|
||||
public function writeSqlFile($path, $direction = self::DIRECTION_UP)
|
||||
{
|
||||
$queries = $this->execute($direction, true);
|
||||
|
||||
if ( ! empty($this->params)) {
|
||||
throw MigrationException::migrationNotConvertibleToSql($this->class);
|
||||
}
|
||||
|
||||
$this->outputWriter->write("\n-- Version " . $this->version . "\n");
|
||||
|
||||
$sqlQueries = [$this->version => $queries];
|
||||
$sqlWriter = new SqlFileWriter(
|
||||
$this->configuration->getMigrationsColumnName(),
|
||||
$this->configuration->getMigrationsTableName(),
|
||||
$path,
|
||||
$this->outputWriter
|
||||
);
|
||||
|
||||
return $sqlWriter->write($sqlQueries, $direction);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return AbstractMigration
|
||||
*/
|
||||
public function getMigration()
|
||||
{
|
||||
return $this->migration;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute this migration version up or down and and return the SQL.
|
||||
* We are only allowing the addSql call and the schema modification to take effect in the up and down call.
|
||||
* This is necessary to ensure that the migration is revertable.
|
||||
* The schema is passed to the pre and post method only to be able to test the presence of some table, And the
|
||||
* connection that can get used trough it allow for the test of the presence of records.
|
||||
*
|
||||
* @param string $direction The direction to execute the migration.
|
||||
* @param boolean $dryRun Whether to not actually execute the migration SQL and just do a dry run.
|
||||
* @param boolean $timeAllQueries Measuring or not the execution time of each SQL query.
|
||||
*
|
||||
* @return array $sql
|
||||
*
|
||||
* @throws \Exception when migration fails
|
||||
*/
|
||||
public function execute($direction, $dryRun = false, $timeAllQueries = false)
|
||||
{
|
||||
$this->sql = [];
|
||||
|
||||
$transaction = $this->migration->isTransactional();
|
||||
if ($transaction) {
|
||||
//only start transaction if in transactional mode
|
||||
$this->connection->beginTransaction();
|
||||
}
|
||||
|
||||
try {
|
||||
$migrationStart = microtime(true);
|
||||
|
||||
$this->state = self::STATE_PRE;
|
||||
$fromSchema = $this->schemaProvider->createFromSchema();
|
||||
|
||||
$this->migration->{'pre' . ucfirst($direction)}($fromSchema);
|
||||
|
||||
if ($direction === self::DIRECTION_UP) {
|
||||
$this->outputWriter->write("\n" . sprintf(' <info>++</info> migrating <comment>%s</comment>', $this->version) . "\n");
|
||||
} else {
|
||||
$this->outputWriter->write("\n" . sprintf(' <info>--</info> reverting <comment>%s</comment>', $this->version) . "\n");
|
||||
}
|
||||
|
||||
$this->state = self::STATE_EXEC;
|
||||
|
||||
$toSchema = $this->schemaProvider->createToSchema($fromSchema);
|
||||
$this->migration->$direction($toSchema);
|
||||
|
||||
$this->addSql($this->schemaProvider->getSqlDiffToMigrate($fromSchema, $toSchema));
|
||||
|
||||
$this->executeRegisteredSql($dryRun, $timeAllQueries);
|
||||
|
||||
$this->state = self::STATE_POST;
|
||||
$this->migration->{'post' . ucfirst($direction)}($toSchema);
|
||||
|
||||
if (! $dryRun) {
|
||||
if ($direction === self::DIRECTION_UP) {
|
||||
$this->markMigrated();
|
||||
} else {
|
||||
$this->markNotMigrated();
|
||||
}
|
||||
}
|
||||
|
||||
$migrationEnd = microtime(true);
|
||||
$this->time = round($migrationEnd - $migrationStart, 2);
|
||||
if ($direction === self::DIRECTION_UP) {
|
||||
$this->outputWriter->write(sprintf("\n <info>++</info> migrated (%ss)", $this->time));
|
||||
} else {
|
||||
$this->outputWriter->write(sprintf("\n <info>--</info> reverted (%ss)", $this->time));
|
||||
}
|
||||
|
||||
if ($transaction) {
|
||||
//commit only if running in transactional mode
|
||||
$this->connection->commit();
|
||||
}
|
||||
|
||||
$this->state = self::STATE_NONE;
|
||||
|
||||
return $this->sql;
|
||||
} catch (SkipMigrationException $e) {
|
||||
if ($transaction) {
|
||||
//only rollback transaction if in transactional mode
|
||||
$this->connection->rollBack();
|
||||
}
|
||||
|
||||
if ($dryRun === false) {
|
||||
// now mark it as migrated
|
||||
if ($direction === self::DIRECTION_UP) {
|
||||
$this->markMigrated();
|
||||
} else {
|
||||
$this->markNotMigrated();
|
||||
}
|
||||
}
|
||||
|
||||
$this->outputWriter->write(sprintf("\n <info>SS</info> skipped (Reason: %s)", $e->getMessage()));
|
||||
|
||||
$this->state = self::STATE_NONE;
|
||||
|
||||
return [];
|
||||
} catch (\Exception $e) {
|
||||
|
||||
$this->outputWriter->write(sprintf(
|
||||
'<error>Migration %s failed during %s. Error %s</error>',
|
||||
$this->version, $this->getExecutionState(), $e->getMessage()
|
||||
));
|
||||
|
||||
if ($transaction) {
|
||||
//only rollback transaction if in transactional mode
|
||||
$this->connection->rollBack();
|
||||
}
|
||||
|
||||
$this->state = self::STATE_NONE;
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
public function getExecutionState()
|
||||
{
|
||||
switch ($this->state) {
|
||||
case self::STATE_PRE:
|
||||
return 'Pre-Checks';
|
||||
case self::STATE_POST:
|
||||
return 'Post-Checks';
|
||||
case self::STATE_EXEC:
|
||||
return 'Execution';
|
||||
default:
|
||||
return 'No State';
|
||||
}
|
||||
}
|
||||
|
||||
private function outputQueryTime($queryStart, $timeAllQueries = false)
|
||||
{
|
||||
if ($timeAllQueries !== false) {
|
||||
$queryEnd = microtime(true);
|
||||
$queryTime = round($queryEnd - $queryStart, 4);
|
||||
|
||||
$this->outputWriter->write(sprintf(" <info>%ss</info>", $queryTime));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the time this migration version took to execute
|
||||
*
|
||||
* @return integer $time The time this migration version took to execute
|
||||
*/
|
||||
public function getTime()
|
||||
{
|
||||
return $this->time;
|
||||
}
|
||||
|
||||
public function __toString()
|
||||
{
|
||||
return $this->version;
|
||||
}
|
||||
|
||||
private function executeRegisteredSql($dryRun = false, $timeAllQueries = false)
|
||||
{
|
||||
if (! $dryRun) {
|
||||
if (!empty($this->sql)) {
|
||||
foreach ($this->sql as $key => $query) {
|
||||
$queryStart = microtime(true);
|
||||
|
||||
if ( ! isset($this->params[$key])) {
|
||||
$this->outputWriter->write(' <comment>-></comment> ' . $query);
|
||||
$this->connection->executeQuery($query);
|
||||
} else {
|
||||
$this->outputWriter->write(sprintf(' <comment>-</comment> %s (with parameters)', $query));
|
||||
$this->connection->executeQuery($query, $this->params[$key], $this->types[$key]);
|
||||
}
|
||||
|
||||
$this->outputQueryTime($queryStart, $timeAllQueries);
|
||||
}
|
||||
} else {
|
||||
$this->outputWriter->write(sprintf(
|
||||
'<error>Migration %s was executed but did not result in any SQL statements.</error>',
|
||||
$this->version
|
||||
));
|
||||
}
|
||||
} else {
|
||||
foreach ($this->sql as $idx => $query) {
|
||||
$this->outputSqlQuery($idx, $query);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Outputs a SQL query via the `OutputWriter`.
|
||||
*
|
||||
* @param int $idx The SQL query index. Used to look up params.
|
||||
* @param string $query the query to output
|
||||
* @return void
|
||||
*/
|
||||
private function outputSqlQuery($idx, $query)
|
||||
{
|
||||
$params = $this->formatParamsForOutput(
|
||||
isset($this->params[$idx]) ? $this->params[$idx] : [],
|
||||
isset($this->types[$idx]) ? $this->types[$idx] : []
|
||||
);
|
||||
|
||||
$this->outputWriter->write(rtrim(sprintf(
|
||||
' <comment>-></comment> %s %s',
|
||||
$query,
|
||||
$params
|
||||
)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats a set of sql parameters for output with dry run.
|
||||
*
|
||||
* @param $params The query parameters
|
||||
* @param $types The types of the query params. Default type is a string
|
||||
* @return string|null a string of the parameters present.
|
||||
*/
|
||||
private function formatParamsForOutput(array $params, array $types)
|
||||
{
|
||||
if (empty($params)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$platform = $this->connection->getDatabasePlatform();
|
||||
$out = [];
|
||||
foreach ($params as $key => $value) {
|
||||
$type = isset($types[$key]) ? $types[$key] : 'string';
|
||||
$outval = Type::getType($type)->convertToDatabaseValue($value, $platform);
|
||||
$out[] = is_string($key) ? sprintf(':%s => %s', $key, $outval) : $outval;
|
||||
}
|
||||
|
||||
return sprintf('with parameters (%s)', implode(', ', $out));
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue