@@ -41,87 +41,87 @@ discard block |
||
| 41 | 41 | * @return array |
| 42 | 42 | */ |
| 43 | 43 | function inc_prepare_recherche_dist($recherche, $table='articles', $cond=false, $serveur='', $modificateurs = array(), $primary='') { |
| 44 | - static $cache = array(); |
|
| 45 | - $delai_fraicheur = min(_DELAI_CACHE_resultats,time()-$GLOBALS['meta']['derniere_modif']); |
|
| 44 | + static $cache = array(); |
|
| 45 | + $delai_fraicheur = min(_DELAI_CACHE_resultats,time()-$GLOBALS['meta']['derniere_modif']); |
|
| 46 | 46 | |
| 47 | - // si recherche n'est pas dans le contexte, on va prendre en globals |
|
| 48 | - // ca permet de faire des inclure simple. |
|
| 49 | - if (!isset($recherche) AND isset($GLOBALS['recherche'])) |
|
| 50 | - $recherche = $GLOBALS['recherche']; |
|
| 47 | + // si recherche n'est pas dans le contexte, on va prendre en globals |
|
| 48 | + // ca permet de faire des inclure simple. |
|
| 49 | + if (!isset($recherche) AND isset($GLOBALS['recherche'])) |
|
| 50 | + $recherche = $GLOBALS['recherche']; |
|
| 51 | 51 | |
| 52 | - // traiter le cas {recherche?} |
|
| 53 | - if ($cond AND !strlen($recherche)) |
|
| 54 | - return array("0 as points" /* as points */, /* where */ ''); |
|
| 52 | + // traiter le cas {recherche?} |
|
| 53 | + if ($cond AND !strlen($recherche)) |
|
| 54 | + return array("0 as points" /* as points */, /* where */ ''); |
|
| 55 | 55 | |
| 56 | 56 | |
| 57 | - $rechercher = false; |
|
| 58 | - |
|
| 59 | - if (!isset($cache[$serveur][$table][$recherche])){ |
|
| 60 | - $hash_serv = ($serveur?substr(md5($serveur),0,16):''); |
|
| 61 | - $hash = substr(md5($recherche . $table),0,16); |
|
| 62 | - $where = "(resultats.recherche='$hash' AND resultats.table_objet=".sql_quote($table)." AND resultats.serveur='$hash_serv')"; |
|
| 63 | - $row = sql_fetsel('UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(resultats.maj) AS fraicheur','spip_resultats AS resultats',$where,'','fraicheur DESC','0,1'); |
|
| 64 | - if (!$row |
|
| 65 | - OR ($row['fraicheur']>$delai_fraicheur) |
|
| 66 | - OR (defined('_VAR_MODE') AND _VAR_MODE=='recalcul')){ |
|
| 67 | - $rechercher = true; |
|
| 68 | - } |
|
| 69 | - } |
|
| 70 | - |
|
| 71 | - // si on n'a pas encore traite les donnees dans une boucle precedente |
|
| 72 | - if ($rechercher) { |
|
| 73 | - //$tables = liste_des_champs(); |
|
| 74 | - $x = objet_type($table); |
|
| 75 | - $points = recherche_en_base($recherche, |
|
| 76 | - $x, |
|
| 77 | - array( |
|
| 78 | - 'score' => true, |
|
| 79 | - 'toutvoir' => true, |
|
| 80 | - 'jointures' => true |
|
| 81 | - ), |
|
| 82 | - $serveur); |
|
| 83 | - // pas de résultat, pas de point |
|
| 84 | - $points = isset($points[$x]) ? $points[$x] : array(); |
|
| 85 | - |
|
| 86 | - // permettre aux plugins de modifier le resultat |
|
| 87 | - $points = pipeline('prepare_recherche',array( |
|
| 88 | - 'args'=>array('type'=>$x,'recherche'=>$recherche,'serveur'=>$serveur,'modificateurs'=>$modificateurs), |
|
| 89 | - 'data'=>$points |
|
| 90 | - )); |
|
| 91 | - |
|
| 92 | - // supprimer les anciens resultats de cette recherche |
|
| 93 | - // et les resultats trop vieux avec une marge |
|
| 94 | - // pas de AS resultats dans un delete (mysql) |
|
| 95 | - $whered = str_replace(array("resultats.recherche","resultats.table_objet","resultats.serveur"),array("recherche","table_objet","serveur"),$where); |
|
| 96 | - sql_delete('spip_resultats', 'NOT(' .sql_date_proche('maj', (0-($delai_fraicheur+100)), " SECOND") . ") OR ($whered)"); |
|
| 97 | - |
|
| 98 | - // inserer les resultats dans la table de cache des resultats |
|
| 99 | - if (count($points)){ |
|
| 100 | - $tab_couples = array(); |
|
| 101 | - foreach ($points as $id => $p){ |
|
| 102 | - $tab_couples[] = array( |
|
| 103 | - 'recherche' => $hash, |
|
| 104 | - 'id' => $id, |
|
| 105 | - 'points' => $p['score'], |
|
| 106 | - 'table_objet' => $table, |
|
| 107 | - 'serveur' => $hash_serv, |
|
| 108 | - ); |
|
| 109 | - } |
|
| 110 | - sql_insertq_multi('spip_resultats',$tab_couples,array()); |
|
| 111 | - } |
|
| 112 | - } |
|
| 113 | - |
|
| 114 | - if (!isset($cache[$serveur][$table][$recherche])){ |
|
| 115 | - if (!$serveur) |
|
| 116 | - $cache[$serveur][$table][$recherche] = array("resultats.points AS points",$where); |
|
| 117 | - else { |
|
| 118 | - if (sql_countsel('spip_resultats as resultats',$where)) |
|
| 119 | - $rows = sql_allfetsel('resultats.id,resultats.points','spip_resultats as resultats',$where); |
|
| 120 | - $cache[$serveur][$table][$recherche] = generer_select_where_explicites($table, $primary, $rows, $serveur); |
|
| 121 | - } |
|
| 122 | - } |
|
| 123 | - |
|
| 124 | - return $cache[$serveur][$table][$recherche]; |
|
| 57 | + $rechercher = false; |
|
| 58 | + |
|
| 59 | + if (!isset($cache[$serveur][$table][$recherche])){ |
|
| 60 | + $hash_serv = ($serveur?substr(md5($serveur),0,16):''); |
|
| 61 | + $hash = substr(md5($recherche . $table),0,16); |
|
| 62 | + $where = "(resultats.recherche='$hash' AND resultats.table_objet=".sql_quote($table)." AND resultats.serveur='$hash_serv')"; |
|
| 63 | + $row = sql_fetsel('UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(resultats.maj) AS fraicheur','spip_resultats AS resultats',$where,'','fraicheur DESC','0,1'); |
|
| 64 | + if (!$row |
|
| 65 | + OR ($row['fraicheur']>$delai_fraicheur) |
|
| 66 | + OR (defined('_VAR_MODE') AND _VAR_MODE=='recalcul')){ |
|
| 67 | + $rechercher = true; |
|
| 68 | + } |
|
| 69 | + } |
|
| 70 | + |
|
| 71 | + // si on n'a pas encore traite les donnees dans une boucle precedente |
|
| 72 | + if ($rechercher) { |
|
| 73 | + //$tables = liste_des_champs(); |
|
| 74 | + $x = objet_type($table); |
|
| 75 | + $points = recherche_en_base($recherche, |
|
| 76 | + $x, |
|
| 77 | + array( |
|
| 78 | + 'score' => true, |
|
| 79 | + 'toutvoir' => true, |
|
| 80 | + 'jointures' => true |
|
| 81 | + ), |
|
| 82 | + $serveur); |
|
| 83 | + // pas de résultat, pas de point |
|
| 84 | + $points = isset($points[$x]) ? $points[$x] : array(); |
|
| 85 | + |
|
| 86 | + // permettre aux plugins de modifier le resultat |
|
| 87 | + $points = pipeline('prepare_recherche',array( |
|
| 88 | + 'args'=>array('type'=>$x,'recherche'=>$recherche,'serveur'=>$serveur,'modificateurs'=>$modificateurs), |
|
| 89 | + 'data'=>$points |
|
| 90 | + )); |
|
| 91 | + |
|
| 92 | + // supprimer les anciens resultats de cette recherche |
|
| 93 | + // et les resultats trop vieux avec une marge |
|
| 94 | + // pas de AS resultats dans un delete (mysql) |
|
| 95 | + $whered = str_replace(array("resultats.recherche","resultats.table_objet","resultats.serveur"),array("recherche","table_objet","serveur"),$where); |
|
| 96 | + sql_delete('spip_resultats', 'NOT(' .sql_date_proche('maj', (0-($delai_fraicheur+100)), " SECOND") . ") OR ($whered)"); |
|
| 97 | + |
|
| 98 | + // inserer les resultats dans la table de cache des resultats |
|
| 99 | + if (count($points)){ |
|
| 100 | + $tab_couples = array(); |
|
| 101 | + foreach ($points as $id => $p){ |
|
| 102 | + $tab_couples[] = array( |
|
| 103 | + 'recherche' => $hash, |
|
| 104 | + 'id' => $id, |
|
| 105 | + 'points' => $p['score'], |
|
| 106 | + 'table_objet' => $table, |
|
| 107 | + 'serveur' => $hash_serv, |
|
| 108 | + ); |
|
| 109 | + } |
|
| 110 | + sql_insertq_multi('spip_resultats',$tab_couples,array()); |
|
| 111 | + } |
|
| 112 | + } |
|
| 113 | + |
|
| 114 | + if (!isset($cache[$serveur][$table][$recherche])){ |
|
| 115 | + if (!$serveur) |
|
| 116 | + $cache[$serveur][$table][$recherche] = array("resultats.points AS points",$where); |
|
| 117 | + else { |
|
| 118 | + if (sql_countsel('spip_resultats as resultats',$where)) |
|
| 119 | + $rows = sql_allfetsel('resultats.id,resultats.points','spip_resultats as resultats',$where); |
|
| 120 | + $cache[$serveur][$table][$recherche] = generer_select_where_explicites($table, $primary, $rows, $serveur); |
|
| 121 | + } |
|
| 122 | + } |
|
| 123 | + |
|
| 124 | + return $cache[$serveur][$table][$recherche]; |
|
| 125 | 125 | } |
| 126 | 126 | |
| 127 | 127 | |
@@ -137,23 +137,23 @@ discard block |
||
| 137 | 137 | * @return array |
| 138 | 138 | */ |
| 139 | 139 | function generer_select_where_explicites($table, $primary, $rows, $serveur){ |
| 140 | - # calculer le {id_article IN()} et le {... as points} |
|
| 141 | - if (!count($rows)){ |
|
| 142 | - return array("''", "0=1"); |
|
| 143 | - } |
|
| 144 | - else { |
|
| 145 | - $listes_ids = array(); |
|
| 146 | - $select = '0'; |
|
| 147 | - foreach ($rows as $r) |
|
| 148 | - $listes_ids[$r['points']][] = $r['id']; |
|
| 149 | - |
|
| 150 | - foreach ($listes_ids as $p => $ids) |
|
| 151 | - $select .= "+$p*(". |
|
| 152 | - sql_in("$table.$primary", $ids,'',$serveur) |
|
| 153 | - .") "; |
|
| 154 | - |
|
| 155 | - return array("$select AS points ",calcul_mysql_in("$table.$primary",array_map('reset',$rows),'',$serveur)); |
|
| 156 | - } |
|
| 140 | + # calculer le {id_article IN()} et le {... as points} |
|
| 141 | + if (!count($rows)){ |
|
| 142 | + return array("''", "0=1"); |
|
| 143 | + } |
|
| 144 | + else { |
|
| 145 | + $listes_ids = array(); |
|
| 146 | + $select = '0'; |
|
| 147 | + foreach ($rows as $r) |
|
| 148 | + $listes_ids[$r['points']][] = $r['id']; |
|
| 149 | + |
|
| 150 | + foreach ($listes_ids as $p => $ids) |
|
| 151 | + $select .= "+$p*(". |
|
| 152 | + sql_in("$table.$primary", $ids,'',$serveur) |
|
| 153 | + .") "; |
|
| 154 | + |
|
| 155 | + return array("$select AS points ",calcul_mysql_in("$table.$primary",array_map('reset',$rows),'',$serveur)); |
|
| 156 | + } |
|
| 157 | 157 | } |
| 158 | 158 | |
| 159 | 159 | |
@@ -21,28 +21,28 @@ discard block |
||
| 21 | 21 | * @return array |
| 22 | 22 | */ |
| 23 | 23 | function cvtconf_formulaire_charger($flux){ |
| 24 | - if ( |
|
| 25 | - $form = $flux['args']['form'] |
|
| 26 | - and strncmp($form,'configurer_',11)==0 // un #FORMULAIRE_CONFIGURER_XXX |
|
| 27 | - ) { |
|
| 28 | - // Pour tous les formulaires CONFIGURER, ayant une fonction charger ou pas, on teste si autorisé |
|
| 29 | - include_spip('inc/autoriser'); |
|
| 30 | - if (!autoriser('configurer', '_'.substr($form,11))) { |
|
| 31 | - return false; |
|
| 32 | - } |
|
| 24 | + if ( |
|
| 25 | + $form = $flux['args']['form'] |
|
| 26 | + and strncmp($form,'configurer_',11)==0 // un #FORMULAIRE_CONFIGURER_XXX |
|
| 27 | + ) { |
|
| 28 | + // Pour tous les formulaires CONFIGURER, ayant une fonction charger ou pas, on teste si autorisé |
|
| 29 | + include_spip('inc/autoriser'); |
|
| 30 | + if (!autoriser('configurer', '_'.substr($form,11))) { |
|
| 31 | + return false; |
|
| 32 | + } |
|
| 33 | 33 | |
| 34 | - // S'il n'y a pas de fonction charger(), on génère un contexte automatiquement |
|
| 35 | - if (!charger_fonction("charger","formulaires/$form/",true)) { |
|
| 36 | - $flux['data'] = cvtconf_formulaires_configurer_recense($form); |
|
| 37 | - $flux['data']['editable'] = true; |
|
| 38 | - if (_request('var_mode')=='configurer' AND autoriser('webmestre')){ |
|
| 39 | - if (!_AJAX) var_dump($flux['data']); |
|
| 40 | - // reinjecter pour la trace au traitement |
|
| 41 | - $flux['data']['_hidden'] = "<input type='hidden' name='var_mode' value='configurer' />"; |
|
| 42 | - } |
|
| 43 | - } |
|
| 44 | - } |
|
| 45 | - return $flux; |
|
| 34 | + // S'il n'y a pas de fonction charger(), on génère un contexte automatiquement |
|
| 35 | + if (!charger_fonction("charger","formulaires/$form/",true)) { |
|
| 36 | + $flux['data'] = cvtconf_formulaires_configurer_recense($form); |
|
| 37 | + $flux['data']['editable'] = true; |
|
| 38 | + if (_request('var_mode')=='configurer' AND autoriser('webmestre')){ |
|
| 39 | + if (!_AJAX) var_dump($flux['data']); |
|
| 40 | + // reinjecter pour la trace au traitement |
|
| 41 | + $flux['data']['_hidden'] = "<input type='hidden' name='var_mode' value='configurer' />"; |
|
| 42 | + } |
|
| 43 | + } |
|
| 44 | + } |
|
| 45 | + return $flux; |
|
| 46 | 46 | } |
| 47 | 47 | |
| 48 | 48 | /** |
@@ -52,14 +52,14 @@ discard block |
||
| 52 | 52 | * @return array |
| 53 | 53 | */ |
| 54 | 54 | function cvtconf_formulaire_traiter($flux){ |
| 55 | - if ($form = $flux['args']['form'] |
|
| 56 | - AND strncmp($form,'configurer_',11)==0 // un #FORMULAIRE_CONFIGURER_XXX |
|
| 57 | - AND !charger_fonction("traiter","formulaires/$form/",true) // sans fonction traiter() |
|
| 58 | - ) { |
|
| 59 | - $trace = cvtconf_formulaires_configurer_enregistre($form,$flux['args']['args']); |
|
| 60 | - $flux['data'] = array('message_ok'=>_T('config_info_enregistree').$trace,'editable'=>true); |
|
| 61 | - } |
|
| 62 | - return $flux; |
|
| 55 | + if ($form = $flux['args']['form'] |
|
| 56 | + AND strncmp($form,'configurer_',11)==0 // un #FORMULAIRE_CONFIGURER_XXX |
|
| 57 | + AND !charger_fonction("traiter","formulaires/$form/",true) // sans fonction traiter() |
|
| 58 | + ) { |
|
| 59 | + $trace = cvtconf_formulaires_configurer_enregistre($form,$flux['args']['args']); |
|
| 60 | + $flux['data'] = array('message_ok'=>_T('config_info_enregistree').$trace,'editable'=>true); |
|
| 61 | + } |
|
| 62 | + return $flux; |
|
| 63 | 63 | } |
| 64 | 64 | |
| 65 | 65 | /** |
@@ -75,29 +75,29 @@ discard block |
||
| 75 | 75 | * @return string |
| 76 | 76 | */ |
| 77 | 77 | function cvtconf_formulaires_configurer_enregistre($form,$args){ |
| 78 | - $valeurs = array(); |
|
| 79 | - // charger les valeurs |
|
| 80 | - // ce qui permet de prendre en charge une fonction charger() existante |
|
| 81 | - // qui prend alors la main sur l'auto detection |
|
| 82 | - if ($charger_valeurs = charger_fonction("charger","formulaires/$form/",true)) |
|
| 83 | - $valeurs = call_user_func_array($charger_valeurs,$args); |
|
| 84 | - $valeurs = pipeline( |
|
| 85 | - 'formulaire_charger', |
|
| 86 | - array( |
|
| 87 | - 'args'=>array('form'=>$form,'args'=>$args,'je_suis_poste'=>false), |
|
| 88 | - 'data'=>$valeurs) |
|
| 89 | - ); |
|
| 90 | - // ne pas stocker editable ! |
|
| 91 | - unset($valeurs['editable']); |
|
| 92 | - |
|
| 93 | - // recuperer les valeurs postees |
|
| 94 | - $store = array(); |
|
| 95 | - foreach($valeurs as $k=>$v){ |
|
| 96 | - if (substr($k,0,1)!=='_') |
|
| 97 | - $store[$k] = _request($k); |
|
| 98 | - } |
|
| 99 | - |
|
| 100 | - return cvtconf_configurer_stocker($form,$valeurs,$store); |
|
| 78 | + $valeurs = array(); |
|
| 79 | + // charger les valeurs |
|
| 80 | + // ce qui permet de prendre en charge une fonction charger() existante |
|
| 81 | + // qui prend alors la main sur l'auto detection |
|
| 82 | + if ($charger_valeurs = charger_fonction("charger","formulaires/$form/",true)) |
|
| 83 | + $valeurs = call_user_func_array($charger_valeurs,$args); |
|
| 84 | + $valeurs = pipeline( |
|
| 85 | + 'formulaire_charger', |
|
| 86 | + array( |
|
| 87 | + 'args'=>array('form'=>$form,'args'=>$args,'je_suis_poste'=>false), |
|
| 88 | + 'data'=>$valeurs) |
|
| 89 | + ); |
|
| 90 | + // ne pas stocker editable ! |
|
| 91 | + unset($valeurs['editable']); |
|
| 92 | + |
|
| 93 | + // recuperer les valeurs postees |
|
| 94 | + $store = array(); |
|
| 95 | + foreach($valeurs as $k=>$v){ |
|
| 96 | + if (substr($k,0,1)!=='_') |
|
| 97 | + $store[$k] = _request($k); |
|
| 98 | + } |
|
| 99 | + |
|
| 100 | + return cvtconf_configurer_stocker($form,$valeurs,$store); |
|
| 101 | 101 | } |
| 102 | 102 | |
| 103 | 103 | /** |
@@ -113,25 +113,25 @@ discard block |
||
| 113 | 113 | * @return array |
| 114 | 114 | */ |
| 115 | 115 | function cvtconf_definir_configurer_conteneur($form,$valeurs) { |
| 116 | - // stocker en base |
|
| 117 | - // par defaut, dans un casier serialize dans spip_meta (idem CFG) |
|
| 118 | - $casier = substr($form,11); |
|
| 119 | - $table = 'meta'; |
|
| 120 | - $prefixe = ''; |
|
| 121 | - $stockage = ''; |
|
| 122 | - |
|
| 123 | - if (isset($valeurs['_meta_casier'])) $casier = $valeurs['_meta_casier']; |
|
| 124 | - if (isset($valeurs['_meta_prefixe'])) $prefixe = $valeurs['_meta_prefixe']; |
|
| 125 | - if (isset($valeurs['_meta_stockage'])) $stockage = $valeurs['_meta_stockage'] . '::'; |
|
| 116 | + // stocker en base |
|
| 117 | + // par defaut, dans un casier serialize dans spip_meta (idem CFG) |
|
| 118 | + $casier = substr($form,11); |
|
| 119 | + $table = 'meta'; |
|
| 120 | + $prefixe = ''; |
|
| 121 | + $stockage = ''; |
|
| 122 | + |
|
| 123 | + if (isset($valeurs['_meta_casier'])) $casier = $valeurs['_meta_casier']; |
|
| 124 | + if (isset($valeurs['_meta_prefixe'])) $prefixe = $valeurs['_meta_prefixe']; |
|
| 125 | + if (isset($valeurs['_meta_stockage'])) $stockage = $valeurs['_meta_stockage'] . '::'; |
|
| 126 | 126 | |
| 127 | - // si on indique juste une table, il faut vider les autres proprietes |
|
| 128 | - // car par defaut on utilise ni casier ni prefixe dans ce cas |
|
| 129 | - if (isset($valeurs['_meta_table'])) { |
|
| 130 | - $table = $valeurs['_meta_table']; |
|
| 131 | - $casier = (isset($valeurs['_meta_casier'])?$valeurs['_meta_casier']:''); |
|
| 132 | - } |
|
| 127 | + // si on indique juste une table, il faut vider les autres proprietes |
|
| 128 | + // car par defaut on utilise ni casier ni prefixe dans ce cas |
|
| 129 | + if (isset($valeurs['_meta_table'])) { |
|
| 130 | + $table = $valeurs['_meta_table']; |
|
| 131 | + $casier = (isset($valeurs['_meta_casier'])?$valeurs['_meta_casier']:''); |
|
| 132 | + } |
|
| 133 | 133 | |
| 134 | - return array($table,$casier,$prefixe,$stockage); |
|
| 134 | + return array($table,$casier,$prefixe,$stockage); |
|
| 135 | 135 | } |
| 136 | 136 | |
| 137 | 137 | /** |
@@ -142,39 +142,39 @@ discard block |
||
| 142 | 142 | * @return array |
| 143 | 143 | */ |
| 144 | 144 | function cvtconf_formulaires_configurer_recense($form){ |
| 145 | - $valeurs = array('editable'=>' '); |
|
| 146 | - |
|
| 147 | - // sinon cas analyse du squelette |
|
| 148 | - if ($f = find_in_path($form.'.' . _EXTENSION_SQUELETTES, 'formulaires/') |
|
| 149 | - AND lire_fichier($f, $contenu)) { |
|
| 150 | - |
|
| 151 | - for ($i=0;$i<2;$i++) { |
|
| 152 | - // a la seconde iteration, evaluer le fond avec les valeurs deja trouvees |
|
| 153 | - // permet de trouver aussi les name="#GET{truc}" |
|
| 154 | - if ($i==1) $contenu = recuperer_fond("formulaires/$form",$valeurs); |
|
| 155 | - |
|
| 156 | - $balises = array_merge(extraire_balises($contenu,'input'), |
|
| 157 | - extraire_balises($contenu,'textarea'), |
|
| 158 | - extraire_balises($contenu,'select')); |
|
| 159 | - |
|
| 160 | - foreach($balises as $b) { |
|
| 161 | - if ($n = extraire_attribut($b, 'name') |
|
| 162 | - AND preg_match(",^([\w\-]+)(\[\w*\])?$,",$n,$r) |
|
| 163 | - AND !in_array($n,array('formulaire_action','formulaire_action_args')) |
|
| 164 | - AND extraire_attribut($b,'type')!=='submit') { |
|
| 165 | - $valeurs[$r[1]] = ''; |
|
| 166 | - // recuperer les valeurs _meta_xx qui peuvent etre fournies |
|
| 167 | - // en input hidden dans le squelette |
|
| 168 | - if (strncmp($r[1],'_meta_',6)==0) |
|
| 169 | - $valeurs[$r[1]] = extraire_attribut($b,'value'); |
|
| 170 | - } |
|
| 171 | - } |
|
| 172 | - } |
|
| 173 | - } |
|
| 174 | - |
|
| 175 | - |
|
| 176 | - cvtconf_configurer_lire_meta($form,$valeurs); |
|
| 177 | - return $valeurs; |
|
| 145 | + $valeurs = array('editable'=>' '); |
|
| 146 | + |
|
| 147 | + // sinon cas analyse du squelette |
|
| 148 | + if ($f = find_in_path($form.'.' . _EXTENSION_SQUELETTES, 'formulaires/') |
|
| 149 | + AND lire_fichier($f, $contenu)) { |
|
| 150 | + |
|
| 151 | + for ($i=0;$i<2;$i++) { |
|
| 152 | + // a la seconde iteration, evaluer le fond avec les valeurs deja trouvees |
|
| 153 | + // permet de trouver aussi les name="#GET{truc}" |
|
| 154 | + if ($i==1) $contenu = recuperer_fond("formulaires/$form",$valeurs); |
|
| 155 | + |
|
| 156 | + $balises = array_merge(extraire_balises($contenu,'input'), |
|
| 157 | + extraire_balises($contenu,'textarea'), |
|
| 158 | + extraire_balises($contenu,'select')); |
|
| 159 | + |
|
| 160 | + foreach($balises as $b) { |
|
| 161 | + if ($n = extraire_attribut($b, 'name') |
|
| 162 | + AND preg_match(",^([\w\-]+)(\[\w*\])?$,",$n,$r) |
|
| 163 | + AND !in_array($n,array('formulaire_action','formulaire_action_args')) |
|
| 164 | + AND extraire_attribut($b,'type')!=='submit') { |
|
| 165 | + $valeurs[$r[1]] = ''; |
|
| 166 | + // recuperer les valeurs _meta_xx qui peuvent etre fournies |
|
| 167 | + // en input hidden dans le squelette |
|
| 168 | + if (strncmp($r[1],'_meta_',6)==0) |
|
| 169 | + $valeurs[$r[1]] = extraire_attribut($b,'value'); |
|
| 170 | + } |
|
| 171 | + } |
|
| 172 | + } |
|
| 173 | + } |
|
| 174 | + |
|
| 175 | + |
|
| 176 | + cvtconf_configurer_lire_meta($form,$valeurs); |
|
| 177 | + return $valeurs; |
|
| 178 | 178 | } |
| 179 | 179 | |
| 180 | 180 | /** |
@@ -185,24 +185,24 @@ discard block |
||
| 185 | 185 | * @return string |
| 186 | 186 | */ |
| 187 | 187 | function cvtconf_configurer_stocker($form,$valeurs,$store) { |
| 188 | - $trace = ''; |
|
| 189 | - list($table,$casier,$prefixe,$stockage) = cvtconf_definir_configurer_conteneur($form,$valeurs); |
|
| 190 | - // stocker en base |
|
| 191 | - // par defaut, dans un casier serialize dans spip_meta (idem CFG) |
|
| 192 | - if (!isset($GLOBALS[$table])) |
|
| 193 | - lire_metas($table); |
|
| 194 | - |
|
| 195 | - $prefixe = ($prefixe?$prefixe.'_':''); |
|
| 196 | - $table = ($table) ? "/$table/" : ""; |
|
| 197 | - $casier = ($casier) ? rtrim($casier,'/').'/' : ""; // slash final, sinon rien |
|
| 188 | + $trace = ''; |
|
| 189 | + list($table,$casier,$prefixe,$stockage) = cvtconf_definir_configurer_conteneur($form,$valeurs); |
|
| 190 | + // stocker en base |
|
| 191 | + // par defaut, dans un casier serialize dans spip_meta (idem CFG) |
|
| 192 | + if (!isset($GLOBALS[$table])) |
|
| 193 | + lire_metas($table); |
|
| 194 | + |
|
| 195 | + $prefixe = ($prefixe?$prefixe.'_':''); |
|
| 196 | + $table = ($table) ? "/$table/" : ""; |
|
| 197 | + $casier = ($casier) ? rtrim($casier,'/').'/' : ""; // slash final, sinon rien |
|
| 198 | 198 | |
| 199 | - foreach($store as $k=>$v){ |
|
| 200 | - ecrire_config("$stockage$table$prefixe$casier$k", $v); |
|
| 201 | - if (_request('var_mode')=='configurer' AND autoriser('webmestre')){ |
|
| 202 | - $trace .= "<br />table $table : ".$prefixe.$k." = $v;"; |
|
| 203 | - } |
|
| 204 | - } |
|
| 205 | - return $trace; |
|
| 199 | + foreach($store as $k=>$v){ |
|
| 200 | + ecrire_config("$stockage$table$prefixe$casier$k", $v); |
|
| 201 | + if (_request('var_mode')=='configurer' AND autoriser('webmestre')){ |
|
| 202 | + $trace .= "<br />table $table : ".$prefixe.$k." = $v;"; |
|
| 203 | + } |
|
| 204 | + } |
|
| 205 | + return $trace; |
|
| 206 | 206 | } |
| 207 | 207 | |
| 208 | 208 | /** |
@@ -211,23 +211,23 @@ discard block |
||
| 211 | 211 | * @param array $valeurs |
| 212 | 212 | */ |
| 213 | 213 | function cvtconf_configurer_lire_meta($form,&$valeurs) { |
| 214 | - list($table,$casier,$prefixe,$stockage) = cvtconf_definir_configurer_conteneur($form,$valeurs); |
|
| 215 | - |
|
| 216 | - $table = ($table) ? "/$table/" : ""; |
|
| 217 | - $prefixe = ($prefixe?$prefixe.'_':''); |
|
| 218 | - if ($casier) { |
|
| 219 | - $meta = lire_config("$stockage$table$prefixe$casier"); |
|
| 220 | - $prefixe = ''; |
|
| 221 | - } |
|
| 222 | - else { |
|
| 223 | - $table = rtrim($table, '/'); |
|
| 224 | - $meta = lire_config("$stockage$table"); |
|
| 225 | - } |
|
| 226 | - |
|
| 227 | - foreach($valeurs as $k=>$v){ |
|
| 228 | - if (substr($k,0,1)!=='_') |
|
| 229 | - $valeurs[$k] = (isset($meta[$prefixe.$k])?$meta[$prefixe.$k]:''); |
|
| 230 | - } |
|
| 214 | + list($table,$casier,$prefixe,$stockage) = cvtconf_definir_configurer_conteneur($form,$valeurs); |
|
| 215 | + |
|
| 216 | + $table = ($table) ? "/$table/" : ""; |
|
| 217 | + $prefixe = ($prefixe?$prefixe.'_':''); |
|
| 218 | + if ($casier) { |
|
| 219 | + $meta = lire_config("$stockage$table$prefixe$casier"); |
|
| 220 | + $prefixe = ''; |
|
| 221 | + } |
|
| 222 | + else { |
|
| 223 | + $table = rtrim($table, '/'); |
|
| 224 | + $meta = lire_config("$stockage$table"); |
|
| 225 | + } |
|
| 226 | + |
|
| 227 | + foreach($valeurs as $k=>$v){ |
|
| 228 | + if (substr($k,0,1)!=='_') |
|
| 229 | + $valeurs[$k] = (isset($meta[$prefixe.$k])?$meta[$prefixe.$k]:''); |
|
| 230 | + } |
|
| 231 | 231 | } |
| 232 | 232 | |
| 233 | 233 | |
@@ -26,16 +26,16 @@ discard block |
||
| 26 | 26 | */ |
| 27 | 27 | function inc_notifications_dist($quoi, $id=0, $options=array()) { |
| 28 | 28 | |
| 29 | - // charger les fichiers qui veulent ajouter des definitions |
|
| 30 | - // ou faire des trucs aussi dans le pipeline, ca fait deux api pour le prix d'une ... |
|
| 31 | - pipeline('notifications',array('args'=>array('quoi'=>$quoi,'id'=>$id,'options'=>$options))); |
|
| 32 | - |
|
| 33 | - if ($notification = charger_fonction($quoi,'notifications',true)) { |
|
| 34 | - spip_log("$notification($quoi,$id" |
|
| 35 | - .($options?",".serialize($options):"") |
|
| 36 | - .")",'notifications'); |
|
| 37 | - $notification($quoi, $id, $options); |
|
| 38 | - } |
|
| 29 | + // charger les fichiers qui veulent ajouter des definitions |
|
| 30 | + // ou faire des trucs aussi dans le pipeline, ca fait deux api pour le prix d'une ... |
|
| 31 | + pipeline('notifications',array('args'=>array('quoi'=>$quoi,'id'=>$id,'options'=>$options))); |
|
| 32 | + |
|
| 33 | + if ($notification = charger_fonction($quoi,'notifications',true)) { |
|
| 34 | + spip_log("$notification($quoi,$id" |
|
| 35 | + .($options?",".serialize($options):"") |
|
| 36 | + .")",'notifications'); |
|
| 37 | + $notification($quoi, $id, $options); |
|
| 38 | + } |
|
| 39 | 39 | } |
| 40 | 40 | |
| 41 | 41 | /** |
@@ -48,15 +48,15 @@ discard block |
||
| 48 | 48 | * @param array $exclure |
| 49 | 49 | */ |
| 50 | 50 | function notifications_nettoyer_emails(&$emails, $exclure = array()){ |
| 51 | - // filtrer et unifier |
|
| 52 | - include_spip('inc/filtres'); |
|
| 53 | - $emails = array_unique(array_filter(array_map('email_valide',array_map('trim', $emails)))); |
|
| 54 | - if ($exclure AND count($exclure)){ |
|
| 55 | - // nettoyer les exclusions d'abord |
|
| 56 | - notifications_nettoyer_emails($exclure); |
|
| 57 | - // faire un diff |
|
| 58 | - $emails = array_diff($emails,$exclure); |
|
| 59 | - } |
|
| 51 | + // filtrer et unifier |
|
| 52 | + include_spip('inc/filtres'); |
|
| 53 | + $emails = array_unique(array_filter(array_map('email_valide',array_map('trim', $emails)))); |
|
| 54 | + if ($exclure AND count($exclure)){ |
|
| 55 | + // nettoyer les exclusions d'abord |
|
| 56 | + notifications_nettoyer_emails($exclure); |
|
| 57 | + // faire un diff |
|
| 58 | + $emails = array_diff($emails,$exclure); |
|
| 59 | + } |
|
| 60 | 60 | } |
| 61 | 61 | |
| 62 | 62 | /** |
@@ -70,71 +70,71 @@ discard block |
||
| 70 | 70 | * @param string $headers |
| 71 | 71 | */ |
| 72 | 72 | function notifications_envoyer_mails($emails, $texte, $sujet="", $from = "", $headers = ""){ |
| 73 | - // rien a faire si pas de texte ! |
|
| 74 | - if (!strlen($texte)) |
|
| 75 | - return; |
|
| 76 | - |
|
| 77 | - // si on ne specifie qu'un email, le mettre dans un tableau |
|
| 78 | - if (!is_array($emails)) |
|
| 79 | - $emails = explode(',',$emails); |
|
| 80 | - |
|
| 81 | - notifications_nettoyer_emails($emails); |
|
| 82 | - |
|
| 83 | - // tester si le mail est deja en html |
|
| 84 | - if (strpos($texte,"<")!==false // eviter les tests suivants si possible |
|
| 85 | - AND $ttrim = trim($texte) |
|
| 86 | - AND substr($ttrim,0,1)=="<" |
|
| 87 | - AND substr($ttrim,-1,1)==">" |
|
| 88 | - AND stripos($ttrim,"</html>")!==false){ |
|
| 89 | - |
|
| 90 | - if(!strlen($sujet)){ |
|
| 91 | - // dans ce cas on ruse un peu : extraire le sujet du title |
|
| 92 | - if (preg_match(",<title>(.*)</title>,Uims",$texte,$m)) |
|
| 93 | - $sujet = $m[1]; |
|
| 94 | - else { |
|
| 95 | - // fallback, on prend le body si on le trouve |
|
| 96 | - if (preg_match(",<body[^>]*>(.*)</body>,Uims",$texte,$m)) |
|
| 97 | - $ttrim = $m[1]; |
|
| 98 | - |
|
| 99 | - // et on extrait la premiere ligne de vrai texte... |
|
| 100 | - // nettoyer le html et les retours chariots |
|
| 101 | - $ttrim = textebrut($ttrim); |
|
| 102 | - $ttrim = str_replace("\r\n", "\r", $ttrim); |
|
| 103 | - $ttrim = str_replace("\r", "\n", $ttrim); |
|
| 104 | - // decouper |
|
| 105 | - $ttrim = explode("\n",trim($ttrim)); |
|
| 106 | - // extraire la premiere ligne de texte brut |
|
| 107 | - $sujet = array_shift($ttrim); |
|
| 108 | - } |
|
| 109 | - } |
|
| 110 | - |
|
| 111 | - // si besoin on ajoute le content-type dans les headers |
|
| 112 | - if (stripos($headers,"Content-Type")===false) |
|
| 113 | - $headers .= "Content-Type: text/html\n"; |
|
| 114 | - } |
|
| 115 | - |
|
| 116 | - // si le sujet est vide, extraire la premiere ligne du corps |
|
| 117 | - // du mail qui est donc du texte |
|
| 118 | - if (!strlen($sujet)){ |
|
| 119 | - // nettoyer un peu les retours chariots |
|
| 120 | - $texte = str_replace("\r\n", "\r", $texte); |
|
| 121 | - $texte = str_replace("\r", "\n", $texte); |
|
| 122 | - // decouper |
|
| 123 | - $texte = explode("\n",trim($texte)); |
|
| 124 | - // extraire la premiere ligne |
|
| 125 | - $sujet = array_shift($texte); |
|
| 126 | - $texte = trim(implode("\n",$texte)); |
|
| 127 | - } |
|
| 128 | - |
|
| 129 | - $envoyer_mail = charger_fonction('envoyer_mail','inc'); |
|
| 130 | - foreach($emails as $email){ |
|
| 131 | - // passer dans un pipeline qui permet un ajout eventuel |
|
| 132 | - // (url de suivi des notifications par exemple) |
|
| 133 | - $envoi = pipeline('notifications_envoyer_mails',array('email'=>$email,'sujet'=>$sujet,'texte'=>$texte)); |
|
| 134 | - $email = $envoi['email']; |
|
| 135 | - |
|
| 136 | - job_queue_add('envoyer_mail', ">$email : ".$envoi['sujet'], array($email, $envoi['sujet'], $envoi['texte'], $from, $headers), 'inc/'); |
|
| 137 | - } |
|
| 73 | + // rien a faire si pas de texte ! |
|
| 74 | + if (!strlen($texte)) |
|
| 75 | + return; |
|
| 76 | + |
|
| 77 | + // si on ne specifie qu'un email, le mettre dans un tableau |
|
| 78 | + if (!is_array($emails)) |
|
| 79 | + $emails = explode(',',$emails); |
|
| 80 | + |
|
| 81 | + notifications_nettoyer_emails($emails); |
|
| 82 | + |
|
| 83 | + // tester si le mail est deja en html |
|
| 84 | + if (strpos($texte,"<")!==false // eviter les tests suivants si possible |
|
| 85 | + AND $ttrim = trim($texte) |
|
| 86 | + AND substr($ttrim,0,1)=="<" |
|
| 87 | + AND substr($ttrim,-1,1)==">" |
|
| 88 | + AND stripos($ttrim,"</html>")!==false){ |
|
| 89 | + |
|
| 90 | + if(!strlen($sujet)){ |
|
| 91 | + // dans ce cas on ruse un peu : extraire le sujet du title |
|
| 92 | + if (preg_match(",<title>(.*)</title>,Uims",$texte,$m)) |
|
| 93 | + $sujet = $m[1]; |
|
| 94 | + else { |
|
| 95 | + // fallback, on prend le body si on le trouve |
|
| 96 | + if (preg_match(",<body[^>]*>(.*)</body>,Uims",$texte,$m)) |
|
| 97 | + $ttrim = $m[1]; |
|
| 98 | + |
|
| 99 | + // et on extrait la premiere ligne de vrai texte... |
|
| 100 | + // nettoyer le html et les retours chariots |
|
| 101 | + $ttrim = textebrut($ttrim); |
|
| 102 | + $ttrim = str_replace("\r\n", "\r", $ttrim); |
|
| 103 | + $ttrim = str_replace("\r", "\n", $ttrim); |
|
| 104 | + // decouper |
|
| 105 | + $ttrim = explode("\n",trim($ttrim)); |
|
| 106 | + // extraire la premiere ligne de texte brut |
|
| 107 | + $sujet = array_shift($ttrim); |
|
| 108 | + } |
|
| 109 | + } |
|
| 110 | + |
|
| 111 | + // si besoin on ajoute le content-type dans les headers |
|
| 112 | + if (stripos($headers,"Content-Type")===false) |
|
| 113 | + $headers .= "Content-Type: text/html\n"; |
|
| 114 | + } |
|
| 115 | + |
|
| 116 | + // si le sujet est vide, extraire la premiere ligne du corps |
|
| 117 | + // du mail qui est donc du texte |
|
| 118 | + if (!strlen($sujet)){ |
|
| 119 | + // nettoyer un peu les retours chariots |
|
| 120 | + $texte = str_replace("\r\n", "\r", $texte); |
|
| 121 | + $texte = str_replace("\r", "\n", $texte); |
|
| 122 | + // decouper |
|
| 123 | + $texte = explode("\n",trim($texte)); |
|
| 124 | + // extraire la premiere ligne |
|
| 125 | + $sujet = array_shift($texte); |
|
| 126 | + $texte = trim(implode("\n",$texte)); |
|
| 127 | + } |
|
| 128 | + |
|
| 129 | + $envoyer_mail = charger_fonction('envoyer_mail','inc'); |
|
| 130 | + foreach($emails as $email){ |
|
| 131 | + // passer dans un pipeline qui permet un ajout eventuel |
|
| 132 | + // (url de suivi des notifications par exemple) |
|
| 133 | + $envoi = pipeline('notifications_envoyer_mails',array('email'=>$email,'sujet'=>$sujet,'texte'=>$texte)); |
|
| 134 | + $email = $envoi['email']; |
|
| 135 | + |
|
| 136 | + job_queue_add('envoyer_mail', ">$email : ".$envoi['sujet'], array($email, $envoi['sujet'], $envoi['texte'], $from, $headers), 'inc/'); |
|
| 137 | + } |
|
| 138 | 138 | |
| 139 | 139 | } |
| 140 | 140 | |
@@ -150,9 +150,9 @@ discard block |
||
| 150 | 150 | * @return string |
| 151 | 151 | */ |
| 152 | 152 | function email_notification_objet($id_objet, $type_objet, $modele) { |
| 153 | - $envoyer_mail = charger_fonction('envoyer_mail','inc'); // pour nettoyer_titre_email |
|
| 154 | - $id_type = id_table_objet($type_objet); |
|
| 155 | - return recuperer_fond($modele,array($id_type=>$id_objet,"id"=>$id_objet)); |
|
| 153 | + $envoyer_mail = charger_fonction('envoyer_mail','inc'); // pour nettoyer_titre_email |
|
| 154 | + $id_type = id_table_objet($type_objet); |
|
| 155 | + return recuperer_fond($modele,array($id_type=>$id_objet,"id"=>$id_objet)); |
|
| 156 | 156 | } |
| 157 | 157 | |
| 158 | 158 | /** |
@@ -166,29 +166,29 @@ discard block |
||
| 166 | 166 | * @return string |
| 167 | 167 | */ |
| 168 | 168 | function email_notification_article($id_article, $modele) { |
| 169 | - $envoyer_mail = charger_fonction('envoyer_mail','inc'); // pour nettoyer_titre_email |
|
| 169 | + $envoyer_mail = charger_fonction('envoyer_mail','inc'); // pour nettoyer_titre_email |
|
| 170 | 170 | |
| 171 | - return recuperer_fond($modele,array('id_article'=>$id_article)); |
|
| 171 | + return recuperer_fond($modele,array('id_article'=>$id_article)); |
|
| 172 | 172 | } |
| 173 | 173 | |
| 174 | 174 | // Compatibilite, ne plus utiliser |
| 175 | 175 | // http://doc.spip.org/@notifier_publication_article |
| 176 | 176 | function notifier_publication_article($id_article) { |
| 177 | - if ($GLOBALS['meta']["suivi_edito"] == "oui") { |
|
| 178 | - $adresse_suivi = $GLOBALS['meta']["adresse_suivi"]; |
|
| 179 | - $texte = email_notification_article($id_article, "notifications/article_publie"); |
|
| 180 | - notifications_envoyer_mails($adresse_suivi, $texte); |
|
| 181 | - } |
|
| 177 | + if ($GLOBALS['meta']["suivi_edito"] == "oui") { |
|
| 178 | + $adresse_suivi = $GLOBALS['meta']["adresse_suivi"]; |
|
| 179 | + $texte = email_notification_article($id_article, "notifications/article_publie"); |
|
| 180 | + notifications_envoyer_mails($adresse_suivi, $texte); |
|
| 181 | + } |
|
| 182 | 182 | } |
| 183 | 183 | |
| 184 | 184 | // Compatibilite, ne plus utiliser |
| 185 | 185 | // http://doc.spip.org/@notifier_proposition_article |
| 186 | 186 | function notifier_proposition_article($id_article) { |
| 187 | - if ($GLOBALS['meta']["suivi_edito"] == "oui") { |
|
| 188 | - $adresse_suivi = $GLOBALS['meta']["adresse_suivi"]; |
|
| 189 | - $texte = email_notification_article($id_article, "notifications/article_propose"); |
|
| 190 | - notifications_envoyer_mails($adresse_suivi, $texte); |
|
| 191 | - } |
|
| 187 | + if ($GLOBALS['meta']["suivi_edito"] == "oui") { |
|
| 188 | + $adresse_suivi = $GLOBALS['meta']["adresse_suivi"]; |
|
| 189 | + $texte = email_notification_article($id_article, "notifications/article_propose"); |
|
| 190 | + notifications_envoyer_mails($adresse_suivi, $texte); |
|
| 191 | + } |
|
| 192 | 192 | } |
| 193 | 193 | |
| 194 | 194 | ?> |
@@ -40,12 +40,12 @@ discard block |
||
| 40 | 40 | **/ |
| 41 | 41 | function install_fichier_connexion($nom, $texte) |
| 42 | 42 | { |
| 43 | - $texte = "<"."?php\n" |
|
| 44 | - . "if (!defined(\"_ECRIRE_INC_VERSION\")) return;\n" |
|
| 45 | - . $texte |
|
| 46 | - . "?".">"; |
|
| 43 | + $texte = "<"."?php\n" |
|
| 44 | + . "if (!defined(\"_ECRIRE_INC_VERSION\")) return;\n" |
|
| 45 | + . $texte |
|
| 46 | + . "?".">"; |
|
| 47 | 47 | |
| 48 | - ecrire_fichier($nom, $texte); |
|
| 48 | + ecrire_fichier($nom, $texte); |
|
| 49 | 49 | } |
| 50 | 50 | |
| 51 | 51 | |
@@ -74,18 +74,18 @@ discard block |
||
| 74 | 74 | **/ |
| 75 | 75 | function install_connexion($adr, $port, $login, $pass, $base, $type, $pref, $ldap='') |
| 76 | 76 | { |
| 77 | - $adr = addcslashes($adr,"'\\"); |
|
| 78 | - $port = addcslashes($port,"'\\"); |
|
| 79 | - $login = addcslashes($login,"'\\"); |
|
| 80 | - $pass = addcslashes($pass,"'\\"); |
|
| 81 | - $base = addcslashes($base,"'\\"); |
|
| 82 | - $type = addcslashes($type,"'\\"); |
|
| 83 | - $pref = addcslashes($pref,"'\\"); |
|
| 84 | - $ldap = addcslashes($ldap,"'\\"); |
|
| 85 | - return "\$GLOBALS['spip_connect_version'] = 0.7;\n" |
|
| 86 | - . "spip_connect_db(" |
|
| 87 | - . "'$adr','$port','$login','$pass','$base'" |
|
| 88 | - . ",'$type', '$pref','$ldap');\n"; |
|
| 77 | + $adr = addcslashes($adr,"'\\"); |
|
| 78 | + $port = addcslashes($port,"'\\"); |
|
| 79 | + $login = addcslashes($login,"'\\"); |
|
| 80 | + $pass = addcslashes($pass,"'\\"); |
|
| 81 | + $base = addcslashes($base,"'\\"); |
|
| 82 | + $type = addcslashes($type,"'\\"); |
|
| 83 | + $pref = addcslashes($pref,"'\\"); |
|
| 84 | + $ldap = addcslashes($ldap,"'\\"); |
|
| 85 | + return "\$GLOBALS['spip_connect_version'] = 0.7;\n" |
|
| 86 | + . "spip_connect_db(" |
|
| 87 | + . "'$adr','$port','$login','$pass','$base'" |
|
| 88 | + . ",'$type', '$pref','$ldap');\n"; |
|
| 89 | 89 | } |
| 90 | 90 | |
| 91 | 91 | |
@@ -102,23 +102,23 @@ discard block |
||
| 102 | 102 | **/ |
| 103 | 103 | function analyse_fichier_connection($file) |
| 104 | 104 | { |
| 105 | - $s = @join('', file($file)); |
|
| 106 | - if (preg_match("#mysql_connect\([\"'](.*)[\"'],[\"'](.*)[\"'],[\"'](.*)[\"']\)#", $s, $regs)) { |
|
| 107 | - array_shift($regs); |
|
| 108 | - return $regs; |
|
| 109 | - } else { |
|
| 110 | - $ar = '\s*\'([^\']*)\''; |
|
| 111 | - $r = '\s*,' . $ar; |
|
| 112 | - $r = "#spip_connect_db[(]$ar$r$r$r$r(?:$r(?:$r(?:$r)?)?)?#"; |
|
| 113 | - if (preg_match($r, $s, $regs)) { |
|
| 114 | - $regs[2] = $regs[1] . (!$regs[2] ? '' : ":$port_db;"); |
|
| 115 | - array_shift($regs); |
|
| 116 | - array_shift($regs); |
|
| 117 | - return $regs; |
|
| 118 | - } |
|
| 119 | - } |
|
| 120 | - spip_log("$file n'est pas un fichier de connexion"); |
|
| 121 | - return array(); |
|
| 105 | + $s = @join('', file($file)); |
|
| 106 | + if (preg_match("#mysql_connect\([\"'](.*)[\"'],[\"'](.*)[\"'],[\"'](.*)[\"']\)#", $s, $regs)) { |
|
| 107 | + array_shift($regs); |
|
| 108 | + return $regs; |
|
| 109 | + } else { |
|
| 110 | + $ar = '\s*\'([^\']*)\''; |
|
| 111 | + $r = '\s*,' . $ar; |
|
| 112 | + $r = "#spip_connect_db[(]$ar$r$r$r$r(?:$r(?:$r(?:$r)?)?)?#"; |
|
| 113 | + if (preg_match($r, $s, $regs)) { |
|
| 114 | + $regs[2] = $regs[1] . (!$regs[2] ? '' : ":$port_db;"); |
|
| 115 | + array_shift($regs); |
|
| 116 | + array_shift($regs); |
|
| 117 | + return $regs; |
|
| 118 | + } |
|
| 119 | + } |
|
| 120 | + spip_log("$file n'est pas un fichier de connexion"); |
|
| 121 | + return array(); |
|
| 122 | 122 | } |
| 123 | 123 | |
| 124 | 124 | /** |
@@ -136,20 +136,20 @@ discard block |
||
| 136 | 136 | **/ |
| 137 | 137 | function bases_referencees($exclu='') |
| 138 | 138 | { |
| 139 | - $tables = array(); |
|
| 140 | - foreach(preg_files(_DIR_CONNECT, '.php$') as $f) { |
|
| 141 | - if ($f != $exclu AND analyse_fichier_connection($f)) |
|
| 142 | - $tables[]= basename($f, '.php'); |
|
| 143 | - } |
|
| 144 | - return $tables; |
|
| 139 | + $tables = array(); |
|
| 140 | + foreach(preg_files(_DIR_CONNECT, '.php$') as $f) { |
|
| 141 | + if ($f != $exclu AND analyse_fichier_connection($f)) |
|
| 142 | + $tables[]= basename($f, '.php'); |
|
| 143 | + } |
|
| 144 | + return $tables; |
|
| 145 | 145 | } |
| 146 | 146 | |
| 147 | 147 | |
| 148 | 148 | function install_mode_appel($server_db, $tout=true) |
| 149 | 149 | { |
| 150 | - return ($server_db != 'mysql') ? '' |
|
| 151 | - : (($tout ? test_rappel_nom_base_mysql($server_db) : '') |
|
| 152 | - . test_sql_mode_mysql($server_db) ); |
|
| 150 | + return ($server_db != 'mysql') ? '' |
|
| 151 | + : (($tout ? test_rappel_nom_base_mysql($server_db) : '') |
|
| 152 | + . test_sql_mode_mysql($server_db) ); |
|
| 153 | 153 | } |
| 154 | 154 | |
| 155 | 155 | // |
@@ -157,224 +157,224 @@ discard block |
||
| 157 | 157 | // (sert a l'etape 1 de l'installation) |
| 158 | 158 | // http://doc.spip.org/@tester_compatibilite_hebergement |
| 159 | 159 | function tester_compatibilite_hebergement() { |
| 160 | - $err = array(); |
|
| 161 | - |
|
| 162 | - $p = phpversion(); |
|
| 163 | - if (preg_match(',^([0-9]+)\.([0-9]+)\.([0-9]+),', $p, $regs)) { |
|
| 164 | - $php = array($regs[1], $regs[2], $regs[3]); |
|
| 165 | - $m = '5.1.0'; |
|
| 166 | - $min = explode('.', $m); |
|
| 167 | - if ($php[0]<$min[0] |
|
| 168 | - OR ($php[0]==$min[0] AND $php[1]<$min[1]) |
|
| 169 | - OR ($php[0]==$min[0] AND $php[1]==$min[1] AND $php[2]<$min[2])) |
|
| 170 | - $err[] = _T('install_php_version', array('version' => $p, 'minimum' => $m)); |
|
| 171 | - } |
|
| 172 | - |
|
| 173 | - // Si on n'a pas la bonne version de PHP, c'est la fin |
|
| 174 | - if ($err) |
|
| 175 | - die("<div class='error'>" |
|
| 176 | - . "<h3>"._T('avis_attention').'</h3><p>'._T('install_echec_annonce')."</p><ul class='spip'>" |
|
| 177 | - . "<li><strong>{$err[0]}</strong></li>\n</ul></div>"); |
|
| 178 | - |
|
| 179 | - // Il faut une base de donnees tout de meme ... |
|
| 180 | - $serveurs = install_select_serveur(); |
|
| 181 | - if (!$serveurs) |
|
| 182 | - $err[] = _T('install_extension_php_obligatoire') |
|
| 183 | - . " <a href='http://www.php.net/mysql'>MYSQL</a>" |
|
| 184 | - . "| <a href='http://www.php.net/pgsql'>PostgreSQL</a>" |
|
| 185 | - . "| <a href='http://www.php.net/sqlite'>SQLite</a>"; |
|
| 186 | - |
|
| 187 | - // et il faut preg |
|
| 188 | - if (!function_exists('preg_match_all')) |
|
| 189 | - $err[] = _T('install_extension_php_obligatoire') |
|
| 190 | - . " <a href='http://se.php.net/pcre'>PCRE</a>"; |
|
| 191 | - |
|
| 192 | - // et surtout pas ce mbstring.overload |
|
| 193 | - if ($a = @ini_get('mbstring.func_overload')) |
|
| 194 | - $err[] = _T('install_extension_mbstring') |
|
| 195 | - . "mbstring.func_overload=$a - <a href='http://www.php.net/mb_string'>mb_string</a>.<br /><small>"; |
|
| 196 | - |
|
| 197 | - if ($err) { |
|
| 198 | - echo "<div class='error'>" |
|
| 199 | - ."<h3>"._T('avis_attention').'</h3><p>'._T('install_echec_annonce')."</p><ul class='spip'>"; |
|
| 200 | - foreach($err as $e) |
|
| 201 | - echo "<li><strong>$e</strong></li>\n"; |
|
| 202 | - |
|
| 203 | - # a priori ici on pourrait die(), mais il faut laisser la possibilite |
|
| 204 | - # de forcer malgre tout (pour tester, ou si bug de detection) |
|
| 205 | - echo "</ul></div>\n"; |
|
| 206 | - } |
|
| 160 | + $err = array(); |
|
| 161 | + |
|
| 162 | + $p = phpversion(); |
|
| 163 | + if (preg_match(',^([0-9]+)\.([0-9]+)\.([0-9]+),', $p, $regs)) { |
|
| 164 | + $php = array($regs[1], $regs[2], $regs[3]); |
|
| 165 | + $m = '5.1.0'; |
|
| 166 | + $min = explode('.', $m); |
|
| 167 | + if ($php[0]<$min[0] |
|
| 168 | + OR ($php[0]==$min[0] AND $php[1]<$min[1]) |
|
| 169 | + OR ($php[0]==$min[0] AND $php[1]==$min[1] AND $php[2]<$min[2])) |
|
| 170 | + $err[] = _T('install_php_version', array('version' => $p, 'minimum' => $m)); |
|
| 171 | + } |
|
| 172 | + |
|
| 173 | + // Si on n'a pas la bonne version de PHP, c'est la fin |
|
| 174 | + if ($err) |
|
| 175 | + die("<div class='error'>" |
|
| 176 | + . "<h3>"._T('avis_attention').'</h3><p>'._T('install_echec_annonce')."</p><ul class='spip'>" |
|
| 177 | + . "<li><strong>{$err[0]}</strong></li>\n</ul></div>"); |
|
| 178 | + |
|
| 179 | + // Il faut une base de donnees tout de meme ... |
|
| 180 | + $serveurs = install_select_serveur(); |
|
| 181 | + if (!$serveurs) |
|
| 182 | + $err[] = _T('install_extension_php_obligatoire') |
|
| 183 | + . " <a href='http://www.php.net/mysql'>MYSQL</a>" |
|
| 184 | + . "| <a href='http://www.php.net/pgsql'>PostgreSQL</a>" |
|
| 185 | + . "| <a href='http://www.php.net/sqlite'>SQLite</a>"; |
|
| 186 | + |
|
| 187 | + // et il faut preg |
|
| 188 | + if (!function_exists('preg_match_all')) |
|
| 189 | + $err[] = _T('install_extension_php_obligatoire') |
|
| 190 | + . " <a href='http://se.php.net/pcre'>PCRE</a>"; |
|
| 191 | + |
|
| 192 | + // et surtout pas ce mbstring.overload |
|
| 193 | + if ($a = @ini_get('mbstring.func_overload')) |
|
| 194 | + $err[] = _T('install_extension_mbstring') |
|
| 195 | + . "mbstring.func_overload=$a - <a href='http://www.php.net/mb_string'>mb_string</a>.<br /><small>"; |
|
| 196 | + |
|
| 197 | + if ($err) { |
|
| 198 | + echo "<div class='error'>" |
|
| 199 | + ."<h3>"._T('avis_attention').'</h3><p>'._T('install_echec_annonce')."</p><ul class='spip'>"; |
|
| 200 | + foreach($err as $e) |
|
| 201 | + echo "<li><strong>$e</strong></li>\n"; |
|
| 202 | + |
|
| 203 | + # a priori ici on pourrait die(), mais il faut laisser la possibilite |
|
| 204 | + # de forcer malgre tout (pour tester, ou si bug de detection) |
|
| 205 | + echo "</ul></div>\n"; |
|
| 206 | + } |
|
| 207 | 207 | } |
| 208 | 208 | |
| 209 | 209 | |
| 210 | 210 | // Une fonction pour faciliter la recherche du login (superflu ?) |
| 211 | 211 | // http://doc.spip.org/@login_hebergeur |
| 212 | 212 | function login_hebergeur() { |
| 213 | - global $HTTP_X_HOST, $REQUEST_URI, $SERVER_NAME, $HTTP_HOST; |
|
| 214 | - |
|
| 215 | - $base_hebergeur = 'localhost'; # par defaut |
|
| 216 | - |
|
| 217 | - // Lycos (ex-Multimachin) |
|
| 218 | - if ($HTTP_X_HOST == 'membres.lycos.fr') { |
|
| 219 | - preg_match(',^/([^/]*),', $REQUEST_URI, $regs); |
|
| 220 | - $login_hebergeur = $regs[1]; |
|
| 221 | - } |
|
| 222 | - // Altern |
|
| 223 | - else if (preg_match(',altern\.com$,', $SERVER_NAME)) { |
|
| 224 | - preg_match(',([^.]*\.[^.]*)$,', $HTTP_HOST, $regs); |
|
| 225 | - $login_hebergeur = preg_replace('[^\w\d]', '_', $regs[1]); |
|
| 226 | - } |
|
| 227 | - // Free |
|
| 228 | - else if (preg_match(',(.*)\.free\.fr$,', $SERVER_NAME, $regs)) { |
|
| 229 | - $base_hebergeur = 'sql.free.fr'; |
|
| 230 | - $login_hebergeur = $regs[1]; |
|
| 231 | - } else $login_hebergeur = ''; |
|
| 232 | - |
|
| 233 | - return array($base_hebergeur, $login_hebergeur); |
|
| 213 | + global $HTTP_X_HOST, $REQUEST_URI, $SERVER_NAME, $HTTP_HOST; |
|
| 214 | + |
|
| 215 | + $base_hebergeur = 'localhost'; # par defaut |
|
| 216 | + |
|
| 217 | + // Lycos (ex-Multimachin) |
|
| 218 | + if ($HTTP_X_HOST == 'membres.lycos.fr') { |
|
| 219 | + preg_match(',^/([^/]*),', $REQUEST_URI, $regs); |
|
| 220 | + $login_hebergeur = $regs[1]; |
|
| 221 | + } |
|
| 222 | + // Altern |
|
| 223 | + else if (preg_match(',altern\.com$,', $SERVER_NAME)) { |
|
| 224 | + preg_match(',([^.]*\.[^.]*)$,', $HTTP_HOST, $regs); |
|
| 225 | + $login_hebergeur = preg_replace('[^\w\d]', '_', $regs[1]); |
|
| 226 | + } |
|
| 227 | + // Free |
|
| 228 | + else if (preg_match(',(.*)\.free\.fr$,', $SERVER_NAME, $regs)) { |
|
| 229 | + $base_hebergeur = 'sql.free.fr'; |
|
| 230 | + $login_hebergeur = $regs[1]; |
|
| 231 | + } else $login_hebergeur = ''; |
|
| 232 | + |
|
| 233 | + return array($base_hebergeur, $login_hebergeur); |
|
| 234 | 234 | } |
| 235 | 235 | |
| 236 | 236 | |
| 237 | 237 | // http://doc.spip.org/@info_etape |
| 238 | 238 | function info_etape($titre, $complement = ''){ |
| 239 | - return "<h2>".$titre."</h2>\n" . |
|
| 240 | - ($complement ? "".$complement."\n":''); |
|
| 239 | + return "<h2>".$titre."</h2>\n" . |
|
| 240 | + ($complement ? "".$complement."\n":''); |
|
| 241 | 241 | } |
| 242 | 242 | |
| 243 | 243 | // http://doc.spip.org/@bouton_suivant |
| 244 | 244 | function bouton_suivant($code = '') { |
| 245 | - if($code=='') $code = _T('bouton_suivant'); |
|
| 246 | - static $suivant = 0; |
|
| 247 | - $id = 'suivant'.(($suivant>0)?strval($suivant):''); |
|
| 248 | - $suivant +=1; |
|
| 249 | - return "\n<p class='boutons suivant'><input id='".$id."' type='submit'\nvalue=\"" . |
|
| 250 | - $code . |
|
| 251 | - " >>\" /></p>\n"; |
|
| 245 | + if($code=='') $code = _T('bouton_suivant'); |
|
| 246 | + static $suivant = 0; |
|
| 247 | + $id = 'suivant'.(($suivant>0)?strval($suivant):''); |
|
| 248 | + $suivant +=1; |
|
| 249 | + return "\n<p class='boutons suivant'><input id='".$id."' type='submit'\nvalue=\"" . |
|
| 250 | + $code . |
|
| 251 | + " >>\" /></p>\n"; |
|
| 252 | 252 | } |
| 253 | 253 | |
| 254 | 254 | // http://doc.spip.org/@info_progression_etape |
| 255 | 255 | function info_progression_etape($en_cours,$phase,$dir, $erreur = false){ |
| 256 | - //$en_cours = _request('etape')?_request('etape'):""; |
|
| 257 | - $liste = find_all_in_path($dir,$phase.'(([0-9])+|fin)[.]php$'); |
|
| 258 | - $debut = 1; $etat = "ok"; |
|
| 259 | - $last = count($liste); |
|
| 256 | + //$en_cours = _request('etape')?_request('etape'):""; |
|
| 257 | + $liste = find_all_in_path($dir,$phase.'(([0-9])+|fin)[.]php$'); |
|
| 258 | + $debut = 1; $etat = "ok"; |
|
| 259 | + $last = count($liste); |
|
| 260 | 260 | // $texte_etat = array('ok'=>'OK','encours'=>_T('en_cours'),'todo'=>_T('todo')); |
| 261 | 261 | |
| 262 | - $intitule_etat["etape_"][1] = typo(_T('info_connexion_base_donnee')); |
|
| 263 | - $intitule_etat["etape_"][2] = typo(_T('menu_aide_installation_choix_base')); |
|
| 264 | - $intitule_etat["etape_"][3] = typo(_T('info_informations_personnelles')); |
|
| 265 | - $intitule_etat["etape_"][4] = typo(_T('info_derniere_etape')); |
|
| 262 | + $intitule_etat["etape_"][1] = typo(_T('info_connexion_base_donnee')); |
|
| 263 | + $intitule_etat["etape_"][2] = typo(_T('menu_aide_installation_choix_base')); |
|
| 264 | + $intitule_etat["etape_"][3] = typo(_T('info_informations_personnelles')); |
|
| 265 | + $intitule_etat["etape_"][4] = typo(_T('info_derniere_etape')); |
|
| 266 | 266 | |
| 267 | - $intitule_etat["etape_ldap"][1] = typo(_T('titre_connexion_ldap')); |
|
| 268 | - $intitule_etat["etape_ldap"][2] = typo(_T('titre_connexion_ldap')); |
|
| 269 | - $intitule_etat["etape_ldap"][3] = typo(_T('info_chemin_acces_1')); |
|
| 270 | - $intitule_etat["etape_ldap"][4] = typo(_T('info_reglage_ldap')); |
|
| 271 | - $intitule_etat["etape_ldap"][5] = typo(_T('info_ldap_ok')); |
|
| 267 | + $intitule_etat["etape_ldap"][1] = typo(_T('titre_connexion_ldap')); |
|
| 268 | + $intitule_etat["etape_ldap"][2] = typo(_T('titre_connexion_ldap')); |
|
| 269 | + $intitule_etat["etape_ldap"][3] = typo(_T('info_chemin_acces_1')); |
|
| 270 | + $intitule_etat["etape_ldap"][4] = typo(_T('info_reglage_ldap')); |
|
| 271 | + $intitule_etat["etape_ldap"][5] = typo(_T('info_ldap_ok')); |
|
| 272 | 272 | |
| 273 | 273 | // $aff_etapes = "<span id='etapes'>"; |
| 274 | 274 | |
| 275 | - $aff_etapes = "<ul id='infos_etapes' class='infos_$phase$en_cours'>"; |
|
| 276 | - |
|
| 277 | - foreach($liste as $etape=>$fichier){ |
|
| 278 | - if ($debut < $last) { |
|
| 279 | - if ($debut == $en_cours && $erreur) $class = "on erreur"; |
|
| 280 | - else if ($debut == $en_cours) $class = "on"; |
|
| 281 | - else if ($debut > $en_cours) $class = "prochains"; |
|
| 282 | - else $class = "valides"; |
|
| 283 | - |
|
| 284 | - $aff_etapes .= "<li class='$class'><div class='fond'>"; |
|
| 285 | - $aff_etapes .= ($debut == $en_cours)?"<strong>":''; |
|
| 286 | - $aff_etapes .= "<em>"._T('etape')." </em><span class='numero_etape'>$debut</span><em> : </em>"; |
|
| 287 | - $aff_etapes .= $intitule_etat["$phase"][$debut]; |
|
| 288 | - $aff_etapes .= ($debut == $en_cours)?"</strong>":''; |
|
| 289 | - $aff_etapes .= "</div></li>"; |
|
| 290 | - } |
|
| 291 | - $debut++; |
|
| 292 | - } |
|
| 293 | - $aff_etapes .= "</ul>"; |
|
| 294 | - $aff_etapes .= "<br class='nettoyeur' />\n"; |
|
| 295 | - return $aff_etapes; |
|
| 275 | + $aff_etapes = "<ul id='infos_etapes' class='infos_$phase$en_cours'>"; |
|
| 276 | + |
|
| 277 | + foreach($liste as $etape=>$fichier){ |
|
| 278 | + if ($debut < $last) { |
|
| 279 | + if ($debut == $en_cours && $erreur) $class = "on erreur"; |
|
| 280 | + else if ($debut == $en_cours) $class = "on"; |
|
| 281 | + else if ($debut > $en_cours) $class = "prochains"; |
|
| 282 | + else $class = "valides"; |
|
| 283 | + |
|
| 284 | + $aff_etapes .= "<li class='$class'><div class='fond'>"; |
|
| 285 | + $aff_etapes .= ($debut == $en_cours)?"<strong>":''; |
|
| 286 | + $aff_etapes .= "<em>"._T('etape')." </em><span class='numero_etape'>$debut</span><em> : </em>"; |
|
| 287 | + $aff_etapes .= $intitule_etat["$phase"][$debut]; |
|
| 288 | + $aff_etapes .= ($debut == $en_cours)?"</strong>":''; |
|
| 289 | + $aff_etapes .= "</div></li>"; |
|
| 290 | + } |
|
| 291 | + $debut++; |
|
| 292 | + } |
|
| 293 | + $aff_etapes .= "</ul>"; |
|
| 294 | + $aff_etapes .= "<br class='nettoyeur' />\n"; |
|
| 295 | + return $aff_etapes; |
|
| 296 | 296 | } |
| 297 | 297 | |
| 298 | 298 | |
| 299 | 299 | // http://doc.spip.org/@fieldset |
| 300 | 300 | function fieldset($legend, $champs = array(), $apres='', $avant='') { |
| 301 | - return "<fieldset>\n" . |
|
| 302 | - $avant . |
|
| 303 | - ($legend ? "<legend>".$legend."</legend>\n" : '') . |
|
| 304 | - fieldset_champs($champs) . |
|
| 305 | - $apres . |
|
| 306 | - "</fieldset>\n"; |
|
| 301 | + return "<fieldset>\n" . |
|
| 302 | + $avant . |
|
| 303 | + ($legend ? "<legend>".$legend."</legend>\n" : '') . |
|
| 304 | + fieldset_champs($champs) . |
|
| 305 | + $apres . |
|
| 306 | + "</fieldset>\n"; |
|
| 307 | 307 | } |
| 308 | 308 | |
| 309 | 309 | function fieldset_champs($champs = array()) |
| 310 | - { |
|
| 311 | - $fieldset = ''; |
|
| 312 | - foreach ($champs as $nom => $contenu) { |
|
| 313 | - $type = isset($contenu['hidden']) ? 'hidden' : (preg_match(',^pass,', $nom) ? 'password' : 'text'); |
|
| 314 | - $class = isset($contenu['hidden']) ? '' : "class='formo' size='40' "; |
|
| 315 | - if(isset($contenu['alternatives'])) { |
|
| 316 | - $fieldset .= $contenu['label'] ."\n"; |
|
| 317 | - foreach($contenu['alternatives'] as $valeur => $label) { |
|
| 318 | - $fieldset .= "<input type='radio' name='".$nom . |
|
| 319 | - "' id='$nom-$valeur' value='$valeur'" |
|
| 320 | - .(($valeur==$contenu['valeur'])?"\nchecked='checked'":'') |
|
| 321 | - ."/>\n"; |
|
| 322 | - $fieldset .= "<label for='$nom-$valeur'>".$label."</label>\n"; |
|
| 323 | - } |
|
| 324 | - $fieldset .= "<br />\n"; |
|
| 325 | - } |
|
| 326 | - else { |
|
| 327 | - $fieldset .= "<label for='".$nom."'>".$contenu['label']."</label>\n"; |
|
| 328 | - $fieldset .= "<input ".$class."type='".$type."' id='" . $nom . "' name='".$nom."'\nvalue='".$contenu['valeur']."'" |
|
| 329 | - .(preg_match(',^(pass|login),', $nom)?" autocomplete='off'":'') |
|
| 330 | - . ((isset($contenu['required']) AND $contenu['required'])?" required='required'":"") |
|
| 331 | - . " />\n"; |
|
| 332 | - } |
|
| 333 | - } |
|
| 334 | - return $fieldset; |
|
| 310 | + { |
|
| 311 | + $fieldset = ''; |
|
| 312 | + foreach ($champs as $nom => $contenu) { |
|
| 313 | + $type = isset($contenu['hidden']) ? 'hidden' : (preg_match(',^pass,', $nom) ? 'password' : 'text'); |
|
| 314 | + $class = isset($contenu['hidden']) ? '' : "class='formo' size='40' "; |
|
| 315 | + if(isset($contenu['alternatives'])) { |
|
| 316 | + $fieldset .= $contenu['label'] ."\n"; |
|
| 317 | + foreach($contenu['alternatives'] as $valeur => $label) { |
|
| 318 | + $fieldset .= "<input type='radio' name='".$nom . |
|
| 319 | + "' id='$nom-$valeur' value='$valeur'" |
|
| 320 | + .(($valeur==$contenu['valeur'])?"\nchecked='checked'":'') |
|
| 321 | + ."/>\n"; |
|
| 322 | + $fieldset .= "<label for='$nom-$valeur'>".$label."</label>\n"; |
|
| 323 | + } |
|
| 324 | + $fieldset .= "<br />\n"; |
|
| 325 | + } |
|
| 326 | + else { |
|
| 327 | + $fieldset .= "<label for='".$nom."'>".$contenu['label']."</label>\n"; |
|
| 328 | + $fieldset .= "<input ".$class."type='".$type."' id='" . $nom . "' name='".$nom."'\nvalue='".$contenu['valeur']."'" |
|
| 329 | + .(preg_match(',^(pass|login),', $nom)?" autocomplete='off'":'') |
|
| 330 | + . ((isset($contenu['required']) AND $contenu['required'])?" required='required'":"") |
|
| 331 | + . " />\n"; |
|
| 332 | + } |
|
| 333 | + } |
|
| 334 | + return $fieldset; |
|
| 335 | 335 | } |
| 336 | 336 | |
| 337 | 337 | function install_select_serveur() |
| 338 | 338 | { |
| 339 | - $options = array(); |
|
| 340 | - $dir = _DIR_RESTREINT . 'req/'; |
|
| 341 | - $d = @opendir($dir); |
|
| 342 | - if (!$d) return array(); |
|
| 343 | - while ($f = readdir($d)) { |
|
| 344 | - if ((preg_match('/^(.*)[.]php$/', $f, $s)) |
|
| 345 | - AND is_readable($f = $dir . $f)) { |
|
| 346 | - require_once($f); |
|
| 347 | - $s = $s[1]; |
|
| 348 | - $v = 'spip_versions_' . $s; |
|
| 349 | - if (function_exists($v) AND $v()) { |
|
| 350 | - $titre = _T("install_select_type_$s"); |
|
| 351 | - // proposer sqlite3 par defaut si dispo |
|
| 352 | - $selected = ($s=='sqlite3'?" selected='selected'":""); |
|
| 353 | - $options[$s] = "<option value='$s'$selected>" |
|
| 354 | - . ($titre ? $titre : $s) |
|
| 355 | - ."</option>"; |
|
| 356 | - } else spip_log("$s: portage indisponible"); |
|
| 357 | - } |
|
| 358 | - } |
|
| 359 | - sort($options); |
|
| 360 | - return $options; |
|
| 339 | + $options = array(); |
|
| 340 | + $dir = _DIR_RESTREINT . 'req/'; |
|
| 341 | + $d = @opendir($dir); |
|
| 342 | + if (!$d) return array(); |
|
| 343 | + while ($f = readdir($d)) { |
|
| 344 | + if ((preg_match('/^(.*)[.]php$/', $f, $s)) |
|
| 345 | + AND is_readable($f = $dir . $f)) { |
|
| 346 | + require_once($f); |
|
| 347 | + $s = $s[1]; |
|
| 348 | + $v = 'spip_versions_' . $s; |
|
| 349 | + if (function_exists($v) AND $v()) { |
|
| 350 | + $titre = _T("install_select_type_$s"); |
|
| 351 | + // proposer sqlite3 par defaut si dispo |
|
| 352 | + $selected = ($s=='sqlite3'?" selected='selected'":""); |
|
| 353 | + $options[$s] = "<option value='$s'$selected>" |
|
| 354 | + . ($titre ? $titre : $s) |
|
| 355 | + ."</option>"; |
|
| 356 | + } else spip_log("$s: portage indisponible"); |
|
| 357 | + } |
|
| 358 | + } |
|
| 359 | + sort($options); |
|
| 360 | + return $options; |
|
| 361 | 361 | } |
| 362 | 362 | |
| 363 | 363 | // http://doc.spip.org/@install_connexion_form |
| 364 | 364 | function install_connexion_form($db, $login, $pass, $predef, $hidden, $etape, $jquery=true) |
| 365 | 365 | { |
| 366 | - $server_db = (is_string($predef[0])) ? $predef[0] : ''; |
|
| 367 | - |
|
| 368 | - return generer_form_ecrire('install', ( |
|
| 369 | - "\n<input type='hidden' name='etape' value='$etape' />" |
|
| 370 | - . $hidden |
|
| 371 | - . (_request('echec')? |
|
| 372 | - ("<p><b>"._T('avis_connexion_echec_1'). |
|
| 373 | - "</b></p><p>"._T('avis_connexion_echec_2')."</p><p style='font-size: small;'>"._T('avis_connexion_echec_3')."</p>") |
|
| 374 | - :"") |
|
| 375 | - |
|
| 376 | - . ($jquery?http_script('', 'jquery.js'):'') |
|
| 377 | - . http_script(' |
|
| 366 | + $server_db = (is_string($predef[0])) ? $predef[0] : ''; |
|
| 367 | + |
|
| 368 | + return generer_form_ecrire('install', ( |
|
| 369 | + "\n<input type='hidden' name='etape' value='$etape' />" |
|
| 370 | + . $hidden |
|
| 371 | + . (_request('echec')? |
|
| 372 | + ("<p><b>"._T('avis_connexion_echec_1'). |
|
| 373 | + "</b></p><p>"._T('avis_connexion_echec_2')."</p><p style='font-size: small;'>"._T('avis_connexion_echec_3')."</p>") |
|
| 374 | + :"") |
|
| 375 | + |
|
| 376 | + . ($jquery?http_script('', 'jquery.js'):'') |
|
| 377 | + . http_script(' |
|
| 378 | 378 | $(document).ready(function() { |
| 379 | 379 | $("input[type=hidden][name=server_db]").each(function(){ |
| 380 | 380 | if ($(this).attr("value").match("sqlite*")){ |
@@ -395,67 +395,67 @@ discard block |
||
| 395 | 395 | } |
| 396 | 396 | });') |
| 397 | 397 | |
| 398 | - . ($server_db |
|
| 399 | - ? '<input type="hidden" name="server_db" value="'.$server_db.'" />' |
|
| 400 | - . (($predef[0]) |
|
| 401 | - ?('<h3>'._T('install_serveur_hebergeur').'</h3>') |
|
| 402 | - :'') |
|
| 403 | - : ('<fieldset><legend>' |
|
| 404 | - ._T('install_select_type_db') |
|
| 405 | - . "</legend>" |
|
| 406 | - .'<label for="sql_serveur_db" class="p">' |
|
| 407 | - . _T('install_types_db_connus') |
|
| 408 | - // Passer l'avertissement SQLIte en commentaire, on pourra facilement le supprimer par la suite sans changer les traductions. |
|
| 409 | - . "<br /><small>(". _T('install_types_db_connus_avertissement') .')</small>' |
|
| 410 | - .'</label>' |
|
| 411 | - . "\n<div class='p center'><select name='server_db' id='sql_serveur_db' >\n" |
|
| 412 | - . join("\n", install_select_serveur()) |
|
| 413 | - . "\n</select></div></fieldset>") |
|
| 414 | - ) |
|
| 415 | - . '<div id="install_adresse_base_hebergeur">' |
|
| 416 | - . '<p>'. _T('texte_connexion_mysql').'</p>' |
|
| 417 | - . ($predef[1] |
|
| 418 | - ? '<h3>'._T('install_adresse_base_hebergeur').'</h3>' |
|
| 419 | - : fieldset(_T('entree_base_donnee_1'), |
|
| 420 | - array( |
|
| 421 | - 'adresse_db' => array( |
|
| 422 | - 'label' => $db[1], |
|
| 423 | - 'valeur' => $db[0] |
|
| 424 | - ), |
|
| 425 | - ) |
|
| 426 | - ) |
|
| 427 | - ) |
|
| 428 | - . '</div>' |
|
| 429 | - |
|
| 430 | - . '<div id="install_login_base_hebergeur">' |
|
| 431 | - . ($predef[2] |
|
| 432 | - ? '<h3>'._T('install_login_base_hebergeur').'</h3>' |
|
| 433 | - : fieldset(_T('entree_login_connexion_1'), |
|
| 434 | - array( |
|
| 435 | - 'login_db' => array( |
|
| 436 | - 'label' => $login[1], |
|
| 437 | - 'valeur' => $login[0] |
|
| 438 | - ), |
|
| 439 | - ) |
|
| 440 | - ) |
|
| 441 | - ) |
|
| 442 | - . '</div>' |
|
| 443 | - |
|
| 444 | - . '<div id="install_pass_base_hebergeur">' |
|
| 445 | - . ($predef[3] |
|
| 446 | - ? '<h3>'._T('install_pass_base_hebergeur').'</h3>' |
|
| 447 | - : fieldset(_T('entree_mot_passe_1'), |
|
| 448 | - array( |
|
| 449 | - 'pass_db' => array( |
|
| 450 | - 'label' => $pass[1], |
|
| 451 | - 'valeur' => $pass[0] |
|
| 452 | - ), |
|
| 453 | - ) |
|
| 454 | - ) |
|
| 455 | - ) |
|
| 456 | - . '</div>' |
|
| 457 | - |
|
| 458 | - . bouton_suivant())); |
|
| 398 | + . ($server_db |
|
| 399 | + ? '<input type="hidden" name="server_db" value="'.$server_db.'" />' |
|
| 400 | + . (($predef[0]) |
|
| 401 | + ?('<h3>'._T('install_serveur_hebergeur').'</h3>') |
|
| 402 | + :'') |
|
| 403 | + : ('<fieldset><legend>' |
|
| 404 | + ._T('install_select_type_db') |
|
| 405 | + . "</legend>" |
|
| 406 | + .'<label for="sql_serveur_db" class="p">' |
|
| 407 | + . _T('install_types_db_connus') |
|
| 408 | + // Passer l'avertissement SQLIte en commentaire, on pourra facilement le supprimer par la suite sans changer les traductions. |
|
| 409 | + . "<br /><small>(". _T('install_types_db_connus_avertissement') .')</small>' |
|
| 410 | + .'</label>' |
|
| 411 | + . "\n<div class='p center'><select name='server_db' id='sql_serveur_db' >\n" |
|
| 412 | + . join("\n", install_select_serveur()) |
|
| 413 | + . "\n</select></div></fieldset>") |
|
| 414 | + ) |
|
| 415 | + . '<div id="install_adresse_base_hebergeur">' |
|
| 416 | + . '<p>'. _T('texte_connexion_mysql').'</p>' |
|
| 417 | + . ($predef[1] |
|
| 418 | + ? '<h3>'._T('install_adresse_base_hebergeur').'</h3>' |
|
| 419 | + : fieldset(_T('entree_base_donnee_1'), |
|
| 420 | + array( |
|
| 421 | + 'adresse_db' => array( |
|
| 422 | + 'label' => $db[1], |
|
| 423 | + 'valeur' => $db[0] |
|
| 424 | + ), |
|
| 425 | + ) |
|
| 426 | + ) |
|
| 427 | + ) |
|
| 428 | + . '</div>' |
|
| 429 | + |
|
| 430 | + . '<div id="install_login_base_hebergeur">' |
|
| 431 | + . ($predef[2] |
|
| 432 | + ? '<h3>'._T('install_login_base_hebergeur').'</h3>' |
|
| 433 | + : fieldset(_T('entree_login_connexion_1'), |
|
| 434 | + array( |
|
| 435 | + 'login_db' => array( |
|
| 436 | + 'label' => $login[1], |
|
| 437 | + 'valeur' => $login[0] |
|
| 438 | + ), |
|
| 439 | + ) |
|
| 440 | + ) |
|
| 441 | + ) |
|
| 442 | + . '</div>' |
|
| 443 | + |
|
| 444 | + . '<div id="install_pass_base_hebergeur">' |
|
| 445 | + . ($predef[3] |
|
| 446 | + ? '<h3>'._T('install_pass_base_hebergeur').'</h3>' |
|
| 447 | + : fieldset(_T('entree_mot_passe_1'), |
|
| 448 | + array( |
|
| 449 | + 'pass_db' => array( |
|
| 450 | + 'label' => $pass[1], |
|
| 451 | + 'valeur' => $pass[0] |
|
| 452 | + ), |
|
| 453 | + ) |
|
| 454 | + ) |
|
| 455 | + ) |
|
| 456 | + . '</div>' |
|
| 457 | + |
|
| 458 | + . bouton_suivant())); |
|
| 459 | 459 | |
| 460 | 460 | } |
| 461 | 461 | |
@@ -465,23 +465,23 @@ discard block |
||
| 465 | 465 | // http://doc.spip.org/@predef_ou_cache |
| 466 | 466 | function predef_ou_cache($adresse_db, $login_db, $pass_db, $server_db) |
| 467 | 467 | { |
| 468 | - return ((defined('_INSTALL_HOST_DB')) |
|
| 469 | - ? '' |
|
| 470 | - : "\n<input type='hidden' name='adresse_db' value=\"".spip_htmlspecialchars($adresse_db)."\" />" |
|
| 471 | - ) |
|
| 472 | - . ((defined('_INSTALL_USER_DB')) |
|
| 473 | - ? '' |
|
| 474 | - : "\n<input type='hidden' name='login_db' value=\"".spip_htmlspecialchars($login_db)."\" />" |
|
| 475 | - ) |
|
| 476 | - . ((defined('_INSTALL_PASS_DB')) |
|
| 477 | - ? '' |
|
| 478 | - : "\n<input type='hidden' name='pass_db' value=\"".spip_htmlspecialchars($pass_db)."\" />" |
|
| 479 | - ) |
|
| 480 | - |
|
| 481 | - . ((defined('_INSTALL_SERVER_DB')) |
|
| 482 | - ? '' |
|
| 483 | - : "\n<input type='hidden' name='server_db' value=\"".spip_htmlspecialchars($server_db)."\" />" |
|
| 484 | - ); |
|
| 468 | + return ((defined('_INSTALL_HOST_DB')) |
|
| 469 | + ? '' |
|
| 470 | + : "\n<input type='hidden' name='adresse_db' value=\"".spip_htmlspecialchars($adresse_db)."\" />" |
|
| 471 | + ) |
|
| 472 | + . ((defined('_INSTALL_USER_DB')) |
|
| 473 | + ? '' |
|
| 474 | + : "\n<input type='hidden' name='login_db' value=\"".spip_htmlspecialchars($login_db)."\" />" |
|
| 475 | + ) |
|
| 476 | + . ((defined('_INSTALL_PASS_DB')) |
|
| 477 | + ? '' |
|
| 478 | + : "\n<input type='hidden' name='pass_db' value=\"".spip_htmlspecialchars($pass_db)."\" />" |
|
| 479 | + ) |
|
| 480 | + |
|
| 481 | + . ((defined('_INSTALL_SERVER_DB')) |
|
| 482 | + ? '' |
|
| 483 | + : "\n<input type='hidden' name='server_db' value=\"".spip_htmlspecialchars($server_db)."\" />" |
|
| 484 | + ); |
|
| 485 | 485 | } |
| 486 | 486 | |
| 487 | 487 | // presentation des bases existantes |
@@ -489,45 +489,45 @@ discard block |
||
| 489 | 489 | // http://doc.spip.org/@install_etape_liste_bases |
| 490 | 490 | function install_etape_liste_bases($server_db, $login_db, $disabled=array()) |
| 491 | 491 | { |
| 492 | - $bases = $checked = array(); |
|
| 493 | - $noms = sql_listdbs($server_db); |
|
| 494 | - if (!$noms) return ''; |
|
| 495 | - |
|
| 496 | - foreach ($noms as $nom){ |
|
| 497 | - $id = spip_htmlspecialchars($nom); |
|
| 498 | - $dis = in_array($nom, $disabled) ? " disabled='disabled'" : ''; |
|
| 499 | - $base = " name=\"choix_db\" value=\"" |
|
| 500 | - . $nom |
|
| 501 | - . '"' |
|
| 502 | - . $dis |
|
| 503 | - . " type='radio' id='$id'"; |
|
| 504 | - $label = "<label for='$id'>" |
|
| 505 | - . ($dis ? "<i>$nom</i>" : $nom) |
|
| 506 | - . "</label>"; |
|
| 507 | - |
|
| 508 | - if (!$checked AND !$dis AND |
|
| 509 | - (($nom == $login_db) OR |
|
| 510 | - ($GLOBALS['table_prefix'] == $nom))) { |
|
| 511 | - $checked = "<input$base checked='checked' />\n$label"; |
|
| 512 | - } else { |
|
| 513 | - $bases[]= "<input$base />\n$label"; |
|
| 514 | - } |
|
| 515 | - } |
|
| 516 | - |
|
| 517 | - if (!$bases && !$checked) return false; |
|
| 518 | - |
|
| 519 | - if ($checked) {array_unshift($bases, $checked); $checked = true;} |
|
| 520 | - |
|
| 521 | - return array($checked, $bases); |
|
| 492 | + $bases = $checked = array(); |
|
| 493 | + $noms = sql_listdbs($server_db); |
|
| 494 | + if (!$noms) return ''; |
|
| 495 | + |
|
| 496 | + foreach ($noms as $nom){ |
|
| 497 | + $id = spip_htmlspecialchars($nom); |
|
| 498 | + $dis = in_array($nom, $disabled) ? " disabled='disabled'" : ''; |
|
| 499 | + $base = " name=\"choix_db\" value=\"" |
|
| 500 | + . $nom |
|
| 501 | + . '"' |
|
| 502 | + . $dis |
|
| 503 | + . " type='radio' id='$id'"; |
|
| 504 | + $label = "<label for='$id'>" |
|
| 505 | + . ($dis ? "<i>$nom</i>" : $nom) |
|
| 506 | + . "</label>"; |
|
| 507 | + |
|
| 508 | + if (!$checked AND !$dis AND |
|
| 509 | + (($nom == $login_db) OR |
|
| 510 | + ($GLOBALS['table_prefix'] == $nom))) { |
|
| 511 | + $checked = "<input$base checked='checked' />\n$label"; |
|
| 512 | + } else { |
|
| 513 | + $bases[]= "<input$base />\n$label"; |
|
| 514 | + } |
|
| 515 | + } |
|
| 516 | + |
|
| 517 | + if (!$bases && !$checked) return false; |
|
| 518 | + |
|
| 519 | + if ($checked) {array_unshift($bases, $checked); $checked = true;} |
|
| 520 | + |
|
| 521 | + return array($checked, $bases); |
|
| 522 | 522 | } |
| 523 | 523 | |
| 524 | 524 | function install_propager($hidden) |
| 525 | 525 | { |
| 526 | - $res = ''; |
|
| 527 | - foreach($hidden as $k) { |
|
| 528 | - $v = spip_htmlentities(_request($k)); |
|
| 529 | - $res .= "<input type='hidden' name='$k' value='$v' />"; |
|
| 530 | - } |
|
| 531 | - return $res; |
|
| 526 | + $res = ''; |
|
| 527 | + foreach($hidden as $k) { |
|
| 528 | + $v = spip_htmlentities(_request($k)); |
|
| 529 | + $res .= "<input type='hidden' name='$k' value='$v' />"; |
|
| 530 | + } |
|
| 531 | + return $res; |
|
| 532 | 532 | } |
| 533 | 533 | ?> |
@@ -22,56 +22,56 @@ discard block |
||
| 22 | 22 | #define('_SPIP_LOCK_MODE',2); // utiliser le nfslock de spip |
| 23 | 23 | |
| 24 | 24 | if (_SPIP_LOCK_MODE==2) |
| 25 | - include_spip('inc/nfslock'); |
|
| 25 | + include_spip('inc/nfslock'); |
|
| 26 | 26 | |
| 27 | 27 | $GLOBALS['liste_verrous'] = array(); |
| 28 | 28 | // http://doc.spip.org/@spip_fopen_lock |
| 29 | 29 | function spip_fopen_lock($fichier,$mode,$verrou){ |
| 30 | - if (_SPIP_LOCK_MODE==1){ |
|
| 31 | - if ($fl = @fopen($fichier,$mode)) |
|
| 32 | - // verrou |
|
| 33 | - @flock($fl, $verrou); |
|
| 34 | - return $fl; |
|
| 35 | - } |
|
| 36 | - elseif(_SPIP_LOCK_MODE==2) { |
|
| 37 | - if (($verrou = spip_nfslock($fichier)) && ($fl = @fopen($fichier,$mode))){ |
|
| 38 | - $GLOBALS['liste_verrous'][$fl] = array($fichier,$verrou); |
|
| 39 | - return $fl; |
|
| 40 | - } |
|
| 41 | - else return false; |
|
| 42 | - } |
|
| 43 | - return @fopen($fichier,$mode); |
|
| 30 | + if (_SPIP_LOCK_MODE==1){ |
|
| 31 | + if ($fl = @fopen($fichier,$mode)) |
|
| 32 | + // verrou |
|
| 33 | + @flock($fl, $verrou); |
|
| 34 | + return $fl; |
|
| 35 | + } |
|
| 36 | + elseif(_SPIP_LOCK_MODE==2) { |
|
| 37 | + if (($verrou = spip_nfslock($fichier)) && ($fl = @fopen($fichier,$mode))){ |
|
| 38 | + $GLOBALS['liste_verrous'][$fl] = array($fichier,$verrou); |
|
| 39 | + return $fl; |
|
| 40 | + } |
|
| 41 | + else return false; |
|
| 42 | + } |
|
| 43 | + return @fopen($fichier,$mode); |
|
| 44 | 44 | } |
| 45 | 45 | // http://doc.spip.org/@spip_fclose_unlock |
| 46 | 46 | function spip_fclose_unlock($handle){ |
| 47 | - if (_SPIP_LOCK_MODE==1){ |
|
| 48 | - @flock($handle, LOCK_UN); |
|
| 49 | - } |
|
| 50 | - elseif(_SPIP_LOCK_MODE==2) { |
|
| 51 | - spip_nfsunlock(reset($GLOBALS['liste_verrous'][$handle]),end($GLOBALS['liste_verrous'][$handle])); |
|
| 52 | - unset($GLOBALS['liste_verrous'][$handle]); |
|
| 53 | - } |
|
| 54 | - return @fclose($handle); |
|
| 47 | + if (_SPIP_LOCK_MODE==1){ |
|
| 48 | + @flock($handle, LOCK_UN); |
|
| 49 | + } |
|
| 50 | + elseif(_SPIP_LOCK_MODE==2) { |
|
| 51 | + spip_nfsunlock(reset($GLOBALS['liste_verrous'][$handle]),end($GLOBALS['liste_verrous'][$handle])); |
|
| 52 | + unset($GLOBALS['liste_verrous'][$handle]); |
|
| 53 | + } |
|
| 54 | + return @fclose($handle); |
|
| 55 | 55 | } |
| 56 | 56 | |
| 57 | 57 | |
| 58 | 58 | // http://doc.spip.org/@spip_file_get_contents |
| 59 | 59 | function spip_file_get_contents ($fichier) { |
| 60 | - if (substr($fichier, -3) != '.gz') { |
|
| 61 | - if (function_exists('file_get_contents') |
|
| 62 | - AND ( |
|
| 63 | - // quand on est sous window on ne sait pas si file_get_contents marche |
|
| 64 | - // on essaye : si ca retourne du contenu alors c'est bon |
|
| 65 | - // sinon on fait un file() pour avoir le coeur net |
|
| 66 | - ($contenu = @file_get_contents ($fichier)) |
|
| 67 | - OR _OS_SERVEUR != 'windows') |
|
| 68 | - ) |
|
| 69 | - return $contenu; |
|
| 70 | - else |
|
| 71 | - $contenu = @file($fichier); |
|
| 72 | - } else |
|
| 73 | - $contenu = @gzfile($fichier); |
|
| 74 | - return is_array($contenu)?join('', $contenu):(string)$contenu; |
|
| 60 | + if (substr($fichier, -3) != '.gz') { |
|
| 61 | + if (function_exists('file_get_contents') |
|
| 62 | + AND ( |
|
| 63 | + // quand on est sous window on ne sait pas si file_get_contents marche |
|
| 64 | + // on essaye : si ca retourne du contenu alors c'est bon |
|
| 65 | + // sinon on fait un file() pour avoir le coeur net |
|
| 66 | + ($contenu = @file_get_contents ($fichier)) |
|
| 67 | + OR _OS_SERVEUR != 'windows') |
|
| 68 | + ) |
|
| 69 | + return $contenu; |
|
| 70 | + else |
|
| 71 | + $contenu = @file($fichier); |
|
| 72 | + } else |
|
| 73 | + $contenu = @gzfile($fichier); |
|
| 74 | + return is_array($contenu)?join('', $contenu):(string)$contenu; |
|
| 75 | 75 | } |
| 76 | 76 | |
| 77 | 77 | // options = array( |
@@ -79,43 +79,43 @@ discard block |
||
| 79 | 79 | // dezippe automatiquement les fichiers .gz |
| 80 | 80 | // http://doc.spip.org/@lire_fichier |
| 81 | 81 | function lire_fichier ($fichier, &$contenu, $options=false) { |
| 82 | - $contenu = ''; |
|
| 83 | - // inutile car si le fichier n'existe pas, le lock va renvoyer false juste apres |
|
| 84 | - // economisons donc les acces disque, sauf chez free qui rale pour un rien |
|
| 85 | - if (_TEST_FILE_EXISTS AND !@file_exists($fichier)) |
|
| 86 | - return false; |
|
| 87 | - |
|
| 88 | - #spip_timer('lire_fichier'); |
|
| 89 | - |
|
| 90 | - // pas de @ sur spip_fopen_lock qui est silencieux de toute facon |
|
| 91 | - if ($fl = spip_fopen_lock($fichier, 'r', LOCK_SH)) { |
|
| 92 | - // lire le fichier avant tout |
|
| 93 | - $contenu = spip_file_get_contents($fichier); |
|
| 94 | - |
|
| 95 | - // le fichier a-t-il ete supprime par le locker ? |
|
| 96 | - // on ne verifie que si la tentative de lecture a echoue |
|
| 97 | - // pour discriminer un contenu vide d'un fichier absent |
|
| 98 | - // et eviter un acces disque |
|
| 99 | - if (!$contenu AND !@file_exists($fichier)) { |
|
| 100 | - spip_fclose_unlock($fl); |
|
| 101 | - return false; |
|
| 102 | - } |
|
| 103 | - |
|
| 104 | - // liberer le verrou |
|
| 105 | - spip_fclose_unlock($fl); |
|
| 106 | - |
|
| 107 | - // Verifications |
|
| 108 | - $ok = true; |
|
| 109 | - if ($options['phpcheck'] == 'oui') |
|
| 110 | - $ok &= (preg_match(",[?]>\n?$,", $contenu)); |
|
| 111 | - |
|
| 112 | - #spip_log("$fread $fichier ".spip_timer('lire_fichier')); |
|
| 113 | - if (!$ok) |
|
| 114 | - spip_log("echec lecture $fichier"); |
|
| 115 | - |
|
| 116 | - return $ok; |
|
| 117 | - } |
|
| 118 | - return false; |
|
| 82 | + $contenu = ''; |
|
| 83 | + // inutile car si le fichier n'existe pas, le lock va renvoyer false juste apres |
|
| 84 | + // economisons donc les acces disque, sauf chez free qui rale pour un rien |
|
| 85 | + if (_TEST_FILE_EXISTS AND !@file_exists($fichier)) |
|
| 86 | + return false; |
|
| 87 | + |
|
| 88 | + #spip_timer('lire_fichier'); |
|
| 89 | + |
|
| 90 | + // pas de @ sur spip_fopen_lock qui est silencieux de toute facon |
|
| 91 | + if ($fl = spip_fopen_lock($fichier, 'r', LOCK_SH)) { |
|
| 92 | + // lire le fichier avant tout |
|
| 93 | + $contenu = spip_file_get_contents($fichier); |
|
| 94 | + |
|
| 95 | + // le fichier a-t-il ete supprime par le locker ? |
|
| 96 | + // on ne verifie que si la tentative de lecture a echoue |
|
| 97 | + // pour discriminer un contenu vide d'un fichier absent |
|
| 98 | + // et eviter un acces disque |
|
| 99 | + if (!$contenu AND !@file_exists($fichier)) { |
|
| 100 | + spip_fclose_unlock($fl); |
|
| 101 | + return false; |
|
| 102 | + } |
|
| 103 | + |
|
| 104 | + // liberer le verrou |
|
| 105 | + spip_fclose_unlock($fl); |
|
| 106 | + |
|
| 107 | + // Verifications |
|
| 108 | + $ok = true; |
|
| 109 | + if ($options['phpcheck'] == 'oui') |
|
| 110 | + $ok &= (preg_match(",[?]>\n?$,", $contenu)); |
|
| 111 | + |
|
| 112 | + #spip_log("$fread $fichier ".spip_timer('lire_fichier')); |
|
| 113 | + if (!$ok) |
|
| 114 | + spip_log("echec lecture $fichier"); |
|
| 115 | + |
|
| 116 | + return $ok; |
|
| 117 | + } |
|
| 118 | + return false; |
|
| 119 | 119 | } |
| 120 | 120 | |
| 121 | 121 | // |
@@ -125,77 +125,77 @@ discard block |
||
| 125 | 125 | // http://doc.spip.org/@ecrire_fichier |
| 126 | 126 | function ecrire_fichier ($fichier, $contenu, $ignorer_echec = false, $truncate=true) { |
| 127 | 127 | |
| 128 | - #spip_timer('ecrire_fichier'); |
|
| 129 | - |
|
| 130 | - // verrouiller le fichier destination |
|
| 131 | - if ($fp = spip_fopen_lock($fichier, 'a',LOCK_EX)) { |
|
| 132 | - // ecrire les donnees, compressees le cas echeant |
|
| 133 | - // (on ouvre un nouveau pointeur sur le fichier, ce qui a l'avantage |
|
| 134 | - // de le recreer si le locker qui nous precede l'avait supprime...) |
|
| 135 | - if (substr($fichier, -3) == '.gz') |
|
| 136 | - $contenu = gzencode($contenu); |
|
| 137 | - // si c'est une ecriture avec troncation , on fait plutot une ecriture complete a cote suivie unlink+rename |
|
| 138 | - // pour etre sur d'avoir une operation atomique |
|
| 139 | - // y compris en NFS : http://www.ietf.org/rfc/rfc1094.txt |
|
| 140 | - // sauf sous wintruc ou ca ne marche pas |
|
| 141 | - $ok = false; |
|
| 142 | - if ($truncate AND _OS_SERVEUR != 'windows'){ |
|
| 143 | - if (!function_exists('creer_uniqid')) |
|
| 144 | - include_spip('inc/acces'); |
|
| 145 | - $id = creer_uniqid(); |
|
| 146 | - // on ouvre un pointeur sur un fichier temporaire en ecriture +raz |
|
| 147 | - if ($fp2 = spip_fopen_lock("$fichier.$id", 'w',LOCK_EX)) { |
|
| 148 | - $s = @fputs($fp2, $contenu, $a = strlen($contenu)); |
|
| 149 | - $ok = ($s == $a); |
|
| 150 | - spip_fclose_unlock($fp2); |
|
| 151 | - spip_fclose_unlock($fp); |
|
| 152 | - // unlink direct et pas spip_unlink car on avait deja le verrou |
|
| 153 | - // a priori pas besoin car rename ecrase la cible |
|
| 154 | - // @unlink($fichier); |
|
| 155 | - // le rename aussitot, atomique quand on est pas sous windows |
|
| 156 | - // au pire on arrive en second en cas de concourance, et le rename echoue |
|
| 157 | - // --> on a la version de l'autre process qui doit etre identique |
|
| 158 | - @rename("$fichier.$id",$fichier); |
|
| 159 | - // precaution en cas d'echec du rename |
|
| 160 | - if (!_TEST_FILE_EXISTS OR @file_exists("$fichier.$id")) |
|
| 161 | - @unlink("$fichier.$id"); |
|
| 162 | - if ($ok) |
|
| 163 | - $ok = file_exists($fichier); |
|
| 164 | - } |
|
| 165 | - else |
|
| 166 | - // echec mais penser a fermer .. |
|
| 167 | - spip_fclose_unlock($fp); |
|
| 168 | - } |
|
| 169 | - // sinon ou si methode precedente a echoueee |
|
| 170 | - // on se rabat sur la methode ancienne |
|
| 171 | - if (!$ok){ |
|
| 172 | - // ici on est en ajout ou sous windows, cas desespere |
|
| 173 | - if ($truncate) |
|
| 174 | - @ftruncate($fp,0); |
|
| 175 | - $s = @fputs($fp, $contenu, $a = strlen($contenu)); |
|
| 176 | - |
|
| 177 | - $ok = ($s == $a); |
|
| 178 | - spip_fclose_unlock($fp); |
|
| 179 | - } |
|
| 180 | - |
|
| 181 | - // liberer le verrou et fermer le fichier |
|
| 182 | - @chmod($fichier, _SPIP_CHMOD & 0666); |
|
| 183 | - if ($ok) { |
|
| 184 | - if (strpos($fichier,".php")!==false){ |
|
| 185 | - spip_clear_opcode_cache(realpath($fichier)); |
|
| 186 | - } |
|
| 187 | - return $ok; |
|
| 188 | - } |
|
| 189 | - } |
|
| 190 | - |
|
| 191 | - if (!$ignorer_echec){ |
|
| 192 | - include_spip('inc/autoriser'); |
|
| 193 | - if (autoriser('chargerftp')) |
|
| 194 | - raler_fichier($fichier); |
|
| 195 | - spip_unlink($fichier); |
|
| 196 | - } |
|
| 197 | - spip_log("Ecriture fichier $fichier impossible",_LOG_INFO_IMPORTANTE); |
|
| 198 | - return false; |
|
| 128 | + #spip_timer('ecrire_fichier'); |
|
| 129 | + |
|
| 130 | + // verrouiller le fichier destination |
|
| 131 | + if ($fp = spip_fopen_lock($fichier, 'a',LOCK_EX)) { |
|
| 132 | + // ecrire les donnees, compressees le cas echeant |
|
| 133 | + // (on ouvre un nouveau pointeur sur le fichier, ce qui a l'avantage |
|
| 134 | + // de le recreer si le locker qui nous precede l'avait supprime...) |
|
| 135 | + if (substr($fichier, -3) == '.gz') |
|
| 136 | + $contenu = gzencode($contenu); |
|
| 137 | + // si c'est une ecriture avec troncation , on fait plutot une ecriture complete a cote suivie unlink+rename |
|
| 138 | + // pour etre sur d'avoir une operation atomique |
|
| 139 | + // y compris en NFS : http://www.ietf.org/rfc/rfc1094.txt |
|
| 140 | + // sauf sous wintruc ou ca ne marche pas |
|
| 141 | + $ok = false; |
|
| 142 | + if ($truncate AND _OS_SERVEUR != 'windows'){ |
|
| 143 | + if (!function_exists('creer_uniqid')) |
|
| 144 | + include_spip('inc/acces'); |
|
| 145 | + $id = creer_uniqid(); |
|
| 146 | + // on ouvre un pointeur sur un fichier temporaire en ecriture +raz |
|
| 147 | + if ($fp2 = spip_fopen_lock("$fichier.$id", 'w',LOCK_EX)) { |
|
| 148 | + $s = @fputs($fp2, $contenu, $a = strlen($contenu)); |
|
| 149 | + $ok = ($s == $a); |
|
| 150 | + spip_fclose_unlock($fp2); |
|
| 151 | + spip_fclose_unlock($fp); |
|
| 152 | + // unlink direct et pas spip_unlink car on avait deja le verrou |
|
| 153 | + // a priori pas besoin car rename ecrase la cible |
|
| 154 | + // @unlink($fichier); |
|
| 155 | + // le rename aussitot, atomique quand on est pas sous windows |
|
| 156 | + // au pire on arrive en second en cas de concourance, et le rename echoue |
|
| 157 | + // --> on a la version de l'autre process qui doit etre identique |
|
| 158 | + @rename("$fichier.$id",$fichier); |
|
| 159 | + // precaution en cas d'echec du rename |
|
| 160 | + if (!_TEST_FILE_EXISTS OR @file_exists("$fichier.$id")) |
|
| 161 | + @unlink("$fichier.$id"); |
|
| 162 | + if ($ok) |
|
| 163 | + $ok = file_exists($fichier); |
|
| 164 | + } |
|
| 165 | + else |
|
| 166 | + // echec mais penser a fermer .. |
|
| 167 | + spip_fclose_unlock($fp); |
|
| 168 | + } |
|
| 169 | + // sinon ou si methode precedente a echoueee |
|
| 170 | + // on se rabat sur la methode ancienne |
|
| 171 | + if (!$ok){ |
|
| 172 | + // ici on est en ajout ou sous windows, cas desespere |
|
| 173 | + if ($truncate) |
|
| 174 | + @ftruncate($fp,0); |
|
| 175 | + $s = @fputs($fp, $contenu, $a = strlen($contenu)); |
|
| 176 | + |
|
| 177 | + $ok = ($s == $a); |
|
| 178 | + spip_fclose_unlock($fp); |
|
| 179 | + } |
|
| 180 | + |
|
| 181 | + // liberer le verrou et fermer le fichier |
|
| 182 | + @chmod($fichier, _SPIP_CHMOD & 0666); |
|
| 183 | + if ($ok) { |
|
| 184 | + if (strpos($fichier,".php")!==false){ |
|
| 185 | + spip_clear_opcode_cache(realpath($fichier)); |
|
| 186 | + } |
|
| 187 | + return $ok; |
|
| 188 | + } |
|
| 189 | + } |
|
| 190 | + |
|
| 191 | + if (!$ignorer_echec){ |
|
| 192 | + include_spip('inc/autoriser'); |
|
| 193 | + if (autoriser('chargerftp')) |
|
| 194 | + raler_fichier($fichier); |
|
| 195 | + spip_unlink($fichier); |
|
| 196 | + } |
|
| 197 | + spip_log("Ecriture fichier $fichier impossible",_LOG_INFO_IMPORTANTE); |
|
| 198 | + return false; |
|
| 199 | 199 | } |
| 200 | 200 | |
| 201 | 201 | /** |
@@ -207,10 +207,10 @@ discard block |
||
| 207 | 207 | * @param <type> $truncate |
| 208 | 208 | */ |
| 209 | 209 | function ecrire_fichier_securise ($fichier, $contenu, $ecrire_quand_meme = false, $truncate=true) { |
| 210 | - if (substr($fichier,-4) !== '.php') |
|
| 211 | - spip_log('Erreur de programmation: '.$fichier.' doit finir par .php'); |
|
| 212 | - $contenu = "<"."?php die ('Acces interdit'); ?".">\n" . $contenu; |
|
| 213 | - return ecrire_fichier($fichier, $contenu, $ecrire_quand_meme, $truncate); |
|
| 210 | + if (substr($fichier,-4) !== '.php') |
|
| 211 | + spip_log('Erreur de programmation: '.$fichier.' doit finir par .php'); |
|
| 212 | + $contenu = "<"."?php die ('Acces interdit'); ?".">\n" . $contenu; |
|
| 213 | + return ecrire_fichier($fichier, $contenu, $ecrire_quand_meme, $truncate); |
|
| 214 | 214 | } |
| 215 | 215 | |
| 216 | 216 | /** |
@@ -220,29 +220,29 @@ discard block |
||
| 220 | 220 | * @param <type> $options |
| 221 | 221 | */ |
| 222 | 222 | function lire_fichier_securise ($fichier, &$contenu, $options=false) { |
| 223 | - if ($res = lire_fichier($fichier,$contenu,$options)){ |
|
| 224 | - $contenu = substr($contenu,strlen("<"."?php die ('Acces interdit'); ?".">\n")); |
|
| 225 | - } |
|
| 226 | - return $res; |
|
| 223 | + if ($res = lire_fichier($fichier,$contenu,$options)){ |
|
| 224 | + $contenu = substr($contenu,strlen("<"."?php die ('Acces interdit'); ?".">\n")); |
|
| 225 | + } |
|
| 226 | + return $res; |
|
| 227 | 227 | } |
| 228 | 228 | |
| 229 | 229 | // http://doc.spip.org/@raler_fichier |
| 230 | 230 | function raler_fichier($fichier) |
| 231 | 231 | { |
| 232 | - include_spip('inc/minipres'); |
|
| 233 | - $dir = dirname($fichier); |
|
| 234 | - http_status(401); |
|
| 235 | - echo minipres(_T('texte_inc_meta_2'), "<h4 style='color: red'>" |
|
| 236 | - . _T('texte_inc_meta_1', array('fichier' => $fichier)) |
|
| 237 | - . " <a href='" |
|
| 238 | - . generer_url_ecrire('install', "etape=chmod&test_dir=$dir") |
|
| 239 | - . "'>" |
|
| 240 | - . _T('texte_inc_meta_2') |
|
| 241 | - . "</a> " |
|
| 242 | - . _T('texte_inc_meta_3', |
|
| 243 | - array('repertoire' => joli_repertoire($dir))) |
|
| 244 | - . "</h4>\n"); |
|
| 245 | - exit; |
|
| 232 | + include_spip('inc/minipres'); |
|
| 233 | + $dir = dirname($fichier); |
|
| 234 | + http_status(401); |
|
| 235 | + echo minipres(_T('texte_inc_meta_2'), "<h4 style='color: red'>" |
|
| 236 | + . _T('texte_inc_meta_1', array('fichier' => $fichier)) |
|
| 237 | + . " <a href='" |
|
| 238 | + . generer_url_ecrire('install', "etape=chmod&test_dir=$dir") |
|
| 239 | + . "'>" |
|
| 240 | + . _T('texte_inc_meta_2') |
|
| 241 | + . "</a> " |
|
| 242 | + . _T('texte_inc_meta_3', |
|
| 243 | + array('repertoire' => joli_repertoire($dir))) |
|
| 244 | + . "</h4>\n"); |
|
| 245 | + exit; |
|
| 246 | 246 | } |
| 247 | 247 | |
| 248 | 248 | // |
@@ -252,9 +252,9 @@ discard block |
||
| 252 | 252 | // http://doc.spip.org/@jeune_fichier |
| 253 | 253 | function jeune_fichier($fichier, $n) |
| 254 | 254 | { |
| 255 | - if (!file_exists($fichier)) return false; |
|
| 256 | - if (!$c = @filemtime($fichier)) return false; |
|
| 257 | - return (time()-$n <= $c); |
|
| 255 | + if (!file_exists($fichier)) return false; |
|
| 256 | + if (!$c = @filemtime($fichier)) return false; |
|
| 257 | + return (time()-$n <= $c); |
|
| 258 | 258 | } |
| 259 | 259 | |
| 260 | 260 | // |
@@ -262,31 +262,31 @@ discard block |
||
| 262 | 262 | // |
| 263 | 263 | // http://doc.spip.org/@supprimer_fichier |
| 264 | 264 | function supprimer_fichier($fichier, $lock=true) { |
| 265 | - if (!@file_exists($fichier)) |
|
| 266 | - return true; |
|
| 265 | + if (!@file_exists($fichier)) |
|
| 266 | + return true; |
|
| 267 | 267 | |
| 268 | - if ($lock) { |
|
| 269 | - // verrouiller le fichier destination |
|
| 270 | - if (!$fp = spip_fopen_lock($fichier, 'a', LOCK_EX)) |
|
| 271 | - return false; |
|
| 268 | + if ($lock) { |
|
| 269 | + // verrouiller le fichier destination |
|
| 270 | + if (!$fp = spip_fopen_lock($fichier, 'a', LOCK_EX)) |
|
| 271 | + return false; |
|
| 272 | 272 | |
| 273 | - // liberer le verrou |
|
| 274 | - spip_fclose_unlock($fp); |
|
| 275 | - } |
|
| 273 | + // liberer le verrou |
|
| 274 | + spip_fclose_unlock($fp); |
|
| 275 | + } |
|
| 276 | 276 | |
| 277 | - // supprimer |
|
| 278 | - return @unlink($fichier); |
|
| 277 | + // supprimer |
|
| 278 | + return @unlink($fichier); |
|
| 279 | 279 | } |
| 280 | 280 | |
| 281 | 281 | // Supprimer brutalement, si le fichier existe |
| 282 | 282 | // http://doc.spip.org/@spip_unlink |
| 283 | 283 | function spip_unlink($f) { |
| 284 | - if (!is_dir($f)) |
|
| 285 | - supprimer_fichier($f,false); |
|
| 286 | - else { |
|
| 287 | - @unlink("$f/.ok"); |
|
| 288 | - @rmdir($f); |
|
| 289 | - } |
|
| 284 | + if (!is_dir($f)) |
|
| 285 | + supprimer_fichier($f,false); |
|
| 286 | + else { |
|
| 287 | + @unlink("$f/.ok"); |
|
| 288 | + @rmdir($f); |
|
| 289 | + } |
|
| 290 | 290 | } |
| 291 | 291 | |
| 292 | 292 | /** |
@@ -295,13 +295,13 @@ discard block |
||
| 295 | 295 | * @param null $filename |
| 296 | 296 | */ |
| 297 | 297 | function spip_clearstatcache($clear_realpath_cache = false, $filename=null){ |
| 298 | - if (!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 50300) { |
|
| 299 | - // Below PHP 5.3, clearstatcache does not accept any function parameters. |
|
| 300 | - return clearstatcache(); |
|
| 301 | - } |
|
| 302 | - else { |
|
| 303 | - return clearstatcache($clear_realpath_cache, $filename); |
|
| 304 | - } |
|
| 298 | + if (!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 50300) { |
|
| 299 | + // Below PHP 5.3, clearstatcache does not accept any function parameters. |
|
| 300 | + return clearstatcache(); |
|
| 301 | + } |
|
| 302 | + else { |
|
| 303 | + return clearstatcache($clear_realpath_cache, $filename); |
|
| 304 | + } |
|
| 305 | 305 | |
| 306 | 306 | } |
| 307 | 307 | |
@@ -317,19 +317,19 @@ discard block |
||
| 317 | 317 | * The absolute path of the PHP file to invalidate. |
| 318 | 318 | */ |
| 319 | 319 | function spip_clear_opcode_cache($filepath) { |
| 320 | - spip_clearstatcache(TRUE, $filepath); |
|
| 320 | + spip_clearstatcache(TRUE, $filepath); |
|
| 321 | 321 | |
| 322 | - // Zend OPcache |
|
| 323 | - if (function_exists('opcache_invalidate')) { |
|
| 322 | + // Zend OPcache |
|
| 323 | + if (function_exists('opcache_invalidate')) { |
|
| 324 | 324 | opcache_invalidate($filepath, TRUE); |
| 325 | - } |
|
| 326 | - // APC. |
|
| 327 | - if (function_exists('apc_delete_file')) { |
|
| 325 | + } |
|
| 326 | + // APC. |
|
| 327 | + if (function_exists('apc_delete_file')) { |
|
| 328 | 328 | // apc_delete_file() throws a PHP warning in case the specified file was |
| 329 | 329 | // not compiled yet. |
| 330 | 330 | // @see http://php.net/apc-delete-file |
| 331 | 331 | @apc_delete_file($filepath); |
| 332 | - } |
|
| 332 | + } |
|
| 333 | 333 | } |
| 334 | 334 | |
| 335 | 335 | /** |
@@ -344,12 +344,12 @@ discard block |
||
| 344 | 344 | * |
| 345 | 345 | */ |
| 346 | 346 | function spip_attend_invalidation_opcode_cache(){ |
| 347 | - if (function_exists('opcache_get_configuration') |
|
| 348 | - AND @ini_get('opcache.enable') |
|
| 349 | - AND @ini_get('opcache.validate_timestamps') |
|
| 350 | - AND $duree = @ini_get('opcache.revalidate_freq') ) { |
|
| 351 | - sleep($duree+1); |
|
| 352 | - } |
|
| 347 | + if (function_exists('opcache_get_configuration') |
|
| 348 | + AND @ini_get('opcache.enable') |
|
| 349 | + AND @ini_get('opcache.validate_timestamps') |
|
| 350 | + AND $duree = @ini_get('opcache.revalidate_freq') ) { |
|
| 351 | + sleep($duree+1); |
|
| 352 | + } |
|
| 353 | 353 | } |
| 354 | 354 | |
| 355 | 355 | /** |
@@ -361,18 +361,18 @@ discard block |
||
| 361 | 361 | * @return bool Suppression reussie. |
| 362 | 362 | */ |
| 363 | 363 | function supprimer_repertoire($dir) { |
| 364 | - if (!file_exists($dir)) return true; |
|
| 365 | - if (!is_dir($dir) || is_link($dir)) return @unlink($dir); |
|
| 364 | + if (!file_exists($dir)) return true; |
|
| 365 | + if (!is_dir($dir) || is_link($dir)) return @unlink($dir); |
|
| 366 | 366 | |
| 367 | - foreach (scandir($dir) as $item) { |
|
| 368 | - if ($item == '.' || $item == '..') continue; |
|
| 369 | - if (!supprimer_repertoire($dir . "/" . $item)) { |
|
| 370 | - @chmod($dir . "/" . $item, 0777); |
|
| 371 | - if (!supprimer_repertoire($dir . "/" . $item)) return false; |
|
| 372 | - }; |
|
| 373 | - } |
|
| 367 | + foreach (scandir($dir) as $item) { |
|
| 368 | + if ($item == '.' || $item == '..') continue; |
|
| 369 | + if (!supprimer_repertoire($dir . "/" . $item)) { |
|
| 370 | + @chmod($dir . "/" . $item, 0777); |
|
| 371 | + if (!supprimer_repertoire($dir . "/" . $item)) return false; |
|
| 372 | + }; |
|
| 373 | + } |
|
| 374 | 374 | |
| 375 | - return @rmdir($dir); |
|
| 375 | + return @rmdir($dir); |
|
| 376 | 376 | } |
| 377 | 377 | |
| 378 | 378 | |
@@ -384,61 +384,61 @@ discard block |
||
| 384 | 384 | // |
| 385 | 385 | // http://doc.spip.org/@sous_repertoire |
| 386 | 386 | function sous_repertoire($base, $subdir='', $nobase = false, $tantpis=false) { |
| 387 | - static $dirs = array(); |
|
| 388 | - |
|
| 389 | - $base = str_replace("//", "/", $base); |
|
| 390 | - |
|
| 391 | - # suppr le dernier caractere si c'est un / ou un _ |
|
| 392 | - $base = rtrim($base, '/_'); |
|
| 393 | - |
|
| 394 | - if (!strlen($subdir)) { |
|
| 395 | - $n = strrpos($base, "/"); |
|
| 396 | - if ($n === false) return $nobase ? '' : ($base .'/'); |
|
| 397 | - $subdir = substr($base, $n+1); |
|
| 398 | - $base = substr($base, 0, $n+1); |
|
| 399 | - } else { |
|
| 400 | - $base .= '/'; |
|
| 401 | - $subdir = str_replace("/", "", $subdir); |
|
| 402 | - } |
|
| 403 | - |
|
| 404 | - $baseaff = $nobase ? '' : $base; |
|
| 405 | - if (isset($dirs[$base.$subdir])) |
|
| 406 | - return $baseaff.$dirs[$base.$subdir]; |
|
| 407 | - |
|
| 408 | - |
|
| 409 | - if (_CREER_DIR_PLAT AND @file_exists("$base${subdir}.plat")) |
|
| 410 | - return $baseaff.($dirs[$base.$subdir] = "${subdir}_"); |
|
| 411 | - |
|
| 412 | - $path = $base.$subdir; # $path = 'IMG/distant/pdf' ou 'IMG/distant_pdf' |
|
| 413 | - |
|
| 414 | - if (file_exists("$path/.ok")) |
|
| 415 | - return $baseaff.($dirs[$base.$subdir] = "$subdir/"); |
|
| 416 | - |
|
| 417 | - @mkdir($path, _SPIP_CHMOD); |
|
| 418 | - @chmod($path, _SPIP_CHMOD); |
|
| 419 | - |
|
| 420 | - if (is_dir($path) && is_writable($path)) { |
|
| 421 | - @touch ("$path/.ok"); |
|
| 422 | - spip_log("creation $base$subdir/"); |
|
| 423 | - return $baseaff.($dirs[$base.$subdir] = "$subdir/"); |
|
| 424 | - } |
|
| 425 | - |
|
| 426 | - // en cas d'echec c'est peut etre tout simplement que le disque est plein : |
|
| 427 | - // l'inode du fichier dir_test existe, mais impossible d'y mettre du contenu |
|
| 428 | - // => sauf besoin express (define dans mes_options), ne pas creer le .plat |
|
| 429 | - if (_CREER_DIR_PLAT |
|
| 430 | - AND $f = @fopen("$base${subdir}.plat", "w")) |
|
| 431 | - fclose($f); |
|
| 432 | - else { |
|
| 433 | - spip_log("echec creation $base${subdir}"); |
|
| 434 | - if ($tantpis) return ''; |
|
| 435 | - if (!_DIR_RESTREINT) |
|
| 436 | - $base = preg_replace(',^' . _DIR_RACINE .',', '',$base); |
|
| 437 | - $base .= $subdir; |
|
| 438 | - raler_fichier($base . '/.plat'); |
|
| 439 | - } |
|
| 440 | - spip_log("faux sous-repertoire $base${subdir}"); |
|
| 441 | - return $baseaff.($dirs[$base.$subdir] = "${subdir}_"); |
|
| 387 | + static $dirs = array(); |
|
| 388 | + |
|
| 389 | + $base = str_replace("//", "/", $base); |
|
| 390 | + |
|
| 391 | + # suppr le dernier caractere si c'est un / ou un _ |
|
| 392 | + $base = rtrim($base, '/_'); |
|
| 393 | + |
|
| 394 | + if (!strlen($subdir)) { |
|
| 395 | + $n = strrpos($base, "/"); |
|
| 396 | + if ($n === false) return $nobase ? '' : ($base .'/'); |
|
| 397 | + $subdir = substr($base, $n+1); |
|
| 398 | + $base = substr($base, 0, $n+1); |
|
| 399 | + } else { |
|
| 400 | + $base .= '/'; |
|
| 401 | + $subdir = str_replace("/", "", $subdir); |
|
| 402 | + } |
|
| 403 | + |
|
| 404 | + $baseaff = $nobase ? '' : $base; |
|
| 405 | + if (isset($dirs[$base.$subdir])) |
|
| 406 | + return $baseaff.$dirs[$base.$subdir]; |
|
| 407 | + |
|
| 408 | + |
|
| 409 | + if (_CREER_DIR_PLAT AND @file_exists("$base${subdir}.plat")) |
|
| 410 | + return $baseaff.($dirs[$base.$subdir] = "${subdir}_"); |
|
| 411 | + |
|
| 412 | + $path = $base.$subdir; # $path = 'IMG/distant/pdf' ou 'IMG/distant_pdf' |
|
| 413 | + |
|
| 414 | + if (file_exists("$path/.ok")) |
|
| 415 | + return $baseaff.($dirs[$base.$subdir] = "$subdir/"); |
|
| 416 | + |
|
| 417 | + @mkdir($path, _SPIP_CHMOD); |
|
| 418 | + @chmod($path, _SPIP_CHMOD); |
|
| 419 | + |
|
| 420 | + if (is_dir($path) && is_writable($path)) { |
|
| 421 | + @touch ("$path/.ok"); |
|
| 422 | + spip_log("creation $base$subdir/"); |
|
| 423 | + return $baseaff.($dirs[$base.$subdir] = "$subdir/"); |
|
| 424 | + } |
|
| 425 | + |
|
| 426 | + // en cas d'echec c'est peut etre tout simplement que le disque est plein : |
|
| 427 | + // l'inode du fichier dir_test existe, mais impossible d'y mettre du contenu |
|
| 428 | + // => sauf besoin express (define dans mes_options), ne pas creer le .plat |
|
| 429 | + if (_CREER_DIR_PLAT |
|
| 430 | + AND $f = @fopen("$base${subdir}.plat", "w")) |
|
| 431 | + fclose($f); |
|
| 432 | + else { |
|
| 433 | + spip_log("echec creation $base${subdir}"); |
|
| 434 | + if ($tantpis) return ''; |
|
| 435 | + if (!_DIR_RESTREINT) |
|
| 436 | + $base = preg_replace(',^' . _DIR_RACINE .',', '',$base); |
|
| 437 | + $base .= $subdir; |
|
| 438 | + raler_fichier($base . '/.plat'); |
|
| 439 | + } |
|
| 440 | + spip_log("faux sous-repertoire $base${subdir}"); |
|
| 441 | + return $baseaff.($dirs[$base.$subdir] = "${subdir}_"); |
|
| 442 | 442 | } |
| 443 | 443 | |
| 444 | 444 | // |
@@ -455,46 +455,46 @@ discard block |
||
| 455 | 455 | // |
| 456 | 456 | // http://doc.spip.org/@preg_files |
| 457 | 457 | function preg_files($dir, $pattern=-1 /* AUTO */, $maxfiles = 10000, $recurs=array()) { |
| 458 | - $nbfiles = 0; |
|
| 459 | - if ($pattern == -1) |
|
| 460 | - $pattern = "^$dir"; |
|
| 461 | - $fichiers = array(); |
|
| 462 | - // revenir au repertoire racine si on a recu dossier/truc |
|
| 463 | - // pour regarder dossier/truc/ ne pas oublier le / final |
|
| 464 | - $dir = preg_replace(',/[^/]*$,', '', $dir); |
|
| 465 | - if ($dir == '') $dir = '.'; |
|
| 466 | - |
|
| 467 | - if (@is_dir($dir) AND is_readable($dir) AND $d = @opendir($dir)) { |
|
| 468 | - while (($f = readdir($d)) !== false && ($nbfiles<$maxfiles)) { |
|
| 469 | - if ($f[0] != '.' # ignorer . .. .svn etc |
|
| 470 | - AND $f != 'CVS' |
|
| 471 | - AND $f != 'remove.txt' |
|
| 472 | - AND is_readable($f = "$dir/$f")) { |
|
| 473 | - if (is_file($f)) { |
|
| 474 | - if (preg_match(";$pattern;iS", $f)) |
|
| 475 | - { |
|
| 476 | - $fichiers[] = $f; |
|
| 477 | - $nbfiles++; |
|
| 478 | - } |
|
| 479 | - } |
|
| 480 | - else if (is_dir($f) AND is_array($recurs)){ |
|
| 481 | - $rp = @realpath($f); |
|
| 482 | - if (!is_string($rp) OR !strlen($rp)) $rp=$f; # realpath n'est peut etre pas autorise |
|
| 483 | - if (!isset($recurs[$rp])) { |
|
| 484 | - $recurs[$rp] = true; |
|
| 485 | - $beginning = $fichiers; |
|
| 486 | - $end = preg_files("$f/", $pattern, |
|
| 487 | - $maxfiles-$nbfiles, $recurs); |
|
| 488 | - $fichiers = array_merge((array)$beginning, (array)$end); |
|
| 489 | - $nbfiles = count($fichiers); |
|
| 490 | - } |
|
| 491 | - } |
|
| 492 | - } |
|
| 493 | - } |
|
| 494 | - closedir($d); |
|
| 495 | - } |
|
| 496 | - sort($fichiers); |
|
| 497 | - return $fichiers; |
|
| 458 | + $nbfiles = 0; |
|
| 459 | + if ($pattern == -1) |
|
| 460 | + $pattern = "^$dir"; |
|
| 461 | + $fichiers = array(); |
|
| 462 | + // revenir au repertoire racine si on a recu dossier/truc |
|
| 463 | + // pour regarder dossier/truc/ ne pas oublier le / final |
|
| 464 | + $dir = preg_replace(',/[^/]*$,', '', $dir); |
|
| 465 | + if ($dir == '') $dir = '.'; |
|
| 466 | + |
|
| 467 | + if (@is_dir($dir) AND is_readable($dir) AND $d = @opendir($dir)) { |
|
| 468 | + while (($f = readdir($d)) !== false && ($nbfiles<$maxfiles)) { |
|
| 469 | + if ($f[0] != '.' # ignorer . .. .svn etc |
|
| 470 | + AND $f != 'CVS' |
|
| 471 | + AND $f != 'remove.txt' |
|
| 472 | + AND is_readable($f = "$dir/$f")) { |
|
| 473 | + if (is_file($f)) { |
|
| 474 | + if (preg_match(";$pattern;iS", $f)) |
|
| 475 | + { |
|
| 476 | + $fichiers[] = $f; |
|
| 477 | + $nbfiles++; |
|
| 478 | + } |
|
| 479 | + } |
|
| 480 | + else if (is_dir($f) AND is_array($recurs)){ |
|
| 481 | + $rp = @realpath($f); |
|
| 482 | + if (!is_string($rp) OR !strlen($rp)) $rp=$f; # realpath n'est peut etre pas autorise |
|
| 483 | + if (!isset($recurs[$rp])) { |
|
| 484 | + $recurs[$rp] = true; |
|
| 485 | + $beginning = $fichiers; |
|
| 486 | + $end = preg_files("$f/", $pattern, |
|
| 487 | + $maxfiles-$nbfiles, $recurs); |
|
| 488 | + $fichiers = array_merge((array)$beginning, (array)$end); |
|
| 489 | + $nbfiles = count($fichiers); |
|
| 490 | + } |
|
| 491 | + } |
|
| 492 | + } |
|
| 493 | + } |
|
| 494 | + closedir($d); |
|
| 495 | + } |
|
| 496 | + sort($fichiers); |
|
| 497 | + return $fichiers; |
|
| 498 | 498 | } |
| 499 | 499 | |
| 500 | 500 | ?> |
@@ -48,85 +48,85 @@ discard block |
||
| 48 | 48 | * id of job |
| 49 | 49 | */ |
| 50 | 50 | function queue_add_job($function, $description, $arguments = array(), $file = '', $no_duplicate = false, $time=0, $priority=0){ |
| 51 | - include_spip('base/abstract_sql'); |
|
| 52 | - |
|
| 53 | - // cas pourri de ecrire/action/editer_site avec l'option reload=oui |
|
| 54 | - if (defined('_GENIE_SYNDIC_NOW')) |
|
| 55 | - $arguments['id_syndic'] = _GENIE_SYNDIC_NOW; |
|
| 56 | - |
|
| 57 | - // serialiser les arguments |
|
| 58 | - $arguments = serialize($arguments); |
|
| 59 | - $md5args = md5($arguments); |
|
| 60 | - |
|
| 61 | - // si pas de date programee, des que possible |
|
| 62 | - $duplicate_where = 'status='.intval(_JQ_SCHEDULED).' AND '; |
|
| 63 | - if (!$time){ |
|
| 64 | - $time = time(); |
|
| 65 | - $duplicate_where = ""; // ne pas dupliquer si deja le meme job en cours d'execution |
|
| 66 | - } |
|
| 67 | - $date = date('Y-m-d H:i:s',$time); |
|
| 68 | - |
|
| 69 | - $set_job = array( |
|
| 70 | - 'fonction'=>$function, |
|
| 71 | - 'descriptif'=>$description, |
|
| 72 | - 'args'=>$arguments, |
|
| 73 | - 'md5args'=>$md5args, |
|
| 74 | - 'inclure'=>$file, |
|
| 75 | - 'priorite'=>max(-10,min(10,intval($priority))), |
|
| 76 | - 'date'=>$date, |
|
| 77 | - 'status'=>_JQ_SCHEDULED, |
|
| 78 | - ); |
|
| 79 | - // si option ne pas dupliquer, regarder si la fonction existe deja |
|
| 80 | - // avec les memes args et file |
|
| 81 | - if ( |
|
| 82 | - $no_duplicate |
|
| 83 | - AND |
|
| 84 | - $id_job = sql_getfetsel('id_job','spip_jobs', |
|
| 85 | - $duplicate_where = |
|
| 86 | - $duplicate_where . 'fonction='.sql_quote($function) |
|
| 87 | - .(($no_duplicate==='function_only')?'': |
|
| 88 | - ' AND md5args='.sql_quote($md5args).' AND inclure='.sql_quote($file))) |
|
| 89 | - ) |
|
| 90 | - return $id_job; |
|
| 91 | - |
|
| 92 | - $id_job = sql_insertq('spip_jobs',$set_job); |
|
| 93 | - // en cas de concurrence, deux process peuvent arriver jusqu'ici en parallele |
|
| 94 | - // avec le meme job unique a inserer. Dans ce cas, celui qui a eu l'id le plus grand |
|
| 95 | - // doit s'effacer |
|
| 96 | - if ( |
|
| 97 | - $no_duplicate |
|
| 98 | - AND |
|
| 99 | - $id_prev = sql_getfetsel('id_job','spip_jobs',"id_job<".intval($id_job)." AND $duplicate_where")){ |
|
| 100 | - sql_delete('spip_jobs','id_job='.intval($id_job)); |
|
| 101 | - return $id_prev; |
|
| 102 | - } |
|
| 103 | - |
|
| 104 | - // verifier la non duplication qui peut etre problematique en cas de concurence |
|
| 105 | - // il faut dans ce cas que seul le dernier ajoute se supprime ! |
|
| 106 | - |
|
| 107 | - // une option de debug pour verifier que les arguments en base sont bons |
|
| 108 | - // ie cas d'un char non acceptables sur certains type de champs |
|
| 109 | - // qui coupe la valeur |
|
| 110 | - if (defined('_JQ_INSERT_CHECK_ARGS') AND $id_job) { |
|
| 111 | - $args = sql_getfetsel('args', 'spip_jobs', 'id_job='.intval($id_job)); |
|
| 112 | - if ($args!==$arguments) { |
|
| 113 | - spip_log('arguments job errones / longueur '.strlen($args)." vs ".strlen($arguments).' / valeur : '.var_export($arguments,true),'queue'); |
|
| 114 | - } |
|
| 115 | - } |
|
| 116 | - |
|
| 117 | - if ($id_job){ |
|
| 118 | - queue_update_next_job_time($time); |
|
| 119 | - } |
|
| 120 | - // si la mise en file d'attente du job echoue, |
|
| 121 | - // il ne faut pas perdre l'execution de la fonction |
|
| 122 | - // on la lance immediatement, c'est un fallback |
|
| 123 | - // sauf en cas d'upgrade necessaire (table spip_jobs inexistante) |
|
| 124 | - elseif($GLOBALS['meta']['version_installee']==$GLOBALS['spip_version_base']) { |
|
| 125 | - $set_job['id_job'] = 0; |
|
| 126 | - queue_start_job($set_job); |
|
| 127 | - } |
|
| 128 | - |
|
| 129 | - return $id_job; |
|
| 51 | + include_spip('base/abstract_sql'); |
|
| 52 | + |
|
| 53 | + // cas pourri de ecrire/action/editer_site avec l'option reload=oui |
|
| 54 | + if (defined('_GENIE_SYNDIC_NOW')) |
|
| 55 | + $arguments['id_syndic'] = _GENIE_SYNDIC_NOW; |
|
| 56 | + |
|
| 57 | + // serialiser les arguments |
|
| 58 | + $arguments = serialize($arguments); |
|
| 59 | + $md5args = md5($arguments); |
|
| 60 | + |
|
| 61 | + // si pas de date programee, des que possible |
|
| 62 | + $duplicate_where = 'status='.intval(_JQ_SCHEDULED).' AND '; |
|
| 63 | + if (!$time){ |
|
| 64 | + $time = time(); |
|
| 65 | + $duplicate_where = ""; // ne pas dupliquer si deja le meme job en cours d'execution |
|
| 66 | + } |
|
| 67 | + $date = date('Y-m-d H:i:s',$time); |
|
| 68 | + |
|
| 69 | + $set_job = array( |
|
| 70 | + 'fonction'=>$function, |
|
| 71 | + 'descriptif'=>$description, |
|
| 72 | + 'args'=>$arguments, |
|
| 73 | + 'md5args'=>$md5args, |
|
| 74 | + 'inclure'=>$file, |
|
| 75 | + 'priorite'=>max(-10,min(10,intval($priority))), |
|
| 76 | + 'date'=>$date, |
|
| 77 | + 'status'=>_JQ_SCHEDULED, |
|
| 78 | + ); |
|
| 79 | + // si option ne pas dupliquer, regarder si la fonction existe deja |
|
| 80 | + // avec les memes args et file |
|
| 81 | + if ( |
|
| 82 | + $no_duplicate |
|
| 83 | + AND |
|
| 84 | + $id_job = sql_getfetsel('id_job','spip_jobs', |
|
| 85 | + $duplicate_where = |
|
| 86 | + $duplicate_where . 'fonction='.sql_quote($function) |
|
| 87 | + .(($no_duplicate==='function_only')?'': |
|
| 88 | + ' AND md5args='.sql_quote($md5args).' AND inclure='.sql_quote($file))) |
|
| 89 | + ) |
|
| 90 | + return $id_job; |
|
| 91 | + |
|
| 92 | + $id_job = sql_insertq('spip_jobs',$set_job); |
|
| 93 | + // en cas de concurrence, deux process peuvent arriver jusqu'ici en parallele |
|
| 94 | + // avec le meme job unique a inserer. Dans ce cas, celui qui a eu l'id le plus grand |
|
| 95 | + // doit s'effacer |
|
| 96 | + if ( |
|
| 97 | + $no_duplicate |
|
| 98 | + AND |
|
| 99 | + $id_prev = sql_getfetsel('id_job','spip_jobs',"id_job<".intval($id_job)." AND $duplicate_where")){ |
|
| 100 | + sql_delete('spip_jobs','id_job='.intval($id_job)); |
|
| 101 | + return $id_prev; |
|
| 102 | + } |
|
| 103 | + |
|
| 104 | + // verifier la non duplication qui peut etre problematique en cas de concurence |
|
| 105 | + // il faut dans ce cas que seul le dernier ajoute se supprime ! |
|
| 106 | + |
|
| 107 | + // une option de debug pour verifier que les arguments en base sont bons |
|
| 108 | + // ie cas d'un char non acceptables sur certains type de champs |
|
| 109 | + // qui coupe la valeur |
|
| 110 | + if (defined('_JQ_INSERT_CHECK_ARGS') AND $id_job) { |
|
| 111 | + $args = sql_getfetsel('args', 'spip_jobs', 'id_job='.intval($id_job)); |
|
| 112 | + if ($args!==$arguments) { |
|
| 113 | + spip_log('arguments job errones / longueur '.strlen($args)." vs ".strlen($arguments).' / valeur : '.var_export($arguments,true),'queue'); |
|
| 114 | + } |
|
| 115 | + } |
|
| 116 | + |
|
| 117 | + if ($id_job){ |
|
| 118 | + queue_update_next_job_time($time); |
|
| 119 | + } |
|
| 120 | + // si la mise en file d'attente du job echoue, |
|
| 121 | + // il ne faut pas perdre l'execution de la fonction |
|
| 122 | + // on la lance immediatement, c'est un fallback |
|
| 123 | + // sauf en cas d'upgrade necessaire (table spip_jobs inexistante) |
|
| 124 | + elseif($GLOBALS['meta']['version_installee']==$GLOBALS['spip_version_base']) { |
|
| 125 | + $set_job['id_job'] = 0; |
|
| 126 | + queue_start_job($set_job); |
|
| 127 | + } |
|
| 128 | + |
|
| 129 | + return $id_job; |
|
| 130 | 130 | } |
| 131 | 131 | |
| 132 | 132 | /** |
@@ -135,11 +135,11 @@ discard block |
||
| 135 | 135 | * @return void |
| 136 | 136 | */ |
| 137 | 137 | function queue_purger(){ |
| 138 | - include_spip('base/abstract_sql'); |
|
| 139 | - sql_delete('spip_jobs'); |
|
| 140 | - sql_delete("spip_jobs_liens","id_job NOT IN (".sql_get_select("id_job","spip_jobs").")"); |
|
| 141 | - include_spip('inc/genie'); |
|
| 142 | - genie_queue_watch_dist(); |
|
| 138 | + include_spip('base/abstract_sql'); |
|
| 139 | + sql_delete('spip_jobs'); |
|
| 140 | + sql_delete("spip_jobs_liens","id_job NOT IN (".sql_get_select("id_job","spip_jobs").")"); |
|
| 141 | + include_spip('inc/genie'); |
|
| 142 | + genie_queue_watch_dist(); |
|
| 143 | 143 | } |
| 144 | 144 | |
| 145 | 145 | /** |
@@ -149,21 +149,21 @@ discard block |
||
| 149 | 149 | * @return bool |
| 150 | 150 | */ |
| 151 | 151 | function queue_remove_job($id_job){ |
| 152 | - include_spip('base/abstract_sql'); |
|
| 153 | - |
|
| 154 | - if ($row = sql_fetsel('fonction,inclure,date','spip_jobs','id_job='.intval($id_job)) |
|
| 155 | - AND $res = sql_delete('spip_jobs','id_job='.intval($id_job))){ |
|
| 156 | - queue_unlink_job($id_job); |
|
| 157 | - // est-ce une tache cron qu'il faut relancer ? |
|
| 158 | - if ($periode = queue_is_cron_job($row['fonction'],$row['inclure'])){ |
|
| 159 | - // relancer avec les nouveaux arguments de temps |
|
| 160 | - include_spip('inc/genie'); |
|
| 161 | - // relancer avec la periode prevue |
|
| 162 | - queue_genie_replan_job($row['fonction'],$periode,strtotime($row['date'])); |
|
| 163 | - } |
|
| 164 | - queue_update_next_job_time(); |
|
| 165 | - } |
|
| 166 | - return $res; |
|
| 152 | + include_spip('base/abstract_sql'); |
|
| 153 | + |
|
| 154 | + if ($row = sql_fetsel('fonction,inclure,date','spip_jobs','id_job='.intval($id_job)) |
|
| 155 | + AND $res = sql_delete('spip_jobs','id_job='.intval($id_job))){ |
|
| 156 | + queue_unlink_job($id_job); |
|
| 157 | + // est-ce une tache cron qu'il faut relancer ? |
|
| 158 | + if ($periode = queue_is_cron_job($row['fonction'],$row['inclure'])){ |
|
| 159 | + // relancer avec les nouveaux arguments de temps |
|
| 160 | + include_spip('inc/genie'); |
|
| 161 | + // relancer avec la periode prevue |
|
| 162 | + queue_genie_replan_job($row['fonction'],$periode,strtotime($row['date'])); |
|
| 163 | + } |
|
| 164 | + queue_update_next_job_time(); |
|
| 165 | + } |
|
| 166 | + return $res; |
|
| 167 | 167 | } |
| 168 | 168 | |
| 169 | 169 | /** |
@@ -176,18 +176,18 @@ discard block |
||
| 176 | 176 | * or an array of simple array to link multiples objet in one time |
| 177 | 177 | */ |
| 178 | 178 | function queue_link_job($id_job,$objets){ |
| 179 | - include_spip('base/abstract_sql'); |
|
| 180 | - |
|
| 181 | - if (is_array($objets) AND count($objets)){ |
|
| 182 | - if (is_array(reset($objets))){ |
|
| 183 | - foreach($objets as $k=>$o){ |
|
| 184 | - $objets[$k]['id_job'] = $id_job; |
|
| 185 | - } |
|
| 186 | - sql_insertq_multi('spip_jobs_liens',$objets); |
|
| 187 | - } |
|
| 188 | - else |
|
| 189 | - sql_insertq('spip_jobs_liens',array_merge(array('id_job'=>$id_job),$objets)); |
|
| 190 | - } |
|
| 179 | + include_spip('base/abstract_sql'); |
|
| 180 | + |
|
| 181 | + if (is_array($objets) AND count($objets)){ |
|
| 182 | + if (is_array(reset($objets))){ |
|
| 183 | + foreach($objets as $k=>$o){ |
|
| 184 | + $objets[$k]['id_job'] = $id_job; |
|
| 185 | + } |
|
| 186 | + sql_insertq_multi('spip_jobs_liens',$objets); |
|
| 187 | + } |
|
| 188 | + else |
|
| 189 | + sql_insertq('spip_jobs_liens',array_merge(array('id_job'=>$id_job),$objets)); |
|
| 190 | + } |
|
| 191 | 191 | } |
| 192 | 192 | |
| 193 | 193 | /** |
@@ -199,7 +199,7 @@ discard block |
||
| 199 | 199 | * result of sql_delete |
| 200 | 200 | */ |
| 201 | 201 | function queue_unlink_job($id_job){ |
| 202 | - return sql_delete("spip_jobs_liens","id_job=".intval($id_job)); |
|
| 202 | + return sql_delete("spip_jobs_liens","id_job=".intval($id_job)); |
|
| 203 | 203 | } |
| 204 | 204 | |
| 205 | 205 | /** |
@@ -211,48 +211,48 @@ discard block |
||
| 211 | 211 | */ |
| 212 | 212 | function queue_start_job($row){ |
| 213 | 213 | |
| 214 | - // deserialiser les arguments |
|
| 215 | - $args = unserialize($row['args']); |
|
| 216 | - if ($args===false){ |
|
| 217 | - spip_log('arguments job errones '.var_export($row,true),'queue'); |
|
| 218 | - $args = array(); |
|
| 219 | - } |
|
| 220 | - |
|
| 221 | - $fonction = $row['fonction']; |
|
| 222 | - if (strlen($inclure = trim($row['inclure']))){ |
|
| 223 | - if (substr($inclure,-1)=='/'){ // c'est un chemin pour charger_fonction |
|
| 224 | - $f = charger_fonction($fonction,rtrim($inclure,'/'),false); |
|
| 225 | - if ($f) |
|
| 226 | - $fonction = $f; |
|
| 227 | - } |
|
| 228 | - else |
|
| 229 | - include_spip($inclure); |
|
| 230 | - } |
|
| 231 | - |
|
| 232 | - if (!function_exists($fonction)){ |
|
| 233 | - spip_log("fonction $fonction ($inclure) inexistante ".var_export($row,true),'queue'); |
|
| 234 | - return false; |
|
| 235 | - } |
|
| 236 | - |
|
| 237 | - spip_log("queue [".$row['id_job']."]: $fonction() start", 'queue'); |
|
| 238 | - switch (count($args)) { |
|
| 239 | - case 0: $res = $fonction(); break; |
|
| 240 | - case 1: $res = $fonction($args[0]); break; |
|
| 241 | - case 2: $res = $fonction($args[0],$args[1]); break; |
|
| 242 | - case 3: $res = $fonction($args[0],$args[1], $args[2]); break; |
|
| 243 | - case 4: $res = $fonction($args[0],$args[1], $args[2], $args[3]); break; |
|
| 244 | - case 5: $res = $fonction($args[0],$args[1], $args[2], $args[3], $args[4]); break; |
|
| 245 | - case 6: $res = $fonction($args[0],$args[1], $args[2], $args[3], $args[4], $args[5]); break; |
|
| 246 | - case 7: $res = $fonction($args[0],$args[1], $args[2], $args[3], $args[4], $args[5], $args[6]); break; |
|
| 247 | - case 8: $res = $fonction($args[0],$args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7]); break; |
|
| 248 | - case 9: $res = $fonction($args[0],$args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7], $args[8]); break; |
|
| 249 | - case 10:$res = $fonction($args[0],$args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7], $args[8], $args[9]); break; |
|
| 250 | - default: |
|
| 251 | - # plus lent mais completement generique |
|
| 252 | - $res = call_user_func_array($fonction, $args); |
|
| 253 | - } |
|
| 254 | - spip_log("queue [".$row['id_job']."]: $fonction() end", 'queue'); |
|
| 255 | - return $res; |
|
| 214 | + // deserialiser les arguments |
|
| 215 | + $args = unserialize($row['args']); |
|
| 216 | + if ($args===false){ |
|
| 217 | + spip_log('arguments job errones '.var_export($row,true),'queue'); |
|
| 218 | + $args = array(); |
|
| 219 | + } |
|
| 220 | + |
|
| 221 | + $fonction = $row['fonction']; |
|
| 222 | + if (strlen($inclure = trim($row['inclure']))){ |
|
| 223 | + if (substr($inclure,-1)=='/'){ // c'est un chemin pour charger_fonction |
|
| 224 | + $f = charger_fonction($fonction,rtrim($inclure,'/'),false); |
|
| 225 | + if ($f) |
|
| 226 | + $fonction = $f; |
|
| 227 | + } |
|
| 228 | + else |
|
| 229 | + include_spip($inclure); |
|
| 230 | + } |
|
| 231 | + |
|
| 232 | + if (!function_exists($fonction)){ |
|
| 233 | + spip_log("fonction $fonction ($inclure) inexistante ".var_export($row,true),'queue'); |
|
| 234 | + return false; |
|
| 235 | + } |
|
| 236 | + |
|
| 237 | + spip_log("queue [".$row['id_job']."]: $fonction() start", 'queue'); |
|
| 238 | + switch (count($args)) { |
|
| 239 | + case 0: $res = $fonction(); break; |
|
| 240 | + case 1: $res = $fonction($args[0]); break; |
|
| 241 | + case 2: $res = $fonction($args[0],$args[1]); break; |
|
| 242 | + case 3: $res = $fonction($args[0],$args[1], $args[2]); break; |
|
| 243 | + case 4: $res = $fonction($args[0],$args[1], $args[2], $args[3]); break; |
|
| 244 | + case 5: $res = $fonction($args[0],$args[1], $args[2], $args[3], $args[4]); break; |
|
| 245 | + case 6: $res = $fonction($args[0],$args[1], $args[2], $args[3], $args[4], $args[5]); break; |
|
| 246 | + case 7: $res = $fonction($args[0],$args[1], $args[2], $args[3], $args[4], $args[5], $args[6]); break; |
|
| 247 | + case 8: $res = $fonction($args[0],$args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7]); break; |
|
| 248 | + case 9: $res = $fonction($args[0],$args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7], $args[8]); break; |
|
| 249 | + case 10:$res = $fonction($args[0],$args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7], $args[8], $args[9]); break; |
|
| 250 | + default: |
|
| 251 | + # plus lent mais completement generique |
|
| 252 | + $res = call_user_func_array($fonction, $args); |
|
| 253 | + } |
|
| 254 | + spip_log("queue [".$row['id_job']."]: $fonction() end", 'queue'); |
|
| 255 | + return $res; |
|
| 256 | 256 | |
| 257 | 257 | } |
| 258 | 258 | |
@@ -271,82 +271,82 @@ discard block |
||
| 271 | 271 | * @return null|false |
| 272 | 272 | */ |
| 273 | 273 | function queue_schedule($force_jobs = null){ |
| 274 | - $time = time(); |
|
| 275 | - if (defined('_DEBUG_BLOCK_QUEUE')) { |
|
| 276 | - spip_log("_DEBUG_BLOCK_QUEUE : schedule stop",'jq'._LOG_DEBUG); |
|
| 277 | - return; |
|
| 278 | - } |
|
| 279 | - |
|
| 280 | - // rien a faire si le prochain job est encore dans le futur |
|
| 281 | - if (queue_sleep_time_to_next_job()>0 AND (!$force_jobs OR !count($force_jobs))){ |
|
| 282 | - spip_log("queue_sleep_time_to_next_job",'jq'._LOG_DEBUG); |
|
| 283 | - return; |
|
| 284 | - } |
|
| 285 | - |
|
| 286 | - include_spip('base/abstract_sql'); |
|
| 287 | - // on ne peut rien faire si pas de connexion SQL |
|
| 288 | - if (!spip_connect()) return false; |
|
| 289 | - |
|
| 290 | - if (!defined('_JQ_MAX_JOBS_TIME_TO_EXECUTE')){ |
|
| 291 | - $max_time = ini_get('max_execution_time')/2; |
|
| 292 | - // valeur conservatrice si on a pas reussi a lire le max_execution_time |
|
| 293 | - if (!$max_time) $max_time=5; |
|
| 294 | - define('_JQ_MAX_JOBS_TIME_TO_EXECUTE',min($max_time,15)); // une valeur maxi en temps. |
|
| 295 | - } |
|
| 296 | - $end_time = $time + _JQ_MAX_JOBS_TIME_TO_EXECUTE; |
|
| 297 | - |
|
| 298 | - spip_log("JQ schedule $time / $end_time",'jq'._LOG_DEBUG); |
|
| 299 | - |
|
| 300 | - if (!defined('_JQ_MAX_JOBS_EXECUTE')) |
|
| 301 | - define('_JQ_MAX_JOBS_EXECUTE',200); |
|
| 302 | - $nbj=0; |
|
| 303 | - // attraper les jobs |
|
| 304 | - // dont la date est passee (echus en attente), |
|
| 305 | - // par odre : |
|
| 306 | - // - de priorite |
|
| 307 | - // - de date |
|
| 308 | - // lorsqu'un job cron n'a pas fini, sa priorite est descendue |
|
| 309 | - // pour qu'il ne bloque pas les autres jobs en attente |
|
| 310 | - if (is_array($force_jobs) AND count($force_jobs)) |
|
| 311 | - $cond = "status=".intval(_JQ_SCHEDULED)." AND ".sql_in("id_job", $force_jobs); |
|
| 312 | - else { |
|
| 313 | - $now = date('Y-m-d H:i:s',$time); |
|
| 314 | - $cond = "status=".intval(_JQ_SCHEDULED)." AND date<=".sql_quote($now); |
|
| 315 | - } |
|
| 316 | - |
|
| 317 | - register_shutdown_function('queue_error_handler'); // recuperer les erreurs auant que possible |
|
| 318 | - $res = sql_allfetsel('*','spip_jobs',$cond,'','priorite DESC,date','0,'.(_JQ_MAX_JOBS_EXECUTE+1)); |
|
| 319 | - do { |
|
| 320 | - if ($row = array_shift($res)){ |
|
| 321 | - $nbj++; |
|
| 322 | - // il faut un verrou, a base de sql_delete |
|
| 323 | - if (sql_delete('spip_jobs',"id_job=".intval($row['id_job'])." AND status=".intval(_JQ_SCHEDULED))){ |
|
| 324 | - #spip_log("JQ schedule job ".$nbj." OK",'jq'); |
|
| 325 | - // on reinsert dans la base aussitot avec un status=_JQ_PENDING |
|
| 326 | - $row['status'] = _JQ_PENDING; |
|
| 327 | - $row['date'] = date('Y-m-d H:i:s',$time); |
|
| 328 | - sql_insertq('spip_jobs', $row); |
|
| 329 | - |
|
| 330 | - // on a la main sur le job : |
|
| 331 | - // l'executer |
|
| 332 | - $result = queue_start_job($row); |
|
| 333 | - |
|
| 334 | - $time = time(); |
|
| 335 | - queue_close_job($row, $time, $result); |
|
| 336 | - } |
|
| 337 | - } |
|
| 338 | - spip_log("JQ schedule job end time ".$time,'jq'._LOG_DEBUG); |
|
| 339 | - } while ($nbj<_JQ_MAX_JOBS_EXECUTE AND $row AND $time<$end_time); |
|
| 340 | - spip_log("JQ schedule end time ".time(),'jq'._LOG_DEBUG); |
|
| 341 | - |
|
| 342 | - if ($row = array_shift($res)){ |
|
| 343 | - queue_update_next_job_time(0); // on sait qu'il y a encore des jobs a lancer ASAP |
|
| 344 | - spip_log("JQ encore !",'jq'._LOG_DEBUG); |
|
| 345 | - } |
|
| 346 | - else |
|
| 347 | - queue_update_next_job_time(); |
|
| 348 | - |
|
| 349 | - return true; |
|
| 274 | + $time = time(); |
|
| 275 | + if (defined('_DEBUG_BLOCK_QUEUE')) { |
|
| 276 | + spip_log("_DEBUG_BLOCK_QUEUE : schedule stop",'jq'._LOG_DEBUG); |
|
| 277 | + return; |
|
| 278 | + } |
|
| 279 | + |
|
| 280 | + // rien a faire si le prochain job est encore dans le futur |
|
| 281 | + if (queue_sleep_time_to_next_job()>0 AND (!$force_jobs OR !count($force_jobs))){ |
|
| 282 | + spip_log("queue_sleep_time_to_next_job",'jq'._LOG_DEBUG); |
|
| 283 | + return; |
|
| 284 | + } |
|
| 285 | + |
|
| 286 | + include_spip('base/abstract_sql'); |
|
| 287 | + // on ne peut rien faire si pas de connexion SQL |
|
| 288 | + if (!spip_connect()) return false; |
|
| 289 | + |
|
| 290 | + if (!defined('_JQ_MAX_JOBS_TIME_TO_EXECUTE')){ |
|
| 291 | + $max_time = ini_get('max_execution_time')/2; |
|
| 292 | + // valeur conservatrice si on a pas reussi a lire le max_execution_time |
|
| 293 | + if (!$max_time) $max_time=5; |
|
| 294 | + define('_JQ_MAX_JOBS_TIME_TO_EXECUTE',min($max_time,15)); // une valeur maxi en temps. |
|
| 295 | + } |
|
| 296 | + $end_time = $time + _JQ_MAX_JOBS_TIME_TO_EXECUTE; |
|
| 297 | + |
|
| 298 | + spip_log("JQ schedule $time / $end_time",'jq'._LOG_DEBUG); |
|
| 299 | + |
|
| 300 | + if (!defined('_JQ_MAX_JOBS_EXECUTE')) |
|
| 301 | + define('_JQ_MAX_JOBS_EXECUTE',200); |
|
| 302 | + $nbj=0; |
|
| 303 | + // attraper les jobs |
|
| 304 | + // dont la date est passee (echus en attente), |
|
| 305 | + // par odre : |
|
| 306 | + // - de priorite |
|
| 307 | + // - de date |
|
| 308 | + // lorsqu'un job cron n'a pas fini, sa priorite est descendue |
|
| 309 | + // pour qu'il ne bloque pas les autres jobs en attente |
|
| 310 | + if (is_array($force_jobs) AND count($force_jobs)) |
|
| 311 | + $cond = "status=".intval(_JQ_SCHEDULED)." AND ".sql_in("id_job", $force_jobs); |
|
| 312 | + else { |
|
| 313 | + $now = date('Y-m-d H:i:s',$time); |
|
| 314 | + $cond = "status=".intval(_JQ_SCHEDULED)." AND date<=".sql_quote($now); |
|
| 315 | + } |
|
| 316 | + |
|
| 317 | + register_shutdown_function('queue_error_handler'); // recuperer les erreurs auant que possible |
|
| 318 | + $res = sql_allfetsel('*','spip_jobs',$cond,'','priorite DESC,date','0,'.(_JQ_MAX_JOBS_EXECUTE+1)); |
|
| 319 | + do { |
|
| 320 | + if ($row = array_shift($res)){ |
|
| 321 | + $nbj++; |
|
| 322 | + // il faut un verrou, a base de sql_delete |
|
| 323 | + if (sql_delete('spip_jobs',"id_job=".intval($row['id_job'])." AND status=".intval(_JQ_SCHEDULED))){ |
|
| 324 | + #spip_log("JQ schedule job ".$nbj." OK",'jq'); |
|
| 325 | + // on reinsert dans la base aussitot avec un status=_JQ_PENDING |
|
| 326 | + $row['status'] = _JQ_PENDING; |
|
| 327 | + $row['date'] = date('Y-m-d H:i:s',$time); |
|
| 328 | + sql_insertq('spip_jobs', $row); |
|
| 329 | + |
|
| 330 | + // on a la main sur le job : |
|
| 331 | + // l'executer |
|
| 332 | + $result = queue_start_job($row); |
|
| 333 | + |
|
| 334 | + $time = time(); |
|
| 335 | + queue_close_job($row, $time, $result); |
|
| 336 | + } |
|
| 337 | + } |
|
| 338 | + spip_log("JQ schedule job end time ".$time,'jq'._LOG_DEBUG); |
|
| 339 | + } while ($nbj<_JQ_MAX_JOBS_EXECUTE AND $row AND $time<$end_time); |
|
| 340 | + spip_log("JQ schedule end time ".time(),'jq'._LOG_DEBUG); |
|
| 341 | + |
|
| 342 | + if ($row = array_shift($res)){ |
|
| 343 | + queue_update_next_job_time(0); // on sait qu'il y a encore des jobs a lancer ASAP |
|
| 344 | + spip_log("JQ encore !",'jq'._LOG_DEBUG); |
|
| 345 | + } |
|
| 346 | + else |
|
| 347 | + queue_update_next_job_time(); |
|
| 348 | + |
|
| 349 | + return true; |
|
| 350 | 350 | } |
| 351 | 351 | |
| 352 | 352 | /** |
@@ -360,21 +360,21 @@ discard block |
||
| 360 | 360 | * @param int $result |
| 361 | 361 | */ |
| 362 | 362 | function queue_close_job(&$row,$time,$result=0){ |
| 363 | - // est-ce une tache cron qu'il faut relancer ? |
|
| 364 | - if ($periode = queue_is_cron_job($row['fonction'],$row['inclure'])){ |
|
| 365 | - // relancer avec les nouveaux arguments de temps |
|
| 366 | - include_spip('inc/genie'); |
|
| 367 | - if ($result<0) |
|
| 368 | - // relancer tout de suite, mais en baissant la priorite |
|
| 369 | - queue_genie_replan_job($row['fonction'],$periode,0-$result,null,$row['priorite']-1); |
|
| 370 | - else |
|
| 371 | - // relancer avec la periode prevue |
|
| 372 | - queue_genie_replan_job($row['fonction'],$periode,$time); |
|
| 373 | - } |
|
| 374 | - // purger ses liens eventuels avec des objets |
|
| 375 | - sql_delete("spip_jobs_liens","id_job=".intval($row['id_job'])); |
|
| 376 | - // supprimer le job fini |
|
| 377 | - sql_delete('spip_jobs','id_job='.intval($row['id_job'])); |
|
| 363 | + // est-ce une tache cron qu'il faut relancer ? |
|
| 364 | + if ($periode = queue_is_cron_job($row['fonction'],$row['inclure'])){ |
|
| 365 | + // relancer avec les nouveaux arguments de temps |
|
| 366 | + include_spip('inc/genie'); |
|
| 367 | + if ($result<0) |
|
| 368 | + // relancer tout de suite, mais en baissant la priorite |
|
| 369 | + queue_genie_replan_job($row['fonction'],$periode,0-$result,null,$row['priorite']-1); |
|
| 370 | + else |
|
| 371 | + // relancer avec la periode prevue |
|
| 372 | + queue_genie_replan_job($row['fonction'],$periode,$time); |
|
| 373 | + } |
|
| 374 | + // purger ses liens eventuels avec des objets |
|
| 375 | + sql_delete("spip_jobs_liens","id_job=".intval($row['id_job'])); |
|
| 376 | + // supprimer le job fini |
|
| 377 | + sql_delete('spip_jobs','id_job='.intval($row['id_job'])); |
|
| 378 | 378 | } |
| 379 | 379 | |
| 380 | 380 | /** |
@@ -382,10 +382,10 @@ discard block |
||
| 382 | 382 | * en terminant la gestion de la queue |
| 383 | 383 | */ |
| 384 | 384 | function queue_error_handler(){ |
| 385 | - // se remettre dans le bon dossier, car Apache le change parfois (toujours?) |
|
| 386 | - chdir(_ROOT_CWD); |
|
| 385 | + // se remettre dans le bon dossier, car Apache le change parfois (toujours?) |
|
| 386 | + chdir(_ROOT_CWD); |
|
| 387 | 387 | |
| 388 | - queue_update_next_job_time(); |
|
| 388 | + queue_update_next_job_time(); |
|
| 389 | 389 | } |
| 390 | 390 | |
| 391 | 391 | |
@@ -397,16 +397,16 @@ discard block |
||
| 397 | 397 | * @return <type> |
| 398 | 398 | */ |
| 399 | 399 | function queue_is_cron_job($function,$inclure){ |
| 400 | - static $taches = null; |
|
| 401 | - if (strncmp($inclure,'genie/',6)==0){ |
|
| 402 | - if (is_null($taches)){ |
|
| 403 | - include_spip('inc/genie'); |
|
| 404 | - $taches = taches_generales(); |
|
| 405 | - } |
|
| 406 | - if (isset($taches[$function])) |
|
| 407 | - return $taches[$function]; |
|
| 408 | - } |
|
| 409 | - return false; |
|
| 400 | + static $taches = null; |
|
| 401 | + if (strncmp($inclure,'genie/',6)==0){ |
|
| 402 | + if (is_null($taches)){ |
|
| 403 | + include_spip('inc/genie'); |
|
| 404 | + $taches = taches_generales(); |
|
| 405 | + } |
|
| 406 | + if (isset($taches[$function])) |
|
| 407 | + return $taches[$function]; |
|
| 408 | + } |
|
| 409 | + return false; |
|
| 410 | 410 | } |
| 411 | 411 | |
| 412 | 412 | /** |
@@ -420,48 +420,48 @@ discard block |
||
| 420 | 420 | * temps de la tache ajoutee ou 0 pour ASAP |
| 421 | 421 | */ |
| 422 | 422 | function queue_update_next_job_time($next_time=null){ |
| 423 | - static $nb_jobs_scheduled = null; |
|
| 424 | - static $deja_la = false; |
|
| 425 | - // prendre le min des $next_time que l'on voit passer ici, en cas de reentrance |
|
| 426 | - static $next = null; |
|
| 427 | - // queue_close_job peut etre reentrant ici |
|
| 428 | - if ($deja_la) return; |
|
| 429 | - $deja_la = true; |
|
| 430 | - |
|
| 431 | - include_spip('base/abstract_sql'); |
|
| 432 | - $time = time(); |
|
| 433 | - |
|
| 434 | - // traiter les jobs morts au combat (_JQ_PENDING depuis plus de 180s) |
|
| 435 | - // pour cause de timeout ou autre erreur fatale |
|
| 436 | - $res = sql_allfetsel("*","spip_jobs","status=".intval(_JQ_PENDING)." AND date<".sql_quote(date('Y-m-d H:i:s',$time-180))); |
|
| 437 | - if (is_array($res)) { |
|
| 438 | - foreach ($res as $row) |
|
| 439 | - queue_close_job($row,$time); |
|
| 440 | - } |
|
| 441 | - |
|
| 442 | - // chercher la date du prochain job si pas connu |
|
| 443 | - if (is_null($next) OR is_null(queue_sleep_time_to_next_job())){ |
|
| 444 | - $date = sql_getfetsel('date','spip_jobs',"status=".intval(_JQ_SCHEDULED),'','date','0,1'); |
|
| 445 | - $next = strtotime($date); |
|
| 446 | - } |
|
| 447 | - if (!is_null($next_time)){ |
|
| 448 | - if (is_null($next) OR $next>$next_time) |
|
| 449 | - $next = $next_time; |
|
| 450 | - } |
|
| 451 | - |
|
| 452 | - if ($next){ |
|
| 453 | - if (is_null($nb_jobs_scheduled)) |
|
| 454 | - $nb_jobs_scheduled = sql_countsel('spip_jobs',"status=".intval(_JQ_SCHEDULED)." AND date<".sql_quote(date('Y-m-d H:i:s',$time))); |
|
| 455 | - elseif ($next<=$time) |
|
| 456 | - $nb_jobs_scheduled++; |
|
| 457 | - // si trop de jobs en attente, on force la purge en fin de hit |
|
| 458 | - // pour assurer le coup |
|
| 459 | - if ($nb_jobs_scheduled>defined('_JQ_NB_JOBS_OVERFLOW')?_JQ_NB_JOBS_OVERFLOW:10000) |
|
| 460 | - define('_DIRECT_CRON_FORCE',true); |
|
| 461 | - } |
|
| 462 | - |
|
| 463 | - queue_set_next_job_time($next); |
|
| 464 | - $deja_la = false; |
|
| 423 | + static $nb_jobs_scheduled = null; |
|
| 424 | + static $deja_la = false; |
|
| 425 | + // prendre le min des $next_time que l'on voit passer ici, en cas de reentrance |
|
| 426 | + static $next = null; |
|
| 427 | + // queue_close_job peut etre reentrant ici |
|
| 428 | + if ($deja_la) return; |
|
| 429 | + $deja_la = true; |
|
| 430 | + |
|
| 431 | + include_spip('base/abstract_sql'); |
|
| 432 | + $time = time(); |
|
| 433 | + |
|
| 434 | + // traiter les jobs morts au combat (_JQ_PENDING depuis plus de 180s) |
|
| 435 | + // pour cause de timeout ou autre erreur fatale |
|
| 436 | + $res = sql_allfetsel("*","spip_jobs","status=".intval(_JQ_PENDING)." AND date<".sql_quote(date('Y-m-d H:i:s',$time-180))); |
|
| 437 | + if (is_array($res)) { |
|
| 438 | + foreach ($res as $row) |
|
| 439 | + queue_close_job($row,$time); |
|
| 440 | + } |
|
| 441 | + |
|
| 442 | + // chercher la date du prochain job si pas connu |
|
| 443 | + if (is_null($next) OR is_null(queue_sleep_time_to_next_job())){ |
|
| 444 | + $date = sql_getfetsel('date','spip_jobs',"status=".intval(_JQ_SCHEDULED),'','date','0,1'); |
|
| 445 | + $next = strtotime($date); |
|
| 446 | + } |
|
| 447 | + if (!is_null($next_time)){ |
|
| 448 | + if (is_null($next) OR $next>$next_time) |
|
| 449 | + $next = $next_time; |
|
| 450 | + } |
|
| 451 | + |
|
| 452 | + if ($next){ |
|
| 453 | + if (is_null($nb_jobs_scheduled)) |
|
| 454 | + $nb_jobs_scheduled = sql_countsel('spip_jobs',"status=".intval(_JQ_SCHEDULED)." AND date<".sql_quote(date('Y-m-d H:i:s',$time))); |
|
| 455 | + elseif ($next<=$time) |
|
| 456 | + $nb_jobs_scheduled++; |
|
| 457 | + // si trop de jobs en attente, on force la purge en fin de hit |
|
| 458 | + // pour assurer le coup |
|
| 459 | + if ($nb_jobs_scheduled>defined('_JQ_NB_JOBS_OVERFLOW')?_JQ_NB_JOBS_OVERFLOW:10000) |
|
| 460 | + define('_DIRECT_CRON_FORCE',true); |
|
| 461 | + } |
|
| 462 | + |
|
| 463 | + queue_set_next_job_time($next); |
|
| 464 | + $deja_la = false; |
|
| 465 | 465 | } |
| 466 | 466 | |
| 467 | 467 | |
@@ -471,27 +471,27 @@ discard block |
||
| 471 | 471 | */ |
| 472 | 472 | function queue_set_next_job_time($next) { |
| 473 | 473 | |
| 474 | - // utiliser le temps courant reel plutot que temps de la requete ici |
|
| 475 | - $time = time(); |
|
| 476 | - |
|
| 477 | - // toujours relire la valeur pour comparer, pour tenir compte des maj concourrantes |
|
| 478 | - // et ne mettre a jour que si il y a un interet a le faire |
|
| 479 | - // permet ausis d'initialiser le nom de fichier a coup sur |
|
| 480 | - $curr_next = $_SERVER['REQUEST_TIME'] + max(0,queue_sleep_time_to_next_job(true)); |
|
| 481 | - if ( |
|
| 482 | - ($curr_next<=$time AND $next>$time) // le prochain job est dans le futur mais pas la date planifiee actuelle |
|
| 483 | - OR $curr_next>$next // le prochain job est plus tot que la date planifiee actuelle |
|
| 484 | - ) { |
|
| 485 | - if (include_spip('inc/memoization') AND defined('_MEMOIZE_MEMORY') AND _MEMOIZE_MEMORY) { |
|
| 486 | - cache_set(_JQ_NEXT_JOB_TIME_FILENAME,intval($next)); |
|
| 487 | - } |
|
| 488 | - else { |
|
| 489 | - ecrire_fichier(_JQ_NEXT_JOB_TIME_FILENAME,intval($next)); |
|
| 490 | - } |
|
| 491 | - queue_sleep_time_to_next_job($next); |
|
| 492 | - } |
|
| 493 | - |
|
| 494 | - return queue_sleep_time_to_next_job(); |
|
| 474 | + // utiliser le temps courant reel plutot que temps de la requete ici |
|
| 475 | + $time = time(); |
|
| 476 | + |
|
| 477 | + // toujours relire la valeur pour comparer, pour tenir compte des maj concourrantes |
|
| 478 | + // et ne mettre a jour que si il y a un interet a le faire |
|
| 479 | + // permet ausis d'initialiser le nom de fichier a coup sur |
|
| 480 | + $curr_next = $_SERVER['REQUEST_TIME'] + max(0,queue_sleep_time_to_next_job(true)); |
|
| 481 | + if ( |
|
| 482 | + ($curr_next<=$time AND $next>$time) // le prochain job est dans le futur mais pas la date planifiee actuelle |
|
| 483 | + OR $curr_next>$next // le prochain job est plus tot que la date planifiee actuelle |
|
| 484 | + ) { |
|
| 485 | + if (include_spip('inc/memoization') AND defined('_MEMOIZE_MEMORY') AND _MEMOIZE_MEMORY) { |
|
| 486 | + cache_set(_JQ_NEXT_JOB_TIME_FILENAME,intval($next)); |
|
| 487 | + } |
|
| 488 | + else { |
|
| 489 | + ecrire_fichier(_JQ_NEXT_JOB_TIME_FILENAME,intval($next)); |
|
| 490 | + } |
|
| 491 | + queue_sleep_time_to_next_job($next); |
|
| 492 | + } |
|
| 493 | + |
|
| 494 | + return queue_sleep_time_to_next_job(); |
|
| 495 | 495 | } |
| 496 | 496 | |
| 497 | 497 | /** |
@@ -503,110 +503,110 @@ discard block |
||
| 503 | 503 | * @return string |
| 504 | 504 | */ |
| 505 | 505 | function queue_affichage_cron(){ |
| 506 | - $texte = ""; |
|
| 507 | - |
|
| 508 | - $time_to_next = queue_sleep_time_to_next_job(); |
|
| 509 | - // rien a faire si le prochain job est encore dans le futur |
|
| 510 | - if ($time_to_next>0 OR defined('_DEBUG_BLOCK_QUEUE')) |
|
| 511 | - return $texte; |
|
| 512 | - |
|
| 513 | - // ne pas relancer si on vient de lancer dans la meme seconde par un hit concurent |
|
| 514 | - if (file_exists($lock=_DIR_TMP."cron.lock") AND !(@filemtime($lock)<$_SERVER['REQUEST_TIME'])) |
|
| 515 | - return $texte; |
|
| 516 | - @touch($lock); |
|
| 517 | - |
|
| 518 | - // il y a des taches en attentes |
|
| 519 | - // si depuis plus de 5min, on essaye de lancer le cron par tous les moyens pour rattraper le coup |
|
| 520 | - // on est sans doute sur un site qui n'autorise pas http sortant ou avec peu de trafic |
|
| 521 | - $urgent = false; |
|
| 522 | - if ($time_to_next<-300) |
|
| 523 | - $urgent = true; |
|
| 524 | - |
|
| 525 | - $url_cron = generer_url_action('cron','',false,true); |
|
| 526 | - |
|
| 527 | - if (!defined('_HTML_BG_CRON_FORCE') OR !_HTML_BG_CRON_FORCE){ |
|
| 528 | - |
|
| 529 | - // methode la plus rapide : |
|
| 530 | - // Si fsockopen est possible, on lance le cron via un socket en asynchrone |
|
| 531 | - // si fsockopen echoue (disponibilite serveur, firewall) on essaye pas cURL |
|
| 532 | - // car on a toutes les chances d'echouer pareil mais sans moyen de le savoir |
|
| 533 | - // on passe direct a la methode background-image |
|
| 534 | - if(function_exists('fsockopen')){ |
|
| 535 | - $parts=parse_url($url_cron); |
|
| 536 | - |
|
| 537 | - switch ($parts['scheme']) { |
|
| 538 | - case 'https': |
|
| 539 | - $scheme = 'ssl://'; |
|
| 540 | - $port = 443; |
|
| 541 | - break; |
|
| 542 | - case 'http': |
|
| 543 | - default: |
|
| 544 | - $scheme = ''; |
|
| 545 | - $port = 80; |
|
| 546 | - } |
|
| 547 | - |
|
| 548 | - $fp = @fsockopen($scheme.$parts['host'], |
|
| 549 | - isset($parts['port'])?$parts['port']:$port, |
|
| 550 | - $errno, $errstr, 1); |
|
| 551 | - |
|
| 552 | - if ($fp) { |
|
| 553 | - $timeout = 200; // ms |
|
| 554 | - stream_set_timeout($fp,0,$timeout * 1000); |
|
| 555 | - $query = $parts['path'].($parts['query']?"?".$parts['query']:""); |
|
| 556 | - $out = "GET ".$query." HTTP/1.1\r\n"; |
|
| 557 | - $out.= "Host: ".$parts['host']."\r\n"; |
|
| 558 | - $out.= "Connection: Close\r\n\r\n"; |
|
| 559 | - fwrite($fp, $out); |
|
| 560 | - spip_timer('read'); |
|
| 561 | - $t = 0; |
|
| 562 | - // on lit la reponse si possible pour fermer proprement la connexion |
|
| 563 | - // avec un timeout total de 200ms pour ne pas se bloquer |
|
| 564 | - while (!feof($fp) AND $t<$timeout) { |
|
| 565 | - @fgets($fp, 1024); |
|
| 566 | - $t += spip_timer('read',true); |
|
| 567 | - spip_timer('read'); |
|
| 568 | - } |
|
| 569 | - fclose($fp); |
|
| 570 | - if (!$urgent) |
|
| 571 | - return $texte; |
|
| 572 | - } |
|
| 573 | - } |
|
| 574 | - // si fsockopen n'est pas dispo on essaye cURL : |
|
| 575 | - // lancer le cron par un cURL asynchrone si cURL est present |
|
| 576 | - elseif (function_exists("curl_init")){ |
|
| 577 | - //setting the curl parameters. |
|
| 578 | - $ch = curl_init($url_cron); |
|
| 579 | - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
|
| 580 | - // cf bug : http://www.php.net/manual/en/function.curl-setopt.php#104597 |
|
| 581 | - curl_setopt($ch, CURLOPT_NOSIGNAL, 1); |
|
| 582 | - // valeur mini pour que la requete soit lancee |
|
| 583 | - curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); |
|
| 584 | - // lancer |
|
| 585 | - curl_exec($ch); |
|
| 586 | - // fermer |
|
| 587 | - curl_close($ch); |
|
| 588 | - if (!$urgent) |
|
| 589 | - return $texte; |
|
| 590 | - } |
|
| 591 | - } |
|
| 592 | - |
|
| 593 | - // si deja force, on retourne sans rien |
|
| 594 | - if (defined('_DIRECT_CRON_FORCE')) |
|
| 595 | - return $texte; |
|
| 596 | - |
|
| 597 | - // si c'est un bot |
|
| 598 | - // inutile de faire un appel par image background, |
|
| 599 | - // on force un appel direct en fin de hit |
|
| 600 | - if ((defined('_IS_BOT') AND _IS_BOT)){ |
|
| 601 | - define('_DIRECT_CRON_FORCE',true); |
|
| 602 | - return $texte; |
|
| 603 | - } |
|
| 604 | - |
|
| 605 | - // en derniere solution, on insere une image background dans la page |
|
| 606 | - $texte = '<!-- SPIP-CRON --><div style="background-image: url(\'' . |
|
| 607 | - generer_url_action('cron') . |
|
| 608 | - '\');"></div>'; |
|
| 609 | - |
|
| 610 | - return $texte; |
|
| 506 | + $texte = ""; |
|
| 507 | + |
|
| 508 | + $time_to_next = queue_sleep_time_to_next_job(); |
|
| 509 | + // rien a faire si le prochain job est encore dans le futur |
|
| 510 | + if ($time_to_next>0 OR defined('_DEBUG_BLOCK_QUEUE')) |
|
| 511 | + return $texte; |
|
| 512 | + |
|
| 513 | + // ne pas relancer si on vient de lancer dans la meme seconde par un hit concurent |
|
| 514 | + if (file_exists($lock=_DIR_TMP."cron.lock") AND !(@filemtime($lock)<$_SERVER['REQUEST_TIME'])) |
|
| 515 | + return $texte; |
|
| 516 | + @touch($lock); |
|
| 517 | + |
|
| 518 | + // il y a des taches en attentes |
|
| 519 | + // si depuis plus de 5min, on essaye de lancer le cron par tous les moyens pour rattraper le coup |
|
| 520 | + // on est sans doute sur un site qui n'autorise pas http sortant ou avec peu de trafic |
|
| 521 | + $urgent = false; |
|
| 522 | + if ($time_to_next<-300) |
|
| 523 | + $urgent = true; |
|
| 524 | + |
|
| 525 | + $url_cron = generer_url_action('cron','',false,true); |
|
| 526 | + |
|
| 527 | + if (!defined('_HTML_BG_CRON_FORCE') OR !_HTML_BG_CRON_FORCE){ |
|
| 528 | + |
|
| 529 | + // methode la plus rapide : |
|
| 530 | + // Si fsockopen est possible, on lance le cron via un socket en asynchrone |
|
| 531 | + // si fsockopen echoue (disponibilite serveur, firewall) on essaye pas cURL |
|
| 532 | + // car on a toutes les chances d'echouer pareil mais sans moyen de le savoir |
|
| 533 | + // on passe direct a la methode background-image |
|
| 534 | + if(function_exists('fsockopen')){ |
|
| 535 | + $parts=parse_url($url_cron); |
|
| 536 | + |
|
| 537 | + switch ($parts['scheme']) { |
|
| 538 | + case 'https': |
|
| 539 | + $scheme = 'ssl://'; |
|
| 540 | + $port = 443; |
|
| 541 | + break; |
|
| 542 | + case 'http': |
|
| 543 | + default: |
|
| 544 | + $scheme = ''; |
|
| 545 | + $port = 80; |
|
| 546 | + } |
|
| 547 | + |
|
| 548 | + $fp = @fsockopen($scheme.$parts['host'], |
|
| 549 | + isset($parts['port'])?$parts['port']:$port, |
|
| 550 | + $errno, $errstr, 1); |
|
| 551 | + |
|
| 552 | + if ($fp) { |
|
| 553 | + $timeout = 200; // ms |
|
| 554 | + stream_set_timeout($fp,0,$timeout * 1000); |
|
| 555 | + $query = $parts['path'].($parts['query']?"?".$parts['query']:""); |
|
| 556 | + $out = "GET ".$query." HTTP/1.1\r\n"; |
|
| 557 | + $out.= "Host: ".$parts['host']."\r\n"; |
|
| 558 | + $out.= "Connection: Close\r\n\r\n"; |
|
| 559 | + fwrite($fp, $out); |
|
| 560 | + spip_timer('read'); |
|
| 561 | + $t = 0; |
|
| 562 | + // on lit la reponse si possible pour fermer proprement la connexion |
|
| 563 | + // avec un timeout total de 200ms pour ne pas se bloquer |
|
| 564 | + while (!feof($fp) AND $t<$timeout) { |
|
| 565 | + @fgets($fp, 1024); |
|
| 566 | + $t += spip_timer('read',true); |
|
| 567 | + spip_timer('read'); |
|
| 568 | + } |
|
| 569 | + fclose($fp); |
|
| 570 | + if (!$urgent) |
|
| 571 | + return $texte; |
|
| 572 | + } |
|
| 573 | + } |
|
| 574 | + // si fsockopen n'est pas dispo on essaye cURL : |
|
| 575 | + // lancer le cron par un cURL asynchrone si cURL est present |
|
| 576 | + elseif (function_exists("curl_init")){ |
|
| 577 | + //setting the curl parameters. |
|
| 578 | + $ch = curl_init($url_cron); |
|
| 579 | + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
|
| 580 | + // cf bug : http://www.php.net/manual/en/function.curl-setopt.php#104597 |
|
| 581 | + curl_setopt($ch, CURLOPT_NOSIGNAL, 1); |
|
| 582 | + // valeur mini pour que la requete soit lancee |
|
| 583 | + curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); |
|
| 584 | + // lancer |
|
| 585 | + curl_exec($ch); |
|
| 586 | + // fermer |
|
| 587 | + curl_close($ch); |
|
| 588 | + if (!$urgent) |
|
| 589 | + return $texte; |
|
| 590 | + } |
|
| 591 | + } |
|
| 592 | + |
|
| 593 | + // si deja force, on retourne sans rien |
|
| 594 | + if (defined('_DIRECT_CRON_FORCE')) |
|
| 595 | + return $texte; |
|
| 596 | + |
|
| 597 | + // si c'est un bot |
|
| 598 | + // inutile de faire un appel par image background, |
|
| 599 | + // on force un appel direct en fin de hit |
|
| 600 | + if ((defined('_IS_BOT') AND _IS_BOT)){ |
|
| 601 | + define('_DIRECT_CRON_FORCE',true); |
|
| 602 | + return $texte; |
|
| 603 | + } |
|
| 604 | + |
|
| 605 | + // en derniere solution, on insere une image background dans la page |
|
| 606 | + $texte = '<!-- SPIP-CRON --><div style="background-image: url(\'' . |
|
| 607 | + generer_url_action('cron') . |
|
| 608 | + '\');"></div>'; |
|
| 609 | + |
|
| 610 | + return $texte; |
|
| 611 | 611 | } |
| 612 | 612 | ?> |
@@ -26,28 +26,28 @@ |
||
| 26 | 26 | * @return string |
| 27 | 27 | */ |
| 28 | 28 | function inc_lister_objets_dist($vue, $contexte=array(), $force=false){ |
| 29 | - $res = ""; // debug |
|
| 30 | - if (!is_array($contexte)) |
|
| 31 | - return _L('$contexte doit etre un tableau dans inc/lister_objets'); |
|
| 32 | - |
|
| 33 | - $fond = "prive/objets/liste/$vue"; |
|
| 34 | - if (!find_in_path($fond."."._EXTENSION_SQUELETTES)) { |
|
| 35 | - // traiter les cas particuliers |
|
| 36 | - include_spip('base/connect_sql'); |
|
| 37 | - $vue = table_objet($vue); |
|
| 38 | - $fond = "prive/objets/liste/$vue"; |
|
| 39 | - if (!find_in_path($fond."."._EXTENSION_SQUELETTES)) |
|
| 40 | - return _L("vue $vue introuvable pour lister les objets"); |
|
| 41 | - } |
|
| 29 | + $res = ""; // debug |
|
| 30 | + if (!is_array($contexte)) |
|
| 31 | + return _L('$contexte doit etre un tableau dans inc/lister_objets'); |
|
| 32 | + |
|
| 33 | + $fond = "prive/objets/liste/$vue"; |
|
| 34 | + if (!find_in_path($fond."."._EXTENSION_SQUELETTES)) { |
|
| 35 | + // traiter les cas particuliers |
|
| 36 | + include_spip('base/connect_sql'); |
|
| 37 | + $vue = table_objet($vue); |
|
| 38 | + $fond = "prive/objets/liste/$vue"; |
|
| 39 | + if (!find_in_path($fond."."._EXTENSION_SQUELETTES)) |
|
| 40 | + return _L("vue $vue introuvable pour lister les objets"); |
|
| 41 | + } |
|
| 42 | 42 | |
| 43 | 43 | |
| 44 | - $contexte['sinon']=($force ? $contexte['titre']:''); |
|
| 44 | + $contexte['sinon']=($force ? $contexte['titre']:''); |
|
| 45 | 45 | |
| 46 | - $res = recuperer_fond($fond,$contexte,array('ajax'=>true)); |
|
| 47 | - if (_request('var_liste')) |
|
| 48 | - echo var_export($contexte, true); |
|
| 46 | + $res = recuperer_fond($fond,$contexte,array('ajax'=>true)); |
|
| 47 | + if (_request('var_liste')) |
|
| 48 | + echo var_export($contexte, true); |
|
| 49 | 49 | |
| 50 | - return $res; |
|
| 50 | + return $res; |
|
| 51 | 51 | } |
| 52 | 52 | |
| 53 | 53 | ?> |
@@ -14,76 +14,76 @@ |
||
| 14 | 14 | |
| 15 | 15 | function analyse_csv($t) |
| 16 | 16 | { |
| 17 | - $virg = substr_count($t, ','); |
|
| 18 | - $pvirg = substr_count($t, ';'); |
|
| 19 | - $tab = substr_count($t, "\t"); |
|
| 20 | - if ($virg > $pvirg) |
|
| 21 | - { $sep = ','; $hs = ',';} |
|
| 22 | - else { $sep = ';'; $hs = ';'; $virg = $pvirg;} |
|
| 23 | - if ($tab > $virg) {$sep = "\t"; $hs = "\t";} |
|
| 17 | + $virg = substr_count($t, ','); |
|
| 18 | + $pvirg = substr_count($t, ';'); |
|
| 19 | + $tab = substr_count($t, "\t"); |
|
| 20 | + if ($virg > $pvirg) |
|
| 21 | + { $sep = ','; $hs = ',';} |
|
| 22 | + else { $sep = ';'; $hs = ';'; $virg = $pvirg;} |
|
| 23 | + if ($tab > $virg) {$sep = "\t"; $hs = "\t";} |
|
| 24 | 24 | |
| 25 | - $t = preg_replace('/\r?\n/', "\n", |
|
| 26 | - preg_replace('/[\r\n]+/', "\n", $t)); |
|
| 27 | - // un separateur suivi de 3 guillemets attention ! |
|
| 28 | - // attention au ; suceptible d'etre confondu avec un separateur |
|
| 29 | - // on substitue un # et on remplacera a la fin |
|
| 30 | - $t = preg_replace("/([\n$sep])\"\"\"/",'\\1""#',$t); |
|
| 31 | - $t = str_replace('""','"#',$t); |
|
| 32 | - preg_match_all('/"[^"]*"/', $t, $r); |
|
| 33 | - foreach($r[0] as $cell) |
|
| 34 | - $t = str_replace($cell, |
|
| 35 | - str_replace($sep, $hs, |
|
| 36 | - str_replace("\n", "<br />", |
|
| 37 | - substr($cell,1,-1))), |
|
| 38 | - $t); |
|
| 39 | - list($entete, $corps) = explode("\n",$t,2); |
|
| 40 | - $caption = ''; |
|
| 41 | - // sauter la ligne de tete formee seulement de separateurs |
|
| 42 | - if (substr_count($entete, $sep) == strlen($entete)) { |
|
| 43 | - list($entete, $corps) = explode("\n",$corps,2); |
|
| 44 | - } |
|
| 45 | - // si une seule colonne, en faire le titre |
|
| 46 | - if (preg_match("/^([^$sep]+)$sep+\$/", $entete, $l)) { |
|
| 47 | - $caption = "\n||" . $l[1] . "|"; |
|
| 48 | - list($entete, $corps) = explode("\n",$corps,2); |
|
| 49 | - } |
|
| 50 | - // si premiere colonne vide, le raccourci doit quand meme produire <th... |
|
| 51 | - if ($entete[0] == $sep) $entete = ' ' . $entete; |
|
| 25 | + $t = preg_replace('/\r?\n/', "\n", |
|
| 26 | + preg_replace('/[\r\n]+/', "\n", $t)); |
|
| 27 | + // un separateur suivi de 3 guillemets attention ! |
|
| 28 | + // attention au ; suceptible d'etre confondu avec un separateur |
|
| 29 | + // on substitue un # et on remplacera a la fin |
|
| 30 | + $t = preg_replace("/([\n$sep])\"\"\"/",'\\1""#',$t); |
|
| 31 | + $t = str_replace('""','"#',$t); |
|
| 32 | + preg_match_all('/"[^"]*"/', $t, $r); |
|
| 33 | + foreach($r[0] as $cell) |
|
| 34 | + $t = str_replace($cell, |
|
| 35 | + str_replace($sep, $hs, |
|
| 36 | + str_replace("\n", "<br />", |
|
| 37 | + substr($cell,1,-1))), |
|
| 38 | + $t); |
|
| 39 | + list($entete, $corps) = explode("\n",$t,2); |
|
| 40 | + $caption = ''; |
|
| 41 | + // sauter la ligne de tete formee seulement de separateurs |
|
| 42 | + if (substr_count($entete, $sep) == strlen($entete)) { |
|
| 43 | + list($entete, $corps) = explode("\n",$corps,2); |
|
| 44 | + } |
|
| 45 | + // si une seule colonne, en faire le titre |
|
| 46 | + if (preg_match("/^([^$sep]+)$sep+\$/", $entete, $l)) { |
|
| 47 | + $caption = "\n||" . $l[1] . "|"; |
|
| 48 | + list($entete, $corps) = explode("\n",$corps,2); |
|
| 49 | + } |
|
| 50 | + // si premiere colonne vide, le raccourci doit quand meme produire <th... |
|
| 51 | + if ($entete[0] == $sep) $entete = ' ' . $entete; |
|
| 52 | 52 | |
| 53 | - $lignes = explode("\n", $corps); |
|
| 53 | + $lignes = explode("\n", $corps); |
|
| 54 | 54 | |
| 55 | - // retrait des lignes vides finales |
|
| 56 | - while(count($lignes) > 0 |
|
| 57 | - AND preg_match("/^$sep*$/", $lignes[count($lignes)-1])) |
|
| 58 | - unset($lignes[count($lignes)-1]); |
|
| 59 | - // calcul du nombre de colonne a chaque ligne |
|
| 60 | - $nbcols = array(); |
|
| 61 | - $max = $mil = substr_count($entete, $sep); |
|
| 62 | - foreach($lignes as $k=>$v) { |
|
| 63 | - if ($max <> ($nbcols[$k]= substr_count($v, $sep))) { |
|
| 64 | - if ($max > $nbcols[$k]) |
|
| 65 | - $mil = $nbcols[$k]; |
|
| 66 | - else { $mil = $max; $max = $nbcols[$k];} |
|
| 67 | - } |
|
| 68 | - } |
|
| 69 | - // Si pas le meme nombre, cadrer au nombre max |
|
| 70 | - if ($mil <> $max) |
|
| 71 | - foreach($nbcols as $k=>$v) { |
|
| 72 | - if ($v < $max) $lignes[$k].= str_repeat($sep, $max-$v); |
|
| 73 | - } |
|
| 74 | - // et retirer les colonnes integralement vides |
|
| 75 | - while(true) { |
|
| 76 | - $nbcols = ($entete[strlen($entete)-1]===$sep); |
|
| 77 | - foreach($lignes as $v) $nbcols &= ($v[strlen($v)-1]===$sep); |
|
| 78 | - if (!$nbcols) break; |
|
| 79 | - $entete = substr($entete,0,-1); |
|
| 80 | - foreach($lignes as $k=>$v) $lignes[$k] = substr($v,0,-1); |
|
| 81 | - } |
|
| 55 | + // retrait des lignes vides finales |
|
| 56 | + while(count($lignes) > 0 |
|
| 57 | + AND preg_match("/^$sep*$/", $lignes[count($lignes)-1])) |
|
| 58 | + unset($lignes[count($lignes)-1]); |
|
| 59 | + // calcul du nombre de colonne a chaque ligne |
|
| 60 | + $nbcols = array(); |
|
| 61 | + $max = $mil = substr_count($entete, $sep); |
|
| 62 | + foreach($lignes as $k=>$v) { |
|
| 63 | + if ($max <> ($nbcols[$k]= substr_count($v, $sep))) { |
|
| 64 | + if ($max > $nbcols[$k]) |
|
| 65 | + $mil = $nbcols[$k]; |
|
| 66 | + else { $mil = $max; $max = $nbcols[$k];} |
|
| 67 | + } |
|
| 68 | + } |
|
| 69 | + // Si pas le meme nombre, cadrer au nombre max |
|
| 70 | + if ($mil <> $max) |
|
| 71 | + foreach($nbcols as $k=>$v) { |
|
| 72 | + if ($v < $max) $lignes[$k].= str_repeat($sep, $max-$v); |
|
| 73 | + } |
|
| 74 | + // et retirer les colonnes integralement vides |
|
| 75 | + while(true) { |
|
| 76 | + $nbcols = ($entete[strlen($entete)-1]===$sep); |
|
| 77 | + foreach($lignes as $v) $nbcols &= ($v[strlen($v)-1]===$sep); |
|
| 78 | + if (!$nbcols) break; |
|
| 79 | + $entete = substr($entete,0,-1); |
|
| 80 | + foreach($lignes as $k=>$v) $lignes[$k] = substr($v,0,-1); |
|
| 81 | + } |
|
| 82 | 82 | |
| 83 | - foreach($lignes as &$l) { |
|
| 84 | - $l = explode($sep, $l); |
|
| 85 | - } |
|
| 86 | - return array(explode($sep, $entete), $lignes); |
|
| 83 | + foreach($lignes as &$l) { |
|
| 84 | + $l = explode($sep, $l); |
|
| 85 | + } |
|
| 86 | + return array(explode($sep, $entete), $lignes); |
|
| 87 | 87 | } |
| 88 | 88 | |
| 89 | 89 | |
@@ -20,14 +20,14 @@ |
||
| 20 | 20 | * http://zoumzamzouilam/truc/chose/machin..." |
| 21 | 21 | */ |
| 22 | 22 | function inc_lien_court($url) { |
| 23 | - $long_url = defined('_MAX_LONG_URL') ? _MAX_LONG_URL : 40; |
|
| 24 | - $coupe_url = defined('_MAX_COUPE_URL') ? _MAX_COUPE_URL : 35; |
|
| 23 | + $long_url = defined('_MAX_LONG_URL') ? _MAX_LONG_URL : 40; |
|
| 24 | + $coupe_url = defined('_MAX_COUPE_URL') ? _MAX_COUPE_URL : 35; |
|
| 25 | 25 | |
| 26 | - if (strlen($url)>$long_url) { |
|
| 27 | - $url = substr($url,0,$coupe_url).'...'; |
|
| 28 | - } |
|
| 26 | + if (strlen($url)>$long_url) { |
|
| 27 | + $url = substr($url,0,$coupe_url).'...'; |
|
| 28 | + } |
|
| 29 | 29 | |
| 30 | - return $url; |
|
| 30 | + return $url; |
|
| 31 | 31 | } |
| 32 | 32 | |
| 33 | 33 | ?> |
| 34 | 34 | \ No newline at end of file |