Valider 4036970b rédigé par marcimat's avatar marcimat
Parcourir les fichiers

Création et Suppression de Vues SQL pour les 3 serveurs PG, SQLite et MySQL

(et correction d'un petit bup pg sur sql_showtable)

- Introduction de 3 fonctions :
* sql_get_select() : qui reprend les mêmes arguments que sql_select() mais retourne la syntaxe de la requete sans l'executer
* sql_create_view($nom, $requete_select) : crée une vue nommée $nom avec la selection $requete_select
* sql_drop_view($nom) : supprime une vue

- Attention, comme déjà signalé, si dans une selection il y a un champ préfixé d'un nom de table ou d'un alias : a.titre, il faut absolument lui donner un nom, sinon SQLite ne peut pas relire le champ (stocké 'a.titre' et non 'titre' dans sa vue). Dans ce cas faire : a.titre AS titre .

- exemple inutile :

$sel = sql_get_select(array('id_article'=>'id_article', 'titre'=>'titre'),'spip_articles');
echo "requete select : $sel<br />";
sql_create_view('vue_nom', $sel);

if ($res = sql_select(array('id_article', 'titre'),'vue_nom','','','','10')){
	while ($r = sql_fetch($res)){
		echo "*" . $r['id_article'] . " - " . $r['titre'] . "<br />";
	}	
}

sql_drop_view('vue_nom');
parent 8295b03c
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+28 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -77,6 +77,15 @@ function sql_select (
	return $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option!==false);
}

// Recupere la syntaxe de la requete select sans l'executer
// simplement $option = false au lieu de true
function sql_get_select	(
	$select = array(), $from = array(), $where = array(),
	$groupby = array(), $orderby = array(), $limit = '', $having = array(),
	$serveur='') {
	return sql_select ($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false);
}

// Comme ci-dessus, mais ramene seulement et tout de suite le nombre de lignes
// Pas de colonne ni de tri a donner donc.
// http://doc.spip.org/@sql_countsel
@@ -213,6 +222,14 @@ function sql_drop_table($table, $exist='', $serveur='', $option=true)
	return $f($table, $exist, $serveur, $option!==false);
}

// supprimer une vue sql
function sql_drop_view($table, $exist='', $serveur='', $option=true)
{
	$f = sql_serveur('drop_view', $serveur, $continue = $option==='continue' OR $option===false);
	if (!is_string($f) OR !$f) return false;
	return $f($table, $exist, $serveur, $option!==false);
}

