Esempio n. 1
0
/**
 * Preparer les listes id_article IN (...) pour les parties WHERE
 * et points =  des requetes du moteur de recherche
 * http://doc.spip.org/@inc_prepare_recherche_dist
 * 
 * Le parametre $serveur est utilise pour savoir sur quelle base on cherche
 * mais l'index des resultats est toujours stock� sur le serveur principal
 * car on ne sait pas si la base distante dispose d'une table spip_resultats
 * ni meme si on aurait le droit d'ecrire dedans
 *
 * @param string $recherche
 *    chaine recherchee
 * @param string $table
 *    table dans laquelle porte la recherche
 * @param bool $cond
 *    critere conditionnel sur {recherche?}
 * @param string $serveur
 *    serveur de base de donnees
 * @param array $modificateurs
 *    modificateurs de boucle, ie liste des criteres presents
 * @param string $primary
 *    cle primaire de la table de recherche
 * @return array
 */
function inc_prepare_recherche_dist($recherche, $table = 'articles', $cond = false, $serveur = '', $modificateurs = array(), $primary = '')
{
    static $cache = array();
    $delai_fraicheur = min(_DELAI_CACHE_resultats, time() - $GLOBALS['meta']['derniere_modif']);
    // si recherche n'est pas dans le contexte, on va prendre en globals
    // ca permet de faire des inclure simple.
    if (!isset($recherche) and isset($GLOBALS['recherche'])) {
        $recherche = $GLOBALS['recherche'];
    }
    // traiter le cas {recherche?}
    if ($cond and !strlen($recherche)) {
        return array("0 as points", '');
    }
    $rechercher = false;
    if (!isset($cache[$serveur][$table][$recherche])) {
        $hash_serv = $serveur ? substr(md5($serveur), 0, 16) : '';
        $hash = substr(md5($recherche . $table), 0, 16);
        $where = "(resultats.recherche='{$hash}' AND resultats.table_objet=" . sql_quote($table) . " AND resultats.serveur='{$hash_serv}')";
        $row = sql_fetsel('UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(resultats.maj) AS fraicheur', 'spip_resultats AS resultats', $where, '', 'fraicheur DESC', '0,1');
        if (!$row or $row['fraicheur'] > $delai_fraicheur or defined('_VAR_MODE') and _VAR_MODE == 'recalcul') {
            $rechercher = true;
        }
    }
    // si on n'a pas encore traite les donnees dans une boucle precedente
    if ($rechercher) {
        //$tables = liste_des_champs();
        $x = objet_type($table);
        $points = recherche_en_base($recherche, $x, array('score' => true, 'toutvoir' => true, 'jointures' => true), $serveur);
        // pas de résultat, pas de point
        $points = isset($points[$x]) ? $points[$x] : array();
        // permettre aux plugins de modifier le resultat
        $points = pipeline('prepare_recherche', array('args' => array('type' => $x, 'recherche' => $recherche, 'serveur' => $serveur, 'modificateurs' => $modificateurs), 'data' => $points));
        // supprimer les anciens resultats de cette recherche
        // et les resultats trop vieux avec une marge
        // pas de AS resultats dans un delete (mysql)
        $whered = str_replace(array("resultats.recherche", "resultats.table_objet", "resultats.serveur"), array("recherche", "table_objet", "serveur"), $where);
        sql_delete('spip_resultats', 'NOT(' . sql_date_proche('maj', 0 - ($delai_fraicheur + 100), " SECOND") . ") OR ({$whered})");
        // inserer les resultats dans la table de cache des resultats
        if (count($points)) {
            $tab_couples = array();
            foreach ($points as $id => $p) {
                $tab_couples[] = array('recherche' => $hash, 'id' => $id, 'points' => $p['score'], 'table_objet' => $table, 'serveur' => $hash_serv);
            }
            sql_insertq_multi('spip_resultats', $tab_couples, array());
        }
    }
    if (!isset($cache[$serveur][$table][$recherche])) {
        if (!$serveur) {
            $cache[$serveur][$table][$recherche] = array("resultats.points AS points", $where);
        } else {
            if (sql_countsel('spip_resultats as resultats', $where)) {
                $rows = sql_allfetsel('resultats.id,resultats.points', 'spip_resultats as resultats', $where);
            }
            $cache[$serveur][$table][$recherche] = generer_select_where_explicites($table, $primary, $rows, $serveur);
        }
    }
    return $cache[$serveur][$table][$recherche];
}
Esempio n. 2
0
/**
 * fonction d'insertion en base lors de la copie de base a base
 *
 * @param string $table
 * @param array $rows
 * @param array $desc_dest
 * @param string $serveur_dest
 * @return int/bool
 */
function base_inserer_copie($table, $rows, $desc_dest, $serveur_dest)
{
    // verifier le nombre d'insertion
    $nb1 = sql_countsel($table);
    // si l'enregistrement est deja en base, ca fera un echec ou un doublon
    $r = sql_insertq_multi($table, $rows, $desc_dest, $serveur_dest);
    $nb = sql_countsel($table);
    if ($nb - $nb1 < count($rows)) {
        foreach ($rows as $row) {
            // si l'enregistrement est deja en base, ca fera un echec ou un doublon
            $r = sql_insertq($table, $row, $desc_dest, $serveur_dest);
        }
    }
    return $r;
}
Esempio n. 3
0
/**
 * Insère des données dans une table de liaison de façon un peu sécurisée
 *
 * Si une insertion multiple échoue, on réinsère ligne par ligne.
 *
 * @param string $table Table de liaison
 * @param array $couples Tableau de couples de données à insérer
 * @param array $desc Description de la table de liaison
 * @return void
 **/
function maj_liens_insertq_multi_check($table, $couples, $desc = array())
{
    $n_before = sql_countsel($table);
    sql_insertq_multi($table, $couples, $desc);
    $n_after = sql_countsel($table);
    if ($n_after - $n_before == count($couples)) {
        return;
    }
    // si ecart, on recommence l'insertion ligne par ligne...
    // moins rapide mais secure : seul le couple en doublon echouera, et non toute la serie
    foreach ($couples as $c) {
        sql_insertq($table, $c, $desc);
    }
}
Esempio n. 4
0
/**
 * Insertion en masse de plugins ou de paquets.
 *
 * Les paquets peuvent de pas avoir d'info "prefixe" (à transformer en id_plugin)
 * lorsqu'ils ne proviennent pas de plugin (squelettes...)
 * 
 * @param array $insert_plugins
 *     Tableau de description de plugins.
 *     Une description est un tableau de couples (colonne sql => valeur)
 *     pour l'insertion en base de données.
 * @param array $insert_paquets
 *     Tableau de description de paquets.
 *     Une description est un tableau de couples (colonne sql => valeur)
 *     pour l'insertion en base de données.
 * @param array $insert_contribs
 *     Tableau de description de paquets (contributions non plugins).
 *     Une description est un tableau de couples (colonne sql => valeur)
 *     pour l'insertion en base de données.
 * @param array $prefixes
 *     Couples de relation (préfixe de plugin => identifiant de plugin) connues,
 *     pour limiter les accès SQL.
 * @return void
**/
function svp_inserer_multi(&$insert_plugins, &$insert_paquets, &$insert_contribs, &$prefixes)
{
    if (count($insert_plugins)) {
        sql_insertq_multi('spip_plugins', $insert_plugins);
        $insert_plugins = array();
    }
    if (count($insert_paquets)) {
        // on cherche tous les id_plugin/prefixe que l'on a à récuperer
        // en une seule requete
        $prefixes_manquants = array();
        foreach ($insert_paquets as $p) {
            // on ne connait que le prefixe
            if (isset($p['prefixe']) and !isset($prefixes[$p['prefixe']])) {
                $prefixes_manquants[] = $p['prefixe'];
            }
        }
        // recuperer les nouveaux prefixes :
        $new = sql_allfetsel(array('prefixe', 'id_plugin'), 'spip_plugins', sql_in('prefixe', $prefixes_manquants));
        foreach ($new as $p) {
            $prefixes[$p['prefixe']] = $p['id_plugin'];
        }
        // inserer les id_plugin dans les paquets a inserer
        // inserer le prefixe dans le paquet (pour raccourcis de jointures)
        foreach ($insert_paquets as $c => $p) {
            if (isset($p['prefixe'])) {
                $insert_paquets[$c]['id_plugin'] = $prefixes[$insert_paquets[$c]['prefixe']];
            } else {
                $insert_paquets[$c]['prefixe'] = array_search($p['id_plugin'], $prefixes);
            }
        }
        // on insere tout !
        sql_insertq_multi('spip_paquets', $insert_paquets);
        $insert_paquets = array();
    }
    // les contribs n'ont pas le même nombre de champs dans les insertions
    // et n'ont pas de plugin rattachés.
    if (count($insert_contribs)) {
        sql_insertq_multi('spip_paquets', $insert_contribs);
        $insert_contribs = array();
    }
}
Esempio n. 5
0
/**
 * Associer une tache avec un objet
 *
 * @param int $id_job
 *  id de la tache a lier
 * @param array $objets
 *  peut être un simple tableau array('objet'=>'article','id_objet'=>23)
 *  ou un tableau composé de tableaux simples pour lieur plusieurs objets en une fois
 */
function queue_link_job($id_job, $objets)
{
    include_spip('base/abstract_sql');
    if (is_array($objets) and count($objets)) {
        if (is_array(reset($objets))) {
            foreach ($objets as $k => $o) {
                $objets[$k]['id_job'] = $id_job;
            }
            sql_insertq_multi('spip_jobs_liens', $objets);
        } else {
            sql_insertq('spip_jobs_liens', array_merge(array('id_job' => $id_job), $objets));
        }
    }
}
Esempio n. 6
0
/**
 * fonction d'insertion en base lors de la copie de base a base
 *
 * @param string $table
 * @param array $rows
 * @param array $desc_dest
 * @param string $serveur_dest
 * @return int/bool
 */
function base_inserer_copie($table, $rows, $desc_dest, $serveur_dest)
{
    // verifier le nombre d'insertion
    $nb1 = sql_countsel($table, '', '', '', $serveur_dest);
    // si l'enregistrement est deja en base, ca fera un echec ou un doublon
    $r = sql_insertq_multi($table, $rows, $desc_dest, $serveur_dest);
    $nb = sql_countsel($table, '', '', '', $serveur_dest);
    if ($nb - $nb1 < count($rows)) {
        spip_log("base_inserer_copie : " . ($nb - $nb1) . " insertions au lieu de " . count($rows) . ". On retente 1 par 1", "dump" . _LOG_INFO_IMPORTANTE);
        foreach ($rows as $row) {
            // si l'enregistrement est deja en base, ca fera un echec ou un doublon
            $r = sql_insertq($table, $row, $desc_dest, $serveur_dest);
        }
        // on reverifie le total
        $r = 0;
        $nb = sql_countsel($table, '', '', '', $serveur_dest);
        if ($nb - $nb1 < count($rows)) {
            spip_log("base_inserer_copie : " . ($nb - $nb1) . " insertions au lieu de " . count($rows) . " apres insertion 1 par 1", "dump" . _LOG_ERREUR);
            $r = false;
        }
    }
    return $r;
}
Esempio n. 7
0
/**
 * Insère en base tous les paquets locaux transmis
 *
 * De chaque description est extrait la partie plugin (1 seul plugin
 * par préfixe de plugin connu) et la partie paquet (il peut y avoir plusieurs
 * paquets pour un même préfixe de plugin).
 * 
 * @note
 *     On essaie au mieux de faire des requêtes d'insertions multiples,
 *     mieux gérées par les moteurs SQL (particulièrement pour SQLite)
 * 
 * @param array $paquets_locaux
 *     Descriptions des paquets (intégrant un hash), stockés par
 *     constante, puis par chemin.
 *     array[_DIR_PLUGIN*][$chemin] = description
**/
function svp_base_inserer_paquets_locaux($paquets_locaux)
{
    include_spip('inc/svp_depoter_distant');
    // On initialise les informations specifiques au paquet :
    // l'id du depot et les infos de l'archive
    $paquet_base = array('id_depot' => 0, 'nom_archive' => '', 'nbo_archive' => '', 'maj_archive' => '', 'src_archive' => '', 'date_modif' => '', 'maj_version' => '', 'signature' => '');
    $preparer_sql_paquet = charger_fonction('preparer_sql_paquet', 'plugins');
    // pour chaque decouverte, on insere les paquets en base.
    // on evite des requetes individuelles, tres couteuses en sqlite...
    $cle_plugins = array();
    // prefixe => id
    $insert_plugins = array();
    // insertion prefixe...
    $insert_plugins_vmax = array();
    // vmax des nouveaux plugins...
    $insert_paquets = array();
    // insertion de paquet...
    include_spip('inc/config');
    $recents = lire_config('plugins_interessants');
    $installes = lire_config('plugin_installes');
    $actifs = lire_config('plugin');
    $attentes = lire_config('plugin_attente');
    foreach ($paquets_locaux as $const_dir => $paquets) {
        foreach ($paquets as $chemin => $paquet) {
            // Si on est en presence d'un plugin dont la dtd est "paquet" on compile en multi
            // les nom, slogan et description a partir des fichiers de langue.
            // De cette façon, les informations des plugins locaux et distants seront identiques
            // => On evite l'utilisation de _T() dans les squelettes
            if ($paquet['dtd'] == 'paquet') {
                $multis = svp_compiler_multis($paquet['prefix'], constant($const_dir) . '/' . $chemin);
                if (isset($multis['nom'])) {
                    $paquet['nom'] = $multis['nom'];
                }
                $paquet['slogan'] = isset($multis['slogan']) ? $multis['slogan'] : '';
                $paquet['description'] = isset($multis['description']) ? $multis['description'] : '';
            }
            $le_paquet = $paquet_base;
            #$le_paquet['traductions'] = serialize($paquet['traductions']);
            if ($champs = $preparer_sql_paquet($paquet)) {
                // Eclater les champs recuperes en deux sous tableaux, un par table (plugin, paquet)
                $champs = eclater_plugin_paquet($champs);
                $paquet_plugin = true;
                // On complete les informations du paquet et du plugin
                $le_paquet = array_merge($le_paquet, $champs['paquet']);
                $le_plugin = $champs['plugin'];
                // On loge l'absence de categorie ou une categorie erronee et on positionne la categorie par defaut "aucune"
                if (!$le_plugin['categorie']) {
                    $le_plugin['categorie'] = 'aucune';
                } else {
                    if (!in_array($le_plugin['categorie'], $GLOBALS['categories_plugin'])) {
                        $le_plugin['categorie'] = 'aucune';
                    }
                }
                // creation du plugin...
                $prefixe = strtoupper($le_plugin['prefixe']);
                // on fait attention lorqu'on cherche ou ajoute un plugin
                // le nom et slogan est TOUJOURS celui de la plus haute version
                // et il faut donc possiblement mettre a jour la base...
                //
                // + on est tolerant avec les versions identiques de plugin deja presentes
                //   on permet le recalculer le titre...
                if (!isset($cle_plugins[$prefixe])) {
                    if (!($res = sql_fetsel('id_plugin, vmax', 'spip_plugins', 'prefixe = ' . sql_quote($prefixe)))) {
                        // on ne stocke pas de vmax pour les plugins locaux dans la bdd... (parait il)
                        if (!isset($insert_plugins[$prefixe])) {
                            $insert_plugins[$prefixe] = $le_plugin;
                            $insert_plugins_vmax[$prefixe] = $le_paquet['version'];
                        } elseif (spip_version_compare($le_paquet['version'], $insert_plugins_vmax[$prefixe], '>')) {
                            $insert_plugins[$prefixe] = $le_plugin;
                            $insert_plugins_vmax[$prefixe] = $le_paquet['version'];
                        }
                    } else {
                        $id_plugin = $res['id_plugin'];
                        $cle_plugins[$prefixe] = $id_plugin;
                        // comme justement on ne stocke pas de vmax pour les plugins locaux...
                        // il est possible que ce test soit faux. pff.
                        if (spip_version_compare($le_paquet['version'], $res['vmax'], '>=')) {
                            sql_updateq('spip_plugins', $le_plugin, 'id_plugin=' . sql_quote($id_plugin));
                        }
                    }
                }
                // ajout du prefixe dans le paquet
                $le_paquet['prefixe'] = $prefixe;
                $le_paquet['constante'] = $const_dir;
                $le_paquet['src_archive'] = $chemin;
                $le_paquet['recent'] = isset($recents[$chemin]) ? $recents[$chemin] : 0;
                $le_paquet['installe'] = in_array($chemin, $installes) ? 'oui' : 'non';
                // est desinstallable ?
                $le_paquet['obsolete'] = 'non';
                $le_paquet['signature'] = $paquet['signature'];
                // le plugin est il actuellement actif ?
                $actif = "non";
                if (isset($actifs[$prefixe]) and $actifs[$prefixe]['dir_type'] == $const_dir and $actifs[$prefixe]['dir'] == $chemin) {
                    $actif = "oui";
                }
                $le_paquet['actif'] = $actif;
                // le plugin etait il actif mais temporairement desactive
                // parce qu'une dependence a disparue ?
                $attente = "non";
                if (isset($attentes[$prefixe]) and $attentes[$prefixe]['dir_type'] == $const_dir and $attentes[$prefixe]['dir'] == $chemin) {
                    $attente = "oui";
                    $le_paquet['actif'] = "oui";
                    // il est presenté dans la liste des actifs (en erreur).
                }
                $le_paquet['attente'] = $attente;
                // on recherche d'eventuelle mises a jour existantes
                if ($maj_version = svp_rechercher_maj_version($prefixe, $le_paquet['version'], $le_paquet['etatnum'])) {
                    $le_paquet['maj_version'] = $maj_version;
                }
                $insert_paquets[] = $le_paquet;
            }
        }
    }
    if ($insert_plugins) {
        sql_insertq_multi('spip_plugins', $insert_plugins);
        $pls = sql_allfetsel(array('id_plugin', 'prefixe'), 'spip_plugins', sql_in('prefixe', array_keys($insert_plugins)));
        foreach ($pls as $p) {
            $cle_plugins[$p['prefixe']] = $p['id_plugin'];
        }
    }
    if ($insert_paquets) {
        // sert pour le calcul d'obsolescence
        $id_plugin_concernes = array();
        foreach ($insert_paquets as $c => $p) {
            $insert_paquets[$c]['id_plugin'] = $cle_plugins[$p['prefixe']];
            $id_plugin_concernes[$insert_paquets[$c]['id_plugin']] = true;
            // remettre les necessite, utilise, librairie dans la cle 0
            // comme SVP
            if ($dep = unserialize($insert_paquets[$c]['dependances']) and is_array($dep)) {
                foreach ($dep as $d => $contenu) {
                    if ($contenu) {
                        $new = array();
                        foreach ($contenu as $n) {
                            unset($n['id']);
                            $new[strtolower($n['nom'])] = $n;
                        }
                        $dep[$d] = array($new);
                    }
                }
                $insert_paquets[$c]['dependances'] = serialize($dep);
            }
        }
        sql_insertq_multi('spip_paquets', $insert_paquets);
        svp_corriger_obsolete_paquets(array_keys($id_plugin_concernes));
    }
}
/**
 * Concatène les statistiques de visites d'articles entre 2 périodes.
 *
 * @param string $date_debut
 *     Date de début tel que '2010-01-01'
 * @param string $date_fin
 *     Date de fin tel que '2010-12-31'
 * @return bool
 *     - false : aucune visite sur cette période
 *     - true : il y avait des visites, elles ont été concaténées (ou l'étaient déjà)
 *
 **/
function statistiques_concatener_visites_entre_periode($date_debut, $date_fin)
{
    // récupérer toutes les visites de cette période (année, mois, entre jour début et fin)
    $visites = sql_allfetsel('id_article, date, visites', 'spip_visites_articles', array("date >= " . sql_quote($date_debut), "date <= " . sql_quote($date_fin)));
    if (!$visites) {
        return false;
    }
    $liste = $updates = array();
    $total = 0;
    // - Crée un tableau plus simple (id_article => total des visites de la période) (permettant un array_diff_key facile).
    // - Calcule au passage le total des visites de la période (pour le log)
    // - Rempli un autre tableau ($updates) qui indique si cet article doit avoir ses visites concaténées sur cette période,
    //   c'est à dire, si il y a une date qui n'est pas le début de période.
    //   (évite de nombreuses requêtes si l'on exécute plusieurs fois le script)
    foreach ($visites as $v) {
        $id_article = $v['id_article'];
        if (!isset($liste[$id_article])) {
            $liste[$id_article] = 0;
        }
        $liste[$id_article] += $v['visites'];
        $total += $v['visites'];
        if ($v['date'] != $date_debut) {
            $updates[$id_article] = true;
        }
    }
    unset($visites);
    $nb_articles = count($liste);
    // juste ceux qui nécessitent une mise à jour (date <> de $debut de période)
    $liste = array_intersect_key($liste, $updates);
    statistiques_archiver_log("-- du {$date_debut} au {$date_fin} : {$total} visites dans {$nb_articles} articles");
    if ($liste) {
        // formater pour l'insertion dans la base.
        $inserts = array();
        foreach ($liste as $id_article => $visites) {
            $inserts[] = array('id_article' => $id_article, 'date' => $date_debut, 'visites' => $visites);
        }
        statistiques_archiver_log("--- concaténer les statistiques de " . count($liste) . " articles");
        // /!\ Attention,
        // Entre ces 2 requêtes, on peut perdre des données (si timeout ou autre)
        // Transaction à faire ?
        sql_delete('spip_visites_articles', array("date >= " . sql_quote($date_debut), "date <= " . sql_quote($date_fin), sql_in('id_article', array_keys($liste))));
        sql_insertq_multi('spip_visites_articles', $inserts);
    }
    unset($liste, $inserts);
    return true;
}
<?php

