From 6ebf24e3e4f668e971cade5060400219f79c78c1 Mon Sep 17 00:00:00 2001 From: Matthieu Marcillaud <marcimat@rezo.net> Date: Mon, 10 Nov 2008 01:06:59 +0000 Subject: [PATCH] Report de [13132] --- ecrire/exec/brouteur_frame.php | 2 +- ecrire/inc/afficher_objets.php | 2 +- ecrire/maj/v019.php | 2 +- ecrire/req/mysql.php | 2 +- ecrire/req/sqlite_fonctions.php | 6 +- ecrire/req/sqlite_generique.php | 356 +++++++++++++++++++++++--------- 6 files changed, 271 insertions(+), 99 deletions(-) diff --git a/ecrire/exec/brouteur_frame.php b/ecrire/exec/brouteur_frame.php index a8b288d226..f2d8e8408c 100644 --- a/ecrire/exec/brouteur_frame.php +++ b/ecrire/exec/brouteur_frame.php @@ -63,7 +63,7 @@ function exec_brouteur_frame_dist() { echo "\n<div class='arial2'>"; if ($special == "redac") { - $result=sql_select("articles.id_article, articles.id_rubrique, articles.titre, articles.statut", "spip_articles AS articles LEFT JOIN spip_auteurs_articles AS lien USING (id_article)", "articles.statut = 'prepa' AND lien.id_auteur = $connect_id_auteur ", " id_article ", " articles.date DESC"); + $result=sql_select("articles.id_article, articles.id_rubrique, articles.titre, articles.statut", "spip_articles AS articles LEFT JOIN spip_auteurs_articles AS lien ON articles.id_article=lien.id_article", "articles.statut = 'prepa' AND lien.id_auteur = $connect_id_auteur ", " id_article ", " articles.date DESC"); $res = ''; while($row=sql_fetch($result)){ $id_article=$row['id_article']; diff --git a/ecrire/inc/afficher_objets.php b/ecrire/inc/afficher_objets.php index acb96e52de..7615cce3c7 100644 --- a/ecrire/inc/afficher_objets.php +++ b/ecrire/inc/afficher_objets.php @@ -363,7 +363,7 @@ function inc_afficher_articles_dist($titre, $requete, $formater='') { if (!$cpt) return '' ; - $requete['FROM'] = preg_replace("/(spip_articles(\s+AS\s+\w+)?)/i", "\\1 LEFT JOIN spip_petitions AS petitions USING (id_article)", $requete['FROM']); + $requete['FROM'] = preg_replace("/(spip_articles(\s+AS\s+\w+)?)/i", "\\1 LEFT JOIN spip_petitions AS petitions ON articles.id_article=petitions.id_article", $requete['FROM']); $requete['SELECT'] .= ", petitions.id_article AS petition "; diff --git a/ecrire/maj/v019.php b/ecrire/maj/v019.php index 2b1ab572b1..eaed0ec9fb 100644 --- a/ecrire/maj/v019.php +++ b/ecrire/maj/v019.php @@ -391,7 +391,7 @@ function maj_1_952() { $vignettes[] = intval($t['id_document']); $ok &= spip_query("UPDATE spip_documents SET `mode`='image' WHERE `mode`='vignette'"); - $ok &= spip_query("UPDATE spip_documents SET `mode`='vignette' WHERE `mode`='image' AND ".calcul_mysql_in('id_document', $vignettes)); + $ok &= spip_query("UPDATE spip_documents SET `mode`='vignette' WHERE `mode`='image' AND ".sql_in('id_document', $vignettes)); } if (!$ok) die('echec sur maj_1_952()'); } diff --git a/ecrire/req/mysql.php b/ecrire/req/mysql.php index e4d2082eac..2d0e13e9da 100644 --- a/ecrire/req/mysql.php +++ b/ecrire/req/mysql.php @@ -679,7 +679,7 @@ function spip_mysql_multi ($objet, $lang) { " TRIM(RIGHT(".$objet.", ( LENGTH(".$objet.") - (INSTR(".$objet.", '[".$lang."]')+ LENGTH('[".$lang."]')-1) ) )) ". " ) ". " ) ". - "))) AS multi "; + "))) AS multi"; return $retour; } diff --git a/ecrire/req/sqlite_fonctions.php b/ecrire/req/sqlite_fonctions.php index 2feae9f543..95bc7ef70b 100644 --- a/ecrire/req/sqlite_fonctions.php +++ b/ecrire/req/sqlite_fonctions.php @@ -13,7 +13,10 @@ /* * Des fonctions pour les requetes SQL - * + * + * Voir la liste des fonctions natives : http://www.sqlite.org/lang_corefunc.html + * Et la liste des evolutions pour : http://sqlite.org/changes.html + * */ // http://doc.spip.org/@_sqlite_init_functions function _sqlite_init_functions(&$sqlite){ @@ -54,6 +57,7 @@ function _sqlite_init_functions(&$sqlite){ # 'RTRIM' => array( 'rtrim' ,1), // present en theorie 'SETTYPE' => array( 'settype' ,2), // CAST present en v3.2.3 + 'SUBSTRING' => array( 'substr' ,3), 'TO_DAYS' => array( '_sqlite_func_to_days' ,1), # 'TRIM' => array( 'trim' ,1), // present en theorie diff --git a/ecrire/req/sqlite_generique.php b/ecrire/req/sqlite_generique.php index ce2879bf0f..3ef8ea6a7f 100644 --- a/ecrire/req/sqlite_generique.php +++ b/ecrire/req/sqlite_generique.php @@ -110,13 +110,6 @@ function req_sqlite_dist($addr, $port, $login, $pass, $db='', $prefixe='', $ldap } -// obsolete, ne plus utiliser -/* -// http://doc.spip.org/@spip_query_db -function spip_query_db($query, $serveur='',$requeter=true) { - return spip_sqlite_query($query, $serveur); -} -*/ // Fonction de requete generale, munie d'une trace a la demande // http://doc.spip.org/@spip_sqlite_query @@ -136,7 +129,6 @@ function spip_sqlite_query($query, $serveur='',$requeter=true) { // http://doc.spip.org/@spip_sqlite_alter function spip_sqlite_alter($query, $serveur='',$requeter=true){ - $query = _sqlite_remplacements_definitions_table($query); $query = spip_sqlite_query("ALTER $query",$serveur,false); /* @@ -159,13 +151,27 @@ function spip_sqlite_alter($query, $serveur='',$requeter=true){ } // 2 + // il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB) + // tout en cassant "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... en deux + // ou revoir l'api de sql_alter en creant un + // sql_alter_table($table,array($actions)); $todo = explode(',', $suite); + // on remet les morceaux dechires ensembles... que c'est laid ! + $todo2 = array(); $i=0; + while ($do = array_shift($todo)) { + $todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . "," . $do : $do; + if (false===strpos($do,"(") OR (false!==strpos($do,")"))) + $i++; + } // 3 $resultats = array(); - foreach ($todo as $do){ + foreach ($todo2 as $do){ $do = trim($do); - if (!preg_match('/(DROP|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME|ADD COLUMN|ADD)\s*([^\s]*)\s*(.*)?/', $do, $matches)){ + if (!preg_match('/(DROP PRIMARY KEY|DROP INDEX|DROP COLUMN|DROP' + .'|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME' + .'|ADD PRIMARY KEY|ADD INDEX|ADD COLUMN|ADD' + .')\s*([^\s]*)\s*(.*)?/', $do, $matches)){ spip_log("SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)", 'sqlite'); return false; } @@ -174,16 +180,31 @@ function spip_sqlite_alter($query, $serveur='',$requeter=true){ $colonne_origine = $matches[2]; $colonne_destination = ''; $def = $matches[3]; - + $def = _sqlite_remplacements_definitions_table($def); switch($cle){ - // allez, on simule, on simule ! - case 'DROP': + // suppression d'un index + case 'DROP INDEX': + $nom_index = $colonne_origine; + spip_sqlite_drop_index($nom_index, $table, $serveur); + break; + + // suppression d'une pk + case 'DROP PRIMARY KEY': if (!_sqlite_modifier_table( - $table, $table, $colonne_origine, - '', // colonne origine -> rien ! + array('key'=>array('PRIMARY KEY'=>'')), + $serveur)){ + return false; + } + break; + // suppression d'une colonne + case 'DROP COLUMN': + case 'DROP': + if (!_sqlite_modifier_table( + $table, + array($colonne_origine=>""), '', $serveur)){ return false; @@ -199,10 +220,8 @@ function spip_sqlite_alter($query, $serveur='',$requeter=true){ if (!_sqlite_modifier_table( $table, - $table, - $colonne_origine, - $colonne_destination, - $def, + array($colonne_origine=>$colonne_destination), + array('field'=>array($colonne_destination=>$def)), $serveur)){ return false; } @@ -210,11 +229,9 @@ function spip_sqlite_alter($query, $serveur='',$requeter=true){ case 'MODIFY': if (!_sqlite_modifier_table( - $table, $table, $colonne_origine, - $colonne_origine, - $def, + array('field'=>array($colonne_origine=>$def)), $serveur)){ return false; } @@ -233,12 +250,54 @@ function spip_sqlite_alter($query, $serveur='',$requeter=true){ // artillerie lourde pour sqlite2 ! } else { $table_dest = trim(substr($do, 9)); - if (!_sqlite_modifier_table($table, $table_dest, '', '', '', $serveur)){ + if (!_sqlite_modifier_table(array($table=>$table_dest), '', '', $serveur)){ spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite'); return false; } } break; + + // ajout d'une pk + case 'ADD PRIMARY KEY': + $pk = trim(substr($do,16)); + $pk = ($pk[0]=='(') ? substr($pk,1,-1) : $pk; + if (!_sqlite_modifier_table( + $table, + $colonne_origine, + array('key'=>array('PRIMARY KEY'=>$pk)), + $serveur)){ + return false; + } + break; + // ajout d'un index + case 'ADD INDEX': + // peut etre "(colonne)" ou "nom_index (colonnes)" + // bug potentiel si qqn met "(colonne, colonne)" + // + // nom_index (colonnes) + if ($def) { + $colonnes = substr($def,1,-1); + $nom_index = $colonne_origine; + } + else { + // (colonne) + if ($colonne_origine[0] == "(") { + $colonnes = substr($colonne_origine,1,-1); + if (false!==strpos(",",$colonnes)) { + spip_log("SQLite : Erreur, impossible de creer un index sur plusieurs colonnes" + ." sans qu'il ait de nom ($table, ($colonnes))", 'sqlite'); + break; + } else { + $nom_index = $colonnes; + } + } + // nom_index + else { + $nom_index = $colonnes = $colonne_origine ; + } + } + spip_sqlite_create_index($nom_index, $table, $colonnes, $serveur); + break; // pas geres en sqlite2 case 'ADD COLUMN': @@ -261,7 +320,7 @@ function spip_sqlite_alter($query, $serveur='',$requeter=true){ $def = trim(substr($do, 3)); $colonne_ajoutee = substr($def, 0, strpos($def,' ')); $def = substr($def, strlen($colonne_ajoutee)+1); - if (!_sqlite_modifier_table($table, $table, '', $colonne_ajoutee, $def, $serveur)){ + if (!_sqlite_modifier_table($table, array($colonne_ajoutee), array('field'=>array($colonne_ajoutee=>$def)), $serveur)){ spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite'); return false; } @@ -282,7 +341,22 @@ function spip_sqlite_alter($query, $serveur='',$requeter=true){ function spip_sqlite_create($nom, $champs, $cles, $autoinc=false, $temporary=false, $serveur='',$requeter=true) { $query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists=true, $serveur, $requeter); if (!$query) return false; - return spip_sqlite_query($query, $serveur, $requeter); + $res = spip_sqlite_query($query, $serveur, $requeter); + + // SQLite ne cree pas les KEY sur les requetes CREATE TABLE + // il faut donc les faire creer ensuite + if (!$requeter) return $res; + + $ok = $res ? true : false; + if ($ok) { + foreach($cles as $k=>$v) { + if (strpos($k, "KEY ") === 0) { + $index = preg_replace("/KEY +/", '',$k); + $ok &= $res = spip_sqlite_create_index($index, $nom, $v, $serveur); + } + } + } + return $ok ? true : false; } // Fonction de creation d'une vue SQL nommee $nom @@ -299,6 +373,38 @@ function spip_sqlite_create_view($nom, $query_select, $serveur='',$requeter=true return spip_sqlite_query($query, $serveur, $requeter); } +/** + * Fonction de creation d'un INDEX + * + * @param string $nom : nom de l'index + * @param string $table : table sql de l'index + * @param string/array $champs : liste de champs sur lesquels s'applique l'index + * @param string $serveur : nom de la connexion sql utilisee + * @param bool $requeter : true pour executer la requete ou false pour retourner le texte de la requete + * + * @return bool ou requete + */ +function spip_sqlite_create_index($nom, $table, $champs, $serveur='', $requeter=true) { + if (!($nom OR $table OR $champs)) { + spip_log("Champ manquant pour creer un index sqlite ($nom, $table, (".join(',',$champs)."))"); + return false; + } + + // SQLite ne differentie pas noms des index en fonction des tables + // il faut donc creer des noms uniques d'index pour une base sqlite + $nom = $table.'_'.$nom; + // enlever d'eventuelles parentheses deja presentes sur champs + if (!is_array($champs)){ + if ($champs[0]=="(") $champs = substr($champs,1,-1); + $champs = array($champs); + } + $query = "CREATE INDEX $nom ON $table (" . join(',',$champs) . ")"; + if (spip_sqlite_query($query, $serveur, $requeter)) + return true; + else + return false; +} + // en PDO/sqlite3, il faut calculer le count par une requete count(*) // pour les resultats de SELECT // cela est fait sans spip_sqlite_query() @@ -359,8 +465,10 @@ function spip_sqlite_drop_table($table, $exist='', $serveur='',$requeter=true) { if (!$a) return true; $exist = ''; } - - return spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter); + if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) + return true; + else + return false; } // supprime une vue @@ -378,6 +486,37 @@ function spip_sqlite_drop_view($view, $exist='', $serveur='',$requeter=true) { return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter); } +/** + * Fonction de suppression d'un INDEX + * + * @param string $nom : nom de l'index + * @param string $table : table sql de l'index + * @param string $serveur : nom de la connexion sql utilisee + * @param bool $requeter : true pour executer la requete ou false pour retourner le texte de la requete + * + * @return bool ou requete + */ +function spip_sqlite_drop_index($nom, $table, $serveur='', $requeter=true) { + if (!($nom OR $table)) { + spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)"); + return false; + } + + // SQLite ne differentie pas noms des index en fonction des tables + // il faut donc creer des noms uniques d'index pour une base sqlite + $index = $table.'_'.$nom; + $exist =" IF EXISTS"; + + /* simuler le IF EXISTS - version 2 */ + if (_sqlite_is_version(2, '', $serveur)){ + $a = spip_sqlite_showtable($table, $serveur); + if (!isset($a['key']['KEY '.$nom])) return true; + $exist = ''; + } + + $query = "DROP INDEX$exist $index"; + return spip_sqlite_query($query, $serveur, $requeter); +} // http://doc.spip.org/@spip_sqlite_error function spip_sqlite_error($query='', $serveur='',$requeter=true) { @@ -467,7 +606,6 @@ function spip_sqlite_fetch($r, $t='', $serveur='',$requeter=true) { $retour = &$new; } - //echo "<br />";print_r($retour); return $retour; } @@ -756,7 +894,7 @@ function spip_sqlite_showtable($nom_table, $serveur='',$requeter=true){ if (!$requeter) return $a; if (!($a = spip_sqlite_fetch($a, null, $serveur))) return ""; $vue = ($a['type'] == 'view'); // table | vue - + // c'est une table // il faut parser le create if (!$vue) { @@ -776,8 +914,8 @@ function spip_sqlite_showtable($nom_table, $serveur='',$requeter=true){ preg_match("/^\s*([^\s]+)\s+(.*)/",$v,$r); $fields[strtolower($r[1])] = $r[2]; } + // key inclues dans la requete $keys = array(); - foreach(preg_split('/\)\s*,?/',$namedkeys) as $v) { if (preg_match("/^\s*([^(]*)\((.*)$/",$v,$r)) { $k = str_replace("`", '', trim($r[1])); @@ -785,6 +923,20 @@ function spip_sqlite_showtable($nom_table, $serveur='',$requeter=true){ if ($k && !isset($keys[$k])) $keys[$k] = $t; else $keys[] = $t; } } + // sinon ajouter les key index + $query = + 'SELECT name,sql FROM' + . ' (SELECT * FROM sqlite_master UNION ALL' + . ' SELECT * FROM sqlite_temp_master)' + . " WHERE tbl_name LIKE '$nom_table'" + . " AND type='index' AND name NOT LIKE 'sqlite_%'" + . 'ORDER BY substr(type,2,1), name'; + $a = spip_sqlite_query($query, $serveur, $requeter); + while ($r = spip_sqlite_fetch($a)) { + $key = str_replace($nom_table.'_','',$r['name']); // enlever le nom de la table ajoute a l'index + $colonnes = preg_replace(',.*\((.*)\).*,','$1',$r['sql']); + $keys['KEY '.$key] = $colonnes; + } } // c'est une vue, on liste les champs disponibles simplement } else { @@ -796,11 +948,6 @@ function spip_sqlite_showtable($nom_table, $serveur='',$requeter=true){ return ""; } } - - /* - * me demande si les cles servent au compilateur de spip - * car vu que sqlite le gere pas, je sais pas ce que ca donne ... - */ return array('field' => $fields, 'key' => $keys); } @@ -1028,6 +1175,7 @@ function _sqlite_charger_version($version=''){ * ALTER TABLE table DROP column * ALTER TABLE table CHANGE [COLUMN] columnA columnB definition * ALTER TABLE table MODIFY column definition + * ALTER TABLE table ADD|DROP PRIMARY KEY * * (MODIFY transforme en CHANGE columnA columnA) par spip_sqlite_alter() * @@ -1035,16 +1183,39 @@ function _sqlite_charger_version($version=''){ * 2) copier la table d'origine A vers B * 3) supprimer la table A * 4) renommer la table B en A + * 5) remettre les index (qui sont supprimes avec la table A) + * + * @param string/array $table : nom_table, array(nom_table=>nom_futur) + * @param string/array $col : nom_colonne, array(nom_colonne=>nom_futur) + * @param array $opt : options comme les tables spip, qui sera merge a la table creee : array('field'=>array('nom'=>'syntaxe', ...), 'key'=>array('KEY nom'=>'colonne', ...)) + * @param string $serveur : nom de la connexion sql en cours * */ // http://doc.spip.org/@_sqlite_modifier_table -function _sqlite_modifier_table($table_origine, $table_destination, $colonne_origine='', $colonne_destination='', $def_col_destination='', $serveur='',$requeter=true){ +function _sqlite_modifier_table($table, $colonne, $opt=array(), $serveur=''){ + + if (is_array($table)) { + $table_origine = array_shift(array_keys($table)); + $table_destination = array_shift($table); + } else { + $table_origine = $table_destination = $table; + } + // ne prend actuellement qu'un changement + // mais pourra etre adapte pour changer plus qu'une colonne a la fois + if (is_array($colonne)) { + $colonne_origine = array_shift(array_keys($colonne)); + $colonne_destination = array_shift($colonne); + } else { + $colonne_origine = $colonne_destination = $colonne; + } + if (!isset($opt['field'])) $opt['field'] = array(); + if (!isset($opt['key'])) $opt['key'] = array(); // si les noms de tables sont differents, pas besoin de table temporaire // on prendra directement le nom de la future table $meme_table = ($table_origine == $table_destination); - $def_origine = sql_showtable($table_origine, $serveur); + $def_origine = sql_showtable($table_origine, false, $serveur); $table_tmp = $table_origine . '_tmp'; // 1) creer une table temporaire avec les modifications @@ -1062,7 +1233,7 @@ function _sqlite_modifier_table($table_origine, $table_destination, $colonne_ori if ($colonne_origine && ($c == $colonne_origine)) { // si pas DROP if ($colonne_destination){ - $fields[$colonne_destination] = $def_col_destination; + $fields[$colonne_destination] = $opt['field'][$colonne_destination]; $fields_correspondances[$colonne_destination] = $c; } } else { @@ -1072,21 +1243,20 @@ function _sqlite_modifier_table($table_origine, $table_destination, $colonne_ori } // cas de ADD sqlite2 (ajout du champ en fin de table): if (!$colonne_origine && $colonne_destination){ - $fields[$colonne_destination] = $def_col_destination; + $fields[$colonne_destination] = $opt['field'][$colonne_destination]; } - // key + // key... $keys = array(); foreach ($def_origine['key'] as $c=>$d){ - if ($d == $colonne_origine) { - if ($colonne_destination){ - $keys[$c] = $colonne_destination; - } - } else { - $keys[$c] = $d; - } + $c = str_replace($colonne_origine,$colonne_destination,$c); + $d = str_replace($colonne_origine,$colonne_destination,$d); + $keys[$c] = $d; } - + + // autres keys, on merge + $keys = array_merge($keys,$opt['key']); + $queries = array(); $queries[] = 'BEGIN TRANSACTION'; @@ -1132,6 +1302,17 @@ function _sqlite_modifier_table($table_origine, $table_destination, $colonne_ori $queries[] = "DROP TABLE $table_copie"; } } + + // 5) remettre les index ! + foreach ($keys as $k=>$v) { + if ($k=='PRIMARY KEY'){} + else { + // enlever KEY + $k = substr($k,4); + $queries[] = "CREATE INDEX $table_destination"."_$k ON $table_destination ($v)"; + } + } + $queries[] = "COMMIT"; @@ -1194,9 +1375,8 @@ function _sqlite_ref_fonctions(){ ); // association de chaque nom http d'un charset aux couples sqlite - + // SQLite supporte utf-8 et utf-16 uniquement. $charsets = array( - 'iso-8859-1'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'),// non supporte ? 'utf-8'=>array('charset'=>'utf8','collation'=>'utf8_general_ci'), //'utf-16be'=>array('charset'=>'utf16be','collation'=>'UTF-16BE'),// aucune idee de quoi il faut remplir dans es champs la //'utf-16le'=>array('charset'=>'utf16le','collation'=>'UTF-16LE') @@ -1218,10 +1398,10 @@ function _sqlite_remplacements_definitions_table($query){ $remplace = array( // pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY - '/(big|small|medium)?int(eger)?'.$num.'/is' => 'INTEGER', + '/(big|small|medium|tiny)?int(eger)?'.$num.'/is' => 'INTEGER', '/enum'.$enum.'/is' => 'VARCHAR', '/binary/is' => '', - '/auto_increment/is' => '' + '/auto_increment/is' => '', ); return preg_replace(array_keys($remplace), $remplace, $query); @@ -1241,57 +1421,43 @@ function _sqlite_requete_create($nom, $champs, $cles, $autoinc=false, $temporary if (!is_array($champs) || !is_array($cles)) return; - // sqlite ne gere pas KEY tout court - foreach($cles as $k => $v) { - if ($k == "PRIMARY KEY"){ - $keys .= "$s\n\t\t$k ($v)"; - $p = $v; + // sqlite ne gere pas KEY tout court dans une requete CREATE TABLE + // il faut passer par des create index + // Il gere par contre primary key ! + // Soit la PK est definie dans les cles, soit dans un champs + if (!$c = $cles[$pk = "PRIMARY KEY"]) { + foreach($champs as $k => $v) { + if (false !== stripos($v,$pk)) { + $c = $k; + // on n'en a plus besoin dans field, vu que defini dans key + $champs[$k] = preg_replace("/$pk/is", '', $champs[$k]); + break; + } } - $s = ","; } - $s = ''; - - /* a tester ulterieurement - * je ne sais pas a quoi ca sert - * - $character_set = ""; - if (@$GLOBALS['meta']['charset_sql_base']) - $character_set .= " CHARACTER SET ".$GLOBALS['meta']['charset_sql_base']; - if (@$GLOBALS['meta']['charset_collation_sql_base']) - $character_set .= " COLLATE ".$GLOBALS['meta']['charset_collation_sql_base']; - */ - + if ($c) $keys = "\n\t\t$pk ($c)"; $champs = _sqlite_remplacements_definitions_table($champs); - foreach($champs as $k => $v) { - // je sais pas ce que c'est ca... - // puis personne rentre ici vue qe binary->'' - /* - if (preg_match(',([a-z]*\s*(\(\s*[0-9]*\s*\))?(\s*binary)?),i',$v,$defs)){ - if (preg_match(',(char|text),i',$defs[1]) AND !preg_match(',binary,i',$defs[1]) ){ - $v = $defs[1] . $character_set . ' ' . substr($v,strlen($defs[1])); - } - } - */ - - // autoincrement v3.1.3 ? $query .= "$s\n\t\t$k $v"; - //. (($autoinc && ($p == $k) && preg_match(',\binteger\b,i', $v))? " AUTOINCREMENT": ''); $s = ","; } - /* simuler le IF NOT EXISTS - version 2 */ - if ($_ifnotexists && _sqlite_is_version(2, '', $serveur)){ - $a = spip_sqlite_showtable($nom, $serveur); - if ($a) return false; + $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 { + $ifnotexists = ' IF NOT EXISTS'; + } } $temporary = $temporary ? ' TEMPORARY':''; - $ifnotexists = ($_ifnotexists && _sqlite_is_version(3, '', $serveur)) ? ' IF NOT EXISTS':'';// IF NOT EXISTS - $q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")" - //. ($character_set?" DEFAULT $character_set":"") - ."\n"; + $q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n"; return $q; } @@ -1405,7 +1571,7 @@ class sqlite_traiter_requete{ // http://doc.spip.org/@executer_requete function executer_requete(){ $t = $this->tracer ? trace_query_start(): 0; - # spip_log("requete: $this->serveur >> $this->query",'query'); // boum ? pourquoi ? +# spip_log("requete: $this->serveur >> $this->query",'query'); // boum ? pourquoi ? if ($this->link){ if ($this->sqlite_version == 3) { $r = $this->link->query($this->query); @@ -1430,7 +1596,7 @@ class sqlite_traiter_requete{ } if (!$r && $e = spip_sqlite_errno($this->serveur)) // Log de l'erreur eventuelle $e .= spip_sqlite_error($this->query, $this->serveur); // et du fautif - + return $t ? trace_query_end($this->query, $t, $r, $e, $serveur) : $r; } @@ -1475,8 +1641,10 @@ class sqlite_traiter_requete{ } // Correction Using - // USING (inutile et non reconnu en sqlite2) + // USING (non reconnu en sqlite2) + // problematique car la jointure ne se fait pas du coup. if (($this->sqlite_version == 2) && (strpos($this->query, "USING")!==false)) { + spip_log("'USING (champ)' n'est pas reconnu en SQLite 2. Utilisez 'ON table1.champ = table2.champ', 'sqlite'"); $this->query = preg_replace('/USING\s*\([^\)]*\)/', '', $this->query); } -- GitLab