Completed
Push — master ( f2ef3e...a98c98 )
by Bartko
01:49
created

TestUtil::buildAdapter()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 21
rs 9.2728
c 0
b 0
f 0
cc 5
nc 5
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace StefanoTreeTest;
6
7
use Doctrine\DBAL;
8
use PDO;
9
use Zend\Db\Adapter\Adapter as Zend2DbAdapter;
10
11
class TestUtil
12
{
13
    private static $dbConnection;
14
    private static $zend2DbAdapter;
15
    private static $zend1DbAdapter;
16
    private static $doctrine2Connection;
17
18
    private static $mysqlDbSchemeCreated = false;
19
20
    public static function createDbScheme()
21
    {
22
        $connection = self::getPDOConnection();
23
24
        $queries = array();
25
26
        if ('mysql' == TEST_STEFANO_DB_ADAPTER) {
27
            if (self::$mysqlDbSchemeCreated) {
28
                return;
29
            } else {
30
                self::$mysqlDbSchemeCreated = true;
31
            }
32
            $queries[] = 'CREATE TABLE `tree_traversal` (
33
                `tree_traversal_id` int(11) NOT NULL AUTO_INCREMENT,
34
                `name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
35
                `lft` int(11) NOT NULL,
36
                `rgt` int(11) NOT NULL,
37
                `parent_id` int(11) DEFAULT NULL,
38
                `level` int(11) DEFAULT NULL,
39
                PRIMARY KEY (`tree_traversal_id`),
40
                KEY `parent_id` (`parent_id`),
41
                KEY `level` (`level`),
42
                KEY `lft` (`lft`),
43
                KEY `rgt` (`rgt`)
44
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin';
45
46
            $queries[] = 'ALTER TABLE `tree_traversal`
47
                ADD FOREIGN KEY (`parent_id`) 
48
                REFERENCES `tree_traversal` (`tree_traversal_id`) 
49
                ON DELETE CASCADE ON UPDATE CASCADE';
50
51
            $queries[] = 'CREATE TABLE `tree_traversal_with_scope` (
52
                `tree_traversal_id` int(11) NOT NULL AUTO_INCREMENT,
53
                `name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
54
                `lft` int(11) NOT NULL,
55
                `rgt` int(11) NOT NULL,
56
                `parent_id` int(11) DEFAULT NULL,
57
                `level` int(11) DEFAULT NULL,
58
                `scope` int(11) NOT NULL,
59
                PRIMARY KEY (`tree_traversal_id`),
60
                KEY `parent_id` (`parent_id`),
61
                KEY `level` (`level`),
62
                KEY `lft` (`lft`),
63
                KEY `rgt` (`rgt`),
64
                KEY `scope` (`scope`)
65
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin';
66
67
            $queries[] = 'CREATE TABLE `tree_traversal_metadata` (
68
                `tree_traversal_metadata_id` int(11) NOT NULL AUTO_INCREMENT,
69
                `tree_traversal_id` int(11) NOT NULL,
70
                `lft` int(11) DEFAULT NULL,
71
                `name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
72
                PRIMARY KEY (`tree_traversal_metadata_id`),
73
                KEY `tree_traversal_id` (`tree_traversal_id`)
74
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin';
75
76
            $queries[] = 'ALTER TABLE `tree_traversal_with_scope`
77
                ADD FOREIGN KEY (`parent_id`) 
78
                REFERENCES `tree_traversal_with_scope` (`tree_traversal_id`) 
79
                ON DELETE CASCADE ON UPDATE CASCADE';
80
        } elseif ('pgsql' == TEST_STEFANO_DB_ADAPTER) {
81
            // Run this workaround before each test. DbUnit has issue with postgres https://github.com/sebastianbergmann/dbunit/issues/58
82
            $queries[] = 'DROP TABLE IF EXISTS tree_traversal';
83
            $queries[] = 'DROP TABLE IF EXISTS tree_traversal_with_scope';
84
            $queries[] = 'DROP TABLE IF EXISTS tree_traversal_metadata';
85
86
            $queries[] = 'CREATE TABLE tree_traversal (
87
                  tree_traversal_id serial NOT NULL,
88
                  name character varying(255),
89
                  lft integer NOT NULL,
90
                  rgt integer NOT NULL,
91
                  parent_id integer,
92
                  level integer,
93
                  CONSTRAINT tree_traversal_pkey PRIMARY KEY (tree_traversal_id),
94
                  CONSTRAINT tree_traversal_parent_id_fkey FOREIGN KEY (parent_id)
95
                    REFERENCES public.tree_traversal (tree_traversal_id) MATCH SIMPLE
96
                    ON UPDATE CASCADE ON DELETE CASCADE
97
                )';
98
99
            $queries[] = 'CREATE INDEX tree_traversal_level
100
                ON public.tree_traversal
101
                USING btree (level)';
102
103
            $queries[] = 'CREATE INDEX tree_traversal_lft
104
                ON public.tree_traversal
105
                USING btree (lft)';
106
107
            $queries[] = 'CREATE INDEX tree_traversal_parent_id
108
                ON public.tree_traversal
109
                USING btree (parent_id)';
110
111
            $queries[] = 'CREATE INDEX tree_traversal_rgt
112
                  ON public.tree_traversal
113
                  USING btree (rgt)';
114
115
            $queries[] = 'CREATE TABLE tree_traversal_with_scope (
116
                  tree_traversal_id serial NOT NULL,
117
                  name character varying(255),
118
                  lft integer NOT NULL,
119
                  rgt integer NOT NULL,
120
                  parent_id integer,
121
                  level integer,
122
                  scope integer NOT NULL,
123
                  CONSTRAINT tree_traversal_with_scope_pkey PRIMARY KEY (tree_traversal_id),
124
                  CONSTRAINT tree_traversal_with_scope_parent_id_fkey FOREIGN KEY (parent_id)
125
                    REFERENCES public.tree_traversal_with_scope (tree_traversal_id) MATCH SIMPLE
126
                    ON UPDATE CASCADE ON DELETE CASCADE
127
                )';
128
129
            $queries[] = 'CREATE INDEX tree_traversal_with_scope_level
130
                  ON public.tree_traversal_with_scope
131
                  USING btree (level)';
132
133
            $queries[] = 'CREATE INDEX tree_traversal_with_scope_lft
134
                  ON public.tree_traversal_with_scope
135
                  USING btree (lft)';
136
137
            $queries[] = 'CREATE INDEX tree_traversal_with_scope_parent_id
138
                  ON public.tree_traversal_with_scope
139
                  USING btree (parent_id)';
140
141
            $queries[] = 'CREATE INDEX tree_traversal_with_scope_rgt
142
                  ON public.tree_traversal_with_scope
143
                  USING btree (rgt)';
144
145
            $queries[] = 'CREATE INDEX tree_traversal_with_scope_scope
146
                  ON public.tree_traversal_with_scope
147
                  USING btree (scope)';
148
149
            $queries[] = 'CREATE TABLE tree_traversal_metadata (
150
                tree_traversal_metadata_id serial NOT NULL,
151
                tree_traversal_id integer NOT NULL,
152
                lft integer,
153
                name character varying(255),
154
                CONSTRAINT tree_traversal_metadata_pkey PRIMARY KEY (tree_traversal_metadata_id)
155
            )';
156
157
            $queries[] = 'CREATE INDEX tree_traversal_metadata_tree_traversal_id
158
                  ON public.tree_traversal_metadata
159
                  USING btree (tree_traversal_id)';
160
        } else {
161
            throw new \Exception(sprintf('Unsupported vendor %s', TEST_STEFANO_DB_ADAPTER));
162
        }
163
164
        foreach ($queries as $query) {
165
            $connection->query($query);
166
        }
167
    }
168
169
    /**
170
     * Singleton.
171
     *
172
     * @return PDO
173
     */
174
    public static function getPDOConnection()
175
    {
176
        if (null == self::$dbConnection) {
177
            $adapter = strtolower(TEST_STEFANO_DB_ADAPTER);
178
            $hostname = TEST_STEFANO_DB_HOSTNAME;
179
            $dbName = TEST_STEFANO_DB_DB_NAME;
180
            $user = TEST_STEFANO_DB_USER;
181
            $password = TEST_STEFANO_DB_PASSWORD;
182
183
            self::$dbConnection = new PDO(
184
                $adapter.':host='.$hostname.';dbname='
185
                .$dbName, $user, $password
186
            );
187
        }
188
189
        return self::$dbConnection;
190
    }
191
192
    /**
193
     * Singleton.
194
     *
195
     * @return Zend2DbAdapter
196
     */
197
    public static function getZend2DbAdapter()
198
    {
199
        if (null == self::$zend2DbAdapter) {
200
            self::$zend2DbAdapter = new Zend2DbAdapter(array(
201
                'driver' => 'Pdo_'.ucfirst(TEST_STEFANO_DB_ADAPTER),
202
                'hostname' => TEST_STEFANO_DB_HOSTNAME,
203
                'database' => TEST_STEFANO_DB_DB_NAME,
204
                'username' => TEST_STEFANO_DB_USER,
205
                'password' => TEST_STEFANO_DB_PASSWORD,
206
            ));
207
        }
208
209
        return self::$zend2DbAdapter;
210
    }
211
212
    /**
213
     * Singleton.
214
     *
215
     * @return \Zend_Db_Adapter_Abstract
216
     */
217
    public static function getZend1DbAdapter()
218
    {
219
        if (null == self::$zend1DbAdapter) {
220
            self::$zend1DbAdapter = \Zend_Db::factory('Pdo_'.ucfirst(TEST_STEFANO_DB_ADAPTER), array(
221
                'host' => TEST_STEFANO_DB_HOSTNAME,
222
                'dbname' => TEST_STEFANO_DB_DB_NAME,
223
                'username' => TEST_STEFANO_DB_USER,
224
                'password' => TEST_STEFANO_DB_PASSWORD,
225
            ));
226
        }
227
228
        return self::$zend1DbAdapter;
229
    }
230
231
    /**
232
     * Singleton.
233
     *
234
     * @return DBAL\Connection
235
     */
236
    public static function getDoctrine2Connection()
237
    {
238
        if (null == self::$doctrine2Connection) {
239
            $config = new DBAL\Configuration();
240
            $connectionParams = array(
241
                'dbname' => TEST_STEFANO_DB_DB_NAME,
242
                'user' => TEST_STEFANO_DB_USER,
243
                'password' => TEST_STEFANO_DB_PASSWORD,
244
                'host' => TEST_STEFANO_DB_HOSTNAME,
245
                'driver' => 'pdo_'.strtolower(TEST_STEFANO_DB_ADAPTER),
246
            );
247
248
            self::$doctrine2Connection = DBAL\DriverManager::getConnection($connectionParams, $config);
249
        }
250
251
        return self::$doctrine2Connection;
252
    }
253
}
254