* object classes update
* first touch with update packets! * added some code coloring
This commit is contained in:
parent
aa703e896f
commit
f7415df6e3
@ -72,6 +72,7 @@ DefScriptFunctionTable *DefScriptPackage::_GetFunctionTable(void) const
|
|||||||
{"applypermissions",&DefScriptPackage::SCapplypermissions},
|
{"applypermissions",&DefScriptPackage::SCapplypermissions},
|
||||||
{"log",&DefScriptPackage::SClog},
|
{"log",&DefScriptPackage::SClog},
|
||||||
{"logdetail",&DefScriptPackage::SClogdetail},
|
{"logdetail",&DefScriptPackage::SClogdetail},
|
||||||
|
{"logerror",&DefScriptPackage::SClogerror},
|
||||||
{"logdebug",&DefScriptPackage::SClogdebug},
|
{"logdebug",&DefScriptPackage::SClogdebug},
|
||||||
{"castspell", &DefScriptPackage::SCcastspell},
|
{"castspell", &DefScriptPackage::SCcastspell},
|
||||||
|
|
||||||
|
|||||||
@ -154,6 +154,7 @@ private:
|
|||||||
bool SClog(CmdSet);
|
bool SClog(CmdSet);
|
||||||
bool SClogdetail(CmdSet);
|
bool SClogdetail(CmdSet);
|
||||||
bool SClogdebug(CmdSet);
|
bool SClogdebug(CmdSet);
|
||||||
|
bool SClogerror(CmdSet);
|
||||||
bool SCcastspell(CmdSet);
|
bool SCcastspell(CmdSet);
|
||||||
|
|
||||||
// Own variable declarations
|
// Own variable declarations
|
||||||
|
|||||||
@ -23,7 +23,7 @@ bool DefScriptPackage::SCpause(CmdSet Set){
|
|||||||
bool DefScriptPackage::SCSendChatMessage(CmdSet Set){
|
bool DefScriptPackage::SCSendChatMessage(CmdSet Set){
|
||||||
if(!(((PseuInstance*)parentMethod)->GetWSession() && ((PseuInstance*)parentMethod)->GetWSession()->IsValid()))
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
@ -65,7 +65,7 @@ bool DefScriptPackage::SCemote(CmdSet Set){
|
|||||||
return true;
|
return true;
|
||||||
if(!(((PseuInstance*)parentMethod)->GetWSession() && ((PseuInstance*)parentMethod)->GetWSession()->IsValid()))
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
uint32 id=atoi(Set.defaultarg.c_str());
|
uint32 id=atoi(Set.defaultarg.c_str());
|
||||||
@ -96,7 +96,7 @@ bool DefScriptPackage::SCjoinchannel(CmdSet Set){
|
|||||||
return true;
|
return true;
|
||||||
if(!(((PseuInstance*)parentMethod)->GetWSession() && ((PseuInstance*)parentMethod)->GetWSession()->IsValid()))
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
((PseuInstance*)parentMethod)->GetWSession()->GetChannels()->Join(Set.defaultarg,Set.arg[0]);
|
((PseuInstance*)parentMethod)->GetWSession()->GetChannels()->Join(Set.defaultarg,Set.arg[0]);
|
||||||
@ -108,7 +108,7 @@ bool DefScriptPackage::SCleavechannel(CmdSet Set){
|
|||||||
return true;
|
return true;
|
||||||
if(!(((PseuInstance*)parentMethod)->GetWSession() && ((PseuInstance*)parentMethod)->GetWSession()->IsValid()))
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
((PseuInstance*)parentMethod)->GetWSession()->GetChannels()->Leave(Set.defaultarg);
|
((PseuInstance*)parentMethod)->GetWSession()->GetChannels()->Leave(Set.defaultarg);
|
||||||
@ -155,13 +155,18 @@ bool DefScriptPackage::SClogdebug(CmdSet Set){
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DefScriptPackage::SClogerror(CmdSet Set){
|
||||||
|
logerror(Set.defaultarg.c_str());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool DefScriptPackage::SCcastspell(CmdSet Set)
|
bool DefScriptPackage::SCcastspell(CmdSet Set)
|
||||||
{
|
{
|
||||||
if(Set.defaultarg.empty())
|
if(Set.defaultarg.empty())
|
||||||
return true;
|
return true;
|
||||||
if(!(((PseuInstance*)parentMethod)->GetWSession() && ((PseuInstance*)parentMethod)->GetWSession()->IsValid()))
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,7 +177,7 @@ bool DefScriptPackage::SCcastspell(CmdSet Set)
|
|||||||
|
|
||||||
if (spellId <= 0)
|
if (spellId <= 0)
|
||||||
{
|
{
|
||||||
log("Invalid Script call: SCcastspell: SpellId not valid");
|
logerror("Invalid Script call: SCcastspell: SpellId not valid");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,7 +186,7 @@ bool DefScriptPackage::SCcastspell(CmdSet Set)
|
|||||||
spellTarget = ((PseuInstance*)parentMethod)->GetWSession()->GetGuid();
|
spellTarget = ((PseuInstance*)parentMethod)->GetWSession()->GetGuid();
|
||||||
}
|
}
|
||||||
|
|
||||||
((PseuInstance*)parentMethod)->GetWSession()->GetPlayerSettings()->CastSpell(spellId, spellTarget);
|
// ((PseuInstance*)parentMethod)->GetWSession()->GetPlayerSettings()->CastSpell(spellId, spellTarget);
|
||||||
return true;
|
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));
|
usr = variables[i].name.substr(strlen(prefix), variables[i].name.length() - strlen(prefix));
|
||||||
my_usrPermissionMap[usr] = atoi(variables[i].value.c_str());
|
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())); )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -399,7 +399,7 @@ void RealmSocket::_HandleLogonProof(void)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
log("Auth failed, M2 differs!");
|
logcritical("Auth failed, M2 differs!");
|
||||||
printf("My M2 :"); printchex((char*)_m2,20,true);
|
printf("My M2 :"); printchex((char*)_m2,20,true);
|
||||||
printf("Srv M2:"); printchex((char*)lp.M2,20,true);
|
printf("Srv M2:"); printchex((char*)lp.M2,20,true);
|
||||||
GetInstance()->SetError();
|
GetInstance()->SetError();
|
||||||
|
|||||||
55
src/Client/World/UpdateData.cpp
Normal file
55
src/Client/World/UpdateData.cpp
Normal file
@ -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<usize;i++)
|
||||||
|
{
|
||||||
|
recvPacket >> uguid;
|
||||||
|
printf("DEBUG: GUID "I64FMT" out of range\n",uguid);
|
||||||
|
// TODO: delete object from known objects list
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
18
src/Client/World/UpdateData.h
Normal file
18
src/Client/World/UpdateData.h
Normal file
@ -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
|
||||||
@ -24,7 +24,7 @@ WorldSession::WorldSession(PseuInstance *in)
|
|||||||
plrNameCache.ReadFromFile(); // load names/guids of known players
|
plrNameCache.ReadFromFile(); // load names/guids of known players
|
||||||
_deleteme = false;
|
_deleteme = false;
|
||||||
_channels = new Channel(this);
|
_channels = new Channel(this);
|
||||||
_playerSettings->Init(this);
|
// _playerSettings->Init(this);
|
||||||
//...
|
//...
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,11 +112,8 @@ void WorldSession::Update(void)
|
|||||||
|| ((!known) && GetInstance()->GetConf()->showopcodes==2)
|
|| ((!known) && GetInstance()->GetConf()->showopcodes==2)
|
||||||
|| (GetInstance()->GetConf()->showopcodes==3) )
|
|| (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;
|
delete packet;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,7 +156,7 @@ OpcodeHandler *WorldSession::_GetOpcodeHandlerTable() const
|
|||||||
{MSG_MOVE_FALL_LAND, &WorldSession::_HandleMovementOpcode},
|
{MSG_MOVE_FALL_LAND, &WorldSession::_HandleMovementOpcode},
|
||||||
|
|
||||||
{MSG_MOVE_TELEPORT_ACK, &WorldSession::_HandleTelePortAckOpcode},
|
{MSG_MOVE_TELEPORT_ACK, &WorldSession::_HandleTelePortAckOpcode},
|
||||||
|
{SMSG_COMPRESSED_UPDATE_OBJECT, &WorldSession::_HandleCompressedUpdateObjectOpcode},
|
||||||
{SMSG_CAST_RESULT, &WorldSession::_HandleCastResultOpcode},
|
{SMSG_CAST_RESULT, &WorldSession::_HandleCastResultOpcode},
|
||||||
|
|
||||||
// table termination
|
// table termination
|
||||||
@ -265,7 +262,8 @@ void WorldSession::_HandleAuthResponseOpcode(WorldPacket& recvPacket)
|
|||||||
pkt.SetOpcode(CMSG_CHAR_ENUM);
|
pkt.SetOpcode(CMSG_CHAR_ENUM);
|
||||||
SendWorldPacket(pkt);
|
SendWorldPacket(pkt);
|
||||||
} else {
|
} 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;
|
recvPacket >> num;
|
||||||
if(num==0){
|
if(num==0){
|
||||||
log("No chars found!\n");
|
logerror("No chars found!");
|
||||||
GetInstance()->SetError();
|
GetInstance()->SetError();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -328,12 +326,12 @@ void WorldSession::_HandleCharEnumOpcode(WorldPacket& recvPacket)
|
|||||||
|
|
||||||
}
|
}
|
||||||
if(!char_found){
|
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();
|
GetInstance()->SetError();
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
log("Entering World with Character \"%s\"...",GetInstance()->GetConf()->charname.c_str());
|
log("Entering World with Character \"%s\"...",GetInstance()->GetConf()->charname.c_str());
|
||||||
_player->Init(plr[i]);
|
// _player->Init(plr[i]);
|
||||||
|
|
||||||
WorldPacket pkt;
|
WorldPacket pkt;
|
||||||
pkt.SetOpcode(CMSG_PLAYER_LOGIN);
|
pkt.SetOpcode(CMSG_PLAYER_LOGIN);
|
||||||
@ -392,19 +390,19 @@ void WorldSession::_HandleMessageChatOpcode(WorldPacket& recvPacket)
|
|||||||
recvPacket >> msglen >> msg;
|
recvPacket >> msglen >> msg;
|
||||||
if (type == CHAT_MSG_SYSTEM)
|
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 )
|
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 )
|
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
|
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)
|
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)
|
void WorldSession::_HandleCastResultOpcode(WorldPacket& recvPacket)
|
||||||
{
|
{
|
||||||
_playerSettings->HandleCastResultOpcode(recvPacket);
|
// _playerSettings->HandleCastResultOpcode(recvPacket);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -47,8 +47,8 @@ public:
|
|||||||
uint64 GetFollowTarget(void) { return _followGUID; }
|
uint64 GetFollowTarget(void) { return _followGUID; }
|
||||||
uint64 GetGuid(void) { return _myGUID; }
|
uint64 GetGuid(void) { return _myGUID; }
|
||||||
Channel *GetChannels(void) { return _channels; }
|
Channel *GetChannels(void) { return _channels; }
|
||||||
Player *GetPlayer(void) { return _player; }
|
// Player *GetPlayer(void) { return _player; }
|
||||||
PlayerSettings *GetPlayerSettings(void) { return _playerSettings; }
|
// PlayerSettings *GetPlayerSettings(void) { return _playerSettings; }
|
||||||
|
|
||||||
|
|
||||||
// CMSGConstructor
|
// CMSGConstructor
|
||||||
@ -81,10 +81,12 @@ private:
|
|||||||
void _HandleTelePortAckOpcode(WorldPacket& recvPacket);
|
void _HandleTelePortAckOpcode(WorldPacket& recvPacket);
|
||||||
void _HandleChannelNotifyOpcode(WorldPacket& recvPacket);
|
void _HandleChannelNotifyOpcode(WorldPacket& recvPacket);
|
||||||
void _HandleCastResultOpcode(WorldPacket& recvPacket);
|
void _HandleCastResultOpcode(WorldPacket& recvPacket);
|
||||||
|
void _HandleCompressedUpdateObjectOpcode(WorldPacket& recvPacket);
|
||||||
|
void _HandleUpdateObjectOpcode(WorldPacket& recvPacket);
|
||||||
|
|
||||||
|
|
||||||
Player *_player; // The connected character
|
//Player *_player; // The connected character
|
||||||
PlayerSettings *_playerSettings; // Settings for the connected character
|
//PlayerSettings *_playerSettings; // Settings for the connected character
|
||||||
|
|
||||||
PseuInstance *_instance;
|
PseuInstance *_instance;
|
||||||
WorldSocket *_socket;
|
WorldSocket *_socket;
|
||||||
|
|||||||
@ -71,7 +71,7 @@ void WorldSocket::OnRead()
|
|||||||
_opcode = hdr.cmd;
|
_opcode = hdr.cmd;
|
||||||
if(_opcode > 800) // no opcode has yet a number over 800
|
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();
|
GetSession()->GetInstance()->SetError();
|
||||||
// if the crypt gets messy its hardly possible to recover it, especially if we dont know
|
// if the crypt gets messy its hardly possible to recover it, especially if we dont know
|
||||||
// the lentgh of the following data part
|
// the lentgh of the following data part
|
||||||
|
|||||||
@ -18,9 +18,11 @@ void log(const char *str, ...)
|
|||||||
if(!str)
|
if(!str)
|
||||||
return;
|
return;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
_log_setcolor(true,GREY);
|
||||||
va_start(ap, str);
|
va_start(ap, str);
|
||||||
vprintf( str, ap );
|
vprintf( str, ap );
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
_log_resetcolor(true);
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
@ -41,9 +43,11 @@ void logdetail(const char *str, ...)
|
|||||||
if(!str || instance->GetConf()->debug < 1)
|
if(!str || instance->GetConf()->debug < 1)
|
||||||
return;
|
return;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
_log_setcolor(true,LCYAN);
|
||||||
va_start(ap, str);
|
va_start(ap, str);
|
||||||
vprintf( str, ap );
|
vprintf( str, ap );
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
_log_resetcolor(true);
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
@ -64,9 +68,85 @@ void logdebug(const char *str, ...)
|
|||||||
if(!str || instance->GetConf()->debug < 2)
|
if(!str || instance->GetConf()->debug < 2)
|
||||||
return;
|
return;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
_log_setcolor(true,LBLUE);
|
||||||
va_start(ap, str);
|
va_start(ap, str);
|
||||||
vprintf( str, ap );
|
vprintf( str, ap );
|
||||||
va_end(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");
|
printf("\n");
|
||||||
|
|
||||||
@ -86,4 +166,90 @@ void log_close()
|
|||||||
{
|
{
|
||||||
fclose(logfile);
|
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<Color_count ?";1":""));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void _log_resetcolor(bool stdout_stream)
|
||||||
|
{
|
||||||
|
#if PLATFORM == PLATFORM_WIN32
|
||||||
|
HANDLE hConsole = GetStdHandle(stdout_stream ? STD_OUTPUT_HANDLE : STD_ERROR_HANDLE );
|
||||||
|
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED );
|
||||||
|
#else
|
||||||
|
fprintf(( stdout_stream ? stdout : stderr ), "\x1b[0m");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
@ -3,11 +3,38 @@
|
|||||||
|
|
||||||
class PseuInstance;
|
class PseuInstance;
|
||||||
|
|
||||||
|
enum Color
|
||||||
|
{
|
||||||
|
BLACK,
|
||||||
|
RED,
|
||||||
|
GREEN,
|
||||||
|
BROWN,
|
||||||
|
BLUE,
|
||||||
|
MAGENTA,
|
||||||
|
CYAN,
|
||||||
|
GREY,
|
||||||
|
YELLOW,
|
||||||
|
LRED,
|
||||||
|
LGREEN,
|
||||||
|
LBLUE,
|
||||||
|
LMAGENTA,
|
||||||
|
LCYAN,
|
||||||
|
WHITE
|
||||||
|
};
|
||||||
|
|
||||||
void log_prepare(char *fn, PseuInstance* p);
|
void log_prepare(char *fn, PseuInstance* p);
|
||||||
void log(const char *str, ...);
|
void log(const char *str, ...);
|
||||||
void logdetail(const char *str, ...);
|
void logdetail(const char *str, ...);
|
||||||
void logdebug(const char *str, ...);
|
void logdebug(const char *str, ...);
|
||||||
|
void logerror(const char *str, ...);
|
||||||
|
void logcritical(const char *str, ...);
|
||||||
|
void logcustom(uint8 loglevel, Color color, const char *str, ...);
|
||||||
void log_close();
|
void log_close();
|
||||||
|
void _log_setcolor(bool,Color);
|
||||||
|
void _log_resetcolor(bool);
|
||||||
|
|
||||||
|
|
||||||
|
const int Color_count = int(WHITE)+1;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -296,6 +296,12 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath=".\Client\World\SharedDefines.h">
|
RelativePath=".\Client\World\SharedDefines.h">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Client\World\UpdateData.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Client\World\UpdateData.h">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\Client\World\UpdateFields.h">
|
RelativePath=".\Client\World\UpdateFields.h">
|
||||||
</File>
|
</File>
|
||||||
|
|||||||
@ -137,6 +137,12 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath=".\shared\tools.h">
|
RelativePath=".\shared\tools.h">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\shared\ZCompressor.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\shared\ZCompressor.h">
|
||||||
|
</File>
|
||||||
<Filter
|
<Filter
|
||||||
Name="Network"
|
Name="Network"
|
||||||
Filter="">
|
Filter="">
|
||||||
|
|||||||
122
src/shared/ZCompressor.cpp
Normal file
122
src/shared/ZCompressor.cpp
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
34
src/shared/ZCompressor.h
Normal file
34
src/shared/ZCompressor.h
Normal file
@ -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
|
||||||
@ -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 <stdio.h>
|
|
||||||
#ifdef _WIN32
|
|
||||||
#pragma warning(disable:4786)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <map>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "../../dep/src/sqlite/sqlite3.h"
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#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
|
|
||||||
|
|
||||||
@ -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 <windows.h>
|
|
||||||
#else
|
|
||||||
#include <pthread.h>
|
|
||||||
#endif
|
|
||||||
#include <string>
|
|
||||||
#include <list>
|
|
||||||
#ifdef WIN32
|
|
||||||
typedef unsigned __int64 uint64_t;
|
|
||||||
typedef __int64 int64_t;
|
|
||||||
#else
|
|
||||||
#include <stdint.h>
|
|
||||||
#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 *> 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
|
|
||||||
@ -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 <string>
|
|
||||||
|
|
||||||
|
|
||||||
#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
|
|
||||||
@ -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 <string>
|
|
||||||
#include <map>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#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<std::string,int>::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
|
|
||||||
|
|
||||||
@ -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 <string>
|
|
||||||
#include <map>
|
|
||||||
#ifdef WIN32
|
|
||||||
typedef unsigned __int64 uint64_t;
|
|
||||||
typedef __int64 int64_t;
|
|
||||||
#else
|
|
||||||
#include <stdint.h>
|
|
||||||
#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<std::string,int> 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
|
|
||||||
@ -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 <stdio.h>
|
|
||||||
#ifdef _WIN32
|
|
||||||
#pragma warning(disable:4786)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <map>
|
|
||||||
#include <time.h>
|
|
||||||
#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
|
|
||||||
|
|
||||||
@ -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
|
|
||||||
@ -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 <syslog.h>
|
|
||||||
|
|
||||||
#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
|
|
||||||
@ -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 <syslog.h>
|
|
||||||
|
|
||||||
|
|
||||||
#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
|
|
||||||
Loading…
x
Reference in New Issue
Block a user