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

#209 Abstraction des fonctions gérant le codage de l'alphabet dans le serveur SQL.

Portage a minima pour Postgres, vu comme un serveur ne connaissant même pas la notion.

La fonction d'abstraction {{{set_connect_charset}}} introduite à la va vite dans [10131]] est finalement abandonnée afin d'offrir une interface plus souple et homogène. Le tableau de [10113] décrivant une connexion comporte à la place les 3 entrées suivantes:

{{{
charset => tableau des codages connus du serveur,
get_charset => prédicat testant si un codage (utf-8, iso-* etc) est connu du serveur,
set_charset => impose un codage au serveur
}}}

Le tableau des codages est indexé par son nom HTTP (utf-8 etc), les valeurs étant les informations liées à ce codage dans le serveur (le nom coté serveur est UTF8, la collection choisie etc).
parent 17a52a75
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+23 −33
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -12,9 +12,16 @@

if (!defined("_ECRIRE_INC_VERSION")) return;

// Ce fichier definit la couche d'abstraction entre SPIP et ses serveurs SQL.
// Cette couche n'est pour le moment qu'un ensemble de fonctions ecrites
// rapidement pour generaliser le code strictement MySQL de SPIP < 1.9.3.
// Une reconception generale est a prevoir apres l'experience des premiers
// portages.

// Chargement a la volee de la description d'un serveur de base de donnees
// via la fonction spip_connect()
// qui etablira la premiere connexion si ce n'est fait.
// Erreur fatale si la fonctionnalite est absente

// http://doc.spip.org/@sql_serveur
function sql_serveur($ins_sql, $serveur='') {
@@ -26,12 +33,25 @@ function sql_serveur($ins_sql, $serveur='') {
	exit;
}

// http://doc.spip.org/@sql_set_connect_charset
function sql_set_connect_charset($charset,$serveur=''){
	$f = sql_serveur('set_connect_charset', $serveur);
// Regler le codage de connexion

function sql_set_charset($charset,$serveur=''){
	$f = sql_serveur('set_charset', $serveur);
	return $f($charset, $serveur);
}

// Demande si un charset est disponible. 
// Pas d'erreur fatale ==> ne pas utiliser la fonction generale

function sql_get_charset($charset, $serveur=''){
  // le nom http du charset differe parfois du nom SQL utf-8 ==> utf8 etc.
	$desc = spip_connect($serveur);
	$c = @$desc['charsets'][$charset];
	if (!$c) return false;
	if (!function_exists($f=@$desc['get_charset'])) return false;
	if ($f($c, $serveur)) return $c;
}

// Cette fonction est systematiquement appelee par les squelettes
// pour constuire une requete SQL de type "lecture" (SELECT) a partir
// de chaque boucle.
@@ -92,7 +112,6 @@ function sql_selectdb($res, $serveur='')
	return $f($res, $serveur);
}

// http://doc.spip.org/@sql_free
// http://doc.spip.org/@sql_count
function sql_count($res, $serveur='')
{
@@ -276,35 +295,6 @@ function test_sql_int($type)
	OR strpos($type, 'tinyint') === 0);
}

// donner le character set sql fonction de celui utilise par spip
// $skip_verif permet de ne pas faire de verif a l'install car la bd n'est pas configuree
// le script d'install se charge des verif lui meme
// http://doc.spip.org/@spip_sql_character_set
function spip_sql_character_set($charset, $skip_verif=false){
	$sql_charset_coll = array(
	'cp1250'=>array('charset'=>'cp1250','collation'=>'cp1250_general_ci'),
	'cp1251'=>array('charset'=>'cp1251','collation'=>'cp1251_general_ci'),
	'cp1256'=>array('charset'=>'cp1256','collation'=>'cp1256_general_ci'),
	
	'iso-8859-1'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'),
	//'iso-8859-6'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'),
	'iso-8859-9'=>array('charset'=>'latin5','collation'=>'latin5_turkish_ci'),
	//'iso-8859-15'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'),
	
	'utf-8'=>array('charset'=>'utf8','collation'=>'utf8_general_ci')
	);
	if (isset($sql_charset_coll[$charset])){
		if ($skip_verif)
			return $sql_charset_coll[$charset];
		// verifier que le character set vise est bien supporte par mysql
		$res = spip_query($q="SHOW CHARACTER SET LIKE "._q($sql_charset_coll[$charset]['charset']));
		if ($res AND ($row = sql_fetch($res)))
			return $sql_charset_coll[$charset];
	}

	return false;
}

