From 0a7bc6ede3882646421171c12f111852fe872523 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Thu, 17 Nov 2011 08:55:58 +0000
Subject: [PATCH] Gerer un flag pour savoir si une transaction est ouverte ou
 non. Utiliser ce flag pour gerer la fermeture, ce qui permet d'appeler la
 fonction de fermeture sans savoir a priori, et son retour permet d'avoir
 l'info si une transaction etait ouverte ou non. (Provision pour la gestion
 d'erreur de lock dans sqlite)

---
 ecrire/req/sqlite_generique.php | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/ecrire/req/sqlite_generique.php b/ecrire/req/sqlite_generique.php
index 40adefc616..13c77b8636 100644
--- a/ecrire/req/sqlite_generique.php
+++ b/ecrire/req/sqlite_generique.php
@@ -1823,6 +1823,7 @@ function spip_versions_sqlite(){
 
 class spip_sqlite {
 	static $requeteurs = array();
+	static $transaction_en_cours = array();
 
 	function spip_sqlite(){}
 
@@ -1840,6 +1841,7 @@ class spip_sqlite {
 
 	static function demarrer_transaction($serveur){
 		spip_sqlite::executer_requete("BEGIN TRANSACTION",$serveur);
+		spip_sqlite::$transaction_en_cours[$serveur] = true;
 	}
 
 	static function executer_requete($query, $serveur, $tracer=null){
@@ -1854,10 +1856,18 @@ class spip_sqlite {
 
 	static function annuler_transaction($serveur){
 		spip_sqlite::executer_requete("ROLLBACK",$serveur);
+		spip_sqlite::$transaction_en_cours[$serveur] = false;
 	}
 
 	static function finir_transaction($serveur){
+		// si pas de transaction en cours, ne rien faire et le dire
+		if (!isset (spip_sqlite::$transaction_en_cours[$serveur])
+		  OR spip_sqlite::$transaction_en_cours[$serveur]==false)
+			return false;
+		// sinon fermer la transaction et retourner true
 		spip_sqlite::executer_requete("COMMIT",$serveur);
+		spip_sqlite::$transaction_en_cours[$serveur] = false;
+		return true;
 	}
 }
 
-- 
GitLab