/** * 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]; }
/** * 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; }
/** * 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); } }
/** * 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(); } }
/** * 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)); } } }
/** * 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; }
/** * 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'))); }
/** * 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); } }
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]; }
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); } } } }
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); } }
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; }