diff options
Diffstat (limited to 'src/shared/Database/Database.cpp')
-rw-r--r-- | src/shared/Database/Database.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/shared/Database/Database.cpp b/src/shared/Database/Database.cpp index 9bfae3479bf..572d3db6f1d 100644 --- a/src/shared/Database/Database.cpp +++ b/src/shared/Database/Database.cpp @@ -17,17 +17,22 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + #include "DatabaseEnv.h" #include "Config/ConfigEnv.h" + #include "Common.h" #include "../../game/UpdateFields.h" + #include <ctime> #include <iostream> #include <fstream> + Database::~Database() { /*Delete objects*/ } + bool Database::Initialize(const char *) { // Enable logging of SQL commands (usally only GM commands) @@ -39,37 +44,46 @@ bool Database::Initialize(const char *) if((m_logsDir.at(m_logsDir.length()-1)!='/') && (m_logsDir.at(m_logsDir.length()-1)!='\\')) m_logsDir.append("/"); } + return true; } + void Database::ThreadStart() { } + void Database::ThreadEnd() { } + void Database::escape_string(std::string& str) { if(str.empty()) return; + char* buf = new char[str.size()*2+1]; escape_string(buf,str.c_str(),str.size()); str = buf; delete[] buf; } + bool Database::PExecuteLog(const char * format,...) { if (!format) return false; + va_list ap; char szQuery [MAX_QUERY_LEN]; va_start(ap, format); int res = vsnprintf( szQuery, MAX_QUERY_LEN, format, ap ); va_end(ap); + if(res==-1) { sLog.outError("SQL Query truncated (and not execute) for format: %s",format); return false; } + if( m_logSQL ) { time_t curr; @@ -78,6 +92,7 @@ bool Database::PExecuteLog(const char * format,...) local=*(localtime(&curr)); // dereference and assign char fName[128]; sprintf( fName, "%04d-%02d-%02d_logSQL.sql", local.tm_year+1900, local.tm_mon+1, local.tm_mday ); + FILE* log_file; std::string logsDir_fname = m_logsDir+fName; log_file = fopen(logsDir_fname.c_str(), "a"); @@ -92,58 +107,74 @@ bool Database::PExecuteLog(const char * format,...) sLog.outError("SQL-Logging is disabled - Log file for the SQL commands could not be openend: %s",fName); } } + return Execute(szQuery); } + void Database::SetResultQueue(SqlResultQueue * queue) { m_queryQueues[ACE_Based::Thread::current()] = queue; + } + QueryResult* Database::PQuery(const char *format,...) { if(!format) return NULL; + va_list ap; char szQuery [MAX_QUERY_LEN]; va_start(ap, format); int res = vsnprintf( szQuery, MAX_QUERY_LEN, format, ap ); va_end(ap); + if(res==-1) { sLog.outError("SQL Query truncated (and not execute) for format: %s",format); return false; } + return Query(szQuery); } + QueryNamedResult* Database::PQueryNamed(const char *format,...) { if(!format) return NULL; + va_list ap; char szQuery [MAX_QUERY_LEN]; va_start(ap, format); int res = vsnprintf( szQuery, MAX_QUERY_LEN, format, ap ); va_end(ap); + if(res==-1) { sLog.outError("SQL Query truncated (and not execute) for format: %s",format); return false; } + return QueryNamed(szQuery); } + bool Database::PExecute(const char * format,...) { if (!format) return false; + va_list ap; char szQuery [MAX_QUERY_LEN]; va_start(ap, format); int res = vsnprintf( szQuery, MAX_QUERY_LEN, format, ap ); va_end(ap); + if(res==-1) { sLog.outError("SQL Query truncated (and not execute) for format: %s",format); return false; } + return Execute(szQuery); } + bool Database::_UpdateDataBlobValue(const uint32 guid, const uint32 field, const int32 value) { return PExecute( @@ -153,6 +184,7 @@ bool Database::_UpdateDataBlobValue(const uint32 guid, const uint32 field, const "' ',SUBSTRING_INDEX(`data`,' ',%i)) WHERE guid=%u", field, field+1, value, -int32(PLAYER_END-field), guid); } + bool Database::_SetDataBlobValue(const uint32 guid, const uint32 field, const uint32 value) { return PExecute( @@ -161,22 +193,27 @@ bool Database::_SetDataBlobValue(const uint32 guid, const uint32 field, const ui "%u,' ',SUBSTRING_INDEX(`data`,' ',%i)) WHERE guid=%u", field, value, -int32(PLAYER_END-field), guid); } + bool Database::DirectPExecute(const char * format,...) { if (!format) return false; + va_list ap; char szQuery [MAX_QUERY_LEN]; va_start(ap, format); int res = vsnprintf( szQuery, MAX_QUERY_LEN, format, ap ); va_end(ap); + if(res==-1) { sLog.outError("SQL Query truncated (and not execute) for format: %s",format); return false; } + return DirectExecute(szQuery); } + bool Database::CheckRequiredField( char const* table_name, char const* required_name ) { // check required field @@ -186,7 +223,9 @@ bool Database::CheckRequiredField( char const* table_name, char const* required_ delete result; return true; } + // check fail, prepare readabale error message + // search current required_* field in DB QueryNamedResult* result2 = PQueryNamed("SELECT * FROM %s LIMIT 1",table_name); if(result2) @@ -201,7 +240,9 @@ bool Database::CheckRequiredField( char const* table_name, char const* required_ break; } } + delete result2; + if(!reqName.empty()) sLog.outErrorDb("Table `%s` have field `%s` but expected `%s`! Not all sql updates applied?",table_name,reqName.c_str(),required_name); else @@ -209,5 +250,6 @@ bool Database::CheckRequiredField( char const* table_name, char const* required_ } else sLog.outErrorDb("Table `%s` fields list query fail but expected have `%s`! No records in `%s`?",table_name,required_name,table_name); + return false; } |