aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared/Database
diff options
context:
space:
mode:
authorMachiavelli <none@none>2010-09-11 21:10:54 +0200
committerMachiavelli <none@none>2010-09-11 21:10:54 +0200
commita41e99223e1dfe707afd0fa8004bcb6f267f0f04 (patch)
treed2d6d60ac7557547c5fdd8e5ad7da1990ec2a63c /src/server/shared/Database
parentdacf427ea3ecb2115fc4f76880cc39e072061a46 (diff)
Core/DBLayer:
* Rename QueryResult class to ResultSet * Rename QueryResult_AutoPtr to QueryResult * Declare ACE refcounted auto pointer for PreparedResultSet class --HG-- branch : trunk
Diffstat (limited to 'src/server/shared/Database')
-rw-r--r--src/server/shared/Database/DatabaseWorker.cpp4
-rw-r--r--src/server/shared/Database/DatabaseWorkerPool.h11
-rw-r--r--src/server/shared/Database/Implementation/LoginDatabase.cpp2
-rw-r--r--src/server/shared/Database/Implementation/LoginDatabase.h2
-rw-r--r--src/server/shared/Database/MySQLConnection.cpp10
-rw-r--r--src/server/shared/Database/MySQLConnection.h2
-rw-r--r--src/server/shared/Database/QueryResult.cpp34
-rwxr-xr-xsrc/server/shared/Database/QueryResult.h33
-rw-r--r--src/server/shared/Database/SQLOperation.cpp8
-rw-r--r--src/server/shared/Database/SQLOperation.h8
-rw-r--r--src/server/shared/Database/SQLStorageImpl.h2
11 files changed, 64 insertions, 52 deletions
diff --git a/src/server/shared/Database/DatabaseWorker.cpp b/src/server/shared/Database/DatabaseWorker.cpp
index 0a613a8a139..0fd7287f23a 100644
--- a/src/server/shared/Database/DatabaseWorker.cpp
+++ b/src/server/shared/Database/DatabaseWorker.cpp
@@ -20,6 +20,7 @@
#include "DatabaseWorker.h"
#include "SQLOperation.h"
#include "MySQLConnection.h"
+#include "MySQLThreading.h"
DatabaseWorker::DatabaseWorker(ACE_Activation_Queue* new_queue, MySQLConnection* con) :
m_queue(new_queue),
@@ -34,6 +35,8 @@ int DatabaseWorker::svc()
if (!m_queue)
return -1;
+ MySQL::Thread_Init();
+
SQLOperation *request = NULL;
while (1)
{
@@ -47,6 +50,7 @@ int DatabaseWorker::svc()
delete request;
}
+ MySQL::Thread_End();
delete m_conn;
return 0;
}
diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/shared/Database/DatabaseWorkerPool.h
index fb4d3093b34..4045a9bc421 100644
--- a/src/server/shared/Database/DatabaseWorkerPool.h
+++ b/src/server/shared/Database/DatabaseWorkerPool.h
@@ -29,6 +29,7 @@
#include "DatabaseWorker.h"
#include "PreparedStatement.h"
#include "Log.h"
+#include "QueryResult.h"
enum MySQLThreadBundle
{
@@ -196,15 +197,15 @@ class DatabaseWorkerPool
return DirectExecute(szQuery);
}
- QueryResult_AutoPtr Query(const char* sql)
+ QueryResult Query(const char* sql)
{
return GetConnection()->Query(sql);
}
- QueryResult_AutoPtr PQuery(const char* sql, ...)
+ QueryResult PQuery(const char* sql, ...)
{
if (!sql)
- return QueryResult_AutoPtr(NULL);
+ return QueryResult(NULL);
va_list ap;
char szQuery[MAX_QUERY_LEN];
@@ -215,7 +216,7 @@ class DatabaseWorkerPool
return Query(szQuery);
}
- ACE_Future<QueryResult_AutoPtr> AsyncQuery(const char* sql)
+ ACE_Future<QueryResult> AsyncQuery(const char* sql)
{
QueryResultFuture res;
BasicStatementTask* task = new BasicStatementTask(sql, res);
@@ -223,7 +224,7 @@ class DatabaseWorkerPool
return res; //! Actual return value has no use yet
}
- ACE_Future<QueryResult_AutoPtr> AsyncPQuery(const char* sql, ...)
+ ACE_Future<QueryResult> AsyncPQuery(const char* sql, ...)
{
va_list ap;
char szQuery[MAX_QUERY_LEN];
diff --git a/src/server/shared/Database/Implementation/LoginDatabase.cpp b/src/server/shared/Database/Implementation/LoginDatabase.cpp
index 46930436496..1f6c5ec126b 100644
--- a/src/server/shared/Database/Implementation/LoginDatabase.cpp
+++ b/src/server/shared/Database/Implementation/LoginDatabase.cpp
@@ -30,8 +30,10 @@ bool LoginDatabaseConnection::Open(const std::string& infoString)
LOAD YOUR PREPARED STATEMENTS HERE
##################################
*/
+ PrepareStatement(LOGIN_GET_REALMLIST, "SELECT id, name, address, port, icon, color, timezone, allowedSecurityLevel, population, gamebuild FROM realmlist WHERE color <> 3 ORDER BY name");
PrepareStatement(LOGIN_SET_VS, "UPDATE account SET v = ?, s = ? WHERE username = ?");
PrepareStatement(LOGIN_SET_LOGONPROOF, "UPDATE account SET sessionkey = ?, last_ip = ?, last_login = NOW(), locale = ?, failed_logins = 0 WHERE username = ?");
+ PrepareStatement(LOGIN_GET_LOGONCHALLENGE, "SELECT a.sha_pass_hash,a.id,a.locked,a.last_ip,aa.gmlevel,a.v,a.s FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.username = ?");
return true;
}
diff --git a/src/server/shared/Database/Implementation/LoginDatabase.h b/src/server/shared/Database/Implementation/LoginDatabase.h
index a3cac75b5a0..2dde12014d0 100644
--- a/src/server/shared/Database/Implementation/LoginDatabase.h
+++ b/src/server/shared/Database/Implementation/LoginDatabase.h
@@ -43,8 +43,10 @@ enum LoginDatabaseStatements
name for a suiting suffix.
*/
+ LOGIN_GET_REALMLIST,
LOGIN_SET_VS,
LOGIN_SET_LOGONPROOF,
+ LOGIN_GET_LOGONCHALLENGE,
MAX_LOGINDATABASE_STATEMENTS,
};
diff --git a/src/server/shared/Database/MySQLConnection.cpp b/src/server/shared/Database/MySQLConnection.cpp
index 47eeea3646a..51cf3ada1c8 100644
--- a/src/server/shared/Database/MySQLConnection.cpp
+++ b/src/server/shared/Database/MySQLConnection.cpp
@@ -231,10 +231,10 @@ bool MySQLConnection::Execute(PreparedStatement* stmt)
}
}
-QueryResult_AutoPtr MySQLConnection::Query(const char* sql)
+QueryResult MySQLConnection::Query(const char* sql)
{
if (!sql)
- return QueryResult_AutoPtr(NULL);
+ return QueryResult(NULL);
MYSQL_RES *result = NULL;
MYSQL_FIELD *fields = NULL;
@@ -242,13 +242,13 @@ QueryResult_AutoPtr MySQLConnection::Query(const char* sql)
uint32 fieldCount = 0;
if (!_Query(sql, &result, &fields, &rowCount, &fieldCount))
- return QueryResult_AutoPtr(NULL);
+ return QueryResult(NULL);
- QueryResult *queryResult = new QueryResult(result, fields, rowCount, fieldCount);
+ ResultSet *queryResult = new ResultSet(result, fields, rowCount, fieldCount);
queryResult->NextRow();
- return QueryResult_AutoPtr(queryResult);
+ return QueryResult(queryResult);
}
bool MySQLConnection::_Query(const char *sql, MYSQL_RES **pResult, MYSQL_FIELD **pFields, uint64* pRowCount, uint32* pFieldCount)
diff --git a/src/server/shared/Database/MySQLConnection.h b/src/server/shared/Database/MySQLConnection.h
index 5eac4a38f61..f8f8f79eb44 100644
--- a/src/server/shared/Database/MySQLConnection.h
+++ b/src/server/shared/Database/MySQLConnection.h
@@ -40,7 +40,7 @@ class MySQLConnection
public:
bool Execute(const char* sql);
bool Execute(PreparedStatement* stmt);
- QueryResult_AutoPtr Query(const char* sql);
+ QueryResult Query(const char* sql);
PreparedResultSet* Query(PreparedStatement* stmt);
bool _Query(const char *sql, MYSQL_RES **pResult, MYSQL_FIELD **pFields, uint64* pRowCount, uint32* pFieldCount);
diff --git a/src/server/shared/Database/QueryResult.cpp b/src/server/shared/Database/QueryResult.cpp
index c5a081a514e..6df3d53956a 100644
--- a/src/server/shared/Database/QueryResult.cpp
+++ b/src/server/shared/Database/QueryResult.cpp
@@ -19,8 +19,9 @@
*/
#include "DatabaseEnv.h"
+#include "Log.h"
-QueryResult::QueryResult(MYSQL_RES *result, MYSQL_FIELD *fields, uint64 rowCount, uint32 fieldCount)
+ResultSet::ResultSet(MYSQL_RES *result, MYSQL_FIELD *fields, uint64 rowCount, uint32 fieldCount)
: mFieldCount(fieldCount)
, mRowCount(rowCount)
, mResult(result)
@@ -32,12 +33,12 @@ QueryResult::QueryResult(MYSQL_RES *result, MYSQL_FIELD *fields, uint64 rowCount
mCurrentRow[i].SetType(ConvertNativeType(fields[i].type));
}
-QueryResult::~QueryResult()
+ResultSet::~ResultSet()
{
EndQuery();
}
-bool QueryResult::NextRow()
+bool ResultSet::NextRow()
{
MYSQL_ROW row;
@@ -57,7 +58,7 @@ bool QueryResult::NextRow()
return true;
}
-void QueryResult::EndQuery()
+void ResultSet::EndQuery()
{
if (mCurrentRow)
{
@@ -72,7 +73,7 @@ void QueryResult::EndQuery()
}
}
-enum Field::DataTypes QueryResult::ConvertNativeType(enum_field_types mysqlType) const
+enum Field::DataTypes ResultSet::ConvertNativeType(enum_field_types mysqlType) const
{
switch (mysqlType)
{
@@ -144,7 +145,7 @@ void ResultBind::BindResult(uint32& num_rows)
m_rBind[i].buffer_length = size;
m_rBind[i].length = &m_length[i];
m_rBind[i].is_null = &m_isNull[i];
- m_rBind[i].error = NULL;//&m_error[i];
+ m_rBind[i].error = NULL;
m_rBind[i].is_unsigned = field->flags & UNSIGNED_FLAG;
++i;
@@ -238,7 +239,22 @@ std::string PreparedResultSet::GetString(uint32 index)
if (!CheckFieldIndex(index))
return std::string("");
- const char* temp = static_cast<char const*>(rbind->m_rBind[index].buffer);
- size_t len = *rbind->m_rBind[index].length;
- return std::string(temp, len );
+ return std::string(static_cast<char const*>(rbind->m_rBind[index].buffer), *rbind->m_rBind[index].length);
+}
+
+bool PreparedResultSet::NextRow()
+{
+ if (row_position >= num_rows)
+ return false;
+
+ int retval = mysql_stmt_fetch( rbind->m_stmt );
+
+ if (!retval || retval == MYSQL_DATA_TRUNCATED)
+ retval = true;
+
+ if (retval == MYSQL_NO_DATA)
+ retval = false;
+
+ ++row_position;
+ return retval;
} \ No newline at end of file
diff --git a/src/server/shared/Database/QueryResult.h b/src/server/shared/Database/QueryResult.h
index 3640030f784..4aa08bfcb93 100755
--- a/src/server/shared/Database/QueryResult.h
+++ b/src/server/shared/Database/QueryResult.h
@@ -32,11 +32,11 @@
#endif
#include <mysql.h>
-class QueryResult
+class ResultSet
{
public:
- QueryResult(MYSQL_RES *result, MYSQL_FIELD *fields, uint64 rowCount, uint32 fieldCount);
- ~QueryResult();
+ ResultSet(MYSQL_RES *result, MYSQL_FIELD *fields, uint64 rowCount, uint32 fieldCount);
+ ~ResultSet();
bool NextRow();
@@ -59,17 +59,17 @@ class QueryResult
};
-typedef ACE_Refcounted_Auto_Ptr<QueryResult, ACE_Null_Mutex> QueryResult_AutoPtr;
+typedef ACE_Refcounted_Auto_Ptr<ResultSet, ACE_Null_Mutex> QueryResult;
typedef std::vector<std::string> QueryFieldNames;
class QueryNamedResult
{
public:
- explicit QueryNamedResult(QueryResult* query, QueryFieldNames const& names) : mQuery(query), mFieldNames(names) {}
+ explicit QueryNamedResult(ResultSet* query, QueryFieldNames const& names) : mQuery(query), mFieldNames(names) {}
~QueryNamedResult() { delete mQuery; }
- // compatible interface with QueryResult
+ // compatible interface with ResultSet
bool NextRow() { return mQuery->NextRow(); }
Field *Fetch() const { return mQuery->Fetch(); }
uint32 GetFieldCount() const { return mQuery->GetFieldCount(); }
@@ -92,7 +92,7 @@ class QueryNamedResult
}
protected:
- QueryResult *mQuery;
+ ResultSet *mQuery;
QueryFieldNames mFieldNames;
};
@@ -205,22 +205,7 @@ class PreparedResultSet
float GetFloat(uint32 index);
std::string GetString(uint32 index);
- bool NextRow()
- {
- if (row_position >= num_rows)
- return false;
-
- int retval = mysql_stmt_fetch( rbind->m_stmt );
-
- if (!retval || retval == MYSQL_DATA_TRUNCATED)
- retval = true;
-
- if (retval == MYSQL_NO_DATA)
- retval = false;
-
- ++row_position;
- return retval;
- }
+ bool NextRow();
private:
bool CheckFieldIndex(uint32 index) const
@@ -239,5 +224,7 @@ class PreparedResultSet
uint32 num_rows;
};
+typedef ACE_Refcounted_Auto_Ptr<PreparedResultSet*, ACE_Null_Mutex> PreparedQueryResult;
+
#endif
diff --git a/src/server/shared/Database/SQLOperation.cpp b/src/server/shared/Database/SQLOperation.cpp
index e67dbd47b31..4abad405599 100644
--- a/src/server/shared/Database/SQLOperation.cpp
+++ b/src/server/shared/Database/SQLOperation.cpp
@@ -70,7 +70,7 @@ bool SQLQueryHolder::SetQuery(size_t index, const char *sql)
}
/// not executed yet, just stored (it's not called a holder for nothing)
- m_queries[index] = SQLResultPair(strdup(sql), QueryResult_AutoPtr(NULL));
+ m_queries[index] = SQLResultPair(strdup(sql), QueryResult(NULL));
return true;
}
@@ -97,7 +97,7 @@ bool SQLQueryHolder::SetPQuery(size_t index, const char *format, ...)
return SetQuery(index, szQuery);
}
-QueryResult_AutoPtr SQLQueryHolder::GetResult(size_t index)
+QueryResult SQLQueryHolder::GetResult(size_t index)
{
if (index < m_queries.size())
{
@@ -111,10 +111,10 @@ QueryResult_AutoPtr SQLQueryHolder::GetResult(size_t index)
return m_queries[index].second;
}
else
- return QueryResult_AutoPtr(NULL);
+ return QueryResult(NULL);
}
-void SQLQueryHolder::SetResult(size_t index, QueryResult_AutoPtr result)
+void SQLQueryHolder::SetResult(size_t index, QueryResult result)
{
/// store the result in the holder
if (index < m_queries.size())
diff --git a/src/server/shared/Database/SQLOperation.h b/src/server/shared/Database/SQLOperation.h
index 0c5fe08d94e..976e458a4f2 100644
--- a/src/server/shared/Database/SQLOperation.h
+++ b/src/server/shared/Database/SQLOperation.h
@@ -42,7 +42,7 @@ class SQLOperation : public ACE_Method_Request
MySQLConnection* m_conn;
};
-typedef ACE_Future<QueryResult_AutoPtr> QueryResultFuture;
+typedef ACE_Future<QueryResult> QueryResultFuture;
/*! Raw, ad-hoc query. */
class BasicStatementTask : public SQLOperation
{
@@ -65,7 +65,7 @@ class SQLQueryHolder
{
friend class SQLQueryHolderTask;
private:
- typedef std::pair<const char*, QueryResult_AutoPtr> SQLResultPair;
+ typedef std::pair<const char*, QueryResult> SQLResultPair;
std::vector<SQLResultPair> m_queries;
public:
SQLQueryHolder() {}
@@ -73,8 +73,8 @@ class SQLQueryHolder
bool SetQuery(size_t index, const char *sql);
bool SetPQuery(size_t index, const char *format, ...) ATTR_PRINTF(3,4);
void SetSize(size_t size);
- QueryResult_AutoPtr GetResult(size_t index);
- void SetResult(size_t index, QueryResult_AutoPtr result);
+ QueryResult GetResult(size_t index);
+ void SetResult(size_t index, QueryResult result);
};
typedef ACE_Future<SQLQueryHolder*> QueryResultHolderFuture;
diff --git a/src/server/shared/Database/SQLStorageImpl.h b/src/server/shared/Database/SQLStorageImpl.h
index c74be48c34c..533ce7a37c3 100644
--- a/src/server/shared/Database/SQLStorageImpl.h
+++ b/src/server/shared/Database/SQLStorageImpl.h
@@ -122,7 +122,7 @@ void SQLStorageLoaderBase<T>::Load(SQLStorage &store)
{
uint32 maxi;
Field *fields;
- QueryResult_AutoPtr result = WorldDatabase.PQuery("SELECT MAX(%s) FROM %s", store.entry_field, store.table);
+ QueryResult result = WorldDatabase.PQuery("SELECT MAX(%s) FROM %s", store.entry_field, store.table);
if(!result)
{
sLog.outError("Error loading %s table (not exist?)\n", store.table);