@@ -16,7 +16,7 @@ discard block |
||
| 16 | 16 | * @package SPIP\Core\Langue |
| 17 | 17 | **/ |
| 18 | 18 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 19 | - return; |
|
| 19 | + return; |
|
| 20 | 20 | } |
| 21 | 21 | |
| 22 | 22 | include_spip('inc/cookie'); |
@@ -30,21 +30,21 @@ discard block |
||
| 30 | 30 | * @return void |
| 31 | 31 | */ |
| 32 | 32 | function action_converser_dist() { |
| 33 | - $update_session = false; |
|
| 34 | - if (_request('arg') and spip_connect()) { |
|
| 35 | - $securiser_action = charger_fonction('securiser_action', 'inc'); |
|
| 36 | - $securiser_action(); |
|
| 37 | - $update_session = true; |
|
| 38 | - } |
|
| 33 | + $update_session = false; |
|
| 34 | + if (_request('arg') and spip_connect()) { |
|
| 35 | + $securiser_action = charger_fonction('securiser_action', 'inc'); |
|
| 36 | + $securiser_action(); |
|
| 37 | + $update_session = true; |
|
| 38 | + } |
|
| 39 | 39 | |
| 40 | - $lang = action_converser_changer_langue($update_session); |
|
| 41 | - $redirect = rawurldecode(_request('redirect')); |
|
| 40 | + $lang = action_converser_changer_langue($update_session); |
|
| 41 | + $redirect = rawurldecode(_request('redirect')); |
|
| 42 | 42 | |
| 43 | - if (!$redirect) { |
|
| 44 | - $redirect = _DIR_RESTREINT_ABS; |
|
| 45 | - } |
|
| 46 | - $redirect = parametre_url($redirect, 'lang', $lang, '&'); |
|
| 47 | - redirige_par_entete($redirect, true); |
|
| 43 | + if (!$redirect) { |
|
| 44 | + $redirect = _DIR_RESTREINT_ABS; |
|
| 45 | + } |
|
| 46 | + $redirect = parametre_url($redirect, 'lang', $lang, '&'); |
|
| 47 | + redirige_par_entete($redirect, true); |
|
| 48 | 48 | } |
| 49 | 49 | |
| 50 | 50 | /** |
@@ -56,23 +56,23 @@ discard block |
||
| 56 | 56 | * @return string |
| 57 | 57 | */ |
| 58 | 58 | function action_converser_changer_langue($update_session) { |
| 59 | - if ($lang = _request('var_lang')) { |
|
| 60 | - action_converser_post($lang); |
|
| 61 | - } elseif ($lang = _request('var_lang_ecrire')) { |
|
| 62 | - if ($update_session) { |
|
| 63 | - sql_updateq('spip_auteurs', ['lang' => $lang], 'id_auteur = ' . $GLOBALS['visiteur_session']['id_auteur']); |
|
| 64 | - $GLOBALS['visiteur_session']['lang'] = $lang; |
|
| 65 | - $session = charger_fonction('session', 'inc'); |
|
| 66 | - if ($spip_session = $session($GLOBALS['visiteur_session'])) { |
|
| 67 | - spip_setcookie('spip_session', $spip_session, [ |
|
| 68 | - 'expires' => time() + 3600 * 24 * 14 |
|
| 69 | - ]); |
|
| 70 | - } |
|
| 71 | - } |
|
| 72 | - action_converser_post($lang, true); |
|
| 73 | - } |
|
| 59 | + if ($lang = _request('var_lang')) { |
|
| 60 | + action_converser_post($lang); |
|
| 61 | + } elseif ($lang = _request('var_lang_ecrire')) { |
|
| 62 | + if ($update_session) { |
|
| 63 | + sql_updateq('spip_auteurs', ['lang' => $lang], 'id_auteur = ' . $GLOBALS['visiteur_session']['id_auteur']); |
|
| 64 | + $GLOBALS['visiteur_session']['lang'] = $lang; |
|
| 65 | + $session = charger_fonction('session', 'inc'); |
|
| 66 | + if ($spip_session = $session($GLOBALS['visiteur_session'])) { |
|
| 67 | + spip_setcookie('spip_session', $spip_session, [ |
|
| 68 | + 'expires' => time() + 3600 * 24 * 14 |
|
| 69 | + ]); |
|
| 70 | + } |
|
| 71 | + } |
|
| 72 | + action_converser_post($lang, true); |
|
| 73 | + } |
|
| 74 | 74 | |
| 75 | - return $lang; |
|
| 75 | + return $lang; |
|
| 76 | 76 | } |
| 77 | 77 | |
| 78 | 78 | /** |
@@ -83,17 +83,17 @@ discard block |
||
| 83 | 83 | * @return void |
| 84 | 84 | */ |
| 85 | 85 | function action_converser_post($lang, $ecrire = false) { |
| 86 | - if ($lang) { |
|
| 87 | - include_spip('inc/lang'); |
|
| 88 | - if (changer_langue($lang)) { |
|
| 89 | - spip_setcookie('spip_lang', $_COOKIE['spip_lang'] = $lang, [ |
|
| 90 | - 'expires' => time() + 365 * 24 * 3600 |
|
| 91 | - ]); |
|
| 92 | - if ($ecrire) { |
|
| 93 | - spip_setcookie('spip_lang_ecrire', $_COOKIE['spip_lang_ecrire'] = $lang, [ |
|
| 94 | - 'expires' => time() + 365 * 24 * 3600 |
|
| 95 | - ]); |
|
| 96 | - } |
|
| 97 | - } |
|
| 98 | - } |
|
| 86 | + if ($lang) { |
|
| 87 | + include_spip('inc/lang'); |
|
| 88 | + if (changer_langue($lang)) { |
|
| 89 | + spip_setcookie('spip_lang', $_COOKIE['spip_lang'] = $lang, [ |
|
| 90 | + 'expires' => time() + 365 * 24 * 3600 |
|
| 91 | + ]); |
|
| 92 | + if ($ecrire) { |
|
| 93 | + spip_setcookie('spip_lang_ecrire', $_COOKIE['spip_lang_ecrire'] = $lang, [ |
|
| 94 | + 'expires' => time() + 365 * 24 * 3600 |
|
| 95 | + ]); |
|
| 96 | + } |
|
| 97 | + } |
|
| 98 | + } |
|
| 99 | 99 | } |
@@ -17,7 +17,7 @@ discard block |
||
| 17 | 17 | */ |
| 18 | 18 | |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | include_spip('inc/cookie'); |
@@ -34,73 +34,73 @@ discard block |
||
| 34 | 34 | * |
| 35 | 35 | */ |
| 36 | 36 | function action_logout_dist() { |
| 37 | - $logout = _request('logout'); |
|
| 38 | - $url = securiser_redirect_action(_request('url')); |
|
| 39 | - // cas particulier, logout dans l'espace public |
|
| 40 | - if ($logout == 'public' and !$url) { |
|
| 41 | - $url = url_de_base(); |
|
| 42 | - } |
|
| 37 | + $logout = _request('logout'); |
|
| 38 | + $url = securiser_redirect_action(_request('url')); |
|
| 39 | + // cas particulier, logout dans l'espace public |
|
| 40 | + if ($logout == 'public' and !$url) { |
|
| 41 | + $url = url_de_base(); |
|
| 42 | + } |
|
| 43 | 43 | |
| 44 | - // seul le loge peut se deloger (mais id_auteur peut valoir 0 apres une restauration avortee) |
|
| 45 | - if ( |
|
| 46 | - isset($GLOBALS['visiteur_session']['id_auteur']) |
|
| 47 | - and is_numeric($GLOBALS['visiteur_session']['id_auteur']) |
|
| 48 | - // des sessions anonymes avec id_auteur=0 existent, mais elle n'ont pas de statut : double check |
|
| 49 | - and isset($GLOBALS['visiteur_session']['statut']) |
|
| 50 | - ) { |
|
| 51 | - // il faut un jeton pour fermer la session (eviter les CSRF) |
|
| 52 | - if ( |
|
| 53 | - !$jeton = _request('jeton') |
|
| 54 | - or !verifier_jeton_logout($jeton, $GLOBALS['visiteur_session']) |
|
| 55 | - ) { |
|
| 56 | - $jeton = generer_jeton_logout($GLOBALS['visiteur_session']); |
|
| 57 | - $action = generer_url_action('logout', "jeton=$jeton"); |
|
| 58 | - $action = parametre_url($action, 'logout', _request('logout')); |
|
| 59 | - $action = parametre_url($action, 'url', _request('url')); |
|
| 60 | - include_spip('inc/minipres'); |
|
| 61 | - include_spip('inc/filtres'); |
|
| 62 | - $texte = bouton_action(_T('spip:icone_deconnecter'), $action); |
|
| 63 | - $texte = "<div class='boutons'>$texte</div>"; |
|
| 64 | - $texte .= '<script type="text/javascript">document.write("<style>body{visibility:hidden;}</style>");window.document.forms[0].submit();</script>'; |
|
| 65 | - $res = minipres(_T('spip:icone_deconnecter'), $texte, ['all_inline' => true]); |
|
| 66 | - echo $res; |
|
| 44 | + // seul le loge peut se deloger (mais id_auteur peut valoir 0 apres une restauration avortee) |
|
| 45 | + if ( |
|
| 46 | + isset($GLOBALS['visiteur_session']['id_auteur']) |
|
| 47 | + and is_numeric($GLOBALS['visiteur_session']['id_auteur']) |
|
| 48 | + // des sessions anonymes avec id_auteur=0 existent, mais elle n'ont pas de statut : double check |
|
| 49 | + and isset($GLOBALS['visiteur_session']['statut']) |
|
| 50 | + ) { |
|
| 51 | + // il faut un jeton pour fermer la session (eviter les CSRF) |
|
| 52 | + if ( |
|
| 53 | + !$jeton = _request('jeton') |
|
| 54 | + or !verifier_jeton_logout($jeton, $GLOBALS['visiteur_session']) |
|
| 55 | + ) { |
|
| 56 | + $jeton = generer_jeton_logout($GLOBALS['visiteur_session']); |
|
| 57 | + $action = generer_url_action('logout', "jeton=$jeton"); |
|
| 58 | + $action = parametre_url($action, 'logout', _request('logout')); |
|
| 59 | + $action = parametre_url($action, 'url', _request('url')); |
|
| 60 | + include_spip('inc/minipres'); |
|
| 61 | + include_spip('inc/filtres'); |
|
| 62 | + $texte = bouton_action(_T('spip:icone_deconnecter'), $action); |
|
| 63 | + $texte = "<div class='boutons'>$texte</div>"; |
|
| 64 | + $texte .= '<script type="text/javascript">document.write("<style>body{visibility:hidden;}</style>");window.document.forms[0].submit();</script>'; |
|
| 65 | + $res = minipres(_T('spip:icone_deconnecter'), $texte, ['all_inline' => true]); |
|
| 66 | + echo $res; |
|
| 67 | 67 | |
| 68 | - return; |
|
| 69 | - } |
|
| 68 | + return; |
|
| 69 | + } |
|
| 70 | 70 | |
| 71 | - include_spip('inc/auth'); |
|
| 72 | - auth_trace($GLOBALS['visiteur_session'], '0000-00-00 00:00:00'); |
|
| 73 | - // le logout explicite vaut destruction de toutes les sessions |
|
| 74 | - if (isset($_COOKIE['spip_session'])) { |
|
| 75 | - $session = charger_fonction('session', 'inc'); |
|
| 76 | - $session($GLOBALS['visiteur_session']['id_auteur']); |
|
| 77 | - spip_setcookie('spip_session', $_COOKIE['spip_session'], [ |
|
| 78 | - 'expires' => time() - 3600 |
|
| 79 | - ]); |
|
| 80 | - } |
|
| 81 | - // si authentification http, et que la personne est loge, |
|
| 82 | - // pour se deconnecter, il faut proposer un nouveau formulaire de connexion http |
|
| 83 | - if ( |
|
| 84 | - isset($_SERVER['PHP_AUTH_USER']) |
|
| 85 | - and !$GLOBALS['ignore_auth_http'] |
|
| 86 | - and $GLOBALS['auth_can_disconnect'] |
|
| 87 | - ) { |
|
| 88 | - ask_php_auth( |
|
| 89 | - _T('login_deconnexion_ok'), |
|
| 90 | - _T('login_verifiez_navigateur'), |
|
| 91 | - _T('login_retour_public'), |
|
| 92 | - 'redirect=' . _DIR_RESTREINT_ABS, |
|
| 93 | - _T('login_test_navigateur'), |
|
| 94 | - true |
|
| 95 | - ); |
|
| 96 | - } |
|
| 97 | - } |
|
| 71 | + include_spip('inc/auth'); |
|
| 72 | + auth_trace($GLOBALS['visiteur_session'], '0000-00-00 00:00:00'); |
|
| 73 | + // le logout explicite vaut destruction de toutes les sessions |
|
| 74 | + if (isset($_COOKIE['spip_session'])) { |
|
| 75 | + $session = charger_fonction('session', 'inc'); |
|
| 76 | + $session($GLOBALS['visiteur_session']['id_auteur']); |
|
| 77 | + spip_setcookie('spip_session', $_COOKIE['spip_session'], [ |
|
| 78 | + 'expires' => time() - 3600 |
|
| 79 | + ]); |
|
| 80 | + } |
|
| 81 | + // si authentification http, et que la personne est loge, |
|
| 82 | + // pour se deconnecter, il faut proposer un nouveau formulaire de connexion http |
|
| 83 | + if ( |
|
| 84 | + isset($_SERVER['PHP_AUTH_USER']) |
|
| 85 | + and !$GLOBALS['ignore_auth_http'] |
|
| 86 | + and $GLOBALS['auth_can_disconnect'] |
|
| 87 | + ) { |
|
| 88 | + ask_php_auth( |
|
| 89 | + _T('login_deconnexion_ok'), |
|
| 90 | + _T('login_verifiez_navigateur'), |
|
| 91 | + _T('login_retour_public'), |
|
| 92 | + 'redirect=' . _DIR_RESTREINT_ABS, |
|
| 93 | + _T('login_test_navigateur'), |
|
| 94 | + true |
|
| 95 | + ); |
|
| 96 | + } |
|
| 97 | + } |
|
| 98 | 98 | |
| 99 | - // Rediriger en contrant le cache navigateur (Safari3) |
|
| 100 | - include_spip('inc/headers'); |
|
| 101 | - redirige_par_entete($url |
|
| 102 | - ? parametre_url($url, 'var_hasard', uniqid(random_int(0, mt_getrandmax())), '&') |
|
| 103 | - : generer_url_public('login')); |
|
| 99 | + // Rediriger en contrant le cache navigateur (Safari3) |
|
| 100 | + include_spip('inc/headers'); |
|
| 101 | + redirige_par_entete($url |
|
| 102 | + ? parametre_url($url, 'var_hasard', uniqid(random_int(0, mt_getrandmax())), '&') |
|
| 103 | + : generer_url_public('login')); |
|
| 104 | 104 | } |
| 105 | 105 | |
| 106 | 106 | /** |
@@ -111,17 +111,17 @@ discard block |
||
| 111 | 111 | * @return string |
| 112 | 112 | */ |
| 113 | 113 | function generer_jeton_logout($session, $alea = null) { |
| 114 | - if (is_null($alea)) { |
|
| 115 | - include_spip('inc/acces'); |
|
| 116 | - $alea = charger_aleas(); |
|
| 117 | - } |
|
| 114 | + if (is_null($alea)) { |
|
| 115 | + include_spip('inc/acces'); |
|
| 116 | + $alea = charger_aleas(); |
|
| 117 | + } |
|
| 118 | 118 | |
| 119 | - $jeton = md5($session['date_session'] |
|
| 120 | - . $session['id_auteur'] |
|
| 121 | - . $session['statut'] |
|
| 122 | - . $alea); |
|
| 119 | + $jeton = md5($session['date_session'] |
|
| 120 | + . $session['id_auteur'] |
|
| 121 | + . $session['statut'] |
|
| 122 | + . $alea); |
|
| 123 | 123 | |
| 124 | - return $jeton; |
|
| 124 | + return $jeton; |
|
| 125 | 125 | } |
| 126 | 126 | |
| 127 | 127 | /** |
@@ -135,13 +135,13 @@ discard block |
||
| 135 | 135 | * @return bool |
| 136 | 136 | */ |
| 137 | 137 | function verifier_jeton_logout($jeton, $session) { |
| 138 | - if (generer_jeton_logout($session) === $jeton) { |
|
| 139 | - return true; |
|
| 140 | - } |
|
| 138 | + if (generer_jeton_logout($session) === $jeton) { |
|
| 139 | + return true; |
|
| 140 | + } |
|
| 141 | 141 | |
| 142 | - if (generer_jeton_logout($session, $GLOBALS['meta']['alea_ephemere_ancien']) === $jeton) { |
|
| 143 | - return true; |
|
| 144 | - } |
|
| 142 | + if (generer_jeton_logout($session, $GLOBALS['meta']['alea_ephemere_ancien']) === $jeton) { |
|
| 143 | + return true; |
|
| 144 | + } |
|
| 145 | 145 | |
| 146 | - return false; |
|
| 146 | + return false; |
|
| 147 | 147 | } |
@@ -17,7 +17,7 @@ discard block |
||
| 17 | 17 | **/ |
| 18 | 18 | |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | /** |
@@ -31,43 +31,43 @@ discard block |
||
| 31 | 31 | * @return string |
| 32 | 32 | */ |
| 33 | 33 | function action_instituer_langue_objet_dist($objet, $id, $id_rubrique, $changer_lang, $serveur = '') { |
| 34 | - if ($changer_lang) { |
|
| 35 | - $table_objet_sql = table_objet_sql($objet); |
|
| 36 | - $id_table_objet = id_table_objet($objet); |
|
| 37 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 38 | - $desc = $trouver_table($table_objet_sql, $serveur); |
|
| 34 | + if ($changer_lang) { |
|
| 35 | + $table_objet_sql = table_objet_sql($objet); |
|
| 36 | + $id_table_objet = id_table_objet($objet); |
|
| 37 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 38 | + $desc = $trouver_table($table_objet_sql, $serveur); |
|
| 39 | 39 | |
| 40 | - $set = []; |
|
| 41 | - if (isset($desc['field']['langue_choisie'])) { |
|
| 42 | - $set['langue_choisie'] = 'oui'; |
|
| 43 | - } |
|
| 40 | + $set = []; |
|
| 41 | + if (isset($desc['field']['langue_choisie'])) { |
|
| 42 | + $set['langue_choisie'] = 'oui'; |
|
| 43 | + } |
|
| 44 | 44 | |
| 45 | - if ($changer_lang != 'herit') { |
|
| 46 | - $set['lang'] = $changer_lang; |
|
| 47 | - sql_updateq($table_objet_sql, $set, "$id_table_objet=" . intval($id), [], $serveur); |
|
| 48 | - include_spip('inc/rubriques'); // pour calculer_langues_rubriques et calculer_langues_utilisees |
|
| 49 | - if ($table_objet_sql == 'spip_rubriques') { |
|
| 50 | - calculer_langues_rubriques(); |
|
| 51 | - } |
|
| 52 | - $langues = calculer_langues_utilisees($serveur); |
|
| 53 | - ecrire_meta('langues_utilisees', $langues); |
|
| 54 | - } else { |
|
| 55 | - $langue_parent = sql_getfetsel('lang', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique)); |
|
| 56 | - if (!$langue_parent) { |
|
| 57 | - $langue_parent = $GLOBALS['meta']['langue_site']; |
|
| 58 | - } |
|
| 59 | - $changer_lang = $langue_parent; |
|
| 60 | - $set['lang'] = $changer_lang; |
|
| 61 | - if (isset($set['langue_choisie'])) { |
|
| 62 | - $set['langue_choisie'] = 'non'; |
|
| 63 | - } |
|
| 64 | - sql_updateq($table_objet_sql, $set, "$id_table_objet=" . intval($id), [], $serveur); |
|
| 65 | - if ($table_objet_sql == 'spip_rubriques') { |
|
| 66 | - include_spip('inc/rubriques'); |
|
| 67 | - calculer_langues_rubriques(); |
|
| 68 | - } |
|
| 69 | - } |
|
| 70 | - } |
|
| 45 | + if ($changer_lang != 'herit') { |
|
| 46 | + $set['lang'] = $changer_lang; |
|
| 47 | + sql_updateq($table_objet_sql, $set, "$id_table_objet=" . intval($id), [], $serveur); |
|
| 48 | + include_spip('inc/rubriques'); // pour calculer_langues_rubriques et calculer_langues_utilisees |
|
| 49 | + if ($table_objet_sql == 'spip_rubriques') { |
|
| 50 | + calculer_langues_rubriques(); |
|
| 51 | + } |
|
| 52 | + $langues = calculer_langues_utilisees($serveur); |
|
| 53 | + ecrire_meta('langues_utilisees', $langues); |
|
| 54 | + } else { |
|
| 55 | + $langue_parent = sql_getfetsel('lang', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique)); |
|
| 56 | + if (!$langue_parent) { |
|
| 57 | + $langue_parent = $GLOBALS['meta']['langue_site']; |
|
| 58 | + } |
|
| 59 | + $changer_lang = $langue_parent; |
|
| 60 | + $set['lang'] = $changer_lang; |
|
| 61 | + if (isset($set['langue_choisie'])) { |
|
| 62 | + $set['langue_choisie'] = 'non'; |
|
| 63 | + } |
|
| 64 | + sql_updateq($table_objet_sql, $set, "$id_table_objet=" . intval($id), [], $serveur); |
|
| 65 | + if ($table_objet_sql == 'spip_rubriques') { |
|
| 66 | + include_spip('inc/rubriques'); |
|
| 67 | + calculer_langues_rubriques(); |
|
| 68 | + } |
|
| 69 | + } |
|
| 70 | + } |
|
| 71 | 71 | |
| 72 | - return $changer_lang; |
|
| 72 | + return $changer_lang; |
|
| 73 | 73 | } |
@@ -25,7 +25,7 @@ discard block |
||
| 25 | 25 | */ |
| 26 | 26 | |
| 27 | 27 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 28 | - return; |
|
| 28 | + return; |
|
| 29 | 29 | } |
| 30 | 30 | |
| 31 | 31 | /** Version de l'API SQL */ |
@@ -45,39 +45,39 @@ discard block |
||
| 45 | 45 | * contexte de l'erreur |
| 46 | 46 | **/ |
| 47 | 47 | function sql_error_backtrace($compil_info = false) { |
| 48 | - $trace = debug_backtrace(); |
|
| 49 | - $caller = array_shift($trace); |
|
| 50 | - while (count($trace) and (empty($trace[0]['file']) or $trace[0]['file'] === $caller['file'] or $trace[0]['file'] === __FILE__)) { |
|
| 51 | - array_shift($trace); |
|
| 52 | - } |
|
| 53 | - |
|
| 54 | - if ($compil_info) { |
|
| 55 | - $contexte_compil = [ |
|
| 56 | - $trace[0]['file'],// sourcefile |
|
| 57 | - '', //nom |
|
| 58 | - (isset($trace[1]) ? $trace[1]['function'] . "(){\n" : '') |
|
| 59 | - . $trace[0]['function'] . '();' |
|
| 60 | - . (isset($trace[1]) ? "\n}" : ''), //id_boucle |
|
| 61 | - $trace[0]['line'], // ligne |
|
| 62 | - $GLOBALS['spip_lang'], // lang |
|
| 63 | - ]; |
|
| 64 | - |
|
| 65 | - return $contexte_compil; |
|
| 66 | - } |
|
| 67 | - |
|
| 68 | - $message = count($trace) ? $trace[0]['file'] . ' L' . $trace[0]['line'] : ''; |
|
| 69 | - $f = []; |
|
| 70 | - while (count($trace) and $t = array_shift($trace)) { |
|
| 71 | - if (in_array($t['function'], ['include_once', 'include_spip', 'find_in_path'])) { |
|
| 72 | - break; |
|
| 73 | - } |
|
| 74 | - $f[] = $t['function']; |
|
| 75 | - } |
|
| 76 | - if (count($f)) { |
|
| 77 | - $message .= ' [' . implode('(),', $f) . '()]'; |
|
| 78 | - } |
|
| 79 | - |
|
| 80 | - return $message; |
|
| 48 | + $trace = debug_backtrace(); |
|
| 49 | + $caller = array_shift($trace); |
|
| 50 | + while (count($trace) and (empty($trace[0]['file']) or $trace[0]['file'] === $caller['file'] or $trace[0]['file'] === __FILE__)) { |
|
| 51 | + array_shift($trace); |
|
| 52 | + } |
|
| 53 | + |
|
| 54 | + if ($compil_info) { |
|
| 55 | + $contexte_compil = [ |
|
| 56 | + $trace[0]['file'],// sourcefile |
|
| 57 | + '', //nom |
|
| 58 | + (isset($trace[1]) ? $trace[1]['function'] . "(){\n" : '') |
|
| 59 | + . $trace[0]['function'] . '();' |
|
| 60 | + . (isset($trace[1]) ? "\n}" : ''), //id_boucle |
|
| 61 | + $trace[0]['line'], // ligne |
|
| 62 | + $GLOBALS['spip_lang'], // lang |
|
| 63 | + ]; |
|
| 64 | + |
|
| 65 | + return $contexte_compil; |
|
| 66 | + } |
|
| 67 | + |
|
| 68 | + $message = count($trace) ? $trace[0]['file'] . ' L' . $trace[0]['line'] : ''; |
|
| 69 | + $f = []; |
|
| 70 | + while (count($trace) and $t = array_shift($trace)) { |
|
| 71 | + if (in_array($t['function'], ['include_once', 'include_spip', 'find_in_path'])) { |
|
| 72 | + break; |
|
| 73 | + } |
|
| 74 | + $f[] = $t['function']; |
|
| 75 | + } |
|
| 76 | + if (count($f)) { |
|
| 77 | + $message .= ' [' . implode('(),', $f) . '()]'; |
|
| 78 | + } |
|
| 79 | + |
|
| 80 | + return $message; |
|
| 81 | 81 | } |
| 82 | 82 | |
| 83 | 83 | |
@@ -102,16 +102,16 @@ discard block |
||
| 102 | 102 | * |
| 103 | 103 | **/ |
| 104 | 104 | function sql_serveur($ins_sql = '', $serveur = '', $continue = false) { |
| 105 | - static $sql_serveur = []; |
|
| 106 | - if (!isset($sql_serveur[$serveur][$ins_sql])) { |
|
| 107 | - $f = spip_connect_sql(\SQL_ABSTRACT_VERSION, $ins_sql, $serveur, $continue); |
|
| 108 | - if (!is_string($f) or !$f) { |
|
| 109 | - return $f; |
|
| 110 | - } |
|
| 111 | - $sql_serveur[$serveur][$ins_sql] = $f; |
|
| 112 | - } |
|
| 113 | - |
|
| 114 | - return $sql_serveur[$serveur][$ins_sql]; |
|
| 105 | + static $sql_serveur = []; |
|
| 106 | + if (!isset($sql_serveur[$serveur][$ins_sql])) { |
|
| 107 | + $f = spip_connect_sql(\SQL_ABSTRACT_VERSION, $ins_sql, $serveur, $continue); |
|
| 108 | + if (!is_string($f) or !$f) { |
|
| 109 | + return $f; |
|
| 110 | + } |
|
| 111 | + $sql_serveur[$serveur][$ins_sql] = $f; |
|
| 112 | + } |
|
| 113 | + |
|
| 114 | + return $sql_serveur[$serveur][$ins_sql]; |
|
| 115 | 115 | } |
| 116 | 116 | |
| 117 | 117 | /** |
@@ -133,23 +133,23 @@ discard block |
||
| 133 | 133 | * Retourne le nom du charset si effectivement trouvé, sinon false. |
| 134 | 134 | **/ |
| 135 | 135 | function sql_get_charset($charset, $serveur = '', $option = true) { |
| 136 | - // le nom http du charset differe parfois du nom SQL utf-8 ==> utf8 etc. |
|
| 137 | - $desc = sql_serveur('', $serveur, true); |
|
| 138 | - $desc = $desc[\SQL_ABSTRACT_VERSION]; |
|
| 139 | - $c = $desc['charsets'][$charset]; |
|
| 140 | - if ($c) { |
|
| 141 | - if (function_exists($f = @$desc['get_charset'])) { |
|
| 142 | - if ($f($c, $serveur, $option !== false)) { |
|
| 143 | - return $c; |
|
| 144 | - } |
|
| 145 | - } |
|
| 146 | - } |
|
| 147 | - spip_log( |
|
| 148 | - "SPIP ne connait pas les Charsets disponibles sur le serveur $serveur. Le serveur choisira seul.", |
|
| 149 | - _LOG_AVERTISSEMENT |
|
| 150 | - ); |
|
| 151 | - |
|
| 152 | - return false; |
|
| 136 | + // le nom http du charset differe parfois du nom SQL utf-8 ==> utf8 etc. |
|
| 137 | + $desc = sql_serveur('', $serveur, true); |
|
| 138 | + $desc = $desc[\SQL_ABSTRACT_VERSION]; |
|
| 139 | + $c = $desc['charsets'][$charset]; |
|
| 140 | + if ($c) { |
|
| 141 | + if (function_exists($f = @$desc['get_charset'])) { |
|
| 142 | + if ($f($c, $serveur, $option !== false)) { |
|
| 143 | + return $c; |
|
| 144 | + } |
|
| 145 | + } |
|
| 146 | + } |
|
| 147 | + spip_log( |
|
| 148 | + "SPIP ne connait pas les Charsets disponibles sur le serveur $serveur. Le serveur choisira seul.", |
|
| 149 | + _LOG_AVERTISSEMENT |
|
| 150 | + ); |
|
| 151 | + |
|
| 152 | + return false; |
|
| 153 | 153 | } |
| 154 | 154 | |
| 155 | 155 | |
@@ -175,12 +175,12 @@ discard block |
||
| 175 | 175 | * Retourne true si elle reussie. |
| 176 | 176 | **/ |
| 177 | 177 | function sql_set_charset($charset, $serveur = '', $option = true) { |
| 178 | - $f = sql_serveur('set_charset', $serveur, $option === 'continue' or $option === false); |
|
| 179 | - if (!is_string($f) or !$f) { |
|
| 180 | - return false; |
|
| 181 | - } |
|
| 178 | + $f = sql_serveur('set_charset', $serveur, $option === 'continue' or $option === false); |
|
| 179 | + if (!is_string($f) or !$f) { |
|
| 180 | + return false; |
|
| 181 | + } |
|
| 182 | 182 | |
| 183 | - return $f($charset, $serveur, $option !== false); |
|
| 183 | + return $f($charset, $serveur, $option !== false); |
|
| 184 | 184 | } |
| 185 | 185 | |
| 186 | 186 | |
@@ -231,59 +231,59 @@ discard block |
||
| 231 | 231 | * |
| 232 | 232 | **/ |
| 233 | 233 | function sql_select( |
| 234 | - $select = [], |
|
| 235 | - $from = [], |
|
| 236 | - $where = [], |
|
| 237 | - $groupby = [], |
|
| 238 | - $orderby = [], |
|
| 239 | - $limit = '', |
|
| 240 | - $having = [], |
|
| 241 | - $serveur = '', |
|
| 242 | - $option = true |
|
| 234 | + $select = [], |
|
| 235 | + $from = [], |
|
| 236 | + $where = [], |
|
| 237 | + $groupby = [], |
|
| 238 | + $orderby = [], |
|
| 239 | + $limit = '', |
|
| 240 | + $having = [], |
|
| 241 | + $serveur = '', |
|
| 242 | + $option = true |
|
| 243 | 243 | ) { |
| 244 | - $f = sql_serveur('select', $serveur, $option === 'continue' or $option === false); |
|
| 245 | - if (!is_string($f) or !$f) { |
|
| 246 | - return false; |
|
| 247 | - } |
|
| 248 | - |
|
| 249 | - $debug = (defined('_VAR_MODE') and _VAR_MODE == 'debug'); |
|
| 250 | - if (($option !== false) and !$debug) { |
|
| 251 | - $res = $f( |
|
| 252 | - $select, |
|
| 253 | - $from, |
|
| 254 | - $where, |
|
| 255 | - $groupby, |
|
| 256 | - $orderby, |
|
| 257 | - $limit, |
|
| 258 | - $having, |
|
| 259 | - $serveur, |
|
| 260 | - is_array($option) ? true : $option |
|
| 261 | - ); |
|
| 262 | - } else { |
|
| 263 | - $query = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false); |
|
| 264 | - if (!$option) { |
|
| 265 | - return $query; |
|
| 266 | - } |
|
| 267 | - // le debug, c'est pour ce qui a ete produit par le compilateur |
|
| 268 | - if (isset($GLOBALS['debug']['aucasou'])) { |
|
| 269 | - [$table, $id, ] = $GLOBALS['debug']['aucasou']; |
|
| 270 | - $nom = $GLOBALS['debug_objets']['courant'] . $id; |
|
| 271 | - $GLOBALS['debug_objets']['requete'][$nom] = $query; |
|
| 272 | - } |
|
| 273 | - $res = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, true); |
|
| 274 | - } |
|
| 275 | - |
|
| 276 | - // en cas d'erreur |
|
| 277 | - if (!is_string($res)) { |
|
| 278 | - return $res; |
|
| 279 | - } |
|
| 280 | - // denoncer l'erreur SQL dans sa version brute |
|
| 281 | - spip_sql_erreur($serveur); |
|
| 282 | - // idem dans sa version squelette (prefixe des tables non substitue) |
|
| 283 | - $contexte_compil = sql_error_backtrace(true); |
|
| 284 | - erreur_squelette([sql_errno($serveur), sql_error($serveur), $res], $contexte_compil); |
|
| 285 | - |
|
| 286 | - return false; |
|
| 244 | + $f = sql_serveur('select', $serveur, $option === 'continue' or $option === false); |
|
| 245 | + if (!is_string($f) or !$f) { |
|
| 246 | + return false; |
|
| 247 | + } |
|
| 248 | + |
|
| 249 | + $debug = (defined('_VAR_MODE') and _VAR_MODE == 'debug'); |
|
| 250 | + if (($option !== false) and !$debug) { |
|
| 251 | + $res = $f( |
|
| 252 | + $select, |
|
| 253 | + $from, |
|
| 254 | + $where, |
|
| 255 | + $groupby, |
|
| 256 | + $orderby, |
|
| 257 | + $limit, |
|
| 258 | + $having, |
|
| 259 | + $serveur, |
|
| 260 | + is_array($option) ? true : $option |
|
| 261 | + ); |
|
| 262 | + } else { |
|
| 263 | + $query = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false); |
|
| 264 | + if (!$option) { |
|
| 265 | + return $query; |
|
| 266 | + } |
|
| 267 | + // le debug, c'est pour ce qui a ete produit par le compilateur |
|
| 268 | + if (isset($GLOBALS['debug']['aucasou'])) { |
|
| 269 | + [$table, $id, ] = $GLOBALS['debug']['aucasou']; |
|
| 270 | + $nom = $GLOBALS['debug_objets']['courant'] . $id; |
|
| 271 | + $GLOBALS['debug_objets']['requete'][$nom] = $query; |
|
| 272 | + } |
|
| 273 | + $res = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, true); |
|
| 274 | + } |
|
| 275 | + |
|
| 276 | + // en cas d'erreur |
|
| 277 | + if (!is_string($res)) { |
|
| 278 | + return $res; |
|
| 279 | + } |
|
| 280 | + // denoncer l'erreur SQL dans sa version brute |
|
| 281 | + spip_sql_erreur($serveur); |
|
| 282 | + // idem dans sa version squelette (prefixe des tables non substitue) |
|
| 283 | + $contexte_compil = sql_error_backtrace(true); |
|
| 284 | + erreur_squelette([sql_errno($serveur), sql_error($serveur), $res], $contexte_compil); |
|
| 285 | + |
|
| 286 | + return false; |
|
| 287 | 287 | } |
| 288 | 288 | |
| 289 | 289 | |
@@ -320,16 +320,16 @@ discard block |
||
| 320 | 320 | * |
| 321 | 321 | **/ |
| 322 | 322 | function sql_get_select( |
| 323 | - $select = [], |
|
| 324 | - $from = [], |
|
| 325 | - $where = [], |
|
| 326 | - $groupby = [], |
|
| 327 | - $orderby = [], |
|
| 328 | - $limit = '', |
|
| 329 | - $having = [], |
|
| 330 | - $serveur = '' |
|
| 323 | + $select = [], |
|
| 324 | + $from = [], |
|
| 325 | + $where = [], |
|
| 326 | + $groupby = [], |
|
| 327 | + $orderby = [], |
|
| 328 | + $limit = '', |
|
| 329 | + $having = [], |
|
| 330 | + $serveur = '' |
|
| 331 | 331 | ) { |
| 332 | - return sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false); |
|
| 332 | + return sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false); |
|
| 333 | 333 | } |
| 334 | 334 | |
| 335 | 335 | |
@@ -373,23 +373,23 @@ discard block |
||
| 373 | 373 | * |
| 374 | 374 | **/ |
| 375 | 375 | function sql_countsel( |
| 376 | - $from = [], |
|
| 377 | - $where = [], |
|
| 378 | - $groupby = [], |
|
| 379 | - $having = [], |
|
| 380 | - $serveur = '', |
|
| 381 | - $option = true |
|
| 376 | + $from = [], |
|
| 377 | + $where = [], |
|
| 378 | + $groupby = [], |
|
| 379 | + $having = [], |
|
| 380 | + $serveur = '', |
|
| 381 | + $option = true |
|
| 382 | 382 | ) { |
| 383 | - $f = sql_serveur('countsel', $serveur, $option === 'continue' or $option === false); |
|
| 384 | - if (!is_string($f) or !$f) { |
|
| 385 | - return false; |
|
| 386 | - } |
|
| 387 | - $r = $f($from, $where, $groupby, $having, $serveur, $option !== false); |
|
| 388 | - if ($r === false) { |
|
| 389 | - spip_sql_erreur($serveur); |
|
| 390 | - } |
|
| 391 | - |
|
| 392 | - return $r; |
|
| 383 | + $f = sql_serveur('countsel', $serveur, $option === 'continue' or $option === false); |
|
| 384 | + if (!is_string($f) or !$f) { |
|
| 385 | + return false; |
|
| 386 | + } |
|
| 387 | + $r = $f($from, $where, $groupby, $having, $serveur, $option !== false); |
|
| 388 | + if ($r === false) { |
|
| 389 | + spip_sql_erreur($serveur); |
|
| 390 | + } |
|
| 391 | + |
|
| 392 | + return $r; |
|
| 393 | 393 | } |
| 394 | 394 | |
| 395 | 395 | /** |
@@ -421,16 +421,16 @@ discard block |
||
| 421 | 421 | * Ce retour n'est pas pertinent pour savoir si l'opération est correctement réalisée. |
| 422 | 422 | **/ |
| 423 | 423 | function sql_alter($q, $serveur = '', $option = true) { |
| 424 | - $f = sql_serveur('alter', $serveur, $option === 'continue' or $option === false); |
|
| 425 | - if (!is_string($f) or !$f) { |
|
| 426 | - return false; |
|
| 427 | - } |
|
| 428 | - $r = $f($q, $serveur, $option !== false); |
|
| 429 | - if ($r === false) { |
|
| 430 | - spip_sql_erreur($serveur); |
|
| 431 | - } |
|
| 432 | - |
|
| 433 | - return $r; |
|
| 424 | + $f = sql_serveur('alter', $serveur, $option === 'continue' or $option === false); |
|
| 425 | + if (!is_string($f) or !$f) { |
|
| 426 | + return false; |
|
| 427 | + } |
|
| 428 | + $r = $f($q, $serveur, $option !== false); |
|
| 429 | + if ($r === false) { |
|
| 430 | + spip_sql_erreur($serveur); |
|
| 431 | + } |
|
| 432 | + |
|
| 433 | + return $r; |
|
| 434 | 434 | } |
| 435 | 435 | |
| 436 | 436 | /** |
@@ -453,12 +453,12 @@ discard block |
||
| 453 | 453 | * presentant une ligne de resultat d'une selection |
| 454 | 454 | */ |
| 455 | 455 | function sql_fetch($res, $serveur = '', $option = true) { |
| 456 | - $f = sql_serveur('fetch', $serveur, $option === 'continue' or $option === false); |
|
| 457 | - if (!is_string($f) or !$f) { |
|
| 458 | - return false; |
|
| 459 | - } |
|
| 456 | + $f = sql_serveur('fetch', $serveur, $option === 'continue' or $option === false); |
|
| 457 | + if (!is_string($f) or !$f) { |
|
| 458 | + return false; |
|
| 459 | + } |
|
| 460 | 460 | |
| 461 | - return $f($res, null, $serveur, $option !== false); |
|
| 461 | + return $f($res, null, $serveur, $option !== false); |
|
| 462 | 462 | } |
| 463 | 463 | |
| 464 | 464 | |
@@ -485,20 +485,20 @@ discard block |
||
| 485 | 485 | * presentant une ligne de resultat d'une selection |
| 486 | 486 | */ |
| 487 | 487 | function sql_fetch_all($res, $serveur = '', $option = true) { |
| 488 | - $rows = []; |
|
| 489 | - if (!$res) { |
|
| 490 | - return $rows; |
|
| 491 | - } |
|
| 492 | - $f = sql_serveur('fetch', $serveur, $option === 'continue' or $option === false); |
|
| 493 | - if (!is_string($f) or !$f) { |
|
| 494 | - return []; |
|
| 495 | - } |
|
| 496 | - while ($r = $f($res, null, $serveur, $option !== false)) { |
|
| 497 | - $rows[] = $r; |
|
| 498 | - } |
|
| 499 | - sql_free($res, $serveur); |
|
| 500 | - |
|
| 501 | - return $rows; |
|
| 488 | + $rows = []; |
|
| 489 | + if (!$res) { |
|
| 490 | + return $rows; |
|
| 491 | + } |
|
| 492 | + $f = sql_serveur('fetch', $serveur, $option === 'continue' or $option === false); |
|
| 493 | + if (!is_string($f) or !$f) { |
|
| 494 | + return []; |
|
| 495 | + } |
|
| 496 | + while ($r = $f($res, null, $serveur, $option !== false)) { |
|
| 497 | + $rows[] = $r; |
|
| 498 | + } |
|
| 499 | + sql_free($res, $serveur); |
|
| 500 | + |
|
| 501 | + return $rows; |
|
| 502 | 502 | } |
| 503 | 503 | |
| 504 | 504 | /** |
@@ -526,16 +526,16 @@ discard block |
||
| 526 | 526 | * Operation effectuée (true), sinon false. |
| 527 | 527 | **/ |
| 528 | 528 | function sql_seek($res, $row_number, $serveur = '', $option = true) { |
| 529 | - $f = sql_serveur('seek', $serveur, $option === 'continue' or $option === false); |
|
| 530 | - if (!is_string($f) or !$f) { |
|
| 531 | - return false; |
|
| 532 | - } |
|
| 533 | - $r = $f($res, $row_number, $serveur, $option !== false); |
|
| 534 | - if ($r === false) { |
|
| 535 | - spip_sql_erreur($serveur); |
|
| 536 | - } |
|
| 537 | - |
|
| 538 | - return $r; |
|
| 529 | + $f = sql_serveur('seek', $serveur, $option === 'continue' or $option === false); |
|
| 530 | + if (!is_string($f) or !$f) { |
|
| 531 | + return false; |
|
| 532 | + } |
|
| 533 | + $r = $f($res, $row_number, $serveur, $option !== false); |
|
| 534 | + if ($r === false) { |
|
| 535 | + spip_sql_erreur($serveur); |
|
| 536 | + } |
|
| 537 | + |
|
| 538 | + return $r; |
|
| 539 | 539 | } |
| 540 | 540 | |
| 541 | 541 | |
@@ -560,16 +560,16 @@ discard block |
||
| 560 | 560 | * False en cas d'erreur. |
| 561 | 561 | **/ |
| 562 | 562 | function sql_listdbs($serveur = '', $option = true) { |
| 563 | - $f = sql_serveur('listdbs', $serveur, $option === 'continue' or $option === false); |
|
| 564 | - if (!is_string($f) or !$f) { |
|
| 565 | - return false; |
|
| 566 | - } |
|
| 567 | - $r = $f($serveur); |
|
| 568 | - if ($r === false) { |
|
| 569 | - spip_sql_erreur($serveur); |
|
| 570 | - } |
|
| 571 | - |
|
| 572 | - return $r; |
|
| 563 | + $f = sql_serveur('listdbs', $serveur, $option === 'continue' or $option === false); |
|
| 564 | + if (!is_string($f) or !$f) { |
|
| 565 | + return false; |
|
| 566 | + } |
|
| 567 | + $r = $f($serveur); |
|
| 568 | + if ($r === false) { |
|
| 569 | + spip_sql_erreur($serveur); |
|
| 570 | + } |
|
| 571 | + |
|
| 572 | + return $r; |
|
| 573 | 573 | } |
| 574 | 574 | |
| 575 | 575 | |
@@ -592,16 +592,16 @@ discard block |
||
| 592 | 592 | * - False en cas d'erreur. |
| 593 | 593 | **/ |
| 594 | 594 | function sql_selectdb($nom, $serveur = '', $option = true) { |
| 595 | - $f = sql_serveur('selectdb', $serveur, $option === 'continue' or $option === false); |
|
| 596 | - if (!is_string($f) or !$f) { |
|
| 597 | - return false; |
|
| 598 | - } |
|
| 599 | - $r = $f($nom, $serveur, $option !== false); |
|
| 600 | - if ($r === false) { |
|
| 601 | - spip_sql_erreur($serveur); |
|
| 602 | - } |
|
| 603 | - |
|
| 604 | - return $r; |
|
| 595 | + $f = sql_serveur('selectdb', $serveur, $option === 'continue' or $option === false); |
|
| 596 | + if (!is_string($f) or !$f) { |
|
| 597 | + return false; |
|
| 598 | + } |
|
| 599 | + $r = $f($nom, $serveur, $option !== false); |
|
| 600 | + if ($r === false) { |
|
| 601 | + spip_sql_erreur($serveur); |
|
| 602 | + } |
|
| 603 | + |
|
| 604 | + return $r; |
|
| 605 | 605 | } |
| 606 | 606 | |
| 607 | 607 | /** |
@@ -626,16 +626,16 @@ discard block |
||
| 626 | 626 | * - false en cas d'erreur. |
| 627 | 627 | **/ |
| 628 | 628 | function sql_count($res, $serveur = '', $option = true) { |
| 629 | - $f = sql_serveur('count', $serveur, $option === 'continue' or $option === false); |
|
| 630 | - if (!is_string($f) or !$f) { |
|
| 631 | - return false; |
|
| 632 | - } |
|
| 633 | - $r = $f($res, $serveur, $option !== false); |
|
| 634 | - if ($r === false) { |
|
| 635 | - spip_sql_erreur($serveur); |
|
| 636 | - } |
|
| 637 | - |
|
| 638 | - return $r; |
|
| 629 | + $f = sql_serveur('count', $serveur, $option === 'continue' or $option === false); |
|
| 630 | + if (!is_string($f) or !$f) { |
|
| 631 | + return false; |
|
| 632 | + } |
|
| 633 | + $r = $f($res, $serveur, $option !== false); |
|
| 634 | + if ($r === false) { |
|
| 635 | + spip_sql_erreur($serveur); |
|
| 636 | + } |
|
| 637 | + |
|
| 638 | + return $r; |
|
| 639 | 639 | } |
| 640 | 640 | |
| 641 | 641 | /** |
@@ -657,12 +657,12 @@ discard block |
||
| 657 | 657 | * True si réussi |
| 658 | 658 | */ |
| 659 | 659 | function sql_free($res, $serveur = '', $option = true) { |
| 660 | - $f = sql_serveur('free', $serveur, $option === 'continue' or $option === false); |
|
| 661 | - if (!is_string($f) or !$f) { |
|
| 662 | - return false; |
|
| 663 | - } |
|
| 660 | + $f = sql_serveur('free', $serveur, $option === 'continue' or $option === false); |
|
| 661 | + if (!is_string($f) or !$f) { |
|
| 662 | + return false; |
|
| 663 | + } |
|
| 664 | 664 | |
| 665 | - return $f($res); |
|
| 665 | + return $f($res); |
|
| 666 | 666 | } |
| 667 | 667 | |
| 668 | 668 | |
@@ -700,17 +700,17 @@ discard block |
||
| 700 | 700 | * - False en cas d'erreur. |
| 701 | 701 | **/ |
| 702 | 702 | function sql_insert($table, $noms, $valeurs, $desc = [], $serveur = '', $option = true) { |
| 703 | - $f = sql_serveur('insert', $serveur, $option === 'continue' or $option === false); |
|
| 704 | - if (!is_string($f) or !$f) { |
|
| 705 | - return false; |
|
| 706 | - } |
|
| 707 | - $r = $f($table, $noms, $valeurs, $desc, $serveur, $option !== false); |
|
| 708 | - if ($r === false or $r === null) { |
|
| 709 | - spip_sql_erreur($serveur); |
|
| 710 | - $r = false; |
|
| 711 | - } |
|
| 712 | - |
|
| 713 | - return $r; |
|
| 703 | + $f = sql_serveur('insert', $serveur, $option === 'continue' or $option === false); |
|
| 704 | + if (!is_string($f) or !$f) { |
|
| 705 | + return false; |
|
| 706 | + } |
|
| 707 | + $r = $f($table, $noms, $valeurs, $desc, $serveur, $option !== false); |
|
| 708 | + if ($r === false or $r === null) { |
|
| 709 | + spip_sql_erreur($serveur); |
|
| 710 | + $r = false; |
|
| 711 | + } |
|
| 712 | + |
|
| 713 | + return $r; |
|
| 714 | 714 | } |
| 715 | 715 | |
| 716 | 716 | /** |
@@ -751,17 +751,17 @@ discard block |
||
| 751 | 751 | * - False en cas d'erreur. |
| 752 | 752 | **/ |
| 753 | 753 | function sql_insertq($table, $couples = [], $desc = [], $serveur = '', $option = true) { |
| 754 | - $f = sql_serveur('insertq', $serveur, $option === 'continue' or $option === false); |
|
| 755 | - if (!is_string($f) or !$f) { |
|
| 756 | - return false; |
|
| 757 | - } |
|
| 758 | - $r = $f($table, $couples, $desc, $serveur, $option !== false); |
|
| 759 | - if ($r === false or $r === null) { |
|
| 760 | - spip_sql_erreur($serveur); |
|
| 761 | - $r = false; |
|
| 762 | - } |
|
| 763 | - |
|
| 764 | - return $r; |
|
| 754 | + $f = sql_serveur('insertq', $serveur, $option === 'continue' or $option === false); |
|
| 755 | + if (!is_string($f) or !$f) { |
|
| 756 | + return false; |
|
| 757 | + } |
|
| 758 | + $r = $f($table, $couples, $desc, $serveur, $option !== false); |
|
| 759 | + if ($r === false or $r === null) { |
|
| 760 | + spip_sql_erreur($serveur); |
|
| 761 | + $r = false; |
|
| 762 | + } |
|
| 763 | + |
|
| 764 | + return $r; |
|
| 765 | 765 | } |
| 766 | 766 | |
| 767 | 767 | /** |
@@ -796,17 +796,17 @@ discard block |
||
| 796 | 796 | * - False en cas d'erreur. |
| 797 | 797 | **/ |
| 798 | 798 | function sql_insertq_multi($table, $couples = [], $desc = [], $serveur = '', $option = true) { |
| 799 | - $f = sql_serveur('insertq_multi', $serveur, $option === 'continue' or $option === false); |
|
| 800 | - if (!is_string($f) or !$f) { |
|
| 801 | - return false; |
|
| 802 | - } |
|
| 803 | - $r = $f($table, $couples, $desc, $serveur, $option !== false); |
|
| 804 | - if ($r === false or $r === null) { |
|
| 805 | - spip_sql_erreur($serveur); |
|
| 806 | - $r = false; |
|
| 807 | - } |
|
| 808 | - |
|
| 809 | - return $r; |
|
| 799 | + $f = sql_serveur('insertq_multi', $serveur, $option === 'continue' or $option === false); |
|
| 800 | + if (!is_string($f) or !$f) { |
|
| 801 | + return false; |
|
| 802 | + } |
|
| 803 | + $r = $f($table, $couples, $desc, $serveur, $option !== false); |
|
| 804 | + if ($r === false or $r === null) { |
|
| 805 | + spip_sql_erreur($serveur); |
|
| 806 | + $r = false; |
|
| 807 | + } |
|
| 808 | + |
|
| 809 | + return $r; |
|
| 810 | 810 | } |
| 811 | 811 | |
| 812 | 812 | /** |
@@ -846,16 +846,16 @@ discard block |
||
| 846 | 846 | * - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif |
| 847 | 847 | */ |
| 848 | 848 | function sql_update($table, $exp, $where = '', $desc = [], $serveur = '', $option = true) { |
| 849 | - $f = sql_serveur('update', $serveur, $option === 'continue' or $option === false); |
|
| 850 | - if (!is_string($f) or !$f) { |
|
| 851 | - return false; |
|
| 852 | - } |
|
| 853 | - $r = $f($table, $exp, $where, $desc, $serveur, $option !== false); |
|
| 854 | - if ($r === false) { |
|
| 855 | - spip_sql_erreur($serveur); |
|
| 856 | - } |
|
| 857 | - |
|
| 858 | - return $r; |
|
| 849 | + $f = sql_serveur('update', $serveur, $option === 'continue' or $option === false); |
|
| 850 | + if (!is_string($f) or !$f) { |
|
| 851 | + return false; |
|
| 852 | + } |
|
| 853 | + $r = $f($table, $exp, $where, $desc, $serveur, $option !== false); |
|
| 854 | + if ($r === false) { |
|
| 855 | + spip_sql_erreur($serveur); |
|
| 856 | + } |
|
| 857 | + |
|
| 858 | + return $r; |
|
| 859 | 859 | } |
| 860 | 860 | |
| 861 | 861 | |
@@ -901,16 +901,16 @@ discard block |
||
| 901 | 901 | * - False en cas d'erreur. |
| 902 | 902 | **/ |
| 903 | 903 | function sql_updateq($table, $exp, $where = '', $desc = [], $serveur = '', $option = true) { |
| 904 | - $f = sql_serveur('updateq', $serveur, $option === 'continue' or $option === false); |
|
| 905 | - if (!is_string($f) or !$f) { |
|
| 906 | - return false; |
|
| 907 | - } |
|
| 908 | - $r = $f($table, $exp, $where, $desc, $serveur, $option !== false); |
|
| 909 | - if ($r === false) { |
|
| 910 | - spip_sql_erreur($serveur); |
|
| 911 | - } |
|
| 912 | - |
|
| 913 | - return $r; |
|
| 904 | + $f = sql_serveur('updateq', $serveur, $option === 'continue' or $option === false); |
|
| 905 | + if (!is_string($f) or !$f) { |
|
| 906 | + return false; |
|
| 907 | + } |
|
| 908 | + $r = $f($table, $exp, $where, $desc, $serveur, $option !== false); |
|
| 909 | + if ($r === false) { |
|
| 910 | + spip_sql_erreur($serveur); |
|
| 911 | + } |
|
| 912 | + |
|
| 913 | + return $r; |
|
| 914 | 914 | } |
| 915 | 915 | |
| 916 | 916 | /** |
@@ -941,16 +941,16 @@ discard block |
||
| 941 | 941 | * - False en cas d'erreur. |
| 942 | 942 | **/ |
| 943 | 943 | function sql_delete($table, $where = '', $serveur = '', $option = true) { |
| 944 | - $f = sql_serveur('delete', $serveur, $option === 'continue' or $option === false); |
|
| 945 | - if (!is_string($f) or !$f) { |
|
| 946 | - return false; |
|
| 947 | - } |
|
| 948 | - $r = $f($table, $where, $serveur, $option !== false); |
|
| 949 | - if ($r === false) { |
|
| 950 | - spip_sql_erreur($serveur); |
|
| 951 | - } |
|
| 952 | - |
|
| 953 | - return $r; |
|
| 944 | + $f = sql_serveur('delete', $serveur, $option === 'continue' or $option === false); |
|
| 945 | + if (!is_string($f) or !$f) { |
|
| 946 | + return false; |
|
| 947 | + } |
|
| 948 | + $r = $f($table, $where, $serveur, $option !== false); |
|
| 949 | + if ($r === false) { |
|
| 950 | + spip_sql_erreur($serveur); |
|
| 951 | + } |
|
| 952 | + |
|
| 953 | + return $r; |
|
| 954 | 954 | } |
| 955 | 955 | |
| 956 | 956 | /** |
@@ -986,16 +986,16 @@ discard block |
||
| 986 | 986 | * - False en cas d'erreur. |
| 987 | 987 | **/ |
| 988 | 988 | function sql_replace($table, $couples, $desc = [], $serveur = '', $option = true) { |
| 989 | - $f = sql_serveur('replace', $serveur, $option === 'continue' or $option === false); |
|
| 990 | - if (!is_string($f) or !$f) { |
|
| 991 | - return false; |
|
| 992 | - } |
|
| 993 | - $r = $f($table, $couples, $desc, $serveur, $option !== false); |
|
| 994 | - if ($r === false) { |
|
| 995 | - spip_sql_erreur($serveur); |
|
| 996 | - } |
|
| 997 | - |
|
| 998 | - return $r; |
|
| 989 | + $f = sql_serveur('replace', $serveur, $option === 'continue' or $option === false); |
|
| 990 | + if (!is_string($f) or !$f) { |
|
| 991 | + return false; |
|
| 992 | + } |
|
| 993 | + $r = $f($table, $couples, $desc, $serveur, $option !== false); |
|
| 994 | + if ($r === false) { |
|
| 995 | + spip_sql_erreur($serveur); |
|
| 996 | + } |
|
| 997 | + |
|
| 998 | + return $r; |
|
| 999 | 999 | } |
| 1000 | 1000 | |
| 1001 | 1001 | |
@@ -1033,16 +1033,16 @@ discard block |
||
| 1033 | 1033 | * - False en cas d'erreur. |
| 1034 | 1034 | **/ |
| 1035 | 1035 | function sql_replace_multi($table, $tab_couples, $desc = [], $serveur = '', $option = true) { |
| 1036 | - $f = sql_serveur('replace_multi', $serveur, $option === 'continue' or $option === false); |
|
| 1037 | - if (!is_string($f) or !$f) { |
|
| 1038 | - return false; |
|
| 1039 | - } |
|
| 1040 | - $r = $f($table, $tab_couples, $desc, $serveur, $option !== false); |
|
| 1041 | - if ($r === false) { |
|
| 1042 | - spip_sql_erreur($serveur); |
|
| 1043 | - } |
|
| 1044 | - |
|
| 1045 | - return $r; |
|
| 1036 | + $f = sql_serveur('replace_multi', $serveur, $option === 'continue' or $option === false); |
|
| 1037 | + if (!is_string($f) or !$f) { |
|
| 1038 | + return false; |
|
| 1039 | + } |
|
| 1040 | + $r = $f($table, $tab_couples, $desc, $serveur, $option !== false); |
|
| 1041 | + if ($r === false) { |
|
| 1042 | + spip_sql_erreur($serveur); |
|
| 1043 | + } |
|
| 1044 | + |
|
| 1045 | + return $r; |
|
| 1046 | 1046 | } |
| 1047 | 1047 | |
| 1048 | 1048 | /** |
@@ -1070,16 +1070,16 @@ discard block |
||
| 1070 | 1070 | * - False en cas d'erreur. |
| 1071 | 1071 | **/ |
| 1072 | 1072 | function sql_drop_table($table, $exist = '', $serveur = '', $option = true) { |
| 1073 | - $f = sql_serveur('drop_table', $serveur, $option === 'continue' or $option === false); |
|
| 1074 | - if (!is_string($f) or !$f) { |
|
| 1075 | - return false; |
|
| 1076 | - } |
|
| 1077 | - $r = $f($table, $exist, $serveur, $option !== false); |
|
| 1078 | - if ($r === false) { |
|
| 1079 | - spip_sql_erreur($serveur); |
|
| 1080 | - } |
|
| 1081 | - |
|
| 1082 | - return $r; |
|
| 1073 | + $f = sql_serveur('drop_table', $serveur, $option === 'continue' or $option === false); |
|
| 1074 | + if (!is_string($f) or !$f) { |
|
| 1075 | + return false; |
|
| 1076 | + } |
|
| 1077 | + $r = $f($table, $exist, $serveur, $option !== false); |
|
| 1078 | + if ($r === false) { |
|
| 1079 | + spip_sql_erreur($serveur); |
|
| 1080 | + } |
|
| 1081 | + |
|
| 1082 | + return $r; |
|
| 1083 | 1083 | } |
| 1084 | 1084 | |
| 1085 | 1085 | /** |
@@ -1103,16 +1103,16 @@ discard block |
||
| 1103 | 1103 | * - true si la requête a réussie, false sinon |
| 1104 | 1104 | */ |
| 1105 | 1105 | function sql_drop_view($table, $exist = '', $serveur = '', $option = true) { |
| 1106 | - $f = sql_serveur('drop_view', $serveur, $option === 'continue' or $option === false); |
|
| 1107 | - if (!is_string($f) or !$f) { |
|
| 1108 | - return false; |
|
| 1109 | - } |
|
| 1110 | - $r = $f($table, $exist, $serveur, $option !== false); |
|
| 1111 | - if ($r === false) { |
|
| 1112 | - spip_sql_erreur($serveur); |
|
| 1113 | - } |
|
| 1114 | - |
|
| 1115 | - return $r; |
|
| 1106 | + $f = sql_serveur('drop_view', $serveur, $option === 'continue' or $option === false); |
|
| 1107 | + if (!is_string($f) or !$f) { |
|
| 1108 | + return false; |
|
| 1109 | + } |
|
| 1110 | + $r = $f($table, $exist, $serveur, $option !== false); |
|
| 1111 | + if ($r === false) { |
|
| 1112 | + spip_sql_erreur($serveur); |
|
| 1113 | + } |
|
| 1114 | + |
|
| 1115 | + return $r; |
|
| 1116 | 1116 | } |
| 1117 | 1117 | |
| 1118 | 1118 | /** |
@@ -1136,18 +1136,18 @@ discard block |
||
| 1136 | 1136 | * Ressource à utiliser avec sql_fetch() |
| 1137 | 1137 | **/ |
| 1138 | 1138 | function sql_showbase($spip = null, $serveur = '', $option = true) { |
| 1139 | - $f = sql_serveur('showbase', $serveur, $option === 'continue' or $option === false); |
|
| 1140 | - if (!is_string($f) or !$f) { |
|
| 1141 | - return false; |
|
| 1142 | - } |
|
| 1143 | - |
|
| 1144 | - // la globale n'est remplie qu'apres l'appel de sql_serveur. |
|
| 1145 | - if ($spip == null) { |
|
| 1146 | - $connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; |
|
| 1147 | - $spip = $connexion['prefixe'] . '\_%'; |
|
| 1148 | - } |
|
| 1149 | - |
|
| 1150 | - return $f($spip, $serveur, $option !== false); |
|
| 1139 | + $f = sql_serveur('showbase', $serveur, $option === 'continue' or $option === false); |
|
| 1140 | + if (!is_string($f) or !$f) { |
|
| 1141 | + return false; |
|
| 1142 | + } |
|
| 1143 | + |
|
| 1144 | + // la globale n'est remplie qu'apres l'appel de sql_serveur. |
|
| 1145 | + if ($spip == null) { |
|
| 1146 | + $connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; |
|
| 1147 | + $spip = $connexion['prefixe'] . '\_%'; |
|
| 1148 | + } |
|
| 1149 | + |
|
| 1150 | + return $f($spip, $serveur, $option !== false); |
|
| 1151 | 1151 | } |
| 1152 | 1152 | |
| 1153 | 1153 | /** |
@@ -1170,15 +1170,15 @@ discard block |
||
| 1170 | 1170 | * Liste des tables SQL |
| 1171 | 1171 | **/ |
| 1172 | 1172 | function sql_alltable($spip = null, $serveur = '', $option = true) { |
| 1173 | - $q = sql_showbase($spip, $serveur, $option); |
|
| 1174 | - $r = []; |
|
| 1175 | - if ($q) { |
|
| 1176 | - while ($t = sql_fetch($q, $serveur)) { |
|
| 1177 | - $r[] = array_shift($t); |
|
| 1178 | - } |
|
| 1179 | - } |
|
| 1180 | - |
|
| 1181 | - return $r; |
|
| 1173 | + $q = sql_showbase($spip, $serveur, $option); |
|
| 1174 | + $r = []; |
|
| 1175 | + if ($q) { |
|
| 1176 | + while ($t = sql_fetch($q, $serveur)) { |
|
| 1177 | + $r[] = array_shift($t); |
|
| 1178 | + } |
|
| 1179 | + } |
|
| 1180 | + |
|
| 1181 | + return $r; |
|
| 1182 | 1182 | } |
| 1183 | 1183 | |
| 1184 | 1184 | /** |
@@ -1211,31 +1211,31 @@ discard block |
||
| 1211 | 1211 | * - 'join' => array() // jointures, si déclarées. |
| 1212 | 1212 | **/ |
| 1213 | 1213 | function sql_showtable($table, $table_spip = false, $serveur = '', $option = true) { |
| 1214 | - $f = sql_serveur('showtable', $serveur, $option === 'continue' or $option === false); |
|
| 1215 | - if (!is_string($f) or !$f) { |
|
| 1216 | - return false; |
|
| 1217 | - } |
|
| 1218 | - |
|
| 1219 | - // la globale n'est remplie qu'apres l'appel de sql_serveur. |
|
| 1220 | - if ($table_spip) { |
|
| 1221 | - $connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; |
|
| 1222 | - $prefixe = $connexion['prefixe']; |
|
| 1223 | - $vraie_table = prefixer_table_spip($table, $prefixe); |
|
| 1224 | - } else { |
|
| 1225 | - $vraie_table = $table; |
|
| 1226 | - } |
|
| 1227 | - |
|
| 1228 | - $f = $f($vraie_table, $serveur, $option !== false); |
|
| 1229 | - if (!$f) { |
|
| 1230 | - return []; |
|
| 1231 | - } |
|
| 1232 | - if (isset($GLOBALS['tables_principales'][$table]['join'])) { |
|
| 1233 | - $f['join'] = $GLOBALS['tables_principales'][$table]['join']; |
|
| 1234 | - } elseif (isset($GLOBALS['tables_auxiliaires'][$table]['join'])) { |
|
| 1235 | - $f['join'] = $GLOBALS['tables_auxiliaires'][$table]['join']; |
|
| 1236 | - } |
|
| 1237 | - |
|
| 1238 | - return $f; |
|
| 1214 | + $f = sql_serveur('showtable', $serveur, $option === 'continue' or $option === false); |
|
| 1215 | + if (!is_string($f) or !$f) { |
|
| 1216 | + return false; |
|
| 1217 | + } |
|
| 1218 | + |
|
| 1219 | + // la globale n'est remplie qu'apres l'appel de sql_serveur. |
|
| 1220 | + if ($table_spip) { |
|
| 1221 | + $connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; |
|
| 1222 | + $prefixe = $connexion['prefixe']; |
|
| 1223 | + $vraie_table = prefixer_table_spip($table, $prefixe); |
|
| 1224 | + } else { |
|
| 1225 | + $vraie_table = $table; |
|
| 1226 | + } |
|
| 1227 | + |
|
| 1228 | + $f = $f($vraie_table, $serveur, $option !== false); |
|
| 1229 | + if (!$f) { |
|
| 1230 | + return []; |
|
| 1231 | + } |
|
| 1232 | + if (isset($GLOBALS['tables_principales'][$table]['join'])) { |
|
| 1233 | + $f['join'] = $GLOBALS['tables_principales'][$table]['join']; |
|
| 1234 | + } elseif (isset($GLOBALS['tables_auxiliaires'][$table]['join'])) { |
|
| 1235 | + $f['join'] = $GLOBALS['tables_auxiliaires'][$table]['join']; |
|
| 1236 | + } |
|
| 1237 | + |
|
| 1238 | + return $f; |
|
| 1239 | 1239 | } |
| 1240 | 1240 | |
| 1241 | 1241 | |
@@ -1263,21 +1263,21 @@ discard block |
||
| 1263 | 1263 | * - False en cas d'erreur. |
| 1264 | 1264 | **/ |
| 1265 | 1265 | function sql_table_exists(string $table, bool $table_spip = true, $serveur = '', $option = true) { |
| 1266 | - $f = sql_serveur('table_exists', $serveur, $option === 'continue' or $option === false); |
|
| 1267 | - if (!is_string($f) or !$f) { |
|
| 1268 | - return false; |
|
| 1269 | - } |
|
| 1270 | - |
|
| 1271 | - // la globale n'est remplie qu'apres l'appel de sql_serveur. |
|
| 1272 | - if ($table_spip) { |
|
| 1273 | - $connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; |
|
| 1274 | - $prefixe = $connexion['prefixe']; |
|
| 1275 | - $vraie_table = prefixer_table_spip($table, $prefixe); |
|
| 1276 | - } else { |
|
| 1277 | - $vraie_table = $table; |
|
| 1278 | - } |
|
| 1279 | - |
|
| 1280 | - return $f($vraie_table, $serveur, $option !== false); |
|
| 1266 | + $f = sql_serveur('table_exists', $serveur, $option === 'continue' or $option === false); |
|
| 1267 | + if (!is_string($f) or !$f) { |
|
| 1268 | + return false; |
|
| 1269 | + } |
|
| 1270 | + |
|
| 1271 | + // la globale n'est remplie qu'apres l'appel de sql_serveur. |
|
| 1272 | + if ($table_spip) { |
|
| 1273 | + $connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; |
|
| 1274 | + $prefixe = $connexion['prefixe']; |
|
| 1275 | + $vraie_table = prefixer_table_spip($table, $prefixe); |
|
| 1276 | + } else { |
|
| 1277 | + $vraie_table = $table; |
|
| 1278 | + } |
|
| 1279 | + |
|
| 1280 | + return $f($vraie_table, $serveur, $option !== false); |
|
| 1281 | 1281 | } |
| 1282 | 1282 | |
| 1283 | 1283 | |
@@ -1323,24 +1323,24 @@ discard block |
||
| 1323 | 1323 | * true si succès, false en cas d'echec |
| 1324 | 1324 | **/ |
| 1325 | 1325 | function sql_create( |
| 1326 | - $nom, |
|
| 1327 | - $champs, |
|
| 1328 | - $cles = [], |
|
| 1329 | - $autoinc = false, |
|
| 1330 | - $temporary = false, |
|
| 1331 | - $serveur = '', |
|
| 1332 | - $option = true |
|
| 1326 | + $nom, |
|
| 1327 | + $champs, |
|
| 1328 | + $cles = [], |
|
| 1329 | + $autoinc = false, |
|
| 1330 | + $temporary = false, |
|
| 1331 | + $serveur = '', |
|
| 1332 | + $option = true |
|
| 1333 | 1333 | ) { |
| 1334 | - $f = sql_serveur('create', $serveur, $option === 'continue' or $option === false); |
|
| 1335 | - if (!is_string($f) or !$f) { |
|
| 1336 | - return false; |
|
| 1337 | - } |
|
| 1338 | - $r = $f($nom, $champs, $cles, $autoinc, $temporary, $serveur, $option !== false); |
|
| 1339 | - if ($r === false) { |
|
| 1340 | - spip_sql_erreur($serveur); |
|
| 1341 | - } |
|
| 1342 | - |
|
| 1343 | - return $r; |
|
| 1334 | + $f = sql_serveur('create', $serveur, $option === 'continue' or $option === false); |
|
| 1335 | + if (!is_string($f) or !$f) { |
|
| 1336 | + return false; |
|
| 1337 | + } |
|
| 1338 | + $r = $f($nom, $champs, $cles, $autoinc, $temporary, $serveur, $option !== false); |
|
| 1339 | + if ($r === false) { |
|
| 1340 | + spip_sql_erreur($serveur); |
|
| 1341 | + } |
|
| 1342 | + |
|
| 1343 | + return $r; |
|
| 1344 | 1344 | } |
| 1345 | 1345 | |
| 1346 | 1346 | /** |
@@ -1358,16 +1358,16 @@ discard block |
||
| 1358 | 1358 | * @return bool true si la base est créee. |
| 1359 | 1359 | **/ |
| 1360 | 1360 | function sql_create_base($nom, $serveur = '', $option = true) { |
| 1361 | - $f = sql_serveur('create_base', $serveur, $option === 'continue' or $option === false); |
|
| 1362 | - if (!is_string($f) or !$f) { |
|
| 1363 | - return false; |
|
| 1364 | - } |
|
| 1365 | - $r = $f($nom, $serveur, $option !== false); |
|
| 1366 | - if ($r === false) { |
|
| 1367 | - spip_sql_erreur($serveur); |
|
| 1368 | - } |
|
| 1369 | - |
|
| 1370 | - return $r; |
|
| 1361 | + $f = sql_serveur('create_base', $serveur, $option === 'continue' or $option === false); |
|
| 1362 | + if (!is_string($f) or !$f) { |
|
| 1363 | + return false; |
|
| 1364 | + } |
|
| 1365 | + $r = $f($nom, $serveur, $option !== false); |
|
| 1366 | + if ($r === false) { |
|
| 1367 | + spip_sql_erreur($serveur); |
|
| 1368 | + } |
|
| 1369 | + |
|
| 1370 | + return $r; |
|
| 1371 | 1371 | } |
| 1372 | 1372 | |
| 1373 | 1373 | |
@@ -1397,16 +1397,16 @@ discard block |
||
| 1397 | 1397 | * - false en cas d'échec. |
| 1398 | 1398 | **/ |
| 1399 | 1399 | function sql_create_view($nom, $select_query, $serveur = '', $option = true) { |
| 1400 | - $f = sql_serveur('create_view', $serveur, $option === 'continue' or $option === false); |
|
| 1401 | - if (!is_string($f) or !$f) { |
|
| 1402 | - return false; |
|
| 1403 | - } |
|
| 1404 | - $r = $f($nom, $select_query, $serveur, $option !== false); |
|
| 1405 | - if ($r === false) { |
|
| 1406 | - spip_sql_erreur($serveur); |
|
| 1407 | - } |
|
| 1408 | - |
|
| 1409 | - return $r; |
|
| 1400 | + $f = sql_serveur('create_view', $serveur, $option === 'continue' or $option === false); |
|
| 1401 | + if (!is_string($f) or !$f) { |
|
| 1402 | + return false; |
|
| 1403 | + } |
|
| 1404 | + $r = $f($nom, $select_query, $serveur, $option !== false); |
|
| 1405 | + if ($r === false) { |
|
| 1406 | + spip_sql_erreur($serveur); |
|
| 1407 | + } |
|
| 1408 | + |
|
| 1409 | + return $r; |
|
| 1410 | 1410 | } |
| 1411 | 1411 | |
| 1412 | 1412 | /** |
@@ -1435,12 +1435,12 @@ discard block |
||
| 1435 | 1435 | * Texte de sélection pour la requête |
| 1436 | 1436 | */ |
| 1437 | 1437 | function sql_multi($sel, $lang, $serveur = '', $option = true) { |
| 1438 | - $f = sql_serveur('multi', $serveur, $option === 'continue' or $option === false); |
|
| 1439 | - if (!is_string($f) or !$f) { |
|
| 1440 | - return false; |
|
| 1441 | - } |
|
| 1438 | + $f = sql_serveur('multi', $serveur, $option === 'continue' or $option === false); |
|
| 1439 | + if (!is_string($f) or !$f) { |
|
| 1440 | + return false; |
|
| 1441 | + } |
|
| 1442 | 1442 | |
| 1443 | - return $f($sel, $lang); |
|
| 1443 | + return $f($sel, $lang); |
|
| 1444 | 1444 | } |
| 1445 | 1445 | |
| 1446 | 1446 | |
@@ -1455,12 +1455,12 @@ discard block |
||
| 1455 | 1455 | * False si le serveur est indisponible |
| 1456 | 1456 | */ |
| 1457 | 1457 | function sql_error($serveur = '') { |
| 1458 | - $f = sql_serveur('error', $serveur, true); |
|
| 1459 | - if (!is_string($f) or !$f) { |
|
| 1460 | - return false; |
|
| 1461 | - } |
|
| 1458 | + $f = sql_serveur('error', $serveur, true); |
|
| 1459 | + if (!is_string($f) or !$f) { |
|
| 1460 | + return false; |
|
| 1461 | + } |
|
| 1462 | 1462 | |
| 1463 | - return $f('query inconnue', $serveur); |
|
| 1463 | + return $f('query inconnue', $serveur); |
|
| 1464 | 1464 | } |
| 1465 | 1465 | |
| 1466 | 1466 | /** |
@@ -1474,12 +1474,12 @@ discard block |
||
| 1474 | 1474 | * False si le serveur est indisponible |
| 1475 | 1475 | */ |
| 1476 | 1476 | function sql_errno($serveur = '') { |
| 1477 | - $f = sql_serveur('errno', $serveur, true); |
|
| 1478 | - if (!is_string($f) or !$f) { |
|
| 1479 | - return false; |
|
| 1480 | - } |
|
| 1477 | + $f = sql_serveur('errno', $serveur, true); |
|
| 1478 | + if (!is_string($f) or !$f) { |
|
| 1479 | + return false; |
|
| 1480 | + } |
|
| 1481 | 1481 | |
| 1482 | - return $f($serveur); |
|
| 1482 | + return $f($serveur); |
|
| 1483 | 1483 | } |
| 1484 | 1484 | |
| 1485 | 1485 | /** |
@@ -1497,16 +1497,16 @@ discard block |
||
| 1497 | 1497 | * @return array|false Tableau de l'explication |
| 1498 | 1498 | */ |
| 1499 | 1499 | function sql_explain($q, $serveur = '', $option = true) { |
| 1500 | - $f = sql_serveur('explain', $serveur, true); |
|
| 1501 | - if (!is_string($f) or !$f) { |
|
| 1502 | - return false; |
|
| 1503 | - } |
|
| 1504 | - $r = $f($q, $serveur, $option !== false); |
|
| 1505 | - if ($r === false) { |
|
| 1506 | - spip_sql_erreur($serveur); |
|
| 1507 | - } |
|
| 1508 | - |
|
| 1509 | - return $r; |
|
| 1500 | + $f = sql_serveur('explain', $serveur, true); |
|
| 1501 | + if (!is_string($f) or !$f) { |
|
| 1502 | + return false; |
|
| 1503 | + } |
|
| 1504 | + $r = $f($q, $serveur, $option !== false); |
|
| 1505 | + if ($r === false) { |
|
| 1506 | + spip_sql_erreur($serveur); |
|
| 1507 | + } |
|
| 1508 | + |
|
| 1509 | + return $r; |
|
| 1510 | 1510 | } |
| 1511 | 1511 | |
| 1512 | 1512 | /** |
@@ -1524,16 +1524,16 @@ discard block |
||
| 1524 | 1524 | * @return bool Toujours true |
| 1525 | 1525 | */ |
| 1526 | 1526 | function sql_optimize($table, $serveur = '', $option = true) { |
| 1527 | - $f = sql_serveur('optimize', $serveur, $option === 'continue' or $option === false); |
|
| 1528 | - if (!is_string($f) or !$f) { |
|
| 1529 | - return false; |
|
| 1530 | - } |
|
| 1531 | - $r = $f($table, $serveur, $option !== false); |
|
| 1532 | - if ($r === false) { |
|
| 1533 | - spip_sql_erreur($serveur); |
|
| 1534 | - } |
|
| 1535 | - |
|
| 1536 | - return $r; |
|
| 1527 | + $f = sql_serveur('optimize', $serveur, $option === 'continue' or $option === false); |
|
| 1528 | + if (!is_string($f) or !$f) { |
|
| 1529 | + return false; |
|
| 1530 | + } |
|
| 1531 | + $r = $f($table, $serveur, $option !== false); |
|
| 1532 | + if ($r === false) { |
|
| 1533 | + spip_sql_erreur($serveur); |
|
| 1534 | + } |
|
| 1535 | + |
|
| 1536 | + return $r; |
|
| 1537 | 1537 | } |
| 1538 | 1538 | |
| 1539 | 1539 | /** |
@@ -1553,16 +1553,16 @@ discard block |
||
| 1553 | 1553 | * - true si la requête a réussie, false sinon |
| 1554 | 1554 | */ |
| 1555 | 1555 | function sql_repair($table, $serveur = '', $option = true) { |
| 1556 | - $f = sql_serveur('repair', $serveur, $option === 'continue' or $option === false); |
|
| 1557 | - if (!is_string($f) or !$f) { |
|
| 1558 | - return false; |
|
| 1559 | - } |
|
| 1560 | - $r = $f($table, $serveur, $option !== false); |
|
| 1561 | - if ($r === false) { |
|
| 1562 | - spip_sql_erreur($serveur); |
|
| 1563 | - } |
|
| 1564 | - |
|
| 1565 | - return $r; |
|
| 1556 | + $f = sql_serveur('repair', $serveur, $option === 'continue' or $option === false); |
|
| 1557 | + if (!is_string($f) or !$f) { |
|
| 1558 | + return false; |
|
| 1559 | + } |
|
| 1560 | + $r = $f($table, $serveur, $option !== false); |
|
| 1561 | + if ($r === false) { |
|
| 1562 | + spip_sql_erreur($serveur); |
|
| 1563 | + } |
|
| 1564 | + |
|
| 1565 | + return $r; |
|
| 1566 | 1566 | } |
| 1567 | 1567 | |
| 1568 | 1568 | |
@@ -1587,16 +1587,16 @@ discard block |
||
| 1587 | 1587 | * - array : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer. |
| 1588 | 1588 | */ |
| 1589 | 1589 | function sql_query($ins, $serveur = '', $option = true) { |
| 1590 | - $f = sql_serveur('query', $serveur, $option === 'continue' or $option === false); |
|
| 1591 | - if (!is_string($f) or !$f) { |
|
| 1592 | - return false; |
|
| 1593 | - } |
|
| 1594 | - $r = $f($ins, $serveur, $option !== false); |
|
| 1595 | - if ($r === false) { |
|
| 1596 | - spip_sql_erreur($serveur); |
|
| 1597 | - } |
|
| 1598 | - |
|
| 1599 | - return $r; |
|
| 1590 | + $f = sql_serveur('query', $serveur, $option === 'continue' or $option === false); |
|
| 1591 | + if (!is_string($f) or !$f) { |
|
| 1592 | + return false; |
|
| 1593 | + } |
|
| 1594 | + $r = $f($ins, $serveur, $option !== false); |
|
| 1595 | + if ($r === false) { |
|
| 1596 | + spip_sql_erreur($serveur); |
|
| 1597 | + } |
|
| 1598 | + |
|
| 1599 | + return $r; |
|
| 1600 | 1600 | } |
| 1601 | 1601 | |
| 1602 | 1602 | /** |
@@ -1644,27 +1644,27 @@ discard block |
||
| 1644 | 1644 | * |
| 1645 | 1645 | **/ |
| 1646 | 1646 | function sql_fetsel( |
| 1647 | - $select = [], |
|
| 1648 | - $from = [], |
|
| 1649 | - $where = [], |
|
| 1650 | - $groupby = [], |
|
| 1651 | - $orderby = [], |
|
| 1652 | - $limit = '', |
|
| 1653 | - $having = [], |
|
| 1654 | - $serveur = '', |
|
| 1655 | - $option = true |
|
| 1647 | + $select = [], |
|
| 1648 | + $from = [], |
|
| 1649 | + $where = [], |
|
| 1650 | + $groupby = [], |
|
| 1651 | + $orderby = [], |
|
| 1652 | + $limit = '', |
|
| 1653 | + $having = [], |
|
| 1654 | + $serveur = '', |
|
| 1655 | + $option = true |
|
| 1656 | 1656 | ) { |
| 1657 | - $q = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option); |
|
| 1658 | - if ($option === false) { |
|
| 1659 | - return $q; |
|
| 1660 | - } |
|
| 1661 | - if (!$q) { |
|
| 1662 | - return []; |
|
| 1663 | - } |
|
| 1664 | - $r = sql_fetch($q, $serveur, $option); |
|
| 1665 | - sql_free($q, $serveur, $option); |
|
| 1666 | - |
|
| 1667 | - return $r; |
|
| 1657 | + $q = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option); |
|
| 1658 | + if ($option === false) { |
|
| 1659 | + return $q; |
|
| 1660 | + } |
|
| 1661 | + if (!$q) { |
|
| 1662 | + return []; |
|
| 1663 | + } |
|
| 1664 | + $r = sql_fetch($q, $serveur, $option); |
|
| 1665 | + sql_free($q, $serveur, $option); |
|
| 1666 | + |
|
| 1667 | + return $r; |
|
| 1668 | 1668 | } |
| 1669 | 1669 | |
| 1670 | 1670 | |
@@ -1721,22 +1721,22 @@ discard block |
||
| 1721 | 1721 | * |
| 1722 | 1722 | **/ |
| 1723 | 1723 | function sql_allfetsel( |
| 1724 | - $select = [], |
|
| 1725 | - $from = [], |
|
| 1726 | - $where = [], |
|
| 1727 | - $groupby = [], |
|
| 1728 | - $orderby = [], |
|
| 1729 | - $limit = '', |
|
| 1730 | - $having = [], |
|
| 1731 | - $serveur = '', |
|
| 1732 | - $option = true |
|
| 1724 | + $select = [], |
|
| 1725 | + $from = [], |
|
| 1726 | + $where = [], |
|
| 1727 | + $groupby = [], |
|
| 1728 | + $orderby = [], |
|
| 1729 | + $limit = '', |
|
| 1730 | + $having = [], |
|
| 1731 | + $serveur = '', |
|
| 1732 | + $option = true |
|
| 1733 | 1733 | ) { |
| 1734 | - $q = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option); |
|
| 1735 | - if ($option === false) { |
|
| 1736 | - return $q; |
|
| 1737 | - } |
|
| 1734 | + $q = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option); |
|
| 1735 | + if ($option === false) { |
|
| 1736 | + return $q; |
|
| 1737 | + } |
|
| 1738 | 1738 | |
| 1739 | - return sql_fetch_all($q, $serveur, $option); |
|
| 1739 | + return sql_fetch_all($q, $serveur, $option); |
|
| 1740 | 1740 | } |
| 1741 | 1741 | |
| 1742 | 1742 | |
@@ -1783,33 +1783,33 @@ discard block |
||
| 1783 | 1783 | * |
| 1784 | 1784 | **/ |
| 1785 | 1785 | function sql_getfetsel( |
| 1786 | - $select, |
|
| 1787 | - $from = [], |
|
| 1788 | - $where = [], |
|
| 1789 | - $groupby = [], |
|
| 1790 | - $orderby = [], |
|
| 1791 | - $limit = '', |
|
| 1792 | - $having = [], |
|
| 1793 | - $serveur = '', |
|
| 1794 | - $option = true |
|
| 1786 | + $select, |
|
| 1787 | + $from = [], |
|
| 1788 | + $where = [], |
|
| 1789 | + $groupby = [], |
|
| 1790 | + $orderby = [], |
|
| 1791 | + $limit = '', |
|
| 1792 | + $having = [], |
|
| 1793 | + $serveur = '', |
|
| 1794 | + $option = true |
|
| 1795 | 1795 | ) { |
| 1796 | - if (preg_match('/\s+as\s+(\w+)$/i', $select, $c)) { |
|
| 1797 | - $id = $c[1]; |
|
| 1798 | - } elseif (!preg_match('/\W/', $select)) { |
|
| 1799 | - $id = $select; |
|
| 1800 | - } else { |
|
| 1801 | - $id = 'n'; |
|
| 1802 | - $select .= ' AS n'; |
|
| 1803 | - } |
|
| 1804 | - $r = sql_fetsel($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option); |
|
| 1805 | - if ($option === false) { |
|
| 1806 | - return $r; |
|
| 1807 | - } |
|
| 1808 | - if (!$r) { |
|
| 1809 | - return null; |
|
| 1810 | - } |
|
| 1811 | - |
|
| 1812 | - return $r[$id]; |
|
| 1796 | + if (preg_match('/\s+as\s+(\w+)$/i', $select, $c)) { |
|
| 1797 | + $id = $c[1]; |
|
| 1798 | + } elseif (!preg_match('/\W/', $select)) { |
|
| 1799 | + $id = $select; |
|
| 1800 | + } else { |
|
| 1801 | + $id = 'n'; |
|
| 1802 | + $select .= ' AS n'; |
|
| 1803 | + } |
|
| 1804 | + $r = sql_fetsel($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option); |
|
| 1805 | + if ($option === false) { |
|
| 1806 | + return $r; |
|
| 1807 | + } |
|
| 1808 | + if (!$r) { |
|
| 1809 | + return null; |
|
| 1810 | + } |
|
| 1811 | + |
|
| 1812 | + return $r[$id]; |
|
| 1813 | 1813 | } |
| 1814 | 1814 | |
| 1815 | 1815 | /** |
@@ -1827,9 +1827,9 @@ discard block |
||
| 1827 | 1827 | * Numero de version du serveur SQL |
| 1828 | 1828 | **/ |
| 1829 | 1829 | function sql_version($serveur = '', $option = true) { |
| 1830 | - $row = sql_fetsel('version() AS n', '', '', '', '', '', '', $serveur); |
|
| 1830 | + $row = sql_fetsel('version() AS n', '', '', '', '', '', '', $serveur); |
|
| 1831 | 1831 | |
| 1832 | - return ($row['n']); |
|
| 1832 | + return ($row['n']); |
|
| 1833 | 1833 | } |
| 1834 | 1834 | |
| 1835 | 1835 | /** |
@@ -1865,16 +1865,16 @@ discard block |
||
| 1865 | 1865 | * Le serveur SQL prefere t'il des transactions pour les insertions multiples ? |
| 1866 | 1866 | **/ |
| 1867 | 1867 | function sql_preferer_transaction($serveur = '', $option = true) { |
| 1868 | - $f = sql_serveur('preferer_transaction', $serveur, true); |
|
| 1869 | - if (!is_string($f) or !$f) { |
|
| 1870 | - return false; |
|
| 1871 | - } |
|
| 1872 | - $r = $f($serveur, $option !== false); |
|
| 1873 | - if ($r === false) { |
|
| 1874 | - spip_sql_erreur($serveur); |
|
| 1875 | - } |
|
| 1876 | - |
|
| 1877 | - return $r; |
|
| 1868 | + $f = sql_serveur('preferer_transaction', $serveur, true); |
|
| 1869 | + if (!is_string($f) or !$f) { |
|
| 1870 | + return false; |
|
| 1871 | + } |
|
| 1872 | + $r = $f($serveur, $option !== false); |
|
| 1873 | + if ($r === false) { |
|
| 1874 | + spip_sql_erreur($serveur); |
|
| 1875 | + } |
|
| 1876 | + |
|
| 1877 | + return $r; |
|
| 1878 | 1878 | } |
| 1879 | 1879 | |
| 1880 | 1880 | ; |
@@ -1899,16 +1899,16 @@ discard block |
||
| 1899 | 1899 | * false en cas d'erreur |
| 1900 | 1900 | **/ |
| 1901 | 1901 | function sql_demarrer_transaction($serveur = '', $option = true) { |
| 1902 | - $f = sql_serveur('demarrer_transaction', $serveur, true); |
|
| 1903 | - if (!is_string($f) or !$f) { |
|
| 1904 | - return false; |
|
| 1905 | - } |
|
| 1906 | - $r = $f($serveur, $option !== false); |
|
| 1907 | - if ($r === false) { |
|
| 1908 | - spip_sql_erreur($serveur); |
|
| 1909 | - } |
|
| 1910 | - |
|
| 1911 | - return $r; |
|
| 1902 | + $f = sql_serveur('demarrer_transaction', $serveur, true); |
|
| 1903 | + if (!is_string($f) or !$f) { |
|
| 1904 | + return false; |
|
| 1905 | + } |
|
| 1906 | + $r = $f($serveur, $option !== false); |
|
| 1907 | + if ($r === false) { |
|
| 1908 | + spip_sql_erreur($serveur); |
|
| 1909 | + } |
|
| 1910 | + |
|
| 1911 | + return $r; |
|
| 1912 | 1912 | } |
| 1913 | 1913 | |
| 1914 | 1914 | ; |
@@ -1933,16 +1933,16 @@ discard block |
||
| 1933 | 1933 | * false en cas d'erreur |
| 1934 | 1934 | **/ |
| 1935 | 1935 | function sql_terminer_transaction($serveur = '', $option = true) { |
| 1936 | - $f = sql_serveur('terminer_transaction', $serveur, true); |
|
| 1937 | - if (!is_string($f) or !$f) { |
|
| 1938 | - return false; |
|
| 1939 | - } |
|
| 1940 | - $r = $f($serveur, $option !== false); |
|
| 1941 | - if ($r === false) { |
|
| 1942 | - spip_sql_erreur($serveur); |
|
| 1943 | - } |
|
| 1944 | - |
|
| 1945 | - return $r; |
|
| 1936 | + $f = sql_serveur('terminer_transaction', $serveur, true); |
|
| 1937 | + if (!is_string($f) or !$f) { |
|
| 1938 | + return false; |
|
| 1939 | + } |
|
| 1940 | + $r = $f($serveur, $option !== false); |
|
| 1941 | + if ($r === false) { |
|
| 1942 | + spip_sql_erreur($serveur); |
|
| 1943 | + } |
|
| 1944 | + |
|
| 1945 | + return $r; |
|
| 1946 | 1946 | } |
| 1947 | 1947 | |
| 1948 | 1948 | ; |
@@ -1969,12 +1969,12 @@ discard block |
||
| 1969 | 1969 | * Valeur hexadécimale attendue par le serveur SQL |
| 1970 | 1970 | **/ |
| 1971 | 1971 | function sql_hex($val, $serveur = '', $option = true) { |
| 1972 | - $f = sql_serveur('hex', $serveur, $option === 'continue' or $option === false); |
|
| 1973 | - if (!is_string($f) or !$f) { |
|
| 1974 | - return false; |
|
| 1975 | - } |
|
| 1972 | + $f = sql_serveur('hex', $serveur, $option === 'continue' or $option === false); |
|
| 1973 | + if (!is_string($f) or !$f) { |
|
| 1974 | + return false; |
|
| 1975 | + } |
|
| 1976 | 1976 | |
| 1977 | - return $f($val); |
|
| 1977 | + return $f($val); |
|
| 1978 | 1978 | } |
| 1979 | 1979 | |
| 1980 | 1980 | /** |
@@ -2000,12 +2000,12 @@ discard block |
||
| 2000 | 2000 | * La chaine echappee |
| 2001 | 2001 | **/ |
| 2002 | 2002 | function sql_quote($val, $serveur = '', $type = '') { |
| 2003 | - $f = sql_serveur('quote', $serveur, true); |
|
| 2004 | - if (!is_string($f) or !$f) { |
|
| 2005 | - $f = '_q'; |
|
| 2006 | - } |
|
| 2003 | + $f = sql_serveur('quote', $serveur, true); |
|
| 2004 | + if (!is_string($f) or !$f) { |
|
| 2005 | + $f = '_q'; |
|
| 2006 | + } |
|
| 2007 | 2007 | |
| 2008 | - return $f($val, $type); |
|
| 2008 | + return $f($val, $type); |
|
| 2009 | 2009 | } |
| 2010 | 2010 | |
| 2011 | 2011 | /** |
@@ -2030,12 +2030,12 @@ discard block |
||
| 2030 | 2030 | * - false si le serveur SQL est indisponible |
| 2031 | 2031 | **/ |
| 2032 | 2032 | function sql_date_proche($champ, $interval, $unite, $serveur = '', $option = true) { |
| 2033 | - $f = sql_serveur('date_proche', $serveur, true); |
|
| 2034 | - if (!is_string($f) or !$f) { |
|
| 2035 | - return false; |
|
| 2036 | - } |
|
| 2033 | + $f = sql_serveur('date_proche', $serveur, true); |
|
| 2034 | + if (!is_string($f) or !$f) { |
|
| 2035 | + return false; |
|
| 2036 | + } |
|
| 2037 | 2037 | |
| 2038 | - return $f($champ, $interval, $unite); |
|
| 2038 | + return $f($champ, $interval, $unite); |
|
| 2039 | 2039 | } |
| 2040 | 2040 | |
| 2041 | 2041 | /** |
@@ -2071,26 +2071,26 @@ discard block |
||
| 2071 | 2071 | * Expression de requête SQL |
| 2072 | 2072 | **/ |
| 2073 | 2073 | function sql_in_quote($champ, $valeurs, $not = '', $serveur = '', $type = '', $option = true) { |
| 2074 | - $quote = sql_serveur('quote', $serveur, true); |
|
| 2075 | - if (!is_string($quote) or !$quote) { |
|
| 2076 | - return false; |
|
| 2077 | - } |
|
| 2078 | - |
|
| 2079 | - // sql_quote produit une chaine dans tous les cas |
|
| 2080 | - $valeurs = array_filter($valeurs, fn($v) => !is_array($v)); |
|
| 2081 | - $valeurs = array_unique($valeurs); |
|
| 2082 | - $valeurs = $quote($valeurs, $type); |
|
| 2083 | - |
|
| 2084 | - if (!strlen(trim($valeurs))) { |
|
| 2085 | - return ($not ? '0=0' : '0=1'); |
|
| 2086 | - } |
|
| 2087 | - |
|
| 2088 | - $f = sql_serveur('in', $serveur, $option === 'continue' or $option === false); |
|
| 2089 | - if (!is_string($f) or !$f) { |
|
| 2090 | - return false; |
|
| 2091 | - } |
|
| 2092 | - |
|
| 2093 | - return $f($champ, $valeurs, $not ? 'NOT' : '', $serveur, $option !== false); |
|
| 2074 | + $quote = sql_serveur('quote', $serveur, true); |
|
| 2075 | + if (!is_string($quote) or !$quote) { |
|
| 2076 | + return false; |
|
| 2077 | + } |
|
| 2078 | + |
|
| 2079 | + // sql_quote produit une chaine dans tous les cas |
|
| 2080 | + $valeurs = array_filter($valeurs, fn($v) => !is_array($v)); |
|
| 2081 | + $valeurs = array_unique($valeurs); |
|
| 2082 | + $valeurs = $quote($valeurs, $type); |
|
| 2083 | + |
|
| 2084 | + if (!strlen(trim($valeurs))) { |
|
| 2085 | + return ($not ? '0=0' : '0=1'); |
|
| 2086 | + } |
|
| 2087 | + |
|
| 2088 | + $f = sql_serveur('in', $serveur, $option === 'continue' or $option === false); |
|
| 2089 | + if (!is_string($f) or !$f) { |
|
| 2090 | + return false; |
|
| 2091 | + } |
|
| 2092 | + |
|
| 2093 | + return $f($champ, $valeurs, $not ? 'NOT' : '', $serveur, $option !== false); |
|
| 2094 | 2094 | } |
| 2095 | 2095 | |
| 2096 | 2096 | /** |
@@ -2107,19 +2107,19 @@ discard block |
||
| 2107 | 2107 | * @param bool $option |
| 2108 | 2108 | */ |
| 2109 | 2109 | function sql_in($champ, $valeurs, $not = '', $serveur = '', $option = true) { |
| 2110 | - $type = ''; |
|
| 2111 | - if (!is_array($valeurs)) { |
|
| 2112 | - $valeurs = strval($valeurs); |
|
| 2113 | - if (isset($valeurs[0]) and $valeurs[0] === ',') { |
|
| 2114 | - $valeurs = substr($valeurs, 1); |
|
| 2115 | - } |
|
| 2116 | - // on explode en tableau pour pouvoir securiser le contenu |
|
| 2117 | - $valeurs = explode(',', $valeurs); |
|
| 2118 | - // et on force un cast de type int donc |
|
| 2119 | - $type = 'int'; |
|
| 2120 | - } |
|
| 2121 | - |
|
| 2122 | - return sql_in_quote($champ, $valeurs, $not, $serveur, $type, $option); |
|
| 2110 | + $type = ''; |
|
| 2111 | + if (!is_array($valeurs)) { |
|
| 2112 | + $valeurs = strval($valeurs); |
|
| 2113 | + if (isset($valeurs[0]) and $valeurs[0] === ',') { |
|
| 2114 | + $valeurs = substr($valeurs, 1); |
|
| 2115 | + } |
|
| 2116 | + // on explode en tableau pour pouvoir securiser le contenu |
|
| 2117 | + $valeurs = explode(',', $valeurs); |
|
| 2118 | + // et on force un cast de type int donc |
|
| 2119 | + $type = 'int'; |
|
| 2120 | + } |
|
| 2121 | + |
|
| 2122 | + return sql_in_quote($champ, $valeurs, $not, $serveur, $type, $option); |
|
| 2123 | 2123 | } |
| 2124 | 2124 | |
| 2125 | 2125 | |
@@ -2160,24 +2160,24 @@ discard block |
||
| 2160 | 2160 | * Expression de requête SQL |
| 2161 | 2161 | **/ |
| 2162 | 2162 | function sql_in_select( |
| 2163 | - $in, |
|
| 2164 | - $select, |
|
| 2165 | - $from = [], |
|
| 2166 | - $where = [], |
|
| 2167 | - $groupby = [], |
|
| 2168 | - $orderby = [], |
|
| 2169 | - $limit = '', |
|
| 2170 | - $having = [], |
|
| 2171 | - $serveur = '' |
|
| 2163 | + $in, |
|
| 2164 | + $select, |
|
| 2165 | + $from = [], |
|
| 2166 | + $where = [], |
|
| 2167 | + $groupby = [], |
|
| 2168 | + $orderby = [], |
|
| 2169 | + $limit = '', |
|
| 2170 | + $having = [], |
|
| 2171 | + $serveur = '' |
|
| 2172 | 2172 | ) { |
| 2173 | - $liste = []; |
|
| 2174 | - $res = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur); |
|
| 2175 | - while ($r = sql_fetch($res)) { |
|
| 2176 | - $liste[] = array_shift($r); |
|
| 2177 | - } |
|
| 2178 | - sql_free($res); |
|
| 2179 | - |
|
| 2180 | - return sql_in($in, $liste); |
|
| 2173 | + $liste = []; |
|
| 2174 | + $res = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur); |
|
| 2175 | + while ($r = sql_fetch($res)) { |
|
| 2176 | + $liste[] = array_shift($r); |
|
| 2177 | + } |
|
| 2178 | + sql_free($res); |
|
| 2179 | + |
|
| 2180 | + return sql_in($in, $liste); |
|
| 2181 | 2181 | } |
| 2182 | 2182 | |
| 2183 | 2183 | /** |
@@ -2209,29 +2209,29 @@ discard block |
||
| 2209 | 2209 | * Position apres le saut. |
| 2210 | 2210 | */ |
| 2211 | 2211 | function sql_skip($res, $pos, $saut, $count, $serveur = '', $option = true) { |
| 2212 | - // pas de saut en arriere qu'on ne sait pas faire sans sql_seek |
|
| 2213 | - if (($saut = intval($saut)) <= 0) { |
|
| 2214 | - return $pos; |
|
| 2215 | - } |
|
| 2216 | - |
|
| 2217 | - $seek = $pos + $saut; |
|
| 2218 | - // si le saut fait depasser le maxi, on libere la resource |
|
| 2219 | - // et on sort |
|
| 2220 | - if ($seek >= $count) { |
|
| 2221 | - sql_free($res, $serveur, $option); |
|
| 2222 | - |
|
| 2223 | - return $count; |
|
| 2224 | - } |
|
| 2225 | - |
|
| 2226 | - if (sql_seek($res, $seek)) { |
|
| 2227 | - $pos = $seek; |
|
| 2228 | - } else { |
|
| 2229 | - while ($pos < $seek and sql_fetch($res, $serveur, $option)) { |
|
| 2230 | - $pos++; |
|
| 2231 | - } |
|
| 2232 | - } |
|
| 2233 | - |
|
| 2234 | - return $pos; |
|
| 2212 | + // pas de saut en arriere qu'on ne sait pas faire sans sql_seek |
|
| 2213 | + if (($saut = intval($saut)) <= 0) { |
|
| 2214 | + return $pos; |
|
| 2215 | + } |
|
| 2216 | + |
|
| 2217 | + $seek = $pos + $saut; |
|
| 2218 | + // si le saut fait depasser le maxi, on libere la resource |
|
| 2219 | + // et on sort |
|
| 2220 | + if ($seek >= $count) { |
|
| 2221 | + sql_free($res, $serveur, $option); |
|
| 2222 | + |
|
| 2223 | + return $count; |
|
| 2224 | + } |
|
| 2225 | + |
|
| 2226 | + if (sql_seek($res, $seek)) { |
|
| 2227 | + $pos = $seek; |
|
| 2228 | + } else { |
|
| 2229 | + while ($pos < $seek and sql_fetch($res, $serveur, $option)) { |
|
| 2230 | + $pos++; |
|
| 2231 | + } |
|
| 2232 | + } |
|
| 2233 | + |
|
| 2234 | + return $pos; |
|
| 2235 | 2235 | } |
| 2236 | 2236 | |
| 2237 | 2237 | |
@@ -2251,7 +2251,7 @@ discard block |
||
| 2251 | 2251 | * True si le champ est de type entier |
| 2252 | 2252 | */ |
| 2253 | 2253 | function sql_test_int($type, $serveur = '', $option = true) { |
| 2254 | - return preg_match('/^(TINYINT|SMALLINT|MEDIUMINT|INT|INTEGER|BIGINT)/i', trim($type)); |
|
| 2254 | + return preg_match('/^(TINYINT|SMALLINT|MEDIUMINT|INT|INTEGER|BIGINT)/i', trim($type)); |
|
| 2255 | 2255 | } |
| 2256 | 2256 | |
| 2257 | 2257 | /** |
@@ -2270,7 +2270,7 @@ discard block |
||
| 2270 | 2270 | * True si le champ est de type entier |
| 2271 | 2271 | */ |
| 2272 | 2272 | function sql_test_date($type, $serveur = '', $option = true) { |
| 2273 | - return preg_match('/^(DATE|DATETIME|TIMESTAMP|TIME)/i', trim($type)); |
|
| 2273 | + return preg_match('/^(DATE|DATETIME|TIMESTAMP|TIME)/i', trim($type)); |
|
| 2274 | 2274 | } |
| 2275 | 2275 | |
| 2276 | 2276 | /** |
@@ -2292,19 +2292,19 @@ discard block |
||
| 2292 | 2292 | * La date formatee |
| 2293 | 2293 | */ |
| 2294 | 2294 | function sql_format_date($annee = 0, $mois = 0, $jour = 0, $h = 0, $m = 0, $s = 0, $serveur = '') { |
| 2295 | - $annee = sprintf('%04s', $annee); |
|
| 2296 | - $mois = sprintf('%02s', $mois); |
|
| 2297 | - |
|
| 2298 | - if ($annee == '0000') { |
|
| 2299 | - $mois = 0; |
|
| 2300 | - } |
|
| 2301 | - if ($mois == '00') { |
|
| 2302 | - $jour = 0; |
|
| 2303 | - } |
|
| 2304 | - |
|
| 2305 | - return sprintf('%04u', $annee) . '-' . sprintf('%02u', $mois) . '-' |
|
| 2306 | - . sprintf('%02u', $jour) . ' ' . sprintf('%02u', $h) . ':' |
|
| 2307 | - . sprintf('%02u', $m) . ':' . sprintf('%02u', $s); |
|
| 2295 | + $annee = sprintf('%04s', $annee); |
|
| 2296 | + $mois = sprintf('%02s', $mois); |
|
| 2297 | + |
|
| 2298 | + if ($annee == '0000') { |
|
| 2299 | + $mois = 0; |
|
| 2300 | + } |
|
| 2301 | + if ($mois == '00') { |
|
| 2302 | + $jour = 0; |
|
| 2303 | + } |
|
| 2304 | + |
|
| 2305 | + return sprintf('%04u', $annee) . '-' . sprintf('%02u', $mois) . '-' |
|
| 2306 | + . sprintf('%02u', $jour) . ' ' . sprintf('%02u', $h) . ':' |
|
| 2307 | + . sprintf('%02u', $m) . ':' . sprintf('%02u', $s); |
|
| 2308 | 2308 | } |
| 2309 | 2309 | |
| 2310 | 2310 | |
@@ -2327,32 +2327,32 @@ discard block |
||
| 2327 | 2327 | **/ |
| 2328 | 2328 | function description_table($nom, $serveur = '') { |
| 2329 | 2329 | |
| 2330 | - static $trouver_table; |
|
| 2330 | + static $trouver_table; |
|
| 2331 | 2331 | |
| 2332 | - /* toujours utiliser trouver_table |
|
| 2332 | + /* toujours utiliser trouver_table |
|
| 2333 | 2333 | qui renverra la description theorique |
| 2334 | 2334 | car sinon on va se comporter differement selon que la table est declaree |
| 2335 | 2335 | ou non |
| 2336 | 2336 | */ |
| 2337 | - if (!$trouver_table) { |
|
| 2338 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 2339 | - } |
|
| 2340 | - if ($desc = $trouver_table($nom, $serveur)) { |
|
| 2341 | - return $desc; |
|
| 2342 | - } |
|
| 2343 | - |
|
| 2344 | - // sauf a l'installation : |
|
| 2345 | - include_spip('base/serial'); |
|
| 2346 | - if (isset($GLOBALS['tables_principales'][$nom])) { |
|
| 2347 | - return $GLOBALS['tables_principales'][$nom]; |
|
| 2348 | - } |
|
| 2349 | - |
|
| 2350 | - include_spip('base/auxiliaires'); |
|
| 2351 | - if (isset($GLOBALS['tables_auxiliaires'][$nom])) { |
|
| 2352 | - return $GLOBALS['tables_auxiliaires'][$nom]; |
|
| 2353 | - } |
|
| 2354 | - |
|
| 2355 | - return false; |
|
| 2337 | + if (!$trouver_table) { |
|
| 2338 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 2339 | + } |
|
| 2340 | + if ($desc = $trouver_table($nom, $serveur)) { |
|
| 2341 | + return $desc; |
|
| 2342 | + } |
|
| 2343 | + |
|
| 2344 | + // sauf a l'installation : |
|
| 2345 | + include_spip('base/serial'); |
|
| 2346 | + if (isset($GLOBALS['tables_principales'][$nom])) { |
|
| 2347 | + return $GLOBALS['tables_principales'][$nom]; |
|
| 2348 | + } |
|
| 2349 | + |
|
| 2350 | + include_spip('base/auxiliaires'); |
|
| 2351 | + if (isset($GLOBALS['tables_auxiliaires'][$nom])) { |
|
| 2352 | + return $GLOBALS['tables_auxiliaires'][$nom]; |
|
| 2353 | + } |
|
| 2354 | + |
|
| 2355 | + return false; |
|
| 2356 | 2356 | } |
| 2357 | 2357 | |
| 2358 | 2358 | /** |
@@ -2365,8 +2365,8 @@ discard block |
||
| 2365 | 2365 | * @return string Table sql éventuellement renommée |
| 2366 | 2366 | */ |
| 2367 | 2367 | function prefixer_table_spip($table, $prefixe) { |
| 2368 | - if ($prefixe) { |
|
| 2369 | - $table = preg_replace('/^spip_/', $prefixe . '_', $table); |
|
| 2370 | - } |
|
| 2371 | - return $table; |
|
| 2368 | + if ($prefixe) { |
|
| 2369 | + $table = preg_replace('/^spip_/', $prefixe . '_', $table); |
|
| 2370 | + } |
|
| 2371 | + return $table; |
|
| 2372 | 2372 | } |
@@ -22,7 +22,7 @@ discard block |
||
| 22 | 22 | */ |
| 23 | 23 | |
| 24 | 24 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 25 | - return; |
|
| 25 | + return; |
|
| 26 | 26 | } |
| 27 | 27 | |
| 28 | 28 | /** |
@@ -43,90 +43,90 @@ discard block |
||
| 43 | 43 | */ |
| 44 | 44 | function _sqlite_init_functions(&$sqlite) { |
| 45 | 45 | |
| 46 | - if (!$sqlite) { |
|
| 47 | - return false; |
|
| 48 | - } |
|
| 46 | + if (!$sqlite) { |
|
| 47 | + return false; |
|
| 48 | + } |
|
| 49 | 49 | |
| 50 | 50 | |
| 51 | - $fonctions = [ |
|
| 52 | - // A |
|
| 53 | - 'ACOS' => ['acos', 1], |
|
| 54 | - 'ASIN' => ['asin', 1], |
|
| 55 | - 'ATAN' => ['atan', 1], // mysql accepte 2 params comme atan2… hum ? |
|
| 56 | - 'ATAN2' => ['atan2', 2], |
|
| 51 | + $fonctions = [ |
|
| 52 | + // A |
|
| 53 | + 'ACOS' => ['acos', 1], |
|
| 54 | + 'ASIN' => ['asin', 1], |
|
| 55 | + 'ATAN' => ['atan', 1], // mysql accepte 2 params comme atan2… hum ? |
|
| 56 | + 'ATAN2' => ['atan2', 2], |
|
| 57 | 57 | |
| 58 | - // C |
|
| 59 | - 'CEIL' => ['_sqlite_func_ceil', 1], |
|
| 60 | - 'CONCAT' => ['_sqlite_func_concat', -1], |
|
| 61 | - 'COS' => ['cos', 1], |
|
| 58 | + // C |
|
| 59 | + 'CEIL' => ['_sqlite_func_ceil', 1], |
|
| 60 | + 'CONCAT' => ['_sqlite_func_concat', -1], |
|
| 61 | + 'COS' => ['cos', 1], |
|
| 62 | 62 | |
| 63 | - // D |
|
| 64 | - 'DATE_FORMAT' => ['_sqlite_func_date_format', 2], // équivalent a strftime avec args inversés |
|
| 65 | - 'DAYOFMONTH' => ['_sqlite_func_dayofmonth', 1], |
|
| 66 | - 'DEGREES' => ['rad2deg', 1], |
|
| 63 | + // D |
|
| 64 | + 'DATE_FORMAT' => ['_sqlite_func_date_format', 2], // équivalent a strftime avec args inversés |
|
| 65 | + 'DAYOFMONTH' => ['_sqlite_func_dayofmonth', 1], |
|
| 66 | + 'DEGREES' => ['rad2deg', 1], |
|
| 67 | 67 | |
| 68 | - // E |
|
| 69 | - 'EXTRAIRE_MULTI' => ['_sqlite_func_extraire_multi', 2], // specifique a SPIP/sql_multi() |
|
| 70 | - 'EXP' => ['exp', 1], |
|
| 68 | + // E |
|
| 69 | + 'EXTRAIRE_MULTI' => ['_sqlite_func_extraire_multi', 2], // specifique a SPIP/sql_multi() |
|
| 70 | + 'EXP' => ['exp', 1], |
|
| 71 | 71 | |
| 72 | - // F |
|
| 73 | - 'FIND_IN_SET' => ['_sqlite_func_find_in_set', 2], |
|
| 74 | - 'FLOOR' => ['_sqlite_func_floor', 1], |
|
| 72 | + // F |
|
| 73 | + 'FIND_IN_SET' => ['_sqlite_func_find_in_set', 2], |
|
| 74 | + 'FLOOR' => ['_sqlite_func_floor', 1], |
|
| 75 | 75 | |
| 76 | - // G |
|
| 77 | - 'GREATEST' => ['_sqlite_func_greatest', -1], |
|
| 76 | + // G |
|
| 77 | + 'GREATEST' => ['_sqlite_func_greatest', -1], |
|
| 78 | 78 | |
| 79 | - // I |
|
| 80 | - 'IF' => ['_sqlite_func_if', 3], |
|
| 81 | - 'INSERT' => ['_sqlite_func_insert', 4], |
|
| 82 | - 'INSTR' => ['_sqlite_func_instr', 2], |
|
| 79 | + // I |
|
| 80 | + 'IF' => ['_sqlite_func_if', 3], |
|
| 81 | + 'INSERT' => ['_sqlite_func_insert', 4], |
|
| 82 | + 'INSTR' => ['_sqlite_func_instr', 2], |
|
| 83 | 83 | |
| 84 | - // L |
|
| 85 | - 'LEAST' => ['_sqlite_func_least', -1], |
|
| 86 | - '_LEFT' => ['_sqlite_func_left', 2], |
|
| 84 | + // L |
|
| 85 | + 'LEAST' => ['_sqlite_func_least', -1], |
|
| 86 | + '_LEFT' => ['_sqlite_func_left', 2], |
|
| 87 | 87 | |
| 88 | - // N |
|
| 89 | - 'NOW' => ['_sqlite_func_now', 0], |
|
| 88 | + // N |
|
| 89 | + 'NOW' => ['_sqlite_func_now', 0], |
|
| 90 | 90 | |
| 91 | - // M |
|
| 92 | - 'MD5' => ['md5', 1], |
|
| 93 | - 'MONTH' => ['_sqlite_func_month', 1], |
|
| 91 | + // M |
|
| 92 | + 'MD5' => ['md5', 1], |
|
| 93 | + 'MONTH' => ['_sqlite_func_month', 1], |
|
| 94 | 94 | |
| 95 | - // P |
|
| 96 | - 'PREG_REPLACE' => ['_sqlite_func_preg_replace', 3], |
|
| 95 | + // P |
|
| 96 | + 'PREG_REPLACE' => ['_sqlite_func_preg_replace', 3], |
|
| 97 | 97 | |
| 98 | - // R |
|
| 99 | - 'RADIANS' => ['deg2rad', 1], |
|
| 100 | - 'RAND' => ['_sqlite_func_rand', 0], // sinon random() v2.4 |
|
| 101 | - 'REGEXP' => ['_sqlite_func_regexp_match', 2], // critere REGEXP supporte a partir de v3.3.2 |
|
| 102 | - 'RIGHT' => ['_sqlite_func_right', 2], |
|
| 98 | + // R |
|
| 99 | + 'RADIANS' => ['deg2rad', 1], |
|
| 100 | + 'RAND' => ['_sqlite_func_rand', 0], // sinon random() v2.4 |
|
| 101 | + 'REGEXP' => ['_sqlite_func_regexp_match', 2], // critere REGEXP supporte a partir de v3.3.2 |
|
| 102 | + 'RIGHT' => ['_sqlite_func_right', 2], |
|
| 103 | 103 | |
| 104 | - // S |
|
| 105 | - 'SETTYPE' => ['settype', 2], // CAST present en v3.2.3 |
|
| 106 | - 'SIN' => ['sin', 1], |
|
| 107 | - 'SQRT' => ['sqrt', 1], |
|
| 108 | - 'SUBSTRING' => ['_sqlite_func_substring' /*, 3*/], // peut etre appelee avec 2 ou 3 arguments, index base 1 et non 0 |
|
| 104 | + // S |
|
| 105 | + 'SETTYPE' => ['settype', 2], // CAST present en v3.2.3 |
|
| 106 | + 'SIN' => ['sin', 1], |
|
| 107 | + 'SQRT' => ['sqrt', 1], |
|
| 108 | + 'SUBSTRING' => ['_sqlite_func_substring' /*, 3*/], // peut etre appelee avec 2 ou 3 arguments, index base 1 et non 0 |
|
| 109 | 109 | |
| 110 | - // T |
|
| 111 | - 'TAN' => ['tan', 1], |
|
| 112 | - 'TIMESTAMPDIFF' => ['_sqlite_timestampdiff' /*, 3*/], |
|
| 113 | - 'TO_DAYS' => ['_sqlite_func_to_days', 1], |
|
| 110 | + // T |
|
| 111 | + 'TAN' => ['tan', 1], |
|
| 112 | + 'TIMESTAMPDIFF' => ['_sqlite_timestampdiff' /*, 3*/], |
|
| 113 | + 'TO_DAYS' => ['_sqlite_func_to_days', 1], |
|
| 114 | 114 | |
| 115 | - // U |
|
| 116 | - 'UNIX_TIMESTAMP' => ['_sqlite_func_unix_timestamp', 1], |
|
| 115 | + // U |
|
| 116 | + 'UNIX_TIMESTAMP' => ['_sqlite_func_unix_timestamp', 1], |
|
| 117 | 117 | |
| 118 | - // V |
|
| 119 | - 'VIDE' => ['_sqlite_func_vide', 0], // du vide pour SELECT 0 as x ... ORDER BY x -> ORDER BY vide() |
|
| 118 | + // V |
|
| 119 | + 'VIDE' => ['_sqlite_func_vide', 0], // du vide pour SELECT 0 as x ... ORDER BY x -> ORDER BY vide() |
|
| 120 | 120 | |
| 121 | - // Y |
|
| 122 | - 'YEAR' => ['_sqlite_func_year', 1] |
|
| 123 | - ]; |
|
| 121 | + // Y |
|
| 122 | + 'YEAR' => ['_sqlite_func_year', 1] |
|
| 123 | + ]; |
|
| 124 | 124 | |
| 125 | - foreach ($fonctions as $f => $r) { |
|
| 126 | - _sqlite_add_function($sqlite, $f, $r); |
|
| 127 | - } |
|
| 125 | + foreach ($fonctions as $f => $r) { |
|
| 126 | + _sqlite_add_function($sqlite, $f, $r); |
|
| 127 | + } |
|
| 128 | 128 | |
| 129 | - #spip_log('functions sqlite chargees ','sqlite.'._LOG_DEBUG); |
|
| 129 | + #spip_log('functions sqlite chargees ','sqlite.'._LOG_DEBUG); |
|
| 130 | 130 | } |
| 131 | 131 | |
| 132 | 132 | |
@@ -147,9 +147,9 @@ discard block |
||
| 147 | 147 | * |
| 148 | 148 | **/ |
| 149 | 149 | function _sqlite_add_function(&$sqlite, &$f, &$r) { |
| 150 | - isset($r[1]) |
|
| 151 | - ? $sqlite->sqliteCreateFunction($f, $r[0], $r[1]) |
|
| 152 | - : $sqlite->sqliteCreateFunction($f, $r[0]); |
|
| 150 | + isset($r[1]) |
|
| 151 | + ? $sqlite->sqliteCreateFunction($f, $r[0], $r[1]) |
|
| 152 | + : $sqlite->sqliteCreateFunction($f, $r[0]); |
|
| 153 | 153 | } |
| 154 | 154 | |
| 155 | 155 | /** |
@@ -159,7 +159,7 @@ discard block |
||
| 159 | 159 | * @return int |
| 160 | 160 | */ |
| 161 | 161 | function _sqlite_func_ceil($a) { |
| 162 | - return ceil($a); |
|
| 162 | + return ceil($a); |
|
| 163 | 163 | } |
| 164 | 164 | |
| 165 | 165 | /** |
@@ -169,7 +169,7 @@ discard block |
||
| 169 | 169 | * @return string |
| 170 | 170 | */ |
| 171 | 171 | function _sqlite_func_concat(...$args) { |
| 172 | - return join('', $args); |
|
| 172 | + return join('', $args); |
|
| 173 | 173 | } |
| 174 | 174 | |
| 175 | 175 | |
@@ -182,7 +182,7 @@ discard block |
||
| 182 | 182 | * @return string |
| 183 | 183 | */ |
| 184 | 184 | function _sqlite_func_dayofmonth($d) { |
| 185 | - return _sqlite_func_date('d', $d); |
|
| 185 | + return _sqlite_func_date('d', $d); |
|
| 186 | 186 | } |
| 187 | 187 | |
| 188 | 188 | |
@@ -194,15 +194,15 @@ discard block |
||
| 194 | 194 | * @return int |
| 195 | 195 | */ |
| 196 | 196 | function _sqlite_func_find_in_set($num, $set) { |
| 197 | - $rank = 0; |
|
| 198 | - foreach (explode(',', $set) as $v) { |
|
| 199 | - if ($v == $num) { |
|
| 200 | - return (++$rank); |
|
| 201 | - } |
|
| 202 | - $rank++; |
|
| 203 | - } |
|
| 204 | - |
|
| 205 | - return 0; |
|
| 197 | + $rank = 0; |
|
| 198 | + foreach (explode(',', $set) as $v) { |
|
| 199 | + if ($v == $num) { |
|
| 200 | + return (++$rank); |
|
| 201 | + } |
|
| 202 | + $rank++; |
|
| 203 | + } |
|
| 204 | + |
|
| 205 | + return 0; |
|
| 206 | 206 | } |
| 207 | 207 | |
| 208 | 208 | /** |
@@ -212,7 +212,7 @@ discard block |
||
| 212 | 212 | * @return int |
| 213 | 213 | */ |
| 214 | 214 | function _sqlite_func_floor($a) { |
| 215 | - return floor($a); |
|
| 215 | + return floor($a); |
|
| 216 | 216 | } |
| 217 | 217 | |
| 218 | 218 | |
@@ -225,7 +225,7 @@ discard block |
||
| 225 | 225 | * @return mixed |
| 226 | 226 | */ |
| 227 | 227 | function _sqlite_func_if($bool, $oui, $non) { |
| 228 | - return ($bool) ? $oui : $non; |
|
| 228 | + return ($bool) ? $oui : $non; |
|
| 229 | 229 | } |
| 230 | 230 | |
| 231 | 231 | |
@@ -242,10 +242,10 @@ discard block |
||
| 242 | 242 | * @return string |
| 243 | 243 | */ |
| 244 | 244 | function _sqlite_func_insert($s, $index, $longueur, $chaine) { |
| 245 | - return |
|
| 246 | - substr($s, 0, $index) |
|
| 247 | - . $chaine |
|
| 248 | - . substr(substr($s, $index), $longueur); |
|
| 245 | + return |
|
| 246 | + substr($s, 0, $index) |
|
| 247 | + . $chaine |
|
| 248 | + . substr(substr($s, $index), $longueur); |
|
| 249 | 249 | } |
| 250 | 250 | |
| 251 | 251 | |
@@ -257,7 +257,7 @@ discard block |
||
| 257 | 257 | * @return int |
| 258 | 258 | */ |
| 259 | 259 | function _sqlite_func_instr($s, $search) { |
| 260 | - return strpos($s, $search); |
|
| 260 | + return strpos($s, $search); |
|
| 261 | 261 | } |
| 262 | 262 | |
| 263 | 263 | |
@@ -268,7 +268,7 @@ discard block |
||
| 268 | 268 | * @return int |
| 269 | 269 | */ |
| 270 | 270 | function _sqlite_func_least(...$args) { |
| 271 | - return min($args); |
|
| 271 | + return min($args); |
|
| 272 | 272 | } |
| 273 | 273 | |
| 274 | 274 | |
@@ -279,7 +279,7 @@ discard block |
||
| 279 | 279 | * @return int |
| 280 | 280 | */ |
| 281 | 281 | function _sqlite_func_greatest(...$args) { |
| 282 | - return max($args); |
|
| 282 | + return max($args); |
|
| 283 | 283 | } |
| 284 | 284 | |
| 285 | 285 | |
@@ -291,7 +291,7 @@ discard block |
||
| 291 | 291 | * @return string |
| 292 | 292 | */ |
| 293 | 293 | function _sqlite_func_left($s, $lenght) { |
| 294 | - return substr($s, $lenght); |
|
| 294 | + return substr($s, $lenght); |
|
| 295 | 295 | } |
| 296 | 296 | |
| 297 | 297 | /** |
@@ -301,13 +301,13 @@ discard block |
||
| 301 | 301 | * @return string |
| 302 | 302 | */ |
| 303 | 303 | function _sqlite_func_now($force_refresh = false) { |
| 304 | - static $now = null; |
|
| 305 | - if (is_null($now) or $force_refresh) { |
|
| 306 | - $now = date('Y-m-d H:i:s'); |
|
| 307 | - } |
|
| 304 | + static $now = null; |
|
| 305 | + if (is_null($now) or $force_refresh) { |
|
| 306 | + $now = date('Y-m-d H:i:s'); |
|
| 307 | + } |
|
| 308 | 308 | |
| 309 | - #spip_log("Passage avec NOW : $now | ".time(),'sqlite.'._LOG_DEBUG); |
|
| 310 | - return $now; |
|
| 309 | + #spip_log("Passage avec NOW : $now | ".time(),'sqlite.'._LOG_DEBUG); |
|
| 310 | + return $now; |
|
| 311 | 311 | } |
| 312 | 312 | |
| 313 | 313 | |
@@ -320,7 +320,7 @@ discard block |
||
| 320 | 320 | * @return string |
| 321 | 321 | */ |
| 322 | 322 | function _sqlite_func_month($d) { |
| 323 | - return _sqlite_func_date('m', $d); |
|
| 323 | + return _sqlite_func_date('m', $d); |
|
| 324 | 324 | } |
| 325 | 325 | |
| 326 | 326 | |
@@ -333,10 +333,10 @@ discard block |
||
| 333 | 333 | * @return string |
| 334 | 334 | */ |
| 335 | 335 | function _sqlite_func_preg_replace($quoi, $cherche, $remplace) { |
| 336 | - $return = preg_replace('%' . $cherche . '%', $remplace, $quoi); |
|
| 336 | + $return = preg_replace('%' . $cherche . '%', $remplace, $quoi); |
|
| 337 | 337 | |
| 338 | - #spip_log("preg_replace : $quoi, $cherche, $remplace, $return",'sqlite.'._LOG_DEBUG); |
|
| 339 | - return $return; |
|
| 338 | + #spip_log("preg_replace : $quoi, $cherche, $remplace, $return",'sqlite.'._LOG_DEBUG); |
|
| 339 | + return $return; |
|
| 340 | 340 | } |
| 341 | 341 | |
| 342 | 342 | /** |
@@ -349,26 +349,26 @@ discard block |
||
| 349 | 349 | * @return string, l'extrait trouve. |
| 350 | 350 | **/ |
| 351 | 351 | function _sqlite_func_extraire_multi($quoi, $lang) { |
| 352 | - if (!defined('_EXTRAIRE_MULTI')) { |
|
| 353 | - include_spip('inc/filtres'); |
|
| 354 | - } |
|
| 355 | - if (!function_exists('approcher_langue')) { |
|
| 356 | - include_spip('inc/lang'); |
|
| 357 | - } |
|
| 358 | - if (preg_match_all(_EXTRAIRE_MULTI, $quoi, $regs, PREG_SET_ORDER)) { |
|
| 359 | - foreach ($regs as $reg) { |
|
| 360 | - // chercher la version de la langue courante |
|
| 361 | - $trads = extraire_trads($reg[1]); |
|
| 362 | - if ($l = approcher_langue($trads, $lang)) { |
|
| 363 | - $trad = $trads[$l]; |
|
| 364 | - } else { |
|
| 365 | - $trad = reset($trads); |
|
| 366 | - } |
|
| 367 | - $quoi = str_replace($reg[0], $trad, $quoi); |
|
| 368 | - } |
|
| 369 | - } |
|
| 370 | - |
|
| 371 | - return $quoi; |
|
| 352 | + if (!defined('_EXTRAIRE_MULTI')) { |
|
| 353 | + include_spip('inc/filtres'); |
|
| 354 | + } |
|
| 355 | + if (!function_exists('approcher_langue')) { |
|
| 356 | + include_spip('inc/lang'); |
|
| 357 | + } |
|
| 358 | + if (preg_match_all(_EXTRAIRE_MULTI, $quoi, $regs, PREG_SET_ORDER)) { |
|
| 359 | + foreach ($regs as $reg) { |
|
| 360 | + // chercher la version de la langue courante |
|
| 361 | + $trads = extraire_trads($reg[1]); |
|
| 362 | + if ($l = approcher_langue($trads, $lang)) { |
|
| 363 | + $trad = $trads[$l]; |
|
| 364 | + } else { |
|
| 365 | + $trad = reset($trads); |
|
| 366 | + } |
|
| 367 | + $quoi = str_replace($reg[0], $trad, $quoi); |
|
| 368 | + } |
|
| 369 | + } |
|
| 370 | + |
|
| 371 | + return $quoi; |
|
| 372 | 372 | } |
| 373 | 373 | |
| 374 | 374 | |
@@ -378,7 +378,7 @@ discard block |
||
| 378 | 378 | * @return float |
| 379 | 379 | */ |
| 380 | 380 | function _sqlite_func_rand() { |
| 381 | - return random_int(0, mt_getrandmax()); |
|
| 381 | + return random_int(0, mt_getrandmax()); |
|
| 382 | 382 | } |
| 383 | 383 | |
| 384 | 384 | |
@@ -390,7 +390,7 @@ discard block |
||
| 390 | 390 | * @return string |
| 391 | 391 | */ |
| 392 | 392 | function _sqlite_func_right($s, $length) { |
| 393 | - return substr($s, 0 - $length); |
|
| 393 | + return substr($s, 0 - $length); |
|
| 394 | 394 | } |
| 395 | 395 | |
| 396 | 396 | |
@@ -402,17 +402,17 @@ discard block |
||
| 402 | 402 | * @return bool |
| 403 | 403 | */ |
| 404 | 404 | function _sqlite_func_regexp_match($cherche, $quoi) { |
| 405 | - // optimiser un cas tres courant avec les requetes en base |
|
| 406 | - if (!$quoi and !strlen($quoi)) { |
|
| 407 | - return false; |
|
| 408 | - } |
|
| 409 | - // il faut enlever un niveau d'echappement pour être homogène à mysql |
|
| 410 | - $cherche = str_replace('\\\\', '\\', $cherche); |
|
| 411 | - $u = $GLOBALS['meta']['pcre_u'] ?? 'u'; |
|
| 412 | - $return = preg_match('%' . $cherche . '%imsS' . $u, $quoi); |
|
| 413 | - |
|
| 414 | - #spip_log("regexp_replace : $quoi, $cherche, $remplace, $return",'sqlite.'._LOG_DEBUG); |
|
| 415 | - return $return; |
|
| 405 | + // optimiser un cas tres courant avec les requetes en base |
|
| 406 | + if (!$quoi and !strlen($quoi)) { |
|
| 407 | + return false; |
|
| 408 | + } |
|
| 409 | + // il faut enlever un niveau d'echappement pour être homogène à mysql |
|
| 410 | + $cherche = str_replace('\\\\', '\\', $cherche); |
|
| 411 | + $u = $GLOBALS['meta']['pcre_u'] ?? 'u'; |
|
| 412 | + $return = preg_match('%' . $cherche . '%imsS' . $u, $quoi); |
|
| 413 | + |
|
| 414 | + #spip_log("regexp_replace : $quoi, $cherche, $remplace, $return",'sqlite.'._LOG_DEBUG); |
|
| 415 | + return $return; |
|
| 416 | 416 | } |
| 417 | 417 | |
| 418 | 418 | |
@@ -427,8 +427,8 @@ discard block |
||
| 427 | 427 | * @return string |
| 428 | 428 | */ |
| 429 | 429 | function _sqlite_func_date_format($date, $conv) { |
| 430 | - $conv = _sqlite_func_strftime_format_converter($conv); |
|
| 431 | - return strftime($conv, is_int($date) ? $date : strtotime($date)); |
|
| 430 | + $conv = _sqlite_func_strftime_format_converter($conv); |
|
| 431 | + return strftime($conv, is_int($date) ? $date : strtotime($date)); |
|
| 432 | 432 | } |
| 433 | 433 | |
| 434 | 434 | /** |
@@ -444,28 +444,28 @@ discard block |
||
| 444 | 444 | * @return void |
| 445 | 445 | */ |
| 446 | 446 | function _sqlite_func_strftime_format_converter(string $conv): string { |
| 447 | - // ok : %a %b %d %e %H %I %l %j %k %m %p %r %S %T %w %y %Y |
|
| 448 | - // on ne sait pas en gérer certains... |
|
| 449 | - static $mysql_to_strftime_not_ok = ['%c', '%D', '%f', '%U', '%V', '%W', '%X']; |
|
| 450 | - static $mysql_to_strftime = [ |
|
| 451 | - '%h' => '%I', |
|
| 452 | - '%i' => '%M', |
|
| 453 | - '%M' => '%B', |
|
| 454 | - '%s' => '%S', |
|
| 455 | - '%u' => '%U', |
|
| 456 | - '%v' => '%V', |
|
| 457 | - '%x' => '%G', |
|
| 458 | - ]; |
|
| 459 | - static $to_strftime = []; |
|
| 460 | - if (!isset($to_strftime[$conv])) { |
|
| 461 | - $count = 0; |
|
| 462 | - str_replace($mysql_to_strftime_not_ok, '', $conv, $count); |
|
| 463 | - if ($count > 0) { |
|
| 464 | - spip_log("DATE_FORMAT : At least one parameter can't be parsed by strftime with format '$conv'", 'sqlite.' . _LOG_ERREUR); |
|
| 465 | - } |
|
| 466 | - $to_strftime[$conv] = str_replace(array_keys($mysql_to_strftime), $mysql_to_strftime, $conv); |
|
| 467 | - } |
|
| 468 | - return $to_strftime[$conv]; |
|
| 447 | + // ok : %a %b %d %e %H %I %l %j %k %m %p %r %S %T %w %y %Y |
|
| 448 | + // on ne sait pas en gérer certains... |
|
| 449 | + static $mysql_to_strftime_not_ok = ['%c', '%D', '%f', '%U', '%V', '%W', '%X']; |
|
| 450 | + static $mysql_to_strftime = [ |
|
| 451 | + '%h' => '%I', |
|
| 452 | + '%i' => '%M', |
|
| 453 | + '%M' => '%B', |
|
| 454 | + '%s' => '%S', |
|
| 455 | + '%u' => '%U', |
|
| 456 | + '%v' => '%V', |
|
| 457 | + '%x' => '%G', |
|
| 458 | + ]; |
|
| 459 | + static $to_strftime = []; |
|
| 460 | + if (!isset($to_strftime[$conv])) { |
|
| 461 | + $count = 0; |
|
| 462 | + str_replace($mysql_to_strftime_not_ok, '', $conv, $count); |
|
| 463 | + if ($count > 0) { |
|
| 464 | + spip_log("DATE_FORMAT : At least one parameter can't be parsed by strftime with format '$conv'", 'sqlite.' . _LOG_ERREUR); |
|
| 465 | + } |
|
| 466 | + $to_strftime[$conv] = str_replace(array_keys($mysql_to_strftime), $mysql_to_strftime, $conv); |
|
| 467 | + } |
|
| 468 | + return $to_strftime[$conv]; |
|
| 469 | 469 | } |
| 470 | 470 | |
| 471 | 471 | /** |
@@ -479,11 +479,11 @@ discard block |
||
| 479 | 479 | * @return int |
| 480 | 480 | */ |
| 481 | 481 | function _sqlite_func_to_days($d) { |
| 482 | - static $offset = 719528; // nb de jour entre 0000-00-00 et timestamp 0=1970-01-01 |
|
| 483 | - $result = $offset + (int)ceil(_sqlite_func_unix_timestamp($d) / (24 * 3600)); |
|
| 482 | + static $offset = 719528; // nb de jour entre 0000-00-00 et timestamp 0=1970-01-01 |
|
| 483 | + $result = $offset + (int)ceil(_sqlite_func_unix_timestamp($d) / (24 * 3600)); |
|
| 484 | 484 | |
| 485 | - #spip_log("Passage avec TO_DAYS : $d, $result",'sqlite.'._LOG_DEBUG); |
|
| 486 | - return $result; |
|
| 485 | + #spip_log("Passage avec TO_DAYS : $d, $result",'sqlite.'._LOG_DEBUG); |
|
| 486 | + return $result; |
|
| 487 | 487 | } |
| 488 | 488 | |
| 489 | 489 | /** |
@@ -495,13 +495,13 @@ discard block |
||
| 495 | 495 | * @return string |
| 496 | 496 | */ |
| 497 | 497 | function _sqlite_func_substring($string, $start, $len = null) { |
| 498 | - // SQL compte a partir de 1, php a partir de 0 |
|
| 499 | - $start = ($start > 0) ? $start - 1 : $start; |
|
| 500 | - if (is_null($len)) { |
|
| 501 | - return substr($string, $start); |
|
| 502 | - } else { |
|
| 503 | - return substr($string, $start, $len); |
|
| 504 | - } |
|
| 498 | + // SQL compte a partir de 1, php a partir de 0 |
|
| 499 | + $start = ($start > 0) ? $start - 1 : $start; |
|
| 500 | + if (is_null($len)) { |
|
| 501 | + return substr($string, $start); |
|
| 502 | + } else { |
|
| 503 | + return substr($string, $start, $len); |
|
| 504 | + } |
|
| 505 | 505 | } |
| 506 | 506 | |
| 507 | 507 | /** |
@@ -517,33 +517,33 @@ discard block |
||
| 517 | 517 | * @return int |
| 518 | 518 | */ |
| 519 | 519 | function _sqlite_timestampdiff($unit, $date1, $date2) { |
| 520 | - $d1 = date_create($date1); |
|
| 521 | - $d2 = date_create($date2); |
|
| 522 | - $diff = date_diff($d1, $d2); |
|
| 523 | - $inv = $diff->invert ? -1 : 1; |
|
| 524 | - switch ($unit) { |
|
| 525 | - case 'YEAR': |
|
| 526 | - return $inv * $diff->y; |
|
| 527 | - case 'QUARTER': |
|
| 528 | - return $inv * (4 * $diff->y + intval(floor($diff->m / 3))); |
|
| 529 | - case 'MONTH': |
|
| 530 | - return $inv * (12 * $diff->y + $diff->m); |
|
| 531 | - case 'WEEK': |
|
| 532 | - return $inv * intval(floor($diff->days / 7)); |
|
| 533 | - case 'DAY': |
|
| 534 | - #var_dump($inv*$diff->days); |
|
| 535 | - return $inv * $diff->days; |
|
| 536 | - case 'HOUR': |
|
| 537 | - return $inv * (24 * $diff->days + $diff->h); |
|
| 538 | - case 'MINUTE': |
|
| 539 | - return $inv * ((24 * $diff->days + $diff->h) * 60 + $diff->i); |
|
| 540 | - case 'SECOND': |
|
| 541 | - return $inv * (((24 * $diff->days + $diff->h) * 60 + $diff->i) * 60 + $diff->s); |
|
| 542 | - case 'MICROSECOND': |
|
| 543 | - return $inv * (((24 * $diff->days + $diff->h) * 60 + $diff->i) * 60 + $diff->s) * 1_000_000; |
|
| 544 | - } |
|
| 545 | - |
|
| 546 | - return 0; |
|
| 520 | + $d1 = date_create($date1); |
|
| 521 | + $d2 = date_create($date2); |
|
| 522 | + $diff = date_diff($d1, $d2); |
|
| 523 | + $inv = $diff->invert ? -1 : 1; |
|
| 524 | + switch ($unit) { |
|
| 525 | + case 'YEAR': |
|
| 526 | + return $inv * $diff->y; |
|
| 527 | + case 'QUARTER': |
|
| 528 | + return $inv * (4 * $diff->y + intval(floor($diff->m / 3))); |
|
| 529 | + case 'MONTH': |
|
| 530 | + return $inv * (12 * $diff->y + $diff->m); |
|
| 531 | + case 'WEEK': |
|
| 532 | + return $inv * intval(floor($diff->days / 7)); |
|
| 533 | + case 'DAY': |
|
| 534 | + #var_dump($inv*$diff->days); |
|
| 535 | + return $inv * $diff->days; |
|
| 536 | + case 'HOUR': |
|
| 537 | + return $inv * (24 * $diff->days + $diff->h); |
|
| 538 | + case 'MINUTE': |
|
| 539 | + return $inv * ((24 * $diff->days + $diff->h) * 60 + $diff->i); |
|
| 540 | + case 'SECOND': |
|
| 541 | + return $inv * (((24 * $diff->days + $diff->h) * 60 + $diff->i) * 60 + $diff->s); |
|
| 542 | + case 'MICROSECOND': |
|
| 543 | + return $inv * (((24 * $diff->days + $diff->h) * 60 + $diff->i) * 60 + $diff->s) * 1_000_000; |
|
| 544 | + } |
|
| 545 | + |
|
| 546 | + return 0; |
|
| 547 | 547 | } |
| 548 | 548 | |
| 549 | 549 | /** |
@@ -553,24 +553,24 @@ discard block |
||
| 553 | 553 | * @return int |
| 554 | 554 | */ |
| 555 | 555 | function _sqlite_func_unix_timestamp($d) { |
| 556 | - static $mem = []; |
|
| 557 | - static $n = 0; |
|
| 558 | - if (isset($mem[$d])) { |
|
| 559 | - return $mem[$d]; |
|
| 560 | - } |
|
| 561 | - if ($n++ > 100) { |
|
| 562 | - $mem = []; |
|
| 563 | - $n = 0; |
|
| 564 | - } |
|
| 565 | - |
|
| 566 | - //2005-12-02 20:53:53 |
|
| 567 | - #spip_log("Passage avec UNIX_TIMESTAMP : $d",'sqlite.'._LOG_DEBUG); |
|
| 568 | - if (!$d) { |
|
| 569 | - return $mem[$d] = time(); |
|
| 570 | - } |
|
| 571 | - |
|
| 572 | - // une pile plus grosse n'accelere pas le calcul |
|
| 573 | - return $mem[$d] = strtotime($d); |
|
| 556 | + static $mem = []; |
|
| 557 | + static $n = 0; |
|
| 558 | + if (isset($mem[$d])) { |
|
| 559 | + return $mem[$d]; |
|
| 560 | + } |
|
| 561 | + if ($n++ > 100) { |
|
| 562 | + $mem = []; |
|
| 563 | + $n = 0; |
|
| 564 | + } |
|
| 565 | + |
|
| 566 | + //2005-12-02 20:53:53 |
|
| 567 | + #spip_log("Passage avec UNIX_TIMESTAMP : $d",'sqlite.'._LOG_DEBUG); |
|
| 568 | + if (!$d) { |
|
| 569 | + return $mem[$d] = time(); |
|
| 570 | + } |
|
| 571 | + |
|
| 572 | + // une pile plus grosse n'accelere pas le calcul |
|
| 573 | + return $mem[$d] = strtotime($d); |
|
| 574 | 574 | } |
| 575 | 575 | |
| 576 | 576 | |
@@ -583,7 +583,7 @@ discard block |
||
| 583 | 583 | * @return string |
| 584 | 584 | */ |
| 585 | 585 | function _sqlite_func_year($d) { |
| 586 | - return _sqlite_func_date('Y', $d); |
|
| 586 | + return _sqlite_func_date('Y', $d); |
|
| 587 | 587 | } |
| 588 | 588 | |
| 589 | 589 | /** |
@@ -596,20 +596,20 @@ discard block |
||
| 596 | 596 | * @return string |
| 597 | 597 | */ |
| 598 | 598 | function _sqlite_func_date($quoi, $d) { |
| 599 | - static $mem = []; |
|
| 600 | - static $n = 0; |
|
| 601 | - if (isset($mem[$d])) { |
|
| 602 | - return $mem[$d][$quoi]; |
|
| 603 | - } |
|
| 604 | - if ($n++ > 100) { |
|
| 605 | - $mem = []; |
|
| 606 | - $n = 0; |
|
| 607 | - } |
|
| 608 | - |
|
| 609 | - $dec = date('Y-m-d', _sqlite_func_unix_timestamp($d)); |
|
| 610 | - $mem[$d] = ['Y' => substr($dec, 0, 4), 'm' => substr($dec, 5, 2), 'd' => substr($dec, 8, 2)]; |
|
| 611 | - |
|
| 612 | - return $mem[$d][$quoi]; |
|
| 599 | + static $mem = []; |
|
| 600 | + static $n = 0; |
|
| 601 | + if (isset($mem[$d])) { |
|
| 602 | + return $mem[$d][$quoi]; |
|
| 603 | + } |
|
| 604 | + if ($n++ > 100) { |
|
| 605 | + $mem = []; |
|
| 606 | + $n = 0; |
|
| 607 | + } |
|
| 608 | + |
|
| 609 | + $dec = date('Y-m-d', _sqlite_func_unix_timestamp($d)); |
|
| 610 | + $mem[$d] = ['Y' => substr($dec, 0, 4), 'm' => substr($dec, 5, 2), 'd' => substr($dec, 8, 2)]; |
|
| 611 | + |
|
| 612 | + return $mem[$d][$quoi]; |
|
| 613 | 613 | } |
| 614 | 614 | |
| 615 | 615 | /** |
@@ -618,5 +618,5 @@ discard block |
||
| 618 | 618 | * @return void |
| 619 | 619 | */ |
| 620 | 620 | function _sqlite_func_vide() { |
| 621 | - return; |
|
| 621 | + return; |
|
| 622 | 622 | } |
@@ -18,7 +18,7 @@ discard block |
||
| 18 | 18 | */ |
| 19 | 19 | |
| 20 | 20 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 21 | - return; |
|
| 21 | + return; |
|
| 22 | 22 | } |
| 23 | 23 | |
| 24 | 24 | // TODO: get/set_caracteres ? |
@@ -42,91 +42,91 @@ discard block |
||
| 42 | 42 | * @return array|bool |
| 43 | 43 | */ |
| 44 | 44 | function req_sqlite_dist($addr, $port, $login, $pass, $db = '', $prefixe = '', $sqlite_version = '') { |
| 45 | - static $last_connect = []; |
|
| 46 | - |
|
| 47 | - // si provient de selectdb |
|
| 48 | - // un code pour etre sur que l'on vient de select_db() |
|
| 49 | - if (strpos($db, $code = '@selectdb@') !== false) { |
|
| 50 | - foreach (['addr', 'port', 'login', 'pass', 'prefixe'] as $a) { |
|
| 51 | - $$a = $last_connect[$a]; |
|
| 52 | - } |
|
| 53 | - $db = str_replace($code, '', $db); |
|
| 54 | - } |
|
| 55 | - |
|
| 56 | - /* |
|
| 45 | + static $last_connect = []; |
|
| 46 | + |
|
| 47 | + // si provient de selectdb |
|
| 48 | + // un code pour etre sur que l'on vient de select_db() |
|
| 49 | + if (strpos($db, $code = '@selectdb@') !== false) { |
|
| 50 | + foreach (['addr', 'port', 'login', 'pass', 'prefixe'] as $a) { |
|
| 51 | + $$a = $last_connect[$a]; |
|
| 52 | + } |
|
| 53 | + $db = str_replace($code, '', $db); |
|
| 54 | + } |
|
| 55 | + |
|
| 56 | + /* |
|
| 57 | 57 | * En sqlite, seule l'adresse du fichier est importante. |
| 58 | 58 | * Ce sera $db le nom, |
| 59 | 59 | * le path est $addr |
| 60 | 60 | * (_DIR_DB si $addr est vide) |
| 61 | 61 | */ |
| 62 | - _sqlite_init(); |
|
| 63 | - |
|
| 64 | - // determiner le dossier de la base : $addr ou _DIR_DB |
|
| 65 | - $f = _DIR_DB; |
|
| 66 | - if ($addr and strpos($addr, '/') !== false) { |
|
| 67 | - $f = rtrim($addr, '/') . '/'; |
|
| 68 | - } |
|
| 69 | - |
|
| 70 | - // un nom de base demande et impossible d'obtenir la base, on s'en va : |
|
| 71 | - // il faut que la base existe ou que le repertoire parent soit writable |
|
| 72 | - if ($db and !is_file($f .= $db . '.sqlite') and !is_writable(dirname($f))) { |
|
| 73 | - spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.' . _LOG_HS); |
|
| 74 | - |
|
| 75 | - return false; |
|
| 76 | - } |
|
| 77 | - |
|
| 78 | - // charger les modules sqlite au besoin |
|
| 79 | - if (!_sqlite_charger_version($sqlite_version)) { |
|
| 80 | - spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.' . _LOG_HS); |
|
| 81 | - |
|
| 82 | - return false; |
|
| 83 | - } |
|
| 84 | - |
|
| 85 | - // chargement des constantes |
|
| 86 | - // il ne faut pas definir les constantes avant d'avoir charge les modules sqlite |
|
| 87 | - $define = 'spip_sqlite' . $sqlite_version . '_constantes'; |
|
| 88 | - $define(); |
|
| 89 | - |
|
| 90 | - $ok = false; |
|
| 91 | - if (!$db) { |
|
| 92 | - // si pas de db -> |
|
| 93 | - // base temporaire tant qu'on ne connait pas son vrai nom |
|
| 94 | - // pour tester la connexion |
|
| 95 | - $db = '_sqlite' . $sqlite_version . '_install'; |
|
| 96 | - $tmp = _DIR_DB . $db . '.sqlite'; |
|
| 97 | - $ok = $link = new \PDO("sqlite:$tmp"); |
|
| 98 | - } else { |
|
| 99 | - // Ouvrir (eventuellement creer la base) |
|
| 100 | - $ok = $link = new \PDO("sqlite:$f"); |
|
| 101 | - } |
|
| 102 | - |
|
| 103 | - if (!$ok) { |
|
| 104 | - $e = _sqlite_last_error_from_link($link); |
|
| 105 | - spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f : $e", 'sqlite.' . _LOG_HS); |
|
| 106 | - |
|
| 107 | - return false; |
|
| 108 | - } |
|
| 109 | - |
|
| 110 | - if ($link) { |
|
| 111 | - $last_connect = [ |
|
| 112 | - 'addr' => $addr, |
|
| 113 | - 'port' => $port, |
|
| 114 | - 'login' => $login, |
|
| 115 | - 'pass' => $pass, |
|
| 116 | - 'db' => $db, |
|
| 117 | - 'prefixe' => $prefixe, |
|
| 118 | - ]; |
|
| 119 | - // etre sur qu'on definit bien les fonctions a chaque nouvelle connexion |
|
| 120 | - include_spip('req/sqlite_fonctions'); |
|
| 121 | - _sqlite_init_functions($link); |
|
| 122 | - } |
|
| 123 | - |
|
| 124 | - return [ |
|
| 125 | - 'db' => $db, |
|
| 126 | - 'prefixe' => $prefixe ? $prefixe : $db, |
|
| 127 | - 'link' => $link, |
|
| 128 | - 'total_requetes' => 0, |
|
| 129 | - ]; |
|
| 62 | + _sqlite_init(); |
|
| 63 | + |
|
| 64 | + // determiner le dossier de la base : $addr ou _DIR_DB |
|
| 65 | + $f = _DIR_DB; |
|
| 66 | + if ($addr and strpos($addr, '/') !== false) { |
|
| 67 | + $f = rtrim($addr, '/') . '/'; |
|
| 68 | + } |
|
| 69 | + |
|
| 70 | + // un nom de base demande et impossible d'obtenir la base, on s'en va : |
|
| 71 | + // il faut que la base existe ou que le repertoire parent soit writable |
|
| 72 | + if ($db and !is_file($f .= $db . '.sqlite') and !is_writable(dirname($f))) { |
|
| 73 | + spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.' . _LOG_HS); |
|
| 74 | + |
|
| 75 | + return false; |
|
| 76 | + } |
|
| 77 | + |
|
| 78 | + // charger les modules sqlite au besoin |
|
| 79 | + if (!_sqlite_charger_version($sqlite_version)) { |
|
| 80 | + spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.' . _LOG_HS); |
|
| 81 | + |
|
| 82 | + return false; |
|
| 83 | + } |
|
| 84 | + |
|
| 85 | + // chargement des constantes |
|
| 86 | + // il ne faut pas definir les constantes avant d'avoir charge les modules sqlite |
|
| 87 | + $define = 'spip_sqlite' . $sqlite_version . '_constantes'; |
|
| 88 | + $define(); |
|
| 89 | + |
|
| 90 | + $ok = false; |
|
| 91 | + if (!$db) { |
|
| 92 | + // si pas de db -> |
|
| 93 | + // base temporaire tant qu'on ne connait pas son vrai nom |
|
| 94 | + // pour tester la connexion |
|
| 95 | + $db = '_sqlite' . $sqlite_version . '_install'; |
|
| 96 | + $tmp = _DIR_DB . $db . '.sqlite'; |
|
| 97 | + $ok = $link = new \PDO("sqlite:$tmp"); |
|
| 98 | + } else { |
|
| 99 | + // Ouvrir (eventuellement creer la base) |
|
| 100 | + $ok = $link = new \PDO("sqlite:$f"); |
|
| 101 | + } |
|
| 102 | + |
|
| 103 | + if (!$ok) { |
|
| 104 | + $e = _sqlite_last_error_from_link($link); |
|
| 105 | + spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f : $e", 'sqlite.' . _LOG_HS); |
|
| 106 | + |
|
| 107 | + return false; |
|
| 108 | + } |
|
| 109 | + |
|
| 110 | + if ($link) { |
|
| 111 | + $last_connect = [ |
|
| 112 | + 'addr' => $addr, |
|
| 113 | + 'port' => $port, |
|
| 114 | + 'login' => $login, |
|
| 115 | + 'pass' => $pass, |
|
| 116 | + 'db' => $db, |
|
| 117 | + 'prefixe' => $prefixe, |
|
| 118 | + ]; |
|
| 119 | + // etre sur qu'on definit bien les fonctions a chaque nouvelle connexion |
|
| 120 | + include_spip('req/sqlite_fonctions'); |
|
| 121 | + _sqlite_init_functions($link); |
|
| 122 | + } |
|
| 123 | + |
|
| 124 | + return [ |
|
| 125 | + 'db' => $db, |
|
| 126 | + 'prefixe' => $prefixe ? $prefixe : $db, |
|
| 127 | + 'link' => $link, |
|
| 128 | + 'total_requetes' => 0, |
|
| 129 | + ]; |
|
| 130 | 130 | } |
| 131 | 131 | |
| 132 | 132 | |
@@ -145,14 +145,14 @@ discard block |
||
| 145 | 145 | * Resultat de la requete |
| 146 | 146 | */ |
| 147 | 147 | function spip_sqlite_query($query, $serveur = '', $requeter = true) { |
| 148 | - #spip_log("spip_sqlite_query() > $query",'sqlite.'._LOG_DEBUG); |
|
| 149 | - #_sqlite_init(); // fait la premiere fois dans spip_sqlite |
|
| 150 | - $query = spip_sqlite::traduire_requete($query, $serveur); |
|
| 151 | - if (!$requeter) { |
|
| 152 | - return $query; |
|
| 153 | - } |
|
| 148 | + #spip_log("spip_sqlite_query() > $query",'sqlite.'._LOG_DEBUG); |
|
| 149 | + #_sqlite_init(); // fait la premiere fois dans spip_sqlite |
|
| 150 | + $query = spip_sqlite::traduire_requete($query, $serveur); |
|
| 151 | + if (!$requeter) { |
|
| 152 | + return $query; |
|
| 153 | + } |
|
| 154 | 154 | |
| 155 | - return spip_sqlite::executer_requete($query, $serveur); |
|
| 155 | + return spip_sqlite::executer_requete($query, $serveur); |
|
| 156 | 156 | } |
| 157 | 157 | |
| 158 | 158 | |
@@ -169,11 +169,11 @@ discard block |
||
| 169 | 169 | */ |
| 170 | 170 | function spip_sqlite_alter($query, $serveur = '', $requeter = true) { |
| 171 | 171 | |
| 172 | - $query = spip_sqlite_query("ALTER $query", $serveur, false); |
|
| 173 | - // traduire la requete pour recuperer les bons noms de table |
|
| 174 | - $query = spip_sqlite::traduire_requete($query, $serveur); |
|
| 172 | + $query = spip_sqlite_query("ALTER $query", $serveur, false); |
|
| 173 | + // traduire la requete pour recuperer les bons noms de table |
|
| 174 | + $query = spip_sqlite::traduire_requete($query, $serveur); |
|
| 175 | 175 | |
| 176 | - /* |
|
| 176 | + /* |
|
| 177 | 177 | * la il faut faire les transformations |
| 178 | 178 | * si ALTER TABLE x (DROP|CHANGE) y |
| 179 | 179 | * |
@@ -182,251 +182,251 @@ discard block |
||
| 182 | 182 | * 3) faire chaque requete independemment |
| 183 | 183 | */ |
| 184 | 184 | |
| 185 | - // 1 |
|
| 186 | - if (preg_match('/\s*(ALTER(\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is', $query, $regs)) { |
|
| 187 | - $debut = $regs[1]; |
|
| 188 | - $table = $regs[3]; |
|
| 189 | - $suite = $regs[4]; |
|
| 190 | - } else { |
|
| 191 | - spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.' . _LOG_ERREUR); |
|
| 192 | - |
|
| 193 | - return false; |
|
| 194 | - } |
|
| 195 | - |
|
| 196 | - // 2 |
|
| 197 | - // il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB) |
|
| 198 | - // tout en cassant "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... en deux |
|
| 199 | - // ou revoir l'api de sql_alter en creant un |
|
| 200 | - // sql_alter_table($table,array($actions)); |
|
| 201 | - $todo = explode(',', $suite); |
|
| 202 | - |
|
| 203 | - // on remet les morceaux dechires ensembles... que c'est laid ! |
|
| 204 | - $todo2 = []; |
|
| 205 | - $i = 0; |
|
| 206 | - $ouverte = false; |
|
| 207 | - while ($do = array_shift($todo)) { |
|
| 208 | - $todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . ',' . $do : $do; |
|
| 209 | - $o = (false !== strpos($do, '(')); |
|
| 210 | - $f = (false !== strpos($do, ')')); |
|
| 211 | - if ($o and !$f) { |
|
| 212 | - $ouverte = true; |
|
| 213 | - } elseif ($f) { |
|
| 214 | - $ouverte = false; |
|
| 215 | - } |
|
| 216 | - if (!$ouverte) { |
|
| 217 | - $i++; |
|
| 218 | - } |
|
| 219 | - } |
|
| 220 | - |
|
| 221 | - // 3 |
|
| 222 | - $resultats = []; |
|
| 223 | - foreach ($todo2 as $do) { |
|
| 224 | - $do = trim($do); |
|
| 225 | - if ( |
|
| 226 | - !preg_match('/(DROP PRIMARY KEY|DROP KEY|DROP INDEX|DROP COLUMN|DROP' |
|
| 227 | - . '|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME' |
|
| 228 | - . '|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE' |
|
| 229 | - . '|ADD COLUMN|ADD' |
|
| 230 | - . ')\s*([^\s]*)\s*(.*)?/i', $do, $matches) |
|
| 231 | - ) { |
|
| 232 | - spip_log( |
|
| 233 | - "SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)", |
|
| 234 | - 'sqlite.' . _LOG_ERREUR |
|
| 235 | - ); |
|
| 236 | - |
|
| 237 | - return false; |
|
| 238 | - } |
|
| 239 | - |
|
| 240 | - $cle = strtoupper($matches[1]); |
|
| 241 | - $colonne_origine = $matches[2]; |
|
| 242 | - $colonne_destination = ''; |
|
| 243 | - |
|
| 244 | - $def = $matches[3]; |
|
| 245 | - |
|
| 246 | - // eluder une eventuelle clause before|after|first inutilisable |
|
| 247 | - $defr = rtrim(preg_replace('/(BEFORE|AFTER|FIRST)(.*)$/is', '', $def)); |
|
| 248 | - $defo = $defr; // garder la def d'origine pour certains cas |
|
| 249 | - // remplacer les definitions venant de mysql |
|
| 250 | - $defr = _sqlite_remplacements_definitions_table($defr); |
|
| 251 | - |
|
| 252 | - // reinjecter dans le do |
|
| 253 | - $do = str_replace($def, $defr, $do); |
|
| 254 | - $def = $defr; |
|
| 255 | - |
|
| 256 | - switch ($cle) { |
|
| 257 | - // suppression d'un index |
|
| 258 | - case 'DROP KEY': |
|
| 259 | - case 'DROP INDEX': |
|
| 260 | - $nom_index = $colonne_origine; |
|
| 261 | - spip_sqlite_drop_index($nom_index, $table, $serveur); |
|
| 262 | - break; |
|
| 263 | - |
|
| 264 | - // suppression d'une pk |
|
| 265 | - case 'DROP PRIMARY KEY': |
|
| 266 | - if ( |
|
| 267 | - !_sqlite_modifier_table( |
|
| 268 | - $table, |
|
| 269 | - $colonne_origine, |
|
| 270 | - ['key' => ['PRIMARY KEY' => '']], |
|
| 271 | - $serveur |
|
| 272 | - ) |
|
| 273 | - ) { |
|
| 274 | - return false; |
|
| 275 | - } |
|
| 276 | - break; |
|
| 277 | - // suppression d'une colonne |
|
| 278 | - case 'DROP COLUMN': |
|
| 279 | - case 'DROP': |
|
| 280 | - if ( |
|
| 281 | - !_sqlite_modifier_table( |
|
| 282 | - $table, |
|
| 283 | - [$colonne_origine => ''], |
|
| 284 | - [], |
|
| 285 | - $serveur |
|
| 286 | - ) |
|
| 287 | - ) { |
|
| 288 | - return false; |
|
| 289 | - } |
|
| 290 | - break; |
|
| 291 | - |
|
| 292 | - case 'CHANGE COLUMN': |
|
| 293 | - case 'CHANGE': |
|
| 294 | - // recuperer le nom de la future colonne |
|
| 295 | - // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation |
|
| 296 | - // en tenant compte de la cle primaire (ce qui est mieux) |
|
| 297 | - $def = trim($defo); |
|
| 298 | - $colonne_destination = substr($def, 0, strpos($def, ' ')); |
|
| 299 | - $def = substr($def, strlen($colonne_destination) + 1); |
|
| 300 | - |
|
| 301 | - if ( |
|
| 302 | - !_sqlite_modifier_table( |
|
| 303 | - $table, |
|
| 304 | - [$colonne_origine => $colonne_destination], |
|
| 305 | - ['field' => [$colonne_destination => $def]], |
|
| 306 | - $serveur |
|
| 307 | - ) |
|
| 308 | - ) { |
|
| 309 | - return false; |
|
| 310 | - } |
|
| 311 | - break; |
|
| 312 | - |
|
| 313 | - case 'MODIFY': |
|
| 314 | - // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation |
|
| 315 | - // en tenant compte de la cle primaire (ce qui est mieux) |
|
| 316 | - if ( |
|
| 317 | - !_sqlite_modifier_table( |
|
| 318 | - $table, |
|
| 319 | - $colonne_origine, |
|
| 320 | - ['field' => [$colonne_origine => $defo]], |
|
| 321 | - $serveur |
|
| 322 | - ) |
|
| 323 | - ) { |
|
| 324 | - return false; |
|
| 325 | - } |
|
| 326 | - break; |
|
| 327 | - |
|
| 328 | - // pas geres en sqlite2 |
|
| 329 | - case 'RENAME': |
|
| 330 | - $do = 'RENAME TO' . substr($do, 6); |
|
| 331 | - case 'RENAME TO': |
|
| 332 | - if (!spip_sqlite::executer_requete("$debut $do", $serveur)) { |
|
| 333 | - spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR); |
|
| 334 | - |
|
| 335 | - return false; |
|
| 336 | - } |
|
| 337 | - break; |
|
| 338 | - |
|
| 339 | - // ajout d'une pk |
|
| 340 | - case 'ADD PRIMARY KEY': |
|
| 341 | - $pk = trim(substr($do, 16)); |
|
| 342 | - $pk = ($pk[0] == '(') ? substr($pk, 1, -1) : $pk; |
|
| 343 | - if ( |
|
| 344 | - !_sqlite_modifier_table( |
|
| 345 | - $table, |
|
| 346 | - $colonne_origine, |
|
| 347 | - ['key' => ['PRIMARY KEY' => $pk]], |
|
| 348 | - $serveur |
|
| 349 | - ) |
|
| 350 | - ) { |
|
| 351 | - return false; |
|
| 352 | - } |
|
| 353 | - break; |
|
| 354 | - // ajout d'un index |
|
| 355 | - case 'ADD UNIQUE KEY': |
|
| 356 | - case 'ADD UNIQUE': |
|
| 357 | - $unique = true; |
|
| 358 | - case 'ADD INDEX': |
|
| 359 | - case 'ADD KEY': |
|
| 360 | - if (!isset($unique)) { |
|
| 361 | - $unique = false; |
|
| 362 | - } |
|
| 363 | - // peut etre "(colonne)" ou "nom_index (colonnes)" |
|
| 364 | - // bug potentiel si qqn met "(colonne, colonne)" |
|
| 365 | - // |
|
| 366 | - // nom_index (colonnes) |
|
| 367 | - if ($def) { |
|
| 368 | - $colonnes = substr($def, 1, -1); |
|
| 369 | - $nom_index = $colonne_origine; |
|
| 370 | - } else { |
|
| 371 | - // (colonne) |
|
| 372 | - if ($colonne_origine[0] == '(') { |
|
| 373 | - $colonnes = substr($colonne_origine, 1, -1); |
|
| 374 | - if (false !== strpos(',', $colonnes)) { |
|
| 375 | - spip_log('SQLite : Erreur, impossible de creer un index sur plusieurs colonnes' |
|
| 376 | - . " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.' . _LOG_ERREUR); |
|
| 377 | - break; |
|
| 378 | - } else { |
|
| 379 | - $nom_index = $colonnes; |
|
| 380 | - } |
|
| 381 | - } // nom_index |
|
| 382 | - else { |
|
| 383 | - $nom_index = $colonnes = $colonne_origine; |
|
| 384 | - } |
|
| 385 | - } |
|
| 386 | - spip_sqlite_create_index($nom_index, $table, $colonnes, $unique, $serveur); |
|
| 387 | - break; |
|
| 388 | - |
|
| 389 | - // pas geres en sqlite2 |
|
| 390 | - case 'ADD COLUMN': |
|
| 391 | - $do = 'ADD' . substr($do, 10); |
|
| 392 | - case 'ADD': |
|
| 393 | - default: |
|
| 394 | - if (!preg_match(',primary\s+key,i', $do)) { |
|
| 395 | - if (!spip_sqlite::executer_requete("$debut $do", $serveur)) { |
|
| 396 | - spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR); |
|
| 397 | - |
|
| 398 | - return false; |
|
| 399 | - } |
|
| 400 | - break; |
|
| 401 | - } |
|
| 402 | - // ou si la colonne est aussi primary key |
|
| 403 | - // cas du add id_truc int primary key |
|
| 404 | - // ajout d'une colonne qui passe en primary key directe |
|
| 405 | - else { |
|
| 406 | - $def = trim(substr($do, 3)); |
|
| 407 | - $colonne_ajoutee = substr($def, 0, strpos($def, ' ')); |
|
| 408 | - $def = substr($def, strlen($colonne_ajoutee) + 1); |
|
| 409 | - $opts = []; |
|
| 410 | - if (preg_match(',primary\s+key,i', $def)) { |
|
| 411 | - $opts['key'] = ['PRIMARY KEY' => $colonne_ajoutee]; |
|
| 412 | - $def = preg_replace(',primary\s+key,i', '', $def); |
|
| 413 | - } |
|
| 414 | - $opts['field'] = [$colonne_ajoutee => $def]; |
|
| 415 | - if (!_sqlite_modifier_table($table, [$colonne_ajoutee], $opts, $serveur)) { |
|
| 416 | - spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR); |
|
| 417 | - |
|
| 418 | - return false; |
|
| 419 | - } |
|
| 420 | - } |
|
| 421 | - break; |
|
| 422 | - } |
|
| 423 | - // tout est bon, ouf ! |
|
| 424 | - spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.' . _LOG_INFO); |
|
| 425 | - } |
|
| 426 | - |
|
| 427 | - spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.' . _LOG_INFO); |
|
| 428 | - |
|
| 429 | - return true; |
|
| 185 | + // 1 |
|
| 186 | + if (preg_match('/\s*(ALTER(\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is', $query, $regs)) { |
|
| 187 | + $debut = $regs[1]; |
|
| 188 | + $table = $regs[3]; |
|
| 189 | + $suite = $regs[4]; |
|
| 190 | + } else { |
|
| 191 | + spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.' . _LOG_ERREUR); |
|
| 192 | + |
|
| 193 | + return false; |
|
| 194 | + } |
|
| 195 | + |
|
| 196 | + // 2 |
|
| 197 | + // il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB) |
|
| 198 | + // tout en cassant "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... en deux |
|
| 199 | + // ou revoir l'api de sql_alter en creant un |
|
| 200 | + // sql_alter_table($table,array($actions)); |
|
| 201 | + $todo = explode(',', $suite); |
|
| 202 | + |
|
| 203 | + // on remet les morceaux dechires ensembles... que c'est laid ! |
|
| 204 | + $todo2 = []; |
|
| 205 | + $i = 0; |
|
| 206 | + $ouverte = false; |
|
| 207 | + while ($do = array_shift($todo)) { |
|
| 208 | + $todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . ',' . $do : $do; |
|
| 209 | + $o = (false !== strpos($do, '(')); |
|
| 210 | + $f = (false !== strpos($do, ')')); |
|
| 211 | + if ($o and !$f) { |
|
| 212 | + $ouverte = true; |
|
| 213 | + } elseif ($f) { |
|
| 214 | + $ouverte = false; |
|
| 215 | + } |
|
| 216 | + if (!$ouverte) { |
|
| 217 | + $i++; |
|
| 218 | + } |
|
| 219 | + } |
|
| 220 | + |
|
| 221 | + // 3 |
|
| 222 | + $resultats = []; |
|
| 223 | + foreach ($todo2 as $do) { |
|
| 224 | + $do = trim($do); |
|
| 225 | + if ( |
|
| 226 | + !preg_match('/(DROP PRIMARY KEY|DROP KEY|DROP INDEX|DROP COLUMN|DROP' |
|
| 227 | + . '|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME' |
|
| 228 | + . '|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE' |
|
| 229 | + . '|ADD COLUMN|ADD' |
|
| 230 | + . ')\s*([^\s]*)\s*(.*)?/i', $do, $matches) |
|
| 231 | + ) { |
|
| 232 | + spip_log( |
|
| 233 | + "SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)", |
|
| 234 | + 'sqlite.' . _LOG_ERREUR |
|
| 235 | + ); |
|
| 236 | + |
|
| 237 | + return false; |
|
| 238 | + } |
|
| 239 | + |
|
| 240 | + $cle = strtoupper($matches[1]); |
|
| 241 | + $colonne_origine = $matches[2]; |
|
| 242 | + $colonne_destination = ''; |
|
| 243 | + |
|
| 244 | + $def = $matches[3]; |
|
| 245 | + |
|
| 246 | + // eluder une eventuelle clause before|after|first inutilisable |
|
| 247 | + $defr = rtrim(preg_replace('/(BEFORE|AFTER|FIRST)(.*)$/is', '', $def)); |
|
| 248 | + $defo = $defr; // garder la def d'origine pour certains cas |
|
| 249 | + // remplacer les definitions venant de mysql |
|
| 250 | + $defr = _sqlite_remplacements_definitions_table($defr); |
|
| 251 | + |
|
| 252 | + // reinjecter dans le do |
|
| 253 | + $do = str_replace($def, $defr, $do); |
|
| 254 | + $def = $defr; |
|
| 255 | + |
|
| 256 | + switch ($cle) { |
|
| 257 | + // suppression d'un index |
|
| 258 | + case 'DROP KEY': |
|
| 259 | + case 'DROP INDEX': |
|
| 260 | + $nom_index = $colonne_origine; |
|
| 261 | + spip_sqlite_drop_index($nom_index, $table, $serveur); |
|
| 262 | + break; |
|
| 263 | + |
|
| 264 | + // suppression d'une pk |
|
| 265 | + case 'DROP PRIMARY KEY': |
|
| 266 | + if ( |
|
| 267 | + !_sqlite_modifier_table( |
|
| 268 | + $table, |
|
| 269 | + $colonne_origine, |
|
| 270 | + ['key' => ['PRIMARY KEY' => '']], |
|
| 271 | + $serveur |
|
| 272 | + ) |
|
| 273 | + ) { |
|
| 274 | + return false; |
|
| 275 | + } |
|
| 276 | + break; |
|
| 277 | + // suppression d'une colonne |
|
| 278 | + case 'DROP COLUMN': |
|
| 279 | + case 'DROP': |
|
| 280 | + if ( |
|
| 281 | + !_sqlite_modifier_table( |
|
| 282 | + $table, |
|
| 283 | + [$colonne_origine => ''], |
|
| 284 | + [], |
|
| 285 | + $serveur |
|
| 286 | + ) |
|
| 287 | + ) { |
|
| 288 | + return false; |
|
| 289 | + } |
|
| 290 | + break; |
|
| 291 | + |
|
| 292 | + case 'CHANGE COLUMN': |
|
| 293 | + case 'CHANGE': |
|
| 294 | + // recuperer le nom de la future colonne |
|
| 295 | + // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation |
|
| 296 | + // en tenant compte de la cle primaire (ce qui est mieux) |
|
| 297 | + $def = trim($defo); |
|
| 298 | + $colonne_destination = substr($def, 0, strpos($def, ' ')); |
|
| 299 | + $def = substr($def, strlen($colonne_destination) + 1); |
|
| 300 | + |
|
| 301 | + if ( |
|
| 302 | + !_sqlite_modifier_table( |
|
| 303 | + $table, |
|
| 304 | + [$colonne_origine => $colonne_destination], |
|
| 305 | + ['field' => [$colonne_destination => $def]], |
|
| 306 | + $serveur |
|
| 307 | + ) |
|
| 308 | + ) { |
|
| 309 | + return false; |
|
| 310 | + } |
|
| 311 | + break; |
|
| 312 | + |
|
| 313 | + case 'MODIFY': |
|
| 314 | + // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation |
|
| 315 | + // en tenant compte de la cle primaire (ce qui est mieux) |
|
| 316 | + if ( |
|
| 317 | + !_sqlite_modifier_table( |
|
| 318 | + $table, |
|
| 319 | + $colonne_origine, |
|
| 320 | + ['field' => [$colonne_origine => $defo]], |
|
| 321 | + $serveur |
|
| 322 | + ) |
|
| 323 | + ) { |
|
| 324 | + return false; |
|
| 325 | + } |
|
| 326 | + break; |
|
| 327 | + |
|
| 328 | + // pas geres en sqlite2 |
|
| 329 | + case 'RENAME': |
|
| 330 | + $do = 'RENAME TO' . substr($do, 6); |
|
| 331 | + case 'RENAME TO': |
|
| 332 | + if (!spip_sqlite::executer_requete("$debut $do", $serveur)) { |
|
| 333 | + spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR); |
|
| 334 | + |
|
| 335 | + return false; |
|
| 336 | + } |
|
| 337 | + break; |
|
| 338 | + |
|
| 339 | + // ajout d'une pk |
|
| 340 | + case 'ADD PRIMARY KEY': |
|
| 341 | + $pk = trim(substr($do, 16)); |
|
| 342 | + $pk = ($pk[0] == '(') ? substr($pk, 1, -1) : $pk; |
|
| 343 | + if ( |
|
| 344 | + !_sqlite_modifier_table( |
|
| 345 | + $table, |
|
| 346 | + $colonne_origine, |
|
| 347 | + ['key' => ['PRIMARY KEY' => $pk]], |
|
| 348 | + $serveur |
|
| 349 | + ) |
|
| 350 | + ) { |
|
| 351 | + return false; |
|
| 352 | + } |
|
| 353 | + break; |
|
| 354 | + // ajout d'un index |
|
| 355 | + case 'ADD UNIQUE KEY': |
|
| 356 | + case 'ADD UNIQUE': |
|
| 357 | + $unique = true; |
|
| 358 | + case 'ADD INDEX': |
|
| 359 | + case 'ADD KEY': |
|
| 360 | + if (!isset($unique)) { |
|
| 361 | + $unique = false; |
|
| 362 | + } |
|
| 363 | + // peut etre "(colonne)" ou "nom_index (colonnes)" |
|
| 364 | + // bug potentiel si qqn met "(colonne, colonne)" |
|
| 365 | + // |
|
| 366 | + // nom_index (colonnes) |
|
| 367 | + if ($def) { |
|
| 368 | + $colonnes = substr($def, 1, -1); |
|
| 369 | + $nom_index = $colonne_origine; |
|
| 370 | + } else { |
|
| 371 | + // (colonne) |
|
| 372 | + if ($colonne_origine[0] == '(') { |
|
| 373 | + $colonnes = substr($colonne_origine, 1, -1); |
|
| 374 | + if (false !== strpos(',', $colonnes)) { |
|
| 375 | + spip_log('SQLite : Erreur, impossible de creer un index sur plusieurs colonnes' |
|
| 376 | + . " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.' . _LOG_ERREUR); |
|
| 377 | + break; |
|
| 378 | + } else { |
|
| 379 | + $nom_index = $colonnes; |
|
| 380 | + } |
|
| 381 | + } // nom_index |
|
| 382 | + else { |
|
| 383 | + $nom_index = $colonnes = $colonne_origine; |
|
| 384 | + } |
|
| 385 | + } |
|
| 386 | + spip_sqlite_create_index($nom_index, $table, $colonnes, $unique, $serveur); |
|
| 387 | + break; |
|
| 388 | + |
|
| 389 | + // pas geres en sqlite2 |
|
| 390 | + case 'ADD COLUMN': |
|
| 391 | + $do = 'ADD' . substr($do, 10); |
|
| 392 | + case 'ADD': |
|
| 393 | + default: |
|
| 394 | + if (!preg_match(',primary\s+key,i', $do)) { |
|
| 395 | + if (!spip_sqlite::executer_requete("$debut $do", $serveur)) { |
|
| 396 | + spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR); |
|
| 397 | + |
|
| 398 | + return false; |
|
| 399 | + } |
|
| 400 | + break; |
|
| 401 | + } |
|
| 402 | + // ou si la colonne est aussi primary key |
|
| 403 | + // cas du add id_truc int primary key |
|
| 404 | + // ajout d'une colonne qui passe en primary key directe |
|
| 405 | + else { |
|
| 406 | + $def = trim(substr($do, 3)); |
|
| 407 | + $colonne_ajoutee = substr($def, 0, strpos($def, ' ')); |
|
| 408 | + $def = substr($def, strlen($colonne_ajoutee) + 1); |
|
| 409 | + $opts = []; |
|
| 410 | + if (preg_match(',primary\s+key,i', $def)) { |
|
| 411 | + $opts['key'] = ['PRIMARY KEY' => $colonne_ajoutee]; |
|
| 412 | + $def = preg_replace(',primary\s+key,i', '', $def); |
|
| 413 | + } |
|
| 414 | + $opts['field'] = [$colonne_ajoutee => $def]; |
|
| 415 | + if (!_sqlite_modifier_table($table, [$colonne_ajoutee], $opts, $serveur)) { |
|
| 416 | + spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR); |
|
| 417 | + |
|
| 418 | + return false; |
|
| 419 | + } |
|
| 420 | + } |
|
| 421 | + break; |
|
| 422 | + } |
|
| 423 | + // tout est bon, ouf ! |
|
| 424 | + spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.' . _LOG_INFO); |
|
| 425 | + } |
|
| 426 | + |
|
| 427 | + spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.' . _LOG_INFO); |
|
| 428 | + |
|
| 429 | + return true; |
|
| 430 | 430 | } |
| 431 | 431 | |
| 432 | 432 | |
@@ -449,38 +449,38 @@ discard block |
||
| 449 | 449 | * - true si la requête réussie, false sinon. |
| 450 | 450 | */ |
| 451 | 451 | function spip_sqlite_create( |
| 452 | - $nom, |
|
| 453 | - $champs, |
|
| 454 | - $cles, |
|
| 455 | - $autoinc = false, |
|
| 456 | - $temporary = false, |
|
| 457 | - $serveur = '', |
|
| 458 | - $requeter = true |
|
| 452 | + $nom, |
|
| 453 | + $champs, |
|
| 454 | + $cles, |
|
| 455 | + $autoinc = false, |
|
| 456 | + $temporary = false, |
|
| 457 | + $serveur = '', |
|
| 458 | + $requeter = true |
|
| 459 | 459 | ) { |
| 460 | - $query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists = true, $serveur, $requeter); |
|
| 461 | - if (!$query) { |
|
| 462 | - return false; |
|
| 463 | - } |
|
| 464 | - $res = spip_sqlite_query($query, $serveur, $requeter); |
|
| 465 | - |
|
| 466 | - // SQLite ne cree pas les KEY sur les requetes CREATE TABLE |
|
| 467 | - // il faut donc les faire creer ensuite |
|
| 468 | - if (!$requeter) { |
|
| 469 | - return $res; |
|
| 470 | - } |
|
| 471 | - |
|
| 472 | - $ok = $res ? true : false; |
|
| 473 | - if ($ok) { |
|
| 474 | - foreach ($cles as $k => $v) { |
|
| 475 | - if (preg_match(',^(UNIQUE KEY|KEY|UNIQUE)\s,i', $k, $m)) { |
|
| 476 | - $index = trim(substr($k, strlen($m[1]))); |
|
| 477 | - $unique = (strlen($m[1]) > 3); |
|
| 478 | - $ok &= spip_sqlite_create_index($index, $nom, $v, $unique, $serveur); |
|
| 479 | - } |
|
| 480 | - } |
|
| 481 | - } |
|
| 482 | - |
|
| 483 | - return $ok ? true : false; |
|
| 460 | + $query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists = true, $serveur, $requeter); |
|
| 461 | + if (!$query) { |
|
| 462 | + return false; |
|
| 463 | + } |
|
| 464 | + $res = spip_sqlite_query($query, $serveur, $requeter); |
|
| 465 | + |
|
| 466 | + // SQLite ne cree pas les KEY sur les requetes CREATE TABLE |
|
| 467 | + // il faut donc les faire creer ensuite |
|
| 468 | + if (!$requeter) { |
|
| 469 | + return $res; |
|
| 470 | + } |
|
| 471 | + |
|
| 472 | + $ok = $res ? true : false; |
|
| 473 | + if ($ok) { |
|
| 474 | + foreach ($cles as $k => $v) { |
|
| 475 | + if (preg_match(',^(UNIQUE KEY|KEY|UNIQUE)\s,i', $k, $m)) { |
|
| 476 | + $index = trim(substr($k, strlen($m[1]))); |
|
| 477 | + $unique = (strlen($m[1]) > 3); |
|
| 478 | + $ok &= spip_sqlite_create_index($index, $nom, $v, $unique, $serveur); |
|
| 479 | + } |
|
| 480 | + } |
|
| 481 | + } |
|
| 482 | + |
|
| 483 | + return $ok ? true : false; |
|
| 484 | 484 | } |
| 485 | 485 | |
| 486 | 486 | /** |
@@ -493,21 +493,21 @@ discard block |
||
| 493 | 493 | * @return bool true si la base est créee. |
| 494 | 494 | **/ |
| 495 | 495 | function spip_sqlite_create_base($nom, $serveur = '', $option = true) { |
| 496 | - $f = $nom . '.sqlite'; |
|
| 497 | - if (strpos($nom, '/') === false) { |
|
| 498 | - $f = _DIR_DB . $f; |
|
| 499 | - } |
|
| 496 | + $f = $nom . '.sqlite'; |
|
| 497 | + if (strpos($nom, '/') === false) { |
|
| 498 | + $f = _DIR_DB . $f; |
|
| 499 | + } |
|
| 500 | 500 | |
| 501 | - $ok = new \PDO("sqlite:$f"); |
|
| 501 | + $ok = new \PDO("sqlite:$f"); |
|
| 502 | 502 | |
| 503 | - if ($ok) { |
|
| 504 | - unset($ok); |
|
| 503 | + if ($ok) { |
|
| 504 | + unset($ok); |
|
| 505 | 505 | |
| 506 | - return true; |
|
| 507 | - } |
|
| 508 | - unset($ok); |
|
| 506 | + return true; |
|
| 507 | + } |
|
| 508 | + unset($ok); |
|
| 509 | 509 | |
| 510 | - return false; |
|
| 510 | + return false; |
|
| 511 | 511 | } |
| 512 | 512 | |
| 513 | 513 | |
@@ -528,22 +528,22 @@ discard block |
||
| 528 | 528 | * - string texte de la requête si $requeter vaut false |
| 529 | 529 | */ |
| 530 | 530 | function spip_sqlite_create_view($nom, $query_select, $serveur = '', $requeter = true) { |
| 531 | - if (!$query_select) { |
|
| 532 | - return false; |
|
| 533 | - } |
|
| 534 | - // vue deja presente |
|
| 535 | - if (sql_showtable($nom, false, $serveur)) { |
|
| 536 | - spip_log( |
|
| 537 | - "Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)", |
|
| 538 | - 'sqlite.' . _LOG_ERREUR |
|
| 539 | - ); |
|
| 531 | + if (!$query_select) { |
|
| 532 | + return false; |
|
| 533 | + } |
|
| 534 | + // vue deja presente |
|
| 535 | + if (sql_showtable($nom, false, $serveur)) { |
|
| 536 | + spip_log( |
|
| 537 | + "Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)", |
|
| 538 | + 'sqlite.' . _LOG_ERREUR |
|
| 539 | + ); |
|
| 540 | 540 | |
| 541 | - return false; |
|
| 542 | - } |
|
| 541 | + return false; |
|
| 542 | + } |
|
| 543 | 543 | |
| 544 | - $query = "CREATE VIEW $nom AS " . $query_select; |
|
| 544 | + $query = "CREATE VIEW $nom AS " . $query_select; |
|
| 545 | 545 | |
| 546 | - return spip_sqlite_query($query, $serveur, $requeter); |
|
| 546 | + return spip_sqlite_query($query, $serveur, $requeter); |
|
| 547 | 547 | } |
| 548 | 548 | |
| 549 | 549 | /** |
@@ -565,54 +565,54 @@ discard block |
||
| 565 | 565 | * string : requête, false si erreur, true sinon. |
| 566 | 566 | */ |
| 567 | 567 | function spip_sqlite_create_index($nom, $table, $champs, $unique = '', $serveur = '', $requeter = true) { |
| 568 | - if (!($nom or $table or $champs)) { |
|
| 569 | - spip_log( |
|
| 570 | - "Champ manquant pour creer un index sqlite ($nom, $table, (" . join(',', $champs) . '))', |
|
| 571 | - 'sqlite.' . _LOG_ERREUR |
|
| 572 | - ); |
|
| 573 | - |
|
| 574 | - return false; |
|
| 575 | - } |
|
| 576 | - |
|
| 577 | - // SQLite ne differentie pas noms des index en fonction des tables |
|
| 578 | - // il faut donc creer des noms uniques d'index pour une base sqlite |
|
| 579 | - $nom = $table . '_' . $nom; |
|
| 580 | - // enlever d'eventuelles parentheses deja presentes sur champs |
|
| 581 | - if (!is_array($champs)) { |
|
| 582 | - if ($champs[0] == '(') { |
|
| 583 | - $champs = substr($champs, 1, -1); |
|
| 584 | - } |
|
| 585 | - $champs = [$champs]; |
|
| 586 | - // supprimer l'info de longueur d'index mysql en fin de champ |
|
| 587 | - $champs = preg_replace(',\(\d+\)$,', '', $champs); |
|
| 588 | - } |
|
| 589 | - |
|
| 590 | - $ifnotexists = ''; |
|
| 591 | - $version = spip_sqlite_fetch(spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur), '', $serveur); |
|
| 592 | - if (!function_exists('spip_version_compare')) { |
|
| 593 | - include_spip('plugins/installer'); |
|
| 594 | - } |
|
| 595 | - |
|
| 596 | - if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) { |
|
| 597 | - $ifnotexists = ' IF NOT EXISTS'; |
|
| 598 | - } else { |
|
| 599 | - /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */ |
|
| 600 | - $a = spip_sqlite_showtable($table, $serveur); |
|
| 601 | - if (isset($a['key']['KEY ' . $nom])) { |
|
| 602 | - return true; |
|
| 603 | - } |
|
| 604 | - } |
|
| 605 | - |
|
| 606 | - $query = 'CREATE ' . ($unique ? 'UNIQUE ' : '') . "INDEX$ifnotexists $nom ON $table (" . join(',', $champs) . ')'; |
|
| 607 | - $res = spip_sqlite_query($query, $serveur, $requeter); |
|
| 608 | - if (!$requeter) { |
|
| 609 | - return $res; |
|
| 610 | - } |
|
| 611 | - if ($res) { |
|
| 612 | - return true; |
|
| 613 | - } else { |
|
| 614 | - return false; |
|
| 615 | - } |
|
| 568 | + if (!($nom or $table or $champs)) { |
|
| 569 | + spip_log( |
|
| 570 | + "Champ manquant pour creer un index sqlite ($nom, $table, (" . join(',', $champs) . '))', |
|
| 571 | + 'sqlite.' . _LOG_ERREUR |
|
| 572 | + ); |
|
| 573 | + |
|
| 574 | + return false; |
|
| 575 | + } |
|
| 576 | + |
|
| 577 | + // SQLite ne differentie pas noms des index en fonction des tables |
|
| 578 | + // il faut donc creer des noms uniques d'index pour une base sqlite |
|
| 579 | + $nom = $table . '_' . $nom; |
|
| 580 | + // enlever d'eventuelles parentheses deja presentes sur champs |
|
| 581 | + if (!is_array($champs)) { |
|
| 582 | + if ($champs[0] == '(') { |
|
| 583 | + $champs = substr($champs, 1, -1); |
|
| 584 | + } |
|
| 585 | + $champs = [$champs]; |
|
| 586 | + // supprimer l'info de longueur d'index mysql en fin de champ |
|
| 587 | + $champs = preg_replace(',\(\d+\)$,', '', $champs); |
|
| 588 | + } |
|
| 589 | + |
|
| 590 | + $ifnotexists = ''; |
|
| 591 | + $version = spip_sqlite_fetch(spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur), '', $serveur); |
|
| 592 | + if (!function_exists('spip_version_compare')) { |
|
| 593 | + include_spip('plugins/installer'); |
|
| 594 | + } |
|
| 595 | + |
|
| 596 | + if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) { |
|
| 597 | + $ifnotexists = ' IF NOT EXISTS'; |
|
| 598 | + } else { |
|
| 599 | + /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */ |
|
| 600 | + $a = spip_sqlite_showtable($table, $serveur); |
|
| 601 | + if (isset($a['key']['KEY ' . $nom])) { |
|
| 602 | + return true; |
|
| 603 | + } |
|
| 604 | + } |
|
| 605 | + |
|
| 606 | + $query = 'CREATE ' . ($unique ? 'UNIQUE ' : '') . "INDEX$ifnotexists $nom ON $table (" . join(',', $champs) . ')'; |
|
| 607 | + $res = spip_sqlite_query($query, $serveur, $requeter); |
|
| 608 | + if (!$requeter) { |
|
| 609 | + return $res; |
|
| 610 | + } |
|
| 611 | + if ($res) { |
|
| 612 | + return true; |
|
| 613 | + } else { |
|
| 614 | + return false; |
|
| 615 | + } |
|
| 616 | 616 | } |
| 617 | 617 | |
| 618 | 618 | /** |
@@ -629,31 +629,31 @@ discard block |
||
| 629 | 629 | * @return int Nombre de lignes |
| 630 | 630 | */ |
| 631 | 631 | function spip_sqlite_count($r, $serveur = '', $requeter = true) { |
| 632 | - if (!$r) { |
|
| 633 | - return 0; |
|
| 634 | - } |
|
| 635 | - |
|
| 636 | - // select ou autre (insert, update,...) ? |
|
| 637 | - // (link,requete) a compter |
|
| 638 | - if (is_array($r->spipSqliteRowCount)) { |
|
| 639 | - list($link, $query) = $r->spipSqliteRowCount; |
|
| 640 | - // amelioration possible a tester intensivement : pas de order by pour compter ! |
|
| 641 | - // $query = preg_replace(",ORDER BY .+(LIMIT\s|HAVING\s|GROUP BY\s|$),Uims","\\1",$query); |
|
| 642 | - $query = "SELECT count(*) as zzzzsqlitecount FROM ($query)"; |
|
| 643 | - $l = $link->query($query); |
|
| 644 | - $i = 0; |
|
| 645 | - if ($l and $z = $l->fetch()) { |
|
| 646 | - $i = $z['zzzzsqlitecount']; |
|
| 647 | - } |
|
| 648 | - $r->spipSqliteRowCount = $i; |
|
| 649 | - } |
|
| 650 | - if (isset($r->spipSqliteRowCount)) { |
|
| 651 | - // Ce compte est faux s'il y a des limit dans la requete :( |
|
| 652 | - // il retourne le nombre d'enregistrements sans le limit |
|
| 653 | - return $r->spipSqliteRowCount; |
|
| 654 | - } else { |
|
| 655 | - return $r->rowCount(); |
|
| 656 | - } |
|
| 632 | + if (!$r) { |
|
| 633 | + return 0; |
|
| 634 | + } |
|
| 635 | + |
|
| 636 | + // select ou autre (insert, update,...) ? |
|
| 637 | + // (link,requete) a compter |
|
| 638 | + if (is_array($r->spipSqliteRowCount)) { |
|
| 639 | + list($link, $query) = $r->spipSqliteRowCount; |
|
| 640 | + // amelioration possible a tester intensivement : pas de order by pour compter ! |
|
| 641 | + // $query = preg_replace(",ORDER BY .+(LIMIT\s|HAVING\s|GROUP BY\s|$),Uims","\\1",$query); |
|
| 642 | + $query = "SELECT count(*) as zzzzsqlitecount FROM ($query)"; |
|
| 643 | + $l = $link->query($query); |
|
| 644 | + $i = 0; |
|
| 645 | + if ($l and $z = $l->fetch()) { |
|
| 646 | + $i = $z['zzzzsqlitecount']; |
|
| 647 | + } |
|
| 648 | + $r->spipSqliteRowCount = $i; |
|
| 649 | + } |
|
| 650 | + if (isset($r->spipSqliteRowCount)) { |
|
| 651 | + // Ce compte est faux s'il y a des limit dans la requete :( |
|
| 652 | + // il retourne le nombre d'enregistrements sans le limit |
|
| 653 | + return $r->spipSqliteRowCount; |
|
| 654 | + } else { |
|
| 655 | + return $r->rowCount(); |
|
| 656 | + } |
|
| 657 | 657 | } |
| 658 | 658 | |
| 659 | 659 | |
@@ -672,30 +672,30 @@ discard block |
||
| 672 | 672 | * - false si la requête a échouée |
| 673 | 673 | **/ |
| 674 | 674 | function spip_sqlite_countsel( |
| 675 | - $from = [], |
|
| 676 | - $where = [], |
|
| 677 | - $groupby = '', |
|
| 678 | - $having = [], |
|
| 679 | - $serveur = '', |
|
| 680 | - $requeter = true |
|
| 675 | + $from = [], |
|
| 676 | + $where = [], |
|
| 677 | + $groupby = '', |
|
| 678 | + $having = [], |
|
| 679 | + $serveur = '', |
|
| 680 | + $requeter = true |
|
| 681 | 681 | ) { |
| 682 | - $c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby))); |
|
| 683 | - $r = spip_sqlite_select( |
|
| 684 | - "COUNT($c)", |
|
| 685 | - $from, |
|
| 686 | - $where, |
|
| 687 | - '', |
|
| 688 | - '', |
|
| 689 | - '', |
|
| 690 | - $having, |
|
| 691 | - $serveur, |
|
| 692 | - $requeter |
|
| 693 | - ); |
|
| 694 | - if ((is_resource($r) or is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3 |
|
| 695 | - list($r) = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur); |
|
| 696 | - } |
|
| 697 | - |
|
| 698 | - return $r; |
|
| 682 | + $c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby))); |
|
| 683 | + $r = spip_sqlite_select( |
|
| 684 | + "COUNT($c)", |
|
| 685 | + $from, |
|
| 686 | + $where, |
|
| 687 | + '', |
|
| 688 | + '', |
|
| 689 | + '', |
|
| 690 | + $having, |
|
| 691 | + $serveur, |
|
| 692 | + $requeter |
|
| 693 | + ); |
|
| 694 | + if ((is_resource($r) or is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3 |
|
| 695 | + list($r) = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur); |
|
| 696 | + } |
|
| 697 | + |
|
| 698 | + return $r; |
|
| 699 | 699 | } |
| 700 | 700 | |
| 701 | 701 | |
@@ -712,24 +712,24 @@ discard block |
||
| 712 | 712 | * - False en cas d'erreur. |
| 713 | 713 | **/ |
| 714 | 714 | function spip_sqlite_delete($table, $where = '', $serveur = '', $requeter = true) { |
| 715 | - $res = spip_sqlite_query( |
|
| 716 | - _sqlite_calculer_expression('DELETE FROM', $table, ',') |
|
| 717 | - . _sqlite_calculer_expression('WHERE', $where), |
|
| 718 | - $serveur, |
|
| 719 | - $requeter |
|
| 720 | - ); |
|
| 715 | + $res = spip_sqlite_query( |
|
| 716 | + _sqlite_calculer_expression('DELETE FROM', $table, ',') |
|
| 717 | + . _sqlite_calculer_expression('WHERE', $where), |
|
| 718 | + $serveur, |
|
| 719 | + $requeter |
|
| 720 | + ); |
|
| 721 | 721 | |
| 722 | - // renvoyer la requete inerte si demandee |
|
| 723 | - if (!$requeter) { |
|
| 724 | - return $res; |
|
| 725 | - } |
|
| 722 | + // renvoyer la requete inerte si demandee |
|
| 723 | + if (!$requeter) { |
|
| 724 | + return $res; |
|
| 725 | + } |
|
| 726 | 726 | |
| 727 | - if ($res) { |
|
| 728 | - $link = _sqlite_link($serveur); |
|
| 729 | - return $res->rowCount(); |
|
| 730 | - } else { |
|
| 731 | - return false; |
|
| 732 | - } |
|
| 727 | + if ($res) { |
|
| 728 | + $link = _sqlite_link($serveur); |
|
| 729 | + return $res->rowCount(); |
|
| 730 | + } else { |
|
| 731 | + return false; |
|
| 732 | + } |
|
| 733 | 733 | } |
| 734 | 734 | |
| 735 | 735 | |
@@ -745,15 +745,15 @@ discard block |
||
| 745 | 745 | * - true si la requête a réussie, false sinon |
| 746 | 746 | */ |
| 747 | 747 | function spip_sqlite_drop_table($table, $exist = '', $serveur = '', $requeter = true) { |
| 748 | - if ($exist) { |
|
| 749 | - $exist = ' IF EXISTS'; |
|
| 750 | - } |
|
| 748 | + if ($exist) { |
|
| 749 | + $exist = ' IF EXISTS'; |
|
| 750 | + } |
|
| 751 | 751 | |
| 752 | - if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) { |
|
| 753 | - return true; |
|
| 754 | - } else { |
|
| 755 | - return false; |
|
| 756 | - } |
|
| 752 | + if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) { |
|
| 753 | + return true; |
|
| 754 | + } else { |
|
| 755 | + return false; |
|
| 756 | + } |
|
| 757 | 757 | } |
| 758 | 758 | |
| 759 | 759 | |
@@ -769,11 +769,11 @@ discard block |
||
| 769 | 769 | * - true si la requête a réussie, false sinon |
| 770 | 770 | */ |
| 771 | 771 | function spip_sqlite_drop_view($view, $exist = '', $serveur = '', $requeter = true) { |
| 772 | - if ($exist) { |
|
| 773 | - $exist = ' IF EXISTS'; |
|
| 774 | - } |
|
| 772 | + if ($exist) { |
|
| 773 | + $exist = ' IF EXISTS'; |
|
| 774 | + } |
|
| 775 | 775 | |
| 776 | - return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter); |
|
| 776 | + return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter); |
|
| 777 | 777 | } |
| 778 | 778 | |
| 779 | 779 | /** |
@@ -787,20 +787,20 @@ discard block |
||
| 787 | 787 | * @return bool ou requete |
| 788 | 788 | */ |
| 789 | 789 | function spip_sqlite_drop_index($nom, $table, $serveur = '', $requeter = true) { |
| 790 | - if (!($nom or $table)) { |
|
| 791 | - spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.' . _LOG_ERREUR); |
|
| 790 | + if (!($nom or $table)) { |
|
| 791 | + spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.' . _LOG_ERREUR); |
|
| 792 | 792 | |
| 793 | - return false; |
|
| 794 | - } |
|
| 793 | + return false; |
|
| 794 | + } |
|
| 795 | 795 | |
| 796 | - // SQLite ne differentie pas noms des index en fonction des tables |
|
| 797 | - // il faut donc creer des noms uniques d'index pour une base sqlite |
|
| 798 | - $index = $table . '_' . $nom; |
|
| 799 | - $exist = ' IF EXISTS'; |
|
| 796 | + // SQLite ne differentie pas noms des index en fonction des tables |
|
| 797 | + // il faut donc creer des noms uniques d'index pour une base sqlite |
|
| 798 | + $index = $table . '_' . $nom; |
|
| 799 | + $exist = ' IF EXISTS'; |
|
| 800 | 800 | |
| 801 | - $query = "DROP INDEX$exist $index"; |
|
| 801 | + $query = "DROP INDEX$exist $index"; |
|
| 802 | 802 | |
| 803 | - return spip_sqlite_query($query, $serveur, $requeter); |
|
| 803 | + return spip_sqlite_query($query, $serveur, $requeter); |
|
| 804 | 804 | } |
| 805 | 805 | |
| 806 | 806 | /** |
@@ -816,28 +816,28 @@ discard block |
||
| 816 | 816 | * Erreur eventuelle |
| 817 | 817 | **/ |
| 818 | 818 | function spip_sqlite_error($query = '', $serveur = '') { |
| 819 | - $link = _sqlite_link($serveur); |
|
| 819 | + $link = _sqlite_link($serveur); |
|
| 820 | 820 | |
| 821 | - if ($link) { |
|
| 822 | - $errs = $link->errorInfo(); |
|
| 823 | - $s = _sqlite_last_error_from_link($link); |
|
| 824 | - } else { |
|
| 825 | - $s = ': aucune ressource sqlite (link)'; |
|
| 826 | - } |
|
| 827 | - if ($s) { |
|
| 828 | - $trace = debug_backtrace(); |
|
| 829 | - if ($trace[0]['function'] != 'spip_sqlite_error') { |
|
| 830 | - spip_log("$s - $query - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR); |
|
| 831 | - } |
|
| 832 | - } |
|
| 821 | + if ($link) { |
|
| 822 | + $errs = $link->errorInfo(); |
|
| 823 | + $s = _sqlite_last_error_from_link($link); |
|
| 824 | + } else { |
|
| 825 | + $s = ': aucune ressource sqlite (link)'; |
|
| 826 | + } |
|
| 827 | + if ($s) { |
|
| 828 | + $trace = debug_backtrace(); |
|
| 829 | + if ($trace[0]['function'] != 'spip_sqlite_error') { |
|
| 830 | + spip_log("$s - $query - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR); |
|
| 831 | + } |
|
| 832 | + } |
|
| 833 | 833 | |
| 834 | - return $s; |
|
| 834 | + return $s; |
|
| 835 | 835 | } |
| 836 | 836 | |
| 837 | 837 | function _sqlite_last_error_from_link($link) { |
| 838 | - if ($link) { |
|
| 839 | - $errs = $link->errorInfo(); |
|
| 840 | - /* |
|
| 838 | + if ($link) { |
|
| 839 | + $errs = $link->errorInfo(); |
|
| 840 | + /* |
|
| 841 | 841 | $errs[0] |
| 842 | 842 | numero SQLState ('HY000' souvent lors d'une erreur) |
| 843 | 843 | http://www.easysoft.com/developer/interfaces/odbc/sqlstate_status_return_codes.html |
@@ -847,11 +847,11 @@ discard block |
||
| 847 | 847 | $errs[2] |
| 848 | 848 | Le texte du message d'erreur |
| 849 | 849 | */ |
| 850 | - if (ltrim($errs[0], '0')) { // 00000 si pas d'erreur |
|
| 851 | - return "$errs[2]"; |
|
| 852 | - } |
|
| 853 | - } |
|
| 854 | - return ''; |
|
| 850 | + if (ltrim($errs[0], '0')) { // 00000 si pas d'erreur |
|
| 851 | + return "$errs[2]"; |
|
| 852 | + } |
|
| 853 | + } |
|
| 854 | + return ''; |
|
| 855 | 855 | } |
| 856 | 856 | |
| 857 | 857 | /** |
@@ -868,23 +868,23 @@ discard block |
||
| 868 | 868 | * 'HY000/1' : numéro de l'erreur SQLState / numéro d'erreur interne SQLite (en sqlite 3) |
| 869 | 869 | **/ |
| 870 | 870 | function spip_sqlite_errno($serveur = '') { |
| 871 | - $link = _sqlite_link($serveur); |
|
| 871 | + $link = _sqlite_link($serveur); |
|
| 872 | 872 | |
| 873 | - if ($link) { |
|
| 874 | - $t = $link->errorInfo(); |
|
| 875 | - $s = ltrim($t[0], '0'); // 00000 si pas d'erreur |
|
| 876 | - if ($s) { |
|
| 877 | - $s .= ' / ' . $t[1]; |
|
| 878 | - } // ajoute l'erreur du moteur SQLite |
|
| 879 | - } else { |
|
| 880 | - $s = ': aucune ressource sqlite (link)'; |
|
| 881 | - } |
|
| 873 | + if ($link) { |
|
| 874 | + $t = $link->errorInfo(); |
|
| 875 | + $s = ltrim($t[0], '0'); // 00000 si pas d'erreur |
|
| 876 | + if ($s) { |
|
| 877 | + $s .= ' / ' . $t[1]; |
|
| 878 | + } // ajoute l'erreur du moteur SQLite |
|
| 879 | + } else { |
|
| 880 | + $s = ': aucune ressource sqlite (link)'; |
|
| 881 | + } |
|
| 882 | 882 | |
| 883 | - if ($s) { |
|
| 884 | - spip_log("Erreur sqlite $s", 'sqlite.' . _LOG_ERREUR); |
|
| 885 | - } |
|
| 883 | + if ($s) { |
|
| 884 | + spip_log("Erreur sqlite $s", 'sqlite.' . _LOG_ERREUR); |
|
| 885 | + } |
|
| 886 | 886 | |
| 887 | - return $s ? $s : 0; |
|
| 887 | + return $s ? $s : 0; |
|
| 888 | 888 | } |
| 889 | 889 | |
| 890 | 890 | |
@@ -900,19 +900,19 @@ discard block |
||
| 900 | 900 | * - false si on a pas pu avoir d'explication |
| 901 | 901 | */ |
| 902 | 902 | function spip_sqlite_explain($query, $serveur = '', $requeter = true) { |
| 903 | - if (strpos(ltrim($query), 'SELECT') !== 0) { |
|
| 904 | - return []; |
|
| 905 | - } |
|
| 903 | + if (strpos(ltrim($query), 'SELECT') !== 0) { |
|
| 904 | + return []; |
|
| 905 | + } |
|
| 906 | 906 | |
| 907 | - $query = spip_sqlite::traduire_requete($query, $serveur); |
|
| 908 | - $query = 'EXPLAIN ' . $query; |
|
| 909 | - if (!$requeter) { |
|
| 910 | - return $query; |
|
| 911 | - } |
|
| 912 | - // on ne trace pas ces requetes, sinon on obtient un tracage sans fin... |
|
| 913 | - $r = spip_sqlite::executer_requete($query, $serveur, false); |
|
| 907 | + $query = spip_sqlite::traduire_requete($query, $serveur); |
|
| 908 | + $query = 'EXPLAIN ' . $query; |
|
| 909 | + if (!$requeter) { |
|
| 910 | + return $query; |
|
| 911 | + } |
|
| 912 | + // on ne trace pas ces requetes, sinon on obtient un tracage sans fin... |
|
| 913 | + $r = spip_sqlite::executer_requete($query, $serveur, false); |
|
| 914 | 914 | |
| 915 | - return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier |
|
| 915 | + return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier |
|
| 916 | 916 | } |
| 917 | 917 | |
| 918 | 918 | |
@@ -929,30 +929,30 @@ discard block |
||
| 929 | 929 | */ |
| 930 | 930 | function spip_sqlite_fetch($r, $t = '', $serveur = '', $requeter = true) { |
| 931 | 931 | |
| 932 | - $link = _sqlite_link($serveur); |
|
| 933 | - $t = $t ? $t : SPIP_SQLITE3_ASSOC; |
|
| 932 | + $link = _sqlite_link($serveur); |
|
| 933 | + $t = $t ? $t : SPIP_SQLITE3_ASSOC; |
|
| 934 | 934 | |
| 935 | - $retour = false; |
|
| 936 | - if ($r) { |
|
| 937 | - $retour = $r->fetch($t); |
|
| 938 | - } |
|
| 935 | + $retour = false; |
|
| 936 | + if ($r) { |
|
| 937 | + $retour = $r->fetch($t); |
|
| 938 | + } |
|
| 939 | 939 | |
| 940 | - // Renvoie des 'table.titre' au lieu de 'titre' tout court ! pff ! |
|
| 941 | - // suppression de 'table.' pour toutes les cles (c'est un peu violent !) |
|
| 942 | - // c'est couteux : on ne verifie que la premiere ligne pour voir si on le fait ou non |
|
| 943 | - if ( |
|
| 944 | - $retour |
|
| 945 | - and strpos(implode('', array_keys($retour)), '.') !== false |
|
| 946 | - ) { |
|
| 947 | - foreach ($retour as $cle => $val) { |
|
| 948 | - if (($pos = strpos($cle, '.')) !== false) { |
|
| 949 | - $retour[substr($cle, $pos + 1)] = &$retour[$cle]; |
|
| 950 | - unset($retour[$cle]); |
|
| 951 | - } |
|
| 952 | - } |
|
| 953 | - } |
|
| 940 | + // Renvoie des 'table.titre' au lieu de 'titre' tout court ! pff ! |
|
| 941 | + // suppression de 'table.' pour toutes les cles (c'est un peu violent !) |
|
| 942 | + // c'est couteux : on ne verifie que la premiere ligne pour voir si on le fait ou non |
|
| 943 | + if ( |
|
| 944 | + $retour |
|
| 945 | + and strpos(implode('', array_keys($retour)), '.') !== false |
|
| 946 | + ) { |
|
| 947 | + foreach ($retour as $cle => $val) { |
|
| 948 | + if (($pos = strpos($cle, '.')) !== false) { |
|
| 949 | + $retour[substr($cle, $pos + 1)] = &$retour[$cle]; |
|
| 950 | + unset($retour[$cle]); |
|
| 951 | + } |
|
| 952 | + } |
|
| 953 | + } |
|
| 954 | 954 | |
| 955 | - return $retour; |
|
| 955 | + return $retour; |
|
| 956 | 956 | } |
| 957 | 957 | |
| 958 | 958 | /** |
@@ -965,8 +965,8 @@ discard block |
||
| 965 | 965 | * @return bool True si déplacement réussi, false sinon. |
| 966 | 966 | **/ |
| 967 | 967 | function spip_sqlite_seek($r, $row_number, $serveur = '', $requeter = true) { |
| 968 | - // encore un truc de bien fichu : PDO ne PEUT PAS faire de seek ou de rewind... |
|
| 969 | - return false; |
|
| 968 | + // encore un truc de bien fichu : PDO ne PEUT PAS faire de seek ou de rewind... |
|
| 969 | + return false; |
|
| 970 | 970 | } |
| 971 | 971 | |
| 972 | 972 | |
@@ -982,10 +982,10 @@ discard block |
||
| 982 | 982 | * @return bool True si réussi |
| 983 | 983 | */ |
| 984 | 984 | function spip_sqlite_free(&$r, $serveur = '', $requeter = true) { |
| 985 | - unset($r); |
|
| 985 | + unset($r); |
|
| 986 | 986 | |
| 987 | - return true; |
|
| 988 | - //return sqlite_free_result($r); |
|
| 987 | + return true; |
|
| 988 | + //return sqlite_free_result($r); |
|
| 989 | 989 | } |
| 990 | 990 | |
| 991 | 991 | |
@@ -1000,8 +1000,8 @@ discard block |
||
| 1000 | 1000 | * @return void |
| 1001 | 1001 | */ |
| 1002 | 1002 | function spip_sqlite_get_charset($charset = [], $serveur = '', $requeter = true) { |
| 1003 | - //$c = !$charset ? '' : (" LIKE "._q($charset['charset'])); |
|
| 1004 | - //return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur); |
|
| 1003 | + //$c = !$charset ? '' : (" LIKE "._q($charset['charset'])); |
|
| 1004 | + //return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur); |
|
| 1005 | 1005 | } |
| 1006 | 1006 | |
| 1007 | 1007 | |
@@ -1016,7 +1016,7 @@ discard block |
||
| 1016 | 1016 | * Valeur hexadécimale pour SQLite |
| 1017 | 1017 | **/ |
| 1018 | 1018 | function spip_sqlite_hex($v) { |
| 1019 | - return hexdec($v); |
|
| 1019 | + return hexdec($v); |
|
| 1020 | 1020 | } |
| 1021 | 1021 | |
| 1022 | 1022 | |
@@ -1038,7 +1038,7 @@ discard block |
||
| 1038 | 1038 | * Expression de requête SQL |
| 1039 | 1039 | **/ |
| 1040 | 1040 | function spip_sqlite_in($val, $valeurs, $not = '', $serveur = '', $requeter = true) { |
| 1041 | - return "($val $not IN ($valeurs))"; |
|
| 1041 | + return "($val $not IN ($valeurs))"; |
|
| 1042 | 1042 | } |
| 1043 | 1043 | |
| 1044 | 1044 | |
@@ -1066,20 +1066,20 @@ discard block |
||
| 1066 | 1066 | **/ |
| 1067 | 1067 | function spip_sqlite_insert($table, $champs, $valeurs, $desc = [], $serveur = '', $requeter = true) { |
| 1068 | 1068 | |
| 1069 | - $query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES'); |
|
| 1070 | - if ($r = spip_sqlite_query($query, $serveur, $requeter)) { |
|
| 1071 | - if (!$requeter) { |
|
| 1072 | - return $r; |
|
| 1073 | - } |
|
| 1074 | - $nb = spip_sqlite::last_insert_id($serveur); |
|
| 1075 | - } else { |
|
| 1076 | - $nb = false; |
|
| 1077 | - } |
|
| 1069 | + $query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES'); |
|
| 1070 | + if ($r = spip_sqlite_query($query, $serveur, $requeter)) { |
|
| 1071 | + if (!$requeter) { |
|
| 1072 | + return $r; |
|
| 1073 | + } |
|
| 1074 | + $nb = spip_sqlite::last_insert_id($serveur); |
|
| 1075 | + } else { |
|
| 1076 | + $nb = false; |
|
| 1077 | + } |
|
| 1078 | 1078 | |
| 1079 | - $err = spip_sqlite_error($query, $serveur); |
|
| 1079 | + $err = spip_sqlite_error($query, $serveur); |
|
| 1080 | 1080 | |
| 1081 | - // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage |
|
| 1082 | - return isset($_GET['var_profile']) ? $r : $nb; |
|
| 1081 | + // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage |
|
| 1082 | + return isset($_GET['var_profile']) ? $r : $nb; |
|
| 1083 | 1083 | } |
| 1084 | 1084 | |
| 1085 | 1085 | |
@@ -1104,28 +1104,28 @@ discard block |
||
| 1104 | 1104 | * - Tableau de description de la requête et du temps d'exécution, si var_profile activé |
| 1105 | 1105 | **/ |
| 1106 | 1106 | function spip_sqlite_insertq($table, $couples = [], $desc = [], $serveur = '', $requeter = true) { |
| 1107 | - if (!$desc) { |
|
| 1108 | - $desc = description_table($table, $serveur); |
|
| 1109 | - } |
|
| 1110 | - if (!$desc) { |
|
| 1111 | - die("$table insertion sans description"); |
|
| 1112 | - } |
|
| 1113 | - $fields = isset($desc['field']) ? $desc['field'] : []; |
|
| 1107 | + if (!$desc) { |
|
| 1108 | + $desc = description_table($table, $serveur); |
|
| 1109 | + } |
|
| 1110 | + if (!$desc) { |
|
| 1111 | + die("$table insertion sans description"); |
|
| 1112 | + } |
|
| 1113 | + $fields = isset($desc['field']) ? $desc['field'] : []; |
|
| 1114 | 1114 | |
| 1115 | - foreach ($couples as $champ => $val) { |
|
| 1116 | - $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]); |
|
| 1117 | - } |
|
| 1115 | + foreach ($couples as $champ => $val) { |
|
| 1116 | + $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]); |
|
| 1117 | + } |
|
| 1118 | 1118 | |
| 1119 | - // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci |
|
| 1120 | - $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur); |
|
| 1119 | + // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci |
|
| 1120 | + $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur); |
|
| 1121 | 1121 | |
| 1122 | - $cles = $valeurs = ''; |
|
| 1123 | - if (count($couples)) { |
|
| 1124 | - $cles = '(' . join(',', array_keys($couples)) . ')'; |
|
| 1125 | - $valeurs = '(' . join(',', $couples) . ')'; |
|
| 1126 | - } |
|
| 1122 | + $cles = $valeurs = ''; |
|
| 1123 | + if (count($couples)) { |
|
| 1124 | + $cles = '(' . join(',', array_keys($couples)) . ')'; |
|
| 1125 | + $valeurs = '(' . join(',', $couples) . ')'; |
|
| 1126 | + } |
|
| 1127 | 1127 | |
| 1128 | - return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter); |
|
| 1128 | + return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter); |
|
| 1129 | 1129 | } |
| 1130 | 1130 | |
| 1131 | 1131 | |
@@ -1149,70 +1149,70 @@ discard block |
||
| 1149 | 1149 | * - False en cas d'erreur. |
| 1150 | 1150 | **/ |
| 1151 | 1151 | function spip_sqlite_insertq_multi($table, $tab_couples = [], $desc = [], $serveur = '', $requeter = true) { |
| 1152 | - if (!$desc) { |
|
| 1153 | - $desc = description_table($table, $serveur); |
|
| 1154 | - } |
|
| 1155 | - if (!$desc) { |
|
| 1156 | - die("$table insertion sans description"); |
|
| 1157 | - } |
|
| 1158 | - if (!isset($desc['field'])) { |
|
| 1159 | - $desc['field'] = []; |
|
| 1160 | - } |
|
| 1161 | - |
|
| 1162 | - // recuperer les champs 'timestamp' pour mise a jour auto de ceux-ci |
|
| 1163 | - $maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur); |
|
| 1164 | - |
|
| 1165 | - // seul le nom de la table est a traduire ici : |
|
| 1166 | - // le faire une seule fois au debut |
|
| 1167 | - $query_start = "INSERT INTO $table "; |
|
| 1168 | - $query_start = spip_sqlite::traduire_requete($query_start, $serveur); |
|
| 1169 | - |
|
| 1170 | - // ouvrir une transaction |
|
| 1171 | - if ($requeter) { |
|
| 1172 | - spip_sqlite::demarrer_transaction($serveur); |
|
| 1173 | - } |
|
| 1174 | - |
|
| 1175 | - while ($couples = array_shift($tab_couples)) { |
|
| 1176 | - foreach ($couples as $champ => $val) { |
|
| 1177 | - $couples[$champ] = _sqlite_calculer_cite($val, $desc['field'][$champ]); |
|
| 1178 | - } |
|
| 1179 | - |
|
| 1180 | - // inserer les champs timestamp par defaut |
|
| 1181 | - $couples = array_merge($maj, $couples); |
|
| 1182 | - |
|
| 1183 | - $champs = $valeurs = ''; |
|
| 1184 | - if (count($couples)) { |
|
| 1185 | - $champs = '(' . join(',', array_keys($couples)) . ')'; |
|
| 1186 | - $valeurs = '(' . join(',', $couples) . ')'; |
|
| 1187 | - $query = $query_start . "$champs VALUES $valeurs"; |
|
| 1188 | - } else { |
|
| 1189 | - $query = $query_start . 'DEFAULT VALUES'; |
|
| 1190 | - } |
|
| 1191 | - |
|
| 1192 | - if ($requeter) { |
|
| 1193 | - $retour = spip_sqlite::executer_requete($query, $serveur); |
|
| 1194 | - } |
|
| 1195 | - |
|
| 1196 | - // sur le dernier couple uniquement |
|
| 1197 | - if (!count($tab_couples)) { |
|
| 1198 | - $nb = 0; |
|
| 1199 | - if ($requeter) { |
|
| 1200 | - $nb = spip_sqlite::last_insert_id($serveur); |
|
| 1201 | - } else { |
|
| 1202 | - return $query; |
|
| 1203 | - } |
|
| 1204 | - } |
|
| 1205 | - |
|
| 1206 | - $err = spip_sqlite_error($query, $serveur); |
|
| 1207 | - } |
|
| 1208 | - |
|
| 1209 | - if ($requeter) { |
|
| 1210 | - spip_sqlite::finir_transaction($serveur); |
|
| 1211 | - } |
|
| 1212 | - |
|
| 1213 | - // renvoie le dernier id d'autoincrement ajoute |
|
| 1214 | - // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage |
|
| 1215 | - return isset($_GET['var_profile']) ? $retour : $nb; |
|
| 1152 | + if (!$desc) { |
|
| 1153 | + $desc = description_table($table, $serveur); |
|
| 1154 | + } |
|
| 1155 | + if (!$desc) { |
|
| 1156 | + die("$table insertion sans description"); |
|
| 1157 | + } |
|
| 1158 | + if (!isset($desc['field'])) { |
|
| 1159 | + $desc['field'] = []; |
|
| 1160 | + } |
|
| 1161 | + |
|
| 1162 | + // recuperer les champs 'timestamp' pour mise a jour auto de ceux-ci |
|
| 1163 | + $maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur); |
|
| 1164 | + |
|
| 1165 | + // seul le nom de la table est a traduire ici : |
|
| 1166 | + // le faire une seule fois au debut |
|
| 1167 | + $query_start = "INSERT INTO $table "; |
|
| 1168 | + $query_start = spip_sqlite::traduire_requete($query_start, $serveur); |
|
| 1169 | + |
|
| 1170 | + // ouvrir une transaction |
|
| 1171 | + if ($requeter) { |
|
| 1172 | + spip_sqlite::demarrer_transaction($serveur); |
|
| 1173 | + } |
|
| 1174 | + |
|
| 1175 | + while ($couples = array_shift($tab_couples)) { |
|
| 1176 | + foreach ($couples as $champ => $val) { |
|
| 1177 | + $couples[$champ] = _sqlite_calculer_cite($val, $desc['field'][$champ]); |
|
| 1178 | + } |
|
| 1179 | + |
|
| 1180 | + // inserer les champs timestamp par defaut |
|
| 1181 | + $couples = array_merge($maj, $couples); |
|
| 1182 | + |
|
| 1183 | + $champs = $valeurs = ''; |
|
| 1184 | + if (count($couples)) { |
|
| 1185 | + $champs = '(' . join(',', array_keys($couples)) . ')'; |
|
| 1186 | + $valeurs = '(' . join(',', $couples) . ')'; |
|
| 1187 | + $query = $query_start . "$champs VALUES $valeurs"; |
|
| 1188 | + } else { |
|
| 1189 | + $query = $query_start . 'DEFAULT VALUES'; |
|
| 1190 | + } |
|
| 1191 | + |
|
| 1192 | + if ($requeter) { |
|
| 1193 | + $retour = spip_sqlite::executer_requete($query, $serveur); |
|
| 1194 | + } |
|
| 1195 | + |
|
| 1196 | + // sur le dernier couple uniquement |
|
| 1197 | + if (!count($tab_couples)) { |
|
| 1198 | + $nb = 0; |
|
| 1199 | + if ($requeter) { |
|
| 1200 | + $nb = spip_sqlite::last_insert_id($serveur); |
|
| 1201 | + } else { |
|
| 1202 | + return $query; |
|
| 1203 | + } |
|
| 1204 | + } |
|
| 1205 | + |
|
| 1206 | + $err = spip_sqlite_error($query, $serveur); |
|
| 1207 | + } |
|
| 1208 | + |
|
| 1209 | + if ($requeter) { |
|
| 1210 | + spip_sqlite::finir_transaction($serveur); |
|
| 1211 | + } |
|
| 1212 | + |
|
| 1213 | + // renvoie le dernier id d'autoincrement ajoute |
|
| 1214 | + // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage |
|
| 1215 | + return isset($_GET['var_profile']) ? $retour : $nb; |
|
| 1216 | 1216 | } |
| 1217 | 1217 | |
| 1218 | 1218 | |
@@ -1227,7 +1227,7 @@ discard block |
||
| 1227 | 1227 | * Toujours true. |
| 1228 | 1228 | **/ |
| 1229 | 1229 | function spip_sqlite_preferer_transaction($serveur = '', $requeter = true) { |
| 1230 | - return true; |
|
| 1230 | + return true; |
|
| 1231 | 1231 | } |
| 1232 | 1232 | |
| 1233 | 1233 | /** |
@@ -1244,12 +1244,12 @@ discard block |
||
| 1244 | 1244 | * string si texte de la requête demandé, true sinon |
| 1245 | 1245 | **/ |
| 1246 | 1246 | function spip_sqlite_demarrer_transaction($serveur = '', $requeter = true) { |
| 1247 | - if (!$requeter) { |
|
| 1248 | - return 'BEGIN TRANSACTION'; |
|
| 1249 | - } |
|
| 1250 | - spip_sqlite::demarrer_transaction($serveur); |
|
| 1247 | + if (!$requeter) { |
|
| 1248 | + return 'BEGIN TRANSACTION'; |
|
| 1249 | + } |
|
| 1250 | + spip_sqlite::demarrer_transaction($serveur); |
|
| 1251 | 1251 | |
| 1252 | - return true; |
|
| 1252 | + return true; |
|
| 1253 | 1253 | } |
| 1254 | 1254 | |
| 1255 | 1255 | /** |
@@ -1263,12 +1263,12 @@ discard block |
||
| 1263 | 1263 | * string si texte de la requête demandé, true sinon |
| 1264 | 1264 | **/ |
| 1265 | 1265 | function spip_sqlite_terminer_transaction($serveur = '', $requeter = true) { |
| 1266 | - if (!$requeter) { |
|
| 1267 | - return 'COMMIT'; |
|
| 1268 | - } |
|
| 1269 | - spip_sqlite::finir_transaction($serveur); |
|
| 1266 | + if (!$requeter) { |
|
| 1267 | + return 'COMMIT'; |
|
| 1268 | + } |
|
| 1269 | + spip_sqlite::finir_transaction($serveur); |
|
| 1270 | 1270 | |
| 1271 | - return true; |
|
| 1271 | + return true; |
|
| 1272 | 1272 | } |
| 1273 | 1273 | |
| 1274 | 1274 | |
@@ -1283,27 +1283,27 @@ discard block |
||
| 1283 | 1283 | * Liste des noms de bases |
| 1284 | 1284 | **/ |
| 1285 | 1285 | function spip_sqlite_listdbs($serveur = '', $requeter = true) { |
| 1286 | - _sqlite_init(); |
|
| 1286 | + _sqlite_init(); |
|
| 1287 | 1287 | |
| 1288 | - if (!is_dir($d = substr(_DIR_DB, 0, -1))) { |
|
| 1289 | - return []; |
|
| 1290 | - } |
|
| 1288 | + if (!is_dir($d = substr(_DIR_DB, 0, -1))) { |
|
| 1289 | + return []; |
|
| 1290 | + } |
|
| 1291 | 1291 | |
| 1292 | - include_spip('inc/flock'); |
|
| 1293 | - $bases = preg_files($d, $pattern = '(.*)\.sqlite$'); |
|
| 1294 | - $bds = []; |
|
| 1292 | + include_spip('inc/flock'); |
|
| 1293 | + $bases = preg_files($d, $pattern = '(.*)\.sqlite$'); |
|
| 1294 | + $bds = []; |
|
| 1295 | 1295 | |
| 1296 | - foreach ($bases as $b) { |
|
| 1297 | - // pas de bases commencant pas sqlite |
|
| 1298 | - // (on s'en sert pour l'installation pour simuler la presence d'un serveur) |
|
| 1299 | - // les bases sont de la forme _sqliteX_tmp_spip_install.sqlite |
|
| 1300 | - if (strpos($b, '_sqlite')) { |
|
| 1301 | - continue; |
|
| 1302 | - } |
|
| 1303 | - $bds[] = preg_replace(";.*/$pattern;iS", '$1', $b); |
|
| 1304 | - } |
|
| 1296 | + foreach ($bases as $b) { |
|
| 1297 | + // pas de bases commencant pas sqlite |
|
| 1298 | + // (on s'en sert pour l'installation pour simuler la presence d'un serveur) |
|
| 1299 | + // les bases sont de la forme _sqliteX_tmp_spip_install.sqlite |
|
| 1300 | + if (strpos($b, '_sqlite')) { |
|
| 1301 | + continue; |
|
| 1302 | + } |
|
| 1303 | + $bds[] = preg_replace(";.*/$pattern;iS", '$1', $b); |
|
| 1304 | + } |
|
| 1305 | 1305 | |
| 1306 | - return $bds; |
|
| 1306 | + return $bds; |
|
| 1307 | 1307 | } |
| 1308 | 1308 | |
| 1309 | 1309 | |
@@ -1318,9 +1318,9 @@ discard block |
||
| 1318 | 1318 | * @return string Texte de sélection pour la requête |
| 1319 | 1319 | */ |
| 1320 | 1320 | function spip_sqlite_multi($objet, $lang) { |
| 1321 | - $r = 'EXTRAIRE_MULTI(' . $objet . ", '" . $lang . "') AS multi"; |
|
| 1321 | + $r = 'EXTRAIRE_MULTI(' . $objet . ", '" . $lang . "') AS multi"; |
|
| 1322 | 1322 | |
| 1323 | - return $r; |
|
| 1323 | + return $r; |
|
| 1324 | 1324 | } |
| 1325 | 1325 | |
| 1326 | 1326 | |
@@ -1337,15 +1337,15 @@ discard block |
||
| 1337 | 1337 | * @return bool|string true / false / requete |
| 1338 | 1338 | **/ |
| 1339 | 1339 | function spip_sqlite_optimize($table, $serveur = '', $requeter = true) { |
| 1340 | - static $do = false; |
|
| 1341 | - if ($requeter and $do) { |
|
| 1342 | - return true; |
|
| 1343 | - } |
|
| 1344 | - if ($requeter) { |
|
| 1345 | - $do = true; |
|
| 1346 | - } |
|
| 1340 | + static $do = false; |
|
| 1341 | + if ($requeter and $do) { |
|
| 1342 | + return true; |
|
| 1343 | + } |
|
| 1344 | + if ($requeter) { |
|
| 1345 | + $do = true; |
|
| 1346 | + } |
|
| 1347 | 1347 | |
| 1348 | - return spip_sqlite_query('VACUUM', $serveur, $requeter); |
|
| 1348 | + return spip_sqlite_query('VACUUM', $serveur, $requeter); |
|
| 1349 | 1349 | } |
| 1350 | 1350 | |
| 1351 | 1351 | |
@@ -1362,15 +1362,15 @@ discard block |
||
| 1362 | 1362 | * Donnée prête à être utilisée par le gestionnaire SQL |
| 1363 | 1363 | */ |
| 1364 | 1364 | function spip_sqlite_quote($v, $type = '') { |
| 1365 | - if (!is_array($v)) { |
|
| 1366 | - return _sqlite_calculer_cite($v, $type); |
|
| 1367 | - } |
|
| 1368 | - // si c'est un tableau, le parcourir en propageant le type |
|
| 1369 | - foreach ($v as $k => $r) { |
|
| 1370 | - $v[$k] = spip_sqlite_quote($r, $type); |
|
| 1371 | - } |
|
| 1365 | + if (!is_array($v)) { |
|
| 1366 | + return _sqlite_calculer_cite($v, $type); |
|
| 1367 | + } |
|
| 1368 | + // si c'est un tableau, le parcourir en propageant le type |
|
| 1369 | + foreach ($v as $k => $r) { |
|
| 1370 | + $v[$k] = spip_sqlite_quote($r, $type); |
|
| 1371 | + } |
|
| 1372 | 1372 | |
| 1373 | - return join(',', $v); |
|
| 1373 | + return join(',', $v); |
|
| 1374 | 1374 | } |
| 1375 | 1375 | |
| 1376 | 1376 | |
@@ -1387,9 +1387,9 @@ discard block |
||
| 1387 | 1387 | * Expression SQL |
| 1388 | 1388 | **/ |
| 1389 | 1389 | function spip_sqlite_date_proche($champ, $interval, $unite) { |
| 1390 | - $op = (($interval <= 0) ? '>' : '<'); |
|
| 1390 | + $op = (($interval <= 0) ? '>' : '<'); |
|
| 1391 | 1391 | |
| 1392 | - return "($champ $op datetime('" . date('Y-m-d H:i:s') . "', '$interval $unite'))"; |
|
| 1392 | + return "($champ $op datetime('" . date('Y-m-d H:i:s') . "', '$interval $unite'))"; |
|
| 1393 | 1393 | } |
| 1394 | 1394 | |
| 1395 | 1395 | |
@@ -1407,48 +1407,48 @@ discard block |
||
| 1407 | 1407 | * l'état de la table après la réparation |
| 1408 | 1408 | */ |
| 1409 | 1409 | function spip_sqlite_repair($table, $serveur = '', $requeter = true) { |
| 1410 | - if ( |
|
| 1411 | - $desc = spip_sqlite_showtable($table, $serveur) |
|
| 1412 | - and isset($desc['field']) |
|
| 1413 | - and is_array($desc['field']) |
|
| 1414 | - ) { |
|
| 1415 | - foreach ($desc['field'] as $c => $d) { |
|
| 1416 | - if ( |
|
| 1417 | - preg_match(',^(tinytext|mediumtext|text|longtext|varchar|char),i', $d) |
|
| 1418 | - and stripos($d, 'NOT NULL') !== false |
|
| 1419 | - and stripos($d, 'DEFAULT') === false |
|
| 1420 | - /* pas touche aux cles primaires */ |
|
| 1421 | - and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c) |
|
| 1422 | - ) { |
|
| 1423 | - spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur); |
|
| 1424 | - spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE); |
|
| 1425 | - } |
|
| 1426 | - if ( |
|
| 1427 | - preg_match(',^(INTEGER),i', $d) |
|
| 1428 | - and stripos($d, 'NOT NULL') !== false |
|
| 1429 | - and stripos($d, 'DEFAULT') === false |
|
| 1430 | - /* pas touche aux cles primaires */ |
|
| 1431 | - and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c) |
|
| 1432 | - ) { |
|
| 1433 | - spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur); |
|
| 1434 | - spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE); |
|
| 1435 | - } |
|
| 1436 | - if ( |
|
| 1437 | - preg_match(',^(datetime),i', $d) |
|
| 1438 | - and stripos($d, 'NOT NULL') !== false |
|
| 1439 | - and stripos($d, 'DEFAULT') === false |
|
| 1440 | - /* pas touche aux cles primaires */ |
|
| 1441 | - and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c) |
|
| 1442 | - ) { |
|
| 1443 | - spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur); |
|
| 1444 | - spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE); |
|
| 1445 | - } |
|
| 1446 | - } |
|
| 1447 | - |
|
| 1448 | - return [' OK ']; |
|
| 1449 | - } |
|
| 1450 | - |
|
| 1451 | - return [' ERROR ']; |
|
| 1410 | + if ( |
|
| 1411 | + $desc = spip_sqlite_showtable($table, $serveur) |
|
| 1412 | + and isset($desc['field']) |
|
| 1413 | + and is_array($desc['field']) |
|
| 1414 | + ) { |
|
| 1415 | + foreach ($desc['field'] as $c => $d) { |
|
| 1416 | + if ( |
|
| 1417 | + preg_match(',^(tinytext|mediumtext|text|longtext|varchar|char),i', $d) |
|
| 1418 | + and stripos($d, 'NOT NULL') !== false |
|
| 1419 | + and stripos($d, 'DEFAULT') === false |
|
| 1420 | + /* pas touche aux cles primaires */ |
|
| 1421 | + and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c) |
|
| 1422 | + ) { |
|
| 1423 | + spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur); |
|
| 1424 | + spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE); |
|
| 1425 | + } |
|
| 1426 | + if ( |
|
| 1427 | + preg_match(',^(INTEGER),i', $d) |
|
| 1428 | + and stripos($d, 'NOT NULL') !== false |
|
| 1429 | + and stripos($d, 'DEFAULT') === false |
|
| 1430 | + /* pas touche aux cles primaires */ |
|
| 1431 | + and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c) |
|
| 1432 | + ) { |
|
| 1433 | + spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur); |
|
| 1434 | + spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE); |
|
| 1435 | + } |
|
| 1436 | + if ( |
|
| 1437 | + preg_match(',^(datetime),i', $d) |
|
| 1438 | + and stripos($d, 'NOT NULL') !== false |
|
| 1439 | + and stripos($d, 'DEFAULT') === false |
|
| 1440 | + /* pas touche aux cles primaires */ |
|
| 1441 | + and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c) |
|
| 1442 | + ) { |
|
| 1443 | + spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur); |
|
| 1444 | + spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE); |
|
| 1445 | + } |
|
| 1446 | + } |
|
| 1447 | + |
|
| 1448 | + return [' OK ']; |
|
| 1449 | + } |
|
| 1450 | + |
|
| 1451 | + return [' ERROR ']; |
|
| 1452 | 1452 | } |
| 1453 | 1453 | |
| 1454 | 1454 | |
@@ -1477,25 +1477,25 @@ discard block |
||
| 1477 | 1477 | * - False en cas d'erreur. |
| 1478 | 1478 | **/ |
| 1479 | 1479 | function spip_sqlite_replace($table, $couples, $desc = [], $serveur = '', $requeter = true) { |
| 1480 | - if (!$desc) { |
|
| 1481 | - $desc = description_table($table, $serveur); |
|
| 1482 | - } |
|
| 1483 | - if (!$desc) { |
|
| 1484 | - die("$table insertion sans description"); |
|
| 1485 | - } |
|
| 1486 | - $fields = isset($desc['field']) ? $desc['field'] : []; |
|
| 1480 | + if (!$desc) { |
|
| 1481 | + $desc = description_table($table, $serveur); |
|
| 1482 | + } |
|
| 1483 | + if (!$desc) { |
|
| 1484 | + die("$table insertion sans description"); |
|
| 1485 | + } |
|
| 1486 | + $fields = isset($desc['field']) ? $desc['field'] : []; |
|
| 1487 | 1487 | |
| 1488 | - foreach ($couples as $champ => $val) { |
|
| 1489 | - $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]); |
|
| 1490 | - } |
|
| 1488 | + foreach ($couples as $champ => $val) { |
|
| 1489 | + $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]); |
|
| 1490 | + } |
|
| 1491 | 1491 | |
| 1492 | - // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci |
|
| 1493 | - $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur); |
|
| 1492 | + // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci |
|
| 1493 | + $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur); |
|
| 1494 | 1494 | |
| 1495 | - return spip_sqlite_query("REPLACE INTO $table (" . join(',', array_keys($couples)) . ') VALUES (' . join( |
|
| 1496 | - ',', |
|
| 1497 | - $couples |
|
| 1498 | - ) . ')', $serveur); |
|
| 1495 | + return spip_sqlite_query("REPLACE INTO $table (" . join(',', array_keys($couples)) . ') VALUES (' . join( |
|
| 1496 | + ',', |
|
| 1497 | + $couples |
|
| 1498 | + ) . ')', $serveur); |
|
| 1499 | 1499 | } |
| 1500 | 1500 | |
| 1501 | 1501 | |
@@ -1525,13 +1525,13 @@ discard block |
||
| 1525 | 1525 | **/ |
| 1526 | 1526 | function spip_sqlite_replace_multi($table, $tab_couples, $desc = [], $serveur = '', $requeter = true) { |
| 1527 | 1527 | |
| 1528 | - // boucler pour trainter chaque requete independemment |
|
| 1529 | - foreach ($tab_couples as $couples) { |
|
| 1530 | - $retour = spip_sqlite_replace($table, $couples, $desc, $serveur, $requeter); |
|
| 1531 | - } |
|
| 1528 | + // boucler pour trainter chaque requete independemment |
|
| 1529 | + foreach ($tab_couples as $couples) { |
|
| 1530 | + $retour = spip_sqlite_replace($table, $couples, $desc, $serveur, $requeter); |
|
| 1531 | + } |
|
| 1532 | 1532 | |
| 1533 | - // renvoie le dernier id |
|
| 1534 | - return $retour; |
|
| 1533 | + // renvoie le dernier id |
|
| 1534 | + return $retour; |
|
| 1535 | 1535 | } |
| 1536 | 1536 | |
| 1537 | 1537 | |
@@ -1558,44 +1558,44 @@ discard block |
||
| 1558 | 1558 | * - array : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer. |
| 1559 | 1559 | */ |
| 1560 | 1560 | function spip_sqlite_select( |
| 1561 | - $select, |
|
| 1562 | - $from, |
|
| 1563 | - $where = '', |
|
| 1564 | - $groupby = '', |
|
| 1565 | - $orderby = '', |
|
| 1566 | - $limit = '', |
|
| 1567 | - $having = '', |
|
| 1568 | - $serveur = '', |
|
| 1569 | - $requeter = true |
|
| 1561 | + $select, |
|
| 1562 | + $from, |
|
| 1563 | + $where = '', |
|
| 1564 | + $groupby = '', |
|
| 1565 | + $orderby = '', |
|
| 1566 | + $limit = '', |
|
| 1567 | + $having = '', |
|
| 1568 | + $serveur = '', |
|
| 1569 | + $requeter = true |
|
| 1570 | 1570 | ) { |
| 1571 | 1571 | |
| 1572 | - // version() n'est pas connu de sqlite |
|
| 1573 | - $select = str_replace('version()', 'sqlite_version()', $select); |
|
| 1572 | + // version() n'est pas connu de sqlite |
|
| 1573 | + $select = str_replace('version()', 'sqlite_version()', $select); |
|
| 1574 | 1574 | |
| 1575 | - // recomposer from |
|
| 1576 | - $from = (!is_array($from) ? $from : _sqlite_calculer_select_as($from)); |
|
| 1575 | + // recomposer from |
|
| 1576 | + $from = (!is_array($from) ? $from : _sqlite_calculer_select_as($from)); |
|
| 1577 | 1577 | |
| 1578 | - $query = |
|
| 1579 | - _sqlite_calculer_expression('SELECT', $select, ', ') |
|
| 1580 | - . _sqlite_calculer_expression('FROM', $from, ', ') |
|
| 1581 | - . _sqlite_calculer_expression('WHERE', $where) |
|
| 1582 | - . _sqlite_calculer_expression('GROUP BY', $groupby, ',') |
|
| 1583 | - . _sqlite_calculer_expression('HAVING', $having) |
|
| 1584 | - . ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '') |
|
| 1585 | - . ($limit ? "\nLIMIT $limit" : ''); |
|
| 1578 | + $query = |
|
| 1579 | + _sqlite_calculer_expression('SELECT', $select, ', ') |
|
| 1580 | + . _sqlite_calculer_expression('FROM', $from, ', ') |
|
| 1581 | + . _sqlite_calculer_expression('WHERE', $where) |
|
| 1582 | + . _sqlite_calculer_expression('GROUP BY', $groupby, ',') |
|
| 1583 | + . _sqlite_calculer_expression('HAVING', $having) |
|
| 1584 | + . ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '') |
|
| 1585 | + . ($limit ? "\nLIMIT $limit" : ''); |
|
| 1586 | 1586 | |
| 1587 | - // dans un select, on doit renvoyer la requête en cas d'erreur |
|
| 1588 | - $res = spip_sqlite_query($query, $serveur, $requeter); |
|
| 1589 | - // texte de la requete demande ? |
|
| 1590 | - if (!$requeter) { |
|
| 1591 | - return $res; |
|
| 1592 | - } |
|
| 1593 | - // erreur survenue ? |
|
| 1594 | - if ($res === false) { |
|
| 1595 | - return spip_sqlite::traduire_requete($query, $serveur); |
|
| 1596 | - } |
|
| 1587 | + // dans un select, on doit renvoyer la requête en cas d'erreur |
|
| 1588 | + $res = spip_sqlite_query($query, $serveur, $requeter); |
|
| 1589 | + // texte de la requete demande ? |
|
| 1590 | + if (!$requeter) { |
|
| 1591 | + return $res; |
|
| 1592 | + } |
|
| 1593 | + // erreur survenue ? |
|
| 1594 | + if ($res === false) { |
|
| 1595 | + return spip_sqlite::traduire_requete($query, $serveur); |
|
| 1596 | + } |
|
| 1597 | 1597 | |
| 1598 | - return $res; |
|
| 1598 | + return $res; |
|
| 1599 | 1599 | } |
| 1600 | 1600 | |
| 1601 | 1601 | |
@@ -1614,32 +1614,32 @@ discard block |
||
| 1614 | 1614 | * - False en cas d'erreur. |
| 1615 | 1615 | **/ |
| 1616 | 1616 | function spip_sqlite_selectdb($db, $serveur = '', $requeter = true) { |
| 1617 | - _sqlite_init(); |
|
| 1617 | + _sqlite_init(); |
|
| 1618 | 1618 | |
| 1619 | - // interdire la creation d'une nouvelle base, |
|
| 1620 | - // sauf si on est dans l'installation |
|
| 1621 | - if ( |
|
| 1622 | - !is_file($f = _DIR_DB . $db . '.sqlite') |
|
| 1623 | - && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL) |
|
| 1624 | - ) { |
|
| 1625 | - spip_log("Il est interdit de creer la base $db", 'sqlite.' . _LOG_HS); |
|
| 1619 | + // interdire la creation d'une nouvelle base, |
|
| 1620 | + // sauf si on est dans l'installation |
|
| 1621 | + if ( |
|
| 1622 | + !is_file($f = _DIR_DB . $db . '.sqlite') |
|
| 1623 | + && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL) |
|
| 1624 | + ) { |
|
| 1625 | + spip_log("Il est interdit de creer la base $db", 'sqlite.' . _LOG_HS); |
|
| 1626 | 1626 | |
| 1627 | - return false; |
|
| 1628 | - } |
|
| 1627 | + return false; |
|
| 1628 | + } |
|
| 1629 | 1629 | |
| 1630 | - // se connecter a la base indiquee |
|
| 1631 | - // avec les identifiants connus |
|
| 1632 | - $index = $serveur ? $serveur : 0; |
|
| 1630 | + // se connecter a la base indiquee |
|
| 1631 | + // avec les identifiants connus |
|
| 1632 | + $index = $serveur ? $serveur : 0; |
|
| 1633 | 1633 | |
| 1634 | - if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) { |
|
| 1635 | - if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) { |
|
| 1636 | - return $db; |
|
| 1637 | - } |
|
| 1638 | - } else { |
|
| 1639 | - spip_log("Impossible de selectionner la base $db", 'sqlite.' . _LOG_HS); |
|
| 1634 | + if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) { |
|
| 1635 | + if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) { |
|
| 1636 | + return $db; |
|
| 1637 | + } |
|
| 1638 | + } else { |
|
| 1639 | + spip_log("Impossible de selectionner la base $db", 'sqlite.' . _LOG_HS); |
|
| 1640 | 1640 | |
| 1641 | - return false; |
|
| 1642 | - } |
|
| 1641 | + return false; |
|
| 1642 | + } |
|
| 1643 | 1643 | } |
| 1644 | 1644 | |
| 1645 | 1645 | |
@@ -1654,8 +1654,8 @@ discard block |
||
| 1654 | 1654 | * @return void |
| 1655 | 1655 | */ |
| 1656 | 1656 | function spip_sqlite_set_charset($charset, $serveur = '', $requeter = true) { |
| 1657 | - # spip_log("Gestion charset sql a ecrire : "."SET NAMES "._q($charset), 'sqlite.'._LOG_ERREUR); |
|
| 1658 | - # return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas ! |
|
| 1657 | + # spip_log("Gestion charset sql a ecrire : "."SET NAMES "._q($charset), 'sqlite.'._LOG_ERREUR); |
|
| 1658 | + # return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas ! |
|
| 1659 | 1659 | } |
| 1660 | 1660 | |
| 1661 | 1661 | |
@@ -1673,24 +1673,24 @@ discard block |
||
| 1673 | 1673 | * Ressource à utiliser avec sql_fetch() |
| 1674 | 1674 | **/ |
| 1675 | 1675 | function spip_sqlite_showbase($match, $serveur = '', $requeter = true) { |
| 1676 | - // type est le type d'entrée : table / index / view |
|
| 1677 | - // on ne retourne que les tables (?) et non les vues... |
|
| 1678 | - # ESCAPE non supporte par les versions sqlite <3 |
|
| 1679 | - # return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name LIKE "._q($match)." ESCAPE '\'", $serveur, $requeter); |
|
| 1680 | - $match = preg_quote($match); |
|
| 1681 | - $match = str_replace('\\\_', '[[TIRETBAS]]', $match); |
|
| 1682 | - $match = str_replace('\\\%', '[[POURCENT]]', $match); |
|
| 1683 | - $match = str_replace('_', '.', $match); |
|
| 1684 | - $match = str_replace('%', '.*', $match); |
|
| 1685 | - $match = str_replace('[[TIRETBAS]]', '_', $match); |
|
| 1686 | - $match = str_replace('[[POURCENT]]', '%', $match); |
|
| 1687 | - $match = "^$match$"; |
|
| 1688 | - |
|
| 1689 | - return spip_sqlite_query( |
|
| 1690 | - "SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match), |
|
| 1691 | - $serveur, |
|
| 1692 | - $requeter |
|
| 1693 | - ); |
|
| 1676 | + // type est le type d'entrée : table / index / view |
|
| 1677 | + // on ne retourne que les tables (?) et non les vues... |
|
| 1678 | + # ESCAPE non supporte par les versions sqlite <3 |
|
| 1679 | + # return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name LIKE "._q($match)." ESCAPE '\'", $serveur, $requeter); |
|
| 1680 | + $match = preg_quote($match); |
|
| 1681 | + $match = str_replace('\\\_', '[[TIRETBAS]]', $match); |
|
| 1682 | + $match = str_replace('\\\%', '[[POURCENT]]', $match); |
|
| 1683 | + $match = str_replace('_', '.', $match); |
|
| 1684 | + $match = str_replace('%', '.*', $match); |
|
| 1685 | + $match = str_replace('[[TIRETBAS]]', '_', $match); |
|
| 1686 | + $match = str_replace('[[POURCENT]]', '%', $match); |
|
| 1687 | + $match = "^$match$"; |
|
| 1688 | + |
|
| 1689 | + return spip_sqlite_query( |
|
| 1690 | + "SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match), |
|
| 1691 | + $serveur, |
|
| 1692 | + $requeter |
|
| 1693 | + ); |
|
| 1694 | 1694 | } |
| 1695 | 1695 | |
| 1696 | 1696 | /** |
@@ -1708,19 +1708,19 @@ discard block |
||
| 1708 | 1708 | * - string : requete sql, si $requeter = true |
| 1709 | 1709 | **/ |
| 1710 | 1710 | function spip_sqlite_table_exists(string $table, $serveur = '', $requeter = true) { |
| 1711 | - $r = spip_sqlite_query( |
|
| 1712 | - 'SELECT name FROM sqlite_master WHERE' |
|
| 1713 | - . ' type=\'table\'' |
|
| 1714 | - . ' AND name=' . spip_sqlite_quote($table, 'string') |
|
| 1715 | - . ' AND name NOT LIKE \'sqlite_%\'', |
|
| 1716 | - $serveur, |
|
| 1717 | - $requeter |
|
| 1718 | - ); |
|
| 1719 | - if (!$requeter) { |
|
| 1720 | - return $r; |
|
| 1721 | - } |
|
| 1722 | - $res = spip_sqlite_fetch($r); |
|
| 1723 | - return (bool) $res; |
|
| 1711 | + $r = spip_sqlite_query( |
|
| 1712 | + 'SELECT name FROM sqlite_master WHERE' |
|
| 1713 | + . ' type=\'table\'' |
|
| 1714 | + . ' AND name=' . spip_sqlite_quote($table, 'string') |
|
| 1715 | + . ' AND name NOT LIKE \'sqlite_%\'', |
|
| 1716 | + $serveur, |
|
| 1717 | + $requeter |
|
| 1718 | + ); |
|
| 1719 | + if (!$requeter) { |
|
| 1720 | + return $r; |
|
| 1721 | + } |
|
| 1722 | + $res = spip_sqlite_fetch($r); |
|
| 1723 | + return (bool) $res; |
|
| 1724 | 1724 | } |
| 1725 | 1725 | |
| 1726 | 1726 | define('_SQLITE_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^()]*\)[^()]*)*[^()]*)\)[^()]*$/'); |
@@ -1743,129 +1743,129 @@ discard block |
||
| 1743 | 1743 | * - array description de la table sinon |
| 1744 | 1744 | */ |
| 1745 | 1745 | function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true) { |
| 1746 | - $query = |
|
| 1747 | - 'SELECT sql, type FROM' |
|
| 1748 | - . ' (SELECT * FROM sqlite_master UNION ALL' |
|
| 1749 | - . ' SELECT * FROM sqlite_temp_master)' |
|
| 1750 | - . " WHERE tbl_name LIKE '$nom_table'" |
|
| 1751 | - . " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'" |
|
| 1752 | - . ' ORDER BY substr(type,2,1), name'; |
|
| 1753 | - |
|
| 1754 | - $a = spip_sqlite_query($query, $serveur, $requeter); |
|
| 1755 | - if (!$a) { |
|
| 1756 | - return ''; |
|
| 1757 | - } |
|
| 1758 | - if (!$requeter) { |
|
| 1759 | - return $a; |
|
| 1760 | - } |
|
| 1761 | - if (!($a = spip_sqlite_fetch($a, null, $serveur))) { |
|
| 1762 | - return ''; |
|
| 1763 | - } |
|
| 1764 | - $vue = ($a['type'] == 'view'); // table | vue |
|
| 1765 | - |
|
| 1766 | - // c'est une table |
|
| 1767 | - // il faut parser le create |
|
| 1768 | - if (!$vue) { |
|
| 1769 | - if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)) { |
|
| 1770 | - return ''; |
|
| 1771 | - } else { |
|
| 1772 | - $desc = $r[1]; |
|
| 1773 | - // extraction d'une KEY éventuelle en prenant garde de ne pas |
|
| 1774 | - // relever un champ dont le nom contient KEY (ex. ID_WHISKEY) |
|
| 1775 | - if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) { |
|
| 1776 | - $namedkeys = $r[2]; |
|
| 1777 | - $desc = $r[1]; |
|
| 1778 | - } else { |
|
| 1779 | - $namedkeys = ''; |
|
| 1780 | - } |
|
| 1781 | - |
|
| 1782 | - $fields = []; |
|
| 1783 | - $keys = []; |
|
| 1784 | - |
|
| 1785 | - // enlever les contenus des valeurs DEFAULT 'xxx' qui pourraient perturber |
|
| 1786 | - // par exemple s'il contiennent une virgule. |
|
| 1787 | - // /!\ cela peut aussi echapper le nom des champs si la table a eu des operations avec SQLite Manager ! |
|
| 1788 | - list($desc, $echaps) = query_echappe_textes($desc); |
|
| 1789 | - |
|
| 1790 | - // separer toutes les descriptions de champs, separes par des virgules |
|
| 1791 | - # /!\ explode peut exploser aussi DECIMAL(10,2) ! |
|
| 1792 | - $k_precedent = null; |
|
| 1793 | - foreach (explode(',', $desc) as $v) { |
|
| 1794 | - preg_match('/^\s*([^\s]+)\s+(.*)/', $v, $r); |
|
| 1795 | - // Les cles de champs peuvent etre entourees |
|
| 1796 | - // de guillements doubles " , simples ', graves ` ou de crochets [ ], ou rien. |
|
| 1797 | - // http://www.sqlite.org/lang_keywords.html |
|
| 1798 | - $k = strtolower(query_reinjecte_textes($r[1], $echaps)); // champ, "champ", [champ]... |
|
| 1799 | - if ($char = strpbrk($k[0], '\'"[`')) { |
|
| 1800 | - $k = trim($k, $char); |
|
| 1801 | - if ($char == '[') { |
|
| 1802 | - $k = rtrim($k, ']'); |
|
| 1803 | - } |
|
| 1804 | - } |
|
| 1805 | - $def = query_reinjecte_textes($r[2], $echaps); // valeur du champ |
|
| 1806 | - |
|
| 1807 | - // rustine pour DECIMAL(10,2) |
|
| 1808 | - // s'il y a une parenthèse fermante dans la clé |
|
| 1809 | - // ou dans la définition sans qu'il n'y ait une ouverture avant |
|
| 1810 | - if (false !== strpos($k, ')') or preg_match('/^[^\(]*\)/', $def)) { |
|
| 1811 | - $fields[$k_precedent] .= ',' . $k . ' ' . $def; |
|
| 1812 | - continue; |
|
| 1813 | - } |
|
| 1814 | - |
|
| 1815 | - // la primary key peut etre dans une des descriptions de champs |
|
| 1816 | - // et non en fin de table, cas encore decouvert avec Sqlite Manager |
|
| 1817 | - if (stripos($r[2], 'PRIMARY KEY') !== false) { |
|
| 1818 | - $keys['PRIMARY KEY'] = $k; |
|
| 1819 | - } |
|
| 1820 | - |
|
| 1821 | - $fields[$k] = $def; |
|
| 1822 | - $k_precedent = $k; |
|
| 1823 | - } |
|
| 1824 | - // key inclues dans la requete |
|
| 1825 | - foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) { |
|
| 1826 | - if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) { |
|
| 1827 | - $k = str_replace('`', '', trim($r[1])); |
|
| 1828 | - $t = trim(strtolower(str_replace('`', '', $r[2])), '"'); |
|
| 1829 | - if ($k && !isset($keys[$k])) { |
|
| 1830 | - $keys[$k] = $t; |
|
| 1831 | - } else { |
|
| 1832 | - $keys[] = $t; |
|
| 1833 | - } |
|
| 1834 | - } |
|
| 1835 | - } |
|
| 1836 | - // sinon ajouter les key index |
|
| 1837 | - $query = |
|
| 1838 | - 'SELECT name,sql FROM' |
|
| 1839 | - . ' (SELECT * FROM sqlite_master UNION ALL' |
|
| 1840 | - . ' SELECT * FROM sqlite_temp_master)' |
|
| 1841 | - . " WHERE tbl_name LIKE '$nom_table'" |
|
| 1842 | - . " AND type='index' AND name NOT LIKE 'sqlite_%'" |
|
| 1843 | - . 'ORDER BY substr(type,2,1), name'; |
|
| 1844 | - $a = spip_sqlite_query($query, $serveur, $requeter); |
|
| 1845 | - while ($r = spip_sqlite_fetch($a, null, $serveur)) { |
|
| 1846 | - $key = str_replace($nom_table . '_', '', $r['name']); // enlever le nom de la table ajoute a l'index |
|
| 1847 | - $keytype = 'KEY'; |
|
| 1848 | - if (strpos($r['sql'], 'UNIQUE INDEX') !== false) { |
|
| 1849 | - $keytype = 'UNIQUE KEY'; |
|
| 1850 | - } |
|
| 1851 | - $colonnes = preg_replace(',.*\((.*)\).*,', '$1', $r['sql']); |
|
| 1852 | - $keys[$keytype . ' ' . $key] = $colonnes; |
|
| 1853 | - } |
|
| 1854 | - } |
|
| 1855 | - } // c'est une vue, on liste les champs disponibles simplement |
|
| 1856 | - else { |
|
| 1857 | - if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)) { // limit 1 |
|
| 1858 | - $fields = []; |
|
| 1859 | - foreach ($res as $c => $v) { |
|
| 1860 | - $fields[$c] = ''; |
|
| 1861 | - } |
|
| 1862 | - $keys = []; |
|
| 1863 | - } else { |
|
| 1864 | - return ''; |
|
| 1865 | - } |
|
| 1866 | - } |
|
| 1867 | - |
|
| 1868 | - return ['field' => $fields, 'key' => $keys]; |
|
| 1746 | + $query = |
|
| 1747 | + 'SELECT sql, type FROM' |
|
| 1748 | + . ' (SELECT * FROM sqlite_master UNION ALL' |
|
| 1749 | + . ' SELECT * FROM sqlite_temp_master)' |
|
| 1750 | + . " WHERE tbl_name LIKE '$nom_table'" |
|
| 1751 | + . " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'" |
|
| 1752 | + . ' ORDER BY substr(type,2,1), name'; |
|
| 1753 | + |
|
| 1754 | + $a = spip_sqlite_query($query, $serveur, $requeter); |
|
| 1755 | + if (!$a) { |
|
| 1756 | + return ''; |
|
| 1757 | + } |
|
| 1758 | + if (!$requeter) { |
|
| 1759 | + return $a; |
|
| 1760 | + } |
|
| 1761 | + if (!($a = spip_sqlite_fetch($a, null, $serveur))) { |
|
| 1762 | + return ''; |
|
| 1763 | + } |
|
| 1764 | + $vue = ($a['type'] == 'view'); // table | vue |
|
| 1765 | + |
|
| 1766 | + // c'est une table |
|
| 1767 | + // il faut parser le create |
|
| 1768 | + if (!$vue) { |
|
| 1769 | + if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)) { |
|
| 1770 | + return ''; |
|
| 1771 | + } else { |
|
| 1772 | + $desc = $r[1]; |
|
| 1773 | + // extraction d'une KEY éventuelle en prenant garde de ne pas |
|
| 1774 | + // relever un champ dont le nom contient KEY (ex. ID_WHISKEY) |
|
| 1775 | + if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) { |
|
| 1776 | + $namedkeys = $r[2]; |
|
| 1777 | + $desc = $r[1]; |
|
| 1778 | + } else { |
|
| 1779 | + $namedkeys = ''; |
|
| 1780 | + } |
|
| 1781 | + |
|
| 1782 | + $fields = []; |
|
| 1783 | + $keys = []; |
|
| 1784 | + |
|
| 1785 | + // enlever les contenus des valeurs DEFAULT 'xxx' qui pourraient perturber |
|
| 1786 | + // par exemple s'il contiennent une virgule. |
|
| 1787 | + // /!\ cela peut aussi echapper le nom des champs si la table a eu des operations avec SQLite Manager ! |
|
| 1788 | + list($desc, $echaps) = query_echappe_textes($desc); |
|
| 1789 | + |
|
| 1790 | + // separer toutes les descriptions de champs, separes par des virgules |
|
| 1791 | + # /!\ explode peut exploser aussi DECIMAL(10,2) ! |
|
| 1792 | + $k_precedent = null; |
|
| 1793 | + foreach (explode(',', $desc) as $v) { |
|
| 1794 | + preg_match('/^\s*([^\s]+)\s+(.*)/', $v, $r); |
|
| 1795 | + // Les cles de champs peuvent etre entourees |
|
| 1796 | + // de guillements doubles " , simples ', graves ` ou de crochets [ ], ou rien. |
|
| 1797 | + // http://www.sqlite.org/lang_keywords.html |
|
| 1798 | + $k = strtolower(query_reinjecte_textes($r[1], $echaps)); // champ, "champ", [champ]... |
|
| 1799 | + if ($char = strpbrk($k[0], '\'"[`')) { |
|
| 1800 | + $k = trim($k, $char); |
|
| 1801 | + if ($char == '[') { |
|
| 1802 | + $k = rtrim($k, ']'); |
|
| 1803 | + } |
|
| 1804 | + } |
|
| 1805 | + $def = query_reinjecte_textes($r[2], $echaps); // valeur du champ |
|
| 1806 | + |
|
| 1807 | + // rustine pour DECIMAL(10,2) |
|
| 1808 | + // s'il y a une parenthèse fermante dans la clé |
|
| 1809 | + // ou dans la définition sans qu'il n'y ait une ouverture avant |
|
| 1810 | + if (false !== strpos($k, ')') or preg_match('/^[^\(]*\)/', $def)) { |
|
| 1811 | + $fields[$k_precedent] .= ',' . $k . ' ' . $def; |
|
| 1812 | + continue; |
|
| 1813 | + } |
|
| 1814 | + |
|
| 1815 | + // la primary key peut etre dans une des descriptions de champs |
|
| 1816 | + // et non en fin de table, cas encore decouvert avec Sqlite Manager |
|
| 1817 | + if (stripos($r[2], 'PRIMARY KEY') !== false) { |
|
| 1818 | + $keys['PRIMARY KEY'] = $k; |
|
| 1819 | + } |
|
| 1820 | + |
|
| 1821 | + $fields[$k] = $def; |
|
| 1822 | + $k_precedent = $k; |
|
| 1823 | + } |
|
| 1824 | + // key inclues dans la requete |
|
| 1825 | + foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) { |
|
| 1826 | + if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) { |
|
| 1827 | + $k = str_replace('`', '', trim($r[1])); |
|
| 1828 | + $t = trim(strtolower(str_replace('`', '', $r[2])), '"'); |
|
| 1829 | + if ($k && !isset($keys[$k])) { |
|
| 1830 | + $keys[$k] = $t; |
|
| 1831 | + } else { |
|
| 1832 | + $keys[] = $t; |
|
| 1833 | + } |
|
| 1834 | + } |
|
| 1835 | + } |
|
| 1836 | + // sinon ajouter les key index |
|
| 1837 | + $query = |
|
| 1838 | + 'SELECT name,sql FROM' |
|
| 1839 | + . ' (SELECT * FROM sqlite_master UNION ALL' |
|
| 1840 | + . ' SELECT * FROM sqlite_temp_master)' |
|
| 1841 | + . " WHERE tbl_name LIKE '$nom_table'" |
|
| 1842 | + . " AND type='index' AND name NOT LIKE 'sqlite_%'" |
|
| 1843 | + . 'ORDER BY substr(type,2,1), name'; |
|
| 1844 | + $a = spip_sqlite_query($query, $serveur, $requeter); |
|
| 1845 | + while ($r = spip_sqlite_fetch($a, null, $serveur)) { |
|
| 1846 | + $key = str_replace($nom_table . '_', '', $r['name']); // enlever le nom de la table ajoute a l'index |
|
| 1847 | + $keytype = 'KEY'; |
|
| 1848 | + if (strpos($r['sql'], 'UNIQUE INDEX') !== false) { |
|
| 1849 | + $keytype = 'UNIQUE KEY'; |
|
| 1850 | + } |
|
| 1851 | + $colonnes = preg_replace(',.*\((.*)\).*,', '$1', $r['sql']); |
|
| 1852 | + $keys[$keytype . ' ' . $key] = $colonnes; |
|
| 1853 | + } |
|
| 1854 | + } |
|
| 1855 | + } // c'est une vue, on liste les champs disponibles simplement |
|
| 1856 | + else { |
|
| 1857 | + if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)) { // limit 1 |
|
| 1858 | + $fields = []; |
|
| 1859 | + foreach ($res as $c => $v) { |
|
| 1860 | + $fields[$c] = ''; |
|
| 1861 | + } |
|
| 1862 | + $keys = []; |
|
| 1863 | + } else { |
|
| 1864 | + return ''; |
|
| 1865 | + } |
|
| 1866 | + } |
|
| 1867 | + |
|
| 1868 | + return ['field' => $fields, 'key' => $keys]; |
|
| 1869 | 1869 | } |
| 1870 | 1870 | |
| 1871 | 1871 | |
@@ -1891,22 +1891,22 @@ discard block |
||
| 1891 | 1891 | * - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif |
| 1892 | 1892 | */ |
| 1893 | 1893 | function spip_sqlite_update($table, $champs, $where = '', $desc = '', $serveur = '', $requeter = true) { |
| 1894 | - // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci |
|
| 1895 | - $champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur); |
|
| 1894 | + // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci |
|
| 1895 | + $champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur); |
|
| 1896 | 1896 | |
| 1897 | - $set = []; |
|
| 1898 | - foreach ($champs as $champ => $val) { |
|
| 1899 | - $set[] = $champ . "=$val"; |
|
| 1900 | - } |
|
| 1901 | - if (!empty($set)) { |
|
| 1902 | - return spip_sqlite_query( |
|
| 1903 | - _sqlite_calculer_expression('UPDATE', $table, ',') |
|
| 1904 | - . _sqlite_calculer_expression('SET', $set, ',') |
|
| 1905 | - . _sqlite_calculer_expression('WHERE', $where), |
|
| 1906 | - $serveur, |
|
| 1907 | - $requeter |
|
| 1908 | - ); |
|
| 1909 | - } |
|
| 1897 | + $set = []; |
|
| 1898 | + foreach ($champs as $champ => $val) { |
|
| 1899 | + $set[] = $champ . "=$val"; |
|
| 1900 | + } |
|
| 1901 | + if (!empty($set)) { |
|
| 1902 | + return spip_sqlite_query( |
|
| 1903 | + _sqlite_calculer_expression('UPDATE', $table, ',') |
|
| 1904 | + . _sqlite_calculer_expression('SET', $set, ',') |
|
| 1905 | + . _sqlite_calculer_expression('WHERE', $where), |
|
| 1906 | + $serveur, |
|
| 1907 | + $requeter |
|
| 1908 | + ); |
|
| 1909 | + } |
|
| 1910 | 1910 | } |
| 1911 | 1911 | |
| 1912 | 1912 | |
@@ -1936,38 +1936,38 @@ discard block |
||
| 1936 | 1936 | */ |
| 1937 | 1937 | function spip_sqlite_updateq($table, $champs, $where = '', $desc = [], $serveur = '', $requeter = true) { |
| 1938 | 1938 | |
| 1939 | - if (!$champs) { |
|
| 1940 | - return; |
|
| 1941 | - } |
|
| 1942 | - if (!$desc) { |
|
| 1943 | - $desc = description_table($table, $serveur); |
|
| 1944 | - } |
|
| 1945 | - if (!$desc) { |
|
| 1946 | - die("$table insertion sans description"); |
|
| 1947 | - } |
|
| 1948 | - $fields = $desc['field']; |
|
| 1949 | - |
|
| 1950 | - $set = []; |
|
| 1951 | - foreach ($champs as $champ => $val) { |
|
| 1952 | - $set[$champ] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : ''); |
|
| 1953 | - } |
|
| 1954 | - |
|
| 1955 | - // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci |
|
| 1956 | - // attention ils sont deja quotes |
|
| 1957 | - $maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur); |
|
| 1958 | - foreach ($maj as $champ => $val) { |
|
| 1959 | - if (!isset($set[$champ])) { |
|
| 1960 | - $set[$champ] = $champ . '=' . $val; |
|
| 1961 | - } |
|
| 1962 | - } |
|
| 1963 | - |
|
| 1964 | - return spip_sqlite_query( |
|
| 1965 | - _sqlite_calculer_expression('UPDATE', $table, ',') |
|
| 1966 | - . _sqlite_calculer_expression('SET', $set, ',') |
|
| 1967 | - . _sqlite_calculer_expression('WHERE', $where), |
|
| 1968 | - $serveur, |
|
| 1969 | - $requeter |
|
| 1970 | - ); |
|
| 1939 | + if (!$champs) { |
|
| 1940 | + return; |
|
| 1941 | + } |
|
| 1942 | + if (!$desc) { |
|
| 1943 | + $desc = description_table($table, $serveur); |
|
| 1944 | + } |
|
| 1945 | + if (!$desc) { |
|
| 1946 | + die("$table insertion sans description"); |
|
| 1947 | + } |
|
| 1948 | + $fields = $desc['field']; |
|
| 1949 | + |
|
| 1950 | + $set = []; |
|
| 1951 | + foreach ($champs as $champ => $val) { |
|
| 1952 | + $set[$champ] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : ''); |
|
| 1953 | + } |
|
| 1954 | + |
|
| 1955 | + // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci |
|
| 1956 | + // attention ils sont deja quotes |
|
| 1957 | + $maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur); |
|
| 1958 | + foreach ($maj as $champ => $val) { |
|
| 1959 | + if (!isset($set[$champ])) { |
|
| 1960 | + $set[$champ] = $champ . '=' . $val; |
|
| 1961 | + } |
|
| 1962 | + } |
|
| 1963 | + |
|
| 1964 | + return spip_sqlite_query( |
|
| 1965 | + _sqlite_calculer_expression('UPDATE', $table, ',') |
|
| 1966 | + . _sqlite_calculer_expression('SET', $set, ',') |
|
| 1967 | + . _sqlite_calculer_expression('WHERE', $where), |
|
| 1968 | + $serveur, |
|
| 1969 | + $requeter |
|
| 1970 | + ); |
|
| 1971 | 1971 | } |
| 1972 | 1972 | |
| 1973 | 1973 | |
@@ -1985,17 +1985,17 @@ discard block |
||
| 1985 | 1985 | * @return void |
| 1986 | 1986 | */ |
| 1987 | 1987 | function _sqlite_init() { |
| 1988 | - if (!defined('_DIR_DB')) { |
|
| 1989 | - define('_DIR_DB', _DIR_ETC . 'bases/'); |
|
| 1990 | - } |
|
| 1991 | - if (!defined('_SQLITE_CHMOD')) { |
|
| 1992 | - define('_SQLITE_CHMOD', _SPIP_CHMOD); |
|
| 1993 | - } |
|
| 1988 | + if (!defined('_DIR_DB')) { |
|
| 1989 | + define('_DIR_DB', _DIR_ETC . 'bases/'); |
|
| 1990 | + } |
|
| 1991 | + if (!defined('_SQLITE_CHMOD')) { |
|
| 1992 | + define('_SQLITE_CHMOD', _SPIP_CHMOD); |
|
| 1993 | + } |
|
| 1994 | 1994 | |
| 1995 | - if (!is_dir($d = _DIR_DB)) { |
|
| 1996 | - include_spip('inc/flock'); |
|
| 1997 | - sous_repertoire($d); |
|
| 1998 | - } |
|
| 1995 | + if (!is_dir($d = _DIR_DB)) { |
|
| 1996 | + include_spip('inc/flock'); |
|
| 1997 | + sous_repertoire($d); |
|
| 1998 | + } |
|
| 1999 | 1999 | } |
| 2000 | 2000 | |
| 2001 | 2001 | |
@@ -2009,20 +2009,20 @@ discard block |
||
| 2009 | 2009 | * @return bool|int |
| 2010 | 2010 | */ |
| 2011 | 2011 | function _sqlite_is_version($version = '', $link = '', $serveur = '', $requeter = true) { |
| 2012 | - if ($link === '') { |
|
| 2013 | - $link = _sqlite_link($serveur); |
|
| 2014 | - } |
|
| 2015 | - if (!$link) { |
|
| 2016 | - return false; |
|
| 2017 | - } |
|
| 2012 | + if ($link === '') { |
|
| 2013 | + $link = _sqlite_link($serveur); |
|
| 2014 | + } |
|
| 2015 | + if (!$link) { |
|
| 2016 | + return false; |
|
| 2017 | + } |
|
| 2018 | 2018 | |
| 2019 | - $v = 3; |
|
| 2019 | + $v = 3; |
|
| 2020 | 2020 | |
| 2021 | - if (!$version) { |
|
| 2022 | - return $v; |
|
| 2023 | - } |
|
| 2021 | + if (!$version) { |
|
| 2022 | + return $v; |
|
| 2023 | + } |
|
| 2024 | 2024 | |
| 2025 | - return ($version == $v); |
|
| 2025 | + return ($version == $v); |
|
| 2026 | 2026 | } |
| 2027 | 2027 | |
| 2028 | 2028 | |
@@ -2033,9 +2033,9 @@ discard block |
||
| 2033 | 2033 | * @return PDO Information de connexion pour SQLite |
| 2034 | 2034 | */ |
| 2035 | 2035 | function _sqlite_link($serveur = '') { |
| 2036 | - $link = &$GLOBALS['connexions'][$serveur ? $serveur : 0]['link']; |
|
| 2036 | + $link = &$GLOBALS['connexions'][$serveur ? $serveur : 0]['link']; |
|
| 2037 | 2037 | |
| 2038 | - return $link; |
|
| 2038 | + return $link; |
|
| 2039 | 2039 | } |
| 2040 | 2040 | |
| 2041 | 2041 | |
@@ -2050,52 +2050,52 @@ discard block |
||
| 2050 | 2050 | * @return string|number Texte ou nombre échappé |
| 2051 | 2051 | */ |
| 2052 | 2052 | function _sqlite_calculer_cite($v, $type) { |
| 2053 | - if ($type) { |
|
| 2054 | - if ( |
|
| 2055 | - is_null($v) |
|
| 2056 | - and stripos($type, 'NOT NULL') === false |
|
| 2057 | - ) { |
|
| 2058 | - return 'NULL'; |
|
| 2059 | - } // null php se traduit en NULL SQL |
|
| 2060 | - |
|
| 2061 | - if (sql_test_date($type) and preg_match('/^\w+\(/', $v)) { |
|
| 2062 | - return $v; |
|
| 2063 | - } |
|
| 2064 | - if (sql_test_int($type)) { |
|
| 2065 | - if (is_numeric($v)) { |
|
| 2066 | - return $v; |
|
| 2067 | - } elseif (ctype_xdigit(substr($v, 2)) and strncmp($v, '0x', 2) == 0) { |
|
| 2068 | - return hexdec(substr($v, 2)); |
|
| 2069 | - } else { |
|
| 2070 | - return intval($v); |
|
| 2071 | - } |
|
| 2072 | - } |
|
| 2073 | - } else { |
|
| 2074 | - // si on ne connait pas le type on le deduit de $v autant que possible |
|
| 2075 | - if (is_bool($v)) { |
|
| 2076 | - return strval(intval($v)); |
|
| 2077 | - } |
|
| 2078 | - elseif (is_numeric($v)) { |
|
| 2079 | - return strval($v); |
|
| 2080 | - } |
|
| 2081 | - } |
|
| 2082 | - |
|
| 2083 | - // trouver un link sqlite pour faire l'echappement |
|
| 2084 | - foreach ($GLOBALS['connexions'] as $s) { |
|
| 2085 | - if ( |
|
| 2086 | - $l = $s['link'] |
|
| 2087 | - and is_object($l) |
|
| 2088 | - and $l instanceof \PDO |
|
| 2089 | - and $l->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'sqlite' |
|
| 2090 | - ) { |
|
| 2091 | - return $l->quote($v); |
|
| 2092 | - } |
|
| 2093 | - } |
|
| 2094 | - |
|
| 2095 | - // echapper les ' en '' |
|
| 2096 | - spip_log('Pas de methode ->quote pour echapper', 'sqlite.' . _LOG_INFO_IMPORTANTE); |
|
| 2097 | - |
|
| 2098 | - return ("'" . str_replace("'", "''", $v) . "'"); |
|
| 2053 | + if ($type) { |
|
| 2054 | + if ( |
|
| 2055 | + is_null($v) |
|
| 2056 | + and stripos($type, 'NOT NULL') === false |
|
| 2057 | + ) { |
|
| 2058 | + return 'NULL'; |
|
| 2059 | + } // null php se traduit en NULL SQL |
|
| 2060 | + |
|
| 2061 | + if (sql_test_date($type) and preg_match('/^\w+\(/', $v)) { |
|
| 2062 | + return $v; |
|
| 2063 | + } |
|
| 2064 | + if (sql_test_int($type)) { |
|
| 2065 | + if (is_numeric($v)) { |
|
| 2066 | + return $v; |
|
| 2067 | + } elseif (ctype_xdigit(substr($v, 2)) and strncmp($v, '0x', 2) == 0) { |
|
| 2068 | + return hexdec(substr($v, 2)); |
|
| 2069 | + } else { |
|
| 2070 | + return intval($v); |
|
| 2071 | + } |
|
| 2072 | + } |
|
| 2073 | + } else { |
|
| 2074 | + // si on ne connait pas le type on le deduit de $v autant que possible |
|
| 2075 | + if (is_bool($v)) { |
|
| 2076 | + return strval(intval($v)); |
|
| 2077 | + } |
|
| 2078 | + elseif (is_numeric($v)) { |
|
| 2079 | + return strval($v); |
|
| 2080 | + } |
|
| 2081 | + } |
|
| 2082 | + |
|
| 2083 | + // trouver un link sqlite pour faire l'echappement |
|
| 2084 | + foreach ($GLOBALS['connexions'] as $s) { |
|
| 2085 | + if ( |
|
| 2086 | + $l = $s['link'] |
|
| 2087 | + and is_object($l) |
|
| 2088 | + and $l instanceof \PDO |
|
| 2089 | + and $l->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'sqlite' |
|
| 2090 | + ) { |
|
| 2091 | + return $l->quote($v); |
|
| 2092 | + } |
|
| 2093 | + } |
|
| 2094 | + |
|
| 2095 | + // echapper les ' en '' |
|
| 2096 | + spip_log('Pas de methode ->quote pour echapper', 'sqlite.' . _LOG_INFO_IMPORTANTE); |
|
| 2097 | + |
|
| 2098 | + return ("'" . str_replace("'", "''", $v) . "'"); |
|
| 2099 | 2099 | } |
| 2100 | 2100 | |
| 2101 | 2101 | |
@@ -2111,21 +2111,21 @@ discard block |
||
| 2111 | 2111 | * @return string Texte de l'expression, une partie donc, du texte la requête. |
| 2112 | 2112 | */ |
| 2113 | 2113 | function _sqlite_calculer_expression($expression, $v, $join = 'AND') { |
| 2114 | - if (empty($v)) { |
|
| 2115 | - return ''; |
|
| 2116 | - } |
|
| 2114 | + if (empty($v)) { |
|
| 2115 | + return ''; |
|
| 2116 | + } |
|
| 2117 | 2117 | |
| 2118 | - $exp = "\n$expression "; |
|
| 2118 | + $exp = "\n$expression "; |
|
| 2119 | 2119 | |
| 2120 | - if (!is_array($v)) { |
|
| 2121 | - return $exp . $v; |
|
| 2122 | - } else { |
|
| 2123 | - if (strtoupper($join) === 'AND') { |
|
| 2124 | - return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v)); |
|
| 2125 | - } else { |
|
| 2126 | - return $exp . join($join, $v); |
|
| 2127 | - } |
|
| 2128 | - } |
|
| 2120 | + if (!is_array($v)) { |
|
| 2121 | + return $exp . $v; |
|
| 2122 | + } else { |
|
| 2123 | + if (strtoupper($join) === 'AND') { |
|
| 2124 | + return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v)); |
|
| 2125 | + } else { |
|
| 2126 | + return $exp . join($join, $v); |
|
| 2127 | + } |
|
| 2128 | + } |
|
| 2129 | 2129 | } |
| 2130 | 2130 | |
| 2131 | 2131 | |
@@ -2141,7 +2141,7 @@ discard block |
||
| 2141 | 2141 | * @return string Texte du orderby préparé |
| 2142 | 2142 | */ |
| 2143 | 2143 | function _sqlite_calculer_order($orderby) { |
| 2144 | - return (is_array($orderby)) ? join(', ', $orderby) : $orderby; |
|
| 2144 | + return (is_array($orderby)) ? join(', ', $orderby) : $orderby; |
|
| 2145 | 2145 | } |
| 2146 | 2146 | |
| 2147 | 2147 | |
@@ -2152,26 +2152,26 @@ discard block |
||
| 2152 | 2152 | * @return string Sélection de colonnes pour une clause SELECT |
| 2153 | 2153 | */ |
| 2154 | 2154 | function _sqlite_calculer_select_as($args) { |
| 2155 | - $res = ''; |
|
| 2156 | - foreach ($args as $k => $v) { |
|
| 2157 | - if (substr($k, -1) == '@') { |
|
| 2158 | - // c'est une jointure qui se refere au from precedent |
|
| 2159 | - // pas de virgule |
|
| 2160 | - $res .= ' ' . $v; |
|
| 2161 | - } else { |
|
| 2162 | - if (!is_numeric($k)) { |
|
| 2163 | - $p = strpos($v, ' '); |
|
| 2164 | - if ($p) { |
|
| 2165 | - $v = substr($v, 0, $p) . " AS '$k'" . substr($v, $p); |
|
| 2166 | - } else { |
|
| 2167 | - $v .= " AS '$k'"; |
|
| 2168 | - } |
|
| 2169 | - } |
|
| 2170 | - $res .= ', ' . $v; |
|
| 2171 | - } |
|
| 2172 | - } |
|
| 2173 | - |
|
| 2174 | - return substr($res, 2); |
|
| 2155 | + $res = ''; |
|
| 2156 | + foreach ($args as $k => $v) { |
|
| 2157 | + if (substr($k, -1) == '@') { |
|
| 2158 | + // c'est une jointure qui se refere au from precedent |
|
| 2159 | + // pas de virgule |
|
| 2160 | + $res .= ' ' . $v; |
|
| 2161 | + } else { |
|
| 2162 | + if (!is_numeric($k)) { |
|
| 2163 | + $p = strpos($v, ' '); |
|
| 2164 | + if ($p) { |
|
| 2165 | + $v = substr($v, 0, $p) . " AS '$k'" . substr($v, $p); |
|
| 2166 | + } else { |
|
| 2167 | + $v .= " AS '$k'"; |
|
| 2168 | + } |
|
| 2169 | + } |
|
| 2170 | + $res .= ', ' . $v; |
|
| 2171 | + } |
|
| 2172 | + } |
|
| 2173 | + |
|
| 2174 | + return substr($res, 2); |
|
| 2175 | 2175 | } |
| 2176 | 2176 | |
| 2177 | 2177 | |
@@ -2194,26 +2194,26 @@ discard block |
||
| 2194 | 2194 | * Contrainte pour clause WHERE |
| 2195 | 2195 | */ |
| 2196 | 2196 | function _sqlite_calculer_where($v) { |
| 2197 | - if (!is_array($v)) { |
|
| 2198 | - return $v; |
|
| 2199 | - } |
|
| 2200 | - |
|
| 2201 | - $op = array_shift($v); |
|
| 2202 | - if (!($n = count($v))) { |
|
| 2203 | - return $op; |
|
| 2204 | - } else { |
|
| 2205 | - $arg = _sqlite_calculer_where(array_shift($v)); |
|
| 2206 | - if ($n == 1) { |
|
| 2207 | - return "$op($arg)"; |
|
| 2208 | - } else { |
|
| 2209 | - $arg2 = _sqlite_calculer_where(array_shift($v)); |
|
| 2210 | - if ($n == 2) { |
|
| 2211 | - return "($arg $op $arg2)"; |
|
| 2212 | - } else { |
|
| 2213 | - return "($arg $op ($arg2) : $v[0])"; |
|
| 2214 | - } |
|
| 2215 | - } |
|
| 2216 | - } |
|
| 2197 | + if (!is_array($v)) { |
|
| 2198 | + return $v; |
|
| 2199 | + } |
|
| 2200 | + |
|
| 2201 | + $op = array_shift($v); |
|
| 2202 | + if (!($n = count($v))) { |
|
| 2203 | + return $op; |
|
| 2204 | + } else { |
|
| 2205 | + $arg = _sqlite_calculer_where(array_shift($v)); |
|
| 2206 | + if ($n == 1) { |
|
| 2207 | + return "$op($arg)"; |
|
| 2208 | + } else { |
|
| 2209 | + $arg2 = _sqlite_calculer_where(array_shift($v)); |
|
| 2210 | + if ($n == 2) { |
|
| 2211 | + return "($arg $op $arg2)"; |
|
| 2212 | + } else { |
|
| 2213 | + return "($arg $op ($arg2) : $v[0])"; |
|
| 2214 | + } |
|
| 2215 | + } |
|
| 2216 | + } |
|
| 2217 | 2217 | } |
| 2218 | 2218 | |
| 2219 | 2219 | |
@@ -2228,19 +2228,19 @@ discard block |
||
| 2228 | 2228 | * @return array|bool |
| 2229 | 2229 | */ |
| 2230 | 2230 | function _sqlite_charger_version($version = '') { |
| 2231 | - $versions = []; |
|
| 2231 | + $versions = []; |
|
| 2232 | 2232 | |
| 2233 | - // version 3 |
|
| 2234 | - if (!$version || $version == 3) { |
|
| 2235 | - if (extension_loaded('pdo') && extension_loaded('pdo_sqlite')) { |
|
| 2236 | - $versions[] = 3; |
|
| 2237 | - } |
|
| 2238 | - } |
|
| 2239 | - if ($version) { |
|
| 2240 | - return in_array($version, $versions); |
|
| 2241 | - } |
|
| 2233 | + // version 3 |
|
| 2234 | + if (!$version || $version == 3) { |
|
| 2235 | + if (extension_loaded('pdo') && extension_loaded('pdo_sqlite')) { |
|
| 2236 | + $versions[] = 3; |
|
| 2237 | + } |
|
| 2238 | + } |
|
| 2239 | + if ($version) { |
|
| 2240 | + return in_array($version, $versions); |
|
| 2241 | + } |
|
| 2242 | 2242 | |
| 2243 | - return $versions; |
|
| 2243 | + return $versions; |
|
| 2244 | 2244 | } |
| 2245 | 2245 | |
| 2246 | 2246 | |
@@ -2278,147 +2278,147 @@ discard block |
||
| 2278 | 2278 | */ |
| 2279 | 2279 | function _sqlite_modifier_table($table, $colonne, $opt = [], $serveur = '') { |
| 2280 | 2280 | |
| 2281 | - if (is_array($table)) { |
|
| 2282 | - $table_destination = reset($table); |
|
| 2283 | - $table_origine = key($table); |
|
| 2284 | - } else { |
|
| 2285 | - $table_origine = $table_destination = $table; |
|
| 2286 | - } |
|
| 2287 | - // ne prend actuellement qu'un changement |
|
| 2288 | - // mais pourra etre adapte pour changer plus qu'une colonne a la fois |
|
| 2289 | - if (is_array($colonne)) { |
|
| 2290 | - $colonne_destination = reset($colonne); |
|
| 2291 | - $colonne_origine = key($colonne); |
|
| 2292 | - } else { |
|
| 2293 | - $colonne_origine = $colonne_destination = $colonne; |
|
| 2294 | - } |
|
| 2295 | - if (!isset($opt['field'])) { |
|
| 2296 | - $opt['field'] = []; |
|
| 2297 | - } |
|
| 2298 | - if (!isset($opt['key'])) { |
|
| 2299 | - $opt['key'] = []; |
|
| 2300 | - } |
|
| 2301 | - |
|
| 2302 | - // si les noms de tables sont differents, pas besoin de table temporaire |
|
| 2303 | - // on prendra directement le nom de la future table |
|
| 2304 | - $meme_table = ($table_origine == $table_destination); |
|
| 2305 | - |
|
| 2306 | - $def_origine = sql_showtable($table_origine, false, $serveur); |
|
| 2307 | - if (!$def_origine or !isset($def_origine['field'])) { |
|
| 2308 | - spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite' . _LOG_ERREUR); |
|
| 2309 | - |
|
| 2310 | - return false; |
|
| 2311 | - } |
|
| 2312 | - |
|
| 2313 | - |
|
| 2314 | - $table_tmp = $table_origine . '_tmp'; |
|
| 2315 | - |
|
| 2316 | - // 1) creer une table temporaire avec les modifications |
|
| 2317 | - // - DROP : suppression de la colonne |
|
| 2318 | - // - CHANGE : modification de la colonne |
|
| 2319 | - // (foreach pour conserver l'ordre des champs) |
|
| 2320 | - |
|
| 2321 | - // field |
|
| 2322 | - $fields = []; |
|
| 2323 | - // pour le INSERT INTO plus loin |
|
| 2324 | - // stocker la correspondance nouvelles->anciennes colonnes |
|
| 2325 | - $fields_correspondances = []; |
|
| 2326 | - foreach ($def_origine['field'] as $c => $d) { |
|
| 2327 | - if ($colonne_origine && ($c == $colonne_origine)) { |
|
| 2328 | - // si pas DROP |
|
| 2329 | - if ($colonne_destination) { |
|
| 2330 | - $fields[$colonne_destination] = $opt['field'][$colonne_destination]; |
|
| 2331 | - $fields_correspondances[$colonne_destination] = $c; |
|
| 2332 | - } |
|
| 2333 | - } else { |
|
| 2334 | - $fields[$c] = $d; |
|
| 2335 | - $fields_correspondances[$c] = $c; |
|
| 2336 | - } |
|
| 2337 | - } |
|
| 2338 | - // cas de ADD sqlite2 (ajout du champ en fin de table): |
|
| 2339 | - if (!$colonne_origine && $colonne_destination) { |
|
| 2340 | - $fields[$colonne_destination] = $opt['field'][$colonne_destination]; |
|
| 2341 | - } |
|
| 2342 | - |
|
| 2343 | - // key... |
|
| 2344 | - $keys = []; |
|
| 2345 | - foreach ($def_origine['key'] as $c => $d) { |
|
| 2346 | - $c = str_replace($colonne_origine, $colonne_destination, $c); |
|
| 2347 | - $d = str_replace($colonne_origine, $colonne_destination, $d); |
|
| 2348 | - // seulement si on ne supprime pas la colonne ! |
|
| 2349 | - if ($d) { |
|
| 2350 | - $keys[$c] = $d; |
|
| 2351 | - } |
|
| 2352 | - } |
|
| 2353 | - |
|
| 2354 | - // autres keys, on merge |
|
| 2355 | - $keys = array_merge($keys, $opt['key']); |
|
| 2356 | - $queries = []; |
|
| 2357 | - |
|
| 2358 | - // copier dans destination (si differente de origine), sinon tmp |
|
| 2359 | - $table_copie = ($meme_table) ? $table_tmp : $table_destination; |
|
| 2360 | - $autoinc = (isset($keys['PRIMARY KEY']) |
|
| 2361 | - and $keys['PRIMARY KEY'] |
|
| 2362 | - and stripos($keys['PRIMARY KEY'], ',') === false |
|
| 2363 | - and stripos($fields[$keys['PRIMARY KEY']], 'default') === false); |
|
| 2364 | - |
|
| 2365 | - if ( |
|
| 2366 | - $q = _sqlite_requete_create( |
|
| 2367 | - $table_copie, |
|
| 2368 | - $fields, |
|
| 2369 | - $keys, |
|
| 2370 | - $autoinc, |
|
| 2371 | - $temporary = false, |
|
| 2372 | - $ifnotexists = true, |
|
| 2373 | - $serveur |
|
| 2374 | - ) |
|
| 2375 | - ) { |
|
| 2376 | - $queries[] = $q; |
|
| 2377 | - } |
|
| 2378 | - |
|
| 2379 | - |
|
| 2380 | - // 2) y copier les champs qui vont bien |
|
| 2381 | - $champs_dest = join(', ', array_keys($fields_correspondances)); |
|
| 2382 | - $champs_ori = join(', ', $fields_correspondances); |
|
| 2383 | - $queries[] = "INSERT INTO $table_copie ($champs_dest) SELECT $champs_ori FROM $table_origine"; |
|
| 2384 | - |
|
| 2385 | - // 3) supprimer la table d'origine |
|
| 2386 | - $queries[] = "DROP TABLE $table_origine"; |
|
| 2387 | - |
|
| 2388 | - // 4) renommer la table temporaire |
|
| 2389 | - // avec le nom de la table destination |
|
| 2390 | - // si necessaire |
|
| 2391 | - if ($meme_table) { |
|
| 2392 | - $queries[] = "ALTER TABLE $table_copie RENAME TO $table_destination"; |
|
| 2393 | - } |
|
| 2394 | - |
|
| 2395 | - // 5) remettre les index ! |
|
| 2396 | - foreach ($keys as $k => $v) { |
|
| 2397 | - if ($k == 'PRIMARY KEY') { |
|
| 2398 | - } else { |
|
| 2399 | - // enlever KEY |
|
| 2400 | - $k = substr($k, 4); |
|
| 2401 | - $queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)"; |
|
| 2402 | - } |
|
| 2403 | - } |
|
| 2404 | - |
|
| 2405 | - |
|
| 2406 | - if (count($queries)) { |
|
| 2407 | - spip_sqlite::demarrer_transaction($serveur); |
|
| 2408 | - // il faut les faire une par une car $query = join('; ', $queries).";"; ne fonctionne pas |
|
| 2409 | - foreach ($queries as $q) { |
|
| 2410 | - if (!spip_sqlite::executer_requete($q, $serveur)) { |
|
| 2411 | - spip_log('SQLite : ALTER TABLE table :' |
|
| 2412 | - . " Erreur a l'execution de la requete : $q", 'sqlite.' . _LOG_ERREUR); |
|
| 2413 | - spip_sqlite::annuler_transaction($serveur); |
|
| 2414 | - |
|
| 2415 | - return false; |
|
| 2416 | - } |
|
| 2417 | - } |
|
| 2418 | - spip_sqlite::finir_transaction($serveur); |
|
| 2419 | - } |
|
| 2420 | - |
|
| 2421 | - return true; |
|
| 2281 | + if (is_array($table)) { |
|
| 2282 | + $table_destination = reset($table); |
|
| 2283 | + $table_origine = key($table); |
|
| 2284 | + } else { |
|
| 2285 | + $table_origine = $table_destination = $table; |
|
| 2286 | + } |
|
| 2287 | + // ne prend actuellement qu'un changement |
|
| 2288 | + // mais pourra etre adapte pour changer plus qu'une colonne a la fois |
|
| 2289 | + if (is_array($colonne)) { |
|
| 2290 | + $colonne_destination = reset($colonne); |
|
| 2291 | + $colonne_origine = key($colonne); |
|
| 2292 | + } else { |
|
| 2293 | + $colonne_origine = $colonne_destination = $colonne; |
|
| 2294 | + } |
|
| 2295 | + if (!isset($opt['field'])) { |
|
| 2296 | + $opt['field'] = []; |
|
| 2297 | + } |
|
| 2298 | + if (!isset($opt['key'])) { |
|
| 2299 | + $opt['key'] = []; |
|
| 2300 | + } |
|
| 2301 | + |
|
| 2302 | + // si les noms de tables sont differents, pas besoin de table temporaire |
|
| 2303 | + // on prendra directement le nom de la future table |
|
| 2304 | + $meme_table = ($table_origine == $table_destination); |
|
| 2305 | + |
|
| 2306 | + $def_origine = sql_showtable($table_origine, false, $serveur); |
|
| 2307 | + if (!$def_origine or !isset($def_origine['field'])) { |
|
| 2308 | + spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite' . _LOG_ERREUR); |
|
| 2309 | + |
|
| 2310 | + return false; |
|
| 2311 | + } |
|
| 2312 | + |
|
| 2313 | + |
|
| 2314 | + $table_tmp = $table_origine . '_tmp'; |
|
| 2315 | + |
|
| 2316 | + // 1) creer une table temporaire avec les modifications |
|
| 2317 | + // - DROP : suppression de la colonne |
|
| 2318 | + // - CHANGE : modification de la colonne |
|
| 2319 | + // (foreach pour conserver l'ordre des champs) |
|
| 2320 | + |
|
| 2321 | + // field |
|
| 2322 | + $fields = []; |
|
| 2323 | + // pour le INSERT INTO plus loin |
|
| 2324 | + // stocker la correspondance nouvelles->anciennes colonnes |
|
| 2325 | + $fields_correspondances = []; |
|
| 2326 | + foreach ($def_origine['field'] as $c => $d) { |
|
| 2327 | + if ($colonne_origine && ($c == $colonne_origine)) { |
|
| 2328 | + // si pas DROP |
|
| 2329 | + if ($colonne_destination) { |
|
| 2330 | + $fields[$colonne_destination] = $opt['field'][$colonne_destination]; |
|
| 2331 | + $fields_correspondances[$colonne_destination] = $c; |
|
| 2332 | + } |
|
| 2333 | + } else { |
|
| 2334 | + $fields[$c] = $d; |
|
| 2335 | + $fields_correspondances[$c] = $c; |
|
| 2336 | + } |
|
| 2337 | + } |
|
| 2338 | + // cas de ADD sqlite2 (ajout du champ en fin de table): |
|
| 2339 | + if (!$colonne_origine && $colonne_destination) { |
|
| 2340 | + $fields[$colonne_destination] = $opt['field'][$colonne_destination]; |
|
| 2341 | + } |
|
| 2342 | + |
|
| 2343 | + // key... |
|
| 2344 | + $keys = []; |
|
| 2345 | + foreach ($def_origine['key'] as $c => $d) { |
|
| 2346 | + $c = str_replace($colonne_origine, $colonne_destination, $c); |
|
| 2347 | + $d = str_replace($colonne_origine, $colonne_destination, $d); |
|
| 2348 | + // seulement si on ne supprime pas la colonne ! |
|
| 2349 | + if ($d) { |
|
| 2350 | + $keys[$c] = $d; |
|
| 2351 | + } |
|
| 2352 | + } |
|
| 2353 | + |
|
| 2354 | + // autres keys, on merge |
|
| 2355 | + $keys = array_merge($keys, $opt['key']); |
|
| 2356 | + $queries = []; |
|
| 2357 | + |
|
| 2358 | + // copier dans destination (si differente de origine), sinon tmp |
|
| 2359 | + $table_copie = ($meme_table) ? $table_tmp : $table_destination; |
|
| 2360 | + $autoinc = (isset($keys['PRIMARY KEY']) |
|
| 2361 | + and $keys['PRIMARY KEY'] |
|
| 2362 | + and stripos($keys['PRIMARY KEY'], ',') === false |
|
| 2363 | + and stripos($fields[$keys['PRIMARY KEY']], 'default') === false); |
|
| 2364 | + |
|
| 2365 | + if ( |
|
| 2366 | + $q = _sqlite_requete_create( |
|
| 2367 | + $table_copie, |
|
| 2368 | + $fields, |
|
| 2369 | + $keys, |
|
| 2370 | + $autoinc, |
|
| 2371 | + $temporary = false, |
|
| 2372 | + $ifnotexists = true, |
|
| 2373 | + $serveur |
|
| 2374 | + ) |
|
| 2375 | + ) { |
|
| 2376 | + $queries[] = $q; |
|
| 2377 | + } |
|
| 2378 | + |
|
| 2379 | + |
|
| 2380 | + // 2) y copier les champs qui vont bien |
|
| 2381 | + $champs_dest = join(', ', array_keys($fields_correspondances)); |
|
| 2382 | + $champs_ori = join(', ', $fields_correspondances); |
|
| 2383 | + $queries[] = "INSERT INTO $table_copie ($champs_dest) SELECT $champs_ori FROM $table_origine"; |
|
| 2384 | + |
|
| 2385 | + // 3) supprimer la table d'origine |
|
| 2386 | + $queries[] = "DROP TABLE $table_origine"; |
|
| 2387 | + |
|
| 2388 | + // 4) renommer la table temporaire |
|
| 2389 | + // avec le nom de la table destination |
|
| 2390 | + // si necessaire |
|
| 2391 | + if ($meme_table) { |
|
| 2392 | + $queries[] = "ALTER TABLE $table_copie RENAME TO $table_destination"; |
|
| 2393 | + } |
|
| 2394 | + |
|
| 2395 | + // 5) remettre les index ! |
|
| 2396 | + foreach ($keys as $k => $v) { |
|
| 2397 | + if ($k == 'PRIMARY KEY') { |
|
| 2398 | + } else { |
|
| 2399 | + // enlever KEY |
|
| 2400 | + $k = substr($k, 4); |
|
| 2401 | + $queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)"; |
|
| 2402 | + } |
|
| 2403 | + } |
|
| 2404 | + |
|
| 2405 | + |
|
| 2406 | + if (count($queries)) { |
|
| 2407 | + spip_sqlite::demarrer_transaction($serveur); |
|
| 2408 | + // il faut les faire une par une car $query = join('; ', $queries).";"; ne fonctionne pas |
|
| 2409 | + foreach ($queries as $q) { |
|
| 2410 | + if (!spip_sqlite::executer_requete($q, $serveur)) { |
|
| 2411 | + spip_log('SQLite : ALTER TABLE table :' |
|
| 2412 | + . " Erreur a l'execution de la requete : $q", 'sqlite.' . _LOG_ERREUR); |
|
| 2413 | + spip_sqlite::annuler_transaction($serveur); |
|
| 2414 | + |
|
| 2415 | + return false; |
|
| 2416 | + } |
|
| 2417 | + } |
|
| 2418 | + spip_sqlite::finir_transaction($serveur); |
|
| 2419 | + } |
|
| 2420 | + |
|
| 2421 | + return true; |
|
| 2422 | 2422 | } |
| 2423 | 2423 | |
| 2424 | 2424 | |
@@ -2428,61 +2428,61 @@ discard block |
||
| 2428 | 2428 | * @return array |
| 2429 | 2429 | */ |
| 2430 | 2430 | function _sqlite_ref_fonctions() { |
| 2431 | - $fonctions = [ |
|
| 2432 | - 'alter' => 'spip_sqlite_alter', |
|
| 2433 | - 'count' => 'spip_sqlite_count', |
|
| 2434 | - 'countsel' => 'spip_sqlite_countsel', |
|
| 2435 | - 'create' => 'spip_sqlite_create', |
|
| 2436 | - 'create_base' => 'spip_sqlite_create_base', |
|
| 2437 | - 'create_view' => 'spip_sqlite_create_view', |
|
| 2438 | - 'date_proche' => 'spip_sqlite_date_proche', |
|
| 2439 | - 'delete' => 'spip_sqlite_delete', |
|
| 2440 | - 'drop_table' => 'spip_sqlite_drop_table', |
|
| 2441 | - 'drop_view' => 'spip_sqlite_drop_view', |
|
| 2442 | - 'errno' => 'spip_sqlite_errno', |
|
| 2443 | - 'error' => 'spip_sqlite_error', |
|
| 2444 | - 'explain' => 'spip_sqlite_explain', |
|
| 2445 | - 'fetch' => 'spip_sqlite_fetch', |
|
| 2446 | - 'seek' => 'spip_sqlite_seek', |
|
| 2447 | - 'free' => 'spip_sqlite_free', |
|
| 2448 | - 'hex' => 'spip_sqlite_hex', |
|
| 2449 | - 'in' => 'spip_sqlite_in', |
|
| 2450 | - 'insert' => 'spip_sqlite_insert', |
|
| 2451 | - 'insertq' => 'spip_sqlite_insertq', |
|
| 2452 | - 'insertq_multi' => 'spip_sqlite_insertq_multi', |
|
| 2453 | - 'listdbs' => 'spip_sqlite_listdbs', |
|
| 2454 | - 'multi' => 'spip_sqlite_multi', |
|
| 2455 | - 'optimize' => 'spip_sqlite_optimize', |
|
| 2456 | - 'query' => 'spip_sqlite_query', |
|
| 2457 | - 'quote' => 'spip_sqlite_quote', |
|
| 2458 | - 'repair' => 'spip_sqlite_repair', |
|
| 2459 | - 'replace' => 'spip_sqlite_replace', |
|
| 2460 | - 'replace_multi' => 'spip_sqlite_replace_multi', |
|
| 2461 | - 'select' => 'spip_sqlite_select', |
|
| 2462 | - 'selectdb' => 'spip_sqlite_selectdb', |
|
| 2463 | - 'set_charset' => 'spip_sqlite_set_charset', |
|
| 2464 | - 'get_charset' => 'spip_sqlite_get_charset', |
|
| 2465 | - 'showbase' => 'spip_sqlite_showbase', |
|
| 2466 | - 'showtable' => 'spip_sqlite_showtable', |
|
| 2467 | - 'table_exists' => 'spip_sqlite_table_exists', |
|
| 2468 | - 'update' => 'spip_sqlite_update', |
|
| 2469 | - 'updateq' => 'spip_sqlite_updateq', |
|
| 2470 | - 'preferer_transaction' => 'spip_sqlite_preferer_transaction', |
|
| 2471 | - 'demarrer_transaction' => 'spip_sqlite_demarrer_transaction', |
|
| 2472 | - 'terminer_transaction' => 'spip_sqlite_terminer_transaction', |
|
| 2473 | - ]; |
|
| 2474 | - |
|
| 2475 | - // association de chaque nom http d'un charset aux couples sqlite |
|
| 2476 | - // SQLite supporte utf-8 et utf-16 uniquement. |
|
| 2477 | - $charsets = [ |
|
| 2478 | - 'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci'], |
|
| 2479 | - //'utf-16be'=>array('charset'=>'utf16be','collation'=>'UTF-16BE'),// aucune idee de quoi il faut remplir dans es champs la |
|
| 2480 | - //'utf-16le'=>array('charset'=>'utf16le','collation'=>'UTF-16LE') |
|
| 2481 | - ]; |
|
| 2482 | - |
|
| 2483 | - $fonctions['charsets'] = $charsets; |
|
| 2484 | - |
|
| 2485 | - return $fonctions; |
|
| 2431 | + $fonctions = [ |
|
| 2432 | + 'alter' => 'spip_sqlite_alter', |
|
| 2433 | + 'count' => 'spip_sqlite_count', |
|
| 2434 | + 'countsel' => 'spip_sqlite_countsel', |
|
| 2435 | + 'create' => 'spip_sqlite_create', |
|
| 2436 | + 'create_base' => 'spip_sqlite_create_base', |
|
| 2437 | + 'create_view' => 'spip_sqlite_create_view', |
|
| 2438 | + 'date_proche' => 'spip_sqlite_date_proche', |
|
| 2439 | + 'delete' => 'spip_sqlite_delete', |
|
| 2440 | + 'drop_table' => 'spip_sqlite_drop_table', |
|
| 2441 | + 'drop_view' => 'spip_sqlite_drop_view', |
|
| 2442 | + 'errno' => 'spip_sqlite_errno', |
|
| 2443 | + 'error' => 'spip_sqlite_error', |
|
| 2444 | + 'explain' => 'spip_sqlite_explain', |
|
| 2445 | + 'fetch' => 'spip_sqlite_fetch', |
|
| 2446 | + 'seek' => 'spip_sqlite_seek', |
|
| 2447 | + 'free' => 'spip_sqlite_free', |
|
| 2448 | + 'hex' => 'spip_sqlite_hex', |
|
| 2449 | + 'in' => 'spip_sqlite_in', |
|
| 2450 | + 'insert' => 'spip_sqlite_insert', |
|
| 2451 | + 'insertq' => 'spip_sqlite_insertq', |
|
| 2452 | + 'insertq_multi' => 'spip_sqlite_insertq_multi', |
|
| 2453 | + 'listdbs' => 'spip_sqlite_listdbs', |
|
| 2454 | + 'multi' => 'spip_sqlite_multi', |
|
| 2455 | + 'optimize' => 'spip_sqlite_optimize', |
|
| 2456 | + 'query' => 'spip_sqlite_query', |
|
| 2457 | + 'quote' => 'spip_sqlite_quote', |
|
| 2458 | + 'repair' => 'spip_sqlite_repair', |
|
| 2459 | + 'replace' => 'spip_sqlite_replace', |
|
| 2460 | + 'replace_multi' => 'spip_sqlite_replace_multi', |
|
| 2461 | + 'select' => 'spip_sqlite_select', |
|
| 2462 | + 'selectdb' => 'spip_sqlite_selectdb', |
|
| 2463 | + 'set_charset' => 'spip_sqlite_set_charset', |
|
| 2464 | + 'get_charset' => 'spip_sqlite_get_charset', |
|
| 2465 | + 'showbase' => 'spip_sqlite_showbase', |
|
| 2466 | + 'showtable' => 'spip_sqlite_showtable', |
|
| 2467 | + 'table_exists' => 'spip_sqlite_table_exists', |
|
| 2468 | + 'update' => 'spip_sqlite_update', |
|
| 2469 | + 'updateq' => 'spip_sqlite_updateq', |
|
| 2470 | + 'preferer_transaction' => 'spip_sqlite_preferer_transaction', |
|
| 2471 | + 'demarrer_transaction' => 'spip_sqlite_demarrer_transaction', |
|
| 2472 | + 'terminer_transaction' => 'spip_sqlite_terminer_transaction', |
|
| 2473 | + ]; |
|
| 2474 | + |
|
| 2475 | + // association de chaque nom http d'un charset aux couples sqlite |
|
| 2476 | + // SQLite supporte utf-8 et utf-16 uniquement. |
|
| 2477 | + $charsets = [ |
|
| 2478 | + 'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci'], |
|
| 2479 | + //'utf-16be'=>array('charset'=>'utf16be','collation'=>'UTF-16BE'),// aucune idee de quoi il faut remplir dans es champs la |
|
| 2480 | + //'utf-16le'=>array('charset'=>'utf16le','collation'=>'UTF-16LE') |
|
| 2481 | + ]; |
|
| 2482 | + |
|
| 2483 | + $fonctions['charsets'] = $charsets; |
|
| 2484 | + |
|
| 2485 | + return $fonctions; |
|
| 2486 | 2486 | } |
| 2487 | 2487 | |
| 2488 | 2488 | |
@@ -2494,56 +2494,56 @@ discard block |
||
| 2494 | 2494 | * @return mixed |
| 2495 | 2495 | */ |
| 2496 | 2496 | function _sqlite_remplacements_definitions_table($query, $autoinc = false) { |
| 2497 | - // quelques remplacements |
|
| 2498 | - $num = '(\s*\([0-9]*\))?'; |
|
| 2499 | - $enum = '(\s*\([^\)]*\))?'; |
|
| 2500 | - |
|
| 2501 | - $remplace = [ |
|
| 2502 | - '/enum' . $enum . '/is' => 'VARCHAR(255)', |
|
| 2503 | - '/COLLATE \w+_bin/is' => 'COLLATE BINARY', |
|
| 2504 | - '/COLLATE \w+_ci/is' => 'COLLATE NOCASE', |
|
| 2505 | - '/auto_increment/is' => '', |
|
| 2506 | - '/current_timestamp\(\)/is' => 'CURRENT_TIMESTAMP', // Fix export depuis mariaDB #4374 |
|
| 2507 | - '/(timestamp .* )ON .*$/is' => '\\1', |
|
| 2508 | - '/character set \w+/is' => '', |
|
| 2509 | - '/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED', |
|
| 2510 | - '/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''", |
|
| 2511 | - '/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''", |
|
| 2512 | - '/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'", |
|
| 2513 | - '/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'", |
|
| 2514 | - ]; |
|
| 2515 | - |
|
| 2516 | - // pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY |
|
| 2517 | - $remplace_autocinc = [ |
|
| 2518 | - '/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER' |
|
| 2519 | - ]; |
|
| 2520 | - // pour les int non autoincrement, il faut un DEFAULT |
|
| 2521 | - $remplace_nonautocinc = [ |
|
| 2522 | - '/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0", |
|
| 2523 | - ]; |
|
| 2524 | - |
|
| 2525 | - if (is_string($query)) { |
|
| 2526 | - $query = preg_replace(array_keys($remplace), $remplace, $query); |
|
| 2527 | - if ($autoinc or preg_match(',AUTO_INCREMENT,is', $query)) { |
|
| 2528 | - $query = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query); |
|
| 2529 | - } else { |
|
| 2530 | - $query = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query); |
|
| 2531 | - $query = _sqlite_collate_ci($query); |
|
| 2532 | - } |
|
| 2533 | - } elseif (is_array($query)) { |
|
| 2534 | - foreach ($query as $k => $q) { |
|
| 2535 | - $ai = ($autoinc ? $k == $autoinc : preg_match(',AUTO_INCREMENT,is', $q)); |
|
| 2536 | - $query[$k] = preg_replace(array_keys($remplace), $remplace, $query[$k]); |
|
| 2537 | - if ($ai) { |
|
| 2538 | - $query[$k] = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query[$k]); |
|
| 2539 | - } else { |
|
| 2540 | - $query[$k] = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query[$k]); |
|
| 2541 | - $query[$k] = _sqlite_collate_ci($query[$k]); |
|
| 2542 | - } |
|
| 2543 | - } |
|
| 2544 | - } |
|
| 2545 | - |
|
| 2546 | - return $query; |
|
| 2497 | + // quelques remplacements |
|
| 2498 | + $num = '(\s*\([0-9]*\))?'; |
|
| 2499 | + $enum = '(\s*\([^\)]*\))?'; |
|
| 2500 | + |
|
| 2501 | + $remplace = [ |
|
| 2502 | + '/enum' . $enum . '/is' => 'VARCHAR(255)', |
|
| 2503 | + '/COLLATE \w+_bin/is' => 'COLLATE BINARY', |
|
| 2504 | + '/COLLATE \w+_ci/is' => 'COLLATE NOCASE', |
|
| 2505 | + '/auto_increment/is' => '', |
|
| 2506 | + '/current_timestamp\(\)/is' => 'CURRENT_TIMESTAMP', // Fix export depuis mariaDB #4374 |
|
| 2507 | + '/(timestamp .* )ON .*$/is' => '\\1', |
|
| 2508 | + '/character set \w+/is' => '', |
|
| 2509 | + '/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED', |
|
| 2510 | + '/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''", |
|
| 2511 | + '/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''", |
|
| 2512 | + '/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'", |
|
| 2513 | + '/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'", |
|
| 2514 | + ]; |
|
| 2515 | + |
|
| 2516 | + // pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY |
|
| 2517 | + $remplace_autocinc = [ |
|
| 2518 | + '/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER' |
|
| 2519 | + ]; |
|
| 2520 | + // pour les int non autoincrement, il faut un DEFAULT |
|
| 2521 | + $remplace_nonautocinc = [ |
|
| 2522 | + '/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0", |
|
| 2523 | + ]; |
|
| 2524 | + |
|
| 2525 | + if (is_string($query)) { |
|
| 2526 | + $query = preg_replace(array_keys($remplace), $remplace, $query); |
|
| 2527 | + if ($autoinc or preg_match(',AUTO_INCREMENT,is', $query)) { |
|
| 2528 | + $query = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query); |
|
| 2529 | + } else { |
|
| 2530 | + $query = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query); |
|
| 2531 | + $query = _sqlite_collate_ci($query); |
|
| 2532 | + } |
|
| 2533 | + } elseif (is_array($query)) { |
|
| 2534 | + foreach ($query as $k => $q) { |
|
| 2535 | + $ai = ($autoinc ? $k == $autoinc : preg_match(',AUTO_INCREMENT,is', $q)); |
|
| 2536 | + $query[$k] = preg_replace(array_keys($remplace), $remplace, $query[$k]); |
|
| 2537 | + if ($ai) { |
|
| 2538 | + $query[$k] = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query[$k]); |
|
| 2539 | + } else { |
|
| 2540 | + $query[$k] = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query[$k]); |
|
| 2541 | + $query[$k] = _sqlite_collate_ci($query[$k]); |
|
| 2542 | + } |
|
| 2543 | + } |
|
| 2544 | + } |
|
| 2545 | + |
|
| 2546 | + return $query; |
|
| 2547 | 2547 | } |
| 2548 | 2548 | |
| 2549 | 2549 | /** |
@@ -2554,17 +2554,17 @@ discard block |
||
| 2554 | 2554 | * @return string |
| 2555 | 2555 | */ |
| 2556 | 2556 | function _sqlite_collate_ci($champ) { |
| 2557 | - if (stripos($champ, 'COLLATE') !== false) { |
|
| 2558 | - return $champ; |
|
| 2559 | - } |
|
| 2560 | - if (stripos($champ, 'BINARY') !== false) { |
|
| 2561 | - return str_ireplace('BINARY', 'COLLATE BINARY', $champ); |
|
| 2562 | - } |
|
| 2563 | - if (preg_match(',^(char|varchar|(long|small|medium|tiny)?text),i', $champ)) { |
|
| 2564 | - return $champ . ' COLLATE NOCASE'; |
|
| 2565 | - } |
|
| 2557 | + if (stripos($champ, 'COLLATE') !== false) { |
|
| 2558 | + return $champ; |
|
| 2559 | + } |
|
| 2560 | + if (stripos($champ, 'BINARY') !== false) { |
|
| 2561 | + return str_ireplace('BINARY', 'COLLATE BINARY', $champ); |
|
| 2562 | + } |
|
| 2563 | + if (preg_match(',^(char|varchar|(long|small|medium|tiny)?text),i', $champ)) { |
|
| 2564 | + return $champ . ' COLLATE NOCASE'; |
|
| 2565 | + } |
|
| 2566 | 2566 | |
| 2567 | - return $champ; |
|
| 2567 | + return $champ; |
|
| 2568 | 2568 | } |
| 2569 | 2569 | |
| 2570 | 2570 | |
@@ -2583,84 +2583,84 @@ discard block |
||
| 2583 | 2583 | * @return bool|string |
| 2584 | 2584 | */ |
| 2585 | 2585 | function _sqlite_requete_create( |
| 2586 | - $nom, |
|
| 2587 | - $champs, |
|
| 2588 | - $cles, |
|
| 2589 | - $autoinc = false, |
|
| 2590 | - $temporary = false, |
|
| 2591 | - $_ifnotexists = true, |
|
| 2592 | - $serveur = '', |
|
| 2593 | - $requeter = true |
|
| 2586 | + $nom, |
|
| 2587 | + $champs, |
|
| 2588 | + $cles, |
|
| 2589 | + $autoinc = false, |
|
| 2590 | + $temporary = false, |
|
| 2591 | + $_ifnotexists = true, |
|
| 2592 | + $serveur = '', |
|
| 2593 | + $requeter = true |
|
| 2594 | 2594 | ) { |
| 2595 | - $query = $keys = $s = $p = ''; |
|
| 2596 | - |
|
| 2597 | - // certains plugins declarent les tables (permet leur inclusion dans le dump) |
|
| 2598 | - // sans les renseigner (laisse le compilo recuperer la description) |
|
| 2599 | - if (!is_array($champs) || !is_array($cles)) { |
|
| 2600 | - return; |
|
| 2601 | - } |
|
| 2602 | - |
|
| 2603 | - // sqlite ne gere pas KEY tout court dans une requete CREATE TABLE |
|
| 2604 | - // il faut passer par des create index |
|
| 2605 | - // Il gere par contre primary key ! |
|
| 2606 | - // Soit la PK est definie dans les cles, soit dans un champs |
|
| 2607 | - // soit faussement dans les 2 (et dans ce cas, il faut l’enlever à un des 2 endroits !) |
|
| 2608 | - $pk = 'PRIMARY KEY'; |
|
| 2609 | - // le champ de cle primaire |
|
| 2610 | - $champ_pk = !empty($cles[$pk]) ? $cles[$pk] : ''; |
|
| 2611 | - |
|
| 2612 | - foreach ($champs as $k => $v) { |
|
| 2613 | - if (false !== stripos($v, $pk)) { |
|
| 2614 | - $champ_pk = $k; |
|
| 2615 | - // on n'en a plus besoin dans field, vu que defini dans key |
|
| 2616 | - $champs[$k] = preg_replace("/$pk/is", '', $champs[$k]); |
|
| 2617 | - break; |
|
| 2618 | - } |
|
| 2619 | - } |
|
| 2620 | - |
|
| 2621 | - if ($champ_pk) { |
|
| 2622 | - $keys = "\n\t\t$pk ($champ_pk)"; |
|
| 2623 | - } |
|
| 2624 | - // Pas de DEFAULT 0 sur les cles primaires en auto-increment |
|
| 2625 | - if ( |
|
| 2626 | - isset($champs[$champ_pk]) |
|
| 2627 | - and stripos($champs[$champ_pk], 'default 0') !== false |
|
| 2628 | - ) { |
|
| 2629 | - $champs[$champ_pk] = trim(str_ireplace('default 0', '', $champs[$champ_pk])); |
|
| 2630 | - } |
|
| 2631 | - |
|
| 2632 | - $champs = _sqlite_remplacements_definitions_table($champs, $autoinc ? $champ_pk : false); |
|
| 2633 | - foreach ($champs as $k => $v) { |
|
| 2634 | - $query .= "$s\n\t\t$k $v"; |
|
| 2635 | - $s = ','; |
|
| 2636 | - } |
|
| 2637 | - |
|
| 2638 | - $ifnotexists = ''; |
|
| 2639 | - if ($_ifnotexists) { |
|
| 2640 | - $version = spip_sqlite_fetch( |
|
| 2641 | - spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur), |
|
| 2642 | - '', |
|
| 2643 | - $serveur |
|
| 2644 | - ); |
|
| 2645 | - if (!function_exists('spip_version_compare')) { |
|
| 2646 | - include_spip('plugins/installer'); |
|
| 2647 | - } |
|
| 2648 | - |
|
| 2649 | - if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) { |
|
| 2650 | - $ifnotexists = ' IF NOT EXISTS'; |
|
| 2651 | - } else { |
|
| 2652 | - /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */ |
|
| 2653 | - $a = spip_sqlite_showtable($nom, $serveur); |
|
| 2654 | - if (isset($a['key']['KEY ' . $nom])) { |
|
| 2655 | - return true; |
|
| 2656 | - } |
|
| 2657 | - } |
|
| 2658 | - } |
|
| 2659 | - |
|
| 2660 | - $temporary = $temporary ? ' TEMPORARY' : ''; |
|
| 2661 | - $q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n"; |
|
| 2662 | - |
|
| 2663 | - return $q; |
|
| 2595 | + $query = $keys = $s = $p = ''; |
|
| 2596 | + |
|
| 2597 | + // certains plugins declarent les tables (permet leur inclusion dans le dump) |
|
| 2598 | + // sans les renseigner (laisse le compilo recuperer la description) |
|
| 2599 | + if (!is_array($champs) || !is_array($cles)) { |
|
| 2600 | + return; |
|
| 2601 | + } |
|
| 2602 | + |
|
| 2603 | + // sqlite ne gere pas KEY tout court dans une requete CREATE TABLE |
|
| 2604 | + // il faut passer par des create index |
|
| 2605 | + // Il gere par contre primary key ! |
|
| 2606 | + // Soit la PK est definie dans les cles, soit dans un champs |
|
| 2607 | + // soit faussement dans les 2 (et dans ce cas, il faut l’enlever à un des 2 endroits !) |
|
| 2608 | + $pk = 'PRIMARY KEY'; |
|
| 2609 | + // le champ de cle primaire |
|
| 2610 | + $champ_pk = !empty($cles[$pk]) ? $cles[$pk] : ''; |
|
| 2611 | + |
|
| 2612 | + foreach ($champs as $k => $v) { |
|
| 2613 | + if (false !== stripos($v, $pk)) { |
|
| 2614 | + $champ_pk = $k; |
|
| 2615 | + // on n'en a plus besoin dans field, vu que defini dans key |
|
| 2616 | + $champs[$k] = preg_replace("/$pk/is", '', $champs[$k]); |
|
| 2617 | + break; |
|
| 2618 | + } |
|
| 2619 | + } |
|
| 2620 | + |
|
| 2621 | + if ($champ_pk) { |
|
| 2622 | + $keys = "\n\t\t$pk ($champ_pk)"; |
|
| 2623 | + } |
|
| 2624 | + // Pas de DEFAULT 0 sur les cles primaires en auto-increment |
|
| 2625 | + if ( |
|
| 2626 | + isset($champs[$champ_pk]) |
|
| 2627 | + and stripos($champs[$champ_pk], 'default 0') !== false |
|
| 2628 | + ) { |
|
| 2629 | + $champs[$champ_pk] = trim(str_ireplace('default 0', '', $champs[$champ_pk])); |
|
| 2630 | + } |
|
| 2631 | + |
|
| 2632 | + $champs = _sqlite_remplacements_definitions_table($champs, $autoinc ? $champ_pk : false); |
|
| 2633 | + foreach ($champs as $k => $v) { |
|
| 2634 | + $query .= "$s\n\t\t$k $v"; |
|
| 2635 | + $s = ','; |
|
| 2636 | + } |
|
| 2637 | + |
|
| 2638 | + $ifnotexists = ''; |
|
| 2639 | + if ($_ifnotexists) { |
|
| 2640 | + $version = spip_sqlite_fetch( |
|
| 2641 | + spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur), |
|
| 2642 | + '', |
|
| 2643 | + $serveur |
|
| 2644 | + ); |
|
| 2645 | + if (!function_exists('spip_version_compare')) { |
|
| 2646 | + include_spip('plugins/installer'); |
|
| 2647 | + } |
|
| 2648 | + |
|
| 2649 | + if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) { |
|
| 2650 | + $ifnotexists = ' IF NOT EXISTS'; |
|
| 2651 | + } else { |
|
| 2652 | + /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */ |
|
| 2653 | + $a = spip_sqlite_showtable($nom, $serveur); |
|
| 2654 | + if (isset($a['key']['KEY ' . $nom])) { |
|
| 2655 | + return true; |
|
| 2656 | + } |
|
| 2657 | + } |
|
| 2658 | + } |
|
| 2659 | + |
|
| 2660 | + $temporary = $temporary ? ' TEMPORARY' : ''; |
|
| 2661 | + $q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n"; |
|
| 2662 | + |
|
| 2663 | + return $q; |
|
| 2664 | 2664 | } |
| 2665 | 2665 | |
| 2666 | 2666 | |
@@ -2679,41 +2679,41 @@ discard block |
||
| 2679 | 2679 | * @return |
| 2680 | 2680 | */ |
| 2681 | 2681 | function _sqlite_ajouter_champs_timestamp($table, $couples, $desc = '', $serveur = '') { |
| 2682 | - static $tables = []; |
|
| 2683 | - |
|
| 2684 | - if (!isset($tables[$table])) { |
|
| 2685 | - if (!$desc) { |
|
| 2686 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 2687 | - $desc = $trouver_table($table, $serveur); |
|
| 2688 | - // si pas de description, on ne fait rien, ou on die() ? |
|
| 2689 | - if (!$desc) { |
|
| 2690 | - return $couples; |
|
| 2691 | - } |
|
| 2692 | - } |
|
| 2693 | - |
|
| 2694 | - // recherche des champs avec simplement 'TIMESTAMP' |
|
| 2695 | - // cependant, il faudra peut etre etendre |
|
| 2696 | - // avec la gestion de DEFAULT et ON UPDATE |
|
| 2697 | - // mais ceux-ci ne sont pas utilises dans le core |
|
| 2698 | - $tables[$table] = ['valeur' => [], 'cite' => [], 'desc' => []]; |
|
| 2699 | - |
|
| 2700 | - $now = _sqlite_func_now(true); |
|
| 2701 | - foreach ($desc['field'] as $k => $v) { |
|
| 2702 | - if (strpos(strtolower(ltrim($v)), 'timestamp') === 0) { |
|
| 2703 | - $tables[$table]['desc'][$k] = $v; |
|
| 2704 | - $tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]); |
|
| 2705 | - } |
|
| 2706 | - } |
|
| 2707 | - } |
|
| 2708 | - else { |
|
| 2709 | - $now = _sqlite_func_now(true); |
|
| 2710 | - foreach (array_keys($tables[$table]['desc']) as $k) { |
|
| 2711 | - $tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]); |
|
| 2712 | - } |
|
| 2713 | - } |
|
| 2714 | - |
|
| 2715 | - // ajout des champs type 'timestamp' absents |
|
| 2716 | - return array_merge($tables[$table]['valeur'], $couples); |
|
| 2682 | + static $tables = []; |
|
| 2683 | + |
|
| 2684 | + if (!isset($tables[$table])) { |
|
| 2685 | + if (!$desc) { |
|
| 2686 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 2687 | + $desc = $trouver_table($table, $serveur); |
|
| 2688 | + // si pas de description, on ne fait rien, ou on die() ? |
|
| 2689 | + if (!$desc) { |
|
| 2690 | + return $couples; |
|
| 2691 | + } |
|
| 2692 | + } |
|
| 2693 | + |
|
| 2694 | + // recherche des champs avec simplement 'TIMESTAMP' |
|
| 2695 | + // cependant, il faudra peut etre etendre |
|
| 2696 | + // avec la gestion de DEFAULT et ON UPDATE |
|
| 2697 | + // mais ceux-ci ne sont pas utilises dans le core |
|
| 2698 | + $tables[$table] = ['valeur' => [], 'cite' => [], 'desc' => []]; |
|
| 2699 | + |
|
| 2700 | + $now = _sqlite_func_now(true); |
|
| 2701 | + foreach ($desc['field'] as $k => $v) { |
|
| 2702 | + if (strpos(strtolower(ltrim($v)), 'timestamp') === 0) { |
|
| 2703 | + $tables[$table]['desc'][$k] = $v; |
|
| 2704 | + $tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]); |
|
| 2705 | + } |
|
| 2706 | + } |
|
| 2707 | + } |
|
| 2708 | + else { |
|
| 2709 | + $now = _sqlite_func_now(true); |
|
| 2710 | + foreach (array_keys($tables[$table]['desc']) as $k) { |
|
| 2711 | + $tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]); |
|
| 2712 | + } |
|
| 2713 | + } |
|
| 2714 | + |
|
| 2715 | + // ajout des champs type 'timestamp' absents |
|
| 2716 | + return array_merge($tables[$table]['valeur'], $couples); |
|
| 2717 | 2717 | } |
| 2718 | 2718 | |
| 2719 | 2719 | |
@@ -2724,7 +2724,7 @@ discard block |
||
| 2724 | 2724 | * @return array|bool |
| 2725 | 2725 | */ |
| 2726 | 2726 | function spip_versions_sqlite() { |
| 2727 | - return _sqlite_charger_version(); |
|
| 2727 | + return _sqlite_charger_version(); |
|
| 2728 | 2728 | } |
| 2729 | 2729 | |
| 2730 | 2730 | /** |
@@ -2732,114 +2732,114 @@ discard block |
||
| 2732 | 2732 | * encadrées de transactions. |
| 2733 | 2733 | **/ |
| 2734 | 2734 | class spip_sqlite { |
| 2735 | - /** @var sqlite_requeteur[] Liste des instances de requêteurs créés */ |
|
| 2736 | - public static $requeteurs = []; |
|
| 2737 | - /** @var bool[] Pour chaque connexion, flag pour savoir si une transaction est en cours */ |
|
| 2738 | - public static $transaction_en_cours = []; |
|
| 2739 | - |
|
| 2740 | - |
|
| 2741 | - /** |
|
| 2742 | - * Retourne une unique instance du requêteur |
|
| 2743 | - * |
|
| 2744 | - * Retourne une instance unique du requêteur pour une connexion SQLite |
|
| 2745 | - * donnée |
|
| 2746 | - * |
|
| 2747 | - * @param string $serveur |
|
| 2748 | - * Nom du connecteur |
|
| 2749 | - * @return sqlite_requeteur |
|
| 2750 | - * Instance unique du requêteur |
|
| 2751 | - **/ |
|
| 2752 | - public static function requeteur($serveur) { |
|
| 2753 | - if (!isset(spip_sqlite::$requeteurs[$serveur])) { |
|
| 2754 | - spip_sqlite::$requeteurs[$serveur] = new sqlite_requeteur($serveur); |
|
| 2755 | - } |
|
| 2756 | - |
|
| 2757 | - return spip_sqlite::$requeteurs[$serveur]; |
|
| 2758 | - } |
|
| 2759 | - |
|
| 2760 | - /** |
|
| 2761 | - * Prépare le texte d'une requête avant son exécution |
|
| 2762 | - * |
|
| 2763 | - * Adapte la requête au format plus ou moins MySQL par un format |
|
| 2764 | - * compris de SQLite. |
|
| 2765 | - * |
|
| 2766 | - * Change les préfixes de tables SPIP par ceux véritables |
|
| 2767 | - * |
|
| 2768 | - * @param string $query Requête à préparer |
|
| 2769 | - * @param string $serveur Nom de la connexion |
|
| 2770 | - * @return string Requête préparée |
|
| 2771 | - */ |
|
| 2772 | - public static function traduire_requete($query, $serveur) { |
|
| 2773 | - $requeteur = spip_sqlite::requeteur($serveur); |
|
| 2774 | - $traducteur = new sqlite_traducteur($query, $requeteur->prefixe, $requeteur->sqlite_version); |
|
| 2775 | - |
|
| 2776 | - return $traducteur->traduire_requete(); |
|
| 2777 | - } |
|
| 2778 | - |
|
| 2779 | - /** |
|
| 2780 | - * Démarre une transaction |
|
| 2781 | - * |
|
| 2782 | - * @param string $serveur Nom de la connexion |
|
| 2783 | - **/ |
|
| 2784 | - public static function demarrer_transaction($serveur) { |
|
| 2785 | - spip_sqlite::executer_requete('BEGIN TRANSACTION', $serveur); |
|
| 2786 | - spip_sqlite::$transaction_en_cours[$serveur] = true; |
|
| 2787 | - } |
|
| 2788 | - |
|
| 2789 | - /** |
|
| 2790 | - * Exécute la requête donnée |
|
| 2791 | - * |
|
| 2792 | - * @param string $query Requête |
|
| 2793 | - * @param string $serveur Nom de la connexion |
|
| 2794 | - * @param null|bool $tracer Demander des statistiques (temps) ? |
|
| 2795 | - **/ |
|
| 2796 | - public static function executer_requete($query, $serveur, $tracer = null) { |
|
| 2797 | - $requeteur = spip_sqlite::requeteur($serveur); |
|
| 2798 | - |
|
| 2799 | - return $requeteur->executer_requete($query, $tracer); |
|
| 2800 | - } |
|
| 2801 | - |
|
| 2802 | - /** |
|
| 2803 | - * Obtient l'identifiant de la dernière ligne insérée ou modifiée |
|
| 2804 | - * |
|
| 2805 | - * @param string $serveur Nom de la connexion |
|
| 2806 | - * return int Identifiant |
|
| 2807 | - **/ |
|
| 2808 | - public static function last_insert_id($serveur) { |
|
| 2809 | - $requeteur = spip_sqlite::requeteur($serveur); |
|
| 2810 | - |
|
| 2811 | - return $requeteur->last_insert_id($serveur); |
|
| 2812 | - } |
|
| 2813 | - |
|
| 2814 | - /** |
|
| 2815 | - * Annule une transaction |
|
| 2816 | - * |
|
| 2817 | - * @param string $serveur Nom de la connexion |
|
| 2818 | - **/ |
|
| 2819 | - public static function annuler_transaction($serveur) { |
|
| 2820 | - spip_sqlite::executer_requete('ROLLBACK', $serveur); |
|
| 2821 | - spip_sqlite::$transaction_en_cours[$serveur] = false; |
|
| 2822 | - } |
|
| 2823 | - |
|
| 2824 | - /** |
|
| 2825 | - * Termine une transaction |
|
| 2826 | - * |
|
| 2827 | - * @param string $serveur Nom de la connexion |
|
| 2828 | - **/ |
|
| 2829 | - public static function finir_transaction($serveur) { |
|
| 2830 | - // si pas de transaction en cours, ne rien faire et le dire |
|
| 2831 | - if ( |
|
| 2832 | - !isset(spip_sqlite::$transaction_en_cours[$serveur]) |
|
| 2833 | - or spip_sqlite::$transaction_en_cours[$serveur] == false |
|
| 2834 | - ) { |
|
| 2835 | - return false; |
|
| 2836 | - } |
|
| 2837 | - // sinon fermer la transaction et retourner true |
|
| 2838 | - spip_sqlite::executer_requete('COMMIT', $serveur); |
|
| 2839 | - spip_sqlite::$transaction_en_cours[$serveur] = false; |
|
| 2840 | - |
|
| 2841 | - return true; |
|
| 2842 | - } |
|
| 2735 | + /** @var sqlite_requeteur[] Liste des instances de requêteurs créés */ |
|
| 2736 | + public static $requeteurs = []; |
|
| 2737 | + /** @var bool[] Pour chaque connexion, flag pour savoir si une transaction est en cours */ |
|
| 2738 | + public static $transaction_en_cours = []; |
|
| 2739 | + |
|
| 2740 | + |
|
| 2741 | + /** |
|
| 2742 | + * Retourne une unique instance du requêteur |
|
| 2743 | + * |
|
| 2744 | + * Retourne une instance unique du requêteur pour une connexion SQLite |
|
| 2745 | + * donnée |
|
| 2746 | + * |
|
| 2747 | + * @param string $serveur |
|
| 2748 | + * Nom du connecteur |
|
| 2749 | + * @return sqlite_requeteur |
|
| 2750 | + * Instance unique du requêteur |
|
| 2751 | + **/ |
|
| 2752 | + public static function requeteur($serveur) { |
|
| 2753 | + if (!isset(spip_sqlite::$requeteurs[$serveur])) { |
|
| 2754 | + spip_sqlite::$requeteurs[$serveur] = new sqlite_requeteur($serveur); |
|
| 2755 | + } |
|
| 2756 | + |
|
| 2757 | + return spip_sqlite::$requeteurs[$serveur]; |
|
| 2758 | + } |
|
| 2759 | + |
|
| 2760 | + /** |
|
| 2761 | + * Prépare le texte d'une requête avant son exécution |
|
| 2762 | + * |
|
| 2763 | + * Adapte la requête au format plus ou moins MySQL par un format |
|
| 2764 | + * compris de SQLite. |
|
| 2765 | + * |
|
| 2766 | + * Change les préfixes de tables SPIP par ceux véritables |
|
| 2767 | + * |
|
| 2768 | + * @param string $query Requête à préparer |
|
| 2769 | + * @param string $serveur Nom de la connexion |
|
| 2770 | + * @return string Requête préparée |
|
| 2771 | + */ |
|
| 2772 | + public static function traduire_requete($query, $serveur) { |
|
| 2773 | + $requeteur = spip_sqlite::requeteur($serveur); |
|
| 2774 | + $traducteur = new sqlite_traducteur($query, $requeteur->prefixe, $requeteur->sqlite_version); |
|
| 2775 | + |
|
| 2776 | + return $traducteur->traduire_requete(); |
|
| 2777 | + } |
|
| 2778 | + |
|
| 2779 | + /** |
|
| 2780 | + * Démarre une transaction |
|
| 2781 | + * |
|
| 2782 | + * @param string $serveur Nom de la connexion |
|
| 2783 | + **/ |
|
| 2784 | + public static function demarrer_transaction($serveur) { |
|
| 2785 | + spip_sqlite::executer_requete('BEGIN TRANSACTION', $serveur); |
|
| 2786 | + spip_sqlite::$transaction_en_cours[$serveur] = true; |
|
| 2787 | + } |
|
| 2788 | + |
|
| 2789 | + /** |
|
| 2790 | + * Exécute la requête donnée |
|
| 2791 | + * |
|
| 2792 | + * @param string $query Requête |
|
| 2793 | + * @param string $serveur Nom de la connexion |
|
| 2794 | + * @param null|bool $tracer Demander des statistiques (temps) ? |
|
| 2795 | + **/ |
|
| 2796 | + public static function executer_requete($query, $serveur, $tracer = null) { |
|
| 2797 | + $requeteur = spip_sqlite::requeteur($serveur); |
|
| 2798 | + |
|
| 2799 | + return $requeteur->executer_requete($query, $tracer); |
|
| 2800 | + } |
|
| 2801 | + |
|
| 2802 | + /** |
|
| 2803 | + * Obtient l'identifiant de la dernière ligne insérée ou modifiée |
|
| 2804 | + * |
|
| 2805 | + * @param string $serveur Nom de la connexion |
|
| 2806 | + * return int Identifiant |
|
| 2807 | + **/ |
|
| 2808 | + public static function last_insert_id($serveur) { |
|
| 2809 | + $requeteur = spip_sqlite::requeteur($serveur); |
|
| 2810 | + |
|
| 2811 | + return $requeteur->last_insert_id($serveur); |
|
| 2812 | + } |
|
| 2813 | + |
|
| 2814 | + /** |
|
| 2815 | + * Annule une transaction |
|
| 2816 | + * |
|
| 2817 | + * @param string $serveur Nom de la connexion |
|
| 2818 | + **/ |
|
| 2819 | + public static function annuler_transaction($serveur) { |
|
| 2820 | + spip_sqlite::executer_requete('ROLLBACK', $serveur); |
|
| 2821 | + spip_sqlite::$transaction_en_cours[$serveur] = false; |
|
| 2822 | + } |
|
| 2823 | + |
|
| 2824 | + /** |
|
| 2825 | + * Termine une transaction |
|
| 2826 | + * |
|
| 2827 | + * @param string $serveur Nom de la connexion |
|
| 2828 | + **/ |
|
| 2829 | + public static function finir_transaction($serveur) { |
|
| 2830 | + // si pas de transaction en cours, ne rien faire et le dire |
|
| 2831 | + if ( |
|
| 2832 | + !isset(spip_sqlite::$transaction_en_cours[$serveur]) |
|
| 2833 | + or spip_sqlite::$transaction_en_cours[$serveur] == false |
|
| 2834 | + ) { |
|
| 2835 | + return false; |
|
| 2836 | + } |
|
| 2837 | + // sinon fermer la transaction et retourner true |
|
| 2838 | + spip_sqlite::executer_requete('COMMIT', $serveur); |
|
| 2839 | + spip_sqlite::$transaction_en_cours[$serveur] = false; |
|
| 2840 | + |
|
| 2841 | + return true; |
|
| 2842 | + } |
|
| 2843 | 2843 | } |
| 2844 | 2844 | |
| 2845 | 2845 | /* |
@@ -2852,127 +2852,127 @@ discard block |
||
| 2852 | 2852 | */ |
| 2853 | 2853 | |
| 2854 | 2854 | class sqlite_requeteur { |
| 2855 | - /** @var string Texte de la requête */ |
|
| 2856 | - public $query = ''; // la requete |
|
| 2857 | - /** @var string Nom de la connexion */ |
|
| 2858 | - public $serveur = ''; |
|
| 2859 | - /** @var PDO Identifiant de la connexion SQLite */ |
|
| 2860 | - public $link = ''; |
|
| 2861 | - /** @var string Prefixe des tables SPIP */ |
|
| 2862 | - public $prefixe = ''; |
|
| 2863 | - /** @var string Nom de la base de donnée */ |
|
| 2864 | - public $db = ''; |
|
| 2865 | - /** @var bool Doit-on tracer les requetes (var_profile) ? */ |
|
| 2866 | - public $tracer = false; // doit-on tracer les requetes (var_profile) |
|
| 2867 | - |
|
| 2868 | - /** @var string Version de SQLite (2 ou 3) */ |
|
| 2869 | - public $sqlite_version = ''; |
|
| 2870 | - |
|
| 2871 | - /** |
|
| 2872 | - * Constructeur |
|
| 2873 | - * |
|
| 2874 | - * @param string $serveur |
|
| 2875 | - * @return bool |
|
| 2876 | - */ |
|
| 2877 | - public function __construct($serveur = '') { |
|
| 2878 | - _sqlite_init(); |
|
| 2879 | - $this->serveur = strtolower($serveur); |
|
| 2880 | - |
|
| 2881 | - if (!($this->link = _sqlite_link($this->serveur)) && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)) { |
|
| 2882 | - spip_log('Aucune connexion sqlite (link)', 'sqlite.' . _LOG_ERREUR); |
|
| 2883 | - |
|
| 2884 | - return false; |
|
| 2885 | - } |
|
| 2886 | - |
|
| 2887 | - $this->sqlite_version = _sqlite_is_version('', $this->link); |
|
| 2888 | - |
|
| 2889 | - $this->prefixe = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['prefixe']; |
|
| 2890 | - $this->db = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['db']; |
|
| 2891 | - |
|
| 2892 | - // tracage des requetes ? |
|
| 2893 | - $this->tracer = (isset($_GET['var_profile']) && $_GET['var_profile']); |
|
| 2894 | - } |
|
| 2895 | - |
|
| 2896 | - /** |
|
| 2897 | - * Lancer la requête transmise et faire le tracage si demandé |
|
| 2898 | - * |
|
| 2899 | - * @param string $query |
|
| 2900 | - * Requête à exécuter |
|
| 2901 | - * @param bool|null $tracer |
|
| 2902 | - * true pour tracer la requête |
|
| 2903 | - * @return bool|PDOStatement|array |
|
| 2904 | - */ |
|
| 2905 | - public function executer_requete($query, $tracer = null) { |
|
| 2906 | - if (is_null($tracer)) { |
|
| 2907 | - $tracer = $this->tracer; |
|
| 2908 | - } |
|
| 2909 | - $err = ''; |
|
| 2910 | - $t = 0; |
|
| 2911 | - if ($tracer or (defined('_DEBUG_TRACE_QUERIES') and _DEBUG_TRACE_QUERIES)) { |
|
| 2912 | - include_spip('public/tracer'); |
|
| 2913 | - $t = trace_query_start(); |
|
| 2914 | - } |
|
| 2915 | - |
|
| 2916 | - # spip_log("requete: $this->serveur >> $query",'sqlite.'._LOG_DEBUG); // boum ? pourquoi ? |
|
| 2917 | - if ($this->link) { |
|
| 2918 | - // memoriser la derniere erreur PHP vue |
|
| 2919 | - $last_error = (function_exists('error_get_last') ? error_get_last() : ''); |
|
| 2920 | - $e = null; |
|
| 2921 | - // sauver la derniere requete |
|
| 2922 | - $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['last'] = $query; |
|
| 2923 | - $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['total_requetes']++; |
|
| 2924 | - |
|
| 2925 | - try { |
|
| 2926 | - $r = $this->link->query($query); |
|
| 2927 | - } catch (\PDOException $e) { |
|
| 2928 | - spip_log('PDOException: ' . $e->getMessage(), 'sqlite.' . _LOG_DEBUG); |
|
| 2929 | - $r = false; |
|
| 2930 | - } |
|
| 2931 | - // sauvegarde de la requete (elle y est deja dans $r->queryString) |
|
| 2932 | - # $r->spipQueryString = $query; |
|
| 2933 | - |
|
| 2934 | - // comptage : oblige de compter le nombre d'entrees retournees |
|
| 2935 | - // par une requete SELECT |
|
| 2936 | - // aucune autre solution ne donne le nombre attendu :( ! |
|
| 2937 | - // particulierement s'il y a des LIMIT dans la requete. |
|
| 2938 | - if (strtoupper(substr(ltrim($query), 0, 6)) == 'SELECT') { |
|
| 2939 | - if ($r) { |
|
| 2940 | - // noter le link et la query pour faire le comptage *si* on en a besoin |
|
| 2941 | - $r->spipSqliteRowCount = [$this->link, $query]; |
|
| 2942 | - } elseif ($r instanceof PDOStatement) { |
|
| 2943 | - $r->spipSqliteRowCount = 0; |
|
| 2944 | - } |
|
| 2945 | - } |
|
| 2946 | - |
|
| 2947 | - // loger les warnings/erreurs eventuels de sqlite remontant dans PHP |
|
| 2948 | - if ($e and $e instanceof \PDOException) { |
|
| 2949 | - $err = strip_tags($e->getMessage()) . ' in ' . $e->getFile() . ' line ' . $e->getLine(); |
|
| 2950 | - spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR); |
|
| 2951 | - } elseif ($err = (function_exists('error_get_last') ? error_get_last() : '') and $err != $last_error) { |
|
| 2952 | - $err = strip_tags($err['message']) . ' in ' . $err['file'] . ' line ' . $err['line']; |
|
| 2953 | - spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR); |
|
| 2954 | - } else { |
|
| 2955 | - $err = ''; |
|
| 2956 | - } |
|
| 2957 | - } else { |
|
| 2958 | - $r = false; |
|
| 2959 | - } |
|
| 2960 | - |
|
| 2961 | - if (spip_sqlite_errno($this->serveur)) { |
|
| 2962 | - $err .= spip_sqlite_error($query, $this->serveur); |
|
| 2963 | - } |
|
| 2964 | - |
|
| 2965 | - return $t ? trace_query_end($query, $t, $r, $err, $this->serveur) : $r; |
|
| 2966 | - } |
|
| 2967 | - |
|
| 2968 | - /** |
|
| 2969 | - * Obtient l'identifiant de la dernière ligne insérée ou modifiée |
|
| 2970 | - * |
|
| 2971 | - * @return string|false |
|
| 2972 | - **/ |
|
| 2973 | - public function last_insert_id() { |
|
| 2974 | - return $this->link->lastInsertId(); |
|
| 2975 | - } |
|
| 2855 | + /** @var string Texte de la requête */ |
|
| 2856 | + public $query = ''; // la requete |
|
| 2857 | + /** @var string Nom de la connexion */ |
|
| 2858 | + public $serveur = ''; |
|
| 2859 | + /** @var PDO Identifiant de la connexion SQLite */ |
|
| 2860 | + public $link = ''; |
|
| 2861 | + /** @var string Prefixe des tables SPIP */ |
|
| 2862 | + public $prefixe = ''; |
|
| 2863 | + /** @var string Nom de la base de donnée */ |
|
| 2864 | + public $db = ''; |
|
| 2865 | + /** @var bool Doit-on tracer les requetes (var_profile) ? */ |
|
| 2866 | + public $tracer = false; // doit-on tracer les requetes (var_profile) |
|
| 2867 | + |
|
| 2868 | + /** @var string Version de SQLite (2 ou 3) */ |
|
| 2869 | + public $sqlite_version = ''; |
|
| 2870 | + |
|
| 2871 | + /** |
|
| 2872 | + * Constructeur |
|
| 2873 | + * |
|
| 2874 | + * @param string $serveur |
|
| 2875 | + * @return bool |
|
| 2876 | + */ |
|
| 2877 | + public function __construct($serveur = '') { |
|
| 2878 | + _sqlite_init(); |
|
| 2879 | + $this->serveur = strtolower($serveur); |
|
| 2880 | + |
|
| 2881 | + if (!($this->link = _sqlite_link($this->serveur)) && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)) { |
|
| 2882 | + spip_log('Aucune connexion sqlite (link)', 'sqlite.' . _LOG_ERREUR); |
|
| 2883 | + |
|
| 2884 | + return false; |
|
| 2885 | + } |
|
| 2886 | + |
|
| 2887 | + $this->sqlite_version = _sqlite_is_version('', $this->link); |
|
| 2888 | + |
|
| 2889 | + $this->prefixe = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['prefixe']; |
|
| 2890 | + $this->db = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['db']; |
|
| 2891 | + |
|
| 2892 | + // tracage des requetes ? |
|
| 2893 | + $this->tracer = (isset($_GET['var_profile']) && $_GET['var_profile']); |
|
| 2894 | + } |
|
| 2895 | + |
|
| 2896 | + /** |
|
| 2897 | + * Lancer la requête transmise et faire le tracage si demandé |
|
| 2898 | + * |
|
| 2899 | + * @param string $query |
|
| 2900 | + * Requête à exécuter |
|
| 2901 | + * @param bool|null $tracer |
|
| 2902 | + * true pour tracer la requête |
|
| 2903 | + * @return bool|PDOStatement|array |
|
| 2904 | + */ |
|
| 2905 | + public function executer_requete($query, $tracer = null) { |
|
| 2906 | + if (is_null($tracer)) { |
|
| 2907 | + $tracer = $this->tracer; |
|
| 2908 | + } |
|
| 2909 | + $err = ''; |
|
| 2910 | + $t = 0; |
|
| 2911 | + if ($tracer or (defined('_DEBUG_TRACE_QUERIES') and _DEBUG_TRACE_QUERIES)) { |
|
| 2912 | + include_spip('public/tracer'); |
|
| 2913 | + $t = trace_query_start(); |
|
| 2914 | + } |
|
| 2915 | + |
|
| 2916 | + # spip_log("requete: $this->serveur >> $query",'sqlite.'._LOG_DEBUG); // boum ? pourquoi ? |
|
| 2917 | + if ($this->link) { |
|
| 2918 | + // memoriser la derniere erreur PHP vue |
|
| 2919 | + $last_error = (function_exists('error_get_last') ? error_get_last() : ''); |
|
| 2920 | + $e = null; |
|
| 2921 | + // sauver la derniere requete |
|
| 2922 | + $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['last'] = $query; |
|
| 2923 | + $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['total_requetes']++; |
|
| 2924 | + |
|
| 2925 | + try { |
|
| 2926 | + $r = $this->link->query($query); |
|
| 2927 | + } catch (\PDOException $e) { |
|
| 2928 | + spip_log('PDOException: ' . $e->getMessage(), 'sqlite.' . _LOG_DEBUG); |
|
| 2929 | + $r = false; |
|
| 2930 | + } |
|
| 2931 | + // sauvegarde de la requete (elle y est deja dans $r->queryString) |
|
| 2932 | + # $r->spipQueryString = $query; |
|
| 2933 | + |
|
| 2934 | + // comptage : oblige de compter le nombre d'entrees retournees |
|
| 2935 | + // par une requete SELECT |
|
| 2936 | + // aucune autre solution ne donne le nombre attendu :( ! |
|
| 2937 | + // particulierement s'il y a des LIMIT dans la requete. |
|
| 2938 | + if (strtoupper(substr(ltrim($query), 0, 6)) == 'SELECT') { |
|
| 2939 | + if ($r) { |
|
| 2940 | + // noter le link et la query pour faire le comptage *si* on en a besoin |
|
| 2941 | + $r->spipSqliteRowCount = [$this->link, $query]; |
|
| 2942 | + } elseif ($r instanceof PDOStatement) { |
|
| 2943 | + $r->spipSqliteRowCount = 0; |
|
| 2944 | + } |
|
| 2945 | + } |
|
| 2946 | + |
|
| 2947 | + // loger les warnings/erreurs eventuels de sqlite remontant dans PHP |
|
| 2948 | + if ($e and $e instanceof \PDOException) { |
|
| 2949 | + $err = strip_tags($e->getMessage()) . ' in ' . $e->getFile() . ' line ' . $e->getLine(); |
|
| 2950 | + spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR); |
|
| 2951 | + } elseif ($err = (function_exists('error_get_last') ? error_get_last() : '') and $err != $last_error) { |
|
| 2952 | + $err = strip_tags($err['message']) . ' in ' . $err['file'] . ' line ' . $err['line']; |
|
| 2953 | + spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR); |
|
| 2954 | + } else { |
|
| 2955 | + $err = ''; |
|
| 2956 | + } |
|
| 2957 | + } else { |
|
| 2958 | + $r = false; |
|
| 2959 | + } |
|
| 2960 | + |
|
| 2961 | + if (spip_sqlite_errno($this->serveur)) { |
|
| 2962 | + $err .= spip_sqlite_error($query, $this->serveur); |
|
| 2963 | + } |
|
| 2964 | + |
|
| 2965 | + return $t ? trace_query_end($query, $t, $r, $err, $this->serveur) : $r; |
|
| 2966 | + } |
|
| 2967 | + |
|
| 2968 | + /** |
|
| 2969 | + * Obtient l'identifiant de la dernière ligne insérée ou modifiée |
|
| 2970 | + * |
|
| 2971 | + * @return string|false |
|
| 2972 | + **/ |
|
| 2973 | + public function last_insert_id() { |
|
| 2974 | + return $this->link->lastInsertId(); |
|
| 2975 | + } |
|
| 2976 | 2976 | } |
| 2977 | 2977 | |
| 2978 | 2978 | |
@@ -2982,206 +2982,206 @@ discard block |
||
| 2982 | 2982 | * (fonction pour proteger les textes) |
| 2983 | 2983 | */ |
| 2984 | 2984 | class sqlite_traducteur { |
| 2985 | - /** @var string $query Texte de la requête */ |
|
| 2986 | - public $query = ''; |
|
| 2987 | - /** @var string $prefixe Préfixe des tables */ |
|
| 2988 | - public $prefixe = ''; |
|
| 2989 | - /** @var string $sqlite_version Version de sqlite (2 ou 3) */ |
|
| 2990 | - public $sqlite_version = ''; |
|
| 2991 | - |
|
| 2992 | - /** Pour les corrections à effectuer sur les requêtes : array(code=>'texte') trouvé |
|
| 2993 | - * |
|
| 2994 | - * @var array |
|
| 2995 | - */ |
|
| 2996 | - public $textes = []; |
|
| 2997 | - |
|
| 2998 | - /** |
|
| 2999 | - * Constructeur |
|
| 3000 | - * |
|
| 3001 | - * @param string $query Requête à préparer |
|
| 3002 | - * @param string $prefixe Prefixe des tables à utiliser |
|
| 3003 | - * @param string $sqlite_version Version SQLite (2 ou 3) |
|
| 3004 | - */ |
|
| 3005 | - public function __construct($query, $prefixe, $sqlite_version) { |
|
| 3006 | - $this->query = $query; |
|
| 3007 | - $this->prefixe = $prefixe; |
|
| 3008 | - $this->sqlite_version = $sqlite_version; |
|
| 3009 | - } |
|
| 3010 | - |
|
| 3011 | - /** |
|
| 3012 | - * Transformer la requete pour SQLite |
|
| 3013 | - * |
|
| 3014 | - * Enlève les textes, transforme la requête pour quelle soit |
|
| 3015 | - * bien interprétée par SQLite, puis remet les textes |
|
| 3016 | - * la fonction affecte `$this->query` |
|
| 3017 | - */ |
|
| 3018 | - public function traduire_requete() { |
|
| 3019 | - // |
|
| 3020 | - // 1) Protection des textes en les remplacant par des codes |
|
| 3021 | - // |
|
| 3022 | - // enlever les 'textes' et initialiser avec |
|
| 3023 | - list($this->query, $textes) = query_echappe_textes($this->query); |
|
| 3024 | - |
|
| 3025 | - // |
|
| 3026 | - // 2) Corrections de la requete |
|
| 3027 | - // |
|
| 3028 | - // Correction Create Database |
|
| 3029 | - // Create Database -> requete ignoree |
|
| 3030 | - if (strpos($this->query, 'CREATE DATABASE') === 0) { |
|
| 3031 | - spip_log("Sqlite : requete non executee -> $this->query", 'sqlite.' . _LOG_AVERTISSEMENT); |
|
| 3032 | - $this->query = 'SELECT 1'; |
|
| 3033 | - } |
|
| 3034 | - |
|
| 3035 | - // Correction Insert Ignore |
|
| 3036 | - // INSERT IGNORE -> insert (tout court et pas 'insert or replace') |
|
| 3037 | - if (strpos($this->query, 'INSERT IGNORE') === 0) { |
|
| 3038 | - spip_log("Sqlite : requete transformee -> $this->query", 'sqlite.' . _LOG_DEBUG); |
|
| 3039 | - $this->query = 'INSERT ' . substr($this->query, '13'); |
|
| 3040 | - } |
|
| 3041 | - |
|
| 3042 | - // Correction des dates avec INTERVAL |
|
| 3043 | - // utiliser sql_date_proche() de preference |
|
| 3044 | - if (strpos($this->query, 'INTERVAL') !== false) { |
|
| 3045 | - $this->query = preg_replace_callback( |
|
| 3046 | - '/DATE_(ADD|SUB)(.*)INTERVAL\s+(\d+)\s+([a-zA-Z]+)\)/U', |
|
| 3047 | - [&$this, '_remplacerDateParTime'], |
|
| 3048 | - $this->query |
|
| 3049 | - ); |
|
| 3050 | - } |
|
| 3051 | - |
|
| 3052 | - if (strpos($this->query, 'LEFT(') !== false) { |
|
| 3053 | - $this->query = str_replace('LEFT(', '_LEFT(', $this->query); |
|
| 3054 | - } |
|
| 3055 | - |
|
| 3056 | - if (strpos($this->query, 'TIMESTAMPDIFF(') !== false) { |
|
| 3057 | - $this->query = preg_replace('/TIMESTAMPDIFF\(\s*([^,]*)\s*,/Uims', "TIMESTAMPDIFF('\\1',", $this->query); |
|
| 3058 | - } |
|
| 3059 | - |
|
| 3060 | - |
|
| 3061 | - // Correction Using |
|
| 3062 | - // USING (non reconnu en sqlite2) |
|
| 3063 | - // problematique car la jointure ne se fait pas du coup. |
|
| 3064 | - if (($this->sqlite_version == 2) && (strpos($this->query, 'USING') !== false)) { |
|
| 3065 | - spip_log( |
|
| 3066 | - "'USING (champ)' n'est pas reconnu en SQLite 2. Utilisez 'ON table1.champ = table2.champ'", |
|
| 3067 | - 'sqlite.' . _LOG_ERREUR |
|
| 3068 | - ); |
|
| 3069 | - $this->query = preg_replace('/USING\s*\([^\)]*\)/', '', $this->query); |
|
| 3070 | - } |
|
| 3071 | - |
|
| 3072 | - // Correction Field |
|
| 3073 | - // remplace FIELD(table,i,j,k...) par CASE WHEN table=i THEN n ... ELSE 0 END |
|
| 3074 | - if (strpos($this->query, 'FIELD') !== false) { |
|
| 3075 | - $this->query = preg_replace_callback( |
|
| 3076 | - '/FIELD\s*\(([^\)]*)\)/', |
|
| 3077 | - [&$this, '_remplacerFieldParCase'], |
|
| 3078 | - $this->query |
|
| 3079 | - ); |
|
| 3080 | - } |
|
| 3081 | - |
|
| 3082 | - // Correction des noms de tables FROM |
|
| 3083 | - // mettre les bons noms de table dans from, update, insert, replace... |
|
| 3084 | - if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/iS', $this->query, $regs)) { |
|
| 3085 | - $suite = strstr($this->query, $regs[0]); |
|
| 3086 | - $this->query = substr($this->query, 0, -strlen($suite)); |
|
| 3087 | - } else { |
|
| 3088 | - $suite = ''; |
|
| 3089 | - } |
|
| 3090 | - $pref = ($this->prefixe) ? $this->prefixe . '_' : ''; |
|
| 3091 | - $this->query = preg_replace('/([,\s])spip_/S', '\1' . $pref, $this->query) . $suite; |
|
| 3092 | - |
|
| 3093 | - // Correction zero AS x |
|
| 3094 | - // pg n'aime pas 0+x AS alias, sqlite, dans le meme style, |
|
| 3095 | - // n'apprecie pas du tout SELECT 0 as x ... ORDER BY x |
|
| 3096 | - // il dit que x ne doit pas être un integer dans le order by ! |
|
| 3097 | - // on remplace du coup x par vide() dans ce cas uniquement |
|
| 3098 | - // |
|
| 3099 | - // apparait dans public/vertebrer.php et dans le plugin menu aussi qui genere aussi ce genre de requete via un {par num #GET{tri_num}} |
|
| 3100 | - // mais est-ce encore un soucis pour sqlite en 2021 ? (ie commenter le preg_replace marche très bien en sqlite 3.28) |
|
| 3101 | - if ((strpos($this->query, '0 AS') !== false)) { |
|
| 3102 | - // on ne remplace que dans ORDER BY ou GROUP BY |
|
| 3103 | - if (preg_match('/\s(ORDER|GROUP) BY\s/i', $this->query, $regs)) { |
|
| 3104 | - $suite = strstr($this->query, $regs[0]); |
|
| 3105 | - $this->query = substr($this->query, 0, -strlen($suite)); |
|
| 3106 | - |
|
| 3107 | - // on cherche les noms des x dans 0 AS x |
|
| 3108 | - // on remplace dans $suite le nom par vide() |
|
| 3109 | - preg_match_all('/\b0 AS\s*([^\s,]+)/', $this->query, $matches, PREG_PATTERN_ORDER); |
|
| 3110 | - foreach ($matches[1] as $m) { |
|
| 3111 | - if (strpos($suite, $m) !== false) { |
|
| 3112 | - $suite = preg_replace(",\b$m\b,", 'VIDE()', $suite); |
|
| 3113 | - } |
|
| 3114 | - } |
|
| 3115 | - $this->query .= $suite; |
|
| 3116 | - } |
|
| 3117 | - } |
|
| 3118 | - |
|
| 3119 | - // Correction possible des divisions entieres |
|
| 3120 | - // Le standard SQL (lequel? ou?) semble indiquer que |
|
| 3121 | - // a/b=c doit donner c entier si a et b sont entiers 4/3=1. |
|
| 3122 | - // C'est ce que retournent effectivement SQL Server et SQLite |
|
| 3123 | - // Ce n'est pas ce qu'applique MySQL qui retourne un reel : 4/3=1.333... |
|
| 3124 | - // |
|
| 3125 | - // On peut forcer la conversion en multipliant par 1.0 avant la division |
|
| 3126 | - // /!\ SQLite 3.5.9 Debian/Ubuntu est victime d'un bug en plus ! |
|
| 3127 | - // cf. https://bugs.launchpad.net/ubuntu/+source/sqlite3/+bug/254228 |
|
| 3128 | - // http://www.sqlite.org/cvstrac/tktview?tn=3202 |
|
| 3129 | - // (4*1.0/3) n'est pas rendu dans ce cas ! |
|
| 3130 | - # $this->query = str_replace('/','* 1.00 / ',$this->query); |
|
| 3131 | - |
|
| 3132 | - |
|
| 3133 | - // Correction critere REGEXP, non reconnu en sqlite2 |
|
| 3134 | - if (($this->sqlite_version == 2) && (strpos($this->query, 'REGEXP') !== false)) { |
|
| 3135 | - $this->query = preg_replace('/([^\s\(]*)(\s*)REGEXP(\s*)([^\s\)]*)/', 'REGEXP($4, $1)', $this->query); |
|
| 3136 | - } |
|
| 3137 | - |
|
| 3138 | - // |
|
| 3139 | - // 3) Remise en place des textes d'origine |
|
| 3140 | - // |
|
| 3141 | - // Correction Antiquotes et echappements |
|
| 3142 | - // ` => rien |
|
| 3143 | - if (strpos($this->query, '`') !== false) { |
|
| 3144 | - $this->query = str_replace('`', '', $this->query); |
|
| 3145 | - } |
|
| 3146 | - |
|
| 3147 | - $this->query = query_reinjecte_textes($this->query, $textes); |
|
| 3148 | - |
|
| 3149 | - return $this->query; |
|
| 3150 | - } |
|
| 3151 | - |
|
| 3152 | - |
|
| 3153 | - /** |
|
| 3154 | - * Callback pour remplacer `DATE_` / `INTERVAL` |
|
| 3155 | - * par `DATE ... strtotime` |
|
| 3156 | - * |
|
| 3157 | - * @param array $matches Captures |
|
| 3158 | - * @return string Texte de date compris par SQLite |
|
| 3159 | - */ |
|
| 3160 | - public function _remplacerDateParTime($matches) { |
|
| 3161 | - $op = strtoupper($matches[1] == 'ADD') ? '+' : '-'; |
|
| 3162 | - |
|
| 3163 | - return "datetime$matches[2] '$op$matches[3] $matches[4]')"; |
|
| 3164 | - } |
|
| 3165 | - |
|
| 3166 | - /** |
|
| 3167 | - * Callback pour remplacer `FIELD(table,i,j,k...)` |
|
| 3168 | - * par `CASE WHEN table=i THEN n ... ELSE 0 END` |
|
| 3169 | - * |
|
| 3170 | - * @param array $matches Captures |
|
| 3171 | - * @return string Texte de liste ordonnée compris par SQLite |
|
| 3172 | - */ |
|
| 3173 | - public function _remplacerFieldParCase($matches) { |
|
| 3174 | - $fields = substr($matches[0], 6, -1); // ne recuperer que l'interieur X de field(X) |
|
| 3175 | - $t = explode(',', $fields); |
|
| 3176 | - $index = array_shift($t); |
|
| 3177 | - |
|
| 3178 | - $res = ''; |
|
| 3179 | - $n = 0; |
|
| 3180 | - foreach ($t as $v) { |
|
| 3181 | - $n++; |
|
| 3182 | - $res .= "\nWHEN $index=$v THEN $n"; |
|
| 3183 | - } |
|
| 3184 | - |
|
| 3185 | - return "CASE $res ELSE 0 END "; |
|
| 3186 | - } |
|
| 2985 | + /** @var string $query Texte de la requête */ |
|
| 2986 | + public $query = ''; |
|
| 2987 | + /** @var string $prefixe Préfixe des tables */ |
|
| 2988 | + public $prefixe = ''; |
|
| 2989 | + /** @var string $sqlite_version Version de sqlite (2 ou 3) */ |
|
| 2990 | + public $sqlite_version = ''; |
|
| 2991 | + |
|
| 2992 | + /** Pour les corrections à effectuer sur les requêtes : array(code=>'texte') trouvé |
|
| 2993 | + * |
|
| 2994 | + * @var array |
|
| 2995 | + */ |
|
| 2996 | + public $textes = []; |
|
| 2997 | + |
|
| 2998 | + /** |
|
| 2999 | + * Constructeur |
|
| 3000 | + * |
|
| 3001 | + * @param string $query Requête à préparer |
|
| 3002 | + * @param string $prefixe Prefixe des tables à utiliser |
|
| 3003 | + * @param string $sqlite_version Version SQLite (2 ou 3) |
|
| 3004 | + */ |
|
| 3005 | + public function __construct($query, $prefixe, $sqlite_version) { |
|
| 3006 | + $this->query = $query; |
|
| 3007 | + $this->prefixe = $prefixe; |
|
| 3008 | + $this->sqlite_version = $sqlite_version; |
|
| 3009 | + } |
|
| 3010 | + |
|
| 3011 | + /** |
|
| 3012 | + * Transformer la requete pour SQLite |
|
| 3013 | + * |
|
| 3014 | + * Enlève les textes, transforme la requête pour quelle soit |
|
| 3015 | + * bien interprétée par SQLite, puis remet les textes |
|
| 3016 | + * la fonction affecte `$this->query` |
|
| 3017 | + */ |
|
| 3018 | + public function traduire_requete() { |
|
| 3019 | + // |
|
| 3020 | + // 1) Protection des textes en les remplacant par des codes |
|
| 3021 | + // |
|
| 3022 | + // enlever les 'textes' et initialiser avec |
|
| 3023 | + list($this->query, $textes) = query_echappe_textes($this->query); |
|
| 3024 | + |
|
| 3025 | + // |
|
| 3026 | + // 2) Corrections de la requete |
|
| 3027 | + // |
|
| 3028 | + // Correction Create Database |
|
| 3029 | + // Create Database -> requete ignoree |
|
| 3030 | + if (strpos($this->query, 'CREATE DATABASE') === 0) { |
|
| 3031 | + spip_log("Sqlite : requete non executee -> $this->query", 'sqlite.' . _LOG_AVERTISSEMENT); |
|
| 3032 | + $this->query = 'SELECT 1'; |
|
| 3033 | + } |
|
| 3034 | + |
|
| 3035 | + // Correction Insert Ignore |
|
| 3036 | + // INSERT IGNORE -> insert (tout court et pas 'insert or replace') |
|
| 3037 | + if (strpos($this->query, 'INSERT IGNORE') === 0) { |
|
| 3038 | + spip_log("Sqlite : requete transformee -> $this->query", 'sqlite.' . _LOG_DEBUG); |
|
| 3039 | + $this->query = 'INSERT ' . substr($this->query, '13'); |
|
| 3040 | + } |
|
| 3041 | + |
|
| 3042 | + // Correction des dates avec INTERVAL |
|
| 3043 | + // utiliser sql_date_proche() de preference |
|
| 3044 | + if (strpos($this->query, 'INTERVAL') !== false) { |
|
| 3045 | + $this->query = preg_replace_callback( |
|
| 3046 | + '/DATE_(ADD|SUB)(.*)INTERVAL\s+(\d+)\s+([a-zA-Z]+)\)/U', |
|
| 3047 | + [&$this, '_remplacerDateParTime'], |
|
| 3048 | + $this->query |
|
| 3049 | + ); |
|
| 3050 | + } |
|
| 3051 | + |
|
| 3052 | + if (strpos($this->query, 'LEFT(') !== false) { |
|
| 3053 | + $this->query = str_replace('LEFT(', '_LEFT(', $this->query); |
|
| 3054 | + } |
|
| 3055 | + |
|
| 3056 | + if (strpos($this->query, 'TIMESTAMPDIFF(') !== false) { |
|
| 3057 | + $this->query = preg_replace('/TIMESTAMPDIFF\(\s*([^,]*)\s*,/Uims', "TIMESTAMPDIFF('\\1',", $this->query); |
|
| 3058 | + } |
|
| 3059 | + |
|
| 3060 | + |
|
| 3061 | + // Correction Using |
|
| 3062 | + // USING (non reconnu en sqlite2) |
|
| 3063 | + // problematique car la jointure ne se fait pas du coup. |
|
| 3064 | + if (($this->sqlite_version == 2) && (strpos($this->query, 'USING') !== false)) { |
|
| 3065 | + spip_log( |
|
| 3066 | + "'USING (champ)' n'est pas reconnu en SQLite 2. Utilisez 'ON table1.champ = table2.champ'", |
|
| 3067 | + 'sqlite.' . _LOG_ERREUR |
|
| 3068 | + ); |
|
| 3069 | + $this->query = preg_replace('/USING\s*\([^\)]*\)/', '', $this->query); |
|
| 3070 | + } |
|
| 3071 | + |
|
| 3072 | + // Correction Field |
|
| 3073 | + // remplace FIELD(table,i,j,k...) par CASE WHEN table=i THEN n ... ELSE 0 END |
|
| 3074 | + if (strpos($this->query, 'FIELD') !== false) { |
|
| 3075 | + $this->query = preg_replace_callback( |
|
| 3076 | + '/FIELD\s*\(([^\)]*)\)/', |
|
| 3077 | + [&$this, '_remplacerFieldParCase'], |
|
| 3078 | + $this->query |
|
| 3079 | + ); |
|
| 3080 | + } |
|
| 3081 | + |
|
| 3082 | + // Correction des noms de tables FROM |
|
| 3083 | + // mettre les bons noms de table dans from, update, insert, replace... |
|
| 3084 | + if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/iS', $this->query, $regs)) { |
|
| 3085 | + $suite = strstr($this->query, $regs[0]); |
|
| 3086 | + $this->query = substr($this->query, 0, -strlen($suite)); |
|
| 3087 | + } else { |
|
| 3088 | + $suite = ''; |
|
| 3089 | + } |
|
| 3090 | + $pref = ($this->prefixe) ? $this->prefixe . '_' : ''; |
|
| 3091 | + $this->query = preg_replace('/([,\s])spip_/S', '\1' . $pref, $this->query) . $suite; |
|
| 3092 | + |
|
| 3093 | + // Correction zero AS x |
|
| 3094 | + // pg n'aime pas 0+x AS alias, sqlite, dans le meme style, |
|
| 3095 | + // n'apprecie pas du tout SELECT 0 as x ... ORDER BY x |
|
| 3096 | + // il dit que x ne doit pas être un integer dans le order by ! |
|
| 3097 | + // on remplace du coup x par vide() dans ce cas uniquement |
|
| 3098 | + // |
|
| 3099 | + // apparait dans public/vertebrer.php et dans le plugin menu aussi qui genere aussi ce genre de requete via un {par num #GET{tri_num}} |
|
| 3100 | + // mais est-ce encore un soucis pour sqlite en 2021 ? (ie commenter le preg_replace marche très bien en sqlite 3.28) |
|
| 3101 | + if ((strpos($this->query, '0 AS') !== false)) { |
|
| 3102 | + // on ne remplace que dans ORDER BY ou GROUP BY |
|
| 3103 | + if (preg_match('/\s(ORDER|GROUP) BY\s/i', $this->query, $regs)) { |
|
| 3104 | + $suite = strstr($this->query, $regs[0]); |
|
| 3105 | + $this->query = substr($this->query, 0, -strlen($suite)); |
|
| 3106 | + |
|
| 3107 | + // on cherche les noms des x dans 0 AS x |
|
| 3108 | + // on remplace dans $suite le nom par vide() |
|
| 3109 | + preg_match_all('/\b0 AS\s*([^\s,]+)/', $this->query, $matches, PREG_PATTERN_ORDER); |
|
| 3110 | + foreach ($matches[1] as $m) { |
|
| 3111 | + if (strpos($suite, $m) !== false) { |
|
| 3112 | + $suite = preg_replace(",\b$m\b,", 'VIDE()', $suite); |
|
| 3113 | + } |
|
| 3114 | + } |
|
| 3115 | + $this->query .= $suite; |
|
| 3116 | + } |
|
| 3117 | + } |
|
| 3118 | + |
|
| 3119 | + // Correction possible des divisions entieres |
|
| 3120 | + // Le standard SQL (lequel? ou?) semble indiquer que |
|
| 3121 | + // a/b=c doit donner c entier si a et b sont entiers 4/3=1. |
|
| 3122 | + // C'est ce que retournent effectivement SQL Server et SQLite |
|
| 3123 | + // Ce n'est pas ce qu'applique MySQL qui retourne un reel : 4/3=1.333... |
|
| 3124 | + // |
|
| 3125 | + // On peut forcer la conversion en multipliant par 1.0 avant la division |
|
| 3126 | + // /!\ SQLite 3.5.9 Debian/Ubuntu est victime d'un bug en plus ! |
|
| 3127 | + // cf. https://bugs.launchpad.net/ubuntu/+source/sqlite3/+bug/254228 |
|
| 3128 | + // http://www.sqlite.org/cvstrac/tktview?tn=3202 |
|
| 3129 | + // (4*1.0/3) n'est pas rendu dans ce cas ! |
|
| 3130 | + # $this->query = str_replace('/','* 1.00 / ',$this->query); |
|
| 3131 | + |
|
| 3132 | + |
|
| 3133 | + // Correction critere REGEXP, non reconnu en sqlite2 |
|
| 3134 | + if (($this->sqlite_version == 2) && (strpos($this->query, 'REGEXP') !== false)) { |
|
| 3135 | + $this->query = preg_replace('/([^\s\(]*)(\s*)REGEXP(\s*)([^\s\)]*)/', 'REGEXP($4, $1)', $this->query); |
|
| 3136 | + } |
|
| 3137 | + |
|
| 3138 | + // |
|
| 3139 | + // 3) Remise en place des textes d'origine |
|
| 3140 | + // |
|
| 3141 | + // Correction Antiquotes et echappements |
|
| 3142 | + // ` => rien |
|
| 3143 | + if (strpos($this->query, '`') !== false) { |
|
| 3144 | + $this->query = str_replace('`', '', $this->query); |
|
| 3145 | + } |
|
| 3146 | + |
|
| 3147 | + $this->query = query_reinjecte_textes($this->query, $textes); |
|
| 3148 | + |
|
| 3149 | + return $this->query; |
|
| 3150 | + } |
|
| 3151 | + |
|
| 3152 | + |
|
| 3153 | + /** |
|
| 3154 | + * Callback pour remplacer `DATE_` / `INTERVAL` |
|
| 3155 | + * par `DATE ... strtotime` |
|
| 3156 | + * |
|
| 3157 | + * @param array $matches Captures |
|
| 3158 | + * @return string Texte de date compris par SQLite |
|
| 3159 | + */ |
|
| 3160 | + public function _remplacerDateParTime($matches) { |
|
| 3161 | + $op = strtoupper($matches[1] == 'ADD') ? '+' : '-'; |
|
| 3162 | + |
|
| 3163 | + return "datetime$matches[2] '$op$matches[3] $matches[4]')"; |
|
| 3164 | + } |
|
| 3165 | + |
|
| 3166 | + /** |
|
| 3167 | + * Callback pour remplacer `FIELD(table,i,j,k...)` |
|
| 3168 | + * par `CASE WHEN table=i THEN n ... ELSE 0 END` |
|
| 3169 | + * |
|
| 3170 | + * @param array $matches Captures |
|
| 3171 | + * @return string Texte de liste ordonnée compris par SQLite |
|
| 3172 | + */ |
|
| 3173 | + public function _remplacerFieldParCase($matches) { |
|
| 3174 | + $fields = substr($matches[0], 6, -1); // ne recuperer que l'interieur X de field(X) |
|
| 3175 | + $t = explode(',', $fields); |
|
| 3176 | + $index = array_shift($t); |
|
| 3177 | + |
|
| 3178 | + $res = ''; |
|
| 3179 | + $n = 0; |
|
| 3180 | + foreach ($t as $v) { |
|
| 3181 | + $n++; |
|
| 3182 | + $res .= "\nWHEN $index=$v THEN $n"; |
|
| 3183 | + } |
|
| 3184 | + |
|
| 3185 | + return "CASE $res ELSE 0 END "; |
|
| 3186 | + } |
|
| 3187 | 3187 | } |
@@ -17,7 +17,7 @@ discard block |
||
| 17 | 17 | **/ |
| 18 | 18 | |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | /** |
@@ -37,7 +37,7 @@ discard block |
||
| 37 | 37 | * Pile complétée du code compilé |
| 38 | 38 | **/ |
| 39 | 39 | function balise_MENU_LANG($p) { |
| 40 | - return calculer_balise_dynamique($p, 'MENU_LANG', ['lang']); |
|
| 40 | + return calculer_balise_dynamique($p, 'MENU_LANG', ['lang']); |
|
| 41 | 41 | } |
| 42 | 42 | |
| 43 | 43 | /** |
@@ -56,11 +56,11 @@ discard block |
||
| 56 | 56 | * string: (vide) si pas de multilinguisme |
| 57 | 57 | */ |
| 58 | 58 | function balise_MENU_LANG_stat($args, $context_compil) { |
| 59 | - if (strpos($GLOBALS['meta']['langues_multilingue'], ',') === false) { |
|
| 60 | - return ''; |
|
| 61 | - } |
|
| 59 | + if (strpos($GLOBALS['meta']['langues_multilingue'], ',') === false) { |
|
| 60 | + return ''; |
|
| 61 | + } |
|
| 62 | 62 | |
| 63 | - return $args; |
|
| 63 | + return $args; |
|
| 64 | 64 | } |
| 65 | 65 | |
| 66 | 66 | /** |
@@ -76,7 +76,7 @@ discard block |
||
| 76 | 76 | * Liste : Chemin du squelette, durée du cache, contexte |
| 77 | 77 | **/ |
| 78 | 78 | function balise_MENU_LANG_dyn($opt) { |
| 79 | - include_spip('balise/menu_lang_ecrire'); |
|
| 79 | + include_spip('balise/menu_lang_ecrire'); |
|
| 80 | 80 | |
| 81 | - return menu_lang_pour_tous('var_lang', $opt); |
|
| 81 | + return menu_lang_pour_tous('var_lang', $opt); |
|
| 82 | 82 | } |
@@ -4,925 +4,925 @@ |
||
| 4 | 4 | // ** ne pas modifier le fichier ** |
| 5 | 5 | |
| 6 | 6 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 7 | - return; |
|
| 7 | + return; |
|
| 8 | 8 | } |
| 9 | 9 | |
| 10 | 10 | $GLOBALS[$GLOBALS['idx_lang']] = array( |
| 11 | 11 | |
| 12 | - // A |
|
| 13 | - 'activer_plugin' => 'Activar o plugin', |
|
| 14 | - 'affichage' => 'Mostrar', |
|
| 15 | - 'aide_non_disponible' => 'Esta parte da ajuda online ainda não está disponível neste idioma.', |
|
| 16 | - 'annuler_recherche' => 'Cancelar a pesquisa', |
|
| 17 | - 'auteur' => 'Autor :', |
|
| 18 | - 'avis_acces_interdit' => 'Accesso interdito. ', |
|
| 19 | - 'avis_acces_interdit_prive' => 'Não está autorizado a aceder à página <b>@exec@</b>.', |
|
| 20 | - 'avis_article_modifie' => 'Atenção, @nom_auteur_modif@ trabalhou neste artigo há @date_diff@ minutes', |
|
| 21 | - 'avis_aucun_resultat' => 'Sem resultados. ', |
|
| 22 | - 'avis_base_inaccessible' => 'Impossível conectar-se à base de dados @base@.', |
|
| 23 | - 'avis_chemin_invalide_1' => 'O caminho que escolheu ', |
|
| 24 | - 'avis_chemin_invalide_2' => 'não parece ser válido. Por favor regresse à página anterior e verifique as informações fornecidas. ', |
|
| 25 | - 'avis_connexion_echec_1' => 'A ligação ao servidor SQL falhou.', |
|
| 26 | - 'avis_connexion_echec_2' => 'Volte à página anterior e verifique as informações que forneceu. ', |
|
| 27 | - 'avis_connexion_echec_3' => '<b>N.B.</b> Em diversos servidores, precisa <b>solicitar</b> a activação do seu acesso à base de dados SQL antes de poder utilizá-la. Se não consegue ligar-se à sua base de dados, verifique se efectuou esse pedido.', |
|
| 28 | - 'avis_connexion_erreur_creer_base' => 'Não foi possível criar a base de dados.', |
|
| 29 | - 'avis_connexion_erreur_nom_base' => 'O nome da base de dados só pode conter letras, números e hífen.', |
|
| 30 | - 'avis_connexion_ldap_echec_1' => 'A ligação ao servidor LDAP falhou.', |
|
| 31 | - 'avis_connexion_ldap_echec_2' => 'Volte à página anterior e verifique as informações que forneceu ', |
|
| 32 | - 'avis_connexion_ldap_echec_3' => 'Alternativamente, não utilize o suporte LDAP para importar utilizadores.', |
|
| 33 | - 'avis_deplacement_rubrique' => 'Atenção ! Esta rubrica contém @contient_breves@ informação@scb@ : se a deslocar, por favor confirme-o nesta caixa.', |
|
| 34 | - 'avis_erreur_connexion_mysql' => 'Erro de ligação SQL', |
|
| 35 | - 'avis_espace_interdit' => '<b>Espaço interdito</b><p>SPIP já está instalado.', |
|
| 36 | - 'avis_lecture_noms_bases_1' => 'O programa de instalação não conseguiu ler os nomes das bases de dados instaladas. ', |
|
| 37 | - 'avis_lecture_noms_bases_2' => 'Ou nenhuma base de dados está disponível, ou a função que permite listá-las foi desactivada |
|
| 12 | + // A |
|
| 13 | + 'activer_plugin' => 'Activar o plugin', |
|
| 14 | + 'affichage' => 'Mostrar', |
|
| 15 | + 'aide_non_disponible' => 'Esta parte da ajuda online ainda não está disponível neste idioma.', |
|
| 16 | + 'annuler_recherche' => 'Cancelar a pesquisa', |
|
| 17 | + 'auteur' => 'Autor :', |
|
| 18 | + 'avis_acces_interdit' => 'Accesso interdito. ', |
|
| 19 | + 'avis_acces_interdit_prive' => 'Não está autorizado a aceder à página <b>@exec@</b>.', |
|
| 20 | + 'avis_article_modifie' => 'Atenção, @nom_auteur_modif@ trabalhou neste artigo há @date_diff@ minutes', |
|
| 21 | + 'avis_aucun_resultat' => 'Sem resultados. ', |
|
| 22 | + 'avis_base_inaccessible' => 'Impossível conectar-se à base de dados @base@.', |
|
| 23 | + 'avis_chemin_invalide_1' => 'O caminho que escolheu ', |
|
| 24 | + 'avis_chemin_invalide_2' => 'não parece ser válido. Por favor regresse à página anterior e verifique as informações fornecidas. ', |
|
| 25 | + 'avis_connexion_echec_1' => 'A ligação ao servidor SQL falhou.', |
|
| 26 | + 'avis_connexion_echec_2' => 'Volte à página anterior e verifique as informações que forneceu. ', |
|
| 27 | + 'avis_connexion_echec_3' => '<b>N.B.</b> Em diversos servidores, precisa <b>solicitar</b> a activação do seu acesso à base de dados SQL antes de poder utilizá-la. Se não consegue ligar-se à sua base de dados, verifique se efectuou esse pedido.', |
|
| 28 | + 'avis_connexion_erreur_creer_base' => 'Não foi possível criar a base de dados.', |
|
| 29 | + 'avis_connexion_erreur_nom_base' => 'O nome da base de dados só pode conter letras, números e hífen.', |
|
| 30 | + 'avis_connexion_ldap_echec_1' => 'A ligação ao servidor LDAP falhou.', |
|
| 31 | + 'avis_connexion_ldap_echec_2' => 'Volte à página anterior e verifique as informações que forneceu ', |
|
| 32 | + 'avis_connexion_ldap_echec_3' => 'Alternativamente, não utilize o suporte LDAP para importar utilizadores.', |
|
| 33 | + 'avis_deplacement_rubrique' => 'Atenção ! Esta rubrica contém @contient_breves@ informação@scb@ : se a deslocar, por favor confirme-o nesta caixa.', |
|
| 34 | + 'avis_erreur_connexion_mysql' => 'Erro de ligação SQL', |
|
| 35 | + 'avis_espace_interdit' => '<b>Espaço interdito</b><p>SPIP já está instalado.', |
|
| 36 | + 'avis_lecture_noms_bases_1' => 'O programa de instalação não conseguiu ler os nomes das bases de dados instaladas. ', |
|
| 37 | + 'avis_lecture_noms_bases_2' => 'Ou nenhuma base de dados está disponível, ou a função que permite listá-las foi desactivada |
|
| 38 | 38 | por razões de segurança (o que é o caso em muitos serviços de hospedagem). ', |
| 39 | - 'avis_lecture_noms_bases_3' => 'Na segunda alternativa, é provável que uma base tendo o seu nome de login seja utilizável :', |
|
| 40 | - 'avis_non_acces_page' => 'Não tem acesso a esta página. ', |
|
| 41 | - 'avis_operation_echec' => 'A operação falhou. ', |
|
| 42 | - 'avis_operation_impossible' => 'Operação impossivel', |
|
| 43 | - 'avis_suppression_base' => 'Atenção, a supressão dos dados é irreversível', |
|
| 39 | + 'avis_lecture_noms_bases_3' => 'Na segunda alternativa, é provável que uma base tendo o seu nome de login seja utilizável :', |
|
| 40 | + 'avis_non_acces_page' => 'Não tem acesso a esta página. ', |
|
| 41 | + 'avis_operation_echec' => 'A operação falhou. ', |
|
| 42 | + 'avis_operation_impossible' => 'Operação impossivel', |
|
| 43 | + 'avis_suppression_base' => 'Atenção, a supressão dos dados é irreversível', |
|
| 44 | 44 | |
| 45 | - // B |
|
| 46 | - 'bouton_acces_ldap' => 'Acrescentar o acesso a LDAP >>', |
|
| 47 | - 'bouton_ajouter' => 'Acrescentar ', |
|
| 48 | - 'bouton_annuler' => 'Cancelar', |
|
| 49 | - 'bouton_cache_activer' => 'Reactivar a cache', |
|
| 50 | - 'bouton_cache_desactiver' => 'Desactivar temporariamente a cache', |
|
| 51 | - 'bouton_demande_publication' => 'Pedir a publicação deste artigo ', |
|
| 52 | - 'bouton_desactive_tout' => 'Desactivar tudo', |
|
| 53 | - 'bouton_desinstaller' => 'Desinstalar', |
|
| 54 | - 'bouton_effacer_tout' => 'Apagar TUDO', |
|
| 55 | - 'bouton_envoyer_message' => 'Mensagem definitiva: enviar', |
|
| 56 | - 'bouton_fermer' => 'Fechar', |
|
| 57 | - 'bouton_mettre_a_jour_base' => 'Actualizar a base de dados', |
|
| 58 | - 'bouton_modifier' => 'Modificar', |
|
| 59 | - 'bouton_radio_afficher' => 'Exibir', |
|
| 60 | - 'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Aparecer na lista dos redactores ligados', |
|
| 61 | - 'bouton_radio_envoi_annonces_adresse' => 'Enviar os anúncios para o endereço:', |
|
| 62 | - 'bouton_radio_envoi_liste_nouveautes' => 'Enviar a lista das novidades', |
|
| 63 | - 'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Não aparecer na lista dos redactores online', |
|
| 64 | - 'bouton_radio_non_envoi_annonces_editoriales' => 'Não enviar anúncios editoriais', |
|
| 65 | - 'bouton_redirection' => 'REDIRECCIONAR', |
|
| 66 | - 'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Repor para valores padrão', |
|
| 67 | - 'bouton_relancer_inscription' => 'Relançar o registo', |
|
| 68 | - 'bouton_relancer_inscriptions' => 'Relançar os registos', |
|
| 69 | - 'bouton_relancer_installation' => 'Recomeçar a instalação', |
|
| 70 | - 'bouton_reset_password' => 'Gerar uma nova senha e enviá-la por e-mail', |
|
| 71 | - 'bouton_suivant' => 'Seguinte', |
|
| 72 | - 'bouton_tenter_recuperation' => 'Tentar uma reparação', |
|
| 73 | - 'bouton_test_proxy' => 'Testar o proxy', |
|
| 74 | - 'bouton_vider_cache' => 'Esvaziar a cache', |
|
| 45 | + // B |
|
| 46 | + 'bouton_acces_ldap' => 'Acrescentar o acesso a LDAP >>', |
|
| 47 | + 'bouton_ajouter' => 'Acrescentar ', |
|
| 48 | + 'bouton_annuler' => 'Cancelar', |
|
| 49 | + 'bouton_cache_activer' => 'Reactivar a cache', |
|
| 50 | + 'bouton_cache_desactiver' => 'Desactivar temporariamente a cache', |
|
| 51 | + 'bouton_demande_publication' => 'Pedir a publicação deste artigo ', |
|
| 52 | + 'bouton_desactive_tout' => 'Desactivar tudo', |
|
| 53 | + 'bouton_desinstaller' => 'Desinstalar', |
|
| 54 | + 'bouton_effacer_tout' => 'Apagar TUDO', |
|
| 55 | + 'bouton_envoyer_message' => 'Mensagem definitiva: enviar', |
|
| 56 | + 'bouton_fermer' => 'Fechar', |
|
| 57 | + 'bouton_mettre_a_jour_base' => 'Actualizar a base de dados', |
|
| 58 | + 'bouton_modifier' => 'Modificar', |
|
| 59 | + 'bouton_radio_afficher' => 'Exibir', |
|
| 60 | + 'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Aparecer na lista dos redactores ligados', |
|
| 61 | + 'bouton_radio_envoi_annonces_adresse' => 'Enviar os anúncios para o endereço:', |
|
| 62 | + 'bouton_radio_envoi_liste_nouveautes' => 'Enviar a lista das novidades', |
|
| 63 | + 'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Não aparecer na lista dos redactores online', |
|
| 64 | + 'bouton_radio_non_envoi_annonces_editoriales' => 'Não enviar anúncios editoriais', |
|
| 65 | + 'bouton_redirection' => 'REDIRECCIONAR', |
|
| 66 | + 'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Repor para valores padrão', |
|
| 67 | + 'bouton_relancer_inscription' => 'Relançar o registo', |
|
| 68 | + 'bouton_relancer_inscriptions' => 'Relançar os registos', |
|
| 69 | + 'bouton_relancer_installation' => 'Recomeçar a instalação', |
|
| 70 | + 'bouton_reset_password' => 'Gerar uma nova senha e enviá-la por e-mail', |
|
| 71 | + 'bouton_suivant' => 'Seguinte', |
|
| 72 | + 'bouton_tenter_recuperation' => 'Tentar uma reparação', |
|
| 73 | + 'bouton_test_proxy' => 'Testar o proxy', |
|
| 74 | + 'bouton_vider_cache' => 'Esvaziar a cache', |
|
| 75 | 75 | |
| 76 | - // C |
|
| 77 | - 'cache_modifiable_webmestre' => 'Este parâmetro é modificável pelo webmaster do site.', |
|
| 78 | - 'calendrier_synchro' => 'Se utilizar um software de agenda compatível <b>iCal</b>, pode sincronizá-lo com as informações deste sítio.', |
|
| 79 | - 'config_activer_champs' => 'Activar os campos seguintes', |
|
| 80 | - 'config_choix_base_sup' => 'Escolher uma base de dados neste servidor', |
|
| 81 | - 'config_erreur_base_sup' => 'SPIP não tem acesso à lista de bases de dados disponíveis', |
|
| 82 | - 'config_info_base_sup' => 'Se precisar de consultar outras bases de dados usando SPIP, quer seja neste servidor SQL ou noutro, use este formulário para as declarar. Se deixar alguns campos por preencher, os identificadores de conexão à base de dados principal serão usados.', |
|
| 83 | - 'config_info_base_sup_disponibles' => 'Bases de dados adicionais que se podem consultar:', |
|
| 84 | - 'config_info_enregistree' => 'A nova configuração foi guardada', |
|
| 85 | - 'config_info_logos' => 'Cada elemento do site pode ter o seu próprio logo, assim como um «mouseover»', |
|
| 86 | - 'config_info_logos_utiliser' => 'Utilizar os logos', |
|
| 87 | - 'config_info_logos_utiliser_non' => 'Não utilizar os logos', |
|
| 88 | - 'config_info_logos_utiliser_survol' => 'Usar os logos de "mouseover"', |
|
| 89 | - 'config_info_logos_utiliser_survol_non' => 'Não usar os logos de "mouseover"', |
|
| 90 | - 'config_info_redirection' => 'Activando esta opção, pode criar artigos virtuais, que são referências simples a artigos publicados noutros sítios, não necessariamente usando SPIP.', |
|
| 91 | - 'config_redirection' => 'Artigos virtuais', |
|
| 92 | - 'config_titre_base_sup' => 'Declaração de uma base de dados suplementar', |
|
| 93 | - 'config_titre_base_sup_choix' => 'Escolher uma base de dados suplementar', |
|
| 94 | - 'connexion_ldap' => 'Conexão:', |
|
| 95 | - 'creer_et_associer_un_auteur' => 'Criar e associar um autor', |
|
| 76 | + // C |
|
| 77 | + 'cache_modifiable_webmestre' => 'Este parâmetro é modificável pelo webmaster do site.', |
|
| 78 | + 'calendrier_synchro' => 'Se utilizar um software de agenda compatível <b>iCal</b>, pode sincronizá-lo com as informações deste sítio.', |
|
| 79 | + 'config_activer_champs' => 'Activar os campos seguintes', |
|
| 80 | + 'config_choix_base_sup' => 'Escolher uma base de dados neste servidor', |
|
| 81 | + 'config_erreur_base_sup' => 'SPIP não tem acesso à lista de bases de dados disponíveis', |
|
| 82 | + 'config_info_base_sup' => 'Se precisar de consultar outras bases de dados usando SPIP, quer seja neste servidor SQL ou noutro, use este formulário para as declarar. Se deixar alguns campos por preencher, os identificadores de conexão à base de dados principal serão usados.', |
|
| 83 | + 'config_info_base_sup_disponibles' => 'Bases de dados adicionais que se podem consultar:', |
|
| 84 | + 'config_info_enregistree' => 'A nova configuração foi guardada', |
|
| 85 | + 'config_info_logos' => 'Cada elemento do site pode ter o seu próprio logo, assim como um «mouseover»', |
|
| 86 | + 'config_info_logos_utiliser' => 'Utilizar os logos', |
|
| 87 | + 'config_info_logos_utiliser_non' => 'Não utilizar os logos', |
|
| 88 | + 'config_info_logos_utiliser_survol' => 'Usar os logos de "mouseover"', |
|
| 89 | + 'config_info_logos_utiliser_survol_non' => 'Não usar os logos de "mouseover"', |
|
| 90 | + 'config_info_redirection' => 'Activando esta opção, pode criar artigos virtuais, que são referências simples a artigos publicados noutros sítios, não necessariamente usando SPIP.', |
|
| 91 | + 'config_redirection' => 'Artigos virtuais', |
|
| 92 | + 'config_titre_base_sup' => 'Declaração de uma base de dados suplementar', |
|
| 93 | + 'config_titre_base_sup_choix' => 'Escolher uma base de dados suplementar', |
|
| 94 | + 'connexion_ldap' => 'Conexão:', |
|
| 95 | + 'creer_et_associer_un_auteur' => 'Criar e associar um autor', |
|
| 96 | 96 | |
| 97 | - // D |
|
| 98 | - 'date_mot_heures' => 'horas', |
|
| 97 | + // D |
|
| 98 | + 'date_mot_heures' => 'horas', |
|
| 99 | 99 | |
| 100 | - // E |
|
| 101 | - 'ecran_connexion_couleur_principale' => 'Cor principal', |
|
| 102 | - 'ecran_connexion_image_fond' => 'Imagem de fundo', |
|
| 103 | - 'ecran_connexion_image_fond_explication' => 'Usar uma imagem (formato JPEG, 1920x1080 pixels)', |
|
| 104 | - 'ecran_connexion_image_revenir_couleur_defaut' => 'Reverter para a cor padrão', |
|
| 105 | - 'ecran_connexion_titre' => 'Ecrã de ligação', |
|
| 106 | - 'ecran_securite' => ' + ecrã de segurança @version@', |
|
| 107 | - 'email' => 'email', |
|
| 108 | - 'email_2' => 'email :', |
|
| 109 | - 'en_savoir_plus' => 'Para saber mais', |
|
| 110 | - 'entree_adresse_annuaire' => 'Endereço do directório', |
|
| 111 | - 'entree_adresse_email' => 'O seu endereço email', |
|
| 112 | - 'entree_adresse_email_2' => 'Endereço electrónico', |
|
| 113 | - 'entree_base_donnee_1' => 'Endereço da base de dados', |
|
| 114 | - 'entree_base_donnee_2' => '(Muitas vezes, este endereço corresponde ao do seu sítio, outras vezes, corresponde à menção «localhost», às vezes, fica totalmente vazio.)', |
|
| 115 | - 'entree_biographie' => 'Curta biografia', |
|
| 116 | - 'entree_chemin_acces' => '<b>Introduzir</b> o caminho de acesso :', |
|
| 117 | - 'entree_cle_pgp' => 'A sua chave PGP', |
|
| 118 | - 'entree_cle_pgp_2' => 'Chave PGP', |
|
| 119 | - 'entree_contenu_rubrique' => '(Conteúdo da rubrica em poucas palavras.)', |
|
| 120 | - 'entree_identifiants_connexion' => 'Os seus identificadores de ligação', |
|
| 121 | - 'entree_identifiants_connexion_2' => 'Identifcadores de conexão', |
|
| 122 | - 'entree_informations_connexion_ldap' => 'Por favor preencha este formulário com as informações de ligação ao seu anuário LDAP. |
|
| 100 | + // E |
|
| 101 | + 'ecran_connexion_couleur_principale' => 'Cor principal', |
|
| 102 | + 'ecran_connexion_image_fond' => 'Imagem de fundo', |
|
| 103 | + 'ecran_connexion_image_fond_explication' => 'Usar uma imagem (formato JPEG, 1920x1080 pixels)', |
|
| 104 | + 'ecran_connexion_image_revenir_couleur_defaut' => 'Reverter para a cor padrão', |
|
| 105 | + 'ecran_connexion_titre' => 'Ecrã de ligação', |
|
| 106 | + 'ecran_securite' => ' + ecrã de segurança @version@', |
|
| 107 | + 'email' => 'email', |
|
| 108 | + 'email_2' => 'email :', |
|
| 109 | + 'en_savoir_plus' => 'Para saber mais', |
|
| 110 | + 'entree_adresse_annuaire' => 'Endereço do directório', |
|
| 111 | + 'entree_adresse_email' => 'O seu endereço email', |
|
| 112 | + 'entree_adresse_email_2' => 'Endereço electrónico', |
|
| 113 | + 'entree_base_donnee_1' => 'Endereço da base de dados', |
|
| 114 | + 'entree_base_donnee_2' => '(Muitas vezes, este endereço corresponde ao do seu sítio, outras vezes, corresponde à menção «localhost», às vezes, fica totalmente vazio.)', |
|
| 115 | + 'entree_biographie' => 'Curta biografia', |
|
| 116 | + 'entree_chemin_acces' => '<b>Introduzir</b> o caminho de acesso :', |
|
| 117 | + 'entree_cle_pgp' => 'A sua chave PGP', |
|
| 118 | + 'entree_cle_pgp_2' => 'Chave PGP', |
|
| 119 | + 'entree_contenu_rubrique' => '(Conteúdo da rubrica em poucas palavras.)', |
|
| 120 | + 'entree_identifiants_connexion' => 'Os seus identificadores de ligação', |
|
| 121 | + 'entree_identifiants_connexion_2' => 'Identifcadores de conexão', |
|
| 122 | + 'entree_informations_connexion_ldap' => 'Por favor preencha este formulário com as informações de ligação ao seu anuário LDAP. |
|
| 123 | 123 | Essas informações devem poder ser fornecidas pelo administrador do sistema ou da rede', |
| 124 | - 'entree_infos_perso' => 'Quem é você?', |
|
| 125 | - 'entree_infos_perso_2' => 'Quem é o autor?', |
|
| 126 | - 'entree_interieur_rubrique' => 'Dentro da rubrica :', |
|
| 127 | - 'entree_liens_sites' => '<b>Ligação hipertexto</b> (referência, sítio a visitar...)', |
|
| 128 | - 'entree_login' => 'O seu login', |
|
| 129 | - 'entree_login_connexion_1' => 'O login de ligação', |
|
| 130 | - 'entree_login_connexion_2' => '(Corresponde às vezes ao seu login de acesso ao FTP; outras vezes deixado vazio.)', |
|
| 131 | - 'entree_mot_passe' => 'A sua palavra-passe', |
|
| 132 | - 'entree_mot_passe_1' => 'A palavra-passe de ligação', |
|
| 133 | - 'entree_mot_passe_2' => '(Corresponde, às vezes, à sua palavra-passe para o FTP; outras vezes fica vazio)', |
|
| 134 | - 'entree_nom_fichier' => 'Por favor introduza o nome do ficheiro @texte_compresse@:', |
|
| 135 | - 'entree_nom_pseudo' => 'O seu nome ou o seu pseudónimo', |
|
| 136 | - 'entree_nom_pseudo_1' => '(O seu nome ou o seu pseudónimo)', |
|
| 137 | - 'entree_nom_pseudo_2' => 'Nome ou pseudónimo', |
|
| 138 | - 'entree_nom_site' => 'O nome do seu sítio', |
|
| 139 | - 'entree_nom_site_2' => 'Nome do sítio do autor', |
|
| 140 | - 'entree_nouveau_passe' => 'Nova palavra-passe', |
|
| 141 | - 'entree_passe_ldap' => 'Palavra-passe', |
|
| 142 | - 'entree_port_annuaire' => 'O número de porta do anuário', |
|
| 143 | - 'entree_signature' => 'Assinatura', |
|
| 144 | - 'entree_titre_obligatoire' => '<b>Título</b> [Obrigatório]<br />', |
|
| 145 | - 'entree_url' => 'O endereço (URL) do seu sítio', |
|
| 146 | - 'entree_url_2' => 'Endereço (URL) do sítio', |
|
| 147 | - 'erreur_connect_deja_existant' => 'Já existe um servidor com esse nome', |
|
| 148 | - 'erreur_contenu_suspect' => 'Texto de caracteres de escape', |
|
| 149 | - 'erreur_email_deja_existant' => 'Este endereço de correio electrónico já está registado.', |
|
| 150 | - 'erreur_nom_connect_incorrect' => 'O nome de servidor não é autorizado', |
|
| 151 | - 'erreur_plugin_attribut_balise_manquant' => 'Atributo @attribut@ em falta no marcador @balise@.', |
|
| 152 | - 'erreur_plugin_desinstalation_echouee' => 'A desinstalação do plugin falhou. No entanto, pode desactivá-lo.', |
|
| 153 | - 'erreur_plugin_fichier_absent' => 'Ficheiro inexistente', |
|
| 154 | - 'erreur_plugin_fichier_def_absent' => 'Ficheiro de definição inexistente', |
|
| 155 | - 'erreur_plugin_nom_fonction_interdit' => 'Nome de função interdito', |
|
| 156 | - 'erreur_plugin_nom_manquant' => 'Nome de plugin inexistente', |
|
| 157 | - 'erreur_plugin_prefix_manquant' => 'Espaço de criação de nome não definido para este plugin ', |
|
| 158 | - 'erreur_plugin_tag_plugin_absent' => '<plugin> inexistente no ficheiro de definição', |
|
| 159 | - 'erreur_plugin_version_manquant' => 'Versão de plugin inexistente', |
|
| 160 | - 'erreur_type_fichier' => 'Tipo de ficheiro incorrecto', |
|
| 124 | + 'entree_infos_perso' => 'Quem é você?', |
|
| 125 | + 'entree_infos_perso_2' => 'Quem é o autor?', |
|
| 126 | + 'entree_interieur_rubrique' => 'Dentro da rubrica :', |
|
| 127 | + 'entree_liens_sites' => '<b>Ligação hipertexto</b> (referência, sítio a visitar...)', |
|
| 128 | + 'entree_login' => 'O seu login', |
|
| 129 | + 'entree_login_connexion_1' => 'O login de ligação', |
|
| 130 | + 'entree_login_connexion_2' => '(Corresponde às vezes ao seu login de acesso ao FTP; outras vezes deixado vazio.)', |
|
| 131 | + 'entree_mot_passe' => 'A sua palavra-passe', |
|
| 132 | + 'entree_mot_passe_1' => 'A palavra-passe de ligação', |
|
| 133 | + 'entree_mot_passe_2' => '(Corresponde, às vezes, à sua palavra-passe para o FTP; outras vezes fica vazio)', |
|
| 134 | + 'entree_nom_fichier' => 'Por favor introduza o nome do ficheiro @texte_compresse@:', |
|
| 135 | + 'entree_nom_pseudo' => 'O seu nome ou o seu pseudónimo', |
|
| 136 | + 'entree_nom_pseudo_1' => '(O seu nome ou o seu pseudónimo)', |
|
| 137 | + 'entree_nom_pseudo_2' => 'Nome ou pseudónimo', |
|
| 138 | + 'entree_nom_site' => 'O nome do seu sítio', |
|
| 139 | + 'entree_nom_site_2' => 'Nome do sítio do autor', |
|
| 140 | + 'entree_nouveau_passe' => 'Nova palavra-passe', |
|
| 141 | + 'entree_passe_ldap' => 'Palavra-passe', |
|
| 142 | + 'entree_port_annuaire' => 'O número de porta do anuário', |
|
| 143 | + 'entree_signature' => 'Assinatura', |
|
| 144 | + 'entree_titre_obligatoire' => '<b>Título</b> [Obrigatório]<br />', |
|
| 145 | + 'entree_url' => 'O endereço (URL) do seu sítio', |
|
| 146 | + 'entree_url_2' => 'Endereço (URL) do sítio', |
|
| 147 | + 'erreur_connect_deja_existant' => 'Já existe um servidor com esse nome', |
|
| 148 | + 'erreur_contenu_suspect' => 'Texto de caracteres de escape', |
|
| 149 | + 'erreur_email_deja_existant' => 'Este endereço de correio electrónico já está registado.', |
|
| 150 | + 'erreur_nom_connect_incorrect' => 'O nome de servidor não é autorizado', |
|
| 151 | + 'erreur_plugin_attribut_balise_manquant' => 'Atributo @attribut@ em falta no marcador @balise@.', |
|
| 152 | + 'erreur_plugin_desinstalation_echouee' => 'A desinstalação do plugin falhou. No entanto, pode desactivá-lo.', |
|
| 153 | + 'erreur_plugin_fichier_absent' => 'Ficheiro inexistente', |
|
| 154 | + 'erreur_plugin_fichier_def_absent' => 'Ficheiro de definição inexistente', |
|
| 155 | + 'erreur_plugin_nom_fonction_interdit' => 'Nome de função interdito', |
|
| 156 | + 'erreur_plugin_nom_manquant' => 'Nome de plugin inexistente', |
|
| 157 | + 'erreur_plugin_prefix_manquant' => 'Espaço de criação de nome não definido para este plugin ', |
|
| 158 | + 'erreur_plugin_tag_plugin_absent' => '<plugin> inexistente no ficheiro de definição', |
|
| 159 | + 'erreur_plugin_version_manquant' => 'Versão de plugin inexistente', |
|
| 160 | + 'erreur_type_fichier' => 'Tipo de ficheiro incorrecto', |
|
| 161 | 161 | |
| 162 | - // H |
|
| 163 | - 'htaccess_a_simuler' => 'Atenção: a configuração do servidor HTTP ignora @htaccess@. Para garantir uma boa segurança, deve alterar esta configuração. Alternativamente, deve assegurar que as constantes @constantes@ (definíveis no ficheiro mes_options.php) têm como valores diretórios fora de @document_root@.', |
|
| 164 | - 'htaccess_inoperant' => 'htaccess inoperacional', |
|
| 162 | + // H |
|
| 163 | + 'htaccess_a_simuler' => 'Atenção: a configuração do servidor HTTP ignora @htaccess@. Para garantir uma boa segurança, deve alterar esta configuração. Alternativamente, deve assegurar que as constantes @constantes@ (definíveis no ficheiro mes_options.php) têm como valores diretórios fora de @document_root@.', |
|
| 164 | + 'htaccess_inoperant' => 'htaccess inoperacional', |
|
| 165 | 165 | |
| 166 | - // I |
|
| 167 | - 'ical_info1' => 'Esta página apresenta muitos modos de permanecer em contacto com as actividades deste sítio.', |
|
| 168 | - 'ical_info2' => 'Para mais informações sobre estas técnicas, consultar <a href="@spipnet@">a documentação de SPIP</a>.', |
|
| 169 | - 'ical_info_calendrier' => 'Estão disponíveis dois calendários. O primeiro é uma planta do sítio anunciando todos os artigos publicados. O segundo é pessoal e contém os anúncios editoriais assim como as últimas mensagens privadas : está reservado para si graças a uma chave pessoal, que pode modificar a qualquer momento com a renovação da sua palavra-passe.', |
|
| 170 | - 'ical_methode_http' => 'Download', |
|
| 171 | - 'ical_methode_webcal' => 'Sincronização (webcal://)', |
|
| 172 | - 'ical_texte_js' => 'Uma linha de javascript permite-lhe facilmente exibir, em qualquer sítio que lhe pertença, os artigos recentes publicados neste sítio.', |
|
| 173 | - 'ical_texte_prive' => 'Este calendário, de uso estritamente pessoal, informa sobre a actividade editorial privada deste sítio (tarefas e encontros pessoais, artigos e notícias propostos...).', |
|
| 174 | - 'ical_texte_public' => 'Este calendário permite acompanhar a actividade pública deste sítio (artigos e notícias publicados).', |
|
| 175 | - 'ical_texte_rss' => 'Pode vincular as novidades deste sítio em qualquer leitor de ficheiros de formato XML/RSS (Rich Site Summary). É também o formato que permite a SPIP ler as novidades publicadas em outros sítios que utilizam um formato de troca compatível.', |
|
| 176 | - 'ical_titre_js' => 'Javascript', |
|
| 177 | - 'ical_titre_mailing' => 'Mailing-list', |
|
| 178 | - 'ical_titre_rss' => 'Ficheiros « backend »', |
|
| 179 | - 'icone_accueil' => 'Início', |
|
| 180 | - 'icone_activer_cookie' => 'Activar o cookie de correspondência', |
|
| 181 | - 'icone_activite' => 'Actividade', |
|
| 182 | - 'icone_admin_plugin' => 'Gerir plugins', |
|
| 183 | - 'icone_administration' => 'Manutenção', |
|
| 184 | - 'icone_afficher_auteurs' => 'Exibir os autores', |
|
| 185 | - 'icone_afficher_visiteurs' => 'Exibir os visitantes', |
|
| 186 | - 'icone_arret_discussion' => 'Não voltar a participar nesta discussão', |
|
| 187 | - 'icone_calendrier' => 'Calendário', |
|
| 188 | - 'icone_configuration' => 'Configuração', |
|
| 189 | - 'icone_creer_auteur' => 'Criar um novo autor e associá-lo a este artigo', |
|
| 190 | - 'icone_creer_mot_cle' => 'Criar uma nova palavra-chave e vinculá-la a este artigo', |
|
| 191 | - 'icone_creer_rubrique_2' => 'Criar uma nova rubrica', |
|
| 192 | - 'icone_developpement' => 'Desenvolvimento', |
|
| 193 | - 'icone_edition' => 'Editar', |
|
| 194 | - 'icone_ma_langue' => 'Idioma', |
|
| 195 | - 'icone_mes_infos' => 'Minhas informações', |
|
| 196 | - 'icone_mes_preferences' => 'Preferências', |
|
| 197 | - 'icone_modifier_article' => 'Modificar este artigo', |
|
| 198 | - 'icone_modifier_rubrique' => 'Modificar esta rubrica', |
|
| 199 | - 'icone_publication' => 'Publicação', |
|
| 200 | - 'icone_relancer_signataire' => 'Contactar o signatário novamente', |
|
| 201 | - 'icone_retour' => 'Voltar', |
|
| 202 | - 'icone_retour_article' => 'Voltar ao artigo', |
|
| 203 | - 'icone_squelette' => 'Modelos', |
|
| 204 | - 'icone_suivi_publication' => 'Monitorização da publicação', |
|
| 205 | - 'icone_supprimer_cookie' => 'Suprimir o cookie de correspondência', |
|
| 206 | - 'icone_supprimer_rubrique' => 'Suprimir esta rubrica', |
|
| 207 | - 'icone_supprimer_signature' => 'Suprimir esta assinatura', |
|
| 208 | - 'icone_valider_signature' => 'Validar esta assinatura', |
|
| 209 | - 'image_administrer_rubrique' => 'Pode administrar esta rubrica', |
|
| 210 | - 'impossible_modifier_login_auteur' => 'Impossível alterar o login.', |
|
| 211 | - 'impossible_modifier_pass_auteur' => 'Impossível alterar a palavra-passe.', |
|
| 212 | - 'info_1_article' => '1 artigo', |
|
| 213 | - 'info_1_auteur' => '1 autor', |
|
| 214 | - 'info_1_message' => '1 mensagem', |
|
| 215 | - 'info_1_mot_cle' => '1 palavra-chave', |
|
| 216 | - 'info_1_rubrique' => '1 rubrica', |
|
| 217 | - 'info_1_visiteur' => '1 visitante', |
|
| 218 | - 'info_activer_cookie' => 'Pode activar um <b>cookie de correspondência</b>, o que lhe |
|
| 166 | + // I |
|
| 167 | + 'ical_info1' => 'Esta página apresenta muitos modos de permanecer em contacto com as actividades deste sítio.', |
|
| 168 | + 'ical_info2' => 'Para mais informações sobre estas técnicas, consultar <a href="@spipnet@">a documentação de SPIP</a>.', |
|
| 169 | + 'ical_info_calendrier' => 'Estão disponíveis dois calendários. O primeiro é uma planta do sítio anunciando todos os artigos publicados. O segundo é pessoal e contém os anúncios editoriais assim como as últimas mensagens privadas : está reservado para si graças a uma chave pessoal, que pode modificar a qualquer momento com a renovação da sua palavra-passe.', |
|
| 170 | + 'ical_methode_http' => 'Download', |
|
| 171 | + 'ical_methode_webcal' => 'Sincronização (webcal://)', |
|
| 172 | + 'ical_texte_js' => 'Uma linha de javascript permite-lhe facilmente exibir, em qualquer sítio que lhe pertença, os artigos recentes publicados neste sítio.', |
|
| 173 | + 'ical_texte_prive' => 'Este calendário, de uso estritamente pessoal, informa sobre a actividade editorial privada deste sítio (tarefas e encontros pessoais, artigos e notícias propostos...).', |
|
| 174 | + 'ical_texte_public' => 'Este calendário permite acompanhar a actividade pública deste sítio (artigos e notícias publicados).', |
|
| 175 | + 'ical_texte_rss' => 'Pode vincular as novidades deste sítio em qualquer leitor de ficheiros de formato XML/RSS (Rich Site Summary). É também o formato que permite a SPIP ler as novidades publicadas em outros sítios que utilizam um formato de troca compatível.', |
|
| 176 | + 'ical_titre_js' => 'Javascript', |
|
| 177 | + 'ical_titre_mailing' => 'Mailing-list', |
|
| 178 | + 'ical_titre_rss' => 'Ficheiros « backend »', |
|
| 179 | + 'icone_accueil' => 'Início', |
|
| 180 | + 'icone_activer_cookie' => 'Activar o cookie de correspondência', |
|
| 181 | + 'icone_activite' => 'Actividade', |
|
| 182 | + 'icone_admin_plugin' => 'Gerir plugins', |
|
| 183 | + 'icone_administration' => 'Manutenção', |
|
| 184 | + 'icone_afficher_auteurs' => 'Exibir os autores', |
|
| 185 | + 'icone_afficher_visiteurs' => 'Exibir os visitantes', |
|
| 186 | + 'icone_arret_discussion' => 'Não voltar a participar nesta discussão', |
|
| 187 | + 'icone_calendrier' => 'Calendário', |
|
| 188 | + 'icone_configuration' => 'Configuração', |
|
| 189 | + 'icone_creer_auteur' => 'Criar um novo autor e associá-lo a este artigo', |
|
| 190 | + 'icone_creer_mot_cle' => 'Criar uma nova palavra-chave e vinculá-la a este artigo', |
|
| 191 | + 'icone_creer_rubrique_2' => 'Criar uma nova rubrica', |
|
| 192 | + 'icone_developpement' => 'Desenvolvimento', |
|
| 193 | + 'icone_edition' => 'Editar', |
|
| 194 | + 'icone_ma_langue' => 'Idioma', |
|
| 195 | + 'icone_mes_infos' => 'Minhas informações', |
|
| 196 | + 'icone_mes_preferences' => 'Preferências', |
|
| 197 | + 'icone_modifier_article' => 'Modificar este artigo', |
|
| 198 | + 'icone_modifier_rubrique' => 'Modificar esta rubrica', |
|
| 199 | + 'icone_publication' => 'Publicação', |
|
| 200 | + 'icone_relancer_signataire' => 'Contactar o signatário novamente', |
|
| 201 | + 'icone_retour' => 'Voltar', |
|
| 202 | + 'icone_retour_article' => 'Voltar ao artigo', |
|
| 203 | + 'icone_squelette' => 'Modelos', |
|
| 204 | + 'icone_suivi_publication' => 'Monitorização da publicação', |
|
| 205 | + 'icone_supprimer_cookie' => 'Suprimir o cookie de correspondência', |
|
| 206 | + 'icone_supprimer_rubrique' => 'Suprimir esta rubrica', |
|
| 207 | + 'icone_supprimer_signature' => 'Suprimir esta assinatura', |
|
| 208 | + 'icone_valider_signature' => 'Validar esta assinatura', |
|
| 209 | + 'image_administrer_rubrique' => 'Pode administrar esta rubrica', |
|
| 210 | + 'impossible_modifier_login_auteur' => 'Impossível alterar o login.', |
|
| 211 | + 'impossible_modifier_pass_auteur' => 'Impossível alterar a palavra-passe.', |
|
| 212 | + 'info_1_article' => '1 artigo', |
|
| 213 | + 'info_1_auteur' => '1 autor', |
|
| 214 | + 'info_1_message' => '1 mensagem', |
|
| 215 | + 'info_1_mot_cle' => '1 palavra-chave', |
|
| 216 | + 'info_1_rubrique' => '1 rubrica', |
|
| 217 | + 'info_1_visiteur' => '1 visitante', |
|
| 218 | + 'info_activer_cookie' => 'Pode activar um <b>cookie de correspondência</b>, o que lhe |
|
| 219 | 219 | permitirá passar facilmente do sítio público ao sítio privado ', |
| 220 | - 'info_activer_menu_developpement' => 'Mostrar o menu Desenvolvimento', |
|
| 221 | - 'info_admin_etre_webmestre' => 'Conceder-me os direitos de webmaster', |
|
| 222 | - 'info_admin_je_suis_webmestre' => 'Eu sou <b>webmaster</b>', |
|
| 223 | - 'info_admin_statuer_webmestre' => 'Conceder ao administrador os direitos de webmaster', |
|
| 224 | - 'info_admin_webmestre' => 'Este administrador é <b>webmaster</b>', |
|
| 225 | - 'info_administrateur' => 'Administrador', |
|
| 226 | - 'info_administrateur_1' => 'Administrador', |
|
| 227 | - 'info_administrateur_2' => 'do sítio (<i>utilize com precaução</i>)', |
|
| 228 | - 'info_administrateur_site_01' => 'Se for o administrador do sítio, por favor', |
|
| 229 | - 'info_administrateur_site_02' => 'clicar sobre esta ligação', |
|
| 230 | - 'info_administrateurs' => 'Administradores', |
|
| 231 | - 'info_administrer_rubrique' => 'Pode administrar esta rubrica', |
|
| 232 | - 'info_adresse' => 'ao endereço :', |
|
| 233 | - 'info_adresse_desinscription' => 'Endereço de cancelamento da subscrição: ', |
|
| 234 | - 'info_adresse_url' => 'Endereço (URL) do sítio público', |
|
| 235 | - 'info_afficher_par_nb' => 'Exibir', |
|
| 236 | - 'info_aide_en_ligne' => 'Ajuda online SPIP', |
|
| 237 | - 'info_ajout_image' => 'Quando acrescentar imagens como documentos ligados a um artigo, |
|
| 220 | + 'info_activer_menu_developpement' => 'Mostrar o menu Desenvolvimento', |
|
| 221 | + 'info_admin_etre_webmestre' => 'Conceder-me os direitos de webmaster', |
|
| 222 | + 'info_admin_je_suis_webmestre' => 'Eu sou <b>webmaster</b>', |
|
| 223 | + 'info_admin_statuer_webmestre' => 'Conceder ao administrador os direitos de webmaster', |
|
| 224 | + 'info_admin_webmestre' => 'Este administrador é <b>webmaster</b>', |
|
| 225 | + 'info_administrateur' => 'Administrador', |
|
| 226 | + 'info_administrateur_1' => 'Administrador', |
|
| 227 | + 'info_administrateur_2' => 'do sítio (<i>utilize com precaução</i>)', |
|
| 228 | + 'info_administrateur_site_01' => 'Se for o administrador do sítio, por favor', |
|
| 229 | + 'info_administrateur_site_02' => 'clicar sobre esta ligação', |
|
| 230 | + 'info_administrateurs' => 'Administradores', |
|
| 231 | + 'info_administrer_rubrique' => 'Pode administrar esta rubrica', |
|
| 232 | + 'info_adresse' => 'ao endereço :', |
|
| 233 | + 'info_adresse_desinscription' => 'Endereço de cancelamento da subscrição: ', |
|
| 234 | + 'info_adresse_url' => 'Endereço (URL) do sítio público', |
|
| 235 | + 'info_afficher_par_nb' => 'Exibir', |
|
| 236 | + 'info_aide_en_ligne' => 'Ajuda online SPIP', |
|
| 237 | + 'info_ajout_image' => 'Quando acrescentar imagens como documentos ligados a um artigo, |
|
| 238 | 238 | SPIP pode criar para si, automaticamente, vinhetas (miniaturas) das |
| 239 | 239 | imagens inseridas. Isso permite por exemplo criar |
| 240 | 240 | automaticamente uma galeria ou um portfolio.', |
| 241 | - 'info_ajouter_rubrique' => 'Acrescentar uma rubrica a administrar :', |
|
| 242 | - 'info_annonce_nouveautes' => 'Anúncio das novidades', |
|
| 243 | - 'info_article' => 'artigo', |
|
| 244 | - 'info_article_2' => 'artigos', |
|
| 245 | - 'info_article_a_paraitre' => 'Os artigos pós-datados a publicar', |
|
| 246 | - 'info_articles_02' => 'artigos', |
|
| 247 | - 'info_articles_2' => 'Artigos', |
|
| 248 | - 'info_articles_auteur' => 'Os artigos deste autor', |
|
| 249 | - 'info_articles_miens' => 'Os meus artigos', |
|
| 250 | - 'info_articles_tous' => 'Todos os artigos', |
|
| 251 | - 'info_articles_trouves' => 'Artigos encontrados', |
|
| 252 | - 'info_attente_validation' => 'Os seus artigos à espera de validação', |
|
| 253 | - 'info_aucun_article' => 'Nenhum artigo', |
|
| 254 | - 'info_aucun_auteur' => 'Nenhum autor', |
|
| 255 | - 'info_aucun_message' => 'Sem mensagens', |
|
| 256 | - 'info_aucun_rubrique' => 'Sem rubricas', |
|
| 257 | - 'info_aujourdhui' => 'hoje :', |
|
| 258 | - 'info_auteur_gere_rubriques' => 'Este autor gere as seguintes secções:', |
|
| 259 | - 'info_auteur_gere_toutes_rubriques' => 'Este autor gere <b>todas as secções</b>', |
|
| 260 | - 'info_auteur_gere_toutes_rubriques_2' => 'Eu administro <b>todas as rubricas</b>', |
|
| 261 | - 'info_auteurs' => 'Os autores', |
|
| 262 | - 'info_auteurs_par_tri' => 'Autores@partri@', |
|
| 263 | - 'info_auteurs_trouves' => 'Autores encontrados', |
|
| 264 | - 'info_authentification_externe' => 'Autenticação externa', |
|
| 265 | - 'info_avertissement' => 'Aviso', |
|
| 266 | - 'info_barre_outils' => 'com a sua barra de ferramentas?', |
|
| 267 | - 'info_base_installee' => 'A estrutura da sua base de dados está instalada.', |
|
| 268 | - 'info_bio' => 'Biografia', |
|
| 269 | - 'info_cache_desactive' => 'A cache encontra-se temporariamente desactivada.', |
|
| 270 | - 'info_chapeau' => 'Cabeçalho', |
|
| 271 | - 'info_chapeau_2' => 'Cabeçalho :', |
|
| 272 | - 'info_chemin_acces_1' => 'Opções : <b>Caminho de acesso no diretório</b>', |
|
| 273 | - 'info_chemin_acces_2' => 'Doravante, deve configurar o caminho de acesso às informações no anuário. Esta informação é indispensável para ler os perfis de utilizador armazenados no anuário.', |
|
| 274 | - 'info_chemin_acces_annuaire' => 'Opções : <b>Caminho de acesso no diretório', |
|
| 275 | - 'info_choix_base' => 'Terceira etapa :', |
|
| 276 | - 'info_classement_1' => '<sup>er</sup> no @liste@', |
|
| 277 | - 'info_classement_2' => '<sup>e</sup> no @liste@', |
|
| 278 | - 'info_code_acces' => 'Não se esqueça dos seus próprios códigos de acesso !', |
|
| 279 | - 'info_config_suivi' => 'Se este endereço corresponder a uma mailing-list, pode indicar, a seguir, o endereço no qual os participantes no sítio podem inscrever-se. Este endereço pode ser uma URL (por exemplo a página de inscrição na lista pela Web), ou um endereço email com um assunto específico (por exemplo: <tt>@adresse_suivi@?subject=subscribe</tt>):', |
|
| 280 | - 'info_config_suivi_explication' => ' Pode assinar a mailing-list deste sítio. Receberá então, por correio electrónico, os anúncios de artigos e de notícias propostos para publicação.', |
|
| 281 | - 'info_confirmer_passe' => 'Confirmar esta nova palavra-passe', |
|
| 282 | - 'info_conflit_edition_avis_non_sauvegarde' => 'Atenção: os campos seguintes foram modificados anteriormente. As suas alterações a estes campos não foram portanto guardadas. ', |
|
| 283 | - 'info_conflit_edition_differences' => 'Diferenças:', |
|
| 284 | - 'info_conflit_edition_version_enregistree' => 'Versão guardada :', |
|
| 285 | - 'info_conflit_edition_votre_version' => 'A sua versão:', |
|
| 286 | - 'info_connexion_base' => 'Segunda etapa: <b>Teste de ligação à base de dados</b>', |
|
| 287 | - 'info_connexion_base_donnee' => 'Ligação à sua base de dados', |
|
| 288 | - 'info_connexion_ldap_ok' => 'A ligação LDAP foi bem sucedida.</b><p> Pode passar para a etapa seguinte.</p>', |
|
| 289 | - 'info_connexion_mysql' => 'Primeira etapa : <b>A sua ligação SQL<b>', |
|
| 290 | - 'info_connexion_ok' => 'A ligação foi bem sucedida.', |
|
| 291 | - 'info_contact' => 'Contacto', |
|
| 292 | - 'info_contenu_articles' => 'Conteúdo dos artigos', |
|
| 293 | - 'info_contributions' => 'Contributos', |
|
| 294 | - 'info_creation_paragraphe' => 'Para criar parágrafos, deixe simplesmente linhas vazias.', |
|
| 295 | - 'info_creation_rubrique' => 'Antes de poder escrever artigos, <br />deve criar pelo menos uma rubrica.<br />', |
|
| 296 | - 'info_creation_tables' => 'Quarta etapa : <b>Criação das tabelas da base de dados<b>', |
|
| 297 | - 'info_creer_base' => '<b>Criar</b> uma nova base de dados', |
|
| 298 | - 'info_dans_rubrique' => 'Na rubrica :', |
|
| 299 | - 'info_date_publication_anterieure' => 'Data de publicação anterior:', |
|
| 300 | - 'info_date_referencement' => 'DATA DE REFERENCIAMENTO DESTE SÍTIO :', |
|
| 301 | - 'info_derniere_etape' => 'Última etapa : <b>Terminou !', |
|
| 302 | - 'info_descriptif' => 'Descrição:', |
|
| 303 | - 'info_desinstaller_plugin' => 'elimina os dados e desactiva o plugin', |
|
| 304 | - 'info_discussion_cours' => 'Discussões em curso', |
|
| 305 | - 'info_ecrire_article' => 'Antes de poder escrever artigos, deve criar pelo menos uma rubrica.', |
|
| 306 | - 'info_email_envoi' => 'Endereço de email de envio (opcional)', |
|
| 307 | - 'info_email_envoi_txt' => 'Indique aqui o endereço a utilizar para enviar os emails (se não for o caso, o endereço do destinatário será utilizado como endereço de envio) :', |
|
| 308 | - 'info_email_webmestre' => 'Endereço e-mail do webmaster ', |
|
| 309 | - 'info_envoi_email_automatique' => 'Envio automático de mails', |
|
| 310 | - 'info_envoyer_maintenant' => 'Enviar agora', |
|
| 311 | - 'info_etape_suivante' => 'Passar para a seguinte etapa', |
|
| 312 | - 'info_etape_suivante_1' => 'Pode passar para a etapa seguinte', |
|
| 313 | - 'info_etape_suivante_2' => 'Pode passar para a etapa seguinte', |
|
| 314 | - 'info_exceptions_proxy' => 'Excepções para o proxy', |
|
| 315 | - 'info_exportation_base' => 'exportação da base para @archive@', |
|
| 316 | - 'info_facilite_suivi_activite' => 'A fim de facilitar o acompanhamento da actividade |
|
| 241 | + 'info_ajouter_rubrique' => 'Acrescentar uma rubrica a administrar :', |
|
| 242 | + 'info_annonce_nouveautes' => 'Anúncio das novidades', |
|
| 243 | + 'info_article' => 'artigo', |
|
| 244 | + 'info_article_2' => 'artigos', |
|
| 245 | + 'info_article_a_paraitre' => 'Os artigos pós-datados a publicar', |
|
| 246 | + 'info_articles_02' => 'artigos', |
|
| 247 | + 'info_articles_2' => 'Artigos', |
|
| 248 | + 'info_articles_auteur' => 'Os artigos deste autor', |
|
| 249 | + 'info_articles_miens' => 'Os meus artigos', |
|
| 250 | + 'info_articles_tous' => 'Todos os artigos', |
|
| 251 | + 'info_articles_trouves' => 'Artigos encontrados', |
|
| 252 | + 'info_attente_validation' => 'Os seus artigos à espera de validação', |
|
| 253 | + 'info_aucun_article' => 'Nenhum artigo', |
|
| 254 | + 'info_aucun_auteur' => 'Nenhum autor', |
|
| 255 | + 'info_aucun_message' => 'Sem mensagens', |
|
| 256 | + 'info_aucun_rubrique' => 'Sem rubricas', |
|
| 257 | + 'info_aujourdhui' => 'hoje :', |
|
| 258 | + 'info_auteur_gere_rubriques' => 'Este autor gere as seguintes secções:', |
|
| 259 | + 'info_auteur_gere_toutes_rubriques' => 'Este autor gere <b>todas as secções</b>', |
|
| 260 | + 'info_auteur_gere_toutes_rubriques_2' => 'Eu administro <b>todas as rubricas</b>', |
|
| 261 | + 'info_auteurs' => 'Os autores', |
|
| 262 | + 'info_auteurs_par_tri' => 'Autores@partri@', |
|
| 263 | + 'info_auteurs_trouves' => 'Autores encontrados', |
|
| 264 | + 'info_authentification_externe' => 'Autenticação externa', |
|
| 265 | + 'info_avertissement' => 'Aviso', |
|
| 266 | + 'info_barre_outils' => 'com a sua barra de ferramentas?', |
|
| 267 | + 'info_base_installee' => 'A estrutura da sua base de dados está instalada.', |
|
| 268 | + 'info_bio' => 'Biografia', |
|
| 269 | + 'info_cache_desactive' => 'A cache encontra-se temporariamente desactivada.', |
|
| 270 | + 'info_chapeau' => 'Cabeçalho', |
|
| 271 | + 'info_chapeau_2' => 'Cabeçalho :', |
|
| 272 | + 'info_chemin_acces_1' => 'Opções : <b>Caminho de acesso no diretório</b>', |
|
| 273 | + 'info_chemin_acces_2' => 'Doravante, deve configurar o caminho de acesso às informações no anuário. Esta informação é indispensável para ler os perfis de utilizador armazenados no anuário.', |
|
| 274 | + 'info_chemin_acces_annuaire' => 'Opções : <b>Caminho de acesso no diretório', |
|
| 275 | + 'info_choix_base' => 'Terceira etapa :', |
|
| 276 | + 'info_classement_1' => '<sup>er</sup> no @liste@', |
|
| 277 | + 'info_classement_2' => '<sup>e</sup> no @liste@', |
|
| 278 | + 'info_code_acces' => 'Não se esqueça dos seus próprios códigos de acesso !', |
|
| 279 | + 'info_config_suivi' => 'Se este endereço corresponder a uma mailing-list, pode indicar, a seguir, o endereço no qual os participantes no sítio podem inscrever-se. Este endereço pode ser uma URL (por exemplo a página de inscrição na lista pela Web), ou um endereço email com um assunto específico (por exemplo: <tt>@adresse_suivi@?subject=subscribe</tt>):', |
|
| 280 | + 'info_config_suivi_explication' => ' Pode assinar a mailing-list deste sítio. Receberá então, por correio electrónico, os anúncios de artigos e de notícias propostos para publicação.', |
|
| 281 | + 'info_confirmer_passe' => 'Confirmar esta nova palavra-passe', |
|
| 282 | + 'info_conflit_edition_avis_non_sauvegarde' => 'Atenção: os campos seguintes foram modificados anteriormente. As suas alterações a estes campos não foram portanto guardadas. ', |
|
| 283 | + 'info_conflit_edition_differences' => 'Diferenças:', |
|
| 284 | + 'info_conflit_edition_version_enregistree' => 'Versão guardada :', |
|
| 285 | + 'info_conflit_edition_votre_version' => 'A sua versão:', |
|
| 286 | + 'info_connexion_base' => 'Segunda etapa: <b>Teste de ligação à base de dados</b>', |
|
| 287 | + 'info_connexion_base_donnee' => 'Ligação à sua base de dados', |
|
| 288 | + 'info_connexion_ldap_ok' => 'A ligação LDAP foi bem sucedida.</b><p> Pode passar para a etapa seguinte.</p>', |
|
| 289 | + 'info_connexion_mysql' => 'Primeira etapa : <b>A sua ligação SQL<b>', |
|
| 290 | + 'info_connexion_ok' => 'A ligação foi bem sucedida.', |
|
| 291 | + 'info_contact' => 'Contacto', |
|
| 292 | + 'info_contenu_articles' => 'Conteúdo dos artigos', |
|
| 293 | + 'info_contributions' => 'Contributos', |
|
| 294 | + 'info_creation_paragraphe' => 'Para criar parágrafos, deixe simplesmente linhas vazias.', |
|
| 295 | + 'info_creation_rubrique' => 'Antes de poder escrever artigos, <br />deve criar pelo menos uma rubrica.<br />', |
|
| 296 | + 'info_creation_tables' => 'Quarta etapa : <b>Criação das tabelas da base de dados<b>', |
|
| 297 | + 'info_creer_base' => '<b>Criar</b> uma nova base de dados', |
|
| 298 | + 'info_dans_rubrique' => 'Na rubrica :', |
|
| 299 | + 'info_date_publication_anterieure' => 'Data de publicação anterior:', |
|
| 300 | + 'info_date_referencement' => 'DATA DE REFERENCIAMENTO DESTE SÍTIO :', |
|
| 301 | + 'info_derniere_etape' => 'Última etapa : <b>Terminou !', |
|
| 302 | + 'info_descriptif' => 'Descrição:', |
|
| 303 | + 'info_desinstaller_plugin' => 'elimina os dados e desactiva o plugin', |
|
| 304 | + 'info_discussion_cours' => 'Discussões em curso', |
|
| 305 | + 'info_ecrire_article' => 'Antes de poder escrever artigos, deve criar pelo menos uma rubrica.', |
|
| 306 | + 'info_email_envoi' => 'Endereço de email de envio (opcional)', |
|
| 307 | + 'info_email_envoi_txt' => 'Indique aqui o endereço a utilizar para enviar os emails (se não for o caso, o endereço do destinatário será utilizado como endereço de envio) :', |
|
| 308 | + 'info_email_webmestre' => 'Endereço e-mail do webmaster ', |
|
| 309 | + 'info_envoi_email_automatique' => 'Envio automático de mails', |
|
| 310 | + 'info_envoyer_maintenant' => 'Enviar agora', |
|
| 311 | + 'info_etape_suivante' => 'Passar para a seguinte etapa', |
|
| 312 | + 'info_etape_suivante_1' => 'Pode passar para a etapa seguinte', |
|
| 313 | + 'info_etape_suivante_2' => 'Pode passar para a etapa seguinte', |
|
| 314 | + 'info_exceptions_proxy' => 'Excepções para o proxy', |
|
| 315 | + 'info_exportation_base' => 'exportação da base para @archive@', |
|
| 316 | + 'info_facilite_suivi_activite' => 'A fim de facilitar o acompanhamento da actividade |
|
| 317 | 317 | editorial do sítio, SPIP pode fazer chegar por email, por exemplo |
| 318 | 318 | a uma <i>mailing-list</i> dos redactores, o anúncio dos pedidos de |
| 319 | 319 | publicação e das validações de artigos.', |
| 320 | - 'info_fichiers_authent' => 'Ficheiros de autenticação « .htpasswd »', |
|
| 321 | - 'info_forums_abo_invites' => 'O seu sítio contém fóruns por assinatura; os visitantes são convidados a registar-se no sítio público.', |
|
| 322 | - 'info_gauche_admin_tech' => '<b>Esta página está acessível apenas aos responsáveis pelo site.</b><p> Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao sítio.</p>', |
|
| 323 | - 'info_gauche_admin_vider' => '<b>Esta página é acessível apenas aos responsáveis pelo sítio.</b><p> Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao sítio web</p>', |
|
| 324 | - 'info_gauche_auteurs' => 'Encontrará aqui todos os autores do sítio. |
|
| 320 | + 'info_fichiers_authent' => 'Ficheiros de autenticação « .htpasswd »', |
|
| 321 | + 'info_forums_abo_invites' => 'O seu sítio contém fóruns por assinatura; os visitantes são convidados a registar-se no sítio público.', |
|
| 322 | + 'info_gauche_admin_tech' => '<b>Esta página está acessível apenas aos responsáveis pelo site.</b><p> Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao sítio.</p>', |
|
| 323 | + 'info_gauche_admin_vider' => '<b>Esta página é acessível apenas aos responsáveis pelo sítio.</b><p> Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao sítio web</p>', |
|
| 324 | + 'info_gauche_auteurs' => 'Encontrará aqui todos os autores do sítio. |
|
| 325 | 325 | Os estatuto dos autores é indicado pela cor dos ícones (administrador = verde; redactor = amarelo).', |
| 326 | - 'info_gauche_auteurs_exterieurs' => 'Os autores externos, sem acesso ao sítio, são indicados por um ícone azul; |
|
| 326 | + 'info_gauche_auteurs_exterieurs' => 'Os autores externos, sem acesso ao sítio, são indicados por um ícone azul; |
|
| 327 | 327 | os autores apagados, por um ícone cinzento.', |
| 328 | - 'info_gauche_messagerie' => 'A caixa de correio permite-lhe trocar mensagens entre redactores, conservar memorandos (para o seu uso pessoal) ou exibir anúncios na página de abertura do espaço privado (se for administrador).', |
|
| 329 | - 'info_gauche_statistiques_referers' => 'Esta página apresenta a lista dos <i>referers</i>, ou seja, dos sítios que contêm links para o seu sítio, unicamente para ontem e hoje; esta lista é actualizada a cada 24 horas.', |
|
| 330 | - 'info_gauche_visiteurs_enregistres' => 'Encontrará aqui os visitantes registados |
|
| 328 | + 'info_gauche_messagerie' => 'A caixa de correio permite-lhe trocar mensagens entre redactores, conservar memorandos (para o seu uso pessoal) ou exibir anúncios na página de abertura do espaço privado (se for administrador).', |
|
| 329 | + 'info_gauche_statistiques_referers' => 'Esta página apresenta a lista dos <i>referers</i>, ou seja, dos sítios que contêm links para o seu sítio, unicamente para ontem e hoje; esta lista é actualizada a cada 24 horas.', |
|
| 330 | + 'info_gauche_visiteurs_enregistres' => 'Encontrará aqui os visitantes registados |
|
| 331 | 331 | no espaço público do sítio (fóruns por assinatura).', |
| 332 | - 'info_generation_miniatures_images' => 'Geração de miniaturas das imagens', |
|
| 333 | - 'info_gerer_trad_objets' => '@objets@ : gerir as ligações de tradução', |
|
| 334 | - 'info_hebergeur_desactiver_envoi_email' => 'Alguns serviços de hospedagem desactivam o envio automático de |
|
| 332 | + 'info_generation_miniatures_images' => 'Geração de miniaturas das imagens', |
|
| 333 | + 'info_gerer_trad_objets' => '@objets@ : gerir as ligações de tradução', |
|
| 334 | + 'info_hebergeur_desactiver_envoi_email' => 'Alguns serviços de hospedagem desactivam o envio automático de |
|
| 335 | 335 | e-mails a partir dos seus servidores. Nesse caso, as seguintes |
| 336 | 336 | funcionalidades de SPIP não funcionarão.', |
| 337 | - 'info_hier' => 'ontem :', |
|
| 338 | - 'info_identification_publique' => 'A sua identidade pública...', |
|
| 339 | - 'info_image_process' => 'Seleccione o melhor método para criar as vinhetas clicando sobre a imagem correspondente.', |
|
| 340 | - 'info_image_process2' => '<b>N.B.</b> <i> Se nenhuma imagem aparece, então o servidor que alberga o seu sítio não foi configurado para utilizar tais ferramentas. Se deseja utilizar essas funções, contacte o responsavel técnico e peça as extensões «GD» ou «Imagick».</i>', |
|
| 341 | - 'info_images_auto' => 'Imagens calculadas automaticamente', |
|
| 342 | - 'info_informations_personnelles' => 'Quinta etapa : <b>Informações pessoais<b>', |
|
| 343 | - 'info_inscription' => 'Inscrição em ', |
|
| 344 | - 'info_inscription_automatique' => 'Inscrição automática de novos redactores', |
|
| 345 | - 'info_jeu_caractere' => 'Conjunto de caracteres do sítio', |
|
| 346 | - 'info_jours' => 'dias', |
|
| 347 | - 'info_laisser_champs_vides' => 'deixar estes campos vazios)', |
|
| 348 | - 'info_langues' => 'Idiomas do sítio', |
|
| 349 | - 'info_ldap_ok' => 'A autenticação LDAP está instalada.', |
|
| 350 | - 'info_lien_hypertexte' => 'Hiperligação :', |
|
| 351 | - 'info_liste_nouveautes_envoyee' => 'A lista de novidades foi enviada.', |
|
| 352 | - 'info_liste_redacteurs_connectes' => 'Lista dos redactores ligados', |
|
| 353 | - 'info_login_existant' => 'Este login já existe.', |
|
| 354 | - 'info_login_trop_court' => 'Login demasiado curto.', |
|
| 355 | - 'info_login_trop_court_car_pluriel' => 'O login deve conter pelo menos @nb@ caracteres.', |
|
| 356 | - 'info_logos' => 'Os logos', |
|
| 357 | - 'info_maximum' => 'máximo :', |
|
| 358 | - 'info_meme_rubrique' => 'Na mesma rubrica', |
|
| 359 | - 'info_message_en_redaction' => 'As suas mensagens em rascunho', |
|
| 360 | - 'info_message_technique' => 'Mensagem técnica:', |
|
| 361 | - 'info_messagerie_interne' => 'Correio interno', |
|
| 362 | - 'info_mise_a_niveau_base' => 'melhoramento da sua base de dados SQL', |
|
| 363 | - 'info_mise_a_niveau_base_2' => '{{Atenção!}} Instalou uma versão |
|
| 337 | + 'info_hier' => 'ontem :', |
|
| 338 | + 'info_identification_publique' => 'A sua identidade pública...', |
|
| 339 | + 'info_image_process' => 'Seleccione o melhor método para criar as vinhetas clicando sobre a imagem correspondente.', |
|
| 340 | + 'info_image_process2' => '<b>N.B.</b> <i> Se nenhuma imagem aparece, então o servidor que alberga o seu sítio não foi configurado para utilizar tais ferramentas. Se deseja utilizar essas funções, contacte o responsavel técnico e peça as extensões «GD» ou «Imagick».</i>', |
|
| 341 | + 'info_images_auto' => 'Imagens calculadas automaticamente', |
|
| 342 | + 'info_informations_personnelles' => 'Quinta etapa : <b>Informações pessoais<b>', |
|
| 343 | + 'info_inscription' => 'Inscrição em ', |
|
| 344 | + 'info_inscription_automatique' => 'Inscrição automática de novos redactores', |
|
| 345 | + 'info_jeu_caractere' => 'Conjunto de caracteres do sítio', |
|
| 346 | + 'info_jours' => 'dias', |
|
| 347 | + 'info_laisser_champs_vides' => 'deixar estes campos vazios)', |
|
| 348 | + 'info_langues' => 'Idiomas do sítio', |
|
| 349 | + 'info_ldap_ok' => 'A autenticação LDAP está instalada.', |
|
| 350 | + 'info_lien_hypertexte' => 'Hiperligação :', |
|
| 351 | + 'info_liste_nouveautes_envoyee' => 'A lista de novidades foi enviada.', |
|
| 352 | + 'info_liste_redacteurs_connectes' => 'Lista dos redactores ligados', |
|
| 353 | + 'info_login_existant' => 'Este login já existe.', |
|
| 354 | + 'info_login_trop_court' => 'Login demasiado curto.', |
|
| 355 | + 'info_login_trop_court_car_pluriel' => 'O login deve conter pelo menos @nb@ caracteres.', |
|
| 356 | + 'info_logos' => 'Os logos', |
|
| 357 | + 'info_maximum' => 'máximo :', |
|
| 358 | + 'info_meme_rubrique' => 'Na mesma rubrica', |
|
| 359 | + 'info_message_en_redaction' => 'As suas mensagens em rascunho', |
|
| 360 | + 'info_message_technique' => 'Mensagem técnica:', |
|
| 361 | + 'info_messagerie_interne' => 'Correio interno', |
|
| 362 | + 'info_mise_a_niveau_base' => 'melhoramento da sua base de dados SQL', |
|
| 363 | + 'info_mise_a_niveau_base_2' => '{{Atenção!}} Instalou uma versão |
|
| 364 | 364 | dos ficheiros SPIP {anterior} à que se encontrava |
| 365 | 365 | antes neste sítio: a sua base de dados corre o risco de se perder |
| 366 | 366 | e o seu sítio já não funcionará .<br />{{Re-instalar os |
| 367 | 367 | ficheiros de SPIP.}}', |
| 368 | - 'info_modification_enregistree' => 'As suas modificações foram guardadas', |
|
| 369 | - 'info_modifier_auteur' => 'Modifcar o autor :', |
|
| 370 | - 'info_modifier_rubrique' => 'Modificar a rubrica :', |
|
| 371 | - 'info_modifier_titre' => 'Modificar : @titre@', |
|
| 372 | - 'info_mon_site_spip' => 'O meu sítio SPIP', |
|
| 373 | - 'info_moyenne' => 'média :', |
|
| 374 | - 'info_multi_cet_article' => 'Idioma deste artigo :', |
|
| 375 | - 'info_multi_langues_choisies' => 'Por favor seleccione a seguir os idiomas à disposição dos redactores do seu sítio. |
|
| 368 | + 'info_modification_enregistree' => 'As suas modificações foram guardadas', |
|
| 369 | + 'info_modifier_auteur' => 'Modifcar o autor :', |
|
| 370 | + 'info_modifier_rubrique' => 'Modificar a rubrica :', |
|
| 371 | + 'info_modifier_titre' => 'Modificar : @titre@', |
|
| 372 | + 'info_mon_site_spip' => 'O meu sítio SPIP', |
|
| 373 | + 'info_moyenne' => 'média :', |
|
| 374 | + 'info_multi_cet_article' => 'Idioma deste artigo :', |
|
| 375 | + 'info_multi_langues_choisies' => 'Por favor seleccione a seguir os idiomas à disposição dos redactores do seu sítio. |
|
| 376 | 376 | Os idiomas já utilizados no seu sítio (exibidos em primeiro lugar) não podem ser desactivados.', |
| 377 | - 'info_multi_objets' => '@objets@ : activar o menu de idioma', |
|
| 378 | - 'info_multi_secteurs' => '... só para as rubricas situadas na raíz ?', |
|
| 379 | - 'info_nb_articles' => '@nb@ artigos', |
|
| 380 | - 'info_nb_auteurs' => '@nb@ autores', |
|
| 381 | - 'info_nb_messages' => '@nb@ mensagens', |
|
| 382 | - 'info_nb_mots_cles' => '@nb@ palavras-chave', |
|
| 383 | - 'info_nb_rubriques' => '@nb@ rubricas', |
|
| 384 | - 'info_nb_visiteurs' => '@nb@ visitantes', |
|
| 385 | - 'info_nom' => 'Nome', |
|
| 386 | - 'info_nom_destinataire' => 'Nome do destinatário', |
|
| 387 | - 'info_nom_pas_conforme' => 'as tags html não são autorizadas', |
|
| 388 | - 'info_nom_site' => 'Nome do seu sítio', |
|
| 389 | - 'info_nombre_articles' => '@nb_articles@ artigos,', |
|
| 390 | - 'info_nombre_rubriques' => '@nb_rubriques@ rubricas,', |
|
| 391 | - 'info_nombre_sites' => '@nb_sites@ sítios,', |
|
| 392 | - 'info_non_deplacer' => 'Não deslocar...', |
|
| 393 | - 'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP pode enviar regularmente o anúncio das últimas novidades do sítio |
|
| 377 | + 'info_multi_objets' => '@objets@ : activar o menu de idioma', |
|
| 378 | + 'info_multi_secteurs' => '... só para as rubricas situadas na raíz ?', |
|
| 379 | + 'info_nb_articles' => '@nb@ artigos', |
|
| 380 | + 'info_nb_auteurs' => '@nb@ autores', |
|
| 381 | + 'info_nb_messages' => '@nb@ mensagens', |
|
| 382 | + 'info_nb_mots_cles' => '@nb@ palavras-chave', |
|
| 383 | + 'info_nb_rubriques' => '@nb@ rubricas', |
|
| 384 | + 'info_nb_visiteurs' => '@nb@ visitantes', |
|
| 385 | + 'info_nom' => 'Nome', |
|
| 386 | + 'info_nom_destinataire' => 'Nome do destinatário', |
|
| 387 | + 'info_nom_pas_conforme' => 'as tags html não são autorizadas', |
|
| 388 | + 'info_nom_site' => 'Nome do seu sítio', |
|
| 389 | + 'info_nombre_articles' => '@nb_articles@ artigos,', |
|
| 390 | + 'info_nombre_rubriques' => '@nb_rubriques@ rubricas,', |
|
| 391 | + 'info_nombre_sites' => '@nb_sites@ sítios,', |
|
| 392 | + 'info_non_deplacer' => 'Não deslocar...', |
|
| 393 | + 'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP pode enviar regularmente o anúncio das últimas novidades do sítio |
|
| 394 | 394 | (artigos e notícias recentemente publicados).', |
| 395 | - 'info_non_envoi_liste_nouveautes' => 'Não enviar a lista das novidades', |
|
| 396 | - 'info_non_modifiable' => 'não pode ser modificado', |
|
| 397 | - 'info_non_suppression_mot_cle' => 'Não quero suprimir esta palavra-chave.', |
|
| 398 | - 'info_notes' => 'Notas', |
|
| 399 | - 'info_nouvel_article' => 'Novo artigo', |
|
| 400 | - 'info_nouvelle_traduction' => 'Nova tradução :', |
|
| 401 | - 'info_numero_article' => 'ARTIGO NÚMERO :', |
|
| 402 | - 'info_obligatoire_02' => '(obrigatório)', |
|
| 403 | - 'info_option_accepter_visiteurs' => 'Aceitar a inscrição de visitantes do sítio público', |
|
| 404 | - 'info_option_ne_pas_accepter_visiteurs' => 'Recusar a inscrição de visitantes', |
|
| 405 | - 'info_options_avancees' => 'OPÇÕES AVANÇADAS', |
|
| 406 | - 'info_ou' => 'ou...', |
|
| 407 | - 'info_page_interdite' => 'Página proibida', |
|
| 408 | - 'info_par_nom' => 'por nome', |
|
| 409 | - 'info_par_nombre_article' => 'por número de artigos', |
|
| 410 | - 'info_par_statut' => 'por estado', |
|
| 411 | - 'info_par_tri' => '’(por @tri@)’', |
|
| 412 | - 'info_passe_trop_court' => 'Palavra-passe demasiado curta.', |
|
| 413 | - 'info_passe_trop_court_car_pluriel' => 'A palavra-passe deve conter pelo menos @nb@ caracteres.', |
|
| 414 | - 'info_passes_identiques' => 'As duas palavras-passe não são idênticas.', |
|
| 415 | - 'info_plus_cinq_car' => 'mais de 5 caracteres', |
|
| 416 | - 'info_plus_cinq_car_2' => '(Mais de 5 caracteres)', |
|
| 417 | - 'info_plus_trois_car' => '(Mais de 3 caracteres)', |
|
| 418 | - 'info_popularite' => 'popularidade : @popularite@ ; visitas : @visites@', |
|
| 419 | - 'info_post_scriptum' => 'Post-Scriptum', |
|
| 420 | - 'info_post_scriptum_2' => 'Post-scriptum :', |
|
| 421 | - 'info_pour' => 'para', |
|
| 422 | - 'info_preview_texte' => 'É possível visualizar os vários elementos editoriais do site que têm pelo menos o estatuto "proposto", bem como os artigos em processo de escrita dos quais se é o autor. Esta funcionalidade deve estar disponível para administradores, editores ou para ninguém?', |
|
| 423 | - 'info_procedez_par_etape' => 'proceder etapa por etapa', |
|
| 424 | - 'info_procedure_maj_version' => 'o procedimento de actualização deve ser lançado para adaptar |
|
| 395 | + 'info_non_envoi_liste_nouveautes' => 'Não enviar a lista das novidades', |
|
| 396 | + 'info_non_modifiable' => 'não pode ser modificado', |
|
| 397 | + 'info_non_suppression_mot_cle' => 'Não quero suprimir esta palavra-chave.', |
|
| 398 | + 'info_notes' => 'Notas', |
|
| 399 | + 'info_nouvel_article' => 'Novo artigo', |
|
| 400 | + 'info_nouvelle_traduction' => 'Nova tradução :', |
|
| 401 | + 'info_numero_article' => 'ARTIGO NÚMERO :', |
|
| 402 | + 'info_obligatoire_02' => '(obrigatório)', |
|
| 403 | + 'info_option_accepter_visiteurs' => 'Aceitar a inscrição de visitantes do sítio público', |
|
| 404 | + 'info_option_ne_pas_accepter_visiteurs' => 'Recusar a inscrição de visitantes', |
|
| 405 | + 'info_options_avancees' => 'OPÇÕES AVANÇADAS', |
|
| 406 | + 'info_ou' => 'ou...', |
|
| 407 | + 'info_page_interdite' => 'Página proibida', |
|
| 408 | + 'info_par_nom' => 'por nome', |
|
| 409 | + 'info_par_nombre_article' => 'por número de artigos', |
|
| 410 | + 'info_par_statut' => 'por estado', |
|
| 411 | + 'info_par_tri' => '’(por @tri@)’', |
|
| 412 | + 'info_passe_trop_court' => 'Palavra-passe demasiado curta.', |
|
| 413 | + 'info_passe_trop_court_car_pluriel' => 'A palavra-passe deve conter pelo menos @nb@ caracteres.', |
|
| 414 | + 'info_passes_identiques' => 'As duas palavras-passe não são idênticas.', |
|
| 415 | + 'info_plus_cinq_car' => 'mais de 5 caracteres', |
|
| 416 | + 'info_plus_cinq_car_2' => '(Mais de 5 caracteres)', |
|
| 417 | + 'info_plus_trois_car' => '(Mais de 3 caracteres)', |
|
| 418 | + 'info_popularite' => 'popularidade : @popularite@ ; visitas : @visites@', |
|
| 419 | + 'info_post_scriptum' => 'Post-Scriptum', |
|
| 420 | + 'info_post_scriptum_2' => 'Post-scriptum :', |
|
| 421 | + 'info_pour' => 'para', |
|
| 422 | + 'info_preview_texte' => 'É possível visualizar os vários elementos editoriais do site que têm pelo menos o estatuto "proposto", bem como os artigos em processo de escrita dos quais se é o autor. Esta funcionalidade deve estar disponível para administradores, editores ou para ninguém?', |
|
| 423 | + 'info_procedez_par_etape' => 'proceder etapa por etapa', |
|
| 424 | + 'info_procedure_maj_version' => 'o procedimento de actualização deve ser lançado para adaptar |
|
| 425 | 425 | a base de dados à nova versão de SPIP.', |
| 426 | - 'info_proxy_ok' => 'Proxy testado com sucesso.', |
|
| 427 | - 'info_ps' => 'P.S.', |
|
| 428 | - 'info_publier' => 'publicar', |
|
| 429 | - 'info_publies' => 'Os seus artigos publicados online', |
|
| 430 | - 'info_question_accepter_visiteurs' => 'Se os parâmetros do seu site prevêem o registo de visitantes sem acesso ao espaço privado, por favor, active a opção abaixo:', |
|
| 431 | - 'info_question_inscription_nouveaux_redacteurs' => 'Aceita as inscrições de novos redactores a |
|
| 426 | + 'info_proxy_ok' => 'Proxy testado com sucesso.', |
|
| 427 | + 'info_ps' => 'P.S.', |
|
| 428 | + 'info_publier' => 'publicar', |
|
| 429 | + 'info_publies' => 'Os seus artigos publicados online', |
|
| 430 | + 'info_question_accepter_visiteurs' => 'Se os parâmetros do seu site prevêem o registo de visitantes sem acesso ao espaço privado, por favor, active a opção abaixo:', |
|
| 431 | + 'info_question_inscription_nouveaux_redacteurs' => 'Aceita as inscrições de novos redactores a |
|
| 432 | 432 | partir do sítio público? Se aceitar, os visitantes poderão inscrever-se |
| 433 | 433 | a partir de um formulário automatizado e acederão então ao espaço privado para |
| 434 | 434 | propor os seus próprios artigos. <blockquote><i>Durante a fase de inscrição, os utilizadores recebem um e-mail automático |
| 435 | 435 | fornecendo-lhes os seus códigos de acesso ao sítio privado. Alguns |
| 436 | 436 | serviços de hospedagem desactivam o envio de e-mails a partir dos seus |
| 437 | 437 | servidores: nesse caso, a inscrição automática é impossível.', |
| 438 | - 'info_qui_edite' => '@nom_auteur_modif@ modificou o conteúdo há @date_diff@ minutos', |
|
| 439 | - 'info_racine_site' => 'Raiz do sítio', |
|
| 440 | - 'info_recharger_page' => 'Por favor volte a carregar esta página daqui a pouco.', |
|
| 441 | - 'info_recherche_auteur_zero' => 'Nenhum resultado para "@cherche_auteur@".', |
|
| 442 | - 'info_recommencer' => 'Por favor tente de novo.', |
|
| 443 | - 'info_redacteur_1' => 'Redactor', |
|
| 444 | - 'info_redacteur_2' => 'tendo acesso ao espaço privado(<i>recomendado</i>)', |
|
| 445 | - 'info_redacteurs' => 'Redactores', |
|
| 446 | - 'info_redaction_en_cours' => 'EM CURSO DE REDACÇÃO', |
|
| 447 | - 'info_redirection' => 'Redirigir', |
|
| 448 | - 'info_redirection_activee' => 'O redireccionamento está activado.', |
|
| 449 | - 'info_redirection_boucle' => 'Está a tentar redireccionar o artigo para este mesmo artigo.', |
|
| 450 | - 'info_redirection_desactivee' => 'O redireccionamento foi eliminado.', |
|
| 451 | - 'info_refuses' => 'Os seus artigos recusados', |
|
| 452 | - 'info_reglage_ldap' => 'Opções : <b>Acerto da importação LDAP</b>', |
|
| 453 | - 'info_renvoi_article' => '<b>Redireccionar.</b> Este artigo remete para a página:', |
|
| 454 | - 'info_reserve_admin' => 'Só os administradores podem modificar este endereço.', |
|
| 455 | - 'info_restreindre_rubrique' => 'Limitar a gestão à rubrica : ', |
|
| 456 | - 'info_resultat_recherche' => 'Resultados da pesquisa ;', |
|
| 457 | - 'info_rubriques' => 'Rubricas', |
|
| 458 | - 'info_rubriques_02' => 'rubricas', |
|
| 459 | - 'info_rubriques_trouvees' => 'Rubricas encontradas', |
|
| 460 | - 'info_sans_titre' => 'Sem título', |
|
| 461 | - 'info_selection_chemin_acces' => '<b>Seleccione</b> a seguir o caminho de acesso no anuário :', |
|
| 462 | - 'info_signatures' => 'assinaturas', |
|
| 463 | - 'info_site' => 'Sítio', |
|
| 464 | - 'info_site_2' => 'sítio :', |
|
| 465 | - 'info_site_min' => 'sítio', |
|
| 466 | - 'info_site_reference_2' => 'Sítio referenciado', |
|
| 467 | - 'info_site_web' => 'Sítio web :', |
|
| 468 | - 'info_sites' => 'sítios', |
|
| 469 | - 'info_sites_lies_mot' => 'Os sítios referenciados ligados a esta palavra-chave', |
|
| 470 | - 'info_sites_proxy' => 'Utilizar um proxy', |
|
| 471 | - 'info_sites_trouves' => 'Sítios encontrados', |
|
| 472 | - 'info_sous_titre' => 'Sub-título :', |
|
| 473 | - 'info_statut_administrateur' => 'Administrador', |
|
| 474 | - 'info_statut_auteur' => 'Estatuto deste autor :', |
|
| 475 | - 'info_statut_auteur_2' => 'Eu sou', |
|
| 476 | - 'info_statut_auteur_a_confirmer' => 'Registo a confirmar', |
|
| 477 | - 'info_statut_auteur_autre' => 'Outro estado:', |
|
| 478 | - 'info_statut_redacteur' => 'Redactor', |
|
| 479 | - 'info_statut_utilisateurs_1' => 'Estatuto por defeito dos utilizadores importados', |
|
| 480 | - 'info_statut_utilisateurs_2' => 'Escolha o estatuto atribuído às pessoas presentes no anuário LDAP quando elas se ligam pela primeira vez. Poderá depois modificar este valor para cada autor, caso a caso.', |
|
| 481 | - 'info_suivi_activite' => 'Acompanhamento da actividade editorial', |
|
| 482 | - 'info_surtitre' => 'Antetítulo', |
|
| 483 | - 'info_syndication_integrale_1' => 'O seu sítio propõe os ficheiros redifundidos (ver « <a href="@url@">@titre@</a> »).', |
|
| 484 | - 'info_syndication_integrale_2' => 'Deseja enviar os artigos completos ou apenas um resumo de algumas centenas de caracteres?', |
|
| 485 | - 'info_table_prefix' => 'Pode modificar o prefixo do nome das tabelas das bases de dados. (Precisa de o fazer se estiver a instalar vários sítios na mesma base de dados.) O prefixo tem de ser escrito sem acentos, em minúsculas e sem espaços.', |
|
| 486 | - 'info_taille_maximale_images' => 'SPIP testará o tamanho máximo de imagem que pode processar (em milhões de pixels).<br /> As imagens maiores não serão reduzidas.', |
|
| 487 | - 'info_taille_maximale_vignette' => 'Tamanho máximo das vinhetas geradas pelo sistema :', |
|
| 488 | - 'info_terminer_installation' => 'Pode agora acabar o procedimento de instalação tipo.', |
|
| 489 | - 'info_texte' => 'Texto', |
|
| 490 | - 'info_texte_explicatif' => 'Texto explicativo', |
|
| 491 | - 'info_texte_long' => '(o texto é comprido : aparece, por isso, em muitas partes que serão coladas depois da validação.)', |
|
| 492 | - 'info_texte_message' => 'Texto da sua mensagem :', |
|
| 493 | - 'info_texte_message_02' => 'Texto da mensagem', |
|
| 494 | - 'info_titre' => 'Título :', |
|
| 495 | - 'info_total' => 'total :', |
|
| 496 | - 'info_tous_articles_en_redaction' => 'Todos os artigos em curso de redacção', |
|
| 497 | - 'info_tous_articles_presents' => 'Todos os artigos publicados nesta rubrica', |
|
| 498 | - 'info_tous_articles_refuses' => 'Todos os artigos rejeitados', |
|
| 499 | - 'info_tous_les' => 'todos os', |
|
| 500 | - 'info_tout_site' => 'Todo o sítio', |
|
| 501 | - 'info_tout_site2' => 'O artigo não está traduzido neste idioma.', |
|
| 502 | - 'info_tout_site3' => 'O artigo foi traduzido neste idioma, mas foram feitas modificações ao artigo original. A tradução necessita ser actualizada.', |
|
| 503 | - 'info_tout_site4' => 'O artigo foi traduzido neste idioma e a tradução está actual.', |
|
| 504 | - 'info_tout_site5' => 'Artigo original.', |
|
| 505 | - 'info_tout_site6' => '<b>Atenção:</b> só os artigos originais são mostrados. |
|
| 438 | + 'info_qui_edite' => '@nom_auteur_modif@ modificou o conteúdo há @date_diff@ minutos', |
|
| 439 | + 'info_racine_site' => 'Raiz do sítio', |
|
| 440 | + 'info_recharger_page' => 'Por favor volte a carregar esta página daqui a pouco.', |
|
| 441 | + 'info_recherche_auteur_zero' => 'Nenhum resultado para "@cherche_auteur@".', |
|
| 442 | + 'info_recommencer' => 'Por favor tente de novo.', |
|
| 443 | + 'info_redacteur_1' => 'Redactor', |
|
| 444 | + 'info_redacteur_2' => 'tendo acesso ao espaço privado(<i>recomendado</i>)', |
|
| 445 | + 'info_redacteurs' => 'Redactores', |
|
| 446 | + 'info_redaction_en_cours' => 'EM CURSO DE REDACÇÃO', |
|
| 447 | + 'info_redirection' => 'Redirigir', |
|
| 448 | + 'info_redirection_activee' => 'O redireccionamento está activado.', |
|
| 449 | + 'info_redirection_boucle' => 'Está a tentar redireccionar o artigo para este mesmo artigo.', |
|
| 450 | + 'info_redirection_desactivee' => 'O redireccionamento foi eliminado.', |
|
| 451 | + 'info_refuses' => 'Os seus artigos recusados', |
|
| 452 | + 'info_reglage_ldap' => 'Opções : <b>Acerto da importação LDAP</b>', |
|
| 453 | + 'info_renvoi_article' => '<b>Redireccionar.</b> Este artigo remete para a página:', |
|
| 454 | + 'info_reserve_admin' => 'Só os administradores podem modificar este endereço.', |
|
| 455 | + 'info_restreindre_rubrique' => 'Limitar a gestão à rubrica : ', |
|
| 456 | + 'info_resultat_recherche' => 'Resultados da pesquisa ;', |
|
| 457 | + 'info_rubriques' => 'Rubricas', |
|
| 458 | + 'info_rubriques_02' => 'rubricas', |
|
| 459 | + 'info_rubriques_trouvees' => 'Rubricas encontradas', |
|
| 460 | + 'info_sans_titre' => 'Sem título', |
|
| 461 | + 'info_selection_chemin_acces' => '<b>Seleccione</b> a seguir o caminho de acesso no anuário :', |
|
| 462 | + 'info_signatures' => 'assinaturas', |
|
| 463 | + 'info_site' => 'Sítio', |
|
| 464 | + 'info_site_2' => 'sítio :', |
|
| 465 | + 'info_site_min' => 'sítio', |
|
| 466 | + 'info_site_reference_2' => 'Sítio referenciado', |
|
| 467 | + 'info_site_web' => 'Sítio web :', |
|
| 468 | + 'info_sites' => 'sítios', |
|
| 469 | + 'info_sites_lies_mot' => 'Os sítios referenciados ligados a esta palavra-chave', |
|
| 470 | + 'info_sites_proxy' => 'Utilizar um proxy', |
|
| 471 | + 'info_sites_trouves' => 'Sítios encontrados', |
|
| 472 | + 'info_sous_titre' => 'Sub-título :', |
|
| 473 | + 'info_statut_administrateur' => 'Administrador', |
|
| 474 | + 'info_statut_auteur' => 'Estatuto deste autor :', |
|
| 475 | + 'info_statut_auteur_2' => 'Eu sou', |
|
| 476 | + 'info_statut_auteur_a_confirmer' => 'Registo a confirmar', |
|
| 477 | + 'info_statut_auteur_autre' => 'Outro estado:', |
|
| 478 | + 'info_statut_redacteur' => 'Redactor', |
|
| 479 | + 'info_statut_utilisateurs_1' => 'Estatuto por defeito dos utilizadores importados', |
|
| 480 | + 'info_statut_utilisateurs_2' => 'Escolha o estatuto atribuído às pessoas presentes no anuário LDAP quando elas se ligam pela primeira vez. Poderá depois modificar este valor para cada autor, caso a caso.', |
|
| 481 | + 'info_suivi_activite' => 'Acompanhamento da actividade editorial', |
|
| 482 | + 'info_surtitre' => 'Antetítulo', |
|
| 483 | + 'info_syndication_integrale_1' => 'O seu sítio propõe os ficheiros redifundidos (ver « <a href="@url@">@titre@</a> »).', |
|
| 484 | + 'info_syndication_integrale_2' => 'Deseja enviar os artigos completos ou apenas um resumo de algumas centenas de caracteres?', |
|
| 485 | + 'info_table_prefix' => 'Pode modificar o prefixo do nome das tabelas das bases de dados. (Precisa de o fazer se estiver a instalar vários sítios na mesma base de dados.) O prefixo tem de ser escrito sem acentos, em minúsculas e sem espaços.', |
|
| 486 | + 'info_taille_maximale_images' => 'SPIP testará o tamanho máximo de imagem que pode processar (em milhões de pixels).<br /> As imagens maiores não serão reduzidas.', |
|
| 487 | + 'info_taille_maximale_vignette' => 'Tamanho máximo das vinhetas geradas pelo sistema :', |
|
| 488 | + 'info_terminer_installation' => 'Pode agora acabar o procedimento de instalação tipo.', |
|
| 489 | + 'info_texte' => 'Texto', |
|
| 490 | + 'info_texte_explicatif' => 'Texto explicativo', |
|
| 491 | + 'info_texte_long' => '(o texto é comprido : aparece, por isso, em muitas partes que serão coladas depois da validação.)', |
|
| 492 | + 'info_texte_message' => 'Texto da sua mensagem :', |
|
| 493 | + 'info_texte_message_02' => 'Texto da mensagem', |
|
| 494 | + 'info_titre' => 'Título :', |
|
| 495 | + 'info_total' => 'total :', |
|
| 496 | + 'info_tous_articles_en_redaction' => 'Todos os artigos em curso de redacção', |
|
| 497 | + 'info_tous_articles_presents' => 'Todos os artigos publicados nesta rubrica', |
|
| 498 | + 'info_tous_articles_refuses' => 'Todos os artigos rejeitados', |
|
| 499 | + 'info_tous_les' => 'todos os', |
|
| 500 | + 'info_tout_site' => 'Todo o sítio', |
|
| 501 | + 'info_tout_site2' => 'O artigo não está traduzido neste idioma.', |
|
| 502 | + 'info_tout_site3' => 'O artigo foi traduzido neste idioma, mas foram feitas modificações ao artigo original. A tradução necessita ser actualizada.', |
|
| 503 | + 'info_tout_site4' => 'O artigo foi traduzido neste idioma e a tradução está actual.', |
|
| 504 | + 'info_tout_site5' => 'Artigo original.', |
|
| 505 | + 'info_tout_site6' => '<b>Atenção:</b> só os artigos originais são mostrados. |
|
| 506 | 506 | As traduções estão associadas ao original, |
| 507 | 507 | numa cor que indica o seu estado:', |
| 508 | - 'info_traductions' => 'Traduções', |
|
| 509 | - 'info_travail_colaboratif' => 'Trabalho colaborativo sobre os artigos', |
|
| 510 | - 'info_un_article' => 'um artigo', |
|
| 511 | - 'info_un_site' => 'um sítio', |
|
| 512 | - 'info_une_rubrique' => 'uma rubrica,', |
|
| 513 | - 'info_une_rubrique_02' => '1 rubrica', |
|
| 514 | - 'info_url' => 'URL :', |
|
| 515 | - 'info_url_proxy' => 'URL do proxy', |
|
| 516 | - 'info_url_proxy_pas_conforme' => 'o URL do proxy não é válido.', |
|
| 517 | - 'info_url_site_pas_conforme' => 'O URL do sítio não é válido', |
|
| 518 | - 'info_url_test_proxy' => 'URL de teste', |
|
| 519 | - 'info_urlref' => 'Ligação hipertexto :', |
|
| 520 | - 'info_utilisation_spip' => 'Pode começar agora a utilizar o sistema de publicação assistida...', |
|
| 521 | - 'info_visites_par_mois' => 'Exibição por mês :', |
|
| 522 | - 'info_visiteur_1' => 'Visitante', |
|
| 523 | - 'info_visiteur_2' => 'do sítio público', |
|
| 524 | - 'info_visiteurs' => 'Visitantes', |
|
| 525 | - 'info_visiteurs_02' => 'Visitantes do sítio público', |
|
| 526 | - 'info_webmestre_forces' => 'Os webmasters são actualmente definidos em <tt>@file_options@</tt>.', |
|
| 527 | - 'install_adresse_base_hebergeur' => 'Endereço da base de dados atribuído pelo serviço de hospedagem', |
|
| 528 | - 'install_connect_ok' => 'A nova base de dados foi declarada usando o nome de servidor @connect@.', |
|
| 529 | - 'install_echec_annonce' => 'A instalação vai provavelmente falhar,ou criar um sítio não funcional', |
|
| 530 | - 'install_extension_mbstring' => 'O SPIP não funciona com :', |
|
| 531 | - 'install_extension_php_obligatoire' => 'O SPIP exige a extensão php :', |
|
| 532 | - 'install_login_base_hebergeur' => 'Login de ligação atribuído pelo serviço de hospedagem', |
|
| 533 | - 'install_nom_base_hebergeur' => 'Nome da base de dados atribuído pelo serviço de hospedagem:', |
|
| 534 | - 'install_pas_table' => 'A base de dados não tem tabelas', |
|
| 535 | - 'install_pass_base_hebergeur' => 'Palavra-passe atribuída pelo serviço de hospedagem', |
|
| 536 | - 'install_php_version' => 'Esta versão de PHP @version@ é demasiado curta (minimum = @minimum@)', |
|
| 537 | - 'install_select_langue' => 'Seleccione um idioma e depois clique no botão " seguinte " para lançar o procedimento de instalação.', |
|
| 538 | - 'install_select_type_db' => 'Indicar o tipo de base de dados :', |
|
| 539 | - 'install_select_type_mysql' => 'MySQL', |
|
| 540 | - 'install_select_type_pg' => 'PostgreSQL', |
|
| 541 | - 'install_select_type_sqlite2' => 'SQLite 2', |
|
| 542 | - 'install_select_type_sqlite3' => 'SQLite 3', |
|
| 543 | - 'install_serveur_hebergeur' => 'Servidor da base de dados atribuído pelo serviço de hospedagem', |
|
| 544 | - 'install_table_prefix_hebergeur' => 'Prefixo de tabela atribuído pelo serviço de hospedagem:', |
|
| 545 | - 'install_tables_base' => 'Tabelas da base de dados', |
|
| 546 | - 'install_types_db_connus' => 'SPIP pode usar <b>MySQL</b> (o mais comum), <b>PostgreSQL</b> e <b>SQLite</b>.', |
|
| 547 | - 'install_types_db_connus_avertissement' => 'O suporte de <b>PostgreSQL</b> está proposto a nível experimental', |
|
| 548 | - 'instituer_erreur_statut_a_change' => 'O estado já tinha sido modificado', |
|
| 549 | - 'instituer_erreur_statut_non_autorise' => 'Não pode seleccionar este estado', |
|
| 550 | - 'intem_redacteur' => 'redactor', |
|
| 551 | - 'intitule_licence' => 'Licença', |
|
| 552 | - 'item_accepter_inscriptions' => 'Aceitar as inscrições', |
|
| 553 | - 'item_activer_messages_avertissement' => 'Activar as mensagens de aviso', |
|
| 554 | - 'item_administrateur_2' => 'administrador', |
|
| 555 | - 'item_afficher_calendrier' => 'Exibir o calendário', |
|
| 556 | - 'item_autoriser_syndication_integrale' => 'Incluir artigos completos nos ficheiros de redifusão', |
|
| 557 | - 'item_choix_administrateurs' => 'os administradores', |
|
| 558 | - 'item_choix_generation_miniature' => 'Gerar automaticamente as miniaturas das imagens.', |
|
| 559 | - 'item_choix_non_generation_miniature' => 'Não gerar miniaturas das imagens.', |
|
| 560 | - 'item_choix_redacteurs' => 'os redactores', |
|
| 561 | - 'item_choix_visiteurs' => 'os visitadores do sítio público', |
|
| 562 | - 'item_creer_fichiers_authent' => 'Criar os ficheiros .htpasswd', |
|
| 563 | - 'item_login' => 'Login', |
|
| 564 | - 'item_messagerie_agenda' => 'Activar as mensagens e a agenda', |
|
| 565 | - 'item_mots_cles_association_articles' => 'aos artigos', |
|
| 566 | - 'item_mots_cles_association_rubriques' => 'às rubricas', |
|
| 567 | - 'item_mots_cles_association_sites' => 'aos sítios referenciados ou vinculados.', |
|
| 568 | - 'item_non' => 'Não', |
|
| 569 | - 'item_non_accepter_inscriptions' => 'Não aceitar as inscrições', |
|
| 570 | - 'item_non_activer_messages_avertissement' => 'Não há mensagens de aviso', |
|
| 571 | - 'item_non_afficher_calendrier' => 'Não exibir no calendário', |
|
| 572 | - 'item_non_autoriser_syndication_integrale' => 'Enviar apenas um resumo', |
|
| 573 | - 'item_non_creer_fichiers_authent' => 'Não criar estes ficheiros', |
|
| 574 | - 'item_non_messagerie_agenda' => 'Desactivar as mensagens e a agenda', |
|
| 575 | - 'item_non_publier_articles' => 'Não publicar os artigos antes da data de publicação fixada.', |
|
| 576 | - 'item_nouvel_auteur' => 'Novo autor', |
|
| 577 | - 'item_nouvelle_rubrique' => 'Nova rubrica', |
|
| 578 | - 'item_oui' => 'Sim', |
|
| 579 | - 'item_publier_articles' => 'Publicar os artigos, seja qual for a sua data de publicação.', |
|
| 580 | - 'item_reponse_article' => 'Resposta ao artigo', |
|
| 581 | - 'item_visiteur' => 'visitante', |
|
| 508 | + 'info_traductions' => 'Traduções', |
|
| 509 | + 'info_travail_colaboratif' => 'Trabalho colaborativo sobre os artigos', |
|
| 510 | + 'info_un_article' => 'um artigo', |
|
| 511 | + 'info_un_site' => 'um sítio', |
|
| 512 | + 'info_une_rubrique' => 'uma rubrica,', |
|
| 513 | + 'info_une_rubrique_02' => '1 rubrica', |
|
| 514 | + 'info_url' => 'URL :', |
|
| 515 | + 'info_url_proxy' => 'URL do proxy', |
|
| 516 | + 'info_url_proxy_pas_conforme' => 'o URL do proxy não é válido.', |
|
| 517 | + 'info_url_site_pas_conforme' => 'O URL do sítio não é válido', |
|
| 518 | + 'info_url_test_proxy' => 'URL de teste', |
|
| 519 | + 'info_urlref' => 'Ligação hipertexto :', |
|
| 520 | + 'info_utilisation_spip' => 'Pode começar agora a utilizar o sistema de publicação assistida...', |
|
| 521 | + 'info_visites_par_mois' => 'Exibição por mês :', |
|
| 522 | + 'info_visiteur_1' => 'Visitante', |
|
| 523 | + 'info_visiteur_2' => 'do sítio público', |
|
| 524 | + 'info_visiteurs' => 'Visitantes', |
|
| 525 | + 'info_visiteurs_02' => 'Visitantes do sítio público', |
|
| 526 | + 'info_webmestre_forces' => 'Os webmasters são actualmente definidos em <tt>@file_options@</tt>.', |
|
| 527 | + 'install_adresse_base_hebergeur' => 'Endereço da base de dados atribuído pelo serviço de hospedagem', |
|
| 528 | + 'install_connect_ok' => 'A nova base de dados foi declarada usando o nome de servidor @connect@.', |
|
| 529 | + 'install_echec_annonce' => 'A instalação vai provavelmente falhar,ou criar um sítio não funcional', |
|
| 530 | + 'install_extension_mbstring' => 'O SPIP não funciona com :', |
|
| 531 | + 'install_extension_php_obligatoire' => 'O SPIP exige a extensão php :', |
|
| 532 | + 'install_login_base_hebergeur' => 'Login de ligação atribuído pelo serviço de hospedagem', |
|
| 533 | + 'install_nom_base_hebergeur' => 'Nome da base de dados atribuído pelo serviço de hospedagem:', |
|
| 534 | + 'install_pas_table' => 'A base de dados não tem tabelas', |
|
| 535 | + 'install_pass_base_hebergeur' => 'Palavra-passe atribuída pelo serviço de hospedagem', |
|
| 536 | + 'install_php_version' => 'Esta versão de PHP @version@ é demasiado curta (minimum = @minimum@)', |
|
| 537 | + 'install_select_langue' => 'Seleccione um idioma e depois clique no botão " seguinte " para lançar o procedimento de instalação.', |
|
| 538 | + 'install_select_type_db' => 'Indicar o tipo de base de dados :', |
|
| 539 | + 'install_select_type_mysql' => 'MySQL', |
|
| 540 | + 'install_select_type_pg' => 'PostgreSQL', |
|
| 541 | + 'install_select_type_sqlite2' => 'SQLite 2', |
|
| 542 | + 'install_select_type_sqlite3' => 'SQLite 3', |
|
| 543 | + 'install_serveur_hebergeur' => 'Servidor da base de dados atribuído pelo serviço de hospedagem', |
|
| 544 | + 'install_table_prefix_hebergeur' => 'Prefixo de tabela atribuído pelo serviço de hospedagem:', |
|
| 545 | + 'install_tables_base' => 'Tabelas da base de dados', |
|
| 546 | + 'install_types_db_connus' => 'SPIP pode usar <b>MySQL</b> (o mais comum), <b>PostgreSQL</b> e <b>SQLite</b>.', |
|
| 547 | + 'install_types_db_connus_avertissement' => 'O suporte de <b>PostgreSQL</b> está proposto a nível experimental', |
|
| 548 | + 'instituer_erreur_statut_a_change' => 'O estado já tinha sido modificado', |
|
| 549 | + 'instituer_erreur_statut_non_autorise' => 'Não pode seleccionar este estado', |
|
| 550 | + 'intem_redacteur' => 'redactor', |
|
| 551 | + 'intitule_licence' => 'Licença', |
|
| 552 | + 'item_accepter_inscriptions' => 'Aceitar as inscrições', |
|
| 553 | + 'item_activer_messages_avertissement' => 'Activar as mensagens de aviso', |
|
| 554 | + 'item_administrateur_2' => 'administrador', |
|
| 555 | + 'item_afficher_calendrier' => 'Exibir o calendário', |
|
| 556 | + 'item_autoriser_syndication_integrale' => 'Incluir artigos completos nos ficheiros de redifusão', |
|
| 557 | + 'item_choix_administrateurs' => 'os administradores', |
|
| 558 | + 'item_choix_generation_miniature' => 'Gerar automaticamente as miniaturas das imagens.', |
|
| 559 | + 'item_choix_non_generation_miniature' => 'Não gerar miniaturas das imagens.', |
|
| 560 | + 'item_choix_redacteurs' => 'os redactores', |
|
| 561 | + 'item_choix_visiteurs' => 'os visitadores do sítio público', |
|
| 562 | + 'item_creer_fichiers_authent' => 'Criar os ficheiros .htpasswd', |
|
| 563 | + 'item_login' => 'Login', |
|
| 564 | + 'item_messagerie_agenda' => 'Activar as mensagens e a agenda', |
|
| 565 | + 'item_mots_cles_association_articles' => 'aos artigos', |
|
| 566 | + 'item_mots_cles_association_rubriques' => 'às rubricas', |
|
| 567 | + 'item_mots_cles_association_sites' => 'aos sítios referenciados ou vinculados.', |
|
| 568 | + 'item_non' => 'Não', |
|
| 569 | + 'item_non_accepter_inscriptions' => 'Não aceitar as inscrições', |
|
| 570 | + 'item_non_activer_messages_avertissement' => 'Não há mensagens de aviso', |
|
| 571 | + 'item_non_afficher_calendrier' => 'Não exibir no calendário', |
|
| 572 | + 'item_non_autoriser_syndication_integrale' => 'Enviar apenas um resumo', |
|
| 573 | + 'item_non_creer_fichiers_authent' => 'Não criar estes ficheiros', |
|
| 574 | + 'item_non_messagerie_agenda' => 'Desactivar as mensagens e a agenda', |
|
| 575 | + 'item_non_publier_articles' => 'Não publicar os artigos antes da data de publicação fixada.', |
|
| 576 | + 'item_nouvel_auteur' => 'Novo autor', |
|
| 577 | + 'item_nouvelle_rubrique' => 'Nova rubrica', |
|
| 578 | + 'item_oui' => 'Sim', |
|
| 579 | + 'item_publier_articles' => 'Publicar os artigos, seja qual for a sua data de publicação.', |
|
| 580 | + 'item_reponse_article' => 'Resposta ao artigo', |
|
| 581 | + 'item_visiteur' => 'visitante', |
|
| 582 | 582 | |
| 583 | - // J |
|
| 584 | - 'jour_non_connu_nc' => 'n.c.', |
|
| 583 | + // J |
|
| 584 | + 'jour_non_connu_nc' => 'n.c.', |
|
| 585 | 585 | |
| 586 | - // L |
|
| 587 | - 'label_bando_outils' => 'Barra de ferramentas', |
|
| 588 | - 'label_bando_outils_afficher' => 'Exibir as ferramentas', |
|
| 589 | - 'label_bando_outils_masquer' => 'Ocultar as ferramentas', |
|
| 590 | - 'label_choix_langue' => 'Seleccione o seu idioma', |
|
| 591 | - 'label_nom_fichier_connect' => 'Indique o nome para este servidor', |
|
| 592 | - 'label_slogan_site' => 'Slogan do sítio', |
|
| 593 | - 'label_taille_ecran' => 'Largura do ecrã', |
|
| 594 | - 'label_texte_et_icones_navigation' => 'Menu de navegação', |
|
| 595 | - 'label_texte_et_icones_page' => 'Exibição da página', |
|
| 596 | - 'ldap_correspondance' => 'sucessão do campo @champ@', |
|
| 597 | - 'ldap_correspondance_1' => 'Sucessão dos campos LDAP', |
|
| 598 | - 'ldap_correspondance_2' => 'Para cada um destes campos SPIP, indique o nome do campo LDAP correspondente. Deixe em branco se não o deseja preenchido. Separe com espaços ou vírgulas, para tentar vários campos LDAP.', |
|
| 599 | - 'lien_ajouter_auteur' => 'Acrescentar este autor', |
|
| 600 | - 'lien_ajouter_une_rubrique' => 'Adicionar esta rubrica', |
|
| 601 | - 'lien_email' => 'email', |
|
| 602 | - 'lien_nom_site' => 'NOME DO SÍTIO', |
|
| 603 | - 'lien_rapide_contenu' => 'Ir para o conteúdo', |
|
| 604 | - 'lien_rapide_navigation' => 'Ir para a navegação', |
|
| 605 | - 'lien_rapide_recherche' => 'Ir para a pesquisa', |
|
| 606 | - 'lien_retirer_auteur' => 'Remover o autor', |
|
| 607 | - 'lien_retirer_rubrique' => 'Eliminar a rubrica', |
|
| 608 | - 'lien_retirer_tous_auteurs' => 'Eliminar todos os autores', |
|
| 609 | - 'lien_retirer_toutes_rubriques' => 'Remover todas as rubricas', |
|
| 610 | - 'lien_site' => 'sítio', |
|
| 611 | - 'lien_tout_decocher' => 'Desmarcar tudo', |
|
| 612 | - 'lien_tout_deplier' => 'Expandir tudo', |
|
| 613 | - 'lien_tout_replier' => 'Recolher tudo', |
|
| 614 | - 'lien_tout_supprimer' => 'Eliminar tudo', |
|
| 615 | - 'lien_trier_nom' => 'Seleccionar por nome', |
|
| 616 | - 'lien_trier_nombre_articles' => 'seleccionar por número de artigos', |
|
| 617 | - 'lien_trier_statut' => 'Seleccionar por estatuto', |
|
| 618 | - 'lien_voir_en_ligne' => 'VER EM LINHA', |
|
| 619 | - 'logo_article' => 'Logotipo do artigo', |
|
| 620 | - 'logo_auteur' => 'Logotipo do autor ', |
|
| 621 | - 'logo_rubrique' => 'Logotipo da rubrica', |
|
| 622 | - 'logo_site' => 'Logotipo deste sítio', |
|
| 623 | - 'logo_standard_rubrique' => 'Logotipo modelo das rubricas', |
|
| 624 | - 'logo_survol' => 'Logotipo "mouseover"', |
|
| 586 | + // L |
|
| 587 | + 'label_bando_outils' => 'Barra de ferramentas', |
|
| 588 | + 'label_bando_outils_afficher' => 'Exibir as ferramentas', |
|
| 589 | + 'label_bando_outils_masquer' => 'Ocultar as ferramentas', |
|
| 590 | + 'label_choix_langue' => 'Seleccione o seu idioma', |
|
| 591 | + 'label_nom_fichier_connect' => 'Indique o nome para este servidor', |
|
| 592 | + 'label_slogan_site' => 'Slogan do sítio', |
|
| 593 | + 'label_taille_ecran' => 'Largura do ecrã', |
|
| 594 | + 'label_texte_et_icones_navigation' => 'Menu de navegação', |
|
| 595 | + 'label_texte_et_icones_page' => 'Exibição da página', |
|
| 596 | + 'ldap_correspondance' => 'sucessão do campo @champ@', |
|
| 597 | + 'ldap_correspondance_1' => 'Sucessão dos campos LDAP', |
|
| 598 | + 'ldap_correspondance_2' => 'Para cada um destes campos SPIP, indique o nome do campo LDAP correspondente. Deixe em branco se não o deseja preenchido. Separe com espaços ou vírgulas, para tentar vários campos LDAP.', |
|
| 599 | + 'lien_ajouter_auteur' => 'Acrescentar este autor', |
|
| 600 | + 'lien_ajouter_une_rubrique' => 'Adicionar esta rubrica', |
|
| 601 | + 'lien_email' => 'email', |
|
| 602 | + 'lien_nom_site' => 'NOME DO SÍTIO', |
|
| 603 | + 'lien_rapide_contenu' => 'Ir para o conteúdo', |
|
| 604 | + 'lien_rapide_navigation' => 'Ir para a navegação', |
|
| 605 | + 'lien_rapide_recherche' => 'Ir para a pesquisa', |
|
| 606 | + 'lien_retirer_auteur' => 'Remover o autor', |
|
| 607 | + 'lien_retirer_rubrique' => 'Eliminar a rubrica', |
|
| 608 | + 'lien_retirer_tous_auteurs' => 'Eliminar todos os autores', |
|
| 609 | + 'lien_retirer_toutes_rubriques' => 'Remover todas as rubricas', |
|
| 610 | + 'lien_site' => 'sítio', |
|
| 611 | + 'lien_tout_decocher' => 'Desmarcar tudo', |
|
| 612 | + 'lien_tout_deplier' => 'Expandir tudo', |
|
| 613 | + 'lien_tout_replier' => 'Recolher tudo', |
|
| 614 | + 'lien_tout_supprimer' => 'Eliminar tudo', |
|
| 615 | + 'lien_trier_nom' => 'Seleccionar por nome', |
|
| 616 | + 'lien_trier_nombre_articles' => 'seleccionar por número de artigos', |
|
| 617 | + 'lien_trier_statut' => 'Seleccionar por estatuto', |
|
| 618 | + 'lien_voir_en_ligne' => 'VER EM LINHA', |
|
| 619 | + 'logo_article' => 'Logotipo do artigo', |
|
| 620 | + 'logo_auteur' => 'Logotipo do autor ', |
|
| 621 | + 'logo_rubrique' => 'Logotipo da rubrica', |
|
| 622 | + 'logo_site' => 'Logotipo deste sítio', |
|
| 623 | + 'logo_standard_rubrique' => 'Logotipo modelo das rubricas', |
|
| 624 | + 'logo_survol' => 'Logotipo "mouseover"', |
|
| 625 | 625 | |
| 626 | - // M |
|
| 627 | - 'menu_aide_installation_choix_base' => 'Escolha da sua base', |
|
| 628 | - 'module_fichier_langue' => 'Ficheiro de idioma', |
|
| 629 | - 'module_raccourci' => 'Atalhos', |
|
| 630 | - 'module_texte_affiche' => 'Texto exibido', |
|
| 631 | - 'module_texte_explicatif' => 'Pode inserir os seguintes atalhos nos esqueletos do seu sítio público. Serão automaticamente traduzidos para os vários idiomas nos quais há um ficheiro de idioma.', |
|
| 632 | - 'module_texte_traduction' => 'O ficheiro de idioma « @module@ » está disponível em :', |
|
| 633 | - 'mois_non_connu' => 'não conhecido', |
|
| 626 | + // M |
|
| 627 | + 'menu_aide_installation_choix_base' => 'Escolha da sua base', |
|
| 628 | + 'module_fichier_langue' => 'Ficheiro de idioma', |
|
| 629 | + 'module_raccourci' => 'Atalhos', |
|
| 630 | + 'module_texte_affiche' => 'Texto exibido', |
|
| 631 | + 'module_texte_explicatif' => 'Pode inserir os seguintes atalhos nos esqueletos do seu sítio público. Serão automaticamente traduzidos para os vários idiomas nos quais há um ficheiro de idioma.', |
|
| 632 | + 'module_texte_traduction' => 'O ficheiro de idioma « @module@ » está disponível em :', |
|
| 633 | + 'mois_non_connu' => 'não conhecido', |
|
| 634 | 634 | |
| 635 | - // N |
|
| 636 | - 'nouvelle_version_spip' => 'A versão @version@ de SPIP está disponível', |
|
| 637 | - 'nouvelle_version_spip_majeure' => 'Um novo SPIP @version@ está disponível', |
|
| 635 | + // N |
|
| 636 | + 'nouvelle_version_spip' => 'A versão @version@ de SPIP está disponível', |
|
| 637 | + 'nouvelle_version_spip_majeure' => 'Um novo SPIP @version@ está disponível', |
|
| 638 | 638 | |
| 639 | - // O |
|
| 640 | - 'onglet_contenu' => 'Conteúdo', |
|
| 641 | - 'onglet_declarer_une_autre_base' => 'Declarar outra base de dados', |
|
| 642 | - 'onglet_discuter' => 'Discussão', |
|
| 643 | - 'onglet_interactivite' => 'Interactividade', |
|
| 644 | - 'onglet_proprietes' => 'Propriedades', |
|
| 645 | - 'onglet_repartition_actuelle' => 'actualmente', |
|
| 646 | - 'onglet_sous_rubriques' => 'Sub-rubricas', |
|
| 639 | + // O |
|
| 640 | + 'onglet_contenu' => 'Conteúdo', |
|
| 641 | + 'onglet_declarer_une_autre_base' => 'Declarar outra base de dados', |
|
| 642 | + 'onglet_discuter' => 'Discussão', |
|
| 643 | + 'onglet_interactivite' => 'Interactividade', |
|
| 644 | + 'onglet_proprietes' => 'Propriedades', |
|
| 645 | + 'onglet_repartition_actuelle' => 'actualmente', |
|
| 646 | + 'onglet_sous_rubriques' => 'Sub-rubricas', |
|
| 647 | 647 | |
| 648 | - // P |
|
| 649 | - 'page_pas_proxy' => 'Esta página não deve passar através do proxy', |
|
| 650 | - 'pas_de_proxy_pour' => 'Se necessário, indique a que máquinas ou domínios este proxy não se deve aplicar (por exemplo : @exemple@)', |
|
| 651 | - 'phpinfo' => 'Configuração PHP', |
|
| 652 | - 'plugin_charge_paquet' => 'Carregamento do ficheiro @name@', |
|
| 653 | - 'plugin_charger' => 'Download', |
|
| 654 | - 'plugin_erreur_charger' => 'erro : impossível carregar @zip@', |
|
| 655 | - 'plugin_erreur_droit1' => 'Não pode escrever no directório <code>@dest@</code>.', |
|
| 656 | - 'plugin_erreur_droit2' => 'Por favor verifique as autorizações para este directório (e crie o directório se necessário). Alternativamente, instale os ficheiros por FTP.', |
|
| 657 | - 'plugin_erreur_zip' => 'falha pclzip : erro @status@', |
|
| 658 | - 'plugin_etat_developpement' => 'em desenvolvimento', |
|
| 659 | - 'plugin_etat_experimental' => 'experimental', |
|
| 660 | - 'plugin_etat_stable' => 'estável', |
|
| 661 | - 'plugin_etat_test' => 'em teste', |
|
| 662 | - 'plugin_impossible_activer' => 'Impossível activar o plugin @plugin@', |
|
| 663 | - 'plugin_info_automatique1' => 'Se deseja autorizar a instalação automática de plugins, por favor:', |
|
| 664 | - 'plugin_info_automatique1_lib' => 'Se deseja que a biblioteca seja instalada automaticamente, por favor:', |
|
| 665 | - 'plugin_info_automatique2' => 'criar um directório <code>@rep@</code> ;', |
|
| 666 | - 'plugin_info_automatique3' => 'Verifique se o servidor está autorizado a escrever neste directório.', |
|
| 667 | - 'plugin_info_automatique_creer' => 'a criar na raiz do sítio.', |
|
| 668 | - 'plugin_info_automatique_exemples' => 'exemplos:', |
|
| 669 | - 'plugin_info_automatique_ftp' => 'Pode instalar os plugins, por FTP, no directório <tt>@rep@</tt>', |
|
| 670 | - 'plugin_info_automatique_lib' => 'Alguns plugins precisam de estar aptos a carregar ficheiros no directório <code>lib/</code>. Este directório deve ser criado na raiz do sítio.', |
|
| 671 | - 'plugin_info_automatique_liste' => 'As suas listas de plugins :', |
|
| 672 | - 'plugin_info_automatique_liste_officielle' => 'os plugins oficiais', |
|
| 673 | - 'plugin_info_automatique_liste_update' => 'Actualizar as listas', |
|
| 674 | - 'plugin_info_automatique_ou' => 'ou...', |
|
| 675 | - 'plugin_info_automatique_select' => 'Seleccione um plugin abaixo: SPIP irá carregá-lo e instalá-lo no directório <code>@rep@</code>. Se o plugin já existir, será actualizado.', |
|
| 676 | - 'plugin_info_credit' => 'Créditos', |
|
| 677 | - 'plugin_info_erreur_xml' => 'A declaração do plugin está incorrecta', |
|
| 678 | - 'plugin_info_install_ok' => 'Instalado com sucesso', |
|
| 679 | - 'plugin_info_necessite' => 'Requer:', |
|
| 680 | - 'plugin_info_non_compatible_spip' => 'O plugin é incompatível com esta versão de SPIP', |
|
| 681 | - 'plugin_info_plugins_dist_1' => 'Os plugins seguintes estão carregados e activados no directório @plugins_dist@.', |
|
| 682 | - 'plugin_info_plugins_dist_2' => 'Não podem ser desactivados.', |
|
| 683 | - 'plugin_info_telecharger' => 'carregar de @url@ e instalar em @rep@', |
|
| 684 | - 'plugin_info_upgrade_ok' => 'Actualizado com sucesso', |
|
| 685 | - 'plugin_librairies_installees' => 'Bibliotecas instaladas', |
|
| 686 | - 'plugin_necessite_extension_php' => 'Requer a extensão PHP @plugin@ em @version@.', |
|
| 687 | - 'plugin_necessite_extension_php_sans_version' => 'Requer a extensão PHP @plugin@', |
|
| 688 | - 'plugin_necessite_lib' => 'Este plugin requer a biblioteca @lib@', |
|
| 689 | - 'plugin_necessite_php' => 'Requer @plugin@ em versão @version@.', |
|
| 690 | - 'plugin_necessite_plugin' => 'Requer o plugin @plugin@ em versão @version@ ou mais recente.', |
|
| 691 | - 'plugin_necessite_plugin_sans_version' => 'Requer o plugin @plugin@', |
|
| 692 | - 'plugin_necessite_spip' => 'Requer SPIP em version @version@ ou mais recente.', |
|
| 693 | - 'plugin_source' => 'fonte: ', |
|
| 694 | - 'plugin_titre_automatique' => 'Instalação automática', |
|
| 695 | - 'plugin_titre_automatique_ajouter' => 'Adicionar plugins', |
|
| 696 | - 'plugin_titre_installation' => 'Instalação do plugin @plugin@', |
|
| 697 | - 'plugin_titre_modifier' => 'Os meus plugins', |
|
| 698 | - 'plugin_utilise_extension_php' => 'A extensão PHP @plugin@ deve estar na versão @version@.', |
|
| 699 | - 'plugin_utilise_php' => '@plugin@ deve estar na versão @version@.', |
|
| 700 | - 'plugin_utilise_plugin' => 'O plugin @plugin@ deve estar na versão @version@.', |
|
| 701 | - 'plugin_zip_active' => 'Continue para activar', |
|
| 702 | - 'plugin_zip_adresse' => 'Para carregar um ficheiro zip de plugin, ou uma lista de plugins, introduza o caminho abaixo.', |
|
| 703 | - 'plugin_zip_adresse_champ' => 'Endereço do plugin ou da lista', |
|
| 704 | - 'plugin_zip_content' => 'Contém os seguintes ficheiros (@taille@),<br /> prontos a ser instalados no directório <code>@rep@</code>', |
|
| 705 | - 'plugin_zip_installe_finie' => 'O ficheiro @zip@ foi descomprimido e instalado.', |
|
| 706 | - 'plugin_zip_installe_rep_finie' => 'O ficheiro @zip@ foi descompactado e instalado no directório @rep@', |
|
| 707 | - 'plugin_zip_installer' => 'Agora pode instalar.', |
|
| 708 | - 'plugin_zip_telecharge' => 'O ficheiro @zip@ foi carregado', |
|
| 709 | - 'plugins_actif_aucun' => 'Sem plugins activados.', |
|
| 710 | - 'plugins_actif_un' => 'Um plugin activado.', |
|
| 711 | - 'plugins_actifs' => '@count@ plugins activados.', |
|
| 712 | - 'plugins_actifs_liste' => 'Activados', |
|
| 713 | - 'plugins_compte' => '@count@ plugins', |
|
| 714 | - 'plugins_disponible_un' => 'Um plugin disponível.', |
|
| 715 | - 'plugins_disponibles' => '@count@ plugins disponíveis.', |
|
| 716 | - 'plugins_erreur' => 'Erro nos plugins : @plugins@', |
|
| 717 | - 'plugins_liste' => 'Lista de plugins', |
|
| 718 | - 'plugins_liste_dist' => 'Plugins bloqueados', |
|
| 719 | - 'plugins_recents' => 'Plugins recentes.', |
|
| 720 | - 'plugins_tous_liste' => 'Todos', |
|
| 721 | - 'plugins_vue_hierarchie' => 'Hierarquia', |
|
| 722 | - 'plugins_vue_liste' => 'Lista', |
|
| 723 | - 'protocole_ldap' => 'Versão do protocolo:', |
|
| 648 | + // P |
|
| 649 | + 'page_pas_proxy' => 'Esta página não deve passar através do proxy', |
|
| 650 | + 'pas_de_proxy_pour' => 'Se necessário, indique a que máquinas ou domínios este proxy não se deve aplicar (por exemplo : @exemple@)', |
|
| 651 | + 'phpinfo' => 'Configuração PHP', |
|
| 652 | + 'plugin_charge_paquet' => 'Carregamento do ficheiro @name@', |
|
| 653 | + 'plugin_charger' => 'Download', |
|
| 654 | + 'plugin_erreur_charger' => 'erro : impossível carregar @zip@', |
|
| 655 | + 'plugin_erreur_droit1' => 'Não pode escrever no directório <code>@dest@</code>.', |
|
| 656 | + 'plugin_erreur_droit2' => 'Por favor verifique as autorizações para este directório (e crie o directório se necessário). Alternativamente, instale os ficheiros por FTP.', |
|
| 657 | + 'plugin_erreur_zip' => 'falha pclzip : erro @status@', |
|
| 658 | + 'plugin_etat_developpement' => 'em desenvolvimento', |
|
| 659 | + 'plugin_etat_experimental' => 'experimental', |
|
| 660 | + 'plugin_etat_stable' => 'estável', |
|
| 661 | + 'plugin_etat_test' => 'em teste', |
|
| 662 | + 'plugin_impossible_activer' => 'Impossível activar o plugin @plugin@', |
|
| 663 | + 'plugin_info_automatique1' => 'Se deseja autorizar a instalação automática de plugins, por favor:', |
|
| 664 | + 'plugin_info_automatique1_lib' => 'Se deseja que a biblioteca seja instalada automaticamente, por favor:', |
|
| 665 | + 'plugin_info_automatique2' => 'criar um directório <code>@rep@</code> ;', |
|
| 666 | + 'plugin_info_automatique3' => 'Verifique se o servidor está autorizado a escrever neste directório.', |
|
| 667 | + 'plugin_info_automatique_creer' => 'a criar na raiz do sítio.', |
|
| 668 | + 'plugin_info_automatique_exemples' => 'exemplos:', |
|
| 669 | + 'plugin_info_automatique_ftp' => 'Pode instalar os plugins, por FTP, no directório <tt>@rep@</tt>', |
|
| 670 | + 'plugin_info_automatique_lib' => 'Alguns plugins precisam de estar aptos a carregar ficheiros no directório <code>lib/</code>. Este directório deve ser criado na raiz do sítio.', |
|
| 671 | + 'plugin_info_automatique_liste' => 'As suas listas de plugins :', |
|
| 672 | + 'plugin_info_automatique_liste_officielle' => 'os plugins oficiais', |
|
| 673 | + 'plugin_info_automatique_liste_update' => 'Actualizar as listas', |
|
| 674 | + 'plugin_info_automatique_ou' => 'ou...', |
|
| 675 | + 'plugin_info_automatique_select' => 'Seleccione um plugin abaixo: SPIP irá carregá-lo e instalá-lo no directório <code>@rep@</code>. Se o plugin já existir, será actualizado.', |
|
| 676 | + 'plugin_info_credit' => 'Créditos', |
|
| 677 | + 'plugin_info_erreur_xml' => 'A declaração do plugin está incorrecta', |
|
| 678 | + 'plugin_info_install_ok' => 'Instalado com sucesso', |
|
| 679 | + 'plugin_info_necessite' => 'Requer:', |
|
| 680 | + 'plugin_info_non_compatible_spip' => 'O plugin é incompatível com esta versão de SPIP', |
|
| 681 | + 'plugin_info_plugins_dist_1' => 'Os plugins seguintes estão carregados e activados no directório @plugins_dist@.', |
|
| 682 | + 'plugin_info_plugins_dist_2' => 'Não podem ser desactivados.', |
|
| 683 | + 'plugin_info_telecharger' => 'carregar de @url@ e instalar em @rep@', |
|
| 684 | + 'plugin_info_upgrade_ok' => 'Actualizado com sucesso', |
|
| 685 | + 'plugin_librairies_installees' => 'Bibliotecas instaladas', |
|
| 686 | + 'plugin_necessite_extension_php' => 'Requer a extensão PHP @plugin@ em @version@.', |
|
| 687 | + 'plugin_necessite_extension_php_sans_version' => 'Requer a extensão PHP @plugin@', |
|
| 688 | + 'plugin_necessite_lib' => 'Este plugin requer a biblioteca @lib@', |
|
| 689 | + 'plugin_necessite_php' => 'Requer @plugin@ em versão @version@.', |
|
| 690 | + 'plugin_necessite_plugin' => 'Requer o plugin @plugin@ em versão @version@ ou mais recente.', |
|
| 691 | + 'plugin_necessite_plugin_sans_version' => 'Requer o plugin @plugin@', |
|
| 692 | + 'plugin_necessite_spip' => 'Requer SPIP em version @version@ ou mais recente.', |
|
| 693 | + 'plugin_source' => 'fonte: ', |
|
| 694 | + 'plugin_titre_automatique' => 'Instalação automática', |
|
| 695 | + 'plugin_titre_automatique_ajouter' => 'Adicionar plugins', |
|
| 696 | + 'plugin_titre_installation' => 'Instalação do plugin @plugin@', |
|
| 697 | + 'plugin_titre_modifier' => 'Os meus plugins', |
|
| 698 | + 'plugin_utilise_extension_php' => 'A extensão PHP @plugin@ deve estar na versão @version@.', |
|
| 699 | + 'plugin_utilise_php' => '@plugin@ deve estar na versão @version@.', |
|
| 700 | + 'plugin_utilise_plugin' => 'O plugin @plugin@ deve estar na versão @version@.', |
|
| 701 | + 'plugin_zip_active' => 'Continue para activar', |
|
| 702 | + 'plugin_zip_adresse' => 'Para carregar um ficheiro zip de plugin, ou uma lista de plugins, introduza o caminho abaixo.', |
|
| 703 | + 'plugin_zip_adresse_champ' => 'Endereço do plugin ou da lista', |
|
| 704 | + 'plugin_zip_content' => 'Contém os seguintes ficheiros (@taille@),<br /> prontos a ser instalados no directório <code>@rep@</code>', |
|
| 705 | + 'plugin_zip_installe_finie' => 'O ficheiro @zip@ foi descomprimido e instalado.', |
|
| 706 | + 'plugin_zip_installe_rep_finie' => 'O ficheiro @zip@ foi descompactado e instalado no directório @rep@', |
|
| 707 | + 'plugin_zip_installer' => 'Agora pode instalar.', |
|
| 708 | + 'plugin_zip_telecharge' => 'O ficheiro @zip@ foi carregado', |
|
| 709 | + 'plugins_actif_aucun' => 'Sem plugins activados.', |
|
| 710 | + 'plugins_actif_un' => 'Um plugin activado.', |
|
| 711 | + 'plugins_actifs' => '@count@ plugins activados.', |
|
| 712 | + 'plugins_actifs_liste' => 'Activados', |
|
| 713 | + 'plugins_compte' => '@count@ plugins', |
|
| 714 | + 'plugins_disponible_un' => 'Um plugin disponível.', |
|
| 715 | + 'plugins_disponibles' => '@count@ plugins disponíveis.', |
|
| 716 | + 'plugins_erreur' => 'Erro nos plugins : @plugins@', |
|
| 717 | + 'plugins_liste' => 'Lista de plugins', |
|
| 718 | + 'plugins_liste_dist' => 'Plugins bloqueados', |
|
| 719 | + 'plugins_recents' => 'Plugins recentes.', |
|
| 720 | + 'plugins_tous_liste' => 'Todos', |
|
| 721 | + 'plugins_vue_hierarchie' => 'Hierarquia', |
|
| 722 | + 'plugins_vue_liste' => 'Lista', |
|
| 723 | + 'protocole_ldap' => 'Versão do protocolo:', |
|
| 724 | 724 | |
| 725 | - // Q |
|
| 726 | - 'queue_executer_maintenant' => 'Executar agora', |
|
| 727 | - 'queue_info_purger' => 'Pode eliminar todas as tarefas em espera e pôr a zeros a lista de tarefas periódicas', |
|
| 728 | - 'queue_nb_jobs_in_queue' => '@nb@ tarefas em espera', |
|
| 729 | - 'queue_next_job_in_nb_sec' => 'Próxima tarefa em @nb@ s', |
|
| 730 | - 'queue_no_job_in_queue' => 'Sem tarefas em espera', |
|
| 731 | - 'queue_one_job_in_queue' => '1 tarefa em espera', |
|
| 732 | - 'queue_priorite_tache' => 'prioridade', |
|
| 733 | - 'queue_purger_queue' => 'Pôr a zeros a lista de tarefas', |
|
| 734 | - 'queue_titre' => 'Lista de tarefas', |
|
| 725 | + // Q |
|
| 726 | + 'queue_executer_maintenant' => 'Executar agora', |
|
| 727 | + 'queue_info_purger' => 'Pode eliminar todas as tarefas em espera e pôr a zeros a lista de tarefas periódicas', |
|
| 728 | + 'queue_nb_jobs_in_queue' => '@nb@ tarefas em espera', |
|
| 729 | + 'queue_next_job_in_nb_sec' => 'Próxima tarefa em @nb@ s', |
|
| 730 | + 'queue_no_job_in_queue' => 'Sem tarefas em espera', |
|
| 731 | + 'queue_one_job_in_queue' => '1 tarefa em espera', |
|
| 732 | + 'queue_priorite_tache' => 'prioridade', |
|
| 733 | + 'queue_purger_queue' => 'Pôr a zeros a lista de tarefas', |
|
| 734 | + 'queue_titre' => 'Lista de tarefas', |
|
| 735 | 735 | |
| 736 | - // R |
|
| 737 | - 'repertoire_plugins' => 'Directório :', |
|
| 738 | - 'required' => '(obrigatório)', |
|
| 736 | + // R |
|
| 737 | + 'repertoire_plugins' => 'Directório :', |
|
| 738 | + 'required' => '(obrigatório)', |
|
| 739 | 739 | |
| 740 | - // S |
|
| 741 | - 'sans_heure' => 'tempo não especificado', |
|
| 742 | - 'statut_admin_restreint' => 'administrador restrito', |
|
| 743 | - 'statut_webmestre' => 'webmaster', |
|
| 740 | + // S |
|
| 741 | + 'sans_heure' => 'tempo não especificado', |
|
| 742 | + 'statut_admin_restreint' => 'administrador restrito', |
|
| 743 | + 'statut_webmestre' => 'webmaster', |
|
| 744 | 744 | |
| 745 | - // T |
|
| 746 | - 'tache_cron_asap' => 'Tarefas CRON @function@ (ASAP)', |
|
| 747 | - 'tache_cron_secondes' => 'Tarefa CRON @function@ (todas as @nb@ s)', |
|
| 748 | - 'taille_cache_image' => 'As imagens calculadas automaticamente pelo SPIP (miniaturas dos documentos, títulos apresentados sob forma gráfica, funções matemáticas no formato TeX...) ocupam no directório @dir@ um total de @taille@.', |
|
| 749 | - 'taille_cache_infinie' => 'Este sítio não prevê limitação de tamanho do directório de cache <code>CACHE/</code>.', |
|
| 750 | - 'taille_cache_maxi' => 'SPIP tenta limitar o tamanho do diretório cache <code>CACHE/</code> deste sítio em cerca de <b>@octets@</b>.', |
|
| 751 | - 'taille_cache_moins_de' => 'O tamanho da cache é menor do que @octets@.', |
|
| 752 | - 'taille_cache_octets' => 'O tamanho da cache é actualmente cerca de @octets@.', |
|
| 753 | - 'taille_cache_vide' => 'A cache está vazia.', |
|
| 754 | - 'taille_repertoire_cache' => 'Tamanho do directório cache', |
|
| 755 | - 'text_article_propose_publication' => 'Artigo proposto para publicação. Não hesite em dar a sua opinião graças ao fórum ligado a este artigo (no fundo da página).', |
|
| 756 | - 'texte_acces_ldap_anonyme_1' => 'Alguns servidores LDAP não aceitam nenhum acesso anónimo. Nesse caso, é preciso especificar um identificador de acesso inicial a fim de poder depois procurar informações no anuário. Na maior parte dos casos, porém, os seguintes campos poderão ser deixados vazios.', |
|
| 757 | - 'texte_admin_effacer_01' => 'Este comando apaga <i>todo</i> o conteúdo da base de dados, |
|
| 745 | + // T |
|
| 746 | + 'tache_cron_asap' => 'Tarefas CRON @function@ (ASAP)', |
|
| 747 | + 'tache_cron_secondes' => 'Tarefa CRON @function@ (todas as @nb@ s)', |
|
| 748 | + 'taille_cache_image' => 'As imagens calculadas automaticamente pelo SPIP (miniaturas dos documentos, títulos apresentados sob forma gráfica, funções matemáticas no formato TeX...) ocupam no directório @dir@ um total de @taille@.', |
|
| 749 | + 'taille_cache_infinie' => 'Este sítio não prevê limitação de tamanho do directório de cache <code>CACHE/</code>.', |
|
| 750 | + 'taille_cache_maxi' => 'SPIP tenta limitar o tamanho do diretório cache <code>CACHE/</code> deste sítio em cerca de <b>@octets@</b>.', |
|
| 751 | + 'taille_cache_moins_de' => 'O tamanho da cache é menor do que @octets@.', |
|
| 752 | + 'taille_cache_octets' => 'O tamanho da cache é actualmente cerca de @octets@.', |
|
| 753 | + 'taille_cache_vide' => 'A cache está vazia.', |
|
| 754 | + 'taille_repertoire_cache' => 'Tamanho do directório cache', |
|
| 755 | + 'text_article_propose_publication' => 'Artigo proposto para publicação. Não hesite em dar a sua opinião graças ao fórum ligado a este artigo (no fundo da página).', |
|
| 756 | + 'texte_acces_ldap_anonyme_1' => 'Alguns servidores LDAP não aceitam nenhum acesso anónimo. Nesse caso, é preciso especificar um identificador de acesso inicial a fim de poder depois procurar informações no anuário. Na maior parte dos casos, porém, os seguintes campos poderão ser deixados vazios.', |
|
| 757 | + 'texte_admin_effacer_01' => 'Este comando apaga <i>todo</i> o conteúdo da base de dados, |
|
| 758 | 758 | inclusive <i>todos</i> os acessos de redactores e administradores. Depois de o ter executado, deverá |
| 759 | 759 | reinstalar SPIP para recriar uma nova base assim como uma primeira conta de administrador.', |
| 760 | - 'texte_adresse_annuaire_1' => '(Se o seu anuário está instalado na mesma máquina que este sítio Web, trata-se de «localhost».)', |
|
| 761 | - 'texte_ajout_auteur' => 'O seguinte autor foi acrescentado ao artigo :', |
|
| 762 | - 'texte_annuaire_ldap_1' => 'Se tiver acesso a um anuário (LDAP), pode utilizá-lo para importar automaticamente utilizadores sob SPIP.', |
|
| 763 | - 'texte_article_statut' => 'Este artigo está:', |
|
| 764 | - 'texte_article_virtuel' => 'Artigo virtual', |
|
| 765 | - 'texte_article_virtuel_reference' => '<b>Artigo virtual :</b> artigo referenciado no seu sítio SPIP, mas redirigido para uma outra URL. Para suprimir a redirecção, apague a URL acima.', |
|
| 766 | - 'texte_aucun_resultat_auteur' => 'Nenhum resultado para "@cherche_auteur@"', |
|
| 767 | - 'texte_auteur_messagerie' => 'Este site pode indicar permanentemente a lista dos redactores ligados, o que lhe permite trocar mensagens em directo ( quando o correio está desactivado mais acima, a lista dos redactores está desactivada). Pode decidir não aparecer nesta lista (estando « invisível » para os outros utilizadores).', |
|
| 768 | - 'texte_auteurs' => 'OS AUTORES', |
|
| 769 | - 'texte_choix_base_1' => 'Escolha a sua base de dados :', |
|
| 770 | - 'texte_choix_base_2' => 'O servidor SQL contém várias bases de dados.', |
|
| 771 | - 'texte_choix_base_3' => '<b>Seleccione</b> a seguir a que lhe foi atribuida pelo seu serviço de hospedagem.', |
|
| 772 | - 'texte_choix_table_prefix' => 'Prefixo das tabelas:', |
|
| 773 | - 'texte_compte_element' => '@count@ elemento', |
|
| 774 | - 'texte_compte_elements' => '@count@ elementos', |
|
| 775 | - 'texte_conflit_edition_correction' => 'Por favor compare as diferenças entre as duas versões. Pode também copiar as suas alterações e recomeçar.', |
|
| 776 | - 'texte_connexion_mysql' => 'Consulte as informações fornecidas pelo seu serviço de hospedagem: deve encontrar nelas, se o seu hospedeiro suporta SQL, os códigos de ligação ao servidor SQL.', |
|
| 777 | - 'texte_contenu_article' => '(Conteúdo do artigo em poucas palavras.)', |
|
| 778 | - 'texte_contenu_articles' => 'Segundo a maqueta adoptada para o seu sítio, pode decidir |
|
| 760 | + 'texte_adresse_annuaire_1' => '(Se o seu anuário está instalado na mesma máquina que este sítio Web, trata-se de «localhost».)', |
|
| 761 | + 'texte_ajout_auteur' => 'O seguinte autor foi acrescentado ao artigo :', |
|
| 762 | + 'texte_annuaire_ldap_1' => 'Se tiver acesso a um anuário (LDAP), pode utilizá-lo para importar automaticamente utilizadores sob SPIP.', |
|
| 763 | + 'texte_article_statut' => 'Este artigo está:', |
|
| 764 | + 'texte_article_virtuel' => 'Artigo virtual', |
|
| 765 | + 'texte_article_virtuel_reference' => '<b>Artigo virtual :</b> artigo referenciado no seu sítio SPIP, mas redirigido para uma outra URL. Para suprimir a redirecção, apague a URL acima.', |
|
| 766 | + 'texte_aucun_resultat_auteur' => 'Nenhum resultado para "@cherche_auteur@"', |
|
| 767 | + 'texte_auteur_messagerie' => 'Este site pode indicar permanentemente a lista dos redactores ligados, o que lhe permite trocar mensagens em directo ( quando o correio está desactivado mais acima, a lista dos redactores está desactivada). Pode decidir não aparecer nesta lista (estando « invisível » para os outros utilizadores).', |
|
| 768 | + 'texte_auteurs' => 'OS AUTORES', |
|
| 769 | + 'texte_choix_base_1' => 'Escolha a sua base de dados :', |
|
| 770 | + 'texte_choix_base_2' => 'O servidor SQL contém várias bases de dados.', |
|
| 771 | + 'texte_choix_base_3' => '<b>Seleccione</b> a seguir a que lhe foi atribuida pelo seu serviço de hospedagem.', |
|
| 772 | + 'texte_choix_table_prefix' => 'Prefixo das tabelas:', |
|
| 773 | + 'texte_compte_element' => '@count@ elemento', |
|
| 774 | + 'texte_compte_elements' => '@count@ elementos', |
|
| 775 | + 'texte_conflit_edition_correction' => 'Por favor compare as diferenças entre as duas versões. Pode também copiar as suas alterações e recomeçar.', |
|
| 776 | + 'texte_connexion_mysql' => 'Consulte as informações fornecidas pelo seu serviço de hospedagem: deve encontrar nelas, se o seu hospedeiro suporta SQL, os códigos de ligação ao servidor SQL.', |
|
| 777 | + 'texte_contenu_article' => '(Conteúdo do artigo em poucas palavras.)', |
|
| 778 | + 'texte_contenu_articles' => 'Segundo a maqueta adoptada para o seu sítio, pode decidir |
|
| 779 | 779 | que alguns elementos dos artigos não são utilizados. |
| 780 | 780 | Utilize a lista a seguir para indicar quais são os elementos disponíveis.', |
| 781 | - 'texte_crash_base' => 'Se a sua base de dados foi |
|
| 781 | + 'texte_crash_base' => 'Se a sua base de dados foi |
|
| 782 | 782 | destruída, pode tentar uma reparação |
| 783 | 783 | automática.', |
| 784 | - 'texte_creer_rubrique' => 'Antes de poder escrever artigos, <br /> deve criar uma rubrica.', |
|
| 785 | - 'texte_date_creation_article' => 'DATA DE CRIAÇÃO DO ARTIGO:', |
|
| 786 | - 'texte_date_creation_objet' => 'Data de criação:', # on ajoute le ":" |
|
| 787 | - 'texte_date_publication_anterieure' => 'Data de redacção anterior :', |
|
| 788 | - 'texte_date_publication_anterieure_nonaffichee' => 'Não exibir a data de redacção anterior', |
|
| 789 | - 'texte_date_publication_article' => 'DATA DE PUBLICAÇÃO ONLINE:', |
|
| 790 | - 'texte_date_publication_objet' => 'Data de publicação online:', |
|
| 791 | - 'texte_definir_comme_traduction_rubrique' => 'Esta secção é uma tradução da secção número: ', |
|
| 792 | - 'texte_descriptif_rapide' => 'Descrição rápida', |
|
| 793 | - 'texte_effacer_base' => 'Apagar a base de dados SPIP', |
|
| 794 | - 'texte_effacer_statistiques' => 'Apagar as estatísticas', |
|
| 795 | - 'texte_en_cours_validation' => 'Os artigos e notícias seguintes estão propostos para publicação. Não hesite em dar a sua opinião graças aos fóruns que lhes estão ligados.', |
|
| 796 | - 'texte_enrichir_mise_a_jour' => 'Pode enriquecer a paginação do seu texto, utilizando « atalhos tipográficos ».', |
|
| 797 | - 'texte_fichier_authent' => '<b>Deverá o SPIP criar os ficheiros especiais<tt>.htpasswd-admin</tt> no directório @dossier@?</b> |
|
| 784 | + 'texte_creer_rubrique' => 'Antes de poder escrever artigos, <br /> deve criar uma rubrica.', |
|
| 785 | + 'texte_date_creation_article' => 'DATA DE CRIAÇÃO DO ARTIGO:', |
|
| 786 | + 'texte_date_creation_objet' => 'Data de criação:', # on ajoute le ":" |
|
| 787 | + 'texte_date_publication_anterieure' => 'Data de redacção anterior :', |
|
| 788 | + 'texte_date_publication_anterieure_nonaffichee' => 'Não exibir a data de redacção anterior', |
|
| 789 | + 'texte_date_publication_article' => 'DATA DE PUBLICAÇÃO ONLINE:', |
|
| 790 | + 'texte_date_publication_objet' => 'Data de publicação online:', |
|
| 791 | + 'texte_definir_comme_traduction_rubrique' => 'Esta secção é uma tradução da secção número: ', |
|
| 792 | + 'texte_descriptif_rapide' => 'Descrição rápida', |
|
| 793 | + 'texte_effacer_base' => 'Apagar a base de dados SPIP', |
|
| 794 | + 'texte_effacer_statistiques' => 'Apagar as estatísticas', |
|
| 795 | + 'texte_en_cours_validation' => 'Os artigos e notícias seguintes estão propostos para publicação. Não hesite em dar a sua opinião graças aos fóruns que lhes estão ligados.', |
|
| 796 | + 'texte_enrichir_mise_a_jour' => 'Pode enriquecer a paginação do seu texto, utilizando « atalhos tipográficos ».', |
|
| 797 | + 'texte_fichier_authent' => '<b>Deverá o SPIP criar os ficheiros especiais<tt>.htpasswd-admin</tt> no directório @dossier@?</b> |
|
| 798 | 798 | <p>Estes ficheiros podem servir-lhe para restringir o acesso aos autores |
| 799 | 799 | e administradores a outras partes do seu sítio (por exemplo, um programa externo de estatísticas).<p> |
| 800 | 800 | Se não utilizar os ficheiros especiais, pode deixar esta opção no seu valor por omissão (não há criação de ficheiros).', |
| 801 | - 'texte_informations_personnelles_1' => 'O sistema vai agora criar-lhe um acesso personalizado ao sítio', |
|
| 802 | - 'texte_informations_personnelles_2' => '(Nota : se se tratar de uma reinstalação e se o seu acesso continua funcional, pode', |
|
| 803 | - 'texte_introductif_article' => '(Texto introdutório do artigo.)', |
|
| 804 | - 'texte_jeu_caractere' => 'Esta opção é útil se o seu sítio precisa de exibir alfabetos diferentes do alfabeto romano (ou «ocidental») e seus derivados. Nesse caso, pode ser preferível mudar a definição por defeito para utilizar um conjunto de carácteres adequado; aconselhamos, em todos os casos, a proceder a experiências a fim de encontrar uma solução satisfatória. Se modificar este parâmetro, não esqueça também de adaptar o sítio público (balisa<tt>#CHARSET</tt>).', |
|
| 805 | - 'texte_jeu_caractere_3' => 'O seu sítio usa actualmente o conjunto de caracteres:', |
|
| 806 | - 'texte_jeu_caractere_4' => 'Se não corresponde aos seus dados actuais (pode ocorrer após restaurar a base de dados a partir de uma cópia de segurança), ou se <em> estiver a configurar este sítio </em> e deseja usar um conjunto diferente de caracteres, por favor indique-o aqui :', |
|
| 807 | - 'texte_login_ldap_1' => '(Deixar vazio para um acesso anónimo, ou introduzir o caminho completo, por exemplo, « <tt>uid=silva, ou=users, dc=meu-dominio, dc=com</tt> ».)', |
|
| 808 | - 'texte_login_precaution' => 'Atenção ! Isto é o login sob o qual está ligado actualmente. |
|
| 801 | + 'texte_informations_personnelles_1' => 'O sistema vai agora criar-lhe um acesso personalizado ao sítio', |
|
| 802 | + 'texte_informations_personnelles_2' => '(Nota : se se tratar de uma reinstalação e se o seu acesso continua funcional, pode', |
|
| 803 | + 'texte_introductif_article' => '(Texto introdutório do artigo.)', |
|
| 804 | + 'texte_jeu_caractere' => 'Esta opção é útil se o seu sítio precisa de exibir alfabetos diferentes do alfabeto romano (ou «ocidental») e seus derivados. Nesse caso, pode ser preferível mudar a definição por defeito para utilizar um conjunto de carácteres adequado; aconselhamos, em todos os casos, a proceder a experiências a fim de encontrar uma solução satisfatória. Se modificar este parâmetro, não esqueça também de adaptar o sítio público (balisa<tt>#CHARSET</tt>).', |
|
| 805 | + 'texte_jeu_caractere_3' => 'O seu sítio usa actualmente o conjunto de caracteres:', |
|
| 806 | + 'texte_jeu_caractere_4' => 'Se não corresponde aos seus dados actuais (pode ocorrer após restaurar a base de dados a partir de uma cópia de segurança), ou se <em> estiver a configurar este sítio </em> e deseja usar um conjunto diferente de caracteres, por favor indique-o aqui :', |
|
| 807 | + 'texte_login_ldap_1' => '(Deixar vazio para um acesso anónimo, ou introduzir o caminho completo, por exemplo, « <tt>uid=silva, ou=users, dc=meu-dominio, dc=com</tt> ».)', |
|
| 808 | + 'texte_login_precaution' => 'Atenção ! Isto é o login sob o qual está ligado actualmente. |
|
| 809 | 809 | Utilize este formulário com precaução...', |
| 810 | - 'texte_messagerie_agenda' => 'Um sistema de mensagens permite aos redactores deste sítio comunicar directamente entre si na área privada. Está associado a uma agenda.', |
|
| 811 | - 'texte_mise_a_niveau_base_1' => 'Acaba de actualizar os ficheiros SPIP. |
|
| 810 | + 'texte_messagerie_agenda' => 'Um sistema de mensagens permite aos redactores deste sítio comunicar directamente entre si na área privada. Está associado a uma agenda.', |
|
| 811 | + 'texte_mise_a_niveau_base_1' => 'Acaba de actualizar os ficheiros SPIP. |
|
| 812 | 812 | Agora é preciso pôr a nível a base de dados do sítio. ', |
| 813 | - 'texte_modifier_article' => 'Modificar o artigo :', |
|
| 814 | - 'texte_multilinguisme' => 'Se desejar gerir artigos em muitos idiomas, com uma navegação complexa, pode acrescentar um menu de idioma aos artigos e/ou às rubricas, em função da organização do seu sítio.', |
|
| 815 | - 'texte_multilinguisme_trad' => 'Pode também activar um sistema de gestão de ligações entre as diferentes traduções de um artigo.', |
|
| 816 | - 'texte_non_compresse' => '<i>não comprimido</i> ( o seu servidor não suporta esta funcionalidade)', |
|
| 817 | - 'texte_nouvelle_version_spip_1' => 'Instalou uma nova versão de SPIP.', |
|
| 818 | - 'texte_nouvelle_version_spip_2' => 'Esta nova versão precisa de uma actualização mais completa do que o normal. Se é o webmaster do sítio, por favor, apague o ficheiro <tt>inc_connect.php3</tt> do directório <tt>ecrire</tt> e retome a instalação de modo a incluir os seus parâmetros de ligação à base de dados.<p> (NB.: se não se lembra dos seus parâmetros de ligação, consulte o arquivo @connect@ antes de o apagar...)</p>', |
|
| 819 | - 'texte_operation_echec' => 'Volte à página anterior, seleccione uma outra base de dados ou crie uma nova. Verifique as informações fornecidas pelo seu serviço de hospedagem.', |
|
| 820 | - 'texte_plus_trois_car' => 'mais de 3 carácteres', |
|
| 821 | - 'texte_plusieurs_articles' => 'Muitos autores encontrados para "@cherche_auteur@":', |
|
| 822 | - 'texte_port_annuaire' => '(O valor indicado por defeito geralmente convém.)', |
|
| 823 | - 'texte_presente_plugin' => 'Esta página mostra os plugins disponíveis neste sítio. Pode activar os plugins necessários selaccionando a caixa correspondente.', |
|
| 824 | - 'texte_proposer_publication' => 'Quando terminar o seu artigo, <br /> pode propor a sua publicação.', |
|
| 825 | - 'texte_proxy' => 'Em alguns caso (intranet, redes protegidas...), |
|
| 813 | + 'texte_modifier_article' => 'Modificar o artigo :', |
|
| 814 | + 'texte_multilinguisme' => 'Se desejar gerir artigos em muitos idiomas, com uma navegação complexa, pode acrescentar um menu de idioma aos artigos e/ou às rubricas, em função da organização do seu sítio.', |
|
| 815 | + 'texte_multilinguisme_trad' => 'Pode também activar um sistema de gestão de ligações entre as diferentes traduções de um artigo.', |
|
| 816 | + 'texte_non_compresse' => '<i>não comprimido</i> ( o seu servidor não suporta esta funcionalidade)', |
|
| 817 | + 'texte_nouvelle_version_spip_1' => 'Instalou uma nova versão de SPIP.', |
|
| 818 | + 'texte_nouvelle_version_spip_2' => 'Esta nova versão precisa de uma actualização mais completa do que o normal. Se é o webmaster do sítio, por favor, apague o ficheiro <tt>inc_connect.php3</tt> do directório <tt>ecrire</tt> e retome a instalação de modo a incluir os seus parâmetros de ligação à base de dados.<p> (NB.: se não se lembra dos seus parâmetros de ligação, consulte o arquivo @connect@ antes de o apagar...)</p>', |
|
| 819 | + 'texte_operation_echec' => 'Volte à página anterior, seleccione uma outra base de dados ou crie uma nova. Verifique as informações fornecidas pelo seu serviço de hospedagem.', |
|
| 820 | + 'texte_plus_trois_car' => 'mais de 3 carácteres', |
|
| 821 | + 'texte_plusieurs_articles' => 'Muitos autores encontrados para "@cherche_auteur@":', |
|
| 822 | + 'texte_port_annuaire' => '(O valor indicado por defeito geralmente convém.)', |
|
| 823 | + 'texte_presente_plugin' => 'Esta página mostra os plugins disponíveis neste sítio. Pode activar os plugins necessários selaccionando a caixa correspondente.', |
|
| 824 | + 'texte_proposer_publication' => 'Quando terminar o seu artigo, <br /> pode propor a sua publicação.', |
|
| 825 | + 'texte_proxy' => 'Em alguns caso (intranet, redes protegidas...), |
|
| 826 | 826 | pode ser necessário utilizar um <i>proxy HTTP</i> para atingir os sítios vinculados. |
| 827 | 827 | Se for o caso, indique a seguir o endereço, sob a forma |
| 828 | 828 | @proxy_en_cours@. Em geral, |
| 829 | 829 | poderá deixar esta caixa vazia.', |
| 830 | - 'texte_publication_articles_post_dates' => 'Que comportamento SPIP deve adoptar perante os artigos cuja |
|
| 830 | + 'texte_publication_articles_post_dates' => 'Que comportamento SPIP deve adoptar perante os artigos cuja |
|
| 831 | 831 | data de publicação foi fixada para um prazo futuro ?', |
| 832 | - 'texte_rappel_selection_champs' => '[Não esquecer de seleccionar correctamente este campo.]', |
|
| 833 | - 'texte_recalcul_page' => 'Se quiser |
|
| 832 | + 'texte_rappel_selection_champs' => '[Não esquecer de seleccionar correctamente este campo.]', |
|
| 833 | + 'texte_recalcul_page' => 'Se quiser |
|
| 834 | 834 | recompor uma única página, passe pelo espaço público e utilize o botão «recompor».', |
| 835 | - 'texte_recuperer_base' => 'Reparar a base de dados', |
|
| 836 | - 'texte_reference_mais_redirige' => 'artigo referenciado no seu sítio SPIP, mas redirigido para uma outra URL.', |
|
| 837 | - 'texte_requetes_echouent' => '<b>Quando algumas consultas SQL falharem sistematicamente e sem razão aparente, é possível que seja por causa da própria base de dados |
|
| 835 | + 'texte_recuperer_base' => 'Reparar a base de dados', |
|
| 836 | + 'texte_reference_mais_redirige' => 'artigo referenciado no seu sítio SPIP, mas redirigido para uma outra URL.', |
|
| 837 | + 'texte_requetes_echouent' => '<b>Quando algumas consultas SQL falharem sistematicamente e sem razão aparente, é possível que seja por causa da própria base de dados |
|
| 838 | 838 | .</b><p> |
| 839 | 839 | SQL dispõe de uma funcionalidade de reparação das suas tabelas quando forem acidententalmente danificadas. Pode tentar aqui essa reparação: se falhar, conserve uma cópia da exibição que talvez contenha |
| 840 | 840 | indícios daquilo que não funciona...<p> |
| 841 | 841 | Se o problema persistir, contacte o seu serviço de hospedagem.', |
| 842 | - 'texte_selection_langue_principale' => 'Pode seleccionar a seguir o « idioma principal » do sítio. Esta opção não o obriga - felizmente ! - a escrever os seus artigos no idioma seleccionado, mas permite determinar : |
|
| 842 | + 'texte_selection_langue_principale' => 'Pode seleccionar a seguir o « idioma principal » do sítio. Esta opção não o obriga - felizmente ! - a escrever os seus artigos no idioma seleccionado, mas permite determinar : |
|
| 843 | 843 | <u><li> o formato por defeito das datas no sítio público ;</li> |
| 844 | 844 | <li> a natureza do motor tipográfico que SPIP deve utilizar para a restituição dos textos ;</li> |
| 845 | 845 | <li> o idioma utilizado nos formulários do sítio público ;</li> |
| 846 | 846 | <li> o idioma apresentado por defeito no espaço privado.</li></ul> ', |
| 847 | - 'texte_sous_titre' => 'Sub-título', |
|
| 848 | - 'texte_statistiques_visites' => '(barras escuras : domingo / curva escura : evolução da média)', |
|
| 849 | - 'texte_statut_attente_validation' => 'à espera de validação', |
|
| 850 | - 'texte_statut_publies' => 'publicados online', |
|
| 851 | - 'texte_statut_refuses' => 'recusados', |
|
| 852 | - 'texte_suppression_fichiers' => 'Utilize este comando para suprimir todos os ficheiros presentes |
|
| 847 | + 'texte_sous_titre' => 'Sub-título', |
|
| 848 | + 'texte_statistiques_visites' => '(barras escuras : domingo / curva escura : evolução da média)', |
|
| 849 | + 'texte_statut_attente_validation' => 'à espera de validação', |
|
| 850 | + 'texte_statut_publies' => 'publicados online', |
|
| 851 | + 'texte_statut_refuses' => 'recusados', |
|
| 852 | + 'texte_suppression_fichiers' => 'Utilize este comando para suprimir todos os ficheiros presentes |
|
| 853 | 853 | na cache SPIP. Isso permite, por exemplo, obrigar uma recomposição de todas as páginas se você |
| 854 | 854 | fez modificações importantes de grafismo ou de estrutura do sítio.', |
| 855 | - 'texte_sur_titre' => 'Supra-título', |
|
| 856 | - 'texte_table_ok' => ': esta tabela está OK.', |
|
| 857 | - 'texte_tentative_recuperation' => 'Tentativa de reparação', |
|
| 858 | - 'texte_tenter_reparation' => 'Tentar uma reparação da base de dados', |
|
| 859 | - 'texte_test_proxy' => 'Para experimentar este proxy, indique aqui o endereço de um sítio Web |
|
| 855 | + 'texte_sur_titre' => 'Supra-título', |
|
| 856 | + 'texte_table_ok' => ': esta tabela está OK.', |
|
| 857 | + 'texte_tentative_recuperation' => 'Tentativa de reparação', |
|
| 858 | + 'texte_tenter_reparation' => 'Tentar uma reparação da base de dados', |
|
| 859 | + 'texte_test_proxy' => 'Para experimentar este proxy, indique aqui o endereço de um sítio Web |
|
| 860 | 860 | que deseje testar;', |
| 861 | - 'texte_titre_02' => 'Título', |
|
| 862 | - 'texte_titre_obligatoire' => '<b>Título</b> [Obrigatório]', |
|
| 863 | - 'texte_travail_article' => '@nom_auteur_modif@ trabalhou sobre este artigo há @date_diff@ minutes', |
|
| 864 | - 'texte_travail_collaboratif' => 'Se é frequente muitos redactores |
|
| 861 | + 'texte_titre_02' => 'Título', |
|
| 862 | + 'texte_titre_obligatoire' => '<b>Título</b> [Obrigatório]', |
|
| 863 | + 'texte_travail_article' => '@nom_auteur_modif@ trabalhou sobre este artigo há @date_diff@ minutes', |
|
| 864 | + 'texte_travail_collaboratif' => 'Se é frequente muitos redactores |
|
| 865 | 865 | trabalharem no mesmo artigo, o sistema |
| 866 | 866 | pode exibir os artigos recentemente « abertos » |
| 867 | 867 | a fim de evitar as modificações simultâneas. |
| 868 | 868 | Esta opção está desactivada por defeito |
| 869 | 869 | a fim de evitar exibir mensagens de aviso |
| 870 | 870 | intempestivas.', |
| 871 | - 'texte_vide' => 'vazio', |
|
| 872 | - 'texte_vider_cache' => 'Esvaziar a cache', |
|
| 873 | - 'titre_admin_tech' => 'Manutenção técnica', |
|
| 874 | - 'titre_admin_vider' => 'Manutenção técnica', |
|
| 875 | - 'titre_ajouter_un_auteur' => 'Adicionar um autor', |
|
| 876 | - 'titre_ajouter_un_mot' => 'Adicionar uma palavra-chave', |
|
| 877 | - 'titre_cadre_afficher_article' => 'Exibir os artigos', |
|
| 878 | - 'titre_cadre_afficher_traductions' => 'Exibir o estado das traduções para estes idiomas:', |
|
| 879 | - 'titre_cadre_ajouter_auteur' => 'ACRESCENTAR UM AUTOR :', |
|
| 880 | - 'titre_cadre_interieur_rubrique' => 'Dentro da rubrica', |
|
| 881 | - 'titre_cadre_numero_auteur' => 'AUTOR NÚMERO', |
|
| 882 | - 'titre_cadre_numero_objet' => '@objet@ NÚMERO:', |
|
| 883 | - 'titre_cadre_signature_obligatoire' => '<b>Assinatura</b> [Obrigatória]<br />', |
|
| 884 | - 'titre_config_contenu_notifications' => 'Notificações', |
|
| 885 | - 'titre_config_contenu_prive' => 'Na área privada', |
|
| 886 | - 'titre_config_contenu_public' => 'No sítio público', |
|
| 887 | - 'titre_config_fonctions' => 'Configuração do sítio', |
|
| 888 | - 'titre_config_langage' => 'Configurar o idioma', |
|
| 889 | - 'titre_configuration' => 'Configuração do sítio', |
|
| 890 | - 'titre_configurer_preferences' => 'Configure as suas preferências', |
|
| 891 | - 'titre_configurer_preferences_menus' => 'Definir as suas preferências de menu', |
|
| 892 | - 'titre_conflit_edition' => 'Conflito durante a redacção', |
|
| 893 | - 'titre_connexion_ldap' => 'Opções: <b>Sua ligação LDAP</b>', |
|
| 894 | - 'titre_groupe_mots' => 'GRUPO DE PALAVRAS :', |
|
| 895 | - 'titre_identite_site' => 'Identidade do sítio', |
|
| 896 | - 'titre_langue_article' => 'IDIOMA DO ARTIGO ', |
|
| 897 | - 'titre_langue_rubrique' => 'Idioma da rubrica', |
|
| 898 | - 'titre_langue_trad_article' => 'IDIOMA E TRADUÇÕES DO ARTIGO', |
|
| 899 | - 'titre_les_articles' => 'OS ARTIGOS', |
|
| 900 | - 'titre_messagerie_agenda' => 'Mensagens e agenda', |
|
| 901 | - 'titre_naviguer_dans_le_site' => 'Navegar no sítio', |
|
| 902 | - 'titre_nouvelle_rubrique' => 'Nova rubrica', |
|
| 903 | - 'titre_numero_rubrique' => 'RUBRICA NÚMERO :', |
|
| 904 | - 'titre_page_articles_edit' => 'Modificar : @titre@', |
|
| 905 | - 'titre_page_articles_page' => 'Os artigos', |
|
| 906 | - 'titre_page_articles_tous' => 'Todo o sítio', |
|
| 907 | - 'titre_page_calendrier' => 'Calendário @nom_mois@ @annee@', |
|
| 908 | - 'titre_page_config_contenu' => 'Configuração do sítio', |
|
| 909 | - 'titre_page_delete_all' => 'Supressão total e irreversível', |
|
| 910 | - 'titre_page_recherche' => 'Resultados da pesquisa @recherche@', |
|
| 911 | - 'titre_page_statistiques_referers' => 'Estatísticas (ligações de entrada)', |
|
| 912 | - 'titre_page_upgrade' => 'Reactualização de SPIP', |
|
| 913 | - 'titre_preference_menus_favoris' => 'Menus de marcadores', |
|
| 914 | - 'titre_publication_articles_post_dates' => 'Publicação dos artigos pós-datados', |
|
| 915 | - 'titre_reparation' => 'Reparação', |
|
| 916 | - 'titre_suivi_petition' => 'Seguimento dos abaixo-assinados', |
|
| 917 | - 'tls_ldap' => 'Transport Layer Security :', |
|
| 918 | - 'trad_article_traduction' => 'Todas as versões deste artigo :', |
|
| 919 | - 'trad_delier' => 'Não voltar a ligar este artigo a estas traduções', |
|
| 920 | - 'trad_lier' => 'Este artigo é uma tradução do artigo número :', |
|
| 921 | - 'trad_new' => 'Escrever uma nova tradução deste artigo', |
|
| 871 | + 'texte_vide' => 'vazio', |
|
| 872 | + 'texte_vider_cache' => 'Esvaziar a cache', |
|
| 873 | + 'titre_admin_tech' => 'Manutenção técnica', |
|
| 874 | + 'titre_admin_vider' => 'Manutenção técnica', |
|
| 875 | + 'titre_ajouter_un_auteur' => 'Adicionar um autor', |
|
| 876 | + 'titre_ajouter_un_mot' => 'Adicionar uma palavra-chave', |
|
| 877 | + 'titre_cadre_afficher_article' => 'Exibir os artigos', |
|
| 878 | + 'titre_cadre_afficher_traductions' => 'Exibir o estado das traduções para estes idiomas:', |
|
| 879 | + 'titre_cadre_ajouter_auteur' => 'ACRESCENTAR UM AUTOR :', |
|
| 880 | + 'titre_cadre_interieur_rubrique' => 'Dentro da rubrica', |
|
| 881 | + 'titre_cadre_numero_auteur' => 'AUTOR NÚMERO', |
|
| 882 | + 'titre_cadre_numero_objet' => '@objet@ NÚMERO:', |
|
| 883 | + 'titre_cadre_signature_obligatoire' => '<b>Assinatura</b> [Obrigatória]<br />', |
|
| 884 | + 'titre_config_contenu_notifications' => 'Notificações', |
|
| 885 | + 'titre_config_contenu_prive' => 'Na área privada', |
|
| 886 | + 'titre_config_contenu_public' => 'No sítio público', |
|
| 887 | + 'titre_config_fonctions' => 'Configuração do sítio', |
|
| 888 | + 'titre_config_langage' => 'Configurar o idioma', |
|
| 889 | + 'titre_configuration' => 'Configuração do sítio', |
|
| 890 | + 'titre_configurer_preferences' => 'Configure as suas preferências', |
|
| 891 | + 'titre_configurer_preferences_menus' => 'Definir as suas preferências de menu', |
|
| 892 | + 'titre_conflit_edition' => 'Conflito durante a redacção', |
|
| 893 | + 'titre_connexion_ldap' => 'Opções: <b>Sua ligação LDAP</b>', |
|
| 894 | + 'titre_groupe_mots' => 'GRUPO DE PALAVRAS :', |
|
| 895 | + 'titre_identite_site' => 'Identidade do sítio', |
|
| 896 | + 'titre_langue_article' => 'IDIOMA DO ARTIGO ', |
|
| 897 | + 'titre_langue_rubrique' => 'Idioma da rubrica', |
|
| 898 | + 'titre_langue_trad_article' => 'IDIOMA E TRADUÇÕES DO ARTIGO', |
|
| 899 | + 'titre_les_articles' => 'OS ARTIGOS', |
|
| 900 | + 'titre_messagerie_agenda' => 'Mensagens e agenda', |
|
| 901 | + 'titre_naviguer_dans_le_site' => 'Navegar no sítio', |
|
| 902 | + 'titre_nouvelle_rubrique' => 'Nova rubrica', |
|
| 903 | + 'titre_numero_rubrique' => 'RUBRICA NÚMERO :', |
|
| 904 | + 'titre_page_articles_edit' => 'Modificar : @titre@', |
|
| 905 | + 'titre_page_articles_page' => 'Os artigos', |
|
| 906 | + 'titre_page_articles_tous' => 'Todo o sítio', |
|
| 907 | + 'titre_page_calendrier' => 'Calendário @nom_mois@ @annee@', |
|
| 908 | + 'titre_page_config_contenu' => 'Configuração do sítio', |
|
| 909 | + 'titre_page_delete_all' => 'Supressão total e irreversível', |
|
| 910 | + 'titre_page_recherche' => 'Resultados da pesquisa @recherche@', |
|
| 911 | + 'titre_page_statistiques_referers' => 'Estatísticas (ligações de entrada)', |
|
| 912 | + 'titre_page_upgrade' => 'Reactualização de SPIP', |
|
| 913 | + 'titre_preference_menus_favoris' => 'Menus de marcadores', |
|
| 914 | + 'titre_publication_articles_post_dates' => 'Publicação dos artigos pós-datados', |
|
| 915 | + 'titre_reparation' => 'Reparação', |
|
| 916 | + 'titre_suivi_petition' => 'Seguimento dos abaixo-assinados', |
|
| 917 | + 'tls_ldap' => 'Transport Layer Security :', |
|
| 918 | + 'trad_article_traduction' => 'Todas as versões deste artigo :', |
|
| 919 | + 'trad_delier' => 'Não voltar a ligar este artigo a estas traduções', |
|
| 920 | + 'trad_lier' => 'Este artigo é uma tradução do artigo número :', |
|
| 921 | + 'trad_new' => 'Escrever uma nova tradução deste artigo', |
|
| 922 | 922 | |
| 923 | - // U |
|
| 924 | - 'utf8_convert_erreur_orig' => 'Erro : o conjunto de caracteres @charset@ não é suportado.', |
|
| 923 | + // U |
|
| 924 | + 'utf8_convert_erreur_orig' => 'Erro : o conjunto de caracteres @charset@ não é suportado.', |
|
| 925 | 925 | |
| 926 | - // V |
|
| 927 | - 'version' => 'Versão:' |
|
| 926 | + // V |
|
| 927 | + 'version' => 'Versão:' |
|
| 928 | 928 | ); |
@@ -17,7 +17,7 @@ discard block |
||
| 17 | 17 | */ |
| 18 | 18 | |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | include_spip('inc/config'); |
@@ -37,26 +37,26 @@ discard block |
||
| 37 | 37 | */ |
| 38 | 38 | function exec_admin_plugin_dist($retour = '') { |
| 39 | 39 | |
| 40 | - if (!autoriser('configurer', '_plugins')) { |
|
| 41 | - include_spip('inc/minipres'); |
|
| 42 | - echo minipres(); |
|
| 43 | - } else { |
|
| 44 | - // on fait la verif du path avant tout, |
|
| 45 | - // et l'installation des qu'on est dans la colonne principale |
|
| 46 | - // si jamais la liste des plugins actifs change, il faut faire un refresh du hit |
|
| 47 | - // pour etre sur que les bons fichiers seront charges lors de l'install |
|
| 48 | - $new = actualise_plugins_actifs(); |
|
| 49 | - if ($new and _request('actualise') < 2) { |
|
| 50 | - include_spip('inc/headers'); |
|
| 51 | - if (isset($GLOBALS['fichier_php_compile_recent'])) { |
|
| 52 | - // attendre eventuellement l'invalidation du cache opcode |
|
| 53 | - spip_attend_invalidation_opcode_cache($GLOBALS['fichier_php_compile_recent']); |
|
| 54 | - } |
|
| 55 | - redirige_par_entete(parametre_url(self(), 'actualise', _request('actualise') + 1, '&')); |
|
| 56 | - } else { |
|
| 57 | - admin_plug_args(_request('voir'), _request('erreur'), _request('format')); |
|
| 58 | - } |
|
| 59 | - } |
|
| 40 | + if (!autoriser('configurer', '_plugins')) { |
|
| 41 | + include_spip('inc/minipres'); |
|
| 42 | + echo minipres(); |
|
| 43 | + } else { |
|
| 44 | + // on fait la verif du path avant tout, |
|
| 45 | + // et l'installation des qu'on est dans la colonne principale |
|
| 46 | + // si jamais la liste des plugins actifs change, il faut faire un refresh du hit |
|
| 47 | + // pour etre sur que les bons fichiers seront charges lors de l'install |
|
| 48 | + $new = actualise_plugins_actifs(); |
|
| 49 | + if ($new and _request('actualise') < 2) { |
|
| 50 | + include_spip('inc/headers'); |
|
| 51 | + if (isset($GLOBALS['fichier_php_compile_recent'])) { |
|
| 52 | + // attendre eventuellement l'invalidation du cache opcode |
|
| 53 | + spip_attend_invalidation_opcode_cache($GLOBALS['fichier_php_compile_recent']); |
|
| 54 | + } |
|
| 55 | + redirige_par_entete(parametre_url(self(), 'actualise', _request('actualise') + 1, '&')); |
|
| 56 | + } else { |
|
| 57 | + admin_plug_args(_request('voir'), _request('erreur'), _request('format')); |
|
| 58 | + } |
|
| 59 | + } |
|
| 60 | 60 | } |
| 61 | 61 | |
| 62 | 62 | /** |
@@ -81,132 +81,132 @@ discard block |
||
| 81 | 81 | * Format d'affichage (liste ou arborescence) |
| 82 | 82 | **/ |
| 83 | 83 | function admin_plug_args($quoi, $erreur, $format) { |
| 84 | - $lpf = null; |
|
| 85 | - $lcpas = null; |
|
| 86 | - $lcpaffichesup = null; |
|
| 87 | - if (!$quoi) { |
|
| 88 | - $quoi = 'actifs'; |
|
| 89 | - } |
|
| 90 | - // empecher l'affichage des erreurs dans le bandeau, on le donne ensuite |
|
| 91 | - // format brut par plugin |
|
| 92 | - $GLOBALS['erreurs_activation_raw'] = plugin_donne_erreurs(true, false); |
|
| 93 | - // format resume mis en forme |
|
| 94 | - $erreur_activation = plugin_donne_erreurs(); |
|
| 95 | - $commencer_page = charger_fonction('commencer_page', 'inc'); |
|
| 96 | - echo $commencer_page(_T('icone_admin_plugin'), 'configuration', 'plugin'); |
|
| 97 | - |
|
| 98 | - echo debut_gauche(); |
|
| 99 | - echo recuperer_fond('prive/squelettes/navigation/configurer', ['exec' => 'admin_plugin']); |
|
| 100 | - |
|
| 101 | - echo pipeline( |
|
| 102 | - 'affiche_gauche', |
|
| 103 | - [ |
|
| 104 | - 'args' => ['exec' => 'admin_plugin'], |
|
| 105 | - 'data' => afficher_librairies() |
|
| 106 | - ] |
|
| 107 | - ); |
|
| 108 | - |
|
| 109 | - echo debut_droite(); |
|
| 110 | - echo gros_titre(_T('icone_admin_plugin'), ''); |
|
| 111 | - |
|
| 112 | - // Barre d'onglets de premier niveau |
|
| 113 | - echo barre_onglets('plugins', 'plugins_actifs'); |
|
| 114 | - // Barre d'onglets de second niveau |
|
| 115 | - $onglet2 = $quoi == 'actifs' ? 'plugins_actifs' : 'admin_plugin'; |
|
| 116 | - echo debut_onglet('onglets_simple second'); |
|
| 117 | - echo onglet(_T('plugins_tous_liste'), generer_url_ecrire('admin_plugin', 'voir=tous'), 'admin_plugin', $onglet2); |
|
| 118 | - echo onglet(_T('plugins_actifs_liste'), generer_url_ecrire('admin_plugin'), 'plugins_actifs', $onglet2); |
|
| 119 | - echo fin_onglet(); |
|
| 120 | - |
|
| 121 | - // message d'erreur au retour d'une operation |
|
| 122 | - if ($erreur) { |
|
| 123 | - echo "<div class='error'>$erreur</div>"; |
|
| 124 | - } |
|
| 125 | - if ($erreur_activation) { |
|
| 126 | - echo "<div class='error'>$erreur_activation</div>"; |
|
| 127 | - } |
|
| 128 | - |
|
| 129 | - // la mise a jour de cette meta a ete faite par ecrire_plugin_actifs |
|
| 130 | - $actifs = (array) unserialize($GLOBALS['meta']['plugin']); |
|
| 131 | - $lcpa = $actifs + (array) unserialize($GLOBALS['meta']['plugin_attente']); |
|
| 132 | - |
|
| 133 | - // Les affichages se basent sur le repertoire, pas sur le nom |
|
| 134 | - $actifs = liste_chemin_plugin($actifs, ''); |
|
| 135 | - if (defined('_DIR_PLUGINS_SUPPL')) { |
|
| 136 | - $lcpas = liste_chemin_plugin($lcpa, _DIR_PLUGINS_SUPPL); |
|
| 137 | - } |
|
| 138 | - $lcpa = liste_chemin_plugin($lcpa); |
|
| 139 | - |
|
| 140 | - // on installe les plugins maintenant, |
|
| 141 | - // cela permet aux scripts d'install de faire des affichages (moches...) |
|
| 142 | - plugin_installes_meta(); |
|
| 143 | - |
|
| 144 | - echo "<div class='liste-plugins formulaire_spip'>"; |
|
| 145 | - echo debut_cadre_trait_couleur('plugin-24.png', true, '', _T('plugins_liste'), 'plugins'); |
|
| 146 | - |
|
| 147 | - if ($quoi !== 'actifs') { |
|
| 148 | - $lpf = liste_plugin_files(); |
|
| 149 | - if ($lpf) { |
|
| 150 | - echo '<p>' . _T('texte_presente_plugin') . '</p>'; |
|
| 151 | - } else { |
|
| 152 | - if (!@is_dir(_DIR_PLUGINS)) { |
|
| 153 | - echo '<p>' . _T('plugin_info_automatique_ftp', ['rep' => joli_repertoire(_DIR_PLUGINS)]) |
|
| 154 | - . ' — ' . _T('plugin_info_automatique_creer') . '</p>'; |
|
| 155 | - } |
|
| 156 | - } |
|
| 157 | - $lcpaffiche = $lpf; |
|
| 158 | - if (defined('_DIR_PLUGINS_SUPPL')) { |
|
| 159 | - $lcpaffichesup = liste_plugin_files(_DIR_PLUGINS_SUPPL); |
|
| 160 | - } |
|
| 161 | - } else { |
|
| 162 | - // la liste |
|
| 163 | - // $quoi=='actifs' |
|
| 164 | - $lcpaffiche = $lcpa; |
|
| 165 | - if (defined('_DIR_PLUGINS_SUPPL')) { |
|
| 166 | - $lcpaffichesup = $lcpas; |
|
| 167 | - } |
|
| 168 | - } |
|
| 169 | - |
|
| 170 | - if ($quoi == 'actifs' or $lpf) { |
|
| 171 | - $nb = is_countable($lcpa) ? count($lcpa) : 0; |
|
| 172 | - if (defined('_DIR_PLUGINS_SUPPL')) { |
|
| 173 | - $nb += is_countable($lcpas) ? count($lcpas) : 0; |
|
| 174 | - } |
|
| 175 | - echo '<h3>' . sinon( |
|
| 176 | - singulier_ou_pluriel($nb, 'plugins_actif_un', 'plugins_actifs', 'count'), |
|
| 177 | - _T('plugins_actif_aucun') |
|
| 178 | - ) . '</h3>'; |
|
| 179 | - } |
|
| 180 | - |
|
| 181 | - if (empty($format)) { |
|
| 182 | - $format = 'liste'; |
|
| 183 | - } elseif (!in_array($format, ['liste', 'repertoires'])) { |
|
| 184 | - $format = 'repertoires'; |
|
| 185 | - } |
|
| 186 | - |
|
| 187 | - $afficher = charger_fonction("afficher_$format", 'plugins'); |
|
| 188 | - $corps = $afficher(self(), $lcpaffiche, $lcpa, $actifs); |
|
| 189 | - if (defined('_DIR_PLUGINS_SUPPL')) { |
|
| 190 | - $corps .= $afficher(self(), $lcpaffichesup, $lcpas, $actifs, _DIR_PLUGINS_SUPPL); |
|
| 191 | - } |
|
| 192 | - |
|
| 193 | - if ($corps) { |
|
| 194 | - $corps .= "\n<div class='boutons' style='display:none;'>" |
|
| 195 | - . "<input type='submit' class='submit save' value='" . _T('bouton_enregistrer') |
|
| 196 | - . "' />" |
|
| 197 | - . '</div>'; |
|
| 198 | - } |
|
| 199 | - |
|
| 200 | - echo redirige_action_post('activer_plugins', 'activer', 'admin_plugin', '', $corps); |
|
| 201 | - |
|
| 202 | - echo fin_cadre_trait_couleur(); |
|
| 203 | - |
|
| 204 | - if ($quoi == 'actifs') { |
|
| 205 | - echo affiche_les_plugins_verrouilles($actifs); |
|
| 206 | - } |
|
| 207 | - echo '</div>'; |
|
| 208 | - |
|
| 209 | - echo http_script(" |
|
| 84 | + $lpf = null; |
|
| 85 | + $lcpas = null; |
|
| 86 | + $lcpaffichesup = null; |
|
| 87 | + if (!$quoi) { |
|
| 88 | + $quoi = 'actifs'; |
|
| 89 | + } |
|
| 90 | + // empecher l'affichage des erreurs dans le bandeau, on le donne ensuite |
|
| 91 | + // format brut par plugin |
|
| 92 | + $GLOBALS['erreurs_activation_raw'] = plugin_donne_erreurs(true, false); |
|
| 93 | + // format resume mis en forme |
|
| 94 | + $erreur_activation = plugin_donne_erreurs(); |
|
| 95 | + $commencer_page = charger_fonction('commencer_page', 'inc'); |
|
| 96 | + echo $commencer_page(_T('icone_admin_plugin'), 'configuration', 'plugin'); |
|
| 97 | + |
|
| 98 | + echo debut_gauche(); |
|
| 99 | + echo recuperer_fond('prive/squelettes/navigation/configurer', ['exec' => 'admin_plugin']); |
|
| 100 | + |
|
| 101 | + echo pipeline( |
|
| 102 | + 'affiche_gauche', |
|
| 103 | + [ |
|
| 104 | + 'args' => ['exec' => 'admin_plugin'], |
|
| 105 | + 'data' => afficher_librairies() |
|
| 106 | + ] |
|
| 107 | + ); |
|
| 108 | + |
|
| 109 | + echo debut_droite(); |
|
| 110 | + echo gros_titre(_T('icone_admin_plugin'), ''); |
|
| 111 | + |
|
| 112 | + // Barre d'onglets de premier niveau |
|
| 113 | + echo barre_onglets('plugins', 'plugins_actifs'); |
|
| 114 | + // Barre d'onglets de second niveau |
|
| 115 | + $onglet2 = $quoi == 'actifs' ? 'plugins_actifs' : 'admin_plugin'; |
|
| 116 | + echo debut_onglet('onglets_simple second'); |
|
| 117 | + echo onglet(_T('plugins_tous_liste'), generer_url_ecrire('admin_plugin', 'voir=tous'), 'admin_plugin', $onglet2); |
|
| 118 | + echo onglet(_T('plugins_actifs_liste'), generer_url_ecrire('admin_plugin'), 'plugins_actifs', $onglet2); |
|
| 119 | + echo fin_onglet(); |
|
| 120 | + |
|
| 121 | + // message d'erreur au retour d'une operation |
|
| 122 | + if ($erreur) { |
|
| 123 | + echo "<div class='error'>$erreur</div>"; |
|
| 124 | + } |
|
| 125 | + if ($erreur_activation) { |
|
| 126 | + echo "<div class='error'>$erreur_activation</div>"; |
|
| 127 | + } |
|
| 128 | + |
|
| 129 | + // la mise a jour de cette meta a ete faite par ecrire_plugin_actifs |
|
| 130 | + $actifs = (array) unserialize($GLOBALS['meta']['plugin']); |
|
| 131 | + $lcpa = $actifs + (array) unserialize($GLOBALS['meta']['plugin_attente']); |
|
| 132 | + |
|
| 133 | + // Les affichages se basent sur le repertoire, pas sur le nom |
|
| 134 | + $actifs = liste_chemin_plugin($actifs, ''); |
|
| 135 | + if (defined('_DIR_PLUGINS_SUPPL')) { |
|
| 136 | + $lcpas = liste_chemin_plugin($lcpa, _DIR_PLUGINS_SUPPL); |
|
| 137 | + } |
|
| 138 | + $lcpa = liste_chemin_plugin($lcpa); |
|
| 139 | + |
|
| 140 | + // on installe les plugins maintenant, |
|
| 141 | + // cela permet aux scripts d'install de faire des affichages (moches...) |
|
| 142 | + plugin_installes_meta(); |
|
| 143 | + |
|
| 144 | + echo "<div class='liste-plugins formulaire_spip'>"; |
|
| 145 | + echo debut_cadre_trait_couleur('plugin-24.png', true, '', _T('plugins_liste'), 'plugins'); |
|
| 146 | + |
|
| 147 | + if ($quoi !== 'actifs') { |
|
| 148 | + $lpf = liste_plugin_files(); |
|
| 149 | + if ($lpf) { |
|
| 150 | + echo '<p>' . _T('texte_presente_plugin') . '</p>'; |
|
| 151 | + } else { |
|
| 152 | + if (!@is_dir(_DIR_PLUGINS)) { |
|
| 153 | + echo '<p>' . _T('plugin_info_automatique_ftp', ['rep' => joli_repertoire(_DIR_PLUGINS)]) |
|
| 154 | + . ' — ' . _T('plugin_info_automatique_creer') . '</p>'; |
|
| 155 | + } |
|
| 156 | + } |
|
| 157 | + $lcpaffiche = $lpf; |
|
| 158 | + if (defined('_DIR_PLUGINS_SUPPL')) { |
|
| 159 | + $lcpaffichesup = liste_plugin_files(_DIR_PLUGINS_SUPPL); |
|
| 160 | + } |
|
| 161 | + } else { |
|
| 162 | + // la liste |
|
| 163 | + // $quoi=='actifs' |
|
| 164 | + $lcpaffiche = $lcpa; |
|
| 165 | + if (defined('_DIR_PLUGINS_SUPPL')) { |
|
| 166 | + $lcpaffichesup = $lcpas; |
|
| 167 | + } |
|
| 168 | + } |
|
| 169 | + |
|
| 170 | + if ($quoi == 'actifs' or $lpf) { |
|
| 171 | + $nb = is_countable($lcpa) ? count($lcpa) : 0; |
|
| 172 | + if (defined('_DIR_PLUGINS_SUPPL')) { |
|
| 173 | + $nb += is_countable($lcpas) ? count($lcpas) : 0; |
|
| 174 | + } |
|
| 175 | + echo '<h3>' . sinon( |
|
| 176 | + singulier_ou_pluriel($nb, 'plugins_actif_un', 'plugins_actifs', 'count'), |
|
| 177 | + _T('plugins_actif_aucun') |
|
| 178 | + ) . '</h3>'; |
|
| 179 | + } |
|
| 180 | + |
|
| 181 | + if (empty($format)) { |
|
| 182 | + $format = 'liste'; |
|
| 183 | + } elseif (!in_array($format, ['liste', 'repertoires'])) { |
|
| 184 | + $format = 'repertoires'; |
|
| 185 | + } |
|
| 186 | + |
|
| 187 | + $afficher = charger_fonction("afficher_$format", 'plugins'); |
|
| 188 | + $corps = $afficher(self(), $lcpaffiche, $lcpa, $actifs); |
|
| 189 | + if (defined('_DIR_PLUGINS_SUPPL')) { |
|
| 190 | + $corps .= $afficher(self(), $lcpaffichesup, $lcpas, $actifs, _DIR_PLUGINS_SUPPL); |
|
| 191 | + } |
|
| 192 | + |
|
| 193 | + if ($corps) { |
|
| 194 | + $corps .= "\n<div class='boutons' style='display:none;'>" |
|
| 195 | + . "<input type='submit' class='submit save' value='" . _T('bouton_enregistrer') |
|
| 196 | + . "' />" |
|
| 197 | + . '</div>'; |
|
| 198 | + } |
|
| 199 | + |
|
| 200 | + echo redirige_action_post('activer_plugins', 'activer', 'admin_plugin', '', $corps); |
|
| 201 | + |
|
| 202 | + echo fin_cadre_trait_couleur(); |
|
| 203 | + |
|
| 204 | + if ($quoi == 'actifs') { |
|
| 205 | + echo affiche_les_plugins_verrouilles($actifs); |
|
| 206 | + } |
|
| 207 | + echo '</div>'; |
|
| 208 | + |
|
| 209 | + echo http_script(" |
|
| 210 | 210 | jQuery(function(){ |
| 211 | 211 | jQuery('.plugins li.item a[rel=info]').click(function(){ |
| 212 | 212 | var li = jQuery(this).parents('li').eq(0); |
@@ -232,15 +232,15 @@ discard block |
||
| 232 | 232 | }); |
| 233 | 233 | "); |
| 234 | 234 | |
| 235 | - echo pipeline( |
|
| 236 | - 'affiche_milieu', |
|
| 237 | - [ |
|
| 238 | - 'args' => ['exec' => 'admin_plugin'], |
|
| 239 | - 'data' => '' |
|
| 240 | - ] |
|
| 241 | - ); |
|
| 235 | + echo pipeline( |
|
| 236 | + 'affiche_milieu', |
|
| 237 | + [ |
|
| 238 | + 'args' => ['exec' => 'admin_plugin'], |
|
| 239 | + 'data' => '' |
|
| 240 | + ] |
|
| 241 | + ); |
|
| 242 | 242 | |
| 243 | - echo fin_gauche(), fin_page(); |
|
| 243 | + echo fin_gauche(), fin_page(); |
|
| 244 | 244 | } |
| 245 | 245 | |
| 246 | 246 | /** |
@@ -254,23 +254,23 @@ discard block |
||
| 254 | 254 | * Code HTML |
| 255 | 255 | **/ |
| 256 | 256 | function affiche_les_plugins_verrouilles($actifs) { |
| 257 | - if ((!$liste = liste_plugin_files(_DIR_PLUGINS_DIST))) { |
|
| 258 | - return ''; |
|
| 259 | - } |
|
| 260 | - |
|
| 261 | - $afficher = charger_fonction('afficher_liste', 'plugins'); |
|
| 262 | - $liste = $afficher(self(), $liste, [], $actifs, _DIR_PLUGINS_DIST); |
|
| 263 | - |
|
| 264 | - return |
|
| 265 | - "<div id='plugins_dist'>" |
|
| 266 | - . debut_cadre_trait_couleur('', true, '', _T('plugins_liste_dist'), 'liste_plugins_dist') |
|
| 267 | - . '<p>' |
|
| 268 | - . _T('plugin_info_plugins_dist_1', ['plugins_dist' => joli_repertoire(_DIR_PLUGINS_DIST)]) |
|
| 269 | - . '<br />' . _T('plugin_info_plugins_dist_2') |
|
| 270 | - . '</p>' |
|
| 271 | - . $liste |
|
| 272 | - . fin_cadre_trait_couleur() |
|
| 273 | - . "</div>\n"; |
|
| 257 | + if ((!$liste = liste_plugin_files(_DIR_PLUGINS_DIST))) { |
|
| 258 | + return ''; |
|
| 259 | + } |
|
| 260 | + |
|
| 261 | + $afficher = charger_fonction('afficher_liste', 'plugins'); |
|
| 262 | + $liste = $afficher(self(), $liste, [], $actifs, _DIR_PLUGINS_DIST); |
|
| 263 | + |
|
| 264 | + return |
|
| 265 | + "<div id='plugins_dist'>" |
|
| 266 | + . debut_cadre_trait_couleur('', true, '', _T('plugins_liste_dist'), 'liste_plugins_dist') |
|
| 267 | + . '<p>' |
|
| 268 | + . _T('plugin_info_plugins_dist_1', ['plugins_dist' => joli_repertoire(_DIR_PLUGINS_DIST)]) |
|
| 269 | + . '<br />' . _T('plugin_info_plugins_dist_2') |
|
| 270 | + . '</p>' |
|
| 271 | + . $liste |
|
| 272 | + . fin_cadre_trait_couleur() |
|
| 273 | + . "</div>\n"; |
|
| 274 | 274 | } |
| 275 | 275 | |
| 276 | 276 | /** |
@@ -282,19 +282,19 @@ discard block |
||
| 282 | 282 | */ |
| 283 | 283 | function afficher_librairies() { |
| 284 | 284 | |
| 285 | - if (!$libs = liste_librairies()) { |
|
| 286 | - return ''; |
|
| 287 | - } |
|
| 288 | - ksort($libs); |
|
| 289 | - $res = debut_cadre_enfonce('', true, '', _T('plugin_librairies_installees')); |
|
| 290 | - $res .= '<dl>'; |
|
| 291 | - foreach ($libs as $lib => $rep) { |
|
| 292 | - $res .= "<dt>$lib</dt><dd>" . joli_repertoire($rep) . "</dd>\n"; |
|
| 293 | - } |
|
| 294 | - $res .= '</dl>'; |
|
| 295 | - $res .= fin_cadre_enfonce(); |
|
| 296 | - |
|
| 297 | - return $res; |
|
| 285 | + if (!$libs = liste_librairies()) { |
|
| 286 | + return ''; |
|
| 287 | + } |
|
| 288 | + ksort($libs); |
|
| 289 | + $res = debut_cadre_enfonce('', true, '', _T('plugin_librairies_installees')); |
|
| 290 | + $res .= '<dl>'; |
|
| 291 | + foreach ($libs as $lib => $rep) { |
|
| 292 | + $res .= "<dt>$lib</dt><dd>" . joli_repertoire($rep) . "</dd>\n"; |
|
| 293 | + } |
|
| 294 | + $res .= '</dl>'; |
|
| 295 | + $res .= fin_cadre_enfonce(); |
|
| 296 | + |
|
| 297 | + return $res; |
|
| 298 | 298 | } |
| 299 | 299 | |
| 300 | 300 | |
@@ -305,22 +305,22 @@ discard block |
||
| 305 | 305 | * Tableau (nom de la lib => repertoire , ...) |
| 306 | 306 | */ |
| 307 | 307 | function liste_librairies() { |
| 308 | - $libs = []; |
|
| 309 | - foreach (array_reverse(creer_chemin()) as $d) { |
|
| 310 | - if ( |
|
| 311 | - is_dir($dir = $d . 'lib/') |
|
| 312 | - and $t = opendir($dir) |
|
| 313 | - ) { |
|
| 314 | - while (($f = readdir($t)) !== false) { |
|
| 315 | - if ( |
|
| 316 | - $f[0] != '.' |
|
| 317 | - and is_dir("$dir/$f") |
|
| 318 | - ) { |
|
| 319 | - $libs[$f] = $dir; |
|
| 320 | - } |
|
| 321 | - } |
|
| 322 | - } |
|
| 323 | - } |
|
| 324 | - |
|
| 325 | - return $libs; |
|
| 308 | + $libs = []; |
|
| 309 | + foreach (array_reverse(creer_chemin()) as $d) { |
|
| 310 | + if ( |
|
| 311 | + is_dir($dir = $d . 'lib/') |
|
| 312 | + and $t = opendir($dir) |
|
| 313 | + ) { |
|
| 314 | + while (($f = readdir($t)) !== false) { |
|
| 315 | + if ( |
|
| 316 | + $f[0] != '.' |
|
| 317 | + and is_dir("$dir/$f") |
|
| 318 | + ) { |
|
| 319 | + $libs[$f] = $dir; |
|
| 320 | + } |
|
| 321 | + } |
|
| 322 | + } |
|
| 323 | + } |
|
| 324 | + |
|
| 325 | + return $libs; |
|
| 326 | 326 | } |