🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

4 total messages Started by Borneq Sun, 15 Jan 2017 14:25
Wznawianie zapisu do bazy po wyjątku do skutku
#308978
Author: Borneq
Date: Sun, 15 Jan 2017 14:25
35 lines
1918 bytes
...lub przez max ilość prób w pętli.
Otóż,
Mam klasę dostępu do bazy MySQL.
Jest tam metoda:
void MySqlDB::execute(string statement)
{
	sql::SQLString sql_statement(statement.c_str());
     try {
         stmt->execute(sql_statement);
     }
     catch (sql::SQLException &e) {
		if (e.getErrorCode() != 1062) //duplicate entry
		{
			PRINTF ("# ERR: SQLException in %s"
					"(%s) on line %d\n"
					"# ERR: %s"
					" (MySQL error code: %d"
					", SQLState: %s )\n"
			        "%s \n"
			, __FILE__, __FUNCTION__, __LINE__, e.what(), e.getErrorCode(), 
e.getSQLState(), statement.c_str());
			auto code = e.getErrorCode();
			if(code == MySqlError::DEADLOCK_ERR || code == MySqlError::LOCKWAIT_ERR)
			{
                 PRINTF("Retry transaction\n");
                 execute(statement);
             }
		}
     }
}

Tutaj w przypadku błędów DEADLOCK_ERR czy LOCKWAIT_ERR spróbuje drugi 
raz, ale drugi raz już bez try-catch.
Jakiej składni użyć by móc to robić w pętli dowolną liczbę razy 
ograniczoną np. przez maxTrials=10 ?
Re: Wznawianie zapisu do bazy po wyjątku do skutku
#308979
Author: Borneq
Date: Sun, 15 Jan 2017 14:27
17 lines
1308 bytes
W dniu 15.01.2017 o 15:25, Borneq pisze:
> ...lub przez max ilość prób w pętli.
> Otóż,
> Mam klasę dostępu do bazy MySQL.
> Jest tam metoda:
> void MySqlDB::execute(string statement)
> {
>     sql::SQLString sql_statement(statement.c_str());
>     try {
>         stmt->execute(sql_statement);
>     }

może
do
{stmt->execute(sql_statement);}
while (jakaś flaga)
a jakaś flaga ustawiana w catch?
Re: Wznawianie zapisu do bazy po wyjątku do skutku
#308980
Author: Marek Borowski
Date: Sat, 21 Jan 2017 20:48
23 lines
1309 bytes
On 15/01/17 15:25, Borneq wrote:
> ...lub przez max ilość prób w pętli.
> Otóż,
> Jakiej składni użyć by móc to robić w pętli dowolną liczbę razy
> ograniczoną np. przez maxTrials=10 ?
Chyba zarty sobie robisz.

bool retry;
int maxTrials = 10;

do {
   retry = false;
   try {
       // ...
   } catch(..) {	
     retry = true;
   }
} while(retry && --maxTrials);


Pozdrawiam

Marek
Re: Wznawianie zapisu do bazy po wyjątku do skutku
#308981
Author: Borneq
Date: Sun, 22 Jan 2017 10:17
6 lines
1150 bytes
W dniu 21.01.2017 o 21:48, Marek Borowski pisze:
> bool retry;
> int maxTrials = 10;

Rzeczywiście, zaraz po napisaniu postu na tą grupę zastanowiłem się i 
napisałem dokładnie taki sam kawałek kodu
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads