26 $this->manager =
$ilDB->db->loadModule(
'Manager');
27 $this->reverse =
$ilDB->db->loadModule(
'Reverse');
28 if (@is_file(
'../Services/Database/classes/class.ilDBAnalyzer.php'))
30 include_once
'../Services/Database/classes/class.ilDBAnalyzer.php';
34 include_once
'./Services/Database/classes/class.ilDBAnalyzer.php';
47 $this->testmode = $a_testmode;
57 return $this->testmode;
79 $a_table_name = strtolower($a_table_name);
84 $auto_inc_field = $this->analyzer->getAutoIncrementField($a_table_name);
87 $pk = $this->analyzer->getPrimaryKeyInformation($a_table_name);
90 $indices = $this->analyzer->getIndicesInformation($a_table_name);
93 $constraints = $this->analyzer->getConstraintsInformation($a_table_name);
96 $fields = $this->analyzer->getFieldInformation($a_table_name);
118 $this->
alterTable($a_table_name, $fields, $a_set_text_ts_fields_notnull_false, $pk);
121 $a_table_name = strtolower($a_table_name).
"_copy";
157 if ($auto_inc_field !=
"")
184 if ($nr_rec != $nr_rec2)
186 die(
"ilMySQLAbstraction: Unexpected difference in table record number, table '".$a_table_name.
"'.".
187 " Before: ".((int) $nr_rec).
", After: ".((
int) $nr_rec2).
".");
200 $st =
$ilDB->prepare(
"SELECT count(*) AS cnt FROM `".$a_table_name.
"`");
212 $st = $this->il_db->prepareManip(
"REPLACE INTO abstraction_progress (table_name, step)".
213 " VALUES (?,?)", array(
"text",
"integer"));
214 $this->il_db->execute($st, array($a_table, $a_step));
224 $fields = $this->analyzer->getFieldInformation($a_table);
226 foreach ($fields as $field => $def)
228 if ($def[
"type"] ==
"text" &&
229 ($def[
"length"] >= 1 && $def[
"length"] <= 4000))
231 $upfields[] = $field;
234 foreach ($upfields as $uf)
236 $ilDB->query(
"UPDATE `".$a_table.
"` SET `".$uf.
"` = null WHERE `".$uf.
"` = ''");
247 if (!$this->il_db->tableExists($a_table))
252 $fields = $this->analyzer->getFieldInformation($a_table);
254 foreach ($fields as $field => $def)
256 if ($def[
"type"] ==
"timestamp")
258 $upfields[] = $field;
261 foreach ($upfields as $uf)
263 $ilDB->query(
"UPDATE `".$a_table.
"` SET `".$uf.
"` = null WHERE `".$uf.
"` = '0000-00-00 00:00:00'");
268 foreach ($fields as $field => $def)
270 if ($def[
"type"] ==
"date")
272 $upfields[] = $field;
275 foreach ($upfields as $uf)
277 $ilDB->query(
"UPDATE `".$a_table.
"` SET `".$uf.
"` = null WHERE `".$uf.
"` = '0000-00-00'");
292 if ($a_table_name != strtolower($a_table_name))
296 mysql_query(
"ALTER TABLE `".$a_table_name.
"` RENAME `".strtolower($a_table_name).
"xxx".
"`");
297 mysql_query(
"ALTER TABLE `".strtolower($a_table_name).
"xxx".
"` RENAME `".strtolower($a_table_name).
"`");
308 $result = mysql_query(
"SHOW COLUMNS FROM `".$a_table_name.
"`");
311 if (
$row[
"Field"] != strtolower(
$row[
"Field"]))
313 $ilDB->renameTableColumn($a_table_name,
$row[
"Field"], strtolower(
$row[
"Field"]));
327 if ($a_auto_inc_field !=
"")
329 $this->il_db->modifyTableColumn($a_table_name, $a_auto_inc_field, array());
341 if ($a_pk[
"name"] !=
"")
343 $this->il_db->dropPrimaryKey($a_table, $a_pk[
"name"]);
355 if (is_array($a_indices))
357 foreach($a_indices as $index)
359 $this->il_db->query(
"ALTER TABLE `".$a_table.
"` DROP INDEX `".$index[
"name"].
"`");
372 if (is_array($a_constraints))
374 foreach($a_constraints as $c)
376 if ($c[
"type"] ==
"unique")
378 $this->il_db->query(
"ALTER TABLE `".$a_table.
"` DROP INDEX `".$c[
"name"].
"`");
391 function alterTable($a_table, $a_fields, $a_set_text_ts_fields_notnull_false =
true, $pk =
"")
394 foreach ($a_fields as $field =>
$d)
396 $def = $this->reverse->getTableFieldDefinition($a_table, $field);
397 $this->il_db->handleError($def);
398 $best_alt = $this->analyzer->getBestDefinitionAlternative($def);
399 $def = $def[$best_alt];
402 if (strtolower($def[
"nativetype"]) ==
"timestamp" &&
403 strtolower($def[
"default"]) ==
"current_timestamp")
405 unset($def[
"default"]);
408 if (strtolower($def[
"type"]) ==
"float")
410 unset($def[
"length"]);
414 foreach ($def as $k => $v)
416 if (!in_array($k, array(
"type",
"default",
"notnull",
"length",
"unsigned",
"fixed")))
423 if ($def[
"type"] ==
"decimal")
425 $l_arr = explode(
",",$def[
"length"]);
426 $def[
"length"] = $l_arr[0];
430 if ($def[
"type"] ==
"float")
432 unset($def[
"length"]);
436 if ($a_set_text_ts_fields_notnull_false && ($def[
"type"] ==
"text" ||
437 $def[
"type"] ==
"timestamp" || $def[
"type"] ==
"date") &&
438 (!is_array($pk) || !isset($field,$pk[
"fields"][$field])))
440 $def[
"notnull"] =
false;
444 if ($def[
"type"] ==
"integer")
446 $def[
"unsigned"] =
false;
450 if ($def[
"type"] ==
"blob" || $def[
"type"] ==
"clob")
452 $def[
"notnull"] =
false;
456 if (($def[
"type"] ==
"timestamp" && $def[
"default"] ==
"0000-00-00 00:00:00") ||
457 ($def[
"type"] ==
"date" && $def[
"default"] ==
"0000-00-00"))
459 unset($def[
"default"]);
463 foreach ($def as $k => $v)
467 $def[
"definition"] = $a;
469 $n_fields[$field] = $def;
473 "change" => $n_fields
478 $r = $this->manager->alterTable($a_table, $changes,
false);
482 $r = $this->manager->createTable(strtolower($a_table).
"_copy", $n_fields);
504 if (is_array($a_pk[
"fields"]))
507 foreach ($a_pk[
"fields"] as $f => $pos)
509 $fields[] = strtolower($f);
511 $this->il_db->addPrimaryKey($a_table, $fields);
523 if (is_array($a_indices))
527 foreach ($a_indices as $index)
529 if (strlen($index[
"name"]) > 3)
536 foreach ($a_indices as $index)
538 if (is_array($index[
"fields"]))
542 $index[
"name"] =
"i".$cnt;
545 foreach ($index[
"fields"] as $f => $pos)
547 $fields[] = strtolower($f);
549 $this->il_db->addIndex($a_table, $fields, strtolower($index[
"name"]), $index[
"fulltext"]);
564 if (is_array($a_constraints))
568 foreach ($a_constraints as $c)
570 if (strlen($c[
"name"]) > 3)
577 foreach ($a_constraints as $c)
579 if (is_array($c[
"fields"]))
583 $c[
"name"] =
"c".$cnt;
586 foreach ($c[
"fields"] as $f => $pos)
588 $fields[] = strtolower($f);
590 $this->il_db->addUniqueConstraint($a_table, $fields, strtolower($c[
"name"]));
603 if (!$this->il_db->tableExists($a_table))
608 $indices = $this->analyzer->getIndicesInformation($a_table);
609 foreach ($indices as $index)
611 if (strlen($index[
"name"]) > 3)
619 foreach($indices as $index)
621 $this->il_db->dropIndex($a_table, $index[
"name"]);
635 if ($a_auto_inc_field !=
"")
637 $set = $this->il_db->query(
"SELECT MAX(`".strtolower($a_auto_inc_field).
"`) ma FROM `".$a_table.
"`");
638 $rec = $this->il_db->fetchAssoc($set);
639 $next = $rec[
"ma"] + 1;
640 $this->il_db->createSequence($a_table, $next);
650 if (!$this->il_db->tableExists($a_table))
655 $fields = $this->analyzer->getFieldInformation($a_table);
656 foreach ($fields as $name => $def)
658 if ($def[
"type"] ==
"clob" && $def[
"notnull"] ==
true)
660 $this->il_db->modifyTableColumn($a_table, $name, array(
"type" =>
"clob",
"notnull" =>
false));
671 if (!$this->il_db->tableExists($a_table))
676 $fields = $this->analyzer->getFieldInformation($a_table);
677 foreach ($fields as $name => $def)
679 if ($def[
"type"] ==
"timestamp" &&
680 ($def[
"notnull"] ==
true || $def[
"default"] ==
"0000-00-00 00:00:00"))
682 $nd = array(
"type" =>
"timestamp",
"notnull" =>
false);
683 if ($def[
"default"] ==
"0000-00-00 00:00:00")
685 $nd[
"default"] =
null;
687 $this->il_db->modifyTableColumn($a_table, $name,
$nd);
689 if ($def[
"type"] ==
"date" &&
690 ($def[
"notnull"] ==
true || $def[
"default"] ==
"0000-00-00"))
692 $nd = array(
"type" =>
"date",
"notnull" =>
false);
693 if ($def[
"default"] ==
"0000-00-00")
695 $nd[
"default"] =
null;
697 $this->il_db->modifyTableColumn($a_table, $name,
$nd);
isError($data, $code=null)
Tell whether a value is a MDB2 error.
This class gives all kind of DB information using the MDB2 manager and reverse module.
This class includes methods that help to abstract ILIAS 3.10.x MySQL tables for the use with MDB2 abs...
lowerCaseColumnNames($a_table_name)
lower case column names
fixClobNotNull($a_table)
This is only used on tables that have already been abstracted but missed the "full treatment".
addPrimaryKey($a_table, $a_pk)
Add primary key.
__construct()
Constructor.
performAbstraction($a_table_name, $a_set_text_ts_fields_notnull_false=true)
Converts an existing (MySQL) ILIAS table in an abstract table.
fixIndexNames($a_table)
This is only used on tables that have already been abstracted but missed the "full treatment".
countRecords($a_table_name)
Check number of records before and after.
replaceEmptyDatesWithNull($a_table)
Replace empty dates with null.
removeConstraints($a_table, $a_constraints)
Remove Constraints.
removeIndices($a_table, $a_indices)
Remove Indices.
alterTable($a_table, $a_fields, $a_set_text_ts_fields_notnull_false=true, $pk="")
Use abstract types as delivered by MDB2 to alter table and make it use only MDB2 known types.
replaceEmptyStringsWithNull($a_table)
Replace empty strings with null values.
getTestMode()
Get Test Mode.
fixDatetimeValues($a_table)
This is only used on tables that have already been abstracted but missed the "full treatment".
lowerCaseTableName($a_table_name)
Lower case table and field names.
removePrimaryKey($a_table, $a_pk)
Remove primary key from table.
setTestMode($a_testmode)
Set Test Mode.
addConstraints($a_table, $a_constraints)
Add constraints.
addIndices($a_table, $a_indices)
Add indices.
storeStep($a_table, $a_step)
Store performed step.
removeAutoIncrement($a_table_name, $a_auto_inc_field)
Remove auto_increment attribute of a field.
addAutoIncrementSequence($a_table, $a_auto_inc_field)
Add autoincrement sequence.