// spip_ecatalogue_currencies
if (sql_countsel('spip_ecatalogue_currencies') == 0) {
    sql_insertq_multi('spip_ecatalogue_currencies', array(array('titre' => '<multi>[ru]Доллар США[en]U.S. Dollar</multi>', 'sign_pre' => '$', 'sign_after' => '', 'code' => 'USD', 'rate' => '0.125'), array('titre' => '<multi>[ru]Украинская гривна[en]Ukrainian hryvnia</multi>', 'sign_pre' => '', 'sign_after' => '<multi>[ru]грн[en]hrn</multi>', 'code' => 'UAH', 'rate' => '1'), array('titre' => '<multi>[ru]Євро[en]Euro</multi>', 'sign_pre' => '€', 'sign_after' => '', 'code' => 'EUR', 'rate' => '0.0958')));
    sql_insertq_multi('spip_ecatalogue_prices_group', array(array('titre' => 'Розничная цена', 'is_active' => '1')));
}
Esempio n. 10
0
/**
 * Creer la table des types de document
 *
 * @param string $serveur
 * @param string $champ_media
 * @return void
 */
function creer_base_types_doc($serveur = '', $champ_media = "media_defaut")
{
    global $tables_images, $tables_sequences, $tables_documents, $tables_mime;
    include_spip('base/typedoc');
    include_spip('base/abstract_sql');
    // charger en memoire tous les types deja definis pour limiter les requettes
    $rows = sql_allfetsel('mime_type,titre,inclus,extension,' . $champ_media . ',upload,descriptif', 'spip_types_documents', '', '', '', '', '', $serveur);
    $deja = array();
    foreach ($rows as $k => $row) {
        $deja[$row['extension']] =& $rows[$k];
    }
    $insertions = array();
    $updates = array();
    foreach ($tables_mime as $extension => $type_mime) {
        if (isset($tables_images[$extension])) {
            $titre = $tables_images[$extension];
            $inclus = 'image';
        } else {
            if (isset($tables_sequences[$extension])) {
                $titre = $tables_sequences[$extension];
                $inclus = 'embed';
            } else {
                $inclus = 'non';
                if (isset($tables_documents[$extension])) {
                    $titre = $tables_documents[$extension];
                } else {
                    $titre = '';
                }
            }
        }
        // type de media
        $media = "file";
        if (preg_match(",^image/,", $type_mime) or in_array($type_mime, array('application/illustrator'))) {
            $media = "image";
        } elseif (preg_match(",^audio/,", $type_mime)) {
            $media = "audio";
        } elseif (preg_match(",^video/,", $type_mime) or in_array($type_mime, array('application/ogg', 'application/x-shockwave-flash', 'application/mp4'))) {
            $media = "video";
        }
        $set = array('mime_type' => $type_mime, 'titre' => $titre, 'inclus' => $inclus, 'extension' => $extension, $champ_media => $media, 'upload' => 'oui', 'descriptif' => '');
        if (!isset($deja[$extension])) {
            $insertions[] = $set;
        } elseif (array_diff($deja[$extension], $set)) {
            $updates[$extension] = $set;
        }
    }
    if (count($updates)) {
        foreach ($updates as $extension => $set) {
            sql_updateq('spip_types_documents', $set, 'extension=' . sql_quote($extension));
        }
    }
    if ($insertions) {
        sql_insertq_multi('spip_types_documents', $insertions, '', $serveur);
    }
}
Esempio n. 11
0
function inc_prepare_recherche_dist($recherche, $table='articles', $cond=false, $serveur='',$plat=false) {
	static $cache = array();
	$delai_fraicheur = min(_DELAI_CACHE_resultats,time()-$GLOBALS['meta']['derniere_modif']);

	// si recherche n'est pas dans le contexte, on va prendre en globals
	// ca permet de faire des inclure simple.
	if (!isset($recherche) AND isset($GLOBALS['recherche']))
		$recherche = $GLOBALS['recherche'];

	// traiter le cas {recherche?}
	if ($cond AND !strlen($recherche))
		return array("0 as points" /* as points */, /* where */ '');
		
	
	$rechercher = false;

	if (!isset($cache[$recherche][$table])){
		$hash = substr(md5($recherche . $table),0,16);
		$row = sql_fetsel('UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(maj) AS fraicheur','spip_resultats',"recherche='$hash'",'','fraicheur DESC','0,1','',$serveur);
		if (!$row OR ($row['fraicheur']>$delai_fraicheur)){
		 	$rechercher = true;
		}
		$cache[$recherche][$table] = array("resultats.points AS points","recherche='$hash'");
	}

	// si on n'a pas encore traite les donnees dans une boucle precedente
	if ($rechercher) {
		//$tables = liste_des_champs();
		$x = preg_replace(',s$,', '', $table); // eurk
		if ($x == 'syndic') $x = 'site';
		$points = recherche_en_base($recherche,
			$x,
			array(
				'score' => true,
				'toutvoir' => true,
				'jointures' => true
				),
					    $serveur);
		$points = $points[$x];
		
		# Pour les forums, unifier par id_thread et forcer statut='publie', sauf si le crière {plat} ou {tout} est présent
		if ($x == 'forum' AND $points AND $plat != "true") {
			$p2 = array();
            $s = sql_select("id_thread, id_forum, statut", "spip_forum", sql_in('id_forum', array_keys($points)), '','','','', $serveur);
            while ($t = sql_fetch($s, $serveur)){
                   $id_thread = intval($t['id_thread']);
                   $id_forum = intval($t['id_forum']);
                   if ($id_thread){
                           if ($t['statut'] == 'publie')
                                   $p2[$id_thread]['score']
                                           += $points[$id_forum]['score'];
                   }
                   else{
                           $p2[$id_forum]['score'] = $points[$id_forum]['score'];
                   }
            }			
			$points = $p2;
		}

		// supprimer les anciens resultats de cette recherche
		// et les resultats trop vieux avec une marge
		sql_delete('spip_resultats','(maj<DATE_SUB(NOW(), INTERVAL '.($delai_fraicheur+100)." SECOND)) OR (recherche='$hash')",$serveur);

		// inserer les resultats dans la table de cache des resultats
		if (count($points)){
			$tab_couples = array();
			foreach ($points as $id => $p){
				$tab_couples[] = array(
					'recherche' => $hash,
					'id' => $id,
					'points' => $p['score']
				);
			}
			sql_insertq_multi('spip_resultats',$tab_couples,array(),$serveur);
		}
	}

	return $cache[$recherche][$table];
}
Esempio n. 12
0
function maj_12008 () {
	// Creer spip_documents_liens
	global $tables_auxiliaires;
	include_spip('base/auxiliaires');
	$v = $tables_auxiliaires[$k='spip_documents_liens'];
	sql_create($k, $v['field'], $v['key'], false, false);

	// Recopier les donnees
	foreach (array('article', 'breve', 'rubrique', 'auteur', 'forum') as $l) {
		if ($s = sql_select('*', 'spip_documents_'.$l.'s')
		OR $s = sql_select('*', 'spip_documents_'.$l)) {
			$tampon = array();
			while ($t = sql_fetch($s)) {
				// transformer id_xx=N en (id_objet=N, objet=xx)
				$t['id_objet'] = $t["id_$l"];
				$t['objet'] = $l;
				unset($t["id_$l"]);
				unset($t['maj']);
				$tampon[] = $t;
				if (count($tampon)>10000) {
					sql_insertq_multi('spip_documents_liens',$tampon);
					$tampon = array();
				}
			}
			if (count($tampon)) {
				sql_insertq_multi('spip_documents_liens', $tampon);
			}
		}
	}
}
Esempio n. 13
0
function agenda_action_revision_evenement_mots($id_evenement,$liste_mots){
	// suppression des mots obsoletes
	$cond_in  = $cond_not_in = "";
	if (count($liste_mots)){
		$cond_not_in = sql_in('id_mot', join(',',$liste_mots), 'NOT');
		$cond_in = sql_in('id_mot', join(',',$liste_mots));
	}
	sql_delete("spip_mots_evenements", "id_evenement=".intval($id_evenement) . ($cond_in?" AND ".$cond_not_in:""));

	$liste_deja = array();
	if ($cond_in)
		$liste_deja = sql_allfetsel("id_mot", "spip_mots_evenements", "id_evenement=".intval($id_evenement) . " AND $cond_in");
	if (count($liste_deja)) {
		$cond_not_in = sql_in('id_mot', join(',',array_map('reset',$liste_deja)), 'NOT');
		$liste_mots = sql_allfetsel('id_mot','spip_mots',"$cond_in AND $cond_not_in");
		$liste_mots = array_map('reset',$liste_mots);
	}
	if (count($liste_mots)) {
		$ins = array();
		foreach($liste_mots as $k=>$id_mot)
			$ins[] = array('id_evenement'=>$id_evenement,'id_mot'=>$id_mot);
		sql_insertq_multi("spip_mots_evenements", $ins);
	}
}
Esempio n. 14
0
function migrer_articles($where_articles, $champ_date_debut, $champ_date_fin, $horaire, $where_mots)
{
    include_spip('action/editer_evenement');
    $where_mots = implode(' AND ', $where_mots);
    $nb = 0;
    $res = sql_select('*', 'spip_articles', $where_articles);
    while ($row = sql_fetch($res)) {
        $id_evenement = evenement_inserer($row['id_article']);
        // mettre les champs
        $set = array('date_debut' => $row[$champ_date_debut], 'date_fin' => $row[$champ_date_fin], 'titre' => $row['titre'], 'horaire' => $horaire ? 'oui' : 'non');
        evenement_modifier($id_evenement, $set);
        // associer les mots : en sql pour ne pas exploser si plein de mots en base
        $mots = sql_allfetsel('M.id_mot', 'spip_mots AS M JOIN spip_mots_liens AS L ON (M.id_mot=L.id_mot AND L.objet=' . sql_quote('article') . ')', 'id_objet=' . intval($row['id_article']) . ' AND (' . $where_mots . ')');
        if (count($mots)) {
            $insert = array();
            foreach ($mots as $mot) {
                $insert[] = array('id_mot' => $mot['id_mot'], 'objet' => 'evenement', 'id_objet' => $id_evenement);
            }
            sql_insertq_multi('spip_mots_liens', $insert);
        }
        // publier l'evenement
        evenement_modifier($id_evenement, array('statut' => 'publie'));
        $nb++;
    }
    return $nb;
}