function spip_pg_quote($v, $type = '') { if (!is_array($v)) { return spip_pg_cite($v, $type); } // si c'est un tableau, le parcourir en propageant le type foreach ($v as $k => $r) { $v[$k] = spip_pg_quote($r, $type); } return join(",", $v); }
function spip_pg_replace($table, $values, $desc, $serveur='',$requeter=true) { if (!$values) {spip_log("replace vide $table"); return 0;} $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $prefixe = $connexion['prefixe']; $link = $connexion['link']; $db = $connexion['db']; if (!$desc) $desc = description_table($table); if (!$desc) die("$table insertion sans description"); $prim = $desc['key']['PRIMARY KEY']; $ids = preg_split('/,\s*/', $prim); $noprims = $prims = array(); foreach($values as $k=>$v) { $values[$k] = $v = spip_pg_cite($v, $desc['field'][$k]); if (!in_array($k, $ids)) $noprims[$k]= "$k=$v"; else $prims[$k]= "$k=$v"; } // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci $values = spip_pg_ajouter_champs_timestamp($table, $values, $desc, $serveur); $where = join(' AND ', $prims); if (!$where) { return spip_pg_insert($table, "(".join(',',array_keys($values)).")", "(".join(',', $values).")", $desc, $serveur); } $couples = join(',', $noprims); $seq = spip_pg_sequence($table); if ($prefixe) { $table = preg_replace('/^spip/', $prefixe, $table); $seq = preg_replace('/^spip/', $prefixe, $seq); } $connexion['last'] = $q = "UPDATE $table SET $couples WHERE $where"; if ($couples) { $couples = spip_pg_query_simple($link, $q); # spip_log($q); if (!$couples) return false; $couples = pg_affected_rows($couples); } if (!$couples) { $ret = !$seq ? '' : (" RETURNING nextval('$seq') < $prim"); $connexion['last'] = $q = "INSERT INTO $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',', $values) . ")$ret"; $couples = spip_pg_query_simple($link, $q); if (!$couples) { return false; } elseif ($ret) { $r = pg_fetch_array($couples, NULL, PGSQL_NUM); if ($r[0]) { $connexion['last'] = $q = "SELECT setval('$seq', $prim) from $table"; // Le code de SPIP met parfois la sequence a 0 (dans l'import) // MySQL n'en dit rien, on fait pareil pour PG $r = @pg_query($link, $q); } } } return $couples; }