Completed
Pull Request — master (#31)
by Damian
06:15
created

MSSQLAzureDatabase   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 91
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3
Metric Value
wmc 9
lcom 1
cbo 3
dl 0
loc 91
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A fullTextEnabled() 0 4 1
A __construct() 0 4 1
A connect() 0 5 1
A connectDatabase() 0 19 2
1
<?php
2
3
namespace SilverStripe\MSSQL;
4
5
/**
6
 * Specific support for SQL Azure databases running on Windows Azure.
7
 * Currently only supports the SQLSRV driver from Microsoft.
8
 *
9
 * Some important things about SQL Azure:
10
 *
11
 * Selecting a database is not supported.
12
 * In order to change the database currently in use, you need to connect to
13
 * the database using the "Database" parameter with sqlsrv_connect()
14
 *
15
 * Multiple active result sets are not supported. This means you can't
16
 * have two query results open at once.
17
 *
18
 * Fulltext indexes are not supported.
19
 *
20
 * @author Sean Harvey <sean at silverstripe dot com>
21
 * @package mssql
22
 */
23
class MSSQLAzureDatabase extends MSSQLDatabase
24
{
25
26
    /**
27
     * List of parameters used to create new Azure connections between databases
28
     *
29
     * @var array
30
     */
31
    protected $parameters = array();
32
33
    public function fullTextEnabled()
34
    {
35
        return false;
36
    }
37
38
    public function __construct($parameters)
39
    {
40
        $this->connectDatabase($parameters);
41
    }
42
43
    /**
44
     * Connect to a SQL Azure database with the given parameters.
45
     * @param array $parameters Connection parameters set by environment
46
     *  - server: The server, eg, localhost
47
     *  - username: The username to log on with
48
     *  - password: The password to log on with
49
     *  - database: The database to connect to
50
     *  - windowsauthentication: Not supported for Azure
51
     */
52
    public function connect($parameters)
53
    {
54
        $this->parameters = $parameters;
55
        $this->connectDatabase($parameters['database']);
56
    }
57
58
    /**
59
     * Connect to a database using the provided parameters
60
     *
61
     * @param string $database
62
     */
63
    protected function connectDatabase($database)
64
    {
65
        $parameters = $this->parameters;
66
        $parameters['database'] = $database;
67
        $parameters['multipleactiveresultsets'] = 0;
68
69
        // Ensure that driver is available (required by PDO)
70
        if (empty($parameters['driver'])) {
71
            $parameters['driver'] = $this->getDatabaseServer();
72
        }
73
74
        // Notify connector of parameters, instructing the connector
75
        // to connect immediately to the Azure database
76
        $this->connector->connect($parameters, true);
77
78
        // Configure the connection
79
        $this->query('SET QUOTED_IDENTIFIER ON');
80
        $this->query('SET TEXTSIZE 2147483647');
81
    }
82
83
    /**
84
     * Switches to the given database.
85
     *
86
     * IMPORTANT: SQL Azure doesn't support "USE", so we need
87
     * to reinitialize the database connection with the requested
88
     * database name.
89
     * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee336288.aspx
90
     *
91
     * @param string $name The database name to switch to
92
     * @param bool $create
93
     * @param bool|int $errorLevel
94
     * @return bool
95
     */
96
    public function selectDatabase($name, $create = false, $errorLevel = E_USER_ERROR)
97
    {
98
        $this->fullTextEnabled = null;
99
        if (!$this->schemaManager->databaseExists($name)) {
100
            // Check DB creation permisson
101
            if (!$create) {
102
                if ($errorLevel !== false) {
103
                    user_error("Attempted to connect to non-existing database \"$name\"", $errorLevel);
104
                }
105
                // Unselect database
106
                $this->connector->unloadDatabase();
107
                return false;
108
            }
109
            $this->schemaManager->createDatabase($name);
110
        }
111
        $this->connectDatabase($name);
112
        return true;
113
    }
114
}
115