Valider c54bc1d1 rédigé par esj's avatar esj
Parcourir les fichiers

#209: abstration du Replace de MySQL pour pouvoir exécuter le script...

#209: abstration du Replace de MySQL pour pouvoir exécuter le script d'importation en PG. Ca marche ! Tout le dump.xml.gz spinet fait par SPIP-Mysql a été incurgité par SPIP-PG.

Stratégie de simulation de Replace: faire 
'''Update''' ''Y'' '''Where''' ''primary-key=X''
et si ça n'affecte rien, faire 
'''Insert''' ''X . Y''
Il y a une section critique entre les deux opérations qui n'est pas blindée contre les accès concurrents, il faudra y revenir. Par ailleurs ça oblige à avoir la description de la table (pour connaitre la primary-key et le type de ses composants, car ce n'est pas toujours un simple nombre) et presqu'inévitablement de présenter à la fonction abstraite les arguments sous forme de tableau  ''champ=>valeur'' pour pouvoir passer faclement de ''X'' et ''Y'' à ''X . Y'' ci-dessus, ça éclaire la définition finale de l'interface.

Autre point d'achoppement: des articles post-datés avaient la date 9000-00-00, refusée par PG. Ce n'est pas la date de la fin du monde, mais du coup à l'import en PG toute date NNNN-00-00 est transforméen NNNN-01-01.
parent 9d2186c8
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+4 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -438,6 +438,10 @@ function spip_mysql_delete($table, $where='') {
	spip_mysql_query("DELETE FROM $table" . ($where ? " WHERE $where" : ''));
}

function spip_mysql_replace($table, $values, $keys=array()) {
	return spip_query("REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',',array_map('_q', $values)) . ')');
}

// http://doc.spip.org/@spip_mysql_multi
function spip_mysql_multi ($objet, $lang) {
	$retour = "(TRIM(IF(INSTR(".$objet.", '<multi>') = 0 , ".
+68 −12
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -46,14 +46,13 @@ function spip_pg_query($query)
	$query = preg_replace('/([,\s])spip_/', '\1'.$table_prefix.'_', $query) . $suite;

	$r = pg_query($spip_pg_link, $query);
#	if (!$r) echo $query, '<br>';
	return $r;
	if (!$r) {
#	  echo $query, '<br>';
	  $n = spip_pg_errno();
	  $m = spip_pg_error();
	  spip_log("erreur spip_pg_query $n $m $query", 'pg');
	}


// http://doc.spip.org/@spip_pg_replace
function spip_pg_replace($query) {
  spip_log("REPLACE a implementer en postgres");
	return $r;
}


@@ -111,10 +110,12 @@ function spip_pg_select($select, $from, $where,
	}

	if (!($res = spip_pg_query($q))) {
#	  echo $query, '<br>';
	  $n = spip_pg_errno();
	  $m = spip_pg_error();
	  spip_log("erreur $n $m $query", 'pg');
	  include_spip('public/debug');
		erreur_requete_boucle($q, $id, $table,
				      spip_pg_errno(),
				      spip_pg_error());
	  erreur_requete_boucle($q, $id, $table, $n, $m);
	}
#	spip_log("querypg $q res=" . pg_numrows($res));
	return $res;
@@ -271,6 +272,61 @@ function spip_pg_delete($table, $where='') {
}


function spip_pg_replace($table, $values, $desc) {
	global $spip_pg_link, $table_prefix;
	if ($GLOBALS['table_prefix'])
		$table = preg_replace('/^spip/',
				    $GLOBALS['table_prefix'],
				    $table);

	$prim = $desc['key']['PRIMARY KEY'];
	$ids = preg_split('/,\s*/', $prim);
	$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);

		if (!in_array($k, $ids))
			$noprims[$k]= "$k=$v";
		else $prims[$k]= "$k=$v";
	}

	$where = join(' AND ', $prims);
	if (!$where) {
		spip_log("REPLACE en PG exige de connaitre la cle primaire de $table: $prim");
		return 0;
	}
	$set = join(',', $noprims);
	
	if ($set) {
	  $r = pg_query($spip_pg_link, $q = "UPDATE $table SET $set WHERE $where");
	  if (!$r) {
#	    echo $q, '<br>';
	    $n = spip_pg_errno();
	    $m = spip_pg_error();
	    spip_log("erreur $n $m $q", 'pg');
	  } else {
	    $r = pg_affected_rows($r);
	  }
	}
	if (!$r) {
	    $r = pg_query($spip_pg_link, $q = "INSERT INTO $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',', $values) . ')');
	    if (!$r) {
#	      echo $q, '<br>';
	      $n = spip_pg_errno();
	      $m = spip_pg_error();
	      spip_log("erreur $n $m $q", 'pg');
	    }
	}
	return $r;
}

// http://doc.spip.org/@spip_pg_error
function spip_pg_error() {
	return str_replace('ERROR', 'errcode: 1000 ', pg_last_error());
@@ -393,7 +449,7 @@ function mysql2pg_type($v)
		preg_replace("/tinytext/i", 'text',
	  	str_replace("longblob", 'text',
	  	str_replace("datetime", 'timestamp',
		str_replace("0000-00-00",'1970-01-01',
		str_replace("0000-00-00",'0000-01-01',
		   preg_replace("/unsigned/i", '', 	
		   preg_replace("/double/i", 'double precision', 	
		   preg_replace("/tinyint/i", 'int', 	
+3 −5
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -108,11 +108,9 @@ function import_collecte($desc)
// http://doc.spip.org/@import_replace
function import_replace($values, $table, $desc, $request, $atts='') {
	if (!isset($desc['field']['impt'])) {// pas de champ de gestion d'import
		if (!spip_query("REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',',array_map('_q', $values)) . ')')) {
		if (!spip_abstract_replace($table, $values, $desc))
			$GLOBALS['erreur_restauration'] = spip_sql_error();
	  }
	}
	else {
	} else {
		// la table contient un champ 'impt' qui permet de gerer des interdiction d'overwrite par import
		// impt=oui : la ligne est surchargeable par import
		// impt=non : la ligne ne doit pas etre ecrasee par un import
@@ -146,7 +144,7 @@ function import_replace($values, $table, $desc, $request, $atts='') {
				}
			}
			else{
				spip_query("INSERT $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',',array_map('_q', $values)) . ')');
			  spip_abstract_insert($table, join(',',array_keys($values)), join(',',array_map('_q', $values)));
			}
		}
	}