45 if (!$this->query_utils) {
68 $str =
'SHOW TABLES ' . ($database ?
' IN ' . $database :
'');
69 $r = $this->pdo->query($str);
72 $sequence_identifier =
"_seq";
73 while (
$data = $r->fetchColumn()) {
74 if (!preg_match(
"/{$sequence_identifier}$/um",
$data)) {
91 $seq_name = preg_replace($seq_pattern,
'\\1', $sqn);
92 if ($seq_name && !strcasecmp($sqn, $this->db_instance->getSequenceName($seq_name))) {
110 if (!is_null($database)) {
111 $query .=
" FROM $database";
117 while ($table_name = $this->db_instance->fetchAssoc(
$res)) {
122 if ($this->db_instance->options[
'portability'] ?? null) {
123 $result = array_map(($this->db_instance->options[
'field_case'] == CASE_LOWER ?
'strtolower' :
'strtoupper'),
$result);
141 $table = $db->quoteIdentifier($table,
true);
142 $name = $db->quoteIdentifier($db->getIndexName(
$name),
true);
143 $query =
"ALTER TABLE $table ADD CONSTRAINT $name";
144 if (!empty($definition[
'primary'])) {
146 } elseif (!empty($definition[
'unique'])) {
150 foreach (array_keys($definition[
'fields']) as $field) {
151 $fields[] = $db->quoteIdentifier($field,
true);
153 $query .=
' (' . implode(
', ', $fields) .
')';
155 return $this->pdo->exec(
$query);
167 $sequence_name = $this->db_instance->quoteIdentifier($this->db_instance->getSequenceName($seq_name));
170 $options_strings = array();
172 if (!empty($options[
'comment'])) {
173 $options_strings[
'comment'] =
'COMMENT = ' . $this->db_instance->quote($options[
'comment'],
'text');
176 if (!empty($options[
'charset'])) {
177 $options_strings[
'charset'] =
'DEFAULT CHARACTER SET ' . $options[
'charset'];
178 if (!empty($options[
'collate'])) {
179 $options_strings[
'charset'] .=
' COLLATE ' . $options[
'collate'];
184 if (!empty($options[
'type'])) {
185 $type = $options[
'type'];
188 $options_strings[] =
"ENGINE = $type";
191 $query =
"CREATE TABLE $sequence_name ($seqcol_name INT NOT NULL AUTO_INCREMENT, PRIMARY KEY ($seqcol_name))";
193 if (!empty($options_strings)) {
194 $query .=
' ' . implode(
' ', $options_strings);
202 $query =
"INSERT INTO $sequence_name ($seqcol_name) VALUES (" . ($start - 1) .
')';
220 foreach ($changes as $change_name => $change) {
221 switch ($change_name) {
238 if (!empty($changes[
'name'])) {
239 $change_name = $db->quoteIdentifier($changes[
'name']);
240 $query .=
'RENAME TO ' . $change_name;
243 if (!empty($changes[
'add']) && is_array($changes[
'add'])) {
244 foreach ($changes[
'add'] as $field_name => $field) {
248 $query .=
'ADD ' . $db->getFieldDefinition()->getDeclaration($field[
'type'], $field_name, $field);
252 if (!empty($changes[
'remove']) && is_array($changes[
'remove'])) {
253 foreach ($changes[
'remove'] as $field_name => $field) {
257 $field_name = $db->quoteIdentifier($field_name);
258 $query .=
'DROP ' . $field_name;
263 if (!empty($changes[
'rename']) && is_array($changes[
'rename'])) {
264 foreach ($changes[
'rename'] as $field_name => $field) {
265 $rename[$field[
'name']] = $field_name;
269 if (!empty($changes[
'change']) && is_array($changes[
'change'])) {
270 foreach ($changes[
'change'] as $field_name => $field) {
274 if (isset($rename[$field_name])) {
275 $old_field_name = $rename[$field_name];
276 unset($rename[$field_name]);
278 $old_field_name = $field_name;
280 $old_field_name = $db->quoteIdentifier($old_field_name);
281 $query .=
"CHANGE $old_field_name " . $this->db_instance->getFieldDefinition()
282 ->getDeclaration($field[
'definition'][
'type'], $field_name, $field[
'definition']);
286 if (!empty($rename) && is_array($rename)) {
287 foreach ($rename as $rename_name => $renamed_field) {
291 $field = $changes[
'rename'][$renamed_field];
292 $renamed_field = $db->quoteIdentifier($renamed_field);
293 $query .=
'CHANGE ' . $renamed_field .
' ' . $this->db_instance->getFieldDefinition()
294 ->getDeclaration($field[
'definition'][
'type'], $field[
'name'], $field[
'definition']);
304 $statement =
"ALTER TABLE $name $query";
306 return $this->pdo->exec($statement);
318 $options[
'type'] = $this->db_instance->getStorageEngine();
336 return $this->db_instance->getIndexName($idx);
346 return $this->db_instance->getSequenceName($sqn);
357 $table = $this->db_instance->quoteIdentifier($table);
358 $query =
"SHOW COLUMNS FROM $table";
361 while (
$data = $this->db_instance->fetchObject(
$result)) {
362 $return[] =
$data->Field;
376 $key_name =
'Key_name';
377 $non_unique =
'Non_unique';
380 if ($db->options[
'portability']) {
381 if ($db->options[
'field_case'] == CASE_LOWER) {
382 $key_name = strtolower($key_name);
383 $non_unique = strtolower($non_unique);
385 $key_name = strtoupper($key_name);
386 $non_unique = strtoupper($non_unique);
390 $table = $this->db_instance->quoteIdentifier($table);
391 $query =
"SHOW INDEX FROM $table";
392 $result_set = $this->db_instance->query(
$query);
395 while ($index_data = $this->db_instance->fetchAssoc($result_set)) {
396 if (!$index_data[$non_unique]) {
397 if ($index_data[$key_name] !==
'PRIMARY') {
409 if ($this->db_instance->options[
'portability']) {
410 $result = array_change_key_case(
$result, $this->db_instance->options[
'field_case']);
424 $key_name =
'Key_name';
425 $non_unique =
'Non_unique';
426 if ($this->db_instance->options[
'portability'] ?? null) {
427 if ($this->db_instance->options[
'field_case'] == CASE_LOWER) {
428 $key_name = strtolower($key_name);
429 $non_unique = strtolower($non_unique);
431 $key_name = strtoupper($key_name);
432 $non_unique = strtoupper($non_unique);
436 $table = $this->db_instance->quoteIdentifier($table);
437 $query =
"SHOW INDEX FROM $table";
438 $result_set = $this->db_instance->query(
$query);
440 while ($index_data = $this->db_instance->fetchAssoc($result_set)) {
441 $indexes[] = $index_data;
444 foreach ($indexes as $index_data) {
445 if ($index_data[$non_unique] && (
$index = $this->
fixIndexName($index_data[$key_name]))) {
450 if ($this->db_instance->options[
'portability'] ?? null) {
451 $result = array_change_key_case(
$result, $this->db_instance->options[
'field_case']);
465 $idx_name = preg_replace($idx_pattern,
'\\1', $idx);
466 if ($idx_name && !strcasecmp($idx, $this->db_instance->getIndexName($idx_name))) {
482 $table = $this->db_instance->quoteIdentifier($table,
true);
483 $name = $this->db_instance->quoteIdentifier($this->db_instance->getIndexName(
$name),
true);
484 $query =
"CREATE INDEX $name ON $table";
486 foreach ($definition[
'fields'] as $field => $fieldinfo) {
487 if (!empty($fieldinfo[
'length'])) {
488 $fields[] = $this->db_instance->quoteIdentifier($field,
true) .
'(' . $fieldinfo[
'length'] .
')';
490 $fields[] = $this->db_instance->quoteIdentifier($field,
true);
493 $query .=
' (' . implode(
', ', $fields) .
')';
495 return $this->pdo->exec(
$query);
506 $table = $this->db_instance->quoteIdentifier($table,
true);
507 $name = $this->db_instance->quoteIdentifier($this->db_instance->getIndexName(
$name),
true);
509 return $this->pdo->exec(
"DROP INDEX $name ON $table");
519 $sequence_name = $this->db_instance->quoteIdentifier($this->db_instance->getSequenceName($table_name));
521 return $this->pdo->exec(
"DROP TABLE $sequence_name");
547 $table = $db->quoteIdentifier($table,
true);
548 if ($primary || strtolower(
$name) ==
'primary') {
549 $query =
"ALTER TABLE $table DROP PRIMARY KEY";
551 $name = $db->quoteIdentifier($db->getIndexName(
$name),
true);
552 $query =
"ALTER TABLE $table DROP INDEX $name";
555 return $this->pdo->exec(
$query);
568 return $db->manipulate(
"DROP TABLE $name");
alterTable($name, $changes, $check)
listTables($database=null)
listTableConstraints($table)
listSequences($database=null)
fixSequenceName($sqn, $check=false)
dropTable($name)
Table-name mixed
dropSequence($table_name)
getTableCreationQuery($name, $fields, $options=array())
Interface ilDBPdoManagerInterface.
Class ilDatabaseException.
createConstraint($table, $name, $definition)
createTable($name, $fields, $options=array())
foreach($_POST as $key=> $value) $res
dropConstraint($table, $name, $primary=false)
createIndex($table, $name, $definition)
__construct(\PDO $pdo, ilDBPdo $db_instance)
ilDBPdoManager constructor.
const SEQUENCE_COLUMNS_NAME
createSequence($seq_name, $start=1, $options=array())