$definition = db_definition($charset);
}
- // Ensure index conversion to unique removes duplicates
- $sql_config = "SET session old_alter_table=1;";
- if ($verbose) {
- echo $sql_config."\n";
- }
- if ($action) {
- $db->q($sql_config);
- }
-
// MySQL >= 5.7.4 doesn't support the IGNORE keyword in ALTER TABLE statements
if ((version_compare($db->server_info(), '5.7.4') >= 0) AND
!(strpos($db->server_info(), 'MariaDB') !== false)) {
}
$is_new_table = True;
} else {
+ $is_unique = false;
+ $temp_name = $name;
+
+ 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) {
+ if ($fieldnames[0] == "UNIQUE") {
+ $is_unique = true;
+ // Deactivated. See below for the reason
+ //if ($ignore == "") {
+ // $temp_name = "temp-".$name;
+ //}
+ }
+ }
+ }
+
/*
* Drop the index if it isn't present in the definition
* or the definition differ from current status
if ($current_index_definition != $new_index_definition && substr($indexname, 0, 6) != 'local_') {
$sql2=db_drop_index($indexname);
if ($sql3 == "") {
- $sql3 = "ALTER".$ignore." TABLE `".$name."` ".$sql2;
+ $sql3 = "ALTER".$ignore." TABLE `".$temp_name."` ".$sql2;
} else {
$sql3 .= ", ".$sql2;
}
if (!isset($database[$name]["fields"][$fieldname])) {
$sql2=db_add_table_field($fieldname, $parameters);
if ($sql3 == "") {
- $sql3 = "ALTER TABLE `".$name."` ".$sql2;
+ $sql3 = "ALTER TABLE `".$temp_name."` ".$sql2;
} else {
$sql3 .= ", ".$sql2;
}
if ($current_field_definition != $new_field_definition) {
$sql2=db_modify_table_field($fieldname, $parameters);
if ($sql3 == "") {
- $sql3 = "ALTER TABLE `".$name."` ".$sql2;
+ $sql3 = "ALTER TABLE `".$temp_name."` ".$sql2;
} else {
$sql3 .= ", ".$sql2;
}
$sql2=db_create_index($indexname, $fieldnames);
if ($sql2 != "") {
if ($sql3 == "")
- $sql3 = "ALTER" . $ignore . " TABLE `".$name."` ".$sql2;
+ $sql3 = "ALTER" . $ignore . " TABLE `".$temp_name."` ".$sql2;
else
$sql3 .= ", ".$sql2;
}
if ($sql3 != "") {
$sql3 .= ";";
- if ($verbose)
+ if ($verbose) {
+ // Ensure index conversion to unique removes duplicates
+ if ($is_unique) {
+ // By now the alternative is commented out.
+ // This is a preparation for the time when we found a good SQL routine.
+ //if ($ignore != "") {
+ echo "SET session old_alter_table=1;\n";
+ //} else {
+ // echo "CREATE TABLE `".$temp_name."` LIKE `".$name."`;\n";
+ //}
+ }
+
echo $sql3."\n";
+ if ($is_unique) {
+ // By now the alternative is commented out.
+ // This is a preparation for the time when we found a good SQL routine.
+ //if ($ignore != "") {
+ echo "SET session old_alter_table=0;\n";
+ //} else {
+ // echo "INSERT IGNORE INTO `".$temp_name."` SELECT * FROM `".$name."`;\n";
+ // echo "DROP TABLE `".$name."`;\n";
+ // echo "RENAME TABLE `".$temp_name."` TO `".$name."`;\n";
+ //}
+ }
+ }
+
if ($action) {
+ // Ensure index conversion to unique removes duplicates
+ if ($is_unique) {
+ // By now the alternative is commented out.
+ // This is a preparation for the time when we found a good SQL routine.
+ //if ($ignore != "") {
+ $db->q("SET session old_alter_table=1;");
+ //} else {
+ // $r = $db->q("CREATE TABLE `".$temp_name."` LIKE `".$name."`;");
+ // if (!dbm::is_result($r)) {
+ // $errors .= t('Errors encountered performing database changes.').$sql3.EOL;
+ // return $errors;
+ // }
+ //}
+ }
+
$r = @$db->q($sql3);
- if (dbm::is_result($r))
+ if (!dbm::is_result($r))
$errors .= t('Errors encountered performing database changes.').$sql3.EOL;
+
+ if ($is_unique) {
+ // By now the alternative is commented out.
+ // This is a preparation for the time when we found a good SQL routine.
+ //if ($ignore != "") {
+ $db->q("SET session old_alter_table=0;");
+ //} else {
+ // We have to check if "INSERT IGNORE" will work on newer MySQL versions
+ // $r = $db->q("INSERT IGNORE INTO `".$temp_name."` SELECT * FROM `".$name."`;");
+ // if (!dbm::is_result($r)) {
+ // $errors .= t('Errors encountered performing database changes.').$sql3.EOL;
+ // return $errors;
+ // }
+ // $r = $db->q("DROP TABLE `".$name."`;");
+ // if (!dbm::is_result($r)) {
+ // $errors .= t('Errors encountered performing database changes.').$sql3.EOL;
+ // return $errors;
+ // }
+ // $r = $db->q("RENAME TABLE `".$temp_name."` TO `".$name."`;");
+ // if (!dbm::is_result($r)) {
+ // $errors .= t('Errors encountered performing database changes.').$sql3.EOL;
+ // return $errors;
+ // }
+ //}
+ }
}
}
}
$database["addon"] = array(
"fields" => array(
"id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"),
- "name" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
+ "name" => array("type" => "varchar(190)", "not null" => "1", "default" => ""),
"version" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"installed" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"hidden" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
),
"indexes" => array(
"PRIMARY" => array("id"),
+ "name" => array("UNIQUE", "name"),
)
);
$database["attach"] = array(
"data" => array("type" => "longblob", "not null" => "1"),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"),
"edited" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"),
- "allow_cid" => array("type" => "text"),
- "allow_gid" => array("type" => "text"),
- "deny_cid" => array("type" => "text"),
- "deny_gid" => array("type" => "text"),
+ "allow_cid" => array("type" => "mediumtext"),
+ "allow_gid" => array("type" => "mediumtext"),
+ "deny_cid" => array("type" => "mediumtext"),
+ "deny_gid" => array("type" => "mediumtext"),
),
"indexes" => array(
"PRIMARY" => array("id"),
"addr_uid" => array("addr(32)", "uid"),
"nurl_uid" => array("nurl(32)", "uid"),
"nick_uid" => array("nick(32)", "uid"),
+ "dfrn-id" => array("dfrn-id"),
+ "issued-id" => array("issued-id"),
)
);
$database["conv"] = array(
"nofinish" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"adjust" => array("type" => "tinyint(1)", "not null" => "1", "default" => "1"),
"ignore" => array("type" => "tinyint(1) unsigned", "not null" => "1", "default" => "0"),
- "allow_cid" => array("type" => "text"),
- "allow_gid" => array("type" => "text"),
- "deny_cid" => array("type" => "text"),
- "deny_gid" => array("type" => "text"),
+ "allow_cid" => array("type" => "mediumtext"),
+ "allow_gid" => array("type" => "mediumtext"),
+ "deny_cid" => array("type" => "mediumtext"),
+ "deny_gid" => array("type" => "mediumtext"),
),
"indexes" => array(
"PRIMARY" => array("id"),
"indexes" => array(
"PRIMARY" => array("id"),
"addr" => array("addr(32)"),
+ "url" => array("url"),
)
);
$database["ffinder"] = array(
"name" => array("name(32)"),
"nick" => array("nick(32)"),
"addr" => array("addr(32)"),
+ "hide_network_updated" => array("hide", "network", "updated"),
"updated" => array("updated"),
)
);
),
"indexes" => array(
"PRIMARY" => array("id"),
+ "contactid" => array("contact-id"),
"gid_contactid" => array("gid", "contact-id"),
"uid_gid_contactid" => array("UNIQUE", "uid", "gid", "contact-id"),
)
),
"indexes" => array(
"PRIMARY" => array("id"),
- "hook_file_function" => array("hook(30)","file(60)","function(30)"),
+ "hook_file_function" => array("UNIQUE", "hook(50)","file(80)","function(60)"),
)
);
$database["intro"] = array(
),
"indexes" => array(
"PRIMARY" => array("id"),
- "uid_hash" => array("uid", "hash"),
+ "hash_uid" => array("hash", "uid"),
"seen_uid_date" => array("seen", "uid", "date"),
- "type_uid_link" => array("type", "uid", "link"),
"uid_date" => array("uid", "date"),
+ "uid_type_link" => array("uid", "type", "link"),
)
);
$database["notify-threads"] = array(
),
"indexes" => array(
"PRIMARY" => array("id"),
+ "uid_is-default" => array("uid", "is-default"),
)
);
$database["profile_check"] = array(
"expire_notification_sent" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"),
"service_class" => array("type" => "varchar(32)", "not null" => "1", "default" => ""),
"def_gid" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
- "allow_cid" => array("type" => "text"),
- "allow_gid" => array("type" => "text"),
- "deny_cid" => array("type" => "text"),
- "deny_gid" => array("type" => "text"),
+ "allow_cid" => array("type" => "mediumtext"),
+ "allow_gid" => array("type" => "mediumtext"),
+ "deny_cid" => array("type" => "mediumtext"),
+ "deny_gid" => array("type" => "mediumtext"),
"openidserver" => array("type" => "text"),
),
"indexes" => array(