row = null; $v = &$this->command; $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); $this->err = !$this->sqlresult; $this->firstseek = false; $this->pos = -1; // pas d'init a priori, le calcul ne sera fait qu'en cas de besoin (provoque une double requete souvent inutile en sqlite) //$this->total = $this->count(); } /* * array command: les commandes d'initialisation * array info: les infos sur le squelette */ public function __construct($command, $info=array()) { $this->type='SQL'; $this->command = $command; $this->info = $info; $this->select(); } /** * Rembobiner * @return bool */ public function rewind() { return ($this->pos > 0) ? $this->seek(0) : true; } /** * Verifier l'etat de l'iterateur * @return bool */ public function valid() { if ($this->err) return false; if (!$this->firstseek) $this->next(); return is_array($this->row); } /** * Valeurs sur la position courante * @return array */ public function current() { return $this->row; } public function key() { return $this->pos; } /** * Sauter a une position absolue * @param int $n * @param null|string $continue * @return bool */ public function seek($n=0, $continue=null) { if (!sql_seek($this->sqlresult, $n, $this->command['connect'], $continue)) { // SQLite ne sait pas seek(), il faut relancer la query // si la position courante est apres la position visee // il faut relancer la requete if ($this->pos>$n){ $this->free(); $this->select(); $this->valid(); } // et utiliser la methode par defaut pour se deplacer au bon endroit // (sera fait en cas d'echec de cette fonction) return false; } $this->row = sql_fetch($this->sqlresult, $this->command['connect']); $this->pos = min($n,$this->count()); return true; } /** * Avancer d'un cran * @return void */ public function next(){ $this->row = sql_fetch($this->sqlresult, $this->command['connect']); $this->pos ++; $this->firstseek |= true; } /** * Avancer et retourner les donnees pour le nouvel element * @return array|bool|null */ public function fetch(){ if ($this->valid()) { $r = $this->current(); $this->next(); } else $r = false; return $r; } /** * liberer les ressources * @return bool */ public function free(){ if (!$this->sqlresult) return true; $a = sql_free($this->sqlresult, $this->command['connect']); $this->sqlresult = null; return $a; } /** * Compter le nombre de resultats * @return int */ public function count() { if (is_null($this->total)) { if (!$this->sqlresult) { $this->total = 0; } else { # cas count(*) if (in_array('count(*)', $this->command['select'])) { $this->valid(); $s = $this->current(); $this->total = $s['count(*)']; } else $this->total = sql_count($this->sqlresult, $this->command['connect']); } } return $this->total; } } ?>