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

#209: les différents serveurs SQL n'ayant pas toujours la même syntaxe pour...

#209: les différents serveurs SQL n'ayant pas toujours la même syntaxe pour les constantes, il faut confier aux fonctions d'abstractions leur représentation. Le problème se pose surtout pour l'instruction UPDATE. En conséquence, introduction d'un variante d'abstraction, '''sql_updateq''' qui reçoit un nom de table SQL, un tableau  ''champ => valeur'' et le descripteur de la table (qui peut être omise s'il s'agit d'une des tables principales), construit la représentation des constantes en fonction de leur type déclaré et effectue la requête. Pour les types '''datetime''' et '''timestamp''', les valeurs numériques sont considérées comme des dates, les autres comme une expression de date MySQL (NOW(), DATE_SUB etc), converties dans leur équivalent PG dans la version SPIP-PG. Une valeur numérique sera mise en apostrophes si le champ déclaré n'est pas numérique (contrairement à ce que fait '''_q()''' qui n'a pas l'information) mais exceptionnellement PG n'avait pas besoin de ça: un entier affecté à un texte y est converti en sa représentation comme en MySQL.

Utilisation dans action/logout (seul endroit où on utilisait la fonction d'abstraction de update) et dans l'edition d'un article pour commencer. Reste à reporter partout où PG l'exige (il ne semble pas y en avoir tant que ça) voire partout pour être propre.
parent 0934678c
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -25,17 +25,17 @@ function action_editer_article_dist() {
$id_auteur = $GLOBALS['auteur_session']['id_auteur'];
if (!($id_parent AND $id_auteur))
redirige_par_entete(generer_url_ecrire());
$id_article = insert_article($id_parent);
if (($id_article = insert_article($id_parent)) > 0)
# cf. GROS HACK ecrire/inc/getdocument
# rattrapper les documents associes a cet article nouveau
# ils ont un id = 0-id_auteur
spip_query("UPDATE spip_documents_articles SET id_article = $id_article WHERE id_article = ".(0-$id_auteur));
spip_query("UPDATE spip_documents_articles SET id_article = $id_article WHERE id_article = ".(0-$id_auteur));
}
// Enregistre l'envoi dans la BD
$err = articles_set($id_article);
if ($id_article > 0) $err = articles_set($id_article);
$redirect = parametre_url(urldecode(_request('redirect')),
'id_article', $id_article, '&') . $err;
......@@ -276,13 +276,9 @@ function editer_article_heritage($id_article, $id_rubrique, $statut, $champs, $c
if ($row) $champs['lang='] = $langue;
}
$update = array();
foreach ($champs as $champ => $val)
$update[] = $champ . '=' . _q($val);
if (!$champs) return;
if (!count($update)) return;
spip_query("UPDATE spip_articles SET ".join(', ', $update)." WHERE id_article=$id_article");
sql_updateq('spip_articles', $champs, "id_article=$id_article");
// Changer le statut des rubriques concernees
......@@ -330,7 +326,7 @@ function article_referent ($id_article, $c) {
if ($id_lier == 0) {
spip_query("UPDATE spip_articles SET id_trad = $lier_trad WHERE id_article IN ($lier_trad, $id_article)");
}
// sinon on ajouter notre article dans le groupe
// sinon ajouter notre article dans le groupe
else {
spip_query("UPDATE spip_articles SET id_trad = $id_lier WHERE id_article = $id_article");
}
......
......@@ -28,7 +28,9 @@ function action_logout_dist()
// seul le loge peut se deloger (mais id_auteur peut valoir 0 apres une restauration avortee)
if (is_numeric($auteur_session['id_auteur'])) {
include_spip('base/abstract_sql');
sql_update('spip_auteurs', "en_ligne = DATE_SUB(NOW(),INTERVAL 15 MINUTE)", "id_auteur=".$auteur_session['id_auteur']);
sql_updateq('spip_auteurs',
array('en_ligne' => 'DATE_SUB(NOW(),INTERVAL 15 MINUTE)'),
"id_auteur=" . $auteur_session['id_auteur']);
// le logout explicite vaut destruction de toutes les sessions
if (isset($_COOKIE['spip_session'])) {
$session = charger_fonction('session', 'inc');
......
......@@ -110,10 +110,20 @@ function sql_insert($table, $noms, $valeurs, $desc=array(), $serveur='')
}
// http://doc.spip.org/@sql_update
function sql_update($table, $exp, $where, $serveur='')
function sql_update($table, $exp, $where='', $desc=array(), $serveur='')
{
$f = sql_serveur('update', $serveur);
return $f($table, $exp, $where);
return $f($table, $exp, $where, $desc);
}
// Update est presque toujours appelee sur des constantes ou des dates
// Cette fonction est donc plus utile que la precedente,d'autant qu'elle
// permet de gerer les differences de representation des constantes.
// http://doc.spip.org/@sql_update
function sql_updateq($table, $exp, $where='', $desc=array(), $serveur='')
{
$f = sql_serveur('updateq', $serveur);
return $f($table, $exp, $where, $desc);
}
// http://doc.spip.org/@sql_delete
......@@ -124,10 +134,10 @@ function sql_delete($table, $where, $serveur='')
}
// http://doc.spip.org/@sql_replace
function sql_replace($table, $values, $keys, $serveur='')
function sql_replace($table, $values, $desc=array(), $serveur='')
{
$f = sql_serveur('replace', $serveur);
return $f($table, $values, $keys);
return $f($table, $values, $desc);
}
// http://doc.spip.org/@sql_showtable
......
......@@ -360,8 +360,37 @@ function spip_mysql_insert($table, $champs, $valeurs, $desc='') {
}
// http://doc.spip.org/@spip_mysql_update
function spip_mysql_update($table, $exp, $where='') {
spip_mysql_query("UPDATE $table SET $exp" . ($where ? " WHERE $where" : ''));
function spip_mysql_update($table, $champs, $where='', $desc='') {
$r = '';
foreach ($champs as $champ => $val)
$r .= ',' . $champ . "=$val";
if ($r = substr($r, 1))
spip_mysql_query("UPDATE $table SET $r" . ($where ? " WHERE $where" : ''));
}
// idem, mais les valeurs sont des constantes a mettre entre apostrophes
// sauf les expressions de date lorsqu'il s'agit de fonctions SQL (NOW etc)
// http://doc.spip.org/@spip_mysql_update
function spip_mysql_updateq($table, $champs, $where='', $desc=array()) {
if (!$champs) return;
if (!$desc) {
global $tables_principales;
include_spip('base/serial');
$desc = $tables_principales[$table];
}
$fields = $desc['field'];
$r = '';
foreach ($champs as $champ => $val) {
$t = $fields[$champ];
if (((strpos($t, 'datetime')!==0)
AND (strpos($t, 'TIMESTAMP')!==0))
OR strpos("012345678", $val[0]) !==false)
$val = _q($val);
$r .= ',' . $champ . '=' . $val;
}
$r = "UPDATE $table SET " . substr($r, 1) . ($where ? " WHERE $where" : '');
spip_mysql_query($r);
}
// http://doc.spip.org/@spip_mysql_delete
......
......@@ -228,7 +228,6 @@ function spip_pg_fromfield($arg)
$index = $m[2];
foreach($r[1] as $v) {
$n++;
spip_log($v);
$res .= "\nwhen $index=$v then $n";
}
$arg = $m[1] . "case $res else 0 end "
......@@ -296,6 +295,16 @@ function spip_pg_free($res, $serveur='') {
// rien faire en postgres
}
// http://doc.spip.org/@spip_pg_delete
function spip_pg_delete($table, $where='') {
global $spip_pg_link, $table_prefix;
if ($GLOBALS['table_prefix'])
$table = preg_replace('/^spip/',
$GLOBALS['table_prefix'],
$table);
spip_pg_trace_query("DELETE FROM $table " . ($where ? (" WHERE " . spip_pg_frommysql($where)) : ''));
}
// http://doc.spip.org/@spip_pg_insert
function spip_pg_insert($table, $champs, $valeurs, $desc=array()) {
......@@ -317,7 +326,7 @@ function spip_pg_insert($table, $champs, $valeurs, $desc=array()) {
$table = preg_replace('/^spip/',
$GLOBALS['table_prefix'],
$table);
$r = pg_query($q="INSERT INTO $table $champs VALUES $valeurs $ret");
$r = pg_query($spip_pg_link, $q="INSERT INTO $table $champs VALUES $valeurs $ret");
if ($r) {
if (!$ret) return 0;
if ($r = pg_fetch_array($r, NULL, PGSQL_NUM))
......@@ -329,23 +338,55 @@ function spip_pg_insert($table, $champs, $valeurs, $desc=array()) {
}
// http://doc.spip.org/@spip_pg_update
function spip_pg_update($table, $exp, $where='') {
function spip_pg_update($table, $champs, $where='', $desc=array()) {
global $spip_pg_link, $table_prefix;
if ($GLOBALS['table_prefix'])
$table = preg_replace('/^spip/',
$r = '';
foreach ($champs as $champ => $val) {
$r .= ',' . $champ . '=' .
spip_pg_cite($val, $desc['field'][$champ]);
}
if ($r = substr($r, 1)) {
if ($GLOBALS['table_prefix'])
$table = preg_replace('/^spip/',
$GLOBALS['table_prefix'],
$table);
spip_pg_trace_query("UPDATE $table SET " . spip_pg_frommysql($exp) .($where ? (" WHERE " . spip_pg_frommysql($where)) : ''));
spip_pg_trace_query("UPDATE $table SET $r" .($where ? (" WHERE " . spip_pg_frommysql($where)) : ''));
}
}
// http://doc.spip.org/@spip_pg_delete
function spip_pg_delete($table, $where='') {
global $spip_pg_link, $table_prefix;
// idem, mais les valeurs sont des constantes a mettre entre apostrophes
// sauf les expressions de date lorsqu'il s'agit de fonctions SQL (NOW etc)
// http://doc.spip.org/@spip_mysql_update
function spip_pg_updateq($table, $champs, $where='', $desc=array()) {
if (!$champs) return;
if (!$desc) {
global $tables_principales;
include_spip('base/serial');
$desc = $tables_principales[$table];
}
if ($GLOBALS['table_prefix'])
$table = preg_replace('/^spip/',
$GLOBALS['table_prefix'],
$table);
spip_pg_trace_query("DELETE FROM $table " . ($where ? (" WHERE " . spip_pg_frommysql($where)) : ''));
$fields = $desc['field'];
$r = '';
foreach ($champs as $champ => $val) {
$t = $fields[$champ];
if (!test_sql_int($t)) {
if ((strpos($t, 'datetime')!==0)
AND (strpos($t, 'TIMESTAMP')!==0))
$val = _q($val);
elseif (strpos("012345678", $val[0]) !==false)
$val = "date '$val'";
else $val = spip_pg_frommysql($val);
}
$r .= ',' . $champ . '=' . $val;
}
$r = "UPDATE $table SET " . substr($r, 1) . ($where ? " WHERE $where" : '');
pg_query($r);
}
......@@ -362,13 +403,7 @@ function spip_pg_replace($table, $values, $desc) {
$noprims = $prims = array();
foreach($values as $k=>$v) {
$t = $desc['field'][$k];
if ((strpos($t, 'datetime') === 0)
AND strpos($v, "-00-00") === 4)
{ $values[$k] = $v = _q(substr($v,0,4)."-01-01".substr($v,10));}
elseif (test_sql_int($t))
$values[$k] = $v = intval($v);
else $values[$k] = $v = _q($v);
$values[$k] = $v = spip_pg_cite($v, $desc['field'][$k]);
if (!in_array($k, $ids))
$noprims[$k]= "$k=$v";
......@@ -401,6 +436,21 @@ function spip_pg_replace($table, $values, $desc) {
return $r;
}
// Explicite les conversions de Mysql d'une valeur $v de type $t
// Dans le cas d'un champ date, pas d'apostrophe, c'est une syntaxe ad hoc
function spip_pg_cite($v, $t)
{
if ((strpos($t, 'datetime')===0) OR (strpos($t, 'TIMESTAMP')===0)) {
if (strpos($v, "-00-00") === 4)
return _q(substr($v,0,4)."-01-01".substr($v,10));
else return spip_pg_frommysql($v);
}
elseif (test_sql_int($t))
return intval($v);
else return ("'" . addslashes($v) . "'");
}
// http://doc.spip.org/@spip_pg_error
function spip_pg_error($query) {
$s = str_replace('ERROR', 'errcode: 1000 ', pg_last_error());
......
......@@ -446,7 +446,7 @@ function import_alloue_id_rubrique($id_parent, $titre, $v) {
'type' => 'id_rubrique',
'ajout' => 1),
$GLOBALS['tables_principales']['spip_translate']);
else spip_log("Impossible d'inserer dans spip_articles");
else spip_log("Impossible d'inserer dans spip_rubriques");
return $r;
}
?>
......@@ -62,14 +62,9 @@ function modifier_contenu($type, $id, $options, $c=false) {
)
);
$update = array();
foreach ($champs as $champ => $val)
$update[] = $champ . '=' . _q($val);
if (!$champs) return false;
if (!count($update))
return false;
spip_query("UPDATE spip_$table_objet SET ".join(', ',$update)." WHERE $id_table_objet=$id");
sql_updateq("spip_$table_objet", $champs, "$id_table_objet=$id");
// marquer le fait que l'objet est travaille par toto a telle date
if ($GLOBALS['meta']['articles_modif'] != 'non') {
......
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