public function testTransaction()
    {
        CopixDB::begin();
        CopixDB::getConnection()->doQuery('delete from copixtestmain');
        CopixDB::rollback();
        $full = CopixDB::getConnection()->doQuery('select * from copixtestmain');
        $this->assertTrue(count($full) === 4);
        CopixDB::begin();
        $query = 'INSERT INTO copixtestmain (type_test,titre_test,description_test,date_test,version_test)
VALUES (1, \'Titre temp\', \'Description de lelement temporaire\', \'20060201\', 0)';
        CopixDB::getConnection()->doQuery($query);
        CopixDB::commit();
        $full = CopixDB::getConnection()->doQuery('select * from copixtestmain');
        $this->assertTrue(count($full) === 5);
        $tId = CopixDB::begin();
        //création des enregistrements de l'autre table
        $record = _record('copixtest|copixtestmain');
        //Création de la dao de l'autre table
        $dao = _dao('copixtest|copixtestmain');
        //insertion d'enregistrements exemples
        $record->type_test = 1;
        //catégorie
        $record->title_test = 'Titre temp';
        $record->description_test = 'Description de lelement temporaire';
        $record->date_test = '20060201';
        $record->version_test = 0;
        $dao->insert($record);
        CopixDB::commit($tId);
        $full = CopixDB::getConnection()->doQuery('select * from copixtestmain');
        $this->assertTrue(count($full) === 6);
        CopixDB::begin();
        //création des enregistrements de l'autre table
        $record = _record('copixtest|copixtestmain');
        //Création de la dao de l'autre table
        $dao = _dao('copixtest|copixtestmain');
        //insertion d'enregistrements exemples
        $record->type_test = 1;
        //catégorie
        $record->title_test = 'Titre temp';
        $record->description_test = 'Description de lelement temporaire';
        $record->date_test = '20060201';
        $record->version_test = 0;
        $dao->insert($record);
        CopixDB::rollback();
        $full = CopixDB::getConnection()->doQuery('select * from copixtestmain');
        $this->assertTrue(count($full) === 6);
        CopixDB::begin();
        $count = CopixDB::getConnection()->doQuery('delete from copixtestmain');
        $this->assertEquals(6, $count);
        CopixDB::begin();
        $count = count(CopixDB::getConnection()->doQuery('select * from copixtestforeignkeytype'));
        CopixDB::getConnection()->doQuery("INSERT INTO copixtestforeignkeytype ( caption_typetest ) VALUES ('test')");
        $countNow = count(CopixDB::getConnection()->doQuery('select * from copixtestforeignkeytype'));
        CopixDB::commit();
        CopixDB::rollback();
        $full = CopixDB::getConnection()->doQuery('select * from copixtestmain');
        $this->assertTrue(count($full) >= 5);
        $this->assertTrue($count == $countNow - 1);
        $dao->delete($record->id_test);
    }
 /**
  * Lance un script SQL
  * @param	string	$pFilePath	le chemin du fichier SQL à exécuter
  * @param	boolean	$pRollbackOnFailure	indique si l'on doit réaliser un rollback en cas d'échec d'une requête
  * @return 	integer le nombre de requêtes exécutées avec succès
  */
 public function doSQLScript($pFilePath, $pRollbackOnFailure = true)
 {
     $lines = file($pFilePath);
     $cmdSQL = '';
     $nbCmd = 0;
     if ($pRollbackOnFailure) {
         CopixDB::begin();
     }
     foreach ((array) $lines as $key => $line) {
         if (!preg_match($this->_scriptComment, $line) && strlen(trim($line)) > 0) {
             // la ligne n'est ni vide ni commentaire
             if (strlen(trim($line)) > 0) {
                 $cmdSQL .= $line;
                 if (preg_match($this->_scriptEndOfQuery, $line)) {
                     //Si on est à la ligne de fin de la commande on l'execute
                     // On nettoie la commande du ";" de fin et on l'execute
                     $cmdSQL = preg_replace($this->_scriptEndOfQuery, '', $cmdSQL);
                     try {
                         $this->doQuery($cmdSQL);
                     } catch (Exception $e) {
                         if ($pRollbackOnFailure) {
                             CopixDB::rollback();
                         }
                         throw $e;
                     }
                     $nbCmd++;
                     $cmdSQL = '';
                 }
             }
         }
     }
     if ($pRollbackOnFailure) {
         CopixDB::commit();
     }
     return $nbCmd;
 }
 /**
  * Demande l'exécution d'un service donné
  * @param string $pServiceId L'identifiant du service que l'on souhaite lancer
  * @param array $vars parameters
  */
 public static function process($pServiceId, $pParams = array(), $pTransactionContext = self::NEW_TRANSACTION)
 {
     $extractedPath = self::_extractPath($pServiceId);
     $service = self::_create($extractedPath, $pParams);
     $methName = $extractedPath->method;
     CopixContext::push($extractedPath->module);
     try {
         if ($pTransactionContext == self::NEW_TRANSACTION) {
             CopixDB::begin();
         }
         $toReturn = $service->{$methName}();
         if ($pTransactionContext == self::NEW_TRANSACTION) {
             CopixDB::commit();
         }
         CopixContext::pop();
         return $toReturn;
     } catch (Exception $e) {
         if ($pTransactionContext == self::NEW_TRANSACTION) {
             CopixDB::rollback();
         }
         CopixContext::pop();
         throw $e;
     }
 }