OracleSessionInit.php 2.01 KB
Newer Older
1 2 3 4
<?php

namespace Doctrine\DBAL\Event\Listeners;

5
use Doctrine\Common\EventSubscriber;
6 7
use Doctrine\DBAL\Event\ConnectionEventArgs;
use Doctrine\DBAL\Events;
8

9 10 11 12
use function array_change_key_case;
use function array_merge;
use function count;
use function implode;
13

Grégoire Paris's avatar
Grégoire Paris committed
14
use const CASE_UPPER;
15 16

/**
Pascal Borreli's avatar
Pascal Borreli committed
17
 * Should be used when Oracle Server default environment does not match the Doctrine requirements.
18
 *
Pascal Borreli's avatar
Pascal Borreli committed
19
 * The following environment variables are required for the Doctrine default date format:
20 21
 *
 * NLS_TIME_FORMAT="HH24:MI:SS"
22
 * NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"
23 24 25 26 27
 * NLS_TIMESTAMP_FORMAT="YYYY-MM-DD HH24:MI:SS"
 * NLS_TIMESTAMP_TZ_FORMAT="YYYY-MM-DD HH24:MI:SS TZH:TZM"
 */
class OracleSessionInit implements EventSubscriber
{
28
    /** @var string[] */
29
    protected $_defaultSessionVars = [
30 31 32 33 34
        'NLS_TIME_FORMAT' => 'HH24:MI:SS',
        'NLS_DATE_FORMAT' => 'YYYY-MM-DD HH24:MI:SS',
        'NLS_TIMESTAMP_FORMAT' => 'YYYY-MM-DD HH24:MI:SS',
        'NLS_TIMESTAMP_TZ_FORMAT' => 'YYYY-MM-DD HH24:MI:SS TZH:TZM',
        'NLS_NUMERIC_CHARACTERS' => '.,',
35
    ];
36 37

    /**
38
     * @param string[] $oracleSessionVars
39
     */
40
    public function __construct(array $oracleSessionVars = [])
41 42 43 44 45 46 47 48 49
    {
        $this->_defaultSessionVars = array_merge($this->_defaultSessionVars, $oracleSessionVars);
    }

    /**
     * @return void
     */
    public function postConnect(ConnectionEventArgs $args)
    {
50
        if (count($this->_defaultSessionVars) === 0) {
51 52 53 54
            return;
        }

        $vars = [];
55
        foreach (array_change_key_case($this->_defaultSessionVars, CASE_UPPER) as $option => $value) {
56 57 58 59
            if ($option === 'CURRENT_SCHEMA') {
                $vars[] = $option . ' = ' . $value;
            } else {
                $vars[] = $option . " = '" . $value . "'";
60 61
            }
        }
Grégoire Paris's avatar
Grégoire Paris committed
62

63 64
        $sql = 'ALTER SESSION SET ' . implode(' ', $vars);
        $args->getConnection()->executeUpdate($sql);
65 66
    }

Benjamin Morel's avatar
Benjamin Morel committed
67 68 69
    /**
     * {@inheritdoc}
     */
70 71
    public function getSubscribedEvents()
    {
72
        return [Events::postConnect];
73 74
    }
}