gnuworld/mod.cservice/sqlChannel.cc

352 lines
9.5 KiB
C++

/**
* sqlChannel.cc
*
* Storage class for accessing user information either from the backend
* or internal storage.
*
* 20/12/2000: Greg Sikorski <gte@atomicrevs.demon.co.uk>
* Initial Version.
* 30/12/2000: Moved static SQL data to constants.h --Gte
* Set loadData up to take data from rows other than 0.
*
* 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.
*
* $Id: sqlChannel.cc,v 1.43 2007/08/28 16:10:12 dan_karrels Exp $
*/
#include <sstream>
#include <string>
#include <iostream>
#include <cstring>
#include "ELog.h"
#include "misc.h"
#include "sqlChannel.h"
#include "constants.h"
#include "cservice.h"
#include "cservice_config.h"
#include "dbHandle.h"
const char sqlChannel_h_rcsId[] = __SQLCHANNEL_H ;
const char sqlChannel_cc_rcsId[] = "$Id: sqlChannel.cc,v 1.43 2007/08/28 16:10:12 dan_karrels Exp $" ;
namespace gnuworld
{
using std::string ;
using std::endl ;
using std::stringstream ;
using std::ends ;
const sqlChannel::flagType sqlChannel::F_NOPURGE = 0x00000001 ;
const sqlChannel::flagType sqlChannel::F_SPECIAL = 0x00000002 ;
const sqlChannel::flagType sqlChannel::F_NOREG = 0x00000004 ;
const sqlChannel::flagType sqlChannel::F_NEVREG = 0x00000008 ;
const sqlChannel::flagType sqlChannel::F_SUSPEND = 0x00000010 ;
const sqlChannel::flagType sqlChannel::F_TEMP = 0x00000020 ;
const sqlChannel::flagType sqlChannel::F_CAUTION = 0x00000040 ;
const sqlChannel::flagType sqlChannel::F_VACATION = 0x00000080 ;
const sqlChannel::flagType sqlChannel::F_LOCKED = 0x00000100 ;
const sqlChannel::flagType sqlChannel::F_FLOATLIM = 0x00000200 ;
const sqlChannel::flagType sqlChannel::F_MIA = 0x00000400 ;
const sqlChannel::flagType sqlChannel::F_ALWAYSOP = 0x00010000 ;
const sqlChannel::flagType sqlChannel::F_STRICTOP = 0x00020000 ;
const sqlChannel::flagType sqlChannel::F_NOOP = 0x00040000 ;
const sqlChannel::flagType sqlChannel::F_AUTOTOPIC = 0x00080000 ;
const sqlChannel::flagType sqlChannel::F_OPONLY = 0x00100000 ; // Deprecated
const sqlChannel::flagType sqlChannel::F_AUTOJOIN = 0x00200000 ;
const sqlChannel::flagType sqlChannel::F_NOFORCE = 0x00400000 ; // Reserved for use by Planetarion.
const sqlChannel::flagType sqlChannel::F_NOVOICE = 0x00800000 ;
const sqlChannel::flagType sqlChannel::F_NOTAKE = 0x01000000 ;
const sqlChannel::flagType sqlChannel::F_FLOODPRO = 0x02000000 ;
const int sqlChannel::EV_MISC = 1 ;
const int sqlChannel::EV_JOIN = 2 ;
const int sqlChannel::EV_PART = 3 ;
const int sqlChannel::EV_OPERJOIN = 4 ;
const int sqlChannel::EV_OPERPART = 5 ;
const int sqlChannel::EV_FORCE = 6 ;
const int sqlChannel::EV_REGISTER = 7 ;
const int sqlChannel::EV_PURGE = 8 ;
/* Manually added Comment */
const int sqlChannel::EV_COMMENT = 9 ;
const int sqlChannel::EV_REMOVEALL = 10 ;
const int sqlChannel::EV_IDLE = 11 ;
/* other events */
const int sqlChannel::EV_MGRCHANGE = 12 ;
const int sqlChannel::EV_ADMREJECT = 13 ;
const int sqlChannel::EV_WITHDRAW = 14 ;
const int sqlChannel::EV_NEWAPP = 15 ;
const int sqlChannel::EV_NONSUPPORT = 16 ;
const int sqlChannel::EV_ADMREVIEW = 17 ;
const int sqlChannel::EV_CLRREVIEW = 18 ;
const int sqlChannel::EV_SUSPEND = 19 ;
const int sqlChannel::EV_UNSUSPEND = 20 ;
const int sqlChannel::EV_NOFORCE = 21 ;
const int sqlChannel::EV_TAKE = 22 ;
sqlChannel::sqlChannel(dbHandle* _SQLDb)
: id(0),
name(),
flags(0),
mass_deop_pro(3),
flood_pro(0),
url(),
description(),
comment(),
keywords(),
welcome(),
registered_ts(0),
channel_ts(0),
channel_mode(),
userflags(0),
last_topic(0),
inChan(false),
last_used(0),
limit_offset(3),
limit_period(20),
last_limit_check(0),
last_flood(0),
limit_grace(2),
limit_max(0),
max_bans(0),
no_take(0),
SQLDb( _SQLDb )
{
}
bool sqlChannel::loadData(const string& channelName)
{
/*
* With the open database handle 'SQLDb', retrieve information about
* 'channelName' and fill our member variables.
*/
#ifdef LOG_DEBUG
elog << "sqlChannel::loadData> Attempting to load data for"
<< " channel-name: "
<< channelName
<< endl;
#endif
stringstream queryString ;
queryString << "SELECT "
<< sql::channel_fields
<< " FROM channels WHERE registered_ts <> 0"
<< " AND lower(name) = '"
<< escapeSQLChars(string_lower(channelName))
<< "'"
<< ends ;
#ifdef LOG_SQL
elog << "sqlChannel::loadData> "
<< queryString.str().c_str()
<< endl;
#endif
if( SQLDb->Exec(queryString, true ) )
//if( PGRES_TUPLES_OK == status )
{
/*
* If the channel doesn't exist, we won't get any rows back.
*/
if(SQLDb->Tuples() < 1)
{
return (false);
}
setAllMembers(0);
return (true);
}
return (false);
}
bool sqlChannel::loadData(int channelID)
{
/*
* With the open database handle 'SQLDb', retrieve information about
* 'channelID' and fill our member variables.
*/
#ifdef LOG_DEBUG
elog << "sqlChannel::loadData> Attempting to load data for "
<< "channel-id: "
<< channelID
<< endl;
#endif
stringstream queryString;
queryString << "SELECT "
<< sql::channel_fields
<< " FROM channels WHERE registered_ts <> 0 AND id = "
<< channelID
<< ends ;
#ifdef LOG_SQL
elog << "sqlChannel::loadData> "
<< queryString.str().c_str()
<< endl;
#endif
if( SQLDb->Exec(queryString, true ) )
//if( PGRES_TUPLES_OK == status )
{
/*
* If the channel doesn't exist, we won't get any rows back.
*/
if(SQLDb->Tuples() < 1)
{
return (false);
}
setAllMembers(0);
return (true);
}
return (false);
}
void sqlChannel::setAllMembers(int row)
{
/*
* Support function for both loadData's.
* Assumes SQLDb contains a valid results set for all channel information.
*/
id = atoi(SQLDb->GetValue(row, 0).c_str());
name = SQLDb->GetValue(row, 1);
flags = atoi(SQLDb->GetValue(row, 2).c_str());
mass_deop_pro = atoi(SQLDb->GetValue(row,3).c_str());
flood_pro = atoi(SQLDb->GetValue(row,4).c_str());
url = SQLDb->GetValue(row,5);
description = SQLDb->GetValue(row,6);
comment = SQLDb->GetValue(row,7);
keywords = SQLDb->GetValue(row,8);
registered_ts = atoi(SQLDb->GetValue(row,9).c_str());
channel_ts = atoi(SQLDb->GetValue(row,10).c_str());
channel_mode = SQLDb->GetValue(row,11);
userflags = atoi(SQLDb->GetValue(row,12));
last_updated = atoi(SQLDb->GetValue(row,13));
limit_offset = atoi(SQLDb->GetValue(row,14));
limit_period = atoi(SQLDb->GetValue(row,15));
limit_grace = atoi(SQLDb->GetValue(row,16));
limit_max = atoi(SQLDb->GetValue(row,17));
welcome = SQLDb->GetValue(row,18);
max_bans = atoi(SQLDb->GetValue(row,19));
no_take = atoi(SQLDb->GetValue(row,20));
}
bool sqlChannel::commit()
{
/*
* Build an SQL statement to commit the transient data in this storage class
* back into the database.
*/
static const char* queryHeader = "UPDATE channels ";
static const char* queryCondition = "WHERE id = ";
stringstream queryString;
queryString << queryHeader
<< "SET flags = " << flags << ", "
<< "mass_deop_pro = " << mass_deop_pro << ", "
<< "flood_pro = " << flood_pro << ", "
<< "url = '" << escapeSQLChars(url) << "', "
<< "keywords = '" << escapeSQLChars(keywords) << "', "
<< "welcome = '" << escapeSQLChars(welcome) << "', "
<< "registered_ts = " << registered_ts << ", "
<< "channel_ts = " << channel_ts << ", "
<< "channel_mode = '" << escapeSQLChars(channel_mode) << "', "
<< "userflags = " << userflags << ", "
<< "last_updated = date_part('epoch', CURRENT_TIMESTAMP)::int, "
<< "limit_offset = " << limit_offset << ", "
<< "limit_period = " << limit_period << ", "
<< "limit_grace = " << limit_grace << ", "
<< "limit_max = " << limit_max << ", "
<< "max_bans = " << max_bans << ", "
<< "description = '" << escapeSQLChars(description) << "', "
<< "comment = '" << escapeSQLChars(comment) << "', "
<< "no_take = " << no_take << " "
<< queryCondition << id
<< ends;
#ifdef LOG_SQL
elog << "sqlChannel::commit> "
<< queryString.str().c_str()
<< endl;
#endif
if( !SQLDb->Exec(queryString ) )
//if( PGRES_COMMAND_OK != status )
{
elog << "sqlChannel::commit> Something went wrong: "
<< SQLDb->ErrorMessage()
<< endl;
return false;
}
return true;
}
bool sqlChannel::insertRecord()
{
static const char* queryHeader = "INSERT INTO channels (name, flags, registered_ts, channel_ts, channel_mode, last_updated) VALUES (";
stringstream queryString;
queryString << queryHeader
<< "'" << escapeSQLChars(name) << "', "
<< flags << ", "
<< registered_ts << ", "
<< channel_ts << ", '"
<< escapeSQLChars(channel_mode) << "', "
<< "date_part('epoch', CURRENT_TIMESTAMP)::int)"
<< ends;
#ifdef LOG_SQL
elog << "sqlChannel::insertRecord> "
<< queryString.str().c_str()
<< endl;
#endif
if( !SQLDb->Exec(queryString ) )
//if( PGRES_COMMAND_OK != status )
{
// TODO: Log to msgchan here.
elog << "sqlChannel::commit> Something went wrong: "
<< SQLDb->ErrorMessage()
<< endl;
return false ;
}
return true;
}
sqlChannel::~sqlChannel()
{
/* TODO: Clean up bans */
}
} // Namespace gnuworld