diff --git a/ecrire/req/sqlite_generique.php b/ecrire/req/sqlite_generique.php index c4ad48f2349c93b15ba71908787caa35f94524e1..9a41604a4591938ca7a9db5e74409d9cd4368c6f 100644 --- a/ecrire/req/sqlite_generique.php +++ b/ecrire/req/sqlite_generique.php @@ -382,8 +382,13 @@ function spip_sqlite_errno($serveur='') { function spip_sqlite_explain($query, $serveur=''){ if (strpos(ltrim($query), 'SELECT') !== 0) return array(); - $query = 'EXPLAIN ' . _sqlite_traite_query($query, $db, $prefixe); - $r = spip_sqlite_query($query, $serveur); + $requete = new sqlite_traiter_requete("$query", $serveur); + $requete->traduire_requete(); // mysql -> sqlite + $requete->query = 'EXPLAIN ' . $requete->query; + // on ne trace pas ces requetes, sinon on obtient un tracage sans fin... + $requete->tracer = false; + $r = $requete->executer_requete(); + return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier } @@ -1183,6 +1188,7 @@ class sqlite_traiter_requete{ var $link = ''; // le link (ressource) sqlite var $prefixe = ''; // le prefixe des tables var $db = ''; // le nom de la base + var $tracer = false; // doit-on tracer les requetes (var_profile) /* constructeur */ function sqlite_traiter_requete($query, $serveur = ''){ @@ -1196,6 +1202,9 @@ class sqlite_traiter_requete{ $this->prefixe = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['prefixe']; $this->db = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['db']; + + // tracage des requetes ? + $this->tracer = (isset($_GET['var_profile']) && $_GET['var_profile']); } @@ -1206,24 +1215,25 @@ class sqlite_traiter_requete{ $analyse->creerLesRequetes(); // renvoyer $this->query = $analyse->query; - $this->queryCount = $analyse->queryCount; } /* lancer la requete $this->requete et faire le tracage si demande */ function executer_requete(){ - $t = !isset($_GET['var_profile']) ? 0 : trace_query_start(); + $t = $this->tracer ? trace_query_start(): 0; //echo("<br /><b>executer_requete() $this->serveur >></b> $this->query"); // boum ? pourquoi ? if ($this->link){ if (_sqlite_is_version(3, $this->link)) { $r = $this->link->query($this->query); - // comptage : oblige de compter le nombre d'entrees retournees par la requete + // comptage : oblige de compter le nombre d'entrees retournees + // par une requete SELECT // aucune autre solution ne donne le nombre attendu :( ! // particulierement s'il y a des LIMIT dans la requete. - if ($this->queryCount){ + if (strpos($this->query,'SELECT')!==false){ if ($r) { - $l = $this->link->query($this->queryCount); + $l = $this->link->query($this->query); $r->spipSqliteRowCount = count($l->fetchAll()); + unset($l); } elseif (is_a($r, 'PDOStatement')) { $r->spipSqliteRowCount = 0; } @@ -1241,7 +1251,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; } } @@ -1286,10 +1296,6 @@ class sqlite_analyse_requete { $this->corrigerTout(); // hop, on remet les 'textes' $this->afficherLesTextes(); - // requete pour comptage - if ($this->sqlite_version == 3){ - $this->creerRequeteCount(); - } } @@ -1424,15 +1430,6 @@ class sqlite_analyse_requete { } - // les creations ! - - function creerRequeteCount(){ - if (strpos($this->query,'SELECT')!==false){ - $this->queryCount = $this->query; - //preg_replace('/SELECT(\s*)(DISTINCT)?(\s*)/s','SELECT$1$2$3COUNT(*) AS sqlite_count, ', $this->query, 1); // 1 seul ! - } - } - // les callbacks // remplacer DATE_ / INTERVAL par DATE...strtotime