From f7415df6e39ce781d3974efa249737bea8818ccc Mon Sep 17 00:00:00 2001 From: "False.Genesis" Date: Fri, 2 Feb 2007 23:08:28 +0000 Subject: [PATCH] * object classes update * first touch with update packets! * added some code coloring --- src/Client/DefScript/DefScript.cpp | 1 + src/Client/DefScript/DefScript.h | 1 + src/Client/DefScriptInterface.cpp | 21 +- src/Client/Realm/RealmSocket.cpp | 2 +- src/Client/World/UpdateData.cpp | 55 +++ src/Client/World/UpdateData.h | 18 + src/Client/World/WorldSession.cpp | 28 +- src/Client/World/WorldSession.h | 10 +- src/Client/World/WorldSocket.cpp | 2 +- src/Client/log.cpp | 166 ++++++++ src/Client/log.h | 27 ++ src/PseuWoW.vcproj | 6 + src/shared.vcproj | 6 + src/shared/ZCompressor.cpp | 122 ++++++ src/shared/ZCompressor.h | 34 ++ src/shared/sqlitewrapped/Database.cpp | 344 ---------------- src/shared/sqlitewrapped/Database.h | 154 -------- src/shared/sqlitewrapped/IError.h | 53 --- src/shared/sqlitewrapped/Query.cpp | 524 ------------------------- src/shared/sqlitewrapped/Query.h | 165 -------- src/shared/sqlitewrapped/StderrLog.cpp | 71 ---- src/shared/sqlitewrapped/StderrLog.h | 48 --- src/shared/sqlitewrapped/SysLog.cpp | 71 ---- src/shared/sqlitewrapped/SysLog.h | 55 --- 24 files changed, 470 insertions(+), 1514 deletions(-) create mode 100644 src/Client/World/UpdateData.cpp create mode 100644 src/Client/World/UpdateData.h create mode 100644 src/shared/ZCompressor.cpp create mode 100644 src/shared/ZCompressor.h delete mode 100644 src/shared/sqlitewrapped/Database.cpp delete mode 100644 src/shared/sqlitewrapped/Database.h delete mode 100644 src/shared/sqlitewrapped/IError.h delete mode 100644 src/shared/sqlitewrapped/Query.cpp delete mode 100644 src/shared/sqlitewrapped/Query.h delete mode 100644 src/shared/sqlitewrapped/StderrLog.cpp delete mode 100644 src/shared/sqlitewrapped/StderrLog.h delete mode 100644 src/shared/sqlitewrapped/SysLog.cpp delete mode 100644 src/shared/sqlitewrapped/SysLog.h diff --git a/src/Client/DefScript/DefScript.cpp b/src/Client/DefScript/DefScript.cpp index 0b96998..a02efd3 100644 --- a/src/Client/DefScript/DefScript.cpp +++ b/src/Client/DefScript/DefScript.cpp @@ -72,6 +72,7 @@ DefScriptFunctionTable *DefScriptPackage::_GetFunctionTable(void) const {"applypermissions",&DefScriptPackage::SCapplypermissions}, {"log",&DefScriptPackage::SClog}, {"logdetail",&DefScriptPackage::SClogdetail}, + {"logerror",&DefScriptPackage::SClogerror}, {"logdebug",&DefScriptPackage::SClogdebug}, {"castspell", &DefScriptPackage::SCcastspell}, diff --git a/src/Client/DefScript/DefScript.h b/src/Client/DefScript/DefScript.h index 93c54d4..5f7fd6a 100644 --- a/src/Client/DefScript/DefScript.h +++ b/src/Client/DefScript/DefScript.h @@ -154,6 +154,7 @@ private: bool SClog(CmdSet); bool SClogdetail(CmdSet); bool SClogdebug(CmdSet); + bool SClogerror(CmdSet); bool SCcastspell(CmdSet); // Own variable declarations diff --git a/src/Client/DefScriptInterface.cpp b/src/Client/DefScriptInterface.cpp index 69c27c8..ac7a806 100644 --- a/src/Client/DefScriptInterface.cpp +++ b/src/Client/DefScriptInterface.cpp @@ -23,7 +23,7 @@ bool DefScriptPackage::SCpause(CmdSet Set){ bool DefScriptPackage::SCSendChatMessage(CmdSet Set){ if(!(((PseuInstance*)parentMethod)->GetWSession() && ((PseuInstance*)parentMethod)->GetWSession()->IsValid())) { - log("Invalid Script call: SCSendChatMessage: WorldSession not valid"); + logerror("Invalid Script call: SCSendChatMessage: WorldSession not valid"); return false; } std::stringstream ss; @@ -65,7 +65,7 @@ bool DefScriptPackage::SCemote(CmdSet Set){ return true; if(!(((PseuInstance*)parentMethod)->GetWSession() && ((PseuInstance*)parentMethod)->GetWSession()->IsValid())) { - log("Invalid Script call: SCEmote: WorldSession not valid"); + logerror("Invalid Script call: SCEmote: WorldSession not valid"); return false; } uint32 id=atoi(Set.defaultarg.c_str()); @@ -96,7 +96,7 @@ bool DefScriptPackage::SCjoinchannel(CmdSet Set){ return true; if(!(((PseuInstance*)parentMethod)->GetWSession() && ((PseuInstance*)parentMethod)->GetWSession()->IsValid())) { - log("Invalid Script call: SCjoinchannel: WorldSession not valid"); + logerror("Invalid Script call: SCjoinchannel: WorldSession not valid"); return false; } ((PseuInstance*)parentMethod)->GetWSession()->GetChannels()->Join(Set.defaultarg,Set.arg[0]); @@ -108,7 +108,7 @@ bool DefScriptPackage::SCleavechannel(CmdSet Set){ return true; if(!(((PseuInstance*)parentMethod)->GetWSession() && ((PseuInstance*)parentMethod)->GetWSession()->IsValid())) { - log("Invalid Script call: SCleavechannel: WorldSession not valid"); + logerror("Invalid Script call: SCleavechannel: WorldSession not valid"); return false; } ((PseuInstance*)parentMethod)->GetWSession()->GetChannels()->Leave(Set.defaultarg); @@ -155,13 +155,18 @@ bool DefScriptPackage::SClogdebug(CmdSet Set){ return true; } +bool DefScriptPackage::SClogerror(CmdSet Set){ + logerror(Set.defaultarg.c_str()); + return true; +} + bool DefScriptPackage::SCcastspell(CmdSet Set) { if(Set.defaultarg.empty()) return true; if(!(((PseuInstance*)parentMethod)->GetWSession() && ((PseuInstance*)parentMethod)->GetWSession()->IsValid())) { - log("Invalid Script call: SCcastspell: WorldSession not valid"); + logerror("Invalid Script call: SCcastspell: WorldSession not valid"); return false; } @@ -172,7 +177,7 @@ bool DefScriptPackage::SCcastspell(CmdSet Set) if (spellId <= 0) { - log("Invalid Script call: SCcastspell: SpellId not valid"); + logerror("Invalid Script call: SCcastspell: SpellId not valid"); return false; } @@ -181,7 +186,7 @@ bool DefScriptPackage::SCcastspell(CmdSet Set) spellTarget = ((PseuInstance*)parentMethod)->GetWSession()->GetGuid(); } - ((PseuInstance*)parentMethod)->GetWSession()->GetPlayerSettings()->CastSpell(spellId, spellTarget); +// ((PseuInstance*)parentMethod)->GetWSession()->GetPlayerSettings()->CastSpell(spellId, spellTarget); return true; } @@ -196,7 +201,7 @@ void DefScriptPackage::My_LoadUserPermissions(VarSet &vs) { usr = variables[i].name.substr(strlen(prefix), variables[i].name.length() - strlen(prefix)); my_usrPermissionMap[usr] = atoi(variables[i].value.c_str()); - DEBUG( log("Player '%s' permission = %u",usr.c_str(),atoi(variables[i].value.c_str())); ) + DEBUG( logdebug("Player '%s' permission = %u",usr.c_str(),atoi(variables[i].value.c_str())); ) } } } diff --git a/src/Client/Realm/RealmSocket.cpp b/src/Client/Realm/RealmSocket.cpp index 2327b8c..387acf2 100644 --- a/src/Client/Realm/RealmSocket.cpp +++ b/src/Client/Realm/RealmSocket.cpp @@ -399,7 +399,7 @@ void RealmSocket::_HandleLogonProof(void) } else { - log("Auth failed, M2 differs!"); + logcritical("Auth failed, M2 differs!"); printf("My M2 :"); printchex((char*)_m2,20,true); printf("Srv M2:"); printchex((char*)lp.M2,20,true); GetInstance()->SetError(); diff --git a/src/Client/World/UpdateData.cpp b/src/Client/World/UpdateData.cpp new file mode 100644 index 0000000..13922e8 --- /dev/null +++ b/src/Client/World/UpdateData.cpp @@ -0,0 +1,55 @@ +#include "common.h" +#include "ZCompressor.h" +#include "WorldSession.h" +#include "UpdateData.h" + +void WorldSession::_HandleCompressedUpdateObjectOpcode(WorldPacket& recvPacket) +{ + printf("-> COMPRESSED_UPDATE_OBJECT, pktlen=%u\n",recvPacket.size()); + //recvPacket.hexlike(); + uint32 realsize; + recvPacket >> realsize; + ZCompressor z; + z.append(recvPacket.contents() + sizeof(uint32),recvPacket.size() - sizeof(uint32)); + z.Compressed(true); + z.RealSize(realsize); + z.Inflate(); + printf("-> Uncompressed to %u bytes\n",z.size()); + if(z.Compressed()) + { + log("ERROR: _HandleCompressedUpdateObjectOpcode(): Inflate() failed!"); + return; + } + WorldPacket wp; + wp.SetOpcode(recvPacket.GetOpcode()); + wp.append(z.contents(),z.size()); + + _HandleUpdateObjectOpcode(wp); +} + +void WorldSession::_HandleUpdateObjectOpcode(WorldPacket& recvPacket) +{ + printf("-> UPDATE_OBJECT, pktlen=%u\n",recvPacket.size()); + //recvPacket.hexlike(); + uint8 utype; + uint32 usize; + uint64 uguid; + //while(true) + { + recvPacket >> utype >> usize; + switch(utype) + { + case UPDATETYPE_OUT_OF_RANGE_OBJECTS: + for(uint16 i=0;i> uguid; + printf("DEBUG: GUID "I64FMT" out of range\n",uguid); + // TODO: delete object from known objects list + } + break; + + default: + break; + } + } +} \ No newline at end of file diff --git a/src/Client/World/UpdateData.h b/src/Client/World/UpdateData.h new file mode 100644 index 0000000..2ee196e --- /dev/null +++ b/src/Client/World/UpdateData.h @@ -0,0 +1,18 @@ +#ifndef _UPDATEDATA_H +#define _UPDATEDATA_H + +enum OBJECT_UPDATE_TYPE +{ + UPDATETYPE_VALUES = 0, + + UPDATETYPE_MOVEMENT = 1, + + UPDATETYPE_CREATE_OBJECT = 2, + + UPDATETYPE_CREATE_OBJECT2 = 3, + UPDATETYPE_OUT_OF_RANGE_OBJECTS = 4, + UPDATETYPE_NEAR_OBJECTS = 5 + +}; + +#endif \ No newline at end of file diff --git a/src/Client/World/WorldSession.cpp b/src/Client/World/WorldSession.cpp index 32233d3..d276ddc 100644 --- a/src/Client/World/WorldSession.cpp +++ b/src/Client/World/WorldSession.cpp @@ -24,7 +24,7 @@ WorldSession::WorldSession(PseuInstance *in) plrNameCache.ReadFromFile(); // load names/guids of known players _deleteme = false; _channels = new Channel(this); - _playerSettings->Init(this); +// _playerSettings->Init(this); //... } @@ -112,11 +112,8 @@ void WorldSession::Update(void) || ((!known) && GetInstance()->GetConf()->showopcodes==2) || (GetInstance()->GetConf()->showopcodes==3) ) { - log(">> Opcode %u - %s - [%s]", packet->GetOpcode(), known ? "Known" : "UNKNOWN", LookupName(packet->GetOpcode(),g_worldOpcodeNames)); + logcustom(1,YELLOW,">> Opcode %u [%s] (%s)", packet->GetOpcode(), LookupName(packet->GetOpcode(),g_worldOpcodeNames), known ? "Known" : "UNKNOWN"); } - - - delete packet; } @@ -159,7 +156,7 @@ OpcodeHandler *WorldSession::_GetOpcodeHandlerTable() const {MSG_MOVE_FALL_LAND, &WorldSession::_HandleMovementOpcode}, {MSG_MOVE_TELEPORT_ACK, &WorldSession::_HandleTelePortAckOpcode}, - + {SMSG_COMPRESSED_UPDATE_OBJECT, &WorldSession::_HandleCompressedUpdateObjectOpcode}, {SMSG_CAST_RESULT, &WorldSession::_HandleCastResultOpcode}, // table termination @@ -265,7 +262,8 @@ void WorldSession::_HandleAuthResponseOpcode(WorldPacket& recvPacket) pkt.SetOpcode(CMSG_CHAR_ENUM); SendWorldPacket(pkt); } else { - log("World Authentication failed, errcode=0x%X",(unsigned char)errcode); + logcritical("World Authentication failed, errcode=0x%X",(unsigned char)errcode); + GetInstance()->SetError(); } } @@ -278,7 +276,7 @@ void WorldSession::_HandleCharEnumOpcode(WorldPacket& recvPacket) recvPacket >> num; if(num==0){ - log("No chars found!\n"); + logerror("No chars found!"); GetInstance()->SetError(); return; } @@ -328,12 +326,12 @@ void WorldSession::_HandleCharEnumOpcode(WorldPacket& recvPacket) } if(!char_found){ - log("Character \"%s\" was not found on char list!",GetInstance()->GetConf()->charname.c_str()); + logerror("Character \"%s\" was not found on char list!",GetInstance()->GetConf()->charname.c_str()); GetInstance()->SetError(); return; } else { log("Entering World with Character \"%s\"...",GetInstance()->GetConf()->charname.c_str()); - _player->Init(plr[i]); +// _player->Init(plr[i]); WorldPacket pkt; pkt.SetOpcode(CMSG_PLAYER_LOGIN); @@ -392,19 +390,19 @@ void WorldSession::_HandleMessageChatOpcode(WorldPacket& recvPacket) recvPacket >> msglen >> msg; if (type == CHAT_MSG_SYSTEM) { - log("SYSMSG: \"%s\"",msg.c_str()); + logcustom(0,WHITE,"SYSMSG: \"%s\"",msg.c_str()); } else if (type==CHAT_MSG_WHISPER ) { - log("WHISP: %s [%s]: %s",plrname.c_str(),LookupName(lang,langNames),msg.c_str()); + logcustom(0,WHITE,"WHISP: %s [%s]: %s",plrname.c_str(),LookupName(lang,langNames),msg.c_str()); } else if (type==CHAT_MSG_CHANNEL ) { - log("CHANNEL [%s]: %s [%s]: %s",channel.c_str(),plrname.c_str(),LookupName(lang,langNames),msg.c_str()); + logcustom(0,WHITE,"CHANNEL [%s]: %s [%s]: %s",channel.c_str(),plrname.c_str(),LookupName(lang,langNames),msg.c_str()); } else { - log("CHAT: %s [%s]: %s",plrname.c_str(),LookupName(lang,langNames),msg.c_str()); + logcustom(0,WHITE,"CHAT: %s [%s]: %s",plrname.c_str(),LookupName(lang,langNames),msg.c_str()); } if(target_guid!=_myGUID && msg.length()>1 && msg.at(0)=='-' && GetInstance()->GetConf()->allowgamecmd) @@ -552,5 +550,5 @@ void WorldSession::_HandleChannelNotifyOpcode(WorldPacket& recvPacket) void WorldSession::_HandleCastResultOpcode(WorldPacket& recvPacket) { - _playerSettings->HandleCastResultOpcode(recvPacket); +// _playerSettings->HandleCastResultOpcode(recvPacket); } diff --git a/src/Client/World/WorldSession.h b/src/Client/World/WorldSession.h index c362d33..8c5e699 100644 --- a/src/Client/World/WorldSession.h +++ b/src/Client/World/WorldSession.h @@ -47,8 +47,8 @@ public: uint64 GetFollowTarget(void) { return _followGUID; } uint64 GetGuid(void) { return _myGUID; } Channel *GetChannels(void) { return _channels; } - Player *GetPlayer(void) { return _player; } - PlayerSettings *GetPlayerSettings(void) { return _playerSettings; } +// Player *GetPlayer(void) { return _player; } +// PlayerSettings *GetPlayerSettings(void) { return _playerSettings; } // CMSGConstructor @@ -81,10 +81,12 @@ private: void _HandleTelePortAckOpcode(WorldPacket& recvPacket); void _HandleChannelNotifyOpcode(WorldPacket& recvPacket); void _HandleCastResultOpcode(WorldPacket& recvPacket); + void _HandleCompressedUpdateObjectOpcode(WorldPacket& recvPacket); + void _HandleUpdateObjectOpcode(WorldPacket& recvPacket); - Player *_player; // The connected character - PlayerSettings *_playerSettings; // Settings for the connected character + //Player *_player; // The connected character + //PlayerSettings *_playerSettings; // Settings for the connected character PseuInstance *_instance; WorldSocket *_socket; diff --git a/src/Client/World/WorldSocket.cpp b/src/Client/World/WorldSocket.cpp index 6212df0..4d3f46f 100644 --- a/src/Client/World/WorldSocket.cpp +++ b/src/Client/World/WorldSocket.cpp @@ -71,7 +71,7 @@ void WorldSocket::OnRead() _opcode = hdr.cmd; if(_opcode > 800) // no opcode has yet a number over 800 { - printf("CRYPT ERROR: opcode=%u, remain=%u\n",_opcode,_remaining); + logcritical("CRYPT ERROR: opcode=%u, remain=%u",_opcode,_remaining); GetSession()->GetInstance()->SetError(); // if the crypt gets messy its hardly possible to recover it, especially if we dont know // the lentgh of the following data part diff --git a/src/Client/log.cpp b/src/Client/log.cpp index 55d2e06..60d3860 100644 --- a/src/Client/log.cpp +++ b/src/Client/log.cpp @@ -18,9 +18,11 @@ void log(const char *str, ...) if(!str) return; va_list ap; + _log_setcolor(true,GREY); va_start(ap, str); vprintf( str, ap ); va_end(ap); + _log_resetcolor(true); printf("\n"); @@ -41,9 +43,11 @@ void logdetail(const char *str, ...) if(!str || instance->GetConf()->debug < 1) return; va_list ap; + _log_setcolor(true,LCYAN); va_start(ap, str); vprintf( str, ap ); va_end(ap); + _log_resetcolor(true); printf("\n"); @@ -64,9 +68,85 @@ void logdebug(const char *str, ...) if(!str || instance->GetConf()->debug < 2) return; va_list ap; + _log_setcolor(true,LBLUE); va_start(ap, str); vprintf( str, ap ); va_end(ap); + _log_resetcolor(true); + + + printf("\n"); + + if(logfile) + { + fprintf(logfile, getDateString().c_str()); + va_start(ap, str); + vfprintf(logfile, str, ap); + fprintf(logfile, "\n" ); + va_end(ap); + fflush(logfile); + } + fflush(stdout); +} + +void logerror(const char *str, ...) +{ + va_list ap; + _log_setcolor(true,LRED); + va_start(ap, str); + vprintf( str, ap ); + va_end(ap); + _log_resetcolor(true); + + printf("\n"); + + if(logfile) + { + fprintf(logfile, getDateString().c_str()); + va_start(ap, str); + vfprintf(logfile, str, ap); + fprintf(logfile, "\n" ); + va_end(ap); + fflush(logfile); + } + fflush(stdout); +} + +void logcritical(const char *str, ...) +{ + if(!str || instance->GetConf()->debug < 2) + return; + va_list ap; + _log_setcolor(true,RED); + va_start(ap, str); + vprintf( str, ap ); + va_end(ap); + _log_resetcolor(true); + + printf("\n"); + + if(logfile) + { + fprintf(logfile, getDateString().c_str()); + va_start(ap, str); + vfprintf(logfile, str, ap); + fprintf(logfile, "\n" ); + va_end(ap); + fflush(logfile); + } + fflush(stdout); +} + +void logcustom(uint8 loglevel, Color color, const char *str, ...) +{ + if(!str || instance->GetConf()->debug < loglevel) + return; + va_list ap; + _log_setcolor(true,color); + va_start(ap, str); + vprintf( str, ap ); + va_end(ap); + _log_resetcolor(true); printf("\n"); @@ -86,4 +166,90 @@ void log_close() { fclose(logfile); } + +void _log_setcolor(bool stdout_stream, Color color) +{ +#if PLATFORM == PLATFORM_WIN32 + + static WORD WinColorFG[Color_count] = + { + 0, // BLACK + FOREGROUND_RED, // RED + FOREGROUND_GREEN, // GREEN + FOREGROUND_RED | FOREGROUND_GREEN, // BROWN + FOREGROUND_BLUE, // BLUE + FOREGROUND_RED | FOREGROUND_BLUE,// MAGENTA + FOREGROUND_GREEN | FOREGROUND_BLUE, // CYAN + FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,// WHITE + // YELLOW + FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY, + // RED_BOLD + FOREGROUND_RED | FOREGROUND_INTENSITY, + // GREEN_BOLD + FOREGROUND_GREEN | FOREGROUND_INTENSITY, + FOREGROUND_BLUE | FOREGROUND_INTENSITY, // BLUE_BOLD + // MAGENTA_BOLD + FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY, + // CYAN_BOLD + FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY, + // WHITE_BOLD + FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY + }; + + HANDLE hConsole = GetStdHandle(stdout_stream ? STD_OUTPUT_HANDLE : STD_ERROR_HANDLE ); + SetConsoleTextAttribute(hConsole, WinColorFG[color]); +#else + + enum ANSITextAttr + { + TA_NORMAL=0, + TA_BOLD=1, + TA_BLINK=5, + TA_REVERSE=7 + }; + + enum ANSIFgTextAttr + { + FG_BLACK=30, FG_RED, FG_GREEN, FG_BROWN, FG_BLUE, + FG_MAGENTA, FG_CYAN, FG_WHITE, FG_YELLOW + }; + + enum ANSIBgTextAttr + { + BG_BLACK=40, BG_RED, BG_GREEN, BG_BROWN, BG_BLUE, + BG_MAGENTA, BG_CYAN, BG_WHITE + }; + + static uint8 UnixColorFG[Color_count] = + { + FG_BLACK, // BLACK + FG_RED, // RED + FG_GREEN, // GREEN + FG_BROWN, // BROWN + FG_BLUE, // BLUE + FG_MAGENTA, // MAGENTA + FG_CYAN, // CYAN + FG_WHITE, // WHITE + FG_YELLOW, // YELLOW + FG_RED, // LRED + FG_GREEN, // LGREEN + FG_BLUE, // LBLUE + FG_MAGENTA, // LMAGENTA + FG_CYAN, // LCYAN + FG_WHITE // LWHITE + }; + + fprintf((stdout_stream? stdout : stderr), "\x1b[%d%sm",UnixColorFG[color],(color>=YELLOW&&color + + + + diff --git a/src/shared.vcproj b/src/shared.vcproj index 1e6f6c9..f24ad66 100644 --- a/src/shared.vcproj +++ b/src/shared.vcproj @@ -137,6 +137,12 @@ + + + + diff --git a/src/shared/ZCompressor.cpp b/src/shared/ZCompressor.cpp new file mode 100644 index 0000000..bd08923 --- /dev/null +++ b/src/shared/ZCompressor.cpp @@ -0,0 +1,122 @@ +#include "common.h" +#include "zlib/zlib.h" +#include "ZCompressor.h" + +ZCompressor::ZCompressor() +{ + _iscompressed=false; + _real_size=0; +} + +void ZCompressor::_compress(void* dst, uint32 *dst_size, void* src, uint32 src_size, uint8 level) +{ + z_stream c_stream; + + c_stream.zalloc = (alloc_func)0; + c_stream.zfree = (free_func)0; + c_stream.opaque = (voidpf)0; + + // default Z_BEST_SPEED (1) + if (Z_OK != deflateInit(&c_stream, level)) + { + //printf("ZLIB: Can't compress (zlib: deflateInit).\n"); + *dst_size = 0; + return; + } + + c_stream.next_out = (Bytef*)dst; + c_stream.avail_out = *dst_size; + c_stream.next_in = (Bytef*)src; + c_stream.avail_in = (uInt)src_size; + + if (Z_OK != deflate(&c_stream, Z_NO_FLUSH)) + { + //printf("ZLIB: Can't compress (zlib: deflate)\n"); + *dst_size = 0; + return; + } + + if (c_stream.avail_in != 0) + { + //printf("Can't compress (zlib: deflate not greedy)\n"); + *dst_size = 0; + return; + } + + if (Z_STREAM_END != deflate(&c_stream, Z_FINISH)) + { + //printf("Can't compress (zlib: deflate should report Z_STREAM_END)\n"); + *dst_size = 0; + //return; + exit(1); + } + + if (Z_OK != deflateEnd(&c_stream)) + { + //printf("Can't compress (zlib: deflateEnd)\n"); + *dst_size = 0; + return; + } + + *dst_size = c_stream.total_out; +} + + +void ZCompressor::Deflate(uint8 level) +{ + if( _iscompressed || (!size()) || level>9 ) + return; + + char *buf; + buf=new char[size()+8]; + + uint32 newsize,oldsize=size(); + reserve(size()+8); + + _compress((void*)buf, &newsize, (void*)contents(),size(),level); + + if(!newsize) + return; + + resize(newsize); + rpos(0); + wpos(0); + append(buf,newsize); + + _iscompressed=true; + + _real_size=oldsize; +} + +void ZCompressor::Inflate(void) +{ + if( (!_iscompressed) || (!_real_size) || (!size())) + return; + + uLongf origsize=_real_size; + int8 result; + uint8 *target=new uint8[_real_size]; + wpos(0); + rpos(0); + result = uncompress(target, &origsize, (uint8*)contents(), size()); + if( result!=Z_OK || origsize!=_real_size) + { + //printf("ZCompressor: Inflate error! result=%d cursize=%u origsize=%u realsize=%u\n",result,size(),origsize,_real_size); + delete [] target; + return; + } + clear(); + append(target,origsize); + delete [] target; + _real_size=0; + _iscompressed=false; + +} + +void ZCompressor::clear(void) +{ + ByteBuffer::clear(); + _real_size=0; + _iscompressed=false; +} + diff --git a/src/shared/ZCompressor.h b/src/shared/ZCompressor.h new file mode 100644 index 0000000..a7cb08e --- /dev/null +++ b/src/shared/ZCompressor.h @@ -0,0 +1,34 @@ + +#ifndef _ZCOMPRESSOR_H +#define _ZCOMPRESSOR_H + +#include "Auth/ByteBuffer.h" + + +class ZCompressor : public ByteBuffer +{ +public: + ZCompressor(); + void Deflate(uint8 level=4); + void Inflate(void); + bool Compressed(void) { return _iscompressed; } + void Compressed(bool b) { _iscompressed = b; } + uint32 RealSize(void) { return _iscompressed ? _real_size : 0; } + void RealSize(uint32 realsize) { _real_size=realsize; } + void clear(void); + + +protected: + bool _iscompressed; + void _compress(void* dst, uint32 *dst_size, void* src, uint32 src_size, uint8 level=4); + uint32 _real_size; + + + + + + +}; + + +#endif diff --git a/src/shared/sqlitewrapped/Database.cpp b/src/shared/sqlitewrapped/Database.cpp deleted file mode 100644 index bffc3c9..0000000 --- a/src/shared/sqlitewrapped/Database.cpp +++ /dev/null @@ -1,344 +0,0 @@ -/* - ** Database.cpp - ** - ** Published / author: 2005-08-12 / grymse@alhem.net - **/ - -/* -Copyright (C) 2001-2006 Anders Hedstrom - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include -#ifdef _WIN32 -#pragma warning(disable:4786) -#endif - -#include -#include -#include -#include -#include -#include "../../dep/src/sqlite/sqlite3.h" -#include - -#include "IError.h" -#include "Database.h" - - -#ifdef SQLITEW_NAMESPACE -namespace SQLITEW_NAMESPACE { -#endif - - -Database::Database(const std::string& d,IError *e) -:database(d) -,m_errhandler(e) -,m_embedded(true) -,m_mutex(m_mutex) -,m_b_use_mutex(false) -{ -} - - -Database::Database(Mutex& m,const std::string& d,IError *e) -:database(d) -,m_errhandler(e) -,m_embedded(true) -,m_mutex(m) -,m_b_use_mutex(true) -{ -} - - -Database::~Database() -{ - for (opendb_v::iterator it = m_opendbs.begin(); it != m_opendbs.end(); it++) - { - OPENDB *p = *it; - sqlite3_close(p -> db); - } - while (m_opendbs.size()) - { - opendb_v::iterator it = m_opendbs.begin(); - OPENDB *p = *it; - if (p -> busy) - { - error("destroying Database object before Query object"); - } - delete p; - m_opendbs.erase(it); - } -} - - -void Database::RegErrHandler(IError *p) -{ - m_errhandler = p; -} - - -Database::OPENDB *Database::grabdb() -{ - Lock lck(m_mutex, m_b_use_mutex); - OPENDB *odb = NULL; - - for (opendb_v::iterator it = m_opendbs.begin(); it != m_opendbs.end(); it++) - { - odb = *it; - if (!odb -> busy) - { - break; - } - else - { - odb = NULL; - } - } - if (!odb) - { - odb = new OPENDB; - if (!odb) - { - error("grabdb: OPENDB struct couldn't be created"); - return NULL; - } - int rc = sqlite3_open(database.c_str(), &odb -> db); - if (rc) - { - error("Can't open database: %s\n", sqlite3_errmsg(odb -> db)); - sqlite3_close(odb -> db); - delete odb; - return NULL; - } - odb -> busy = true; - m_opendbs.push_back(odb); - } - else - { - odb -> busy = true; - } - return odb; -} - - -void Database::freedb(Database::OPENDB *odb) -{ - Lock lck(m_mutex, m_b_use_mutex); - if (odb) - { - odb -> busy = false; - } -} - - -void Database::error(const char *format, ...) -{ - if (m_errhandler) - { - va_list ap; - char errstr[5000]; - va_start(ap, format); -#ifdef WIN32 - vsprintf(errstr, format, ap); -#else - vsnprintf(errstr, 5000, format, ap); -#endif - va_end(ap); - m_errhandler -> error(*this, errstr); - } -} - - -void Database::error(Query& q,const char *format, ...) -{ - if (m_errhandler) - { - va_list ap; - char errstr[5000]; - va_start(ap, format); -#ifdef WIN32 - vsprintf(errstr, format, ap); -#else - vsnprintf(errstr, 5000, format, ap); -#endif - va_end(ap); - m_errhandler -> error(*this, q, errstr); - } -} - - -void Database::error(Query& q,const std::string& msg) -{ - if (m_errhandler) - { - m_errhandler -> error(*this, q, msg); - } -} - - -bool Database::Connected() -{ - OPENDB *odb = grabdb(); - if (!odb) - { - return false; - } - freedb(odb); - return true; -} - - -Database::Lock::Lock(Mutex& mutex,bool use) : m_mutex(mutex),m_b_use(use) -{ - if (m_b_use) - { - m_mutex.Lock(); - } -} - - -Database::Lock::~Lock() -{ - if (m_b_use) - { - m_mutex.Unlock(); - } -} - - -Database::Mutex::Mutex() -{ -#ifdef _WIN32 - m_mutex = ::CreateMutex(NULL, FALSE, NULL); -#else - pthread_mutex_init(&m_mutex, NULL); -#endif -} - - -Database::Mutex::~Mutex() -{ -#ifdef _WIN32 - ::CloseHandle(m_mutex); -#else - pthread_mutex_destroy(&m_mutex); -#endif -} - - -void Database::Mutex::Lock() -{ -#ifdef _WIN32 - DWORD d = WaitForSingleObject(m_mutex, INFINITE); - // %! check 'd' for result -#else - pthread_mutex_lock(&m_mutex); -#endif -} - - -void Database::Mutex::Unlock() -{ -#ifdef _WIN32 - ::ReleaseMutex(m_mutex); -#else - pthread_mutex_unlock(&m_mutex); -#endif -} - - -std::string Database::safestr(const std::string& str) -{ - std::string str2; - for (size_t i = 0; i < str.size(); i++) - { - switch (str[i]) - { - case '\'': - case '\\': - case 34: - str2 += '\''; - default: - str2 += str[i]; - } - } - return str2; -} - - -std::string Database::xmlsafestr(const std::string& str) -{ - std::string str2; - for (size_t i = 0; i < str.size(); i++) - { - switch (str[i]) - { - case '&': - str2 += "&"; - break; - case '<': - str2 += "<"; - break; - case '>': - str2 += ">"; - break; - case '"': - str2 += """; - break; - case '\'': - str2 += "'"; - break; - default: - str2 += str[i]; - } - } - return str2; -} - - -int64_t Database::a2bigint(const std::string& str) -{ - int64_t val = 0; - bool sign = false; - size_t i = 0; - if (str[i] == '-') - { - sign = true; - i++; - } - for (; i < str.size(); i++) - { - val = val * 10 + (str[i] - 48); - } - return sign ? -val : val; -} - - -uint64_t Database::a2ubigint(const std::string& str) -{ - uint64_t val = 0; - for (size_t i = 0; i < str.size(); i++) - { - val = val * 10 + (str[i] - 48); - } - return val; -} - - -#ifdef SQLITEW_NAMESPACE -} // namespace SQLITEW_NAMESPACE { -#endif - diff --git a/src/shared/sqlitewrapped/Database.h b/src/shared/sqlitewrapped/Database.h deleted file mode 100644 index 5b991b1..0000000 --- a/src/shared/sqlitewrapped/Database.h +++ /dev/null @@ -1,154 +0,0 @@ -/* - ** Database.h - ** - ** Published / author: 2005-08-12 / grymse@alhem.net - **/ - -/* -Copyright (C) 2001-2006 Anders Hedstrom - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _DATABASE_H_SQLITE -#define _DATABASE_H_SQLITE - -#ifdef _WIN32 -#include -#else -#include -#endif -#include -#include -#ifdef WIN32 -typedef unsigned __int64 uint64_t; -typedef __int64 int64_t; -#else -#include -#endif - -#ifdef SQLITEW_NAMESPACE -namespace SQLITEW_NAMESPACE { -#endif - - -class IError; -class Query; -class Mutex; - - -/** Connection information and pool. */ -class Database -{ -public: - /** Mutex container class, used by Lock. - \ingroup threading */ - class Mutex { - public: - Mutex(); - ~Mutex(); - void Lock(); - void Unlock(); - private: -#ifdef _WIN32 - HANDLE m_mutex; -#else - pthread_mutex_t m_mutex; -#endif - }; -private: - /** Mutex helper class. */ - class Lock { - public: - Lock(Mutex& mutex,bool use); - ~Lock(); - private: - Mutex& m_mutex; - bool m_b_use; - }; -public: - /** Connection pool struct. */ - struct OPENDB { - OPENDB() : busy(false) {} - sqlite3 *db; - bool busy; - }; - typedef std::list opendb_v; - -public: - /** Use file */ - Database(const std::string& database, - IError * = NULL); - - /** Use file + thread safe */ - Database(Mutex& ,const std::string& database, - IError * = NULL); - - virtual ~Database(); - - /** try to establish connection with given host */ - bool Connected(); - - void RegErrHandler(IError *); - void error(Query&,const char *format, ...); - void error(Query&,const std::string& ); - - /** Request a database connection. -The "grabdb" method is used by the Query class, so that each object instance of Query gets a unique -database connection. I will reimplement your connection check logic in the Query class, as that's where -the database connection is really used. -It should be used something like this. -{ - Query q(db); - if (!q.Connected()) - return false; - q.execute("delete * from user"); // well maybe not -} - -When the Query object is deleted, then "freedb" is called - the database connection stays open in the -m_opendbs vector. New Query objects can then reuse old connections. - */ - OPENDB *grabdb(); - void freedb(OPENDB *odb); - - /** Escape string - change all ' to ''. */ - std::string safestr(const std::string& ); - /** Make string xml safe. */ - std::string xmlsafestr(const std::string& ); - - /** Convert string to 64-bit integer. */ - int64_t a2bigint(const std::string& ); - /** Convert string to unsigned 64-bit integer. */ - uint64_t a2ubigint(const std::string& ); - -private: - Database(const Database& ) : m_mutex(m_mutex) {} - Database& operator=(const Database& ) { return *this; } - void error(const char *format, ...); - // - std::string database; - opendb_v m_opendbs; - IError *m_errhandler; - bool m_embedded; - Mutex& m_mutex; - bool m_b_use_mutex; -}; - - -#ifdef SQLITEW_NAMESPACE -} // namespace SQLITEW_NAMESPACE { -#endif - -#endif // _DATABASE_H diff --git a/src/shared/sqlitewrapped/IError.h b/src/shared/sqlitewrapped/IError.h deleted file mode 100644 index 7383df4..0000000 --- a/src/shared/sqlitewrapped/IError.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - ** IError.h - ** - ** Published / author: 2004-06-11 / grymse@alhem.net - **/ - -/* -Copyright (C) 2004,2005,2006 Anders Hedstrom - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _IERROR_H_SQLITE -#define _IERROR_H_SQLITE - -#include - - -#ifdef SQLITEW_NAMESPACE -namespace SQLITEW_NAMESPACE { -#endif - - -class Database; -class Query; - - -/** Log class interface. */ -class IError -{ -public: - virtual void error(Database&,const std::string&) = 0; - virtual void error(Database&,Query&,const std::string&) = 0; -}; - - -#ifdef SQLITEW_NAMESPACE -} // namespace SQLITEW_NAMESPACE { -#endif - -#endif // _IERROR_H diff --git a/src/shared/sqlitewrapped/Query.cpp b/src/shared/sqlitewrapped/Query.cpp deleted file mode 100644 index 2d9bc92..0000000 --- a/src/shared/sqlitewrapped/Query.cpp +++ /dev/null @@ -1,524 +0,0 @@ -/* - ** Query.cpp - ** - ** Published / author: 2005-08-12 / grymse@alhem.net - **/ - -/* -Copyright (C) 2001-2006 Anders Hedstrom - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _WIN32 -#pragma warning(disable:4786) -#endif - -#include -#include -#include -#include -#include -#include "../../dep/src/sqlite/sqlite3.h" - -#include "Database.h" -#include "Query.h" - - -#ifdef SQLITEW_NAMESPACE -namespace SQLITEW_NAMESPACE { -#endif - - -Query::Query(Database& dbin) -: m_db(dbin) -,odb(dbin.grabdb()) -,res(NULL) -,row(false) -,cache_rc(0) -,cache_rc_valid(false) -,m_row_count(0) -,m_num_cols(0) -{ -} - - -Query::Query(Database& dbin,const std::string& sql) -: m_db(dbin) -,odb(dbin.grabdb()) -,res(NULL) -,row(false) -,cache_rc(0) -,cache_rc_valid(false) -,m_row_count(0) -,m_num_cols(0) -{ - execute(sql); -} - - -Query::~Query() -{ - if (res) - { - GetDatabase().error(*this, "sqlite3_finalize in destructor"); - sqlite3_finalize(res); - } - if (odb) - { - m_db.freedb(odb); - } -} - - -Database& Query::GetDatabase() const -{ - return m_db; -} - - -/* -The sqlite3_finalize() routine deallocates a prepared SQL statement. -All prepared statements must be finalized before the database can be closed. -*/ -bool Query::execute(const std::string& sql) -{ // query, no result - m_last_query = sql; - if (odb && res) - { - GetDatabase().error(*this, "execute: query busy"); - } - if (odb && !res) - { - const char *s = NULL; - int rc = sqlite3_prepare(odb -> db, sql.c_str(), sql.size(), &res, &s); - if (rc != SQLITE_OK) - { - GetDatabase().error(*this, "execute: prepare query failed"); - return false; - } - if (!res) - { - GetDatabase().error(*this, "execute: query failed"); - return false; - } - rc = sqlite3_step(res); // execute - sqlite3_finalize(res); // deallocate statement - res = NULL; - switch (rc) - { - case SQLITE_BUSY: - GetDatabase().error(*this, "execute: database busy"); - return false; - case SQLITE_DONE: - case SQLITE_ROW: - return true; - case SQLITE_ERROR: - GetDatabase().error(*this, sqlite3_errmsg(odb -> db)); - return false; - case SQLITE_MISUSE: - GetDatabase().error(*this, "execute: database misuse"); - return false; - } - GetDatabase().error(*this, "execute: unknown result code"); - } - return false; -} - - - -// methods using db specific api calls - -sqlite3_stmt *Query::get_result(const std::string& sql) -{ // query, result - if (odb && res) - { - GetDatabase().error(*this, "get_result: query busy"); - } - if (odb && !res) - { - const char *s = NULL; - int rc = sqlite3_prepare(odb -> db, sql.c_str(), sql.size(), &res, &s); - if (rc != SQLITE_OK) - { - GetDatabase().error(*this, "get_result: prepare query failed"); - return NULL; - } - if (!res) - { - GetDatabase().error(*this, "get_result: query failed"); - return NULL; - } - // get column names from result - { - int i = 0; - do - { - const char *p = sqlite3_column_name(res, i); - if (!p) - break; - m_nmap[p] = ++i; - } while (true); - m_num_cols = i + 1; - } - cache_rc = sqlite3_step(res); - cache_rc_valid = true; - m_row_count = (cache_rc == SQLITE_ROW) ? 1 : 0; - } - return res; -} - - -void Query::free_result() -{ - if (odb && res) - { - sqlite3_finalize(res); - res = NULL; - row = false; - cache_rc_valid = false; - } - // clear column names - while (m_nmap.size()) - { - std::map::iterator it = m_nmap.begin(); - m_nmap.erase(it); - } -} - - -bool Query::fetch_row() -{ - rowcount = 0; - row = false; - if (odb && res) - { - int rc = cache_rc_valid ? cache_rc : sqlite3_step(res); // execute - cache_rc_valid = false; - switch (rc) - { - case SQLITE_BUSY: - GetDatabase().error(*this, "execute: database busy"); - return false; - case SQLITE_DONE: - return false; - case SQLITE_ROW: - row = true; - return true; - case SQLITE_ERROR: - GetDatabase().error(*this, sqlite3_errmsg(odb -> db)); - return false; - case SQLITE_MISUSE: - GetDatabase().error(*this, "execute: database misuse"); - return false; - } - GetDatabase().error(*this, "execute: unknown result code"); - } - return false; -} - - -sqlite_int64 Query::insert_id() -{ - if (odb) - { - return sqlite3_last_insert_rowid(odb -> db); - } - else - { - return 0; - } -} - - -long Query::num_rows() -{ - return odb && res ? m_row_count : 0; -} - - -bool Query::is_null(int x) -{ - if (odb && res && row) - { - if (sqlite3_column_type(res, x) == SQLITE_NULL) - return true; - } - return false; // ... -} - - -const char *Query::getstr(const std::string& x) -{ - int index = m_nmap[x] - 1; - if (index >= 0) - return getstr(index); - error("Column name lookup failure: " + x); - return ""; -} - - -const char *Query::getstr(int x) -{ - if (odb && res && row && x < sqlite3_column_count(res) ) - { - const unsigned char *tmp = sqlite3_column_text(res, x); - return tmp ? (const char *)tmp : ""; - } - return ""; -} - - -const char *Query::getstr() -{ - return getstr(rowcount++); -} - - -double Query::getnum(const std::string& x) -{ - int index = m_nmap[x] - 1; - if (index >= 0) - return getnum(index); - error("Column name lookup failure: " + x); - return 0; -} - - -double Query::getnum(int x) -{ - if (odb && res && row) - { - return sqlite3_column_double(res, x); - } - return 0; -} - - -long Query::getval(const std::string& x) -{ - int index = m_nmap[x] - 1; - if (index >= 0) - return getval(index); - error("Column name lookup failure: " + x); - return 0; -} - - -long Query::getval(int x) -{ - if (odb && res && row) - { - return sqlite3_column_int(res, x); - } - return 0; -} - - -double Query::getnum() -{ - return getnum(rowcount++); -} - - -long Query::getval() -{ - return getval(rowcount++); -} - - -unsigned long Query::getuval(const std::string& x) -{ - int index = m_nmap[x] - 1; - if (index >= 0) - return getuval(index); - error("Column name lookup failure: " + x); - return 0; -} - - -unsigned long Query::getuval(int x) -{ - unsigned long l = 0; - if (odb && res && row) - { - l = sqlite3_column_int(res, x); - } - return l; -} - - -unsigned long Query::getuval() -{ - return getuval(rowcount++); -} - - -int64_t Query::getbigint(const std::string& x) -{ - int index = m_nmap[x] - 1; - if (index >= 0) - return getbigint(index); - error("Column name lookup failure: " + x); - return 0; -} - - -int64_t Query::getbigint(int x) -{ - if (odb && res && row) - { - return sqlite3_column_int64(res, x); - } - return 0; -} - - -int64_t Query::getbigint() -{ - return getbigint(rowcount++); -} - - -uint64_t Query::getubigint(const std::string& x) -{ - int index = m_nmap[x] - 1; - if (index >= 0) - return getubigint(index); - error("Column name lookup failure: " + x); - return 0; -} - - -uint64_t Query::getubigint(int x) -{ - uint64_t l = 0; - if (odb && res && row) - { - l = sqlite3_column_int64(res, x); - } - return l; -} - - -uint64_t Query::getubigint() -{ - return getubigint(rowcount++); -} - - -double Query::get_num(const std::string& sql) -{ - double l = 0; - if (get_result(sql)) - { - if (fetch_row()) - { - l = getnum(); - } - free_result(); - } - return l; -} - - -long Query::get_count(const std::string& sql) -{ - long l = 0; - if (get_result(sql)) - { - if (fetch_row()) - l = getval(); - free_result(); - } - return l; -} - - -const char *Query::get_string(const std::string& sql) -{ - bool found = false; - m_tmpstr = ""; - if (get_result(sql)) - { - if (fetch_row()) - { - m_tmpstr = getstr(); - found = true; - } - free_result(); - } - return m_tmpstr.c_str(); // %! changed from 1.0 which didn't return NULL on failed query -} - - -const std::string& Query::GetLastQuery() -{ - return m_last_query; -} - - -std::string Query::GetError() -{ - if (odb) - return sqlite3_errmsg(odb -> db); - return ""; -} - - -int Query::GetErrno() -{ - if (odb) - return sqlite3_errcode(odb -> db); - return 0; -} - - -bool Query::Connected() -{ - return odb ? true : false; -} - - - - -void Query::ViewRes() -{ - if (!res) - { - printf("no result stored\n"); - return; - } - printf("result column count = %d\n", sqlite3_column_count(res)); - for (int i = 0; i < sqlite3_column_count(res); i++) - { - printf(" %2d type %d name '%s'", i, sqlite3_column_type(res, i), sqlite3_column_name(res, i)); - printf(" / '%s'", (char *)sqlite3_column_text(res, i)); - printf(" / %d", sqlite3_column_int(res, i)); - printf(" / %f", sqlite3_column_double(res, i)); - printf("\n"); - } -} - - -void Query::error(const std::string& msg) -{ - GetDatabase().error(*this, msg); -} - - -#ifdef SQLITEW_NAMESPACE -} // namespace SQLITEW_NAMESPACE { -#endif - diff --git a/src/shared/sqlitewrapped/Query.h b/src/shared/sqlitewrapped/Query.h deleted file mode 100644 index 305dc53..0000000 --- a/src/shared/sqlitewrapped/Query.h +++ /dev/null @@ -1,165 +0,0 @@ -#ifdef _WIN32 -#pragma warning(disable:4786) -#endif -/* - ** Query.h - ** - ** Published / author: 2005-08-12 / grymse@alhem.net - **/ - -/* -Copyright (C) 2001-2006 Anders Hedstrom - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _QUERY_H_SQLITE -#define _QUERY_H_SQLITE - -#include -#include -#ifdef WIN32 -typedef unsigned __int64 uint64_t; -typedef __int64 int64_t; -#else -#include -#endif - - -#ifdef SQLITEW_NAMESPACE -namespace SQLITEW_NAMESPACE { -#endif - - -/** SQL Statement execute / result. */ -class Query -{ -public: - /** Constructor accepting reference to database object. */ - Query(Database& dbin); - /** Constructor accepting reference to database object - and query string to execute. */ - Query(Database& dbin,const std::string& sql); - ~Query(); - - /** Check if database object is connectable. */ - bool Connected(); - /** Return reference to database object. */ - Database& GetDatabase() const; - /** Return string containing last query executed. */ - const std::string& GetLastQuery(); - - /** execute() returns true if query is successful, - does not store result. */ - bool execute(const std::string& sql); - /** Execute query and store result. */ - sqlite3_stmt *get_result(const std::string& sql); - /** Free stored result, must be called after get_result() before calling - execute()/get_result() again. */ - void free_result(); - /** Fetch next result row. - \return false if there was no row to fetch (end of rows) */ - bool fetch_row(); - /** Get id of last insert. */ - sqlite_int64 insert_id(); - /** Returns 0 if there are no rows to fetch. */ - long num_rows(); - /** Last error string. */ - std::string GetError(); - /** Last error code. */ - int GetErrno(); - - /** Execute query and return first result as a string. */ - const char *get_string(const std::string& sql); - /** Execute query and return first result as a long integer. */ - long get_count(const std::string& sql); - /** Execute query and return first result as a double. */ - double get_num(const std::string& sql); - - /** Check if column x in current row is null. */ - bool is_null(int x); - - /** Return column named x as a string value. */ - const char *getstr(const std::string& x); - /** Return column x as a string value. */ - const char *getstr(int x); - /** Return next column as a string value - see rowcount. */ - const char *getstr(); - - /** Return column named x as a long integer. */ - long getval(const std::string& x); - /** Return column x as a long integer. */ - long getval(int x); - /** Return next column as a long integer - see rowcount. */ - long getval(); - - /** Return column named x as an unsigned long integer. */ - unsigned long getuval(const std::string& x); - /** Return column x as an unsigned long integer. */ - unsigned long getuval(int x); - /** Return next column as an unsigned long integer. */ - unsigned long getuval(); - - /** Return column named x as a 64-bit integer value. */ - int64_t getbigint(const std::string& x); - /** Return column x as a 64-bit integer value. */ - int64_t getbigint(int x); - /** Return next column as a 64-bit integer value. */ - int64_t getbigint(); - - /** Return column named x as an unsigned 64-bit integer value. */ - uint64_t getubigint(const std::string& x); - /** Return column x as an unsigned 64-bit integer value. */ - uint64_t getubigint(int x); - /** Return next column as an unsigned 64-bit integer value. */ - uint64_t getubigint(); - - /** Return column named x as a double. */ - double getnum(const std::string& x); - /** Return column x as a double. */ - double getnum(int x); - /** Return next column as a double. */ - double getnum(); - -private: - /** Hide the copy constructor. */ - Query(const Query& q) : m_db(q.GetDatabase()) {} - /** Hide the assignment operator. */ - Query& operator=(const Query& ) { return *this; } - /** Print current result to stdout. */ - void ViewRes(); - /** Print error to debug class. */ - void error(const std::string& ); - Database& m_db; ///< Reference to database object - Database::OPENDB *odb; ///< Connection pool handle - sqlite3_stmt *res; ///< Stored result - bool row; ///< true if fetch_row succeeded - short rowcount; ///< Current column pointer in result - std::string m_tmpstr; ///< Used to store result in get_string() call - std::string m_last_query; ///< Last query executed - int cache_rc; ///< Cached result after call to get_result() - bool cache_rc_valid; ///< Indicates cache_rc is valid - int m_row_count; ///< 0 if get_result() returned no rows - // - std::map m_nmap; ///< map translating column names to index - int m_num_cols; ///< number of columns in result -}; - - -#ifdef SQLITEW_NAMESPACE -} // namespace SQLITEW_NAMESPACE { -#endif - -#endif // _QUERY_H diff --git a/src/shared/sqlitewrapped/StderrLog.cpp b/src/shared/sqlitewrapped/StderrLog.cpp deleted file mode 100644 index 12016b7..0000000 --- a/src/shared/sqlitewrapped/StderrLog.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/* - ** StderrLog.cpp - ** - ** Published / author: 2004-08-18 / grymse@alhem.net - **/ - -/* -Copyright (C) 2004,2005,2006 Anders Hedstrom - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include -#ifdef _WIN32 -#pragma warning(disable:4786) -#endif - -#include -#include -#include -#include "../../dep/src/sqlite/sqlite3.h" - -#include "Database.h" -#include "Query.h" -#include "IError.h" -#include "StderrLog.h" - - -#ifdef SQLITEW_NAMESPACE -namespace SQLITEW_NAMESPACE { -#endif - - -void StderrLog::error(Database& db,const std::string& str) -{ - time_t t = time(NULL); - struct tm *tp = localtime(&t); - fprintf(stderr,"%d-%02d-%02d %02d:%02d:%02d :: Database: %s\n", - tp -> tm_year + 1900,tp -> tm_mon + 1,tp -> tm_mday, - tp -> tm_hour,tp -> tm_min, tp -> tm_sec, - str.c_str()); -} - - -void StderrLog::error(Database& db,Query& q,const std::string& str) -{ - time_t t = time(NULL); - struct tm *tp = localtime(&t); - fprintf(stderr,"%d-%02d-%02d %02d:%02d:%02d :: Query: %s: %s(%d)\n", - tp -> tm_year + 1900,tp -> tm_mon + 1,tp -> tm_mday, - tp -> tm_hour,tp -> tm_min, tp -> tm_sec, - str.c_str(),q.GetError().c_str(),q.GetErrno()); - fprintf(stderr," (QUERY: \"%s\")\n",q.GetLastQuery().c_str()); -} - - -#ifdef SQLITEW_NAMESPACE -} // namespace SQLITEW_NAMESPACE { -#endif - diff --git a/src/shared/sqlitewrapped/StderrLog.h b/src/shared/sqlitewrapped/StderrLog.h deleted file mode 100644 index 8be39f8..0000000 --- a/src/shared/sqlitewrapped/StderrLog.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - ** StderrLog.h - ** - ** Published / author: 2004-08-18 / grymse@alhem.net - **/ - -/* -Copyright (C) 2004,2005,2006 Anders Hedstrom - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _STDERRLOG_H_SQLITE -#define _STDERRLOG_H_SQLITE - - -#ifdef SQLITEW_NAMESPACE -namespace SQLITEW_NAMESPACE { -#endif - - -/** Log class writing to standard error. */ -class StderrLog : public IError -{ -public: - void error(Database&,const std::string&); - void error(Database&,Query&,const std::string&); - -}; - - - -#ifdef SQLITEW_NAMESPACE -} // namespace SQLITEW_NAMESPACE { -#endif - -#endif // _STDERRLOG_H diff --git a/src/shared/sqlitewrapped/SysLog.cpp b/src/shared/sqlitewrapped/SysLog.cpp deleted file mode 100644 index eeae163..0000000 --- a/src/shared/sqlitewrapped/SysLog.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/* - ** SysLog.cpp - ** - ** Published / author: 2004-08-18 / grymse@alhem.net - **/ - -/* -Copyright (C) 2004,2005,2006 Anders Hedstrom - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef WIN32 - -#include "../dep/src/sqlite/sqlite3.h" -#include - -#include "Database.h" -#include "Query.h" -#include "IError.h" -#include "SysLog.h" - - -#ifdef SQLITEW_NAMESPACE -namespace SQLITEW_NAMESPACE { -#endif - - -SysLog::SysLog(const std::string& appname,int option,int facility) -{ -static char blah[100]; - strcpy(blah, appname.c_str()); - openlog(blah, option, facility); -} - - -SysLog::~SysLog() -{ - closelog(); -} - - -void SysLog::error(Database& db,const std::string& str) -{ - syslog(LOG_ERR, "%s", str.c_str() ); -} - - -void SysLog::error(Database& db,Query& q,const std::string& str) -{ - syslog(LOG_ERR, "%s: %s(%d)", str.c_str(),q.GetError().c_str(),q.GetErrno() ); - syslog(LOG_ERR, "QUERY: \"%s\"", q.GetLastQuery().c_str()); -} - - -#ifdef SQLITEW_NAMESPACE -} // namespace SQLITEW_NAMESPACE { -#endif - -#endif // WIN32 diff --git a/src/shared/sqlitewrapped/SysLog.h b/src/shared/sqlitewrapped/SysLog.h deleted file mode 100644 index 7816dde..0000000 --- a/src/shared/sqlitewrapped/SysLog.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - ** SysLog.h - ** - ** Published / author: 2004-08-18 / grymse@alhem.net - **/ - -/* -Copyright (C) 2004,2005,2006 Anders Hedstrom - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SYSLOG_H_SQLITE -#define _SYSLOG_H_SQLITE -#ifndef WIN32 - -#include - - -#ifdef SQLITEW_NAMESPACE -namespace SQLITEW_NAMESPACE { -#endif - - -/** Log class writing to syslog. */ -class SysLog : public IError -{ -public: - SysLog(const std::string& = "database", int = LOG_PID, int = LOG_USER); - virtual ~SysLog(); - - void error(Database&,const std::string&); - void error(Database&,Query&,const std::string&); - -}; - - - -#ifdef SQLITEW_NAMESPACE -} // namespace SQLITEW_NAMESPACE { -#endif - -#endif // WIN32 -#endif // _SYSLOG_H