19 declare(strict_types=1);
40 if ($this->query_utils ===
null) {
49 return $this->db_instance;
57 $str =
'SHOW TABLES ' . ($database ?
' IN ' . $database :
'');
58 $r = $this->pdo->query($str);
61 $sequence_identifier =
"_seq";
62 while (
$data =
$r->fetchColumn()) {
63 if (!preg_match(
"/$sequence_identifier$/um",
$data)) {
74 $seq_name = preg_replace($seq_pattern,
'\\1', $sqn);
75 if ($seq_name && !strcasecmp($sqn, $this->db_instance->getSequenceName($seq_name))) {
87 $query =
"SHOW TABLES LIKE '%_seq'";
88 if (!is_null($database)) {
89 $query .=
" FROM $database";
92 $res = $this->db_instance->query($query);
95 while ($table_name = $this->db_instance->fetchAssoc(
$res)) {
97 if ($sqn !==
'' && $sqn !==
'0') {
101 if ($this->db_instance->options[
'portability'] ??
null) {
103 ($this->db_instance->options[
'field_case'] === CASE_LOWER ?
'strtolower' :
'strtoupper'),
116 $db = $this->db_instance;
118 $table = $db->quoteIdentifier($table,
true);
119 $name = $db->quoteIdentifier($db->getIndexName($name),
true);
120 $query =
"ALTER TABLE $table ADD CONSTRAINT $name";
121 if (!empty($definition[
'primary'])) {
122 $query .=
' PRIMARY KEY';
123 } elseif (!empty($definition[
'unique'])) {
127 foreach (array_keys($definition[
'fields']) as $field) {
128 $fields[] = $db->quoteIdentifier($field,
true);
130 $query .=
' (' . implode(
', ', $fields) .
')';
132 return (
bool) $this->pdo->exec($query);
135 public function createSequence(
string $seq_name,
int $start = 1, array $options = []): bool
137 $sequence_name = $this->db_instance->quoteIdentifier($this->db_instance->getSequenceName($seq_name));
140 $options_strings = [];
142 if (!empty($options[
'comment'])) {
143 $options_strings[
'comment'] =
'COMMENT = ' . $this->db_instance->quote($options[
'comment'],
'text');
146 if (!empty($options[
'charset'])) {
147 $options_strings[
'charset'] =
'DEFAULT CHARACTER SET ' . $options[
'charset'];
148 if (!empty($options[
'collate'])) {
149 $options_strings[
'charset'] .=
' COLLATE ' . $options[
'collate'];
154 if (!empty($options[
'type'])) {
155 $type = $options[
'type'];
158 $options_strings[] =
"ENGINE = $type";
161 $query =
"CREATE TABLE $sequence_name ($seqcol_name INT NOT NULL AUTO_INCREMENT, PRIMARY KEY ($seqcol_name))";
163 if (!empty($options_strings)) {
164 $query .=
' ' . implode(
' ', $options_strings);
166 $this->pdo->exec($query);
172 $query =
"INSERT INTO $sequence_name ($seqcol_name) VALUES (" . ($start - 1) .
')';
173 $this->pdo->exec($query);
183 $db = $this->db_instance;
185 foreach (array_keys($changes) as $change_name) {
186 switch ($change_name) {
203 if (!empty($changes[
'name'])) {
204 $change_name = $db->quoteIdentifier($changes[
'name']);
205 $query .=
'RENAME TO ' . $change_name;
208 if (!empty($changes[
'add']) && is_array($changes[
'add'])) {
209 foreach ($changes[
'add'] as $field_name => $field) {
213 $fd = $db->getFieldDefinition();
215 $query .=
'ADD ' . $fd->getDeclaration($field[
'type'], $field_name, $field);
220 if (!empty($changes[
'remove']) && is_array($changes[
'remove'])) {
221 foreach (array_keys($changes[
'remove']) as $field_name) {
225 $field_name = $db->quoteIdentifier($field_name);
226 $query .=
'DROP ' . $field_name;
231 if (!empty($changes[
'rename']) && is_array($changes[
'rename'])) {
232 foreach ($changes[
'rename'] as $field_name => $field) {
233 $rename[$field[
'name']] = $field_name;
237 if (!empty($changes[
'change']) && is_array($changes[
'change'])) {
238 foreach ($changes[
'change'] as $field_name => $field) {
242 if (isset($rename[$field_name])) {
243 $old_field_name = $rename[$field_name];
244 unset($rename[$field_name]);
246 $old_field_name = $field_name;
248 $old_field_name = $db->quoteIdentifier($old_field_name);
249 $fd = $this->db_instance->getFieldDefinition();
251 $query .=
"CHANGE $old_field_name " . $fd
253 $field[
'definition'][
'type'],
261 if (!empty($rename) && is_array($rename)) {
262 foreach ($rename as $renamed_field) {
266 $field = $changes[
'rename'][$renamed_field];
267 $renamed_field = $db->quoteIdentifier($renamed_field);
268 $fd = $this->db_instance->getFieldDefinition();
270 $query .=
'CHANGE ' . $renamed_field .
' ' . $fd
272 $field[
'definition'][
'type'],
284 $name = $db->quoteIdentifier($name,
true);
286 $statement =
"ALTER TABLE $name $query";
288 return (
bool) $this->pdo->exec($statement);
291 public function createTable(
string $name, array $fields, array $options = []): bool
293 $options[
'type'] = $this->db_instance->getStorageEngine();
300 return $this->db_instance->getIndexName($idx);
305 return $this->db_instance->getSequenceName($sqn);
310 $table = $this->db_instance->quoteIdentifier($table);
311 $query =
"SHOW COLUMNS FROM $table";
312 $result = $this->db_instance->query($query);
314 while (
$data = $this->db_instance->fetchObject($result)) {
315 $return[] =
$data->Field;
326 $key_name =
'Key_name';
327 $non_unique =
'Non_unique';
330 if ($db->options[
'portability'] ??
null) {
331 if ($db->options[
'field_case'] == CASE_LOWER) {
332 $key_name = strtolower($key_name);
333 $non_unique = strtolower($non_unique);
335 $key_name = strtoupper($key_name);
336 $non_unique = strtoupper($non_unique);
340 $table = $this->db_instance->quoteIdentifier($table);
341 $query =
"SHOW INDEX FROM $table";
342 $result_set = $this->db_instance->query($query);
345 while ($index_data = $this->db_instance->fetchAssoc($result_set)) {
346 if (!$index_data[$non_unique]) {
347 $index = $index_data[$key_name] !==
'PRIMARY' ? $this->
fixIndexName($index_data[$key_name]) :
'PRIMARY';
348 if (!empty($index)) {
349 $index = strtolower($index);
350 $result[$index] =
true;
355 if ($this->db_instance->options[
'portability'] ??
null) {
356 $result = array_change_key_case($result, $this->db_instance->options[
'field_case']);
359 return array_keys($result);
367 $key_name =
'Key_name';
368 $non_unique =
'Non_unique';
369 if ($this->db_instance->options[
'portability'] ??
null) {
370 if ($this->db_instance->options[
'field_case'] == CASE_LOWER) {
371 $key_name = strtolower($key_name);
372 $non_unique = strtolower($non_unique);
374 $key_name = strtoupper($key_name);
375 $non_unique = strtoupper($non_unique);
379 $table = $this->db_instance->quoteIdentifier($table);
380 $query =
"SHOW INDEX FROM $table";
381 $result_set = $this->db_instance->query($query);
383 while ($index_data = $this->db_instance->fetchAssoc($result_set)) {
384 $indexes[] = $index_data;
387 foreach ($indexes as $index_data) {
388 if ($index_data[$non_unique] && ($index = $this->
fixIndexName($index_data[$key_name]))) {
389 $result[$index] =
true;
393 if ($this->db_instance->options[
'portability'] ??
null) {
394 $result = array_change_key_case($result, $this->db_instance->options[
'field_case']);
397 return array_keys($result);
403 $idx_name = preg_replace($idx_pattern,
'\\1', $idx);
404 if ($idx_name && !strcasecmp($idx, $this->db_instance->getIndexName($idx_name))) {
411 public function createIndex(
string $table,
string $name, array $definition): bool
413 $table = $this->db_instance->quoteIdentifier($table,
true);
414 $name = $this->db_instance->quoteIdentifier($this->db_instance->getIndexName($name),
true);
415 $query =
"CREATE INDEX $name ON $table";
417 foreach ($definition[
'fields'] as $field => $fieldinfo) {
418 if (!empty($fieldinfo[
'length'])) {
419 $fields[] = $this->db_instance->quoteIdentifier($field,
true) .
'(' . $fieldinfo[
'length'] .
')';
421 $fields[] = $this->db_instance->quoteIdentifier($field,
true);
424 $query .=
' (' . implode(
', ', $fields) .
')';
426 return (
bool) $this->pdo->exec($query);
429 public function dropIndex(
string $table,
string $name): bool
431 $table = $this->db_instance->quoteIdentifier($table,
true);
432 $name = $this->db_instance->quoteIdentifier($this->db_instance->getIndexName($name),
true);
434 return (
bool) $this->pdo->exec(
"DROP INDEX $name ON $table");
439 $sequence_name = $this->db_instance->quoteIdentifier($this->db_instance->getSequenceName($seq_name));
441 return (
bool) $this->pdo->exec(
"DROP TABLE $sequence_name");
449 return $this->
getQueryUtils()->createTable($name, $fields, $options);
452 public function dropConstraint(
string $table,
string $name,
bool $primary =
false): bool
455 $table = $db->quoteIdentifier($table,
true);
456 if ($primary || strtolower($name) ===
'primary') {
457 $query =
"ALTER TABLE $table DROP PRIMARY KEY";
459 $name = $db->quoteIdentifier($db->getIndexName($name),
true);
460 $query =
"ALTER TABLE $table DROP INDEX $name";
463 return (
bool) $this->pdo->exec($query);
469 $name = $db->quoteIdentifier($name,
true);
471 return (
bool) $this->pdo->exec(
"DROP TABLE $name");
479 string $foreign_key_name,
482 array $reference_field_names,
483 string $reference_table,
487 $table = $this->db_instance->quoteIdentifier($table_name,
true);
488 $reference_table = $this->db_instance->quoteIdentifier($reference_table,
true);
489 $field_names = implode(
",", $field_names);
490 $field_names = $this->db_instance->quoteIdentifier($field_names,
true);
491 $reference_field_names = implode(
",", $reference_field_names);
492 $reference_field_names = $this->db_instance->quoteIdentifier($reference_field_names,
true);
493 $foreign_key_name = $this->db_instance->quoteIdentifier($foreign_key_name,
true);
495 if ($on_update !==
null) {
496 $on_update = $on_update->value;
497 $update =
"ON UPDATE $on_update";
500 if ($on_delete !==
null) {
501 $on_delete = $on_delete->value;
502 $delete =
"ON DELETE $on_delete";
504 $query =
"ALTER TABLE 505 $table ADD CONSTRAINT 506 $foreign_key_name FOREIGN KEY ($field_names) 507 REFERENCES $reference_table ($reference_field_names) 512 return (
bool) $this->pdo->exec($query);
515 public function dropForeignKey(
string $foreign_key_name,
string $table_name): bool
517 $table = $this->db_instance->quoteIdentifier($table_name,
true);
518 $name = $this->db_instance->quoteIdentifier($foreign_key_name,
true);
519 $query =
"ALTER TABLE $table DROP FOREIGN KEY $name;";
521 return (
bool) $this->pdo->exec($query);
526 $query =
"SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='FOREIGN KEY';";
527 $result_set = $this->db_instance->query($query);
528 while ($foreign_data = $this->db_instance->fetchAssoc($result_set)) {
529 if (array_key_exists(
532 ) && $foreign_data[
'CONSTRAINT_NAME'] === $foreign_key_name) {
dropSequence(string $seq_name)
dropForeignKey(string $foreign_key_name, string $table_name)
fixIndexName(string $idx)
getTableCreationQuery(string $name, array $fields, array $options=[])
dropConstraint(string $table, string $name, bool $primary=false)
Interface ilDBPdoManagerInterface All these methods are not in MDB 2 will be moved to a seperate inte...
listTableIndexes(string $table)
getIndexName(string $idx)
fixSequenceName(string $sqn, bool $check=false)
createTable(string $name, array $fields, array $options=[])
listSequences(?string $database=null)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
alterTable(string $name, array $changes, bool $check)
dropIndex(string $table, string $name)
createSequence(string $seq_name, int $start=1, array $options=[])
listTables(?string $database=null)
foreignKeyExists(string $foreign_key_name, string $table_name)
listTableFields(string $table)
createConstraint(string $table, string $name, array $definition)
getSequenceName(string $sqn)
__construct(protected \PDO $pdo, protected \ilDBPdo $db_instance)
ilDBPdoManager constructor.
ilQueryUtils $query_utils
const SEQUENCE_COLUMNS_NAME
createIndex(string $table, string $name, array $definition)
addForeignKey(string $foreign_key_name, array $field_names, string $table_name, array $reference_field_names, string $reference_table, ?ForeignKeyConstraints $on_update=null, ?ForeignKeyConstraints $on_delete=null)
listTableConstraints(string $table)