Fixed clientprefs race condition on first run (bug 3294, r=pred).

This commit is contained in:
David Anderson 2008-10-05 01:09:58 -05:00
parent 04b7b7b9ff
commit 4e7000368f
3 changed files with 49 additions and 82 deletions

View File

@ -224,33 +224,20 @@ void ClientPrefs::DatabaseConnect()
{
driver = DRIVER_SQLITE;
TQueryOp *op = new TQueryOp(Query_CreateTable, 0);
op->SetDatabase(Database);
IPreparedQuery *pQuery = Database->PrepareQuery(
if (!Database->DoSimpleQuery(
"CREATE TABLE IF NOT EXISTS sm_cookies \
( \
id INTEGER PRIMARY KEY AUTOINCREMENT, \
name varchar(30) NOT NULL UNIQUE, \
description varchar(255), \
access INTEGER \
)",
error, sizeof(error), &errCode);
if (pQuery == NULL)
)"))
{
g_pSM->LogMessage(myself, "Failed to prepare query CreateTable sm_cookies: %s (%i)", error, errCode);
return;
g_pSM->LogMessage(myself, "Failed to CreateTable sm_cookies: %s", Database->GetError());
goto fatal_fail;
}
op->SetCustomPreparedQuery(pQuery);
dbi->AddToThreadQueue(op, PrioQueue_High);
op = new TQueryOp(Query_CreateTable, 0);
op->SetDatabase(Database);
pQuery = Database->PrepareQuery(
if (!Database->DoSimpleQuery(
"CREATE TABLE IF NOT EXISTS sm_cookie_cache \
( \
player varchar(65) NOT NULL, \
@ -258,27 +245,17 @@ void ClientPrefs::DatabaseConnect()
value varchar(100), \
timestamp int, \
PRIMARY KEY (player, cookie_id) \
)",
error, sizeof(error), &errCode);
if (pQuery == NULL)
)"))
{
g_pSM->LogMessage(myself, "Failed to prepare query CreateTable sm_cookie_cache: %s (%i)", error, errCode);
return;
g_pSM->LogMessage(myself, "Failed to CreateTable sm_cookie_cache: %s", Database->GetError());
goto fatal_fail;
}
op->SetCustomPreparedQuery(pQuery);
dbi->AddToThreadQueue(op, PrioQueue_High);
}
else if (strcmp(identifier, "mysql") == 0)
{
driver = DRIVER_MYSQL;
TQueryOp *op = new TQueryOp(Query_CreateTable, 0);
op->SetDatabase(Database);
IPreparedQuery *pQuery = Database->PrepareQuery(
if (!Database->DoSimpleQuery(
"CREATE TABLE IF NOT EXISTS sm_cookies \
( \
id INTEGER unsigned NOT NULL auto_increment, \
@ -286,23 +263,13 @@ void ClientPrefs::DatabaseConnect()
description varchar(255), \
access INTEGER, \
PRIMARY KEY (id) \
)",
error, sizeof(error), &errCode);
if (pQuery == NULL)
)"))
{
g_pSM->LogMessage(myself, "Failed to prepare query CreateTable sm_cookies: %s (%i)", error, errCode);
return;
g_pSM->LogMessage(myself, "Failed to CreateTable sm_cookies: %s", Database->GetError());
goto fatal_fail;
}
op->SetCustomPreparedQuery(pQuery);
dbi->AddToThreadQueue(op, PrioQueue_High);
op = new TQueryOp(Query_CreateTable, 0);
op->SetDatabase(Database);
pQuery = Database->PrepareQuery(
if (!Database->DoSimpleQuery(
"CREATE TABLE IF NOT EXISTS sm_cookie_cache \
( \
player varchar(65) NOT NULL, \
@ -310,27 +277,16 @@ void ClientPrefs::DatabaseConnect()
value varchar(100), \
timestamp int NOT NULL, \
PRIMARY KEY (player, cookie_id) \
)",
error, sizeof(error), &errCode);
if (pQuery == NULL)
)"))
{
g_pSM->LogMessage(myself, "Failed to prepare query CreateTable sm_cookie_cache: %s (%i)", error, errCode);
return;
g_pSM->LogMessage(myself, "Failed to CreateTable sm_cookie_cache: %s", Database->GetError());
goto fatal_fail;
}
op->SetCustomPreparedQuery(pQuery);
dbi->AddToThreadQueue(op, PrioQueue_High);
}
else
{
g_pSM->LogError(myself, "Unsupported driver \"%s\"", identifier);
Database->Close();
Database = NULL;
databaseLoading = false;
ProcessQueryCache();
return;
goto fatal_fail;
}
if (driver == DRIVER_MYSQL)
@ -343,7 +299,7 @@ void ClientPrefs::DatabaseConnect()
if (InsertCookieQuery == NULL)
{
g_pSM->LogMessage(myself, "Failed to prepare query InsertCookie: %s (%i)", error, errCode);
return;
goto fatal_fail;
}
InsertDataQuery = Database->PrepareQuery(
@ -355,7 +311,7 @@ void ClientPrefs::DatabaseConnect()
if (InsertDataQuery == NULL)
{
g_pSM->LogMessage(myself, "Failed to prepare query InsertData: %s (%i)", error, errCode);
return;
goto fatal_fail;
}
}
else
@ -368,7 +324,7 @@ void ClientPrefs::DatabaseConnect()
if (InsertCookieQuery == NULL)
{
g_pSM->LogMessage(myself, "Failed to prepare query InsertCookie: %s (%i)", error, errCode);
return;
goto fatal_fail;
}
InsertDataQuery = Database->PrepareQuery(
@ -379,7 +335,7 @@ void ClientPrefs::DatabaseConnect()
if (InsertDataQuery == NULL)
{
g_pSM->LogMessage(myself, "Failed to prepare query InsertData: %s (%i)", error, errCode);
return;
goto fatal_fail;
}
}
@ -394,7 +350,7 @@ void ClientPrefs::DatabaseConnect()
if (SelectDataQuery == NULL)
{
g_pSM->LogMessage(myself, "Failed to prepare query SelectData: %s (%i)", error, errCode);
return;
goto fatal_fail;
}
SelectIdQuery = Database->PrepareQuery(
@ -406,15 +362,40 @@ void ClientPrefs::DatabaseConnect()
if (SelectIdQuery == NULL)
{
g_pSM->LogMessage(myself, "Failed to prepare query SelectId: %s (%i)", error, errCode);
return;
goto fatal_fail;
}
databaseLoading = false;
cell_t result = 0;
ProcessQueryCache();
return;
fatal_fail:
if (SelectIdQuery != NULL)
{
SelectIdQuery->Destroy();
SelectIdQuery = NULL;
}
if (SelectDataQuery != NULL)
{
SelectDataQuery->Destroy();
SelectDataQuery = NULL;
}
if (InsertCookieQuery != NULL)
{
InsertCookieQuery->Destroy();
InsertCookieQuery = NULL;
}
if (InsertDataQuery != NULL)
{
InsertDataQuery->Destroy();
InsertDataQuery = NULL;
}
Database->Close();
Database = NULL;
databaseLoading = false;
ProcessQueryCache();
}
bool ClientPrefs::AddQueryToQueue( TQueryOp *query )

View File

@ -63,13 +63,6 @@ void TQueryOp::RunThinkPart()
break;
}
case Query_CreateTable:
{
m_pQuery->Destroy();
m_pQuery = NULL;
break;
}
default:
{
break;
@ -241,11 +234,6 @@ void TQueryOp::SetPreparedQuery()
}
}
void TQueryOp::SetCustomPreparedQuery(IPreparedQuery *query)
{
m_pQuery = query;
}
ParamData::~ParamData()
{
if (cookie)

View File

@ -42,7 +42,6 @@ enum querytype
Query_SelectData,
Query_InsertData,
Query_SelectId,
Query_CreateTable,
Query_Connect,
};
@ -79,7 +78,6 @@ public:
void SetDatabase(IDatabase *db);
void SetPreparedQuery();
void SetCustomPreparedQuery(IPreparedQuery *wrapper);
void Destroy();