Skip to content
Extraits de code Groupes Projets
Valider b8fe746d rédigé par esj's avatar esj
Parcourir les fichiers

Suite de [14363]: structuration du code produit à travers un sprintf. Au...

Suite de [14363]: structuration du code produit à travers un sprintf. Au passage, le code produit utilise maintenant str_repeat au lieu de le réinventer. Les tests unitaires sur les boucles donnent la même chose qu'auparavant.
parent 06b6af73
Branches
Étiquettes
Aucune requête de fusion associée trouvée
...@@ -232,17 +232,24 @@ function calculer_boucle_rec($id_boucle, &$boucles, $trace) { ...@@ -232,17 +232,24 @@ function calculer_boucle_rec($id_boucle, &$boucles, $trace) {
// Ci-dessous la constante donnant le cadre systematique du code: // Ci-dessous la constante donnant le cadre systematique du code:
// %s1: initialisation des arguments de calculer_select // %s1: initialisation des arguments de calculer_select
// %s2: appel de calculer_select en donnant un contexte pour les cas d'erreur // %s2: appel de calculer_select en donnant un contexte pour les cas d'erreur
// %s3: boucle sql_fetch ou equivalent, sauf si requete fausse // %s3: initialisation du sous-tableau Numrows[id_boucle]
// %s4: liberation de la ressource, en tenant compte du serveur SQL // %s4: sauvegarde de la langue et calcul des invariants de boucle sur elle
// %s4: code de trace eventuel avant le retour // %s5: boucle while sql_fetch ou str_repeat si corps monotone
// %s6: restauration de la langue
// %s7: liberation de la ressource, en tenant compte du serveur SQL
// %s8: code de trace eventuel avant le retour
define('CODE_CORPS_BOUCLE', '%s define('CODE_CORPS_BOUCLE', '%s
$t0 = ""; $t0 = "";
// REQUETE // REQUETE
$result = calculer_select($select, $from, $type, $where, $join, $groupby, $orderby, $limit, $having, $table, $id, $connect, $result = calculer_select($select, $from, $type, $where, $join, $groupby, $orderby, $limit, $having, $table, $id, $connect,
array(%s)); array(%s));
if ($result) {%s@sql_free($result%s);} if ($result) {
%s%s$SP++;
// RESULTATS
%s %s
%s@sql_free($result%s);
}%s
return $t0;' return $t0;'
); );
...@@ -254,28 +261,7 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) { ...@@ -254,28 +261,7 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) {
$type_boucle = $boucle->type_requete; $type_boucle = $boucle->type_requete;
$primary = $boucle->primary; $primary = $boucle->primary;
$constant = preg_match(CODE_MONOTONE, str_replace("\\'",'', $return)); $constant = preg_match(CODE_MONOTONE, str_replace("\\'",'', $return));
$corps = '';
// Cas {1/3} {1,4} {n-2,1}...
$flag_cpt = $boucle->mode_partie ||$boucle->cptrows;
//
// Creer le debut du corps de la boucle :
//
$corps = !$flag_cpt ? '' : "\n \$Numrows['$id_boucle']['compteur_boucle']++;";
if ($boucle->mode_partie)
$corps .= "
if (\$Numrows['$id_boucle']['compteur_boucle'] > \$debut_boucle) {
if (\$Numrows['$id_boucle']['compteur_boucle']-1 > \$fin_boucle) break;\n";
// Calculer les invalideurs si c'est une boucle non constante et si on
// souhaite invalider ces elements
if (!$constant AND $primary) {
include_spip('inc/invalideur');
if (function_exists($i = 'calcul_invalideurs'))
$corps = $i($corps, $primary, $boucles, $id_boucle);
}
// faudrait expanser le foreach a la compil, car y en a souvent qu'un // faudrait expanser le foreach a la compil, car y en a souvent qu'un
// et puis faire un [] plutot qu'un "','." // et puis faire un [] plutot qu'un "','."
...@@ -284,9 +270,6 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) { ...@@ -284,9 +270,6 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) {
index_pile($id_boucle, $primary, $boucles) index_pile($id_boucle, $primary, $boucles)
. "; // doublons\n"; . "; // doublons\n";
if (count($boucle->separateur))
$code_sep = ("'" . str_replace("'","\'",join('',$boucle->separateur)) . "'");
// La boucle doit-elle selectionner la langue ? // La boucle doit-elle selectionner la langue ?
// -. par defaut, les boucles suivantes le font // -. par defaut, les boucles suivantes le font
// "peut-etre", c'est-a-dire si forcer_lang == false. // "peut-etre", c'est-a-dire si forcer_lang == false.
...@@ -302,8 +285,8 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) { ...@@ -302,8 +285,8 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) {
{ {
// Memoriser la langue avant la boucle et la restituer apres // Memoriser la langue avant la boucle et la restituer apres
// afin que le corps de boucle affecte la globale directement // afin que le corps de boucle affecte la globale directement
$init = "\n lang_select(\$GLOBALS['spip_lang']);"; $ìnit_lang = "lang_select(\$GLOBALS['spip_lang']);\n\t";
$fin = "\n lang_select();"; $fin_lang = "lang_select();\n\t";
$corps .= $corps .=
(($boucle->lang_select != 'oui') ? (($boucle->lang_select != 'oui') ?
...@@ -313,14 +296,14 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) { ...@@ -313,14 +296,14 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) {
. ') $GLOBALS["spip_lang"] = $x;'; . ') $GLOBALS["spip_lang"] = $x;';
} }
else { else {
$init = ''; $ìnit_lang = '';
$fin = ''; $fin_lang = '';
// sortir les appels au traducteur (invariants de boucle) // sortir les appels au traducteur (invariants de boucle)
if (strpos($return, '?php') === false if (strpos($return, '?php') === false
AND preg_match_all("/\W(_T[(]'[^']*'[)])/", $return, $r)) { AND preg_match_all("/\W(_T[(]'[^']*'[)])/", $return, $r)) {
$i = 1; $i = 1;
foreach($r[1] as $t) { foreach($r[1] as $t) {
$init .= "\n\t\$l$i = $t;"; $ìnit_lang .= "\n\t\$l$i = $t;";
$return = str_replace($t, "\$l$i", $return); $return = str_replace($t, "\$l$i", $return);
$i++; $i++;
} }
...@@ -328,6 +311,9 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) { ...@@ -328,6 +311,9 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) {
} }
// gestion optimale des separateurs et des boucles constantes // gestion optimale des separateurs et des boucles constantes
if (count($boucle->separateur))
$code_sep = ("'" . str_replace("'","\'",join('',$boucle->separateur)) . "'");
$corps .= $corps .=
((!$boucle->separateur) ? ((!$boucle->separateur) ?
(($constant && !$corps) ? $return : (($constant && !$corps) ? $return :
...@@ -340,13 +326,32 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) { ...@@ -340,13 +326,32 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) {
";\n\t\t" . ";\n\t\t" .
'$t0 .= (($t1 && $t0) ? ' . $code_sep . " : '') . \$t1;")); '$t0 .= (($t1 && $t0) ? ' . $code_sep . " : '') . \$t1;"));
// Fin de parties // Calculer les invalideurs si c'est une boucle non constante et si on
if ($boucle->mode_partie) $corps .= "\n }\n"; // souhaite invalider ces elements
if (!$constant AND $primary) {
include_spip('inc/invalideur');
if (function_exists($i = 'calcul_invalideurs'))
$corps = $i($corps, $primary, $boucles, $id_boucle);
}
// gerer le compteur de boucle
// avec ou sans son utilisation par les criteres {1/3} {1,4} {n-2,1}...
if ($boucle->mode_partie)
$corps =
"\n\t\t\$Numrows['$id_boucle']['compteur_boucle']++;
if (\$Numrows['$id_boucle']['compteur_boucle'] > \$debut_boucle) {
if (\$Numrows['$id_boucle']['compteur_boucle']-1 > \$fin_boucle) break;\n$corps\n }\n";
elseif ($boucle->cptrows)
$corps = "\n\t\t\$Numrows['$id_boucle']['compteur_boucle']++;$corps";
$serveur = !$boucle->sql_serveur ? '' $serveur = !$boucle->sql_serveur ? ''
: (', ' . _q($boucle->sql_serveur)); : (', ' . _q($boucle->sql_serveur));
// si le corps est une constante, ne pas appeler le serveur N fois! // si le corps est une constante, ne pas appeler le serveur N fois!
if (preg_match(CODE_MONOTONE,str_replace("\\'",'',$corps), $r)) { if (preg_match(CODE_MONOTONE,str_replace("\\'",'',$corps), $r)) {
if (!isset($r[2]) OR (!$r[2])) { if (!isset($r[2]) OR (!$r[2])) {
if (!$boucle->numrows) if (!$boucle->numrows)
...@@ -355,19 +360,9 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) { ...@@ -355,19 +360,9 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) {
$corps = ""; $corps = "";
} else { } else {
$boucle->numrows = true; $boucle->numrows = true;
$corps = "\n ".'for($x=$Numrows["'.$id_boucle.'"]["total"];$x>0;$x--) $corps = "\n\t\$t0 = str_repeat($corps, \$Numrows['$id_boucle']['total']);";
$t0 .= ' . $corps .';';
} }
} else { } else $corps = "while (\$Pile[\$SP] = @sql_fetch(\$result$serveur)) {\n$corps\n }";
$corps = $init . '
$SP++;
// RESULTATS
while ($Pile[$SP] = @sql_fetch($result' . $serveur .
")) {\n$corps\n }\n" .
$fin ;
}
$count = ''; $count = '';
if (!$boucle->select) { if (!$boucle->select) {
...@@ -381,17 +376,17 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) { ...@@ -381,17 +376,17 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) {
if ($count == 'count(*)') if ($count == 'count(*)')
$count = "array_shift(sql_fetch(\$result$serveur))"; $count = "array_shift(sql_fetch(\$result$serveur))";
else $count = "sql_count(\$result$serveur)"; else $count = "sql_count(\$result$serveur)";
$count = !$boucle->mode_partie $count = (!$boucle->mode_partie
? "\n\t\$Numrows['$id_boucle']['total'] = @intval($count);" ? "\$Numrows['$id_boucle']['total'] = @intval($count);"
: calculer_parties($boucles, $id_boucle, $count); : calculer_parties($boucles[$id_boucle], $id_boucle, $count))
. "\n\t";
} else $count = ''; } else $count = '';
$corps = $count if ($boucle->mode_partie || $boucle->cptrows)
. (!$flag_cpt ? "" : $count .= "\$Numrows['$id_boucle']['compteur_boucle'] = 0;\n\t";
"\n\t\$Numrows['$id_boucle']['compteur_boucle'] = 0;"
. (($boucle->mode_partie)?"\n\tif (isset(\$debut_boucle) AND \$debut_boucle>0 AND sql_seek(\$result,\$debut_boucle,"._q($boucle->sql_serveur).",'continue'))\n\t\t\$Numrows['$id_boucle']['compteur_boucle']=\$debut_boucle;":"")) if ($boucle->mode_partie)
. $corps $count .= "if (isset(\$debut_boucle) AND \$debut_boucle>0 AND sql_seek(\$result,\$debut_boucle,"._q($boucle->sql_serveur).",'continue'))\n\t\t\$Numrows['$id_boucle']['compteur_boucle']=\$debut_boucle;\n\t";
. "\n\t";
// Ne calculer la requete que maintenant // Ne calculer la requete que maintenant
// car ce qui precede appelle index_pile qui influe dessus // car ce qui precede appelle index_pile qui influe dessus
...@@ -402,14 +397,13 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) { ...@@ -402,14 +397,13 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) {
$contexte = memoriser_contexte_compil($boucle); $contexte = memoriser_contexte_compil($boucle);
return sprintf(CODE_CORPS_BOUCLE, $init, $contexte, $corps, $serveur, $trace); return sprintf(CODE_CORPS_BOUCLE, $init, $contexte, $count, $ìnit_lang, $corps, $fin_lang, $serveur, $trace);
} }
// http://doc.spip.org/@calculer_requete_sql // http://doc.spip.org/@calculer_requete_sql
function calculer_requete_sql($boucle) function calculer_requete_sql($boucle)
{ {
return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '') return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '')
. $boucle->in . $boucle->in
. $boucle->hash . $boucle->hash
...@@ -531,9 +525,8 @@ function calculer_order(&$boucle) ...@@ -531,9 +525,8 @@ function calculer_order(&$boucle)
// Code specifique aux criteres {1,n} {n/m} etc // Code specifique aux criteres {1,n} {n/m} etc
// //
// http://doc.spip.org/@calculer_parties // http://doc.spip.org/@calculer_parties
function calculer_parties($boucles, $id_boucle, $count) { function calculer_parties($boucle, $id_boucle, $count) {
$boucle = &$boucles[$id_boucle];
$partie = $boucle->partie; $partie = $boucle->partie;
$mode_partie = $boucle->mode_partie; $mode_partie = $boucle->mode_partie;
$total_parties = $boucle->total_parties; $total_parties = $boucle->total_parties;
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter