3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2016 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
13 if (!defined('_ECRIRE_INC_VERSION')) return;
19 class IterateurSQL
implements Iterator
{
25 protected $sqlresult = false;
31 protected $row = null;
33 protected $firstseek = false;
43 * Calcul du total des elements
50 * selectionner les donnees, ie faire la requete SQL
53 protected function select() {
56 $this->sqlresult
= calculer_select($v['select'], $v['from'], $v['type'], $v['where'], $v['join'], $v['groupby'], $v['orderby'], $v['limit'], $v['having'], $v['table'], $v['id'], $v['connect'], $this->info
);
57 $this->err
= !$this->sqlresult
;
58 $this->firstseek
= false;
61 // pas d'init a priori, le calcul ne sera fait qu'en cas de besoin (provoque une double requete souvent inutile en sqlite)
62 //$this->total = $this->count();
66 * array command: les commandes d'initialisation
67 * array info: les infos sur le squelette
69 public function __construct($command, $info=array()) {
71 $this->command
= $command;
80 public function rewind() {
81 return ($this->pos
> 0)
87 * Verifier l'etat de l'iterateur
90 public function valid() {
93 if (!$this->firstseek
)
95 return is_array($this->row
);
99 * Valeurs sur la position courante
102 public function current() {
106 public function key() {
111 * Sauter a une position absolue
113 * @param null|string $continue
116 public function seek($n=0, $continue=null) {
117 if (!sql_seek($this->sqlresult
, $n, $this->command
['connect'], $continue)) {
118 // SQLite ne sait pas seek(), il faut relancer la query
119 // si la position courante est apres la position visee
120 // il faut relancer la requete
126 // et utiliser la methode par defaut pour se deplacer au bon endroit
127 // (sera fait en cas d'echec de cette fonction)
130 $this->row
= sql_fetch($this->sqlresult
, $this->command
['connect']);
131 $this->pos
= min($n,$this->count());
139 public function next(){
140 $this->row
= sql_fetch($this->sqlresult
, $this->command
['connect']);
142 $this->firstseek |
= true;
146 * Avancer et retourner les donnees pour le nouvel element
147 * @return array|bool|null
149 public function fetch(){
150 if ($this->valid()) {
151 $r = $this->current();
159 * liberer les ressources
162 public function free(){
163 if (!$this->sqlresult
) return true;
164 $a = sql_free($this->sqlresult
, $this->command
['connect']);
165 $this->sqlresult
= null;
170 * Compter le nombre de resultats
173 public function count() {
174 if (is_null($this->total
)) {
175 if (!$this->sqlresult
) {
179 if (in_array('count(*)', $this->command
['select'])) {
181 $s = $this->current();
182 $this->total
= $s['count(*)'];
184 $this->total
= sql_count($this->sqlresult
, $this->command
['connect']);