1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?php
namespace Codeception\Lib\Driver;
class Oci extends Db
{
public function setWaitLock($seconds)
{
$this->dbh->exec('ALTER SESSION SET ddl_lock_timeout = ' . (int) $seconds);
}
public function cleanup()
{
$this->dbh->exec(
"BEGIN
FOR i IN (SELECT trigger_name FROM user_triggers)
LOOP
EXECUTE IMMEDIATE('DROP TRIGGER ' || user || '.\"' || i.trigger_name || '\"');
END LOOP;
END;"
);
$this->dbh->exec(
"BEGIN
FOR i IN (SELECT table_name FROM user_tables)
LOOP
EXECUTE IMMEDIATE('DROP TABLE ' || user || '.\"' || i.table_name || '\" CASCADE CONSTRAINTS');
END LOOP;
END;"
);
$this->dbh->exec(
"BEGIN
FOR i IN (SELECT sequence_name FROM user_sequences)
LOOP
EXECUTE IMMEDIATE('DROP SEQUENCE ' || user || '.\"' || i.sequence_name || '\"');
END LOOP;
END;"
);
$this->dbh->exec(
"BEGIN
FOR i IN (SELECT view_name FROM user_views)
LOOP
EXECUTE IMMEDIATE('DROP VIEW ' || user || '.\"' || i.view_name || '\"');
END LOOP;
END;"
);
}
/**
* SQL commands should ends with `//` in the dump file
* IF you want to load triggers too.
* IF you do not want to load triggers you can use the `;` characters
* but in this case you need to change the $delimiter from `//` to `;`
*
* @param $sql
*/
public function load($sql)
{
$query = '';
$delimiter = '//';
$delimiterLength = 2;
foreach ($sql as $sqlLine) {
if (preg_match('/DELIMITER ([\;\$\|\\\\]+)/i', $sqlLine, $match)) {
$delimiter = $match[1];
$delimiterLength = strlen($delimiter);
continue;
}
$parsed = $this->sqlLine($sqlLine);
if ($parsed) {
continue;
}
$query .= "\n" . rtrim($sqlLine);
if (substr($query, -1 * $delimiterLength, $delimiterLength) == $delimiter) {
$this->sqlQuery(substr($query, 0, -1 * $delimiterLength));
$query = "";
}
}
if ($query !== '') {
$this->sqlQuery($query);
}
}
/**
* @param string $tableName
*
* @return array[string]
*/
public function getPrimaryKey($tableName)
{
if (!isset($this->primaryKeys[$tableName])) {
$primaryKey = [];
$query = "SELECT cols.column_name
FROM all_constraints cons, all_cons_columns cols
WHERE cols.table_name = ?
AND cons.constraint_type = 'P'
AND cons.constraint_name = cols.constraint_name
AND cons.owner = cols.owner
ORDER BY cols.table_name, cols.position";
$stmt = $this->executeQuery($query, [$tableName]);
$columns = $stmt->fetchAll(\PDO::FETCH_ASSOC);
foreach ($columns as $column) {
$primaryKey []= $column['COLUMN_NAME'];
}
$this->primaryKeys[$tableName] = $primaryKey;
}
return $this->primaryKeys[$tableName];
}
}