diff options
Diffstat (limited to 'src/shared/Database')
-rw-r--r-- | src/shared/Database/DBCStore.h | 6 | ||||
-rw-r--r-- | src/shared/Database/Database.cpp | 11 | ||||
-rw-r--r-- | src/shared/Database/Database.h | 36 | ||||
-rw-r--r-- | src/shared/Database/DatabaseImpl.h | 48 | ||||
-rw-r--r-- | src/shared/Database/DatabaseMysql.cpp | 6 | ||||
-rw-r--r-- | src/shared/Database/DatabaseMysql.h | 2 | ||||
-rw-r--r-- | src/shared/Database/DatabasePostgre.cpp | 8 | ||||
-rw-r--r-- | src/shared/Database/DatabasePostgre.h | 2 | ||||
-rw-r--r-- | src/shared/Database/QueryResult.h | 7 | ||||
-rw-r--r-- | src/shared/Database/SQLStorageImpl.h | 7 | ||||
-rw-r--r-- | src/shared/Database/SqlOperations.cpp | 12 | ||||
-rw-r--r-- | src/shared/Database/SqlOperations.h | 7 |
12 files changed, 72 insertions, 80 deletions
diff --git a/src/shared/Database/DBCStore.h b/src/shared/Database/DBCStore.h index ea4ce109e27..4344b6e6450 100644 --- a/src/shared/Database/DBCStore.h +++ b/src/shared/Database/DBCStore.h @@ -83,7 +83,7 @@ class DBCStorage uint32 sqlRecordCount = 0; uint32 sqlHighestIndex = 0; Field *fields = NULL; - QueryResult *result = NULL; + QueryResult_AutoPtr result = QueryResult_AutoPtr(NULL); // Load data from sql if (sql) { @@ -188,7 +188,6 @@ class DBCStorage break; case FT_STRING: sLog.outError("Unsupported data type in table '%s' at char %d", sql->sqlTableName.c_str(), columnNumber); - delete result; return false; case FT_SORT: break; @@ -201,14 +200,12 @@ class DBCStorage else { sLog.outError("Incorrect sql format string '%s' at char %d", sql->sqlTableName.c_str(), columnNumber); - delete result; return false; } } if (sqlColumnNumber != (result->GetFieldCount()-1)) { sLog.outError("SQL and DBC format strings are not matching for table: '%s'", sql->sqlTableName.c_str()); - delete result; return false; } @@ -216,7 +213,6 @@ class DBCStorage ++rowIndex; }while (result->NextRow()); } - delete result; } // error in dbc file at loading if NULL diff --git a/src/shared/Database/Database.cpp b/src/shared/Database/Database.cpp index ac2cdfa4163..da214e71650 100644 --- a/src/shared/Database/Database.cpp +++ b/src/shared/Database/Database.cpp @@ -117,9 +117,9 @@ void Database::SetResultQueue(SqlResultQueue * queue) } -QueryResult* Database::PQuery(const char *format,...) +QueryResult_AutoPtr Database::PQuery(const char *format,...) { - if(!format) return NULL; + if(!format) return QueryResult_AutoPtr(NULL); va_list ap; char szQuery [MAX_QUERY_LEN]; @@ -130,7 +130,7 @@ QueryResult* Database::PQuery(const char *format,...) if(res==-1) { sLog.outError("SQL Query truncated (and not execute) for format: %s",format); - return false; + return QueryResult_AutoPtr(NULL); } return Query(szQuery); @@ -217,12 +217,9 @@ bool Database::DirectPExecute(const char * format,...) bool Database::CheckRequiredField( char const* table_name, char const* required_name ) { // check required field - QueryResult* result = PQuery("SELECT %s FROM %s LIMIT 1",required_name,table_name); + QueryResult_AutoPtr result = PQuery("SELECT %s FROM %s LIMIT 1",required_name,table_name); if(result) - { - delete result; return true; - } // check fail, prepare readabale error message diff --git a/src/shared/Database/Database.h b/src/shared/Database/Database.h index 804501cd7f9..e1b44c99057 100644 --- a/src/shared/Database/Database.h +++ b/src/shared/Database/Database.h @@ -52,8 +52,8 @@ class TRINITY_DLL_SPEC Database virtual void InitDelayThread() = 0; virtual void HaltDelayThread() = 0; - virtual QueryResult* Query(const char *sql) = 0; - QueryResult* PQuery(const char *format,...) ATTR_PRINTF(2,3); + virtual QueryResult_AutoPtr Query(const char *sql) = 0; + QueryResult_AutoPtr PQuery(const char *format,...) ATTR_PRINTF(2,3); virtual QueryNamedResult* QueryNamed(const char *sql) = 0; QueryNamedResult* PQueryNamed(const char *format,...) ATTR_PRINTF(2,3); @@ -61,41 +61,41 @@ class TRINITY_DLL_SPEC Database // Query / member template<class Class> - bool AsyncQuery(Class *object, void (Class::*method)(QueryResult*), const char *sql); + bool AsyncQuery(Class *object, void (Class::*method)(QueryResult_AutoPtr), const char *sql); template<class Class, typename ParamType1> - bool AsyncQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1), ParamType1 param1, const char *sql); + bool AsyncQuery(Class *object, void (Class::*method)(QueryResult_AutoPtr, ParamType1), ParamType1 param1, const char *sql); template<class Class, typename ParamType1, typename ParamType2> - bool AsyncQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *sql); + bool AsyncQuery(Class *object, void (Class::*method)(QueryResult_AutoPtr, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *sql); template<class Class, typename ParamType1, typename ParamType2, typename ParamType3> - bool AsyncQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *sql); + bool AsyncQuery(Class *object, void (Class::*method)(QueryResult_AutoPtr, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *sql); // Query / static template<typename ParamType1> - bool AsyncQuery(void (*method)(QueryResult*, ParamType1), ParamType1 param1, const char *sql); + bool AsyncQuery(void (*method)(QueryResult_AutoPtr, ParamType1), ParamType1 param1, const char *sql); template<typename ParamType1, typename ParamType2> - bool AsyncQuery(void (*method)(QueryResult*, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *sql); + bool AsyncQuery(void (*method)(QueryResult_AutoPtr, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *sql); template<typename ParamType1, typename ParamType2, typename ParamType3> - bool AsyncQuery(void (*method)(QueryResult*, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *sql); + bool AsyncQuery(void (*method)(QueryResult_AutoPtr, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *sql); // PQuery / member template<class Class> - bool AsyncPQuery(Class *object, void (Class::*method)(QueryResult*), const char *format,...) ATTR_PRINTF(4,5); + bool AsyncPQuery(Class *object, void (Class::*method)(QueryResult_AutoPtr), const char *format,...) ATTR_PRINTF(4,5); template<class Class, typename ParamType1> - bool AsyncPQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1), ParamType1 param1, const char *format,...) ATTR_PRINTF(5,6); + bool AsyncPQuery(Class *object, void (Class::*method)(QueryResult_AutoPtr, ParamType1), ParamType1 param1, const char *format,...) ATTR_PRINTF(5,6); template<class Class, typename ParamType1, typename ParamType2> - bool AsyncPQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *format,...) ATTR_PRINTF(6,7); + bool AsyncPQuery(Class *object, void (Class::*method)(QueryResult_AutoPtr, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *format,...) ATTR_PRINTF(6,7); template<class Class, typename ParamType1, typename ParamType2, typename ParamType3> - bool AsyncPQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *format,...) ATTR_PRINTF(7,8); + bool AsyncPQuery(Class *object, void (Class::*method)(QueryResult_AutoPtr, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *format,...) ATTR_PRINTF(7,8); // PQuery / static template<typename ParamType1> - bool AsyncPQuery(void (*method)(QueryResult*, ParamType1), ParamType1 param1, const char *format,...) ATTR_PRINTF(4,5); + bool AsyncPQuery(void (*method)(QueryResult_AutoPtr, ParamType1), ParamType1 param1, const char *format,...) ATTR_PRINTF(4,5); template<typename ParamType1, typename ParamType2> - bool AsyncPQuery(void (*method)(QueryResult*, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *format,...) ATTR_PRINTF(5,6); + bool AsyncPQuery(void (*method)(QueryResult_AutoPtr, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *format,...) ATTR_PRINTF(5,6); template<typename ParamType1, typename ParamType2, typename ParamType3> - bool AsyncPQuery(void (*method)(QueryResult*, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *format,...) ATTR_PRINTF(6,7); + bool AsyncPQuery(void (*method)(QueryResult_AutoPtr, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *format,...) ATTR_PRINTF(6,7); template<class Class> // QueryHolder - bool DelayQueryHolder(Class *object, void (Class::*method)(QueryResult*, SqlQueryHolder*), SqlQueryHolder *holder); + bool DelayQueryHolder(Class *object, void (Class::*method)(QueryResult_AutoPtr, SqlQueryHolder*), SqlQueryHolder *holder); template<class Class, typename ParamType1> - bool DelayQueryHolder(Class *object, void (Class::*method)(QueryResult*, SqlQueryHolder*, ParamType1), SqlQueryHolder *holder, ParamType1 param1); + bool DelayQueryHolder(Class *object, void (Class::*method)(QueryResult_AutoPtr, SqlQueryHolder*, ParamType1), SqlQueryHolder *holder, ParamType1 param1); virtual bool Execute(const char *sql) = 0; bool PExecute(const char *format,...) ATTR_PRINTF(2,3); diff --git a/src/shared/Database/DatabaseImpl.h b/src/shared/Database/DatabaseImpl.h index 01ee52065fa..d77b16c8ea6 100644 --- a/src/shared/Database/DatabaseImpl.h +++ b/src/shared/Database/DatabaseImpl.h @@ -68,7 +68,7 @@ template<class Class> bool -Database::AsyncQuery(Class *object, void (Class::*method)(QueryResult*), const char *sql) +Database::AsyncQuery(Class *object, void (Class::*method)(QueryResult_AutoPtr), const char *sql) { ASYNC_QUERY_BODY(sql, itr) return m_threadBody->Delay(new SqlQuery(sql, new Trinity::QueryCallback<Class>(object, method), itr->second)); @@ -76,59 +76,59 @@ Database::AsyncQuery(Class *object, void (Class::*method)(QueryResult*), const c template<class Class, typename ParamType1> bool -Database::AsyncQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1), ParamType1 param1, const char *sql) +Database::AsyncQuery(Class *object, void (Class::*method)(QueryResult_AutoPtr, ParamType1), ParamType1 param1, const char *sql) { ASYNC_QUERY_BODY(sql, itr) - return m_threadBody->Delay(new SqlQuery(sql, new Trinity::QueryCallback<Class, ParamType1>(object, method, (QueryResult*)NULL, param1), itr->second)); + return m_threadBody->Delay(new SqlQuery(sql, new Trinity::QueryCallback<Class, ParamType1>(object, method, (QueryResult_AutoPtr)NULL, param1), itr->second)); } template<class Class, typename ParamType1, typename ParamType2> bool -Database::AsyncQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *sql) +Database::AsyncQuery(Class *object, void (Class::*method)(QueryResult_AutoPtr, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *sql) { ASYNC_QUERY_BODY(sql, itr) - return m_threadBody->Delay(new SqlQuery(sql, new Trinity::QueryCallback<Class, ParamType1, ParamType2>(object, method, (QueryResult*)NULL, param1, param2), itr->second)); + return m_threadBody->Delay(new SqlQuery(sql, new Trinity::QueryCallback<Class, ParamType1, ParamType2>(object, method, (QueryResult_AutoPtr)NULL, param1, param2), itr->second)); } template<class Class, typename ParamType1, typename ParamType2, typename ParamType3> bool -Database::AsyncQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *sql) +Database::AsyncQuery(Class *object, void (Class::*method)(QueryResult_AutoPtr, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *sql) { ASYNC_QUERY_BODY(sql, itr) - return m_threadBody->Delay(new SqlQuery(sql, new Trinity::QueryCallback<Class, ParamType1, ParamType2, ParamType3>(object, method, (QueryResult*)NULL, param1, param2, param3), itr->second)); + return m_threadBody->Delay(new SqlQuery(sql, new Trinity::QueryCallback<Class, ParamType1, ParamType2, ParamType3>(object, method, (QueryResult_AutoPtr)NULL, param1, param2, param3), itr->second)); } // -- Query / static -- template<typename ParamType1> bool -Database::AsyncQuery(void (*method)(QueryResult*, ParamType1), ParamType1 param1, const char *sql) +Database::AsyncQuery(void (*method)(QueryResult_AutoPtr, ParamType1), ParamType1 param1, const char *sql) { ASYNC_QUERY_BODY(sql, itr) - return m_threadBody->Delay(new SqlQuery(sql, new Trinity::SQueryCallback<ParamType1>(method, (QueryResult*)NULL, param1), itr->second)); + return m_threadBody->Delay(new SqlQuery(sql, new Trinity::SQueryCallback<ParamType1>(method, (QueryResult_AutoPtr)NULL, param1), itr->second)); } template<typename ParamType1, typename ParamType2> bool -Database::AsyncQuery(void (*method)(QueryResult*, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *sql) +Database::AsyncQuery(void (*method)(QueryResult_AutoPtr, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *sql) { ASYNC_QUERY_BODY(sql, itr) - return m_threadBody->Delay(new SqlQuery(sql, new Trinity::SQueryCallback<ParamType1, ParamType2>(method, (QueryResult*)NULL, param1, param2), itr->second)); + return m_threadBody->Delay(new SqlQuery(sql, new Trinity::SQueryCallback<ParamType1, ParamType2>(method, (QueryResult_AutoPtr)NULL, param1, param2), itr->second)); } template<typename ParamType1, typename ParamType2, typename ParamType3> bool -Database::AsyncQuery(void (*method)(QueryResult*, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *sql) +Database::AsyncQuery(void (*method)(QueryResult_AutoPtr, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *sql) { ASYNC_QUERY_BODY(sql, itr) - return m_threadBody->Delay(new SqlQuery(sql, new Trinity::SQueryCallback<ParamType1, ParamType2, ParamType3>(method, (QueryResult*)NULL, param1, param2, param3), itr->second)); + return m_threadBody->Delay(new SqlQuery(sql, new Trinity::SQueryCallback<ParamType1, ParamType2, ParamType3>(method, (QueryResult_AutoPtr)NULL, param1, param2, param3), itr->second)); } // -- PQuery / member -- template<class Class> bool -Database::AsyncPQuery(Class *object, void (Class::*method)(QueryResult*), const char *format,...) +Database::AsyncPQuery(Class *object, void (Class::*method)(QueryResult_AutoPtr), const char *format,...) { ASYNC_PQUERY_BODY(format, szQuery) return AsyncQuery(object, method, szQuery); @@ -136,7 +136,7 @@ Database::AsyncPQuery(Class *object, void (Class::*method)(QueryResult*), const template<class Class, typename ParamType1> bool -Database::AsyncPQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1), ParamType1 param1, const char *format,...) +Database::AsyncPQuery(Class *object, void (Class::*method)(QueryResult_AutoPtr, ParamType1), ParamType1 param1, const char *format,...) { ASYNC_PQUERY_BODY(format, szQuery) return AsyncQuery(object, method, param1, szQuery); @@ -144,7 +144,7 @@ Database::AsyncPQuery(Class *object, void (Class::*method)(QueryResult*, ParamTy template<class Class, typename ParamType1, typename ParamType2> bool -Database::AsyncPQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *format,...) +Database::AsyncPQuery(Class *object, void (Class::*method)(QueryResult_AutoPtr, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *format,...) { ASYNC_PQUERY_BODY(format, szQuery) return AsyncQuery(object, method, param1, param2, szQuery); @@ -152,7 +152,7 @@ Database::AsyncPQuery(Class *object, void (Class::*method)(QueryResult*, ParamTy template<class Class, typename ParamType1, typename ParamType2, typename ParamType3> bool -Database::AsyncPQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *format,...) +Database::AsyncPQuery(Class *object, void (Class::*method)(QueryResult_AutoPtr, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *format,...) { ASYNC_PQUERY_BODY(format, szQuery) return AsyncQuery(object, method, param1, param2, param3, szQuery); @@ -162,7 +162,7 @@ Database::AsyncPQuery(Class *object, void (Class::*method)(QueryResult*, ParamTy template<typename ParamType1> bool -Database::AsyncPQuery(void (*method)(QueryResult*, ParamType1), ParamType1 param1, const char *format,...) +Database::AsyncPQuery(void (*method)(QueryResult_AutoPtr, ParamType1), ParamType1 param1, const char *format,...) { ASYNC_PQUERY_BODY(format, szQuery) return AsyncQuery(method, param1, szQuery); @@ -170,7 +170,7 @@ Database::AsyncPQuery(void (*method)(QueryResult*, ParamType1), ParamType1 param template<typename ParamType1, typename ParamType2> bool -Database::AsyncPQuery(void (*method)(QueryResult*, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *format,...) +Database::AsyncPQuery(void (*method)(QueryResult_AutoPtr, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *format,...) { ASYNC_PQUERY_BODY(format, szQuery) return AsyncQuery(method, param1, param2, szQuery); @@ -178,7 +178,7 @@ Database::AsyncPQuery(void (*method)(QueryResult*, ParamType1, ParamType2), Para template<typename ParamType1, typename ParamType2, typename ParamType3> bool -Database::AsyncPQuery(void (*method)(QueryResult*, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *format,...) +Database::AsyncPQuery(void (*method)(QueryResult_AutoPtr, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *format,...) { ASYNC_PQUERY_BODY(format, szQuery) return AsyncQuery(method, param1, param2, param3, szQuery); @@ -188,18 +188,18 @@ Database::AsyncPQuery(void (*method)(QueryResult*, ParamType1, ParamType2, Param template<class Class> bool -Database::DelayQueryHolder(Class *object, void (Class::*method)(QueryResult*, SqlQueryHolder*), SqlQueryHolder *holder) +Database::DelayQueryHolder(Class *object, void (Class::*method)(QueryResult_AutoPtr, SqlQueryHolder*), SqlQueryHolder *holder) { ASYNC_DELAYHOLDER_BODY(holder, itr) - return holder->Execute(new Trinity::QueryCallback<Class, SqlQueryHolder*>(object, method, (QueryResult*)NULL, holder), m_threadBody, itr->second); + return holder->Execute(new Trinity::QueryCallback<Class, SqlQueryHolder*>(object, method, (QueryResult_AutoPtr)NULL, holder), m_threadBody, itr->second); } template<class Class, typename ParamType1> bool -Database::DelayQueryHolder(Class *object, void (Class::*method)(QueryResult*, SqlQueryHolder*, ParamType1), SqlQueryHolder *holder, ParamType1 param1) +Database::DelayQueryHolder(Class *object, void (Class::*method)(QueryResult_AutoPtr, SqlQueryHolder*, ParamType1), SqlQueryHolder *holder, ParamType1 param1) { ASYNC_DELAYHOLDER_BODY(holder, itr) - return holder->Execute(new Trinity::QueryCallback<Class, SqlQueryHolder*, ParamType1>(object, method, (QueryResult*)NULL, holder, param1), m_threadBody, itr->second); + return holder->Execute(new Trinity::QueryCallback<Class, SqlQueryHolder*, ParamType1>(object, method, (QueryResult_AutoPtr)NULL, holder, param1), m_threadBody, itr->second); } #undef ASYNC_QUERY_BODY diff --git a/src/shared/Database/DatabaseMysql.cpp b/src/shared/Database/DatabaseMysql.cpp index 6412ed9312f..cc94ca3540d 100644 --- a/src/shared/Database/DatabaseMysql.cpp +++ b/src/shared/Database/DatabaseMysql.cpp @@ -235,7 +235,7 @@ bool DatabaseMysql::_Query(const char *sql, MYSQL_RES **pResult, MYSQL_FIELD **p return true; } -QueryResult* DatabaseMysql::Query(const char *sql) +QueryResult_AutoPtr DatabaseMysql::Query(const char *sql) { MYSQL_RES *result = NULL; MYSQL_FIELD *fields = NULL; @@ -243,13 +243,13 @@ QueryResult* DatabaseMysql::Query(const char *sql) uint32 fieldCount = 0; if(!_Query(sql,&result,&fields,&rowCount,&fieldCount)) - return NULL; + return QueryResult_AutoPtr(NULL); QueryResultMysql *queryResult = new QueryResultMysql(result, fields, rowCount, fieldCount); queryResult->NextRow(); - return queryResult; + return QueryResult_AutoPtr(queryResult); } QueryNamedResult* DatabaseMysql::QueryNamed(const char *sql) diff --git a/src/shared/Database/DatabaseMysql.h b/src/shared/Database/DatabaseMysql.h index d4e440f96f6..4f7ab2b88b7 100644 --- a/src/shared/Database/DatabaseMysql.h +++ b/src/shared/Database/DatabaseMysql.h @@ -49,7 +49,7 @@ class TRINITY_DLL_SPEC DatabaseMysql : public Database bool Initialize(const char *infoString); void InitDelayThread(); void HaltDelayThread(); - QueryResult* Query(const char *sql); + QueryResult_AutoPtr Query(const char *sql); QueryNamedResult* QueryNamed(const char *sql); bool Execute(const char *sql); bool DirectExecute(const char* sql); diff --git a/src/shared/Database/DatabasePostgre.cpp b/src/shared/Database/DatabasePostgre.cpp index 983932dc03d..a1283538b20 100644 --- a/src/shared/Database/DatabasePostgre.cpp +++ b/src/shared/Database/DatabasePostgre.cpp @@ -158,22 +158,22 @@ bool DatabasePostgre::_Query(const char *sql, PGresult** pResult, uint64* pRowCo return true; } -QueryResult* DatabasePostgre::Query(const char *sql) +QueryResult_AutoPtr DatabasePostgre::Query(const char *sql) { if (!mPGconn) - return 0; + return QueryResult_AutoPtr(NULL); PGresult* result = NULL; uint64 rowCount = 0; uint32 fieldCount = 0; if(!_Query(sql,&result,&rowCount,&fieldCount)) - return NULL; + return QueryResult_AutoPtr(NULL); QueryResultPostgre * queryResult = new QueryResultPostgre(result, rowCount, fieldCount); queryResult->NextRow(); - return queryResult; + return QueryResult_AutoPtr(queryResult); } QueryNamedResult* DatabasePostgre::QueryNamed(const char *sql) diff --git a/src/shared/Database/DatabasePostgre.h b/src/shared/Database/DatabasePostgre.h index fcd420ef8e4..cd93f416bfe 100644 --- a/src/shared/Database/DatabasePostgre.h +++ b/src/shared/Database/DatabasePostgre.h @@ -45,7 +45,7 @@ class DatabasePostgre : public Database bool Initialize(const char *infoString); void InitDelayThread(); void HaltDelayThread(); - QueryResult* Query(const char *sql); + QueryResult_AutoPtr Query(const char *sql); QueryNamedResult* QueryNamed(const char *sql); bool Execute(const char *sql); bool DirectExecute(const char* sql); diff --git a/src/shared/Database/QueryResult.h b/src/shared/Database/QueryResult.h index a0c77752300..f9488f5a030 100644 --- a/src/shared/Database/QueryResult.h +++ b/src/shared/Database/QueryResult.h @@ -21,6 +21,11 @@ #if !defined(QUERYRESULT_H) #define QUERYRESULT_H +#include <ace/Refcounted_Auto_Ptr.h> +#include <ace/Null_Mutex.h> + +#include "Field.h" + class TRINITY_DLL_SPEC QueryResult { public: @@ -44,6 +49,8 @@ class TRINITY_DLL_SPEC QueryResult uint64 mRowCount; }; +typedef ACE_Refcounted_Auto_Ptr<QueryResult, ACE_Null_Mutex> QueryResult_AutoPtr; + typedef std::vector<std::string> QueryFieldNames; class TRINITY_DLL_SPEC QueryNamedResult diff --git a/src/shared/Database/SQLStorageImpl.h b/src/shared/Database/SQLStorageImpl.h index 5ad8a66679a..c74be48c34c 100644 --- a/src/shared/Database/SQLStorageImpl.h +++ b/src/shared/Database/SQLStorageImpl.h @@ -122,7 +122,7 @@ void SQLStorageLoaderBase<T>::Load(SQLStorage &store) { uint32 maxi; Field *fields; - QueryResult *result = WorldDatabase.PQuery("SELECT MAX(%s) FROM %s", store.entry_field, store.table); + QueryResult_AutoPtr 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); @@ -130,14 +130,12 @@ void SQLStorageLoaderBase<T>::Load(SQLStorage &store) } maxi = (*result)[0].GetUInt32()+1; - delete result; result = WorldDatabase.PQuery("SELECT COUNT(*) FROM %s", store.table); if(result) { fields = result->Fetch(); store.RecordCount = fields[0].GetUInt32(); - delete result; } else store.RecordCount = 0; @@ -158,7 +156,6 @@ void SQLStorageLoaderBase<T>::Load(SQLStorage &store) { store.RecordCount = 0; sLog.outError("Error in %s table, probably sql file format was updated (there should be %d fields in sql).\n", store.table, store.iNumFields); - delete result; exit(1); // Stop server at loading broken or non-compatible table. } @@ -206,8 +203,6 @@ void SQLStorageLoaderBase<T>::Load(SQLStorage &store) ++count; }while( result->NextRow() ); - delete result; - store.pIndex = newIndex; store.MaxEntry = maxi; store.data = _data; diff --git a/src/shared/Database/SqlOperations.cpp b/src/shared/Database/SqlOperations.cpp index 1012c94cbdd..793fabecde7 100644 --- a/src/shared/Database/SqlOperations.cpp +++ b/src/shared/Database/SqlOperations.cpp @@ -109,7 +109,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), NULL); + m_queries[index] = SqlResultPair(strdup(sql), QueryResult_AutoPtr(NULL)); return true; } @@ -136,7 +136,7 @@ bool SqlQueryHolder::SetPQuery(size_t index, const char *format, ...) return SetQuery(index,szQuery); } -QueryResult* SqlQueryHolder::GetResult(size_t index) +QueryResult_AutoPtr SqlQueryHolder::GetResult(size_t index) { if(index < m_queries.size()) { @@ -150,10 +150,10 @@ QueryResult* SqlQueryHolder::GetResult(size_t index) return m_queries[index].second; } else - return NULL; + return QueryResult_AutoPtr(NULL); } -void SqlQueryHolder::SetResult(size_t index, QueryResult *result) +void SqlQueryHolder::SetResult(size_t index, QueryResult_AutoPtr result) { /// store the result in the holder if(index < m_queries.size()) @@ -167,11 +167,7 @@ SqlQueryHolder::~SqlQueryHolder() /// if the result was never used, free the resources /// results used already (getresult called) are expected to be deleted if(m_queries[i].first != NULL) - { free((void*)(const_cast<char*>(m_queries[i].first))); - if(m_queries[i].second) - delete m_queries[i].second; - } } } diff --git a/src/shared/Database/SqlOperations.h b/src/shared/Database/SqlOperations.h index acaffb29c70..18641c743e1 100644 --- a/src/shared/Database/SqlOperations.h +++ b/src/shared/Database/SqlOperations.h @@ -27,6 +27,7 @@ #include "LockedQueue.h" #include <queue> #include "Utilities/Callback.h" +#include "QueryResult.h" /// ---- BASE --- @@ -95,7 +96,7 @@ class SqlQueryHolder { friend class SqlQueryHolderEx; private: - typedef std::pair<const char*, QueryResult*> SqlResultPair; + typedef std::pair<const char*, QueryResult_AutoPtr> SqlResultPair; std::vector<SqlResultPair> m_queries; public: SqlQueryHolder() {} @@ -103,8 +104,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* GetResult(size_t index); - void SetResult(size_t index, QueryResult *result); + QueryResult_AutoPtr GetResult(size_t index); + void SetResult(size_t index, QueryResult_AutoPtr result); bool Execute(Trinity::IQueryCallback * callback, SqlDelayThread *thread, SqlResultQueue *queue); }; |