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; } }