Skip to content
Extraits de code Groupes Projets
Valider 52d663ef rédigé par esj's avatar esj
Parcourir les fichiers

#209: adaptation des fonctions de fusions de base de données pour PG....

#209: adaptation des fonctions de fusions de base de données pour PG. L'abstraction de l'insertion dans '''sql_insert''' n'a finalement pas besoin de l'argument Ignore puisque PG n'a pas cette option, ce paramètre inutilisé est reconverti comme recevant la description de la table (pas utilisé dans le code pour le moment). Ca ne marche pas encore en PG car le '''RETURNING''' pour obtenir le numéro de la dernière n'accepte pas qu'on lui donne un clé primaire multiple, il faut probablement déclarer explicitement une ''sequence'' PG ici.

Incidemment MySQL5 et PG refusent une syntaxe que MySQL4 acceptait, c'est réparé. Et le script est un peu plus blindé en amont en refusant d'insérer les tables pour lesquelles les règles de fusion ne sont pas encore définies.
parent 628a1a2d
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -103,10 +103,10 @@ function sql_free($res, $serveur='')
}
// http://doc.spip.org/@sql_insert
function sql_insert($table, $noms, $valeurs, $serveur='')
function sql_insert($table, $noms, $valeurs, $desc=array(), $serveur='')
{
$f = sql_serveur('insert', $serveur);
return $f($table, $noms, $valeurs);
return $f($table, $noms, $valeurs, $desc);
}
// http://doc.spip.org/@sql_update
......@@ -157,7 +157,7 @@ function sql_multi($sel, $lang, $serveur='')
}
// http://doc.spip.org/@sql_error
function sql_error($query, $serveur='') {
function sql_error($query='requete inconnue', $serveur='') {
$f = sql_serveur('error', $serveur);
return $f($query);
}
......
......@@ -352,8 +352,8 @@ function spip_mysql_free($r) {
}
// http://doc.spip.org/@spip_mysql_insert
function spip_mysql_insert($table, $champs, $valeurs, $ignore='') {
if (!spip_mysql_query("INSERT $ignore INTO $table $champs VALUES $valeurs"))
function spip_mysql_insert($table, $champs, $valeurs, $desc='') {
if (!spip_mysql_query("INSERT INTO $table $champs VALUES $valeurs"))
return 0;
$r = mysql_insert_id();
return $r ? $r : (($r===0) ? -1 : 0);
......
......@@ -297,25 +297,31 @@ function spip_pg_free($res, $serveur='') {
}
// http://doc.spip.org/@spip_pg_insert
function spip_pg_insert($table, $champs, $valeurs, $ignore='') {
global $tables_principales;
function spip_pg_insert($table, $champs, $valeurs, $desc=array()) {
global $spip_pg_link, $table_prefix;
include_spip('base/serial');
if (isset($tables_principales[$table]['key']["PRIMARY KEY"]))
$ret = " RETURNING "
. $tables_principales[$table]['key']["PRIMARY KEY"];
if (!$desc) {
global $tables_principales;
include_spip('base/serial');
$desc = @$tables_principales[$table];
}
if (isset($desc['key']["PRIMARY KEY"]))
$ret = " RETURNING " . $desc['key']["PRIMARY KEY"];
else $ret = '';
if ($GLOBALS['table_prefix'])
$table = preg_replace('/^spip/',
$GLOBALS['table_prefix'],
$table);
$r = pg_query("INSERT INTO $table $champs VALUES $valeurs $ret");
if (!$r) return 0;
if (!$ret) return -1;
$r = pg_fetch_array($r, NULL, PGSQL_NUM);
$r = pg_query($q="INSERT INTO $table $champs VALUES $valeurs $ret");
if ($r) {
if (!$ret) return 0;
if ($r = pg_fetch_array($r, NULL, PGSQL_NUM))
return $r[0];
}
spip_log("Erreur $q", 'pg'); // trace a minima
return -1;
return $r[0];
}
// http://doc.spip.org/@spip_pg_update
......
......@@ -12,22 +12,30 @@
if (!defined("_ECRIRE_INC_VERSION")) return;
// http://doc.spip.org/@insere_1_init
function insere_1_init($request) {
// table des translations
// preparation de la table des translations
$spip_translate = array(
$spip_translate = array(
"type" => "VARCHAR(16) NOT NULL",
"ajout" => "ENUM('0', '1')",
"titre" => "text NOT NULL",
"id_old" => "BIGINT (21) DEFAULT '0' NOT NULL",
"id_new" => "BIGINT (21) DEFAULT '0' NOT NULL");
$spip_translate_key = array(
$spip_translate_key = array(
"PRIMARY KEY" => "id_old, id_new, type",
"KEY id_old" => "id_old");
spip_mysql_create('spip_translate', $spip_translate, $spip_translate_key, true);
// La rajouter ici car sql_insert en a besoin
global $tables_principales;;
$tables_principales['spip_translate'] =
array('field' => &$spip_translate, 'key' => &$spip_translate_key, 'join' => &$spip_signatures_join);
// http://doc.spip.org/@insere_1_init
function insere_1_init($request) {
global $tables_principales;
$v = $tables_principales['spip_translate'];
sql_create('spip_translate', $v['field'], $v['key'], true);
// au cas ou la derniere fois ce serait terminee anormalement
spip_query("DELETE FROM spip_translate");
return insere_1bis_init($request);
......@@ -40,6 +48,12 @@ function insere_1bis_init($request) {
$t = array_keys($GLOBALS['tables_principales']);
// ... mais pas cette table a cause de la duplication des login
unset($t[array_search('spip_auteurs', $t)]);
// ni celle-ci, les qui est liee implicitement a la precedente
unset($t[array_search('spip_messages', $t)]);
// et pour celles-ci restent à programmer les regles
unset($t[array_search('spip_forum', $t)]);
unset($t[array_search('spip_syndic', $t)]);
unset($t[array_search('spip_signatures', $t)]);
return $t;
}
......@@ -87,19 +101,18 @@ function translate_init($request) {
// http://doc.spip.org/@import_insere
function import_insere($values, $table, $desc, $request, $atts) {
static $jesais = array();
$type_id = $desc['key']["PRIMARY KEY"];
// reserver une place dans les tables principales si nouveau
$ajout = 0;
if ((!function_exists($f = 'import_identifie_' . $type_id))
OR (!($n = $f($values, $table, $desc, $request)))) {
// pas d'importation de types_doc (a revoir)
// pas d'importation de types_doc (a revoir)
if ($table == 'spip_types_documents') return;
$n = sql_insert($table, '', '()');
if (!$n) {
$GLOBALS['erreur_restauration'] = sql_error();
return;
}
$ajout = 1;
$n = sql_insert($table, '()', '()');
$ajout=1;
}
if (is_array($n))
......@@ -107,7 +120,7 @@ function import_insere($values, $table, $desc, $request, $atts) {
else {$id = $n; $titre = "";}
sql_insert('spip_translate',
"(id_old, id_new, titre, type, ajout)",
"(". $values[$type_id] .",$id, " . _q($titre) . ", '$type_id', '$ajout')");
"(". $values[$type_id] .",$id, " . _q($titre) . ", '$type_id', $ajout)");
}
// Renumerotation des entites collectees
......@@ -131,14 +144,13 @@ function import_translate($values, $table, $desc, $request, $atts) {
// Une synchronisation plus fine serait preferable, cf [8004]
// http://doc.spip.org/@import_inserer_translate
function import_inserer_translate($values, $table, $desc, $request, $vals, $atts) {
function import_inserer_translate($values, $table, $desc, $request, $atts) {
global $trans;
$p = $desc['key']["PRIMARY KEY"];
$v = $values[$p];
if (!isset($trans[$p]) OR !isset($trans[$p][$v]) OR $trans[$p][$v][2]){
spip_query("REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .substr($vals,1) . ')');
sql_replace($table, $values, $desc);
$on = isset($atts['on']) ? ($atts['on']) : '';
$off = isset($atts['off']) ? ($atts['off']) : '';
if ($on OR $off) {
......@@ -164,19 +176,15 @@ function import_inserer_translate($values, $table, $desc, $request, $vals, $atts
// http://doc.spip.org/@import_translate_std
function import_translate_std($values, $table, $desc, $request, $atts) {
$vals = '';
foreach ($values as $k => $v) {
if ($k=='id_parent' OR $k=='id_secteur')
$k = 'id_rubrique';
else if (($k=='chapo') AND ($v[0]=='=') AND preg_match(_RACCOURCI_CHAPO, substr($v,1), $m))
$v = '=[->' . substr($v,1) . ']';
$v = importe_raccourci($k,importe_translate_maj($k, $v));
$vals .= "," . _q($v);
$values[$k]= importe_raccourci($k,importe_translate_maj($k, $v));
}
import_inserer_translate($values, $table, $desc, $request, $vals, $atts);
import_inserer_translate($values, $table, $desc, $request, $atts);
}
// http://doc.spip.org/@import_translate_spip_documents
......@@ -188,14 +196,13 @@ function import_translate_spip_documents($values, $table, $desc, $request, $atts
# $url .= $atts['dir_img']; // deja dans la BD importee
$values['distant']= 'oui';
$vals = '';
foreach ($values as $k => $v) {
if ($k=='fichier')
$v = $url .$v;
else $v = importe_raccourci($k,importe_translate_maj($k, $v));
$vals .= "," . _q($v);
$values[]= $v;
}
import_inserer_translate($values, $table, $desc, $request, $vals, $atts);
import_inserer_translate($values, $table, $desc, $request, $atts);
}
// Fonction de renumerotation, par delegation aux fonction specialisees
......@@ -308,7 +315,7 @@ function import_identifie_parent_id_mot($id_groupe, $titre, $v)
$r = sql_fetch(spip_query("SELECT id_mot FROM spip_mots WHERE titre=$titre AND id_groupe=$new" ));
if ($r) return (0 - $r['id_mot']);
}
$r = sql_insert('spip_mots', '', '()');
$r = sql_insert('spip_mots', '()', '()');
spip_query("REPLACE spip_translate (id_old, id_new, titre, type, ajout) VALUES ($v,$r,$titre,'id_mot',1)");
return $r;
}
......@@ -330,7 +337,7 @@ function import_identifie_parent_id_article($id_parent, $titre, $v)
$r = sql_fetch(spip_query("SELECT id_article FROM spip_articles WHERE titre=$titre AND id_rubrique=$id_parent AND statut<>'poubelle'" ));
if ($r) return (0 - $r['id_article']);
$r = sql_insert('spip_articles', '', '()');
$r = sql_insert('spip_articles', '()', '()');
spip_query("REPLACE spip_translate (id_old, id_new, titre, type, ajout) VALUES ($v,$r,$titre,'id_article',1)");
return $r;
}
......@@ -352,7 +359,7 @@ function import_identifie_parent_id_breve($id_parent, $titre, $v)
$r = sql_fetch(spip_query("SELECT id_breve FROM spip_breves WHERE titre=$titre AND id_rubrique=$id_parent AND statut<>'refuse'" ));
if ($r) return (0 - $r['id_breve']);
$r = sql_insert('spip_breves', '', '()');
$r = sql_insert('spip_breves', '()', '()');
spip_query("REPLACE spip_translate (id_old, id_new, titre, type, ajout) VALUES ($v,$r,$titre,'id_breve',1)");
return $r;
}
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter