Valider ef4cdcbc rédigé par marcimat's avatar marcimat
Parcourir les fichiers

Ticket #4353 : On adapte les champs déclarés 'TIMESTAMP' en mysql versions...

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.
parent 4c9b8e35
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -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;
+58 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -715,3 +715,59 @@ $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('');
}
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -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/"
+12 −4
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -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',
	);

	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;
}
+2 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -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
 */