diff options
| author | Machiavelli <none@none> | 2010-09-11 21:10:54 +0200 |
|---|---|---|
| committer | Machiavelli <none@none> | 2010-09-11 21:10:54 +0200 |
| commit | a41e99223e1dfe707afd0fa8004bcb6f267f0f04 (patch) | |
| tree | d2d6d60ac7557547c5fdd8e5ad7da1990ec2a63c /src/server/shared/Database | |
| parent | dacf427ea3ecb2115fc4f76880cc39e072061a46 (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.cpp | 4 | ||||
| -rw-r--r-- | src/server/shared/Database/DatabaseWorkerPool.h | 11 | ||||
| -rw-r--r-- | src/server/shared/Database/Implementation/LoginDatabase.cpp | 2 | ||||
| -rw-r--r-- | src/server/shared/Database/Implementation/LoginDatabase.h | 2 | ||||
| -rw-r--r-- | src/server/shared/Database/MySQLConnection.cpp | 10 | ||||
| -rw-r--r-- | src/server/shared/Database/MySQLConnection.h | 2 | ||||
| -rw-r--r-- | src/server/shared/Database/QueryResult.cpp | 34 | ||||
| -rwxr-xr-x | src/server/shared/Database/QueryResult.h | 33 | ||||
| -rw-r--r-- | src/server/shared/Database/SQLOperation.cpp | 8 | ||||
| -rw-r--r-- | src/server/shared/Database/SQLOperation.h | 8 | ||||
| -rw-r--r-- | src/server/shared/Database/SQLStorageImpl.h | 2 |
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); |