// Trouve la description d'une table, en particulier celle d'une boucle
// Si on ne la trouve pas, on demande au serveur SQL
// retourne False si lui non plus  ne la trouve pas.
+1 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -16,7 +16,6 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
// http://doc.spip.org/@base_convert_sql_utf8_dist
function base_convert_sql_utf8_dist($titre, $reprise=false)
{

	ecrire_meta('convert_sql_utf8','oui','non');
	echo install_debut_html($titre);
	
@@ -44,7 +43,7 @@ function convert_sql_utf8(){
	$charset_supporte = false;
	$utf8_supporte = false;	
	// verifier que mysql gere le charset courant pour effectuer les conversions 
	if ($c = spip_sql_character_set($charset_spip)){
	if ($c = sql_get_charset($charset_spip)){
		$sql_charset = $c['charset'];
		$sql_collation = $c['collation'];
		$charset_supporte = true;
+18 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -52,20 +52,36 @@ function base_db_mysql_dist($host, $port, $login, $pass, $db='', $prefixe='') {
		'replace' => 'spip_mysql_replace',
		'select' => 'spip_mysql_select',
		'selectdb' => 'spip_mysql_selectdb',
		'set_connect_charset' => 'spip_mysql_set_connect_charset',
		'set_charset' => 'spip_mysql_set_charset',
		'get_charset' => 'spip_mysql_get_charset',
		'showbase' => 'spip_mysql_showbase',
		'showtable' => 'spip_mysql_showtable',
		'update' => 'spip_mysql_update',
		'updateq' => 'spip_mysql_updateq',

  // association de chaque nom http d'un charset aux couples MySQL 
		'charsets' => array(
'cp1250'=>array('charset'=>'cp1250','collation'=>'cp1250_general_ci'),
'cp1251'=>array('charset'=>'cp1251','collation'=>'cp1251_general_ci'),
'cp1256'=>array('charset'=>'cp1256','collation'=>'cp1256_general_ci'),
'iso-8859-1'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'),
//'iso-8859-6'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'),
'iso-8859-9'=>array('charset'=>'latin5','collation'=>'latin5_turkish_ci'),
//'iso-8859-15'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'),
'utf-8'=>array('charset'=>'utf8','collation'=>'utf8_general_ci'))
		);
}

// http://doc.spip.org/@spip_mysql_set_connect_charset
function spip_mysql_set_connect_charset($charset, $serveur=''){
function spip_mysql_set_charset($charset, $serveur=''){
	#spip_log("changement de charset sql : "."SET NAMES "._q($charset));
	return mysql_query("SET NAMES "._q($charset));
}

function spip_mysql_get_charset($charset, $serveur=''){
	return mysql_query("SHOW CHARACTER SET LIKE "._q($charset['charset']));
}

// obsolete, ne plus utiliser
// http://doc.spip.org/@spip_query_db
function spip_query_db($query, $serveur='') {
+2 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -26,8 +26,8 @@ function exec_convert_sql_utf8_dist() {
	include_spip('inc/minipres');
	include_spip('inc/charsets');
	lire_metas();

	$charset_spip = $GLOBALS['meta']['charset'];

	// Definir le titre de la page (et le nom du fichier admin)
	//$action = _T('utf8_convertir_votre_site');
	$action = _L("Conversion de la base en $charset_spip"); #volontairement non traduit (obsolete)
@@ -41,7 +41,7 @@ function exec_convert_sql_utf8_dist() {
		$utf8_supporte = false;	
		// verifier que mysql gere le charset courant pour effectuer les conversions 
		include_spip('base/abstract_sql');
		if ($c = spip_sql_character_set($charset_spip)){
		if ($c = sql_get_charset($charset_spip)){
			$sql_charset = $c['charset'];
			$sql_collation = $c['collation'];
			$charset_supporte = true;
+4 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -42,7 +42,9 @@ function exec_convert_utf8_dist() {
					  _T('utf8_convert_erreur_orig', array('charset' => "<b>".$charset_orig."</b>")));

		// ne pas convertir si deja utf8 
		else if ($charset_orig == 'utf-8')
		// ou si l'interface du serveur ne comprend rien
		else if (($charset_orig == 'utf-8')
			 OR !sql_get_charset('utf-8'))
			convert_utf8_non($action,
					  _T('utf8_convert_erreur_deja',
					     array('charset' => $charset_orig)));
Chargement en cours