diff --git a/include/dbstructure.php b/include/dbstructure.php index 2078c208a2..851eb23284 100644 --- a/include/dbstructure.php +++ b/include/dbstructure.php @@ -142,24 +142,36 @@ function update_structure($verbose, $action, $tables=null, $definition=null) { if (is_null($definition)) $definition = db_definition(); + // Compare it foreach ($definition AS $name => $structure) { + $is_new_table = False; $sql3=""; if (!isset($database[$name])) { - $r = db_create_table($name, $structure["fields"], $verbose, $action); - if(false === $r) + $r = db_create_table($name, $structure["fields"], $verbose, $action, $structure['indexes']); + if(false === $r) { $errors .= t('Errors encountered creating database tables.').$name.EOL; + } + $is_new_table = True; } else { - // Drop the index if it isn't present in the definition and index name doesn't start with "local_" - foreach ($database[$name]["indexes"] AS $indexname => $fieldnames) - if (!isset($structure["indexes"][$indexname]) && substr($indexname, 0, 6) != 'local_') { + // Drop the index if it isn't present in the definition + // or the definition differ from current status + // and index name doesn't start with "local_" + foreach ($database[$name]["indexes"] AS $indexname => $fieldnames) { + $current_index_definition = implode(",",$fieldnames); + if (isset($structure["indexes"][$indexname])) { + $new_index_definition = implode(",",$structure["indexes"][$indexname]); + } else { + $new_index_definition = "__NOT_SET__"; + } + if ($current_index_definition != $new_index_definition && substr($indexname, 0, 6) != 'local_') { $sql2=db_drop_index($indexname); if ($sql3 == "") $sql3 = "ALTER TABLE `".$name."` ".$sql2; else $sql3 .= ", ".$sql2; } - + } // Compare the field structure field by field foreach ($structure["fields"] AS $fieldname => $parameters) { if (!isset($database[$name]["fields"][$fieldname])) { @@ -184,19 +196,28 @@ function update_structure($verbose, $action, $tables=null, $definition=null) { } } - // Create the index - foreach ($structure["indexes"] AS $indexname => $fieldnames) { - if (!isset($database[$name]["indexes"][$indexname])) { - $sql2=db_create_index($indexname, $fieldnames); - if ($sql2 != "") { - if ($sql3 == "") - $sql3 = "ALTER TABLE `".$name."` ".$sql2; - else - $sql3 .= ", ".$sql2; + // Create the index if the index don't exists in database + // or the definition differ from the current status. + // Don't create keys if table is new + if (!$is_new_table) { + foreach ($structure["indexes"] AS $indexname => $fieldnames) { + if (isset($database[$name]["indexes"][$indexname])) { + $current_index_definition = implode(",",$database[$name]["indexes"][$indexname]); + } else { + $current_index_definition = "__NOT_SET__"; + } + $new_index_definition = implode(",",$fieldnames); + if ($current_index_definition != $new_index_definition) { + $sql2=db_create_index($indexname, $fieldnames); + if ($sql2 != "") { + if ($sql3 == "") + $sql3 = "ALTER TABLE `".$name."` ".$sql2; + else + $sql3 .= ", ".$sql2; + } } } } - if ($sql3 != "") { $sql3 .= ";"; @@ -230,8 +251,8 @@ function db_field_command($parameters, $create = true) { if ($parameters["extra"] != "") $fieldstruct .= " ".$parameters["extra"]; - if (($parameters["primary"] != "") AND $create) - $fieldstruct .= " PRIMARY KEY"; + /*if (($parameters["primary"] != "") AND $create) + $fieldstruct .= " PRIMARY KEY";*/ return($fieldstruct); } @@ -242,13 +263,17 @@ function db_create_table($name, $fields, $verbose, $action, $indexes=null) { $r = true; $sql = ""; + $sql_rows = array(); + $primary_keys = array(); foreach($fields AS $fieldname => $field) { $sql_rows[] = "`".dbesc($fieldname)."` ".db_field_command($field); + if (x($field,'primary') and $field['primary']!=''){ + $primary_keys[] = $fieldname; + } } if (!is_null($indexes)) { - foreach ($indexes AS $indexname => $fieldnames) { $sql_index = db_create_index($indexname, $fieldnames, ""); if (!is_null($sql_index)) $sql_rows[] = $sql_index; @@ -258,7 +283,6 @@ function db_create_table($name, $fields, $verbose, $action, $indexes=null) { $sql = implode(",\n\t", $sql_rows); $sql = sprintf("CREATE TABLE IF NOT EXISTS `%s` (\n\t", dbesc($name)).$sql."\n) DEFAULT CHARSET=utf8"; - if ($verbose) echo $sql.";\n"; @@ -285,8 +309,16 @@ function db_drop_index($indexname) { function db_create_index($indexname, $fieldnames, $method="ADD") { - if ($indexname == "PRIMARY") - return; + $method = strtoupper(trim($method)); + if ($method!="" && $method!="ADD") { + throw new Exception("Invalid parameter 'method' in db_create_index(): '$method'"); + killme(); + } + + + if ($indexname == "PRIMARY") { + return sprintf("%s PRIMARY KEY(`%s`)", $method, implode("`,`", $fieldnames)); + } $names = ""; foreach ($fieldnames AS $fieldname) { @@ -299,11 +331,6 @@ function db_create_index($indexname, $fieldnames, $method="ADD") { $names .= "`".dbesc($fieldname)."`"; } - $method = strtoupper(trim($method)); - if ($method!="" && $method!="ADD") { - throw new Exception("Invalid parameter 'method' in db_create_index(): '$method'"); - killme(); - } $sql = sprintf("%s INDEX `%s` (%s)", $method, dbesc($indexname), $names); return($sql);