// http://doc.spip.org/@sql_showbase
function sql_showbase($spip=NULL, $serveur='', $option=true)
{
@@ -253,6 +270,17 @@ function sql_create($nom, $champs, $cles=array(), $autoinc=false, $temporary=fal
	return $f($nom, $champs, $cles, $autoinc, $temporary, $serveur, $option!==false);
}


// Fonction pour creer une vue 
// nom : nom de la vue,
// select_query : une requete select, idealement cree avec $req = sql_select()
// (en mettant $option du sql_select a false pour recuperer la requete)
function sql_create_view($nom, $select_query, $serveur='', $option=true) {
	$f = sql_serveur('create_view', $serveur, $continue = $option==='continue' OR $option===false);
	if (!is_string($f) OR !$f) return false;
	return $f($nom, $select_query, $serveur, $option!==false);
}

// http://doc.spip.org/@sql_multi
function sql_multi($sel, $lang, $serveur='', $option=true)
{
+24 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -46,8 +46,10 @@ $GLOBALS['spip_mysql_functions_1'] = array(
		'count' => 'spip_mysql_count',
		'countsel' => 'spip_mysql_countsel',
		'create' => 'spip_mysql_create',
		'create_view' => 'spip_mysql_create_view',
		'delete' => 'spip_mysql_delete',
		'drop_table' => 'spip_mysql_drop_table',
		'drop_view' => 'spip_mysql_drop_view',
		'errno' => 'spip_mysql_errno',
		'error' => 'spip_mysql_error',
		'explain' => 'spip_mysql_explain',
@@ -358,6 +360,22 @@ function spip_mysql_create($nom, $champs, $cles, $autoinc=false, $temporary=fals
	return spip_mysql_query($q, $serveur);
}


// Fonction de creation d'une vue SQL nommee $nom
// http://doc.spip.org/@spip_sqlite_create
function spip_mysql_create_view($nom, $query_select, $serveur='',$requeter=true) {
	if (!$query_select) return false;
	// vue deja presente
	if (sql_showtable($nom, false, $serveur)) {
		spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)");
		return false;
	}
	
	$query = "CREATE VIEW $nom AS ". $query_select;
	return spip_mysql_query($query, $serveur, $requeter);
}


// http://doc.spip.org/@spip_mysql_drop_table
function spip_mysql_drop_table($table, $exist='', $serveur='',$requeter=true)
{
@@ -365,6 +383,12 @@ function spip_mysql_drop_table($table, $exist='', $serveur='',$requeter=true)
	return spip_mysql_query("DROP TABLE$exist $table", $serveur, $requeter);
}

// supprime une vue 
function spip_mysql_drop_view($view, $exist='', $serveur='',$requeter=true) {
	if ($exist) $exist =" IF EXISTS";
	return spip_mysql_query("DROP VIEW$exist $view", $serveur, $requeter);
}

// http://doc.spip.org/@spip_mysql_showbase
function spip_mysql_showbase($match, $serveur='',$requeter=true)
{
+30 −3
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -72,8 +72,10 @@ $GLOBALS['spip_pg_functions_1'] = array(
		'count' => 'spip_pg_count',
		'countsel' => 'spip_pg_countsel',
		'create' => 'spip_pg_create',
		'create_view' => 'spip_pg_create_view',
		'delete' => 'spip_pg_delete',
		'drop_table' => 'spip_pg_drop_table',
		'drop_view' => 'spip_pg_drop_view',
		'errno' => 'spip_pg_errno',
		'error' => 'spip_pg_error',
		'explain' => 'spip_pg_explain',
@@ -858,6 +860,12 @@ function spip_pg_drop_table($table, $exist='', $serveur='',$requeter=true)
	return spip_pg_query("DROP TABLE$exist $table", $serveur, $requeter);
}

// supprime une vue 
function spip_pg_drop_view($view, $exist='', $serveur='',$requeter=true) {
	if ($exist) $exist =" IF EXISTS";
	return spip_pg_query("DROP VIEW$exist $view", $serveur, $requeter);
}

// http://doc.spip.org/@spip_pg_showbase
function spip_pg_showbase($match, $serveur='',$requeter=true)
{
@@ -874,9 +882,10 @@ function spip_pg_showtable($nom_table, $serveur='',$requeter=true)
	$link = $connexion['link'];

	$res = pg_query($link, "SELECT column_name, column_default, data_type FROM information_schema.columns WHERE table_name ILIKE " . _q($nom_table));

	if (!$res) return false;
	
	// etrangement, $res peut ne rien contenir, mais arriver ici...
	// il faut en tenir compte dans le return
	$fields = array();
	while($field = pg_fetch_array($res, NULL, PGSQL_NUM)) {
		$fields[$field[0]] = $field[2] . (!$field[1] ? '' : (" DEFAULT " . $field[1]));
@@ -892,7 +901,8 @@ function spip_pg_showtable($nom_table, $serveur='',$requeter=true)
			  $r[2];
		}
	}
	return array('field' => $fields, 'key' => $keys);

	return count($fields) ? array('field' => $fields, 'key' => $keys) : false;
}

// Fonction de creation d'une table SQL nommee $nom
@@ -970,6 +980,23 @@ function spip_pg_create($nom, $champs, $cles, $autoinc=false, $temporary=false,
	return $r;
}



// Fonction de creation d'une vue SQL nommee $nom
// http://doc.spip.org/@spip_sqlite_create
function spip_pg_create_view($nom, $query_select, $serveur='',$requeter=true) {
	if (!$query_select) return false;
	// vue deja presente
	if (sql_showtable($nom, false, $serveur)) {
		if ($requeter) spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)");
		return false;
	}
	
	$query = "CREATE VIEW $nom AS ". $query_select;
	return spip_pg_query($query, $serveur, $requeter);
}


// http://doc.spip.org/@spip_pg_set_connect_charset
function spip_pg_set_connect_charset($charset, $serveur='',$requeter=true){
	spip_log("changement de charset sql a ecrire en PG");
+29 −4
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -285,6 +285,19 @@ function spip_sqlite_create($nom, $champs, $cles, $autoinc=false, $temporary=fal
	return spip_sqlite_query($query, $serveur, $requeter);
}

// Fonction de creation d'une vue SQL nommee $nom
// http://doc.spip.org/@spip_sqlite_create
function spip_sqlite_create_view($nom, $query_select, $serveur='',$requeter=true) {
	if (!$query_select) return false;
	// vue deja presente
	if (sql_showtable($nom, false, $serveur)) {
		spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)");
		return false;
	}
	
	$query = "CREATE VIEW $nom AS ". $query_select;
	return spip_sqlite_query($query, $serveur, $requeter);
}

// en PDO/sqlite3, il faut calculer le count par une requete count(*)
// pour les resultats de SELECT
@@ -349,6 +362,20 @@ function spip_sqlite_drop_table($table, $exist='', $serveur='',$requeter=true) {
	return spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter);
}

// supprime une vue 
function spip_sqlite_drop_view($view, $exist='', $serveur='',$requeter=true) {
	if ($exist) $exist =" IF EXISTS";
	
	/* simuler le IF EXISTS - version 2 */
	if ($exist && _sqlite_is_version(2, '', $serveur)){
		$a = spip_sqlite_showtable($view, $serveur); 
		if (!$a) return true;
		$exist = '';
	}
	
	return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter);
}


// http://doc.spip.org/@spip_sqlite_error
function spip_sqlite_error($query='', $serveur='',$requeter=true) {
@@ -1126,16 +1153,14 @@ function _sqlite_modifier_table($table_origine, $table_destination, $colonne_ori
// http://doc.spip.org/@_sqlite_ref_fonctions
function _sqlite_ref_fonctions(){
	$fonctions = array(
	// tests
		'begin' => 'spip_sqlite_begin',
		'commit' => 'spip_sqlite_commit',
		
		'alter' => 'spip_sqlite_alter',
		'count' => 'spip_sqlite_count',
		'countsel' => 'spip_sqlite_countsel',
		'create' => 'spip_sqlite_create',
		'create_view' => 'spip_sqlite_create_view',
		'delete' => 'spip_sqlite_delete',
		'drop_table' => 'spip_sqlite_drop_table',
		'drop_view' => 'spip_sqlite_drop_view',
		'errno' => 'spip_sqlite_errno',
		'error' => 'spip_sqlite_error',
		'explain' => 'spip_sqlite_explain',