/** * Creer une table, * ou ajouter les champs manquants si elle existe deja * * http://doc.spip.org/@creer_ou_upgrader_table * * @param string $table * @param array $desc * @param bool|string $autoinc * 'auto' pour detecter automatiquement si le champ doit etre autoinc ou non * en fonction de la table * @param bool $upgrade * @param string $serveur * @return void */ function creer_ou_upgrader_table($table, $desc, $autoinc, $upgrade = false, $serveur = '') { $sql_desc = $upgrade ? sql_showtable($table, true, $serveur) : false; if (!$sql_desc) { if ($autoinc === 'auto') { $autoinc = base_determine_autoinc($table, $desc); } sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur); } else { // ajouter les champs manquants // on ne supprime jamais les champs, car c'est dangereux // c'est toujours a faire manuellement $last = ''; foreach ($desc['field'] as $field => $type) { if (!isset($sql_desc['field'][$field])) { sql_alter("TABLE {$table} ADD {$field} {$type}" . ($last ? " AFTER {$last}" : ""), $serveur); } $last = $field; } foreach ($desc['key'] as $key => $type) { // Ne pas oublier les cas des cles non nommees dans la declaration et qui sont retournees // par le showtable sous la forme d'un index de tableau "KEY $type" et non "KEY" if (!isset($sql_desc['key'][$key]) and !isset($sql_desc['key']["{$key} {$type}"])) { sql_alter("TABLE {$table} ADD {$key} ({$type})", $serveur); } $last = $field; } } }
/** * Créer une table, * ou ajouter les champs manquants si elle existe déjà * * @param string $table * @param array $desc * @param bool|string $autoinc * 'auto' pour detecter automatiquement si le champ doit etre autoinc ou non * en fonction de la table * @param bool $upgrade * @param string $serveur * @return void */ function creer_ou_upgrader_table($table, $desc, $autoinc, $upgrade = false, $serveur = '') { #spip_log("creer_ou_upgrader_table table=$table autoinc=$autoinc upgrade=$upgrade","dbinstall"._LOG_INFO_IMPORTANTE); $sql_desc = $upgrade ? sql_showtable($table, true, $serveur) : false; #if (!$sql_desc) $sql_desc = false; #spip_log("table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE); if (!$sql_desc) { if ($autoinc === 'auto') { $autoinc = base_determine_autoinc($table, $desc); } #spip_log("sql_create $table autoinc=$autoinc","dbinstall"._LOG_INFO_IMPORTANTE); sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur); // verifier la bonne installation de la table (php-fpm es-tu la ?) $sql_desc = sql_showtable($table, true, $serveur); #if (!$sql_desc) $sql_desc = false; #spip_log("Resultat table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE); if (!$sql_desc) { // on retente avec un sleep ? sleep(1); sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur); $sql_desc = sql_showtable($table, true, $serveur); #if (!$sql_desc) $sql_desc = false; #spip_log("Resultat table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE); if (!$sql_desc) { spip_log("Echec creation table {$table}", "maj" . _LOG_CRITIQUE); } } } else { #spip_log("sql_alter $table ... (on s'en fiche)","dbinstall"._LOG_INFO_IMPORTANTE); // ajouter les champs manquants // on ne supprime jamais les champs, car c'est dangereux // c'est toujours a faire manuellement $last = ''; foreach ($desc['field'] as $field => $type) { if (!isset($sql_desc['field'][$field])) { sql_alter("TABLE {$table} ADD {$field} {$type}" . ($last ? " AFTER {$last}" : ""), $serveur); } $last = $field; } foreach ($desc['key'] as $key => $type) { // Ne pas oublier les cas des cles non nommees dans la declaration et qui sont retournees // par le showtable sous la forme d'un index de tableau "KEY $type" et non "KEY" if (!isset($sql_desc['key'][$key]) and !isset($sql_desc['key']["{$key} {$type}"])) { sql_alter("TABLE {$table} ADD {$key} ({$type})", $serveur); } $last = $field; } } }
function insere_1_init($request) { // table des translations $res = insere_1bis_init($request); $desc = $GLOBALS['tables_principales'][_SPIP_TRANSLATE]; $v = sql_create(_SPIP_TRANSLATE, $desc['field'], $desc['key'], true); if (!$v) { spip_log("echec de la creation de la table de fusion"); return false; } // au cas ou la derniere fois ce serait terminee anormalement $d = sql_delete(_SPIP_TRANSLATE); spip_log("init " . _SPIP_TRANSLATE . " : $d"); return $res; }
function creer_ou_upgrader_table($table,$desc,$autoinc,$upgrade=false,$serveur='') { $sql_desc = $upgrade ? sql_showtable($table,true,$serveur) : false; if (!$sql_desc) sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur); else { // ajouter les champs manquants $last = ''; foreach($desc['field'] as $field=>$type){ if (!isset($sql_desc['field'][$field])) sql_alter("TABLE $table ADD $field $type".($last?" AFTER $last":""),$serveur); $last = $field; } foreach($desc['key'] as $key=>$type){ if (!isset($sql_desc['key'][$key])) sql_alter("TABLE $table ADD $key ($type)",$serveur); $last = $field; } } }
function maj_1_950($installee) { // oubli de gerer le prefixe lors l'introduction de l'abstraction // => Relancer les MAJ concernees si la version dont on part les avait fait if ($installee >= 1.946) { serie_alter('950a', $GLOBALS['maj'][1946]); } if ($installee >= 1.947) { serie_alter('950b', $GLOBALS['maj'][1947]); } if ($installee >= 1.949) { @serie_alter('950c', $GLOBALS['maj'][1949]); } global $tables_auxiliaires; include_spip('base/auxiliaires'); $v = $tables_auxiliaires[$k = 'spip_urls']; sql_create($k, $v['field'], $v['key'], false, false); foreach (array('article' => 'id_article', 'rubrique' => 'id_rubrique', 'breve' => 'id_breve', 'auteur' => 'id_auteur', 'mot' => 'id_mot', 'syndic' => 'id_syndic') as $type => $id_objet) { $table = $type == 'syndic' ? $type : $type . "s"; $date = $type == 'breve' ? 'date_heure' : ($type == 'auteur' ? 'maj' : ($type == 'mot' ? 'maj' : 'date')); $q = @sql_select("url_propre AS url, {$id_objet} AS id_objet, '{$type}' AS type, {$date} as date", "spip_{$table}", "url_propre<>''"); if (!$q) { return; } // anormal, mais ne pas boucler en erreur while ($r = sql_fetch($q)) { sql_replace('spip_urls', $r); } spip_log("table {$table} : " . sql_count($q) . " urls propres copiees"); sql_alter("TABLE spip_{$table} DROP INDEX `url_propre`"); sql_alter("TABLE spip_{$table} DROP `url_propre`"); } }
/** * Mise à jour 12008 : Réunir en une seule table les liens de documents * spip_documents_articles et spip_documents_forum */ function maj_12008() { // Creer spip_documents_liens global $tables_auxiliaires; include_spip('base/auxiliaires'); $v = $tables_auxiliaires[$k = 'spip_documents_liens']; sql_create($k, $v['field'], $v['key'], false, false); // Recopier les donnees foreach (array('article', 'breve', 'rubrique', 'auteur', 'forum') as $l) { if ($s = sql_select('*', 'spip_documents_' . $l . 's') or $s = sql_select('*', 'spip_documents_' . $l)) { $tampon = array(); while ($t = sql_fetch($s)) { // transformer id_xx=N en (id_objet=N, objet=xx) $t['id_objet'] = $t["id_{$l}"]; $t['objet'] = $l; unset($t["id_{$l}"]); unset($t['maj']); $tampon[] = $t; if (count($tampon) > 10000) { sql_insertq_multi('spip_documents_liens', $tampon); $tampon = array(); } } if (count($tampon)) { sql_insertq_multi('spip_documents_liens', $tampon); } } } }
/** * Marquer la procédure de dump comme finie * * @param string $status_file * Fichier qui mémorise les infos utiles concernant la sauvegarde en cours * @param string $action * Type d'action supplémentaire à réaliser : * * - restaurer : supprimer la structure qui était stockée dans le dump * - 'auvegarder : stocker dans le dump la structure de la base source */ function dump_end($status_file, $action = '') { $status_file = _DIR_TMP . basename($status_file) . ".txt"; if (!lire_fichier($status_file, $status) or !($status = unserialize($status))) { return; } switch ($action) { case 'restaurer': // supprimer la structure qui etait stockee dans le dump sql_delete('spip_meta', "nom='dump_structure_temp'"); break; case 'sauvegarder': // stocker dans le dump la structure de la base source $structure = array(); foreach ($status['tables_copiees'] as $t => $n) { $structure[$t] = sql_showtable($t, true); } dump_serveur($status['connect']); spip_connect('dump'); // si spip_meta n'a pas ete backup elle n'est pas dans le dump, il faut la creer pour y stocker cette meta if (!sql_showtable("spip_meta", true, "dump")) { $desc = sql_showtable("spip_meta", true); sql_create("spip_meta", $desc['field'], $desc['key'], false, false, "dump"); } sql_delete('spip_meta', "nom='dump_structure_temp'", 'dump'); #enlever une vieille structure deja la, au cas ou sql_insertq('spip_meta', array('nom' => 'dump_structure_temp', 'valeur' => serialize($structure), 'impt' => 'non'), array(), 'dump'); break; } $status['etape'] = 'fini'; ecrire_fichier($status_file, serialize($status)); }
function upgrade_test() { sql_drop_table("spip_test", true); sql_create("spip_test", array('a' => 'int')); sql_alter("TABLE spip_test ADD b INT"); sql_insertq('spip_test', array('b' => 1), array('field'=>array('b' => 'int'))); $result = sql_select('b', "spip_test"); // ne pas garder le resultat de la requete sinon sqlite3 // ne peut pas supprimer la table spip_test lors du sql_alter qui suit // car cette table serait alors 'verouillee' $result = $result?true:false; sql_alter("TABLE spip_test DROP b"); return $result; }