2626
2727namespace  OC \Authentication \TwoFactorAuth \Db ;
2828
29+ use  Doctrine \DBAL \Exception \UniqueConstraintViolationException ;
2930use  OCP \DB \QueryBuilder \IQueryBuilder ;
3031use  OCP \IDBConnection ;
3132
@@ -72,25 +73,7 @@ public function getState(string $uid): array {
7273	public  function  persist (string  $ providerId , string  $ uid , int  $ enabled ) {
7374		$ qb  = $ this  ->conn ->getQueryBuilder ();
7475
75- 		$ this  ->conn ->beginTransaction ();
76- 		// To prevent duplicate primary key, we have to first check if an INSERT 
77- 		// or UPDATE is required 
78- 		$ query  = $ qb ->select ('* ' )
79- 			->from (self ::TABLE_NAME )
80- 			->where ($ qb ->expr ()->eq ('provider_id ' , $ qb ->createNamedParameter ($ providerId )))
81- 			->andWhere ($ qb ->expr ()->eq ('uid ' , $ qb ->createNamedParameter ($ uid )));
82- 		$ result  = $ query ->execute ();
83- 		$ rowCount  = count ($ result ->fetchAll ());
84- 		$ result ->closeCursor ();
85- 
86- 		if  ($ rowCount  > 0 ) {
87- 			// There is an entry -> update it 
88- 			$ updateQuery  = $ qb ->update (self ::TABLE_NAME )
89- 				->set ('enabled ' , $ qb ->createNamedParameter ($ enabled ))
90- 				->where ($ qb ->expr ()->eq ('provider_id ' , $ qb ->createNamedParameter ($ providerId )))
91- 				->andWhere ($ qb ->expr ()->eq ('uid ' , $ qb ->createNamedParameter ($ uid )));
92- 			$ updateQuery ->execute ();
93- 		} else  {
76+ 		try  {
9477			// Insert a new entry 
9578			$ insertQuery  = $ qb ->insert (self ::TABLE_NAME )->values ([
9679				'provider_id '  => $ qb ->createNamedParameter ($ providerId ),
@@ -99,8 +82,14 @@ public function persist(string $providerId, string $uid, int $enabled) {
9982			]);
10083
10184			$ insertQuery ->execute ();
85+ 		} catch  (UniqueConstraintViolationException   $ ex ) {
86+ 			// There is already an entry -> update it 
87+ 			$ updateQuery  = $ qb ->update (self ::TABLE_NAME )
88+ 				->set ('enabled ' , $ qb ->createNamedParameter ($ enabled ))
89+ 				->where ($ qb ->expr ()->eq ('provider_id ' , $ qb ->createNamedParameter ($ providerId )))
90+ 				->andWhere ($ qb ->expr ()->eq ('uid ' , $ qb ->createNamedParameter ($ uid )));
91+ 			$ updateQuery ->execute ();
10292		}
103- 		$ this  ->conn ->commit ();
10493
10594	}
10695
0 commit comments