Test Failed
Push — main ( a2096a...c7561b )
by Bingo
15:21
created

DbSqlSessionFactory::init()   B

Complexity

Conditions 2
Paths 2

Size

Total Lines 104
Code Lines 93

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 93
dl 0
loc 104
rs 8.1527
c 0
b 0
f 0
cc 2
nc 2
nop 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace Jabe\Engine\Impl\Db\Sql;
4
5
use Doctrine\DBAL\Connection;
6
use Jabe\Engine\Impl\Db\SqlSessionFactoryInterface;
7
use Jabe\Engine\Impl\Cfg\IdGeneratorInterface;
8
use Jabe\Engine\Impl\Db\DbEntityInterface;
9
use Jabe\Engine\Impl\Interceptor\{
10
    SessionInterface,
11
    SessionFactoryInterface
12
};
13
use Jabe\Engine\Impl\Util\ClassNameUtil;
14
15
class DbSqlSessionFactory implements SessionFactoryInterface
16
{
17
    public const POSTGRES = "postgres";
18
19
    public const SUPPORTED_DATABASES = [ self::POSTGRES ];
20
21
    protected static $databaseSpecificStatements = [];
22
23
    public static $databaseSpecificLimitBeforeStatements = [];
24
    public static $databaseSpecificLimitAfterStatements = [];
25
    //limit statements that can be used to select first N rows without OFFSET
26
    public static $databaseSpecificLimitBeforeWithoutOffsetStatements = [];
27
    public static $databaseSpecificLimitAfterWithoutOffsetStatements = [];
28
    // limitAfter statements that can be used with subqueries
29
    public static $databaseSpecificInnerLimitAfterStatements = [];
30
    public static $databaseSpecificLimitBetweenStatements = [];
31
    public static $databaseSpecificLimitBetweenFilterStatements = [];
32
    public static $databaseSpecificLimitBetweenAcquisitionStatements = [];
33
    // count distinct statements
34
    public static $databaseSpecificCountDistinctBeforeStart = [];
35
    public static $databaseSpecificCountDistinctBeforeEnd = [];
36
    public static $databaseSpecificCountDistinctAfterEnd = [];
37
38
    public static $optimizeDatabaseSpecificLimitBeforeWithoutOffsetStatements = [];
39
    public static $optimizeDatabaseSpecificLimitAfterWithoutOffsetStatements = [];
40
41
    public static $databaseSpecificEscapeChar = [];
42
    public static $databaseSpecificOrderByStatements = [];
43
    public static $databaseSpecificLimitBeforeNativeQueryStatements = [];
44
    public static $databaseSpecificBitAnd1 = [];
45
    public static $databaseSpecificBitAnd2 = [];
46
    public static $databaseSpecificBitAnd3 = [];
47
48
    public static $databaseSpecificDatepart1 = [];
49
    public static $databaseSpecificDatepart2 = [];
50
    public static $databaseSpecificDatepart3 = [];
51
52
    public static $databaseSpecificDummyTable = [];
53
54
    public static $databaseSpecificIfNull = [];
55
56
    public static $databaseSpecificTrueConstant = [];
57
    public static $databaseSpecificFalseConstant = [];
58
59
    public static $databaseSpecificDistinct = [];
60
61
    public static $databaseSpecificNumericCast = [];
62
63
    public static $dbSpecificConstants = [];
64
65
    public static $databaseSpecificDaysComparator = [];
66
67
    public static $databaseSpecificCollationForCaseSensitivity = [];
68
69
    public static $databaseSpecificAuthJoinStart = [];
70
    public static $databaseSpecificAuthJoinEnd = [];
71
    public static $databaseSpecificAuthJoinSeparator = [];
72
73
    public static $databaseSpecificAuth1JoinStart = [];
74
    public static $databaseSpecificAuth1JoinEnd = [];
75
    public static $databaseSpecificAuth1JoinSeparator = [];
76
77
    private static $initialized = false;
78
79
    /*
80
     * On SQL server, the overall maximum number of parameters in a prepared statement
81
     * is 2100.
82
     */
83
    public const MAXIMUM_NUMBER_PARAMS = 2000;
84
85
    public static $defaultOrderBy = 'order by ${internalOrderBy}';
86
87
    public static $defaultEscapeChar = "'\\'";
88
89
    public static $defaultDistinctCountBeforeStart = "select count(distinct";
90
    public static $defaultDistinctCountBeforeEnd = ")";
91
    public static $defaultDistinctCountAfterEnd = "";
92
93
    public static $defaultAuthOnStart = "IN (";
94
    public static $defaultAuthOnEnd = ")";
95
    public static $defaultAuthOnSeparator = ",";
96
97
    protected $databaseType;
98
    protected $databaseTablePrefix = "";
99
    protected $databaseSchema;
100
    protected $sqlSessionFactory;
101
    protected $idGenerator;
102
    protected $statementMappings = [];
103
    protected $insertStatements = [];
104
    protected $updateStatements = [];
105
    protected $deleteStatements = [];
106
    protected $selectStatements = [];
107
    protected $isDbIdentityUsed = true;
108
    protected $isDbHistoryUsed = true;
109
    protected $cmmnEnabled = false;
110
    protected $dmnEnabled = false;
111
112
    protected $batchProcessing;
113
114
    public function __construct(bool $batchProcessing = false)
115
    {
116
        self::init();
117
        $this->batchProcessing = $batchProcessing;
118
    }
119
120
    private static function init(): void
121
    {
122
        if (self::$initialized == false) {
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like you are loosely comparing two booleans. Considering using the strict comparison === instead.

When comparing two booleans, it is generally considered safer to use the strict comparison operator.

Loading history...
123
            self::$initialized = true;
124
            self::$databaseSpecificLimitBeforeStatements[self::POSTGRES] = "";
125
            self::$optimizeDatabaseSpecificLimitBeforeWithoutOffsetStatements[self::POSTGRES] = "";
126
            self::$databaseSpecificLimitAfterStatements[self::POSTGRES] = "LIMIT #{maxResults} OFFSET #{firstResult}";
127
            self::$optimizeDatabaseSpecificLimitAfterWithoutOffsetStatements[self::POSTGRES] = "LIMIT #{maxResults}";
128
            self::$databaseSpecificLimitBeforeWithoutOffsetStatements[self::POSTGRES] = "";
129
            self::$databaseSpecificLimitAfterWithoutOffsetStatements[self::POSTGRES] = "LIMIT #{maxResults}";
130
            self::$databaseSpecificInnerLimitAfterStatements[self::POSTGRES] = self::$databaseSpecificLimitAfterStatements[self::POSTGRES];
131
            self::$databaseSpecificLimitBetweenStatements[self::POSTGRES] = "";
132
            self::$databaseSpecificLimitBetweenFilterStatements[self::POSTGRES] = "";
133
            self::$databaseSpecificLimitBetweenAcquisitionStatements[self::POSTGRES] = "";
134
            self::$databaseSpecificOrderByStatements[self::POSTGRES] = self::$defaultOrderBy;
135
            self::$databaseSpecificLimitBeforeNativeQueryStatements[self::POSTGRES] = "";
136
            self::$databaseSpecificDistinct[self::POSTGRES] = "distinct";
137
138
            self::$databaseSpecificCountDistinctBeforeStart[self::POSTGRES] = 'SELECT COUNT(*) FROM (SELECT DISTINCT';
139
            self::$databaseSpecificCountDistinctBeforeEnd[self::POSTGRES] = "";
140
            self::$databaseSpecificCountDistinctAfterEnd[self::POSTGRES] = ") countDistinct";
141
142
            self::$databaseSpecificEscapeChar[self::POSTGRES] = self::$defaultEscapeChar;
143
144
            self::$databaseSpecificBitAnd1[self::POSTGRES] = "";
145
            self::$databaseSpecificBitAnd2[self::POSTGRES] = " & ";
146
            self::$databaseSpecificBitAnd3[self::POSTGRES] = "";
147
            self::$databaseSpecificDatepart1[self::POSTGRES] = "extract(";
148
            self::$databaseSpecificDatepart2[self::POSTGRES] = " from ";
149
            self::$databaseSpecificDatepart3[self::POSTGRES] = ")";
150
151
            self::$databaseSpecificDummyTable[self::POSTGRES] = "";
152
            self::$databaseSpecificTrueConstant[self::POSTGRES] = "true";
153
            self::$databaseSpecificFalseConstant[self::POSTGRES] = "false";
154
            self::$databaseSpecificIfNull[self::POSTGRES] = "COALESCE";
155
156
            self::$databaseSpecificCollationForCaseSensitivity[self::POSTGRES] = "";
157
            self::$databaseSpecificAuthJoinStart[self::POSTGRES] = self::$defaultAuthOnStart;
158
            self::$databaseSpecificAuthJoinEnd[self::POSTGRES] = self::$defaultAuthOnEnd;
159
            self::$databaseSpecificAuthJoinSeparator[self::POSTGRES] = self::$defaultAuthOnSeparator;
160
            self::$databaseSpecificAuth1JoinStart[self::POSTGRES] = self::$defaultAuthOnStart;
161
            self::$databaseSpecificAuth1JoinEnd[self::POSTGRES] = self::$defaultAuthOnEnd;
162
            self::$databaseSpecificAuth1JoinSeparator[self::POSTGRES] = self::$defaultAuthOnSeparator;
163
164
            self::addDatabaseSpecificStatement(self::POSTGRES, "insertByteArray", "insertByteArray_postgres");
165
            self::addDatabaseSpecificStatement(self::POSTGRES, "updateByteArray", "updateByteArray_postgres");
166
            self::addDatabaseSpecificStatement(self::POSTGRES, "selectByteArray", "selectByteArray_postgres");
167
            self::addDatabaseSpecificStatement(self::POSTGRES, "selectByteArrays", "selectByteArrays_postgres");
168
            self::addDatabaseSpecificStatement(self::POSTGRES, "selectResourceByDeploymentIdAndResourceName", "selectResourceByDeploymentIdAndResourceName_postgres");
169
            self::addDatabaseSpecificStatement(self::POSTGRES, "selectResourceByDeploymentIdAndResourceNames", "selectResourceByDeploymentIdAndResourceNames_postgres");
170
            self::addDatabaseSpecificStatement(self::POSTGRES, "selectResourceByDeploymentIdAndResourceId", "selectResourceByDeploymentIdAndResourceId_postgres");
171
            self::addDatabaseSpecificStatement(self::POSTGRES, "selectResourceByDeploymentIdAndResourceIds", "selectResourceByDeploymentIdAndResourceIds_postgres");
172
            self::addDatabaseSpecificStatement(self::POSTGRES, "selectResourcesByDeploymentId", "selectResourcesByDeploymentId_postgres");
173
            self::addDatabaseSpecificStatement(self::POSTGRES, "selectResourceById", "selectResourceById_postgres");
174
            self::addDatabaseSpecificStatement(self::POSTGRES, "selectLatestResourcesByDeploymentName", "selectLatestResourcesByDeploymentName_postgres");
175
            self::addDatabaseSpecificStatement(self::POSTGRES, "insertIdentityInfo", "insertIdentityInfo_postgres");
176
            self::addDatabaseSpecificStatement(self::POSTGRES, "updateIdentityInfo", "updateIdentityInfo_postgres");
177
            self::addDatabaseSpecificStatement(self::POSTGRES, "selectIdentityInfoById", "selectIdentityInfoById_postgres");
178
            self::addDatabaseSpecificStatement(self::POSTGRES, "selectIdentityInfoByUserIdAndKey", "selectIdentityInfoByUserIdAndKey_postgres");
179
            self::addDatabaseSpecificStatement(self::POSTGRES, "selectIdentityInfoByUserId", "selectIdentityInfoByUserId_postgres");
180
            self::addDatabaseSpecificStatement(self::POSTGRES, "selectIdentityInfoDetails", "selectIdentityInfoDetails_postgres");
181
            self::addDatabaseSpecificStatement(self::POSTGRES, "insertComment", "insertComment_postgres");
182
            self::addDatabaseSpecificStatement(self::POSTGRES, "selectCommentsByTaskId", "selectCommentsByTaskId_postgres");
183
            self::addDatabaseSpecificStatement(self::POSTGRES, "selectCommentsByProcessInstanceId", "selectCommentsByProcessInstanceId_postgres");
184
            self::addDatabaseSpecificStatement(self::POSTGRES, "selectCommentByTaskIdAndCommentId", "selectCommentByTaskIdAndCommentId_postgres");
185
            self::addDatabaseSpecificStatement(self::POSTGRES, "selectEventsByTaskId", "selectEventsByTaskId_postgres");
186
            self::addDatabaseSpecificStatement(self::POSTGRES, "selectFilterByQueryCriteria", "selectFilterByQueryCriteria_postgres");
187
            self::addDatabaseSpecificStatement(self::POSTGRES, "selectFilter", "selectFilter_postgres");
188
189
            self::addDatabaseSpecificStatement(self::POSTGRES, "deleteAttachmentsByRemovalTime", "deleteAttachmentsByRemovalTime_postgres_or_db2");
190
            self::addDatabaseSpecificStatement(self::POSTGRES, "deleteCommentsByRemovalTime", "deleteCommentsByRemovalTime_postgres_or_db2");
191
            self::addDatabaseSpecificStatement(self::POSTGRES, "deleteHistoricActivityInstancesByRemovalTime", "deleteHistoricActivityInstancesByRemovalTime_postgres_or_db2");
192
            self::addDatabaseSpecificStatement(self::POSTGRES, "deleteHistoricDecisionInputInstancesByRemovalTime", "deleteHistoricDecisionInputInstancesByRemovalTime_postgres_or_db2");
193
            self::addDatabaseSpecificStatement(self::POSTGRES, "deleteHistoricDecisionInstancesByRemovalTime", "deleteHistoricDecisionInstancesByRemovalTime_postgres_or_db2");
194
            self::addDatabaseSpecificStatement(self::POSTGRES, "deleteHistoricDecisionOutputInstancesByRemovalTime", "deleteHistoricDecisionOutputInstancesByRemovalTime_postgres_or_db2");
195
            self::addDatabaseSpecificStatement(self::POSTGRES, "deleteHistoricDetailsByRemovalTime", "deleteHistoricDetailsByRemovalTime_postgres_or_db2");
196
            self::addDatabaseSpecificStatement(self::POSTGRES, "deleteExternalTaskLogByRemovalTime", "deleteExternalTaskLogByRemovalTime_postgres_or_db2");
197
            self::addDatabaseSpecificStatement(self::POSTGRES, "deleteHistoricIdentityLinkLogByRemovalTime", "deleteHistoricIdentityLinkLogByRemovalTime_postgres_or_db2");
198
            self::addDatabaseSpecificStatement(self::POSTGRES, "deleteHistoricIncidentsByRemovalTime", "deleteHistoricIncidentsByRemovalTime_postgres_or_db2");
199
            self::addDatabaseSpecificStatement(self::POSTGRES, "deleteJobLogByRemovalTime", "deleteJobLogByRemovalTime_postgres_or_db2");
200
            self::addDatabaseSpecificStatement(self::POSTGRES, "deleteHistoricProcessInstancesByRemovalTime", "deleteHistoricProcessInstancesByRemovalTime_postgres_or_db2");
201
            self::addDatabaseSpecificStatement(self::POSTGRES, "deleteHistoricTaskInstancesByRemovalTime", "deleteHistoricTaskInstancesByRemovalTime_postgres_or_db2");
202
            self::addDatabaseSpecificStatement(self::POSTGRES, "deleteHistoricVariableInstancesByRemovalTime", "deleteHistoricVariableInstancesByRemovalTime_postgres_or_db2");
203
            self::addDatabaseSpecificStatement(self::POSTGRES, "deleteUserOperationLogByRemovalTime", "deleteUserOperationLogByRemovalTime_postgres_or_db2");
204
            self::addDatabaseSpecificStatement(self::POSTGRES, "deleteByteArraysByRemovalTime", "deleteByteArraysByRemovalTime_postgres_or_db2");
205
            self::addDatabaseSpecificStatement(self::POSTGRES, "deleteHistoricBatchesByRemovalTime", "deleteHistoricBatchesByRemovalTime_postgres_or_db2");
206
            self::addDatabaseSpecificStatement(self::POSTGRES, "deleteAuthorizationsByRemovalTime", "deleteAuthorizationsByRemovalTime_postgres_or_db2");
207
            self::addDatabaseSpecificStatement(self::POSTGRES, "deleteTaskMetricsByRemovalTime", "deleteTaskMetricsByRemovalTime_postgres_or_db2");
208
209
            $constants = [];
210
            $constants["constant.event"] = "'event'";
211
            $constants["constant.op_message"] = "NEW_VALUE_ || '_|_' || PROPERTY_";
212
            $constants["constant_for_update"] = "for update";
213
            $constants["constant.datepart.quarter"] = "QUARTER";
214
            $constants["constant.datepart.month"] = "MONTH";
215
            $constants["constant.datepart.minute"] = "MINUTE";
216
            $constants["constant.null.startTime"] = "null START_TIME_";
217
            $constants["constant.varchar.cast"] = 'cast(\'${key}\' as varchar(64))';
218
            $constants["constant.integer.cast"] = "cast(NULL as integer)";
219
            $constants["constant.null.reporter"] = "CAST(NULL AS VARCHAR) AS REPORTER_";
220
            self::$dbSpecificConstants[self::POSTGRES] = $constants;
221
222
            self::$databaseSpecificDaysComparator[self::POSTGRES] = 'EXTRACT (DAY FROM #{currentTimestamp} - ${date}) >= ${days}';
223
            self::$databaseSpecificNumericCast[self::POSTGRES] = "";
224
        }
225
    }
226
227
    public function getSessionType(): string
228
    {
229
        return DbSqlSession::class;
230
    }
231
232
    public function openSession(Connection $connection = null, string $catalog = null, string $schema = null): SessionInterface
233
    {
234
        return $this->batchProcessing ?
235
            new BatchDbSqlSession($this, $connection, $catalog, $schema) :
236
            new SimpleDbSqlSession($this, $connection, $catalog, $schema);
237
    }
238
239
    // insert, update and delete statements /////////////////////////////////////
240
241
    public function getInsertStatement(DbEntityInterface $object): string
242
    {
243
        return $this->getStatement(get_class($object), $this->insertStatements, "insert");
244
    }
245
246
    public function getUpdateStatement(DbEntityInterface $object): string
247
    {
248
        return $this->getStatement(get_class($object), $this->updateStatements, "update");
249
    }
250
251
    public function getDeleteStatement(string $persistentObjectClass): ?string
252
    {
253
        return $this->getStatement($persistentObjectClass, $this->deleteStatements, "delete");
254
    }
255
256
    public function getSelectStatement(string $persistentObjectClass): ?string
257
    {
258
        return $this->getStatement($persistentObjectClass, $selectStatements, "select");
259
    }
260
261
    private function getStatement(string $persistentObjectClass, array &$cachedStatements, string $prefix): ?string
262
    {
263
        if (array_key_exists($persistentObjectClass, $cachedStatements)) {
264
            $statement = $cachedStatements[$persistentObjectClass];
265
            return $statement;
266
        }
267
        $statement = $prefix . ClassNameUtil::getClassNameWithoutPackage($persistentObjectClass);
268
        $statement = substr($statement, 0, strlen($statement) - 6); // "Entity".length() = 6
269
        $cachedStatements[$persistentObjectClass] = $statement;
270
        return $statement;
271
    }
272
273
    // db specific mappings /////////////////////////////////////////////////////
274
275
    protected static function addDatabaseSpecificStatement(string $databaseType, string $activitiStatement, string $doctrineStatement): void
276
    {
277
        $specificStatements = array_key_exists($databaseType, self::$databaseSpecificStatements) ? self::$databaseSpecificStatements[$databaseType] : null;
278
        if ($specificStatements == null) {
279
            $specificStatements = [];
0 ignored issues
show
Unused Code introduced by
The assignment to $specificStatements is dead and can be removed.
Loading history...
280
            self::$databaseSpecificStatements[$databaseType] = [ $doctrineStatement ];
281
        } else {
282
            self::$databaseSpecificStatements[$activitiStatement][] = $doctrineStatement;
283
        }
284
    }
285
286
    public function mapStatement(string $statement): ?string
287
    {
288
        if (empty($this->statementMappings)) {
289
            return $statement;
290
        }
291
        $mappedStatement = array_key_exists($statement, $this->$statementMappings) ? $this->$statementMappings[$statement] : null;
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $statementMappings does not exist. Did you maybe mean $statement?
Loading history...
292
        return $mappedStatement ?? $statement;
293
    }
294
295
    // customized getters and setters ///////////////////////////////////////////
296
297
    public function setDatabaseType(string $databaseType): void
298
    {
299
        $this->databaseType = $databaseType;
300
        $this->statementMappings = array_key_exists($databaseType, self::$databaseSpecificStatements) ? self::$databaseSpecificStatements[$databaseType] : [];
301
    }
302
303
    // getters and setters //////////////////////////////////////////////////////
304
305
    public function getSqlSessionFactory(): SqlSessionFactoryInterface
306
    {
307
        return $this->sqlSessionFactory;
308
    }
309
310
    public function setSqlSessionFactory(SqlSessionFactoryInterface $sqlSessionFactory): void
311
    {
312
        $this->sqlSessionFactory = $sqlSessionFactory;
313
    }
314
315
    public function getIdGenerator(): IdGeneratorInterface
316
    {
317
        return $this->idGenerator;
318
    }
319
320
    public function setIdGenerator(IdGeneratorInterface $idGenerator): void
321
    {
322
        $this->idGenerator = $idGenerator;
323
    }
324
325
    public function getDatabaseType(): string
326
    {
327
        return $this->databaseType;
328
    }
329
330
    public function getStatementMappings(): array
331
    {
332
        return $this->statementMappings;
333
    }
334
335
    public function setStatementMappings(array $statementMappings): void
336
    {
337
        $this->statementMappings = $statementMappings;
338
    }
339
340
    public function getInsertStatements(): array
341
    {
342
        return $this->insertStatements;
343
    }
344
345
    public function setInsertStatements(array $insertStatements): void
346
    {
347
        $this->insertStatements = $insertStatements;
348
    }
349
350
    public function getUpdateStatements(): array
351
    {
352
        return $this->updateStatements;
353
    }
354
355
    public function setUpdateStatements(array $updateStatements): void
356
    {
357
        $this->updateStatements = $updateStatements;
358
    }
359
360
    public function getDeleteStatements(): array
361
    {
362
        return $this->deleteStatements;
363
    }
364
365
    public function setDeleteStatements(array $deleteStatements): void
366
    {
367
        $this->deleteStatements = $deleteStatements;
368
    }
369
370
    public function getSelectStatements(): array
371
    {
372
        return $this->selectStatements;
373
    }
374
375
    public function setSelectStatements(array $selectStatements): void
376
    {
377
        $this->selectStatements = $selectStatements;
378
    }
379
380
    public function isDbIdentityUsed(): bool
381
    {
382
        return $this->isDbIdentityUsed;
383
    }
384
385
    public function setDbIdentityUsed(bool $isDbIdentityUsed): void
386
    {
387
        $this->isDbIdentityUsed = $isDbIdentityUsed;
388
    }
389
390
    public function isDbHistoryUsed(): bool
391
    {
392
        return $this->isDbHistoryUsed;
393
    }
394
395
    public function setDbHistoryUsed(bool $isDbHistoryUsed): void
396
    {
397
        $this->isDbHistoryUsed = $isDbHistoryUsed;
398
    }
399
400
    /*public boolean isCmmnEnabled() {
401
        return cmmnEnabled;
402
    }
403
404
    public void setCmmnEnabled(boolean cmmnEnabled) {
405
        $this->cmmnEnabled = cmmnEnabled;
406
    }
407
408
    public boolean isDmnEnabled() {
409
        return dmnEnabled;
410
    }
411
412
    public void setDmnEnabled(boolean dmnEnabled) {
413
        $this->dmnEnabled = dmnEnabled;
414
    }*/
415
416
    public function setDatabaseTablePrefix(string $databaseTablePrefix): void
417
    {
418
        $this->databaseTablePrefix = $databaseTablePrefix;
419
    }
420
421
    public function getDatabaseTablePrefix(): string
422
    {
423
        return $this->databaseTablePrefix;
424
    }
425
426
    public function getDatabaseSchema(): string
427
    {
428
        return $this->databaseSchema;
429
    }
430
431
    public function setDatabaseSchema(string $databaseSchema): void
432
    {
433
        $this->databaseSchema = $databaseSchema;
434
    }
435
}
436