Russian Qt Forum

Qt => Базы данных => Тема начата: unkeep от Ноябрь 24, 2015, 13:15



Название: QSqlDatabase wrapper and exeptions
Отправлено: unkeep от Ноябрь 24, 2015, 13:15
Написал хелпер для репозиториев. Автоматизирует генерацию sql запросов и парсинг результата.
Работает нормально, код упрощается.

Появилась идея добавить возможность генерации исключений, дабы в большой транзакции не писать самому множество прерываний:

код без исключений:

Код
C++ (Qt)
   DatabaseWrapper dbWrapper(db);
   dbWrapper.Transaction();
   if (dbWrapper.hasError())
   {
       return MakeResponse(dbWrapper.lastError()); //error response
   }
   for(int i=0; i<100; ++i)
   {
       dbWrapper.Insert(/*params*/);
       if (dbWrapper.hasError())
       {
           dbWrapper.Rollback();
           return MakeResponse(dbWrapper.lastError()); //error response
       }
       dbWrapper.Delete(/*params*/);
       if (dbWrapper.hasError())
       {
           dbWrapper.Rollback();
           return MakeResponse(dbWrapper.lastError()); //error response
       }
       dbWrapper.Update(/*params*/);
       if (dbWrapper.hasError())
       {
           dbWrapper.Rollback();
           return MakeResponse(dbWrapper.lastError()); //error response
       }
       dbWrapper.Select(/*params*/);
       if (dbWrapper.hasError())
       {
           dbWrapper.Rollback();
           return MakeResponse(dbWrapper.lastError()); //error response
       }
   }
 
   dbWrapper.Commit();
   if (dbWrapper.hasError())
   {
       dbWrapper.Rollback();
       return MakeResponse(dbWrapper.lastError()); //error response
   }
 
   return MakeResponse(); // success response
 


код с исключениями:

Код
C++ (Qt)
   DatabaseWrapper dbWrapper(db);
   dbWrapper.setSqlErrorExeptionsEnabled(true); // now dbWrapper can throw exeptions
   try
   {
       dbWrapper.Transaction(); //can throw exeption with sqlError
       for(int i=0; i<100; ++i)
       {
           dbWrapper.Insert(/*params*/); //can throw exeption with sqlError
           dbWrapper.Delete(/*params*/); //can throw exeption with sqlError
           dbWrapper.Update(/*params*/); //can throw exeption with sqlError
           dbWrapper.Select(/*params*/); //can throw exeption with sqlError
       }
 
       dbWrapper.Commit(); //can throw exeption with sqlError
   }
   catch(QSqlError error)
   {
       dbWrapper.setSqlErrorExeptionsEnabled(false); // now dbWrapper can not throw exeptions
       dbWrapper.Rollback(); // safely
       return MakeResponse(error); //error response
   }
   return MakeResponse(); // success response
 

вопрос: какие проблемы могут возникнуть при использовании исключений?
производительность замерял, с исключениями конечно немного медленнее работает, но не соизмеримо со временем отработки самих запросов.