/** * Met à jour des enregistrements d'une table SQL et protège chaque valeur * * Protège chaque valeur transmise avec sql_quote(), adapté au type * de champ attendu par la table SQL * * @note * Les valeurs sont des constantes à mettre entre apostrophes * sauf les expressions de date lorsqu'il s'agit de fonctions SQL (NOW etc) * * @param string $table * Nom de la table * @param array $champs * Couples (colonne => valeur) * @param string|array $where * Conditions a remplir (Where) * @param array $desc * Tableau de description des colonnes de la table SQL utilisée * (il sera calculé si nécessaire s'il n'est pas transmis). * @param string $serveur * Nom de la connexion * @param bool $requeter * Exécuter la requête, sinon la retourner * @return array|bool|string * - string : texte de la requête si demandé * - true si la requête a réussie, false sinon * - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif */ function spip_mysql_updateq($table, $champs, $where = '', $desc = array(), $serveur = '', $requeter = true) { if (!$champs) { return; } if (!$desc) { $desc = description_table($table, $serveur); } if (!$desc) { $champs = array(); } else { $fields = $desc['field']; } $set = array(); foreach ($champs as $champ => $val) { $set[] = $champ . '=' . spip_mysql_cite($val, @$fields[$champ]); } return spip_mysql_query(calculer_mysql_expression('UPDATE', $table, ',') . calculer_mysql_expression('SET', $set, ',') . calculer_mysql_expression('WHERE', $where), $serveur, $requeter); }
/** * Met à jour des enregistrements d'une table SQL et protège chaque valeur * * Protège chaque valeur transmise avec sql_quote(), adapté au type * de champ attendu par la table SQL * * @param string $table * Nom de la table * @param array $champs * Couples (colonne => valeur) * @param string|array $where * Conditions a remplir (Where) * @param array $desc * Tableau de description des colonnes de la table SQL utilisée * (il sera calculé si nécessaire s'il n'est pas transmis). * @param string $serveur * Nom de la connexion * @param bool $requeter * Exécuter la requête, sinon la retourner * @return array|bool|string * - string : texte de la requête si demandé * - true si la requête a réussie, false sinon * - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif */ function spip_sqlite_updateq($table, $champs, $where = '', $desc = array(), $serveur = '', $requeter = true) { if (!$champs) { return; } if (!$desc) { $desc = description_table($table, $serveur); } if (!$desc) { die("{$table} insertion sans description"); } $fields = $desc['field']; // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci $champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur); $set = array(); foreach ($champs as $champ => $val) { $set[] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : ''); } return spip_sqlite_query(_sqlite_calculer_expression('UPDATE', $table, ',') . _sqlite_calculer_expression('SET', $set, ',') . _sqlite_calculer_expression('WHERE', $where), $serveur, $requeter); }
function spip_pg_replace($table, $values, $desc, $serveur = '', $requeter = true) { if (!$values) { spip_log("replace vide {$table}", 'pg.' . _LOG_AVERTISSEMENT); return 0; } $connexion =& $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $prefixe = $connexion['prefixe']; $link = $connexion['link']; $db = $connexion['db']; if (!$desc) { $desc = description_table($table, $serveur); } if (!$desc) { die("{$table} insertion sans description"); } $prim = $desc['key']['PRIMARY KEY']; $ids = preg_split('/,\\s*/', $prim); $noprims = $prims = array(); foreach ($values as $k => $v) { $values[$k] = $v = spip_pg_cite($v, $desc['field'][$k]); if (!in_array($k, $ids)) { $noprims[$k] = "{$k}={$v}"; } else { $prims[$k] = "{$k}={$v}"; } } // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci $values = spip_pg_ajouter_champs_timestamp($table, $values, $desc, $serveur); $where = join(' AND ', $prims); if (!$where) { return spip_pg_insert($table, "(" . join(',', array_keys($values)) . ")", "(" . join(',', $values) . ")", $desc, $serveur); } $couples = join(',', $noprims); $seq = spip_pg_sequence($table); if ($prefixe) { $table = preg_replace('/^spip/', $prefixe, $table); $seq = preg_replace('/^spip/', $prefixe, $seq); } $connexion['last'] = $q = "UPDATE {$table} SET {$couples} WHERE {$where}"; if ($couples) { $couples = spip_pg_query_simple($link, $q); # spip_log($q,'pg.'._LOG_DEBUG); if (!$couples) { return false; } $couples = pg_affected_rows($couples); } if (!$couples) { $ret = !$seq ? '' : " RETURNING nextval('{$seq}') < {$prim}"; $connexion['last'] = $q = "INSERT INTO {$table} (" . join(',', array_keys($values)) . ') VALUES (' . join(',', $values) . "){$ret}"; $couples = spip_pg_query_simple($link, $q); if (!$couples) { return false; } elseif ($ret) { $r = pg_fetch_array($couples, NULL, PGSQL_NUM); if ($r[0]) { $connexion['last'] = $q = "SELECT setval('{$seq}', {$prim}) from {$table}"; // Le code de SPIP met parfois la sequence a 0 (dans l'import) // MySQL n'en dit rien, on fait pareil pour PG $r = @pg_query($link, $q); } } } return $couples; }
function inc_import_1_2_dist($f, $request, $gz='fread') { global $import_ok; static $field_desc = array (); static $tables, $a_importer; if (!$tables) { $init = $request['init']; $a_importer = $init($request); $tables = array( 'article' => 'spip_articles', 'auteur' => 'spip_auteurs', 'breve' => 'spip_breves', 'document' => 'spip_documents', 'forum' => 'spip_forum', 'groupe_mots' => 'spip_groupes_mots', 'message' => 'spip_messages', 'mot' => 'spip_mots', 'petition' => 'spip_petitions', 'rubrique' => 'spip_rubriques', 'signature' => 'spip_signatures', 'syndic' => 'spip_syndic', 'syndic_article' => 'spip_syndic_articles', 'type_document' => 'spip_types_documents' ); } $import_ok = false; $b = false; // Lire le type d'objet if (!($type = xml_fetch_tag($f, $b, $gz))) return false; if ($type == '/SPIP') return !($import_ok = true); $id = "id_$type"; $id_objet = 0; $table = isset($tables[$type]) ? $tables[$type] : $type; if (in_array($table, $a_importer) AND !isset($field_desc[$table])) { // recuperer la description de la table pour connaitre ses champs valides $desc = description_table($table); if (isset($desc['field'])) $field_desc[$table] = $desc['field']; else $field_desc[$table] = NULL; } $fields = $field_desc[$table]; $char = $GLOBALS['meta']['charset_insertion']; if ($char == $GLOBALS['meta']['charset_restauration']) $char = ''; $values = array(); // Lire les champs de l'objet for (;;) { $b = false; if (!($col = xml_fetch_tag($f, $b, $gz))) return false; if ($col == '/'.$type) break; $value = true; if (!xml_fetch_tag($f, $value, $gz)) return false; if (substr($col, 0, 5) == 'lien:') { $type_lien = substr($col, 5); $liens[$type_lien][] = '('.$id_objet.','.$value.')'; } else if ($col != 'maj') { // tentative de restauration d'une base sauvegardee avec le champ 'images' ; d'experience, ca arrive... // mieux vaut accepter que canner silencieusement... if (($type == 'article') && ($col == 'images')) { if ($value) { // ne pas afficher de message si on a un champ suppl mais vide echo "--><br /><span style='color: red; font-weight: bold;'>"._T('avis_erreur_sauvegarde', array('type' => $type, 'id_objet' => $id_objet))."</span>\n<span style='color: black'>"._T('avis_colonne_inexistante', array('col' => $col)); if ($col == 'images') echo _T('info_verifier_image'); echo "</span>\n<!--"; $GLOBALS['erreur_restauration'] = true; } } else if ($fields==NULL or isset($fields[$col])) { if ($char) $value = importer_charset($value, $char); $values[$col] = $value; if ($col == $id) $id_objet = $value; } } } if ($values) { if (!sql_replace($table, $values, $desc)) { echo "--><br /><span style='color: red; font-weight: bold;'>"._T('avis_erreur_mysql')."</span>\n<span style='color: black'><tt>".sql_error()."</tt></span>\n<!--"; $GLOBALS['erreur_restauration'] = true; } if ($type == 'article') { sql_delete("spip_auteurs_articles", "id_article=$id_objet"); sql_delete("spip_documents_articles", "id_article=$id_objet"); } else if ($type == 'rubrique') { sql_delete("spip_auteurs_rubriques", "id_rubrique=$id_objet"); sql_delete("spip_documents_rubriques", "id_rubrique=$id_objet"); } else if ($type == 'breve') { sql_delete("spip_documents_breves", "id_breve=$id_objet"); } else if ($type == 'mot') { sql_delete("spip_mots_articles", "id_mot=$id_objet"); sql_delete("spip_mots_breves", "id_mot=$id_objet"); sql_delete("spip_mots_forum", "id_mot=$id_objet"); sql_delete("spip_mots_rubriques", "id_mot=$id_objet"); sql_delete("spip_mots_syndic", "id_mot=$id_objet"); } else if ($type == 'auteur') { sql_delete("spip_auteurs_rubriques", "id_auteur=$id_objet"); } else if ($type == 'message') { sql_delete("spip_auteurs_messages", "id_message=$id_objet"); } if ($liens) { reset($liens); while (list($type_lien, $t) = each($liens)) { if ($type == 'auteur' OR $type == 'mot' OR $type == 'document') if ($type_lien == 'syndic' OR $type_lien == 'forum') $table_lien = 'spip_'.$type.'s_'.$type_lien; else $table_lien = 'spip_'.$type.'s_'.$type_lien.'s'; else $table_lien = 'spip_'.$type_lien.'s_'.$type.'s'; sql_insert($table_lien, "($id, id_$type_lien)", join(',', $t)); } } } return $import_ok = " "; }
function import_init_tables($request){ global $connect_id_auteur; // commencer par verifier les meta et le champ impt=non $config = charger_fonction('config','inc'); $config(); // grand menage // on vide toutes les tables dont la restauration est demandee list($tables,) = base_liste_table_for_dump(lister_tables_noerase()); spip_log(count($tables) . " tables effacees " . join(', ', $tables),'import'); foreach($tables as $table){ // regarder si il y a au moins un champ impt='non' if (($table!='spip_auteurs')){ $desc = description_table($table); if (isset($desc['field']['impt'])) sql_delete($table, "impt='oui'"); else sql_delete($table); } } // Bidouille pour garder l'acces admin actuel pendant toute la restauration sql_delete("spip_auteurs", "id_auteur=0"); sql_updateq('spip_auteurs', array('id_auteur'=>0, 'extra'=>$connect_id_auteur), "id_auteur=$connect_id_auteur"); sql_delete("spip_auteurs", "id_auteur!=0"); // retourner la liste des tables a importer, pas celle des tables videes ! return import_table_choix($request); }
function ecatalogue_upgrade($nom_meta_base_version, $version_cible) { $current_version = "0.0"; // If plugin is already installed, get it's base version if (isset($GLOBALS['meta'][$nom_meta_base_version])) { $current_version = $GLOBALS['meta'][$nom_meta_base_version]; //spip_log('12:14 Version actuelle : '.$current_version,'ecatalogue'); } // If plugin's base version is 0.0 (it is not installed) create database if ($current_version == "0.0") { // check if you already have an old database $r = mysql_query("SELECT `type` FROM `spip_ecatalogue_groupes` WHERE 0"); if ($r) { sql_alter("TABLE spip_ecatalogue_groupes RENAME spip_ecatalogue_proprietes"); sql_alter("TABLE spip_ecatalogue_proprietes CHANGE id_groupe id_propriete bigint(21) NOT NULL"); sql_alter("TABLE spip_ecatalogue_options CHANGE id_groupe id_propriete bigint(21) NOT NULL"); } creer_base(); // Write new version to sql cache. //$current_version became latest, therefore all next version_compare checks won't be executed ecrire_meta($nom_meta_base_version, $current_version = $version_cible); //spip_log('Base de donnйes ecatalogue correctement peuplйe','ecatalogue'); } // If plugin's base version is < 0.1, alter some tables if (version_compare($current_version, "0.1.0", "<")) { // Upgrade via sql_alter //sql_alter("TABLE spip_ecatalogue_products ADD COLUMN id_equipment bigint(21) NOT NULL"); // Upgrade via maj_tables (it tells SPIP to refresh some tables) maj_tables('spip_ecatalogue_products'); // Write new version to sql cache ecrire_meta($nom_meta_base_version, $current_version = "0.1"); } if (version_compare($current_version, "0.2.0", "<")) { //maj_tables('spip_ecatalogue_articles_similars'); creer_base(); maj_tables('spip_ecatalogue_products'); ecrire_meta($nom_meta_base_version, $current_version = "0.2"); } if (version_compare($current_version, "0.3.0", "<")) { // Create tables that wasn't created yet creer_base(); ecrire_meta($nom_meta_base_version, $current_version = "0.3"); } if (version_compare($current_version, "0.4.0", "<")) { // Create tables that wasn't created yet //creer_base(); maj_tables('spip_ecatalogue_products'); ecrire_meta($nom_meta_base_version, $current_version = "0.4"); } if (version_compare($current_version, "0.5.0", "<")) { // Create tables that wasn't created yet creer_base(); ecrire_meta($nom_meta_base_version, $current_version = "0.5"); } if (version_compare($current_version, "0.6.0", "<")) { maj_tables('spip_ecatalogue_products'); ecrire_meta($nom_meta_base_version, $current_version = "0.6"); } if (version_compare($current_version, "0.7.0", "<")) { maj_tables('spip_ecatalogue_composites_articles'); ecrire_meta($nom_meta_base_version, $current_version = "0.7"); } if (version_compare($current_version, "0.9.0", "<")) { maj_tables('spip_ecatalogue_options'); ecrire_meta($nom_meta_base_version, $current_version = "0.9"); } if (version_compare($current_version, "0.10.0", "<")) { // Create tables that wasn't created yet (spip_ecatalogue_proprietes, spip_ecatalogue_rubriques_groupes) creer_base(); // Update tables maj_tables('spip_ecatalogue_options'); maj_tables('spip_ecatalogue_groupes'); ecrire_meta($nom_meta_base_version, $current_version = "0.10"); } if (version_compare($current_version, "0.11.0", "<")) { // Create tables that wasn't created yet (spip_ecatalogue_proprietes, spip_ecatalogue_rubriques_groupes) //creer_base(); $desc = description_table('spip_rubriques'); // Update tables if (!array_key_exists('id_import', $desc['field'])) { sql_query('Alter table spip_rubriques add column id_import int null '); } ecrire_meta($nom_meta_base_version, $current_version = "0.11"); } if (version_compare($current_version, "0.12.0", "<")) { creer_base(); maj_tables('ecatalogue_prices'); maj_tables('ecatalogue_prices_group'); // Проверка на существование 1 группы цен $id_group = ''; $r1 = sql_select('id_group', 'spip_ecatalogue_prices_group', array('id_group = 1', 'is_active = 1')); while ($res = sql_fetch($r1)) { $id_group = $res[1]; } if (!$id_group) { sql_insert('spip_ecatalogue_prices_group', '(id_group,titre,is_active)', '(1,"Розница",1)'); } // Запись в таблицу spip_ecatalogue_prices цен из таблицы spip_ecatalogue_products $r = sql_select('id_article,price', 'spip_ecatalogue_products', 'price<>""'); while ($res = sql_fetch($r)) { $id_group = 1; $id_article = $res['id_article']; $price = $res['price']; // Проверка что такая цена уже есть в справочнике цен в 1 группе, тогда цену обновляем $id_tmp_art = ''; $r2 = sql_select('id_article', 'spip_ecatalogue_prices', array('id_article = ' . $id_article, 'id_group = 1')); while ($res = sql_fetch($r2)) { $id_tmp_art = $res['id_article']; } if ($id_tmp_art) { // Обновляем цену sql_update('spip_ecatalogue_prices', array('price' => $price), array('id_article = ' . $id_article, 'id_group = 1')); } else { // Вставляем цену sql_insert('spip_ecatalogue_prices', '(id_article,id_group,price)', '(' . $id_article . ',1,' . $price . ')'); } } ecrire_meta($nom_meta_base_version, $current_version = "0.12"); } include_spip('base/ecatalogue_db_populate'); }
function inc_import_1_3_dist($lecteur, $request, $gz='fread', $atts=array()) { global $import_ok, $tables_trans, $trans; static $tables = ''; static $phpmyadmin, $fin; static $field_desc = array (); static $defaut = array('field' => array()); // au premier appel, init des invariants de boucle if (!$tables OR $trans) { $init = $request['init']; $tables = $init($request); if (!$tables) return ($import_ok = false); $phpmyadmin = preg_match("{^phpmyadmin::}is", $GLOBALS['meta']['restauration_version_archive']) ? array(array('"','>'),array('"','>')) : false; $fin = '/' . $GLOBALS['meta']['restauration_tag_archive']; } $b = false; if (!($table = xml_fetch_tag($lecteur, $b, $gz))) return false; if ($table == $fin) return !($import_ok = true); if (strpos($table,'=')!==FALSE) { list($table, $attl) = xml_parse_tag($table); $atts = array_merge($atts, $attl); } $new = isset($tables_trans[$table]) ? $tables_trans[$table]: $table; // indique a la fois la fonction a appliquer // et les infos qu'il faut lui communiquer $boucle = $request['boucle']; if (!in_array($new,$tables)) $field_desc[$boucle][$table] = $desc = $defaut; elseif (isset($field_desc[$boucle][$table])) $desc = $field_desc[$boucle][$table]; else { // recuperer la description de la table pour connaitre ses champs valides $desc = description_table($table); if (!isset($desc['field'])) $desc = $defaut; elseif (isset($request['insertion']) AND $request['insertion']=='on') $desc['field'] = import_collecte($desc); $field_desc[$boucle][$table] = $desc; #spip_log("$table :".var_export($field_desc[$boucle][$table],1),'dbrest'); } $values = import_lire_champs($lecteur, $desc['field'], $gz, $phpmyadmin, '/' . $table, $atts); if ($values === false) return ($import_ok = false); if ($values) $boucle($values, $new, $desc, $request, $atts); return $import_ok = $new; }