Skip to content
Extraits de code Groupes Projets
Valider f5c921f2 rédigé par marcimat's avatar marcimat
Parcourir les fichiers

3 fonctions pour gérer des transactions :

* sql_preferer_transaction() renvoie TRUE ou FALSE si le moteur SQL prefere, ou éventuellement peut,  en utiliser
* sql_demarrer_transaction() démare une transaction
* sql_terminer_transaction() clos la transaction

Les fonctions ne sont implémentés que sur SQLite dans ce dépot. (les appeler ne fera donc rien dans les autre moteurs SQL actuellement).

Cela permet des gains intéressant sur des sql_update de sqlite :

Le foreach dans l'exemple si dessous passe, pour 190 enregistrements (seulement), de 23s à 400ms !


if (sql_preferer_transaction()) {
	sql_demarrer_transaction();
}
		
foreach ($inserts as $id_plugin => $complements) {
	sql_updateq('spip_plugins', $complements, 'id_plugin=' . intval($id_plugin));
}
		
if (sql_preferer_transaction()) {
	sql_terminer_transaction();
}
parent 33146c6c
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -490,6 +490,41 @@ function sql_version($serveur='', $option=true) { ...@@ -490,6 +490,41 @@ function sql_version($serveur='', $option=true) {
return ($row['n']); return ($row['n']);
} }
/**
* Informe si le moteur SQL prefere utiliser des transactions
* (Utile pour sqlite)
**/
function sql_preferer_transaction($serveur='', $option=true) {
$f = sql_serveur('preferer_transaction', $serveur, 'continue');
if (!is_string($f) OR !$f) return false;
$r = $f($serveur, $option!==false);
if ($r === false) spip_sql_erreur($serveur);
return $r;
};
/**
* Demarre une transaction
**/
function sql_demarrer_transaction($serveur='', $option=true) {
$f = sql_serveur('demarrer_transaction', $serveur, 'continue');
if (!is_string($f) OR !$f) return false;
$r = $f($serveur, $option!==false);
if ($r === false) spip_sql_erreur($serveur);
return $r;
};
/**
* Termine une transaction
**/
function sql_terminer_transaction($serveur='', $option=true) {
$f = sql_serveur('terminer_transaction', $serveur, 'continue');
if (!is_string($f) OR !$f) return false;
$r = $f($serveur, $option!==false);
if ($r === false) spip_sql_erreur($serveur);
return $r;
};
// prend une chaine sur l'aphabet hexa // prend une chaine sur l'aphabet hexa
// et retourne sa representation numerique: // et retourne sa representation numerique:
// FF ==> 0xFF en MySQL mais x'FF' en PG // FF ==> 0xFF en MySQL mais x'FF' en PG
......
...@@ -900,6 +900,39 @@ function spip_sqlite_insertq_multi($table, $tab_couples = array(), $desc = array ...@@ -900,6 +900,39 @@ function spip_sqlite_insertq_multi($table, $tab_couples = array(), $desc = array
} }
/**
* Retourne si le moteur SQL prefere utiliser des transactions.
*
* @param
* @return bool true / false
**/
function spip_sqlite_preferer_transaction($serveur = '', $requeter = true) {
return true;
}
/**
* Demarre une transaction.
* Pratique pour des sql_updateq() dans un foreach,
* parfois 100* plus rapide s'ils sont nombreux en sqlite !
*
**/
function spip_sqlite_demarrer_transaction($serveur = '', $requeter = true) {
if (!$requeter) return "BEGIN TRANSACTION";
spip_sqlite::demarrer_transaction($serveur);
return true;
}
/**
* Cloture une transaction.
*
**/
function spip_sqlite_terminer_transaction($serveur = '', $requeter = true) {
if (!$requeter) return "COMMIT";
spip_sqlite::finir_transaction($serveur);
return true;
}
// http://doc.spip.org/@spip_sqlite_listdbs // http://doc.spip.org/@spip_sqlite_listdbs
function spip_sqlite_listdbs($serveur = '', $requeter = true){ function spip_sqlite_listdbs($serveur = '', $requeter = true){
_sqlite_init(); _sqlite_init();
...@@ -1642,6 +1675,9 @@ function _sqlite_ref_fonctions(){ ...@@ -1642,6 +1675,9 @@ function _sqlite_ref_fonctions(){
'showtable' => 'spip_sqlite_showtable', 'showtable' => 'spip_sqlite_showtable',
'update' => 'spip_sqlite_update', 'update' => 'spip_sqlite_update',
'updateq' => 'spip_sqlite_updateq', 'updateq' => 'spip_sqlite_updateq',
'preferer_transaction' => 'spip_sqlite_preferer_transaction',
'demarrer_transaction' => 'spip_sqlite_demarrer_transaction',
'terminer_transaction' => 'spip_sqlite_terminer_transaction',
); );
// association de chaque nom http d'un charset aux couples sqlite // association de chaque nom http d'un charset aux couples sqlite
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter