/* *************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
- * Copyright (c) 2001-2014 *
+ * Copyright (c) 2001-2016 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
'utf-8'=>array('charset'=>'utf8','collation'=>'utf8_general_ci'))
);
-// http://doc.spip.org/@spip_mysql_set_charset
+
/**
- * @param $charset
- * @param string $serveur
- * @param bool $requeter
- * @param bool $requeter
- * @return resource
+ * Définit un charset pour la connexion avec Mysql
+ *
+ * @param string $charset Charset à appliquer
+ * @param string $serveur Nom de la connexion
+ * @param bool $requeter inutilisé
+ * @return resource Ressource de résultats pour fetch()
*/
-function spip_mysql_set_charset($charset, $serveur='',$requeter=true,$requeter=true){
+function spip_mysql_set_charset($charset, $serveur='',$requeter=true){
$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
spip_log("changement de charset sql : "."SET NAMES "._q($charset), _LOG_DEBUG);
return mysql_query($connexion['last'] = "SET NAMES "._q($charset));
}
-// http://doc.spip.org/@spip_mysql_get_charset
-/**
- * @param array $charset
- * @param string $serveur
- * @param bool $requeter
- * @return array
- *
+/**
+ * Teste si le charset indiqué est disponible sur le serveur SQL
+ *
+ * @param array|string $charset Nom du charset à tester.
+ * @param string $serveur Nom de la connexion
+ * @param bool $requeter inutilisé
+ * @return array Description du charset (son nom est dans 'charset')
*/
function spip_mysql_get_charset($charset=array(), $serveur='',$requeter=true){
$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
// ajouter un debug utile dans log/mysql-slow.log ?
$debug = '';
if (defined('_DEBUG_SLOW_QUERIES') AND _DEBUG_SLOW_QUERIES){
- if($GLOBALS['debug']['aucasou']){
+ if(isset($GLOBALS['debug']['aucasou'])){
list(,$id,, $infos) = $GLOBALS['debug']['aucasou'];
- $debug .= " BOUCLE$id @ ".$infos[0] ." | ";
+ $debug .= "BOUCLE$id @ ".$infos[0] ." | ";
}
- $debug .= " " . $_SERVER['REQUEST_URI'].' + '.$GLOBALS['ip'];
- $debug = ' /*'.str_replace('*/','@/',$debug).' */';
+ $debug .= $_SERVER['REQUEST_URI'].' + '.$GLOBALS['ip'];
+ $debug = ' /* '. mysql_real_escape_string(str_replace('*/','@/',$debug)). ' */';
}
$r = $link ? mysql_query($query.$debug, $link) : mysql_query($query.$debug);
return;
$res = spip_mysql_query("SELECT version() as v");
- if ($row = mysql_fetch_array($res)
- && (version_compare($row['v'],'5.0','>=')))
- spip_mysql_query("SET sql_mode=''");
+ if (($row = mysql_fetch_array($res)) && (version_compare($row['v'],'5.0','>='))) {
+ spip_mysql_query("SET sql_mode=''", $serveur);
+ }
foreach($cles as $k => $v) {
$keys .= "$s\n\t\t$k ($v)";
return spip_mysql_query("REPAIR TABLE `$table`", $serveur, $requeter);
}
+define('_MYSQL_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^()]*\)[^()]*)*[^()]*)\)[^()]*$/');
// Recupere la definition d'une table ou d'une vue MySQL
// colonnes, indexes, etc.
// au meme format que la definition des tables de SPIP
if (!$requeter) return $s;
list(,$a) = mysql_fetch_array($s ,MYSQL_NUM);
- if (preg_match("/^[^(),]*\((([^()]*\([^()]*\)[^()]*)*)\)[^()]*$/", $a, $r)){
+ if (preg_match(_MYSQL_RE_SHOW_TABLE, $a, $r)){
$desc = $r[1];
// extraction d'une KEY éventuelle en prenant garde de ne pas
// relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
- if (preg_match("/^(.*?),([^,]*KEY[ (].*)$/s", $desc, $r)) {
+ if (preg_match("/^(.*?),([^,]*\sKEY[ (].*)$/s", $desc, $r)) {
$namedkeys = $r[2];
$desc = $r[1];
}
}
$keys = array();
- foreach(preg_split('/\)\s*,?/',$namedkeys) as $v) {
- if (preg_match("/^\s*([^(]*)\((.*)$/",$v,$r)) {
+ foreach(preg_split('/\)\s*(,|$)/',$namedkeys) as $v) {
+ if (preg_match("/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/",$v,$r)) {
$k = str_replace("`", '', trim($r[1]));
$t = strtolower(str_replace("`", '', $r[2]));
if ($k && !isset($keys[$k])) $keys[$k] = $t; else $keys[] = $t;