AbstractOracleDriver.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <?php
  2. /*
  3. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  4. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  5. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  6. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  7. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  8. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  9. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  10. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  11. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  12. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  13. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  14. *
  15. * This software consists of voluntary contributions made by many individuals
  16. * and is licensed under the MIT license. For more information, see
  17. * <http://www.doctrine-project.org>.
  18. */
  19. namespace Doctrine\DBAL\Driver;
  20. use Doctrine\DBAL\Driver;
  21. use Doctrine\DBAL\Exception;
  22. use Doctrine\DBAL\Platforms\OraclePlatform;
  23. use Doctrine\DBAL\Schema\OracleSchemaManager;
  24. /**
  25. * Abstract base implementation of the {@link Doctrine\DBAL\Driver} interface for Oracle based drivers.
  26. *
  27. * @author Steve Müller <st.mueller@dzh-online.de>
  28. * @link www.doctrine-project.org
  29. * @since 2.5
  30. */
  31. abstract class AbstractOracleDriver implements Driver, ExceptionConverterDriver
  32. {
  33. /**
  34. * {@inheritdoc}
  35. */
  36. public function convertException($message, DriverException $exception)
  37. {
  38. switch ($exception->getErrorCode()) {
  39. case '1':
  40. case '2299':
  41. case '38911':
  42. return new Exception\UniqueConstraintViolationException($message, $exception);
  43. case '904':
  44. return new Exception\InvalidFieldNameException($message, $exception);
  45. case '918':
  46. case '960':
  47. return new Exception\NonUniqueFieldNameException($message, $exception);
  48. case '923':
  49. return new Exception\SyntaxErrorException($message, $exception);
  50. case '942':
  51. return new Exception\TableNotFoundException($message, $exception);
  52. case '955':
  53. return new Exception\TableExistsException($message, $exception);
  54. case '1017':
  55. case '12545':
  56. return new Exception\ConnectionException($message, $exception);
  57. case '1400':
  58. return new Exception\NotNullConstraintViolationException($message, $exception);
  59. case '2266':
  60. case '2291':
  61. case '2292':
  62. return new Exception\ForeignKeyConstraintViolationException($message, $exception);
  63. }
  64. return new Exception\DriverException($message, $exception);
  65. }
  66. /**
  67. * {@inheritdoc}
  68. */
  69. public function getDatabase(\Doctrine\DBAL\Connection $conn)
  70. {
  71. $params = $conn->getParams();
  72. return $params['user'];
  73. }
  74. /**
  75. * {@inheritdoc}
  76. */
  77. public function getDatabasePlatform()
  78. {
  79. return new OraclePlatform();
  80. }
  81. /**
  82. * {@inheritdoc}
  83. */
  84. public function getSchemaManager(\Doctrine\DBAL\Connection $conn)
  85. {
  86. return new OracleSchemaManager($conn);
  87. }
  88. /**
  89. * Returns an appropriate Easy Connect String for the given parameters.
  90. *
  91. * @param array $params The connection parameters to return the Easy Connect STring for.
  92. *
  93. * @return string
  94. *
  95. * @link http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm
  96. */
  97. protected function getEasyConnectString(array $params)
  98. {
  99. if ( ! empty($params['host'])) {
  100. if ( ! isset($params['port'])) {
  101. $params['port'] = 1521;
  102. }
  103. $serviceName = $params['dbname'];
  104. if ( ! empty($params['servicename'])) {
  105. $serviceName = $params['servicename'];
  106. }
  107. $service = 'SID=' . $serviceName;
  108. $pooled = '';
  109. $instance = '';
  110. if (isset($params['service']) && $params['service'] == true) {
  111. $service = 'SERVICE_NAME=' . $serviceName;
  112. }
  113. if (isset($params['instancename']) && ! empty($params['instancename'])) {
  114. $instance = '(INSTANCE_NAME = ' . $params['instancename'] . ')';
  115. }
  116. if (isset($params['pooled']) && $params['pooled'] == true) {
  117. $pooled = '(SERVER=POOLED)';
  118. }
  119. return '(DESCRIPTION=' .
  120. '(ADDRESS=(PROTOCOL=TCP)(HOST=' . $params['host'] . ')(PORT=' . $params['port'] . '))' .
  121. '(CONNECT_DATA=(' . $service . ')' . $instance . $pooled . '))';
  122. }
  123. return isset($params['dbname']) ? $params['dbname'] : '';
  124. }
  125. }