Browse Source

Ticket #4353 : On adapte les champs déclarés 'TIMESTAMP' en mysql versions récentes (8 par exemple) afin qu’ils se comportent comme on les attends

dans SPIP, c’est à dire avec une mise à jour de la date à chaque update.
On migre les champs des tables connues.

Cependant, sur les tables crées auparavant avec une version de mysql récente, la colonne avec TIMESTAMP accepte les valeurs NULL et les accepte et en contient toujours après cette migration.
Il faudrait peut être une autre migration pour appliquer une valeur sur tous les NULL pour pouvoir enlever cette indication dans la déclarationd du champ que nous n’avions pas auparavant.
Autrement dit, on obtient 'TIMESTAMP NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP' à la place de 'TIMESTAMP default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'.
Mais ça ne doit pas être très gênant.
issue_admin_css
Matthieu Marcillaud 3 years ago
parent
commit
ef4cdcbce0
  1. 2
      ecrire/inc_version.php
  2. 60
      ecrire/maj/svn10000.php
  3. 2
      ecrire/paquet.xml
  4. 16
      ecrire/req/mysql.php
  5. 4
      ecrire/req/sqlite_generique.php

2
ecrire/inc_version.php

@ -432,7 +432,7 @@ define('_DEV_VERSION_SPIP_COMPAT',"3.2.99");
// (= numero SVN de leur derniere modif cassant la compatibilite et/ou necessitant un recalcul des squelettes)
$spip_version_code = 22653;
// version de la base SQL (= numero SVN de sa derniere modif)
$spip_version_base = 24351;
$spip_version_base = 24379;
// version de l'interface a la base
$spip_sql_version = 1;

60
ecrire/maj/svn10000.php

@ -670,7 +670,7 @@ $GLOBALS['maj'][21676] = array(
/**
* Ranger les images de local/cache-gd2 dans des sous-rep
*
*
* http://core.spip.net/issues/3277
*/
function ranger_cache_gd2() {
@ -714,4 +714,60 @@ $GLOBALS['maj'][24351] = [];
$tables_objets_sql = lister_tables_objets_sql();
foreach(array_keys($tables_objets_sql) as $table) {
$GLOBALS['maj'][24351][] = ['upgrade_logo_objet', objet_type($table)];
};
};
// adaptation des timestamp mysql
$GLOBALS['maj'][24379] = [['maj_timestamp_mysql']];
/**
* Mise à jour des bdd Mysql pour réparer les timestamp auto-update absents
*
* @uses base_lister_toutes_tables()
* @uses _mysql_remplacements_definitions_table()
**/
function maj_timestamp_mysql($tables = null) {
include_spip('base/dump');
if (is_null($tables)) {
$tables = base_lister_toutes_tables();
} elseif (is_string($tables)) {
$tables = [$tables];
} elseif (!is_array($tables)) {
return;
}
// rien a faire si base non mysql
if (strncmp($GLOBALS['connexions'][0]['type'], 'mysql', 5) !== 0) {
return;
}
$trouver_table = charger_fonction('trouver_table', 'base');
// forcer le vidage de cache
$trouver_table('');
foreach ($tables as $table) {
if (time() >= _TIME_OUT) {
return;
}
if ($desc = $trouver_table($table)) {
$fields_corrected = _mysql_remplacements_definitions_table($desc['field']);
$d = array_diff($desc['field'], $fields_corrected);
if ($d) {
spip_log("Table $table TIMESTAMP incorrect", "maj");
foreach ($desc['field'] as $field => $type) {
if ($desc['field'][$field] !== $fields_corrected[$field]) {
spip_log("Adaptation TIMESTAMP table $table", "maj." . _LOG_INFO_IMPORTANTE);
sql_alter("table $table change $field $field " . $fields_corrected[$field]);
$trouver_table('');
$new_desc = $trouver_table($table);
spip_log("Apres conversion $table : " . var_export($new_desc['field'], true),
"maj." . _LOG_INFO_IMPORTANTE);
}
}
}
}
}
// forcer le vidage de cache
$trouver_table('');
}

2
ecrire/paquet.xml

@ -4,7 +4,7 @@
version="3.3.0-dev"
etat="dev"
compatibilite="];["
schema="24351"
schema="24379"
documentation="https://www.spip.net"
demonstration="https://demo.spip.net"
developpement="https://core.spip.net/projects/spip/"

16
ecrire/req/mysql.php

@ -710,9 +710,9 @@ function spip_mysql_create(
/**
* Adapte pour Mysql la déclaration SQL d'une colonne d'une table
*
* @param string $query
* Définition SQL d'un champ de table
* @return string
* @param string|array $query
* Définition SQL d'un champ de table ou liste de déclarations
* @return string|array
* Définition SQL adaptée pour MySQL d'un champ de table
*/
function _mysql_remplacements_definitions_table($query) {
@ -722,9 +722,17 @@ function _mysql_remplacements_definitions_table($query) {
$remplace = array(
'/VARCHAR(\s*[^\s\(])/is' => 'VARCHAR(255)\\1',
'/^TIMESTAMP($| NULL DEFAULT NULL)/is' => 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP',
);
$query = preg_replace(array_keys($remplace), $remplace, $query);
if (is_string($query)) {
$query = preg_replace(array_keys($remplace), $remplace, $query);
} elseif (is_array($query)) {
$keys = array_keys($remplace);
foreach ($query as $k => $q) {
$query[$k] = preg_replace($keys, $remplace, $q);
}
}
return $query;
}

4
ecrire/req/sqlite_generique.php

@ -2422,9 +2422,9 @@ function _sqlite_ref_fonctions() {
/**
* $query est une requete ou une liste de champs
* Adapte les déclarations des champs pour SQLite
*
* @param $query
* @param string|array $query Déclaration d’un champ ou liste de déclarations de champs
* @param bool $autoinc
* @return mixed
*/

Loading…
Cancel
Save