Ejemplo n.º 1
0
/**
 * 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);
}
Ejemplo n.º 2
0
/**
 * 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);
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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 = "    ";
}
Ejemplo n.º 5
0
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');
}
Ejemplo n.º 7
0
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('&quot;','&gt;'),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;
}