/* *************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
- * Copyright (c) 2001-2012 *
+ * Copyright (c) 2001-2014 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
}
$ifnotexists = "";
- if (_sqlite_is_version(2, '', $serveur)){
- /* simuler le IF EXISTS - version 2 */
+ $version = spip_sqlite_fetch(spip_sqlite_query("select sqlite_version() AS sqlite_version",$serveur),'',$serveur);
+ if (!function_exists('spip_version_compare')) include_spip('plugins/installer');
+
+ if ($version AND spip_version_compare($version['sqlite_version'],'3.3.0','>=')) {
+ $ifnotexists = ' IF NOT EXISTS';
+ } else {
+ /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
$a = spip_sqlite_showtable($table, $serveur);
if (isset($a['key']['KEY '.$nom])) return true;
- } else {
- $ifnotexists = ' IF NOT EXISTS';
}
$query = "CREATE ".($unique?"UNIQUE ":"")."INDEX$ifnotexists $nom ON $table (".join(',', $champs).")";
return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP "._q($match), $serveur, $requeter);
}
-
+define('_SQLITE_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^()]*\)[^()]*)*[^()]*)\)[^()]*$/');
// http://doc.spip.org/@spip_sqlite_showtable
function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true){
$query =
// c'est une table
// il faut parser le create
if (!$vue){
- if (!preg_match("/^[^(),]*\((([^()]*(\([^()]*\))?[^()]*)*)\)[^()]*$/", array_shift($a), $r))
+ if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)){
return "";
- else {
+ } else {
$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];
}
}
}
// key inclues dans la requete
- 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 = trim(strtolower(str_replace("`", '', $r[2])), '"');
if ($k && !isset($keys[$k])) $keys[$k] = $t; else $keys[] = $t;
$keys['KEY '.$key] = $colonnes;
}
}
- // c'est une vue, on liste les champs disponibles simplement
- } else {
+ }
+ // c'est une vue, on liste les champs disponibles simplement
+ else {
if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)){ // limit 1
$fields = array();
foreach ($res as $c => $v) $fields[$c] = '';
$ifnotexists = "";
if ($_ifnotexists){
- // simuler le IF NOT EXISTS - version 2
- if (_sqlite_is_version(2, '', $serveur)){
- $a = spip_sqlite_showtable($nom, $serveur);
- if ($a) return false;
- }
- // sinon l'ajouter en version 3
- else {
+
+ $version = spip_sqlite_fetch(spip_sqlite_query("select sqlite_version() AS sqlite_version",$serveur),'',$serveur);
+ if (!function_exists('spip_version_compare')) include_spip('plugins/installer');
+
+ if ($version AND spip_version_compare($version['sqlite_version'],'3.3.0','>=')) {
$ifnotexists = ' IF NOT EXISTS';
+ } else {
+ /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
+ $a = spip_sqlite_showtable($table, $serveur);
+ if (isset($a['key']['KEY '.$nom])) return true;
}
+
}
$temporary = $temporary ? ' TEMPORARY' : '';
$this->query = str_replace('LEFT(','_LEFT(',$this->query);
}
+ if (strpos($this->query, 'TIMESTAMPDIFF(')!==false){
+ $this->query = preg_replace('/TIMESTAMPDIFF\(\s*([^,]*)\s*,/Uims',"TIMESTAMPDIFF('\\1',",$this->query);
+ }
+
+
// Correction Using
// USING (non reconnu en sqlite2)
// problematique car la jointure ne se fait pas du coup.