Skip to content
Extraits de code Groupes Projets
Valider 57bb1253 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

methode skip() generique sur la classe Iter, qui permet de retrouver une...

methode skip() generique sur la classe Iter, qui permet de retrouver une balise #SAUTER fonctionnelle
parent a13d5fc3
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -1373,13 +1373,11 @@ function balise_SAUTER_dist($p){
erreur_squelette($msg, $p);
}
else {
$_connect = sql_quote($boucle->sql_serveur);
$_saut = interprete_argument_balise(1,$p);
$_compteur = "\$Numrows['$id_boucle']['compteur_boucle']";
$_total = "\$Numrows['$id_boucle']['total']";
$p->code = "vide($_compteur=sql_skip(\$result,$_compteur,$_saut,$_total,$_connect))";
$p->code = "vide($_compteur=\$iter->skip($_saut,$_total))";
}
$p->interdire_scripts = false;
return $p;
......
......@@ -93,8 +93,8 @@ class Iter implements Iterator {
protected $total=null;
/**
* avancer en position n,
* comptee en absolu depuis le debut
* aller a la position absolue n,
* comptee depuis le debut
*
* @param int $n
* absolute pos
......@@ -112,6 +112,31 @@ class Iter implements Iterator {
return true;
}
/**
* Avancer de $saut pas
* @param $saut
* @param $max
* @return int
*/
public function skip($saut, $max=null){
// pas de saut en arriere autorise pour cette fonction
if (($saut=intval($saut))<=0) return $this->pos;
$seek = $this->pos + $saut;
// si le saut fait depasser le maxi, on libere la resource
// et on sort
if (is_null($max))
$max = $this->total();
if ($seek>=$max OR $seek>=$this->total()) {
// sortie plus rapide que de faire next() jusqu'a la fin !
$this->free();
return $max;
}
$this->seek($seek);
return $this->pos;
}
/**
* Renvoyer un tableau des donnees correspondantes
* a la position courante de l'iterateur
......@@ -225,8 +250,12 @@ class IterSQL extends Iter {
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
$this->free();
$this->select();
// si la position courante est apres la position visee
// il faut relancer la requete
if ($this->pos>$n){
$this->free();
$this->select();
}
// et utiliser la methode par defaut pour se deplacer au bon endroit
parent::seek($n);
return true;
......@@ -264,7 +293,10 @@ class IterSQL extends Iter {
*/
public function free(){
parent::free();
return sql_free($this->sqlresult, $this->command['connect']);
if (!$this->sqlresult) return true;
$a = sql_free($this->sqlresult, $this->command['connect']);
$this->sqlresult = null;
return $a;
}
/**
......@@ -329,24 +361,26 @@ class IterENUM extends Iter {
$this->command = $command;
$this->info = $info;
if (is_array($this->command['where']))
foreach ($this->command['where'] as $k => $com) {
switch($com[1]) {
case 'valeur':
unset($op);
if ($com[0] == 'REGEXP')
$this->filtre[] = 'preg_match("/". '.str_replace('\"', '"', $com[2]).'."/", $'.$com[1].')';
else if ($com[0] == '=')
$op = '==';
else if (in_array($com[0], array('<','<=', '>', '>=')))
$op = $com[0];
if ($op)
$this->filtre[] = '$'.$com[1].$op.str_replace('\"', '"', $com[2]);
break;
}
$op = '';
if (is_array($this->command['where'])) {
foreach ($this->command['where'] as $k => $com) {
switch($com[1]) {
case 'valeur':
unset($op);
if ($com[0] == 'REGEXP')
$this->filtre[] = 'preg_match("/". '.str_replace('\"', '"', $com[2]).'."/", $'.$com[1].')';
else if ($com[0] == '=')
$op = '==';
else if (in_array($com[0], array('<','<=', '>', '>=')))
$op = $com[0];
if ($op)
$this->filtre[] = '$'.$com[1].$op.str_replace('\"', '"', $com[2]);
break;
}
}
}
$this->pos = 0;
......@@ -560,43 +594,45 @@ class IterDATA extends Iter {
}
}
if (is_array($this->command['where']))
foreach ($this->command['where'] as $k => $com) {
switch($com[1]) {
case 'tableau':
if ($com[0] !== '=') {
// erreur
}
# sql_quote a l'envers : pas propre...
# c'est pour la compat ascendante avec le critere
# {tableau=#ENV...} de la boucle POUR de SPIP-Bonux-2
$x = null;
eval ('$x = '.str_replace('\"', '"', $com[2]).';');
if (is_array($x) OR is_array($x = @unserialize($x))) {
$this->tableau = $x;
$this->ok = true;
}
else
{
if (is_array($this->command['where'])) {
$op = '';
foreach ($this->command['where'] as $k => $com) {
switch($com[1]) {
case 'tableau':
if ($com[0] !== '=') {
// erreur
}
break;
case 'cle':
case 'valeur':
unset($op);
if ($com[0] == 'REGEXP')
$this->filtre[] = 'preg_match("/". '.str_replace('\"', '"', $com[2]).'."/", $'.$com[1].')';
else if ($com[0] == '=')
$op = '==';
else if (in_array($com[0], array('<','<=', '>', '>=')))
$op = $com[0];
if ($op)
$this->filtre[] = '$'.$com[1].$op.str_replace('\"', '"', $com[2]);
break;
}
# sql_quote a l'envers : pas propre...
# c'est pour la compat ascendante avec le critere
# {tableau=#ENV...} de la boucle POUR de SPIP-Bonux-2
$x = null;
eval ('$x = '.str_replace('\"', '"', $com[2]).';');
if (is_array($x) OR is_array($x = @unserialize($x))) {
$this->tableau = $x;
$this->ok = true;
}
else
{
// erreur
}
break;
case 'cle':
case 'valeur':
unset($op);
if ($com[0] == 'REGEXP')
$this->filtre[] = 'preg_match("/". '.str_replace('\"', '"', $com[2]).'."/", $'.$com[1].')';
else if ($com[0] == '=')
$op = '==';
else if (in_array($com[0], array('<','<=', '>', '>=')))
$op = $com[0];
if ($op)
$this->filtre[] = '$'.$com[1].$op.str_replace('\"', '"', $com[2]);
break;
}
}
}
// Appliquer les filtres sur (cle,valeur)
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter