OPTION(DO_CHARSET_CONVERSION "Do charset conversion on sent messages to UTF-8. This requires libiconv." ON)\r
OPTION(I_HAVE_READ_THE_README "I have fully read and understood the readme.txt." OFF)\r
OPTION(ALTERNATE_CAPTCHA "Use alternate captcha. This requires the FreeImage library." OFF)\r
+OPTION(QUERY_LOG "Log all database queries made by FMS." OFF)\r
\r
SET(FMS_SRC\r
src/base64.cpp\r
src/http/pages/recentlyaddedpage.cpp\r
src/http/pages/showcaptchapage.cpp\r
src/http/pages/showimagepage.cpp\r
+src/http/pages/showpendingmessagepage.cpp\r
src/http/pages/versioninfopage.cpp\r
src/nntp/extensiontrust.cpp\r
src/nntp/nntpconnection.cpp\r
IF(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")\r
INCLUDE_DIRECTORIES(AFTER /usr/local/include)\r
ENDIF(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")\r
+\r
+IF(QUERY_LOG)\r
+ ADD_DEFINITIONS(-DQUERY_LOG)\r
+ENDIF(QUERY_LOG)\r
class Board:public ILogger,public IDatabase\r
{\r
public:\r
- Board();\r
- Board(const long boardid);\r
- Board(const std::string &boardname);\r
- Board(const long boardid, const std::string &boardname, const std::string &boarddescription, const std::string datecreated, const long lowmessageid, const long highmessageid, const long messagecount, const bool savereceivedmessages, const std::string &addedmethod);\r
+ Board(SQLite3DB::DB *db);\r
+ Board(SQLite3DB::DB *db, const long boardid);\r
+ Board(SQLite3DB::DB *db, const std::string &boardname);\r
+ Board(SQLite3DB::DB *db, const long boardid, const std::string &boardname, const std::string &boarddescription, const std::string datecreated, const long lowmessageid, const long highmessageid, const long messagecount, const bool savereceivedmessages, const std::string &addedmethod);\r
\r
const bool Load(const long boardid);\r
const bool Load(const std::string &boardname);\r
class BoardList:public std::vector<Board>,public ILogger,public IDatabase\r
{\r
public:\r
+ BoardList(SQLite3DB::DB *db):IDatabase(db) {}\r
\r
/**\r
\brief Loads all known boards\r
#ifndef _sqlite3db_\r
#define _sqlite3db_\r
\r
-#include <Poco/Mutex.h>\r
#include <sqlite3.h>\r
#include <string>\r
#include "../sqlite3db.h"\r
-#include "../../threadwrapper/singleton.h"\r
\r
#if SQLITE_VERSION_NUMBER<3006006\r
#error "Your version of SQLite is too old! 3.6.6.2 or later is required."\r
namespace SQLite3DB\r
{\r
\r
-class DB:public Singleton<DB>\r
+class DB\r
{\r
public:\r
DB();\r
\r
sqlite3 *GetDB() { return m_db; }\r
\r
- Poco::FastMutex m_mutex; // public so that recordset and statment can lock this mutex themselves\r
-\r
private:\r
void Initialize();\r
\r
\r
#include "sqlite3db.h"\r
\r
+#include <Poco/Mutex.h>\r
+\r
#include <vector>\r
#include <map>\r
\r
long m_lastinsertrowid;\r
\r
static std::map<sqlite3_stmt *, long> m_statementcount;\r
+ static Poco::FastMutex m_mutex; // protect all access to m_statementcount\r
\r
}; //class\r
\r
#ifndef _dbconversions_\r
#define _dbconversions_\r
\r
-void ConvertDB0100To0101();\r
-void ConvertDB0101To0103();\r
-void ConvertDB0103To0104();\r
-void ConvertDB0104To0105();\r
-void ConvertDB0105To0106();\r
-void ConvertDB0106To0107();\r
-void ConvertDB0107To0108();\r
-void ConvertDB0108To0109();\r
-void ConvertDB0109To0110();\r
-void ConvertDB0110To0111();\r
-void ConvertDB0111To0112();\r
-void ConvertDB0112To0113();\r
-void ConvertDB0113To0114();\r
+#include "db/sqlite3db.h"\r
+\r
+void ConvertDB0100To0101(SQLite3DB::DB *db);\r
+void ConvertDB0101To0103(SQLite3DB::DB *db);\r
+void ConvertDB0103To0104(SQLite3DB::DB *db);\r
+void ConvertDB0104To0105(SQLite3DB::DB *db);\r
+void ConvertDB0105To0106(SQLite3DB::DB *db);\r
+void ConvertDB0106To0107(SQLite3DB::DB *db);\r
+void ConvertDB0107To0108(SQLite3DB::DB *db);\r
+void ConvertDB0108To0109(SQLite3DB::DB *db);\r
+void ConvertDB0109To0110(SQLite3DB::DB *db);\r
+void ConvertDB0110To0111(SQLite3DB::DB *db);\r
+void ConvertDB0111To0112(SQLite3DB::DB *db);\r
+void ConvertDB0112To0113(SQLite3DB::DB *db);\r
+void ConvertDB0113To0114(SQLite3DB::DB *db);\r
+void ConvertDB0114To0115(SQLite3DB::DB *db);\r
\r
// TODO remove sometime after 0.1.17\r
-void FixCapitalBoardNames();\r
+void FixCapitalBoardNames(SQLite3DB::DB *db);\r
\r
#endif // _dbconversions_\r
\r
#include "threadwrapper/cancelablerunnable.h"\r
#include "ilogger.h"\r
-#include "idatabase.h"\r
+#include "ithreaddatabase.h"\r
\r
#include <Poco/DateTime.h>\r
\r
-class DBMaintenanceThread:public CancelableRunnable,public ILogger,public IDatabase\r
+class DBMaintenanceThread:public CancelableRunnable,public ILogger,public IThreadDatabase\r
{\r
public:\r
DBMaintenanceThread();\r
\r
#include <string>\r
\r
+#include "db/sqlite3db.h"\r
+\r
// opens database and creates tables and initial inserts if necessary\r
-void SetupDB();\r
+void SetupDB(SQLite3DB::DB *db);\r
// verifies DB isn't corrupt\r
-const bool VerifyDB();\r
+const bool VerifyDB(SQLite3DB::DB *db);\r
\r
// returns result of PRAGMA integrity_check\r
-const std::string TestDBIntegrity();\r
+const std::string TestDBIntegrity(SQLite3DB::DB *db);\r
\r
#endif // _dbsetup_\r
#define _fmsapp_\r
\r
#include "threadwrapper/threadedexecutor.h"\r
+#include "ithreaddatabase.h"\r
\r
#include <Poco/Util/ServerApplication.h>\r
\r
#include <map>\r
\r
// main FMS application class\r
-class FMSApp:public Poco::Util::ServerApplication\r
+class FMSApp:public Poco::Util::ServerApplication,public IThreadDatabase\r
{\r
public:\r
FMSApp();\r
class BoardListInserter:public IIndexInserter<long>\r
{\r
public:\r
- BoardListInserter();\r
- BoardListInserter(FCPv2::Connection *fcp);\r
+ BoardListInserter(SQLite3DB::DB *db);\r
+ BoardListInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
private:\r
void Initialize();\r
class BoardListRequester:public IIndexRequester<long>\r
{\r
public:\r
- BoardListRequester();\r
- BoardListRequester(FCPv2::Connection *fcp);\r
+ BoardListRequester(SQLite3DB::DB *db);\r
+ BoardListRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
private:\r
void Initialize();\r
\brief Gets the string representing this message in FCP\r
\r
This string is what is actually sent/received from the node through FCP\r
+\r
+ \return The FCP message string\r
*/\r
const std::string GetFCPString() const;\r
\r
/**\r
\brief Construct connection with an existing socket\r
\r
- \param sock An existing socket connection to a Freenet node\r
+ \param sock An existing open socket connection to a Freenet node\r
*/\r
Connection(const int sock);\r
/**\r
- \brief Default constructor\r
+ \brief Default destructor\r
\r
- The deconstructor will close the connection if it is open\r
+ The destructor will close the connection if it is open\r
*/\r
~Connection();\r
\r
\brief Waits until the receive buffer contains a specified number of bytes\r
\r
This will continuously call Update until either the specific number of bytes have been received,\r
- or the connection becomes disconnected\r
+ or the connection becomes disconnected.\r
\r
\param ms The number of milliseconds for each call to Update\r
\param len The number of bytes to wait for\r
class FileInserter:public IIndexInserter<long>\r
{\r
public:\r
- FileInserter();\r
- FileInserter(FCPv2::Connection *fcp);\r
+ FileInserter(SQLite3DB::DB *db);\r
+ FileInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
private:\r
void Initialize();\r
class FMSVersionRequester:public IFreenetRegistrable,public IFCPConnected,public IFCPMessageHandler,public IPeriodicProcessor,public IDatabase,public ILogger\r
{\r
public:\r
- FMSVersionRequester();\r
- FMSVersionRequester(FCPv2::Connection *fcp);\r
+ FMSVersionRequester(SQLite3DB::DB *db);\r
+ FMSVersionRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
void FCPConnected() {}\r
void FCPDisconnected() {}\r
#define _freenetmasterthread_\r
\r
#include "../ilogger.h"\r
+#include "../ithreaddatabase.h"\r
#include "ifreenetregistrable.h"\r
#include "ifcpmessagehandler.h"\r
#include "ifcpconnected.h"\r
// forward declaration\r
class IFreenetRegistrable;\r
\r
-class FreenetMasterThread:public CancelableRunnable,public ILogger, public IFCPMessageHandler\r
+class FreenetMasterThread:public CancelableRunnable,public ILogger, public IFCPMessageHandler, public IThreadDatabase\r
{\r
public:\r
FreenetMasterThread();\r
class IdentityInserter:public IFreenetRegistrable,public IFCPConnected,public IFCPMessageHandler,public IPeriodicProcessor,public IDatabase,public ILogger\r
{\r
public:\r
- IdentityInserter();\r
- IdentityInserter(FCPv2::Connection *fcp);\r
+ IdentityInserter(SQLite3DB::DB *db);\r
+ IdentityInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
void FCPConnected();\r
void FCPDisconnected();\r
class IdentityIntroductionInserter:public IFreenetRegistrable,public IFCPConnected,public IFCPMessageHandler,public IPeriodicProcessor,public IDatabase,public ILogger\r
{\r
public:\r
- IdentityIntroductionInserter();\r
- IdentityIntroductionInserter(FCPv2::Connection *fcp);\r
+ IdentityIntroductionInserter(SQLite3DB::DB *db);\r
+ IdentityIntroductionInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
void FCPConnected();\r
void FCPDisconnected();\r
class IdentityIntroductionRequester:public IFreenetRegistrable,public IFCPConnected,public IFCPMessageHandler,public IPeriodicProcessor,public IDatabase,public ILogger\r
{\r
public:\r
- IdentityIntroductionRequester();\r
- IdentityIntroductionRequester(FCPv2::Connection *fcp);\r
+ IdentityIntroductionRequester(SQLite3DB::DB *db);\r
+ IdentityIntroductionRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
void FCPDisconnected();\r
void FCPConnected();\r
class IdentityRequester:public IIndexRequester<long>\r
{\r
public:\r
- IdentityRequester();\r
- IdentityRequester(FCPv2::Connection *fcp);\r
+ IdentityRequester(SQLite3DB::DB *db);\r
+ IdentityRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
private:\r
virtual void Initialize();\r
class IIndexInserter:public IFreenetRegistrable,public IFCPConnected,public IFCPMessageHandler,public IPeriodicProcessor,public IDatabase,public ILogger\r
{\r
public:\r
- IIndexInserter();\r
- IIndexInserter(FCPv2::Connection *fcp);\r
+ IIndexInserter(SQLite3DB::DB *db);\r
+ IIndexInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
virtual ~IIndexInserter() {}\r
\r
virtual void FCPConnected();\r
};\r
\r
template <class IDTYPE>\r
-IIndexInserter<IDTYPE>::IIndexInserter()\r
+IIndexInserter<IDTYPE>::IIndexInserter(SQLite3DB::DB *db):IDatabase(db)\r
{\r
InitializeIIndexInserter();\r
}\r
\r
template <class IDTYPE>\r
-IIndexInserter<IDTYPE>::IIndexInserter(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
+IIndexInserter<IDTYPE>::IIndexInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp):IDatabase(db),IFCPConnected(fcp)\r
{\r
InitializeIIndexInserter();\r
}\r
template <class IDTYPE>\r
void IIndexInserter<IDTYPE>::InitializeIIndexInserter()\r
{\r
+ Option option(m_db);\r
m_fcpuniquename="";\r
- Option::Instance()->Get("MessageBase",m_messagebase);\r
+ option.Get("MessageBase",m_messagebase);\r
m_lastchecked=Poco::Timestamp();\r
}\r
\r
class IIndexRequester:public IFreenetRegistrable,public IFCPConnected,public IFCPMessageHandler,public IPeriodicProcessor,public IDatabase,public ILogger\r
{\r
public:\r
- IIndexRequester();\r
- IIndexRequester(FCPv2::Connection *fcp);\r
+ IIndexRequester(SQLite3DB::DB *db);\r
+ IIndexRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
virtual ~IIndexRequester() {}\r
\r
virtual void FCPConnected();\r
};\r
\r
template <class IDTYPE>\r
-IIndexRequester<IDTYPE>::IIndexRequester()\r
+IIndexRequester<IDTYPE>::IIndexRequester(SQLite3DB::DB *db):IDatabase(db)\r
{\r
InitializeIIndexRequester();\r
}\r
\r
template <class IDTYPE>\r
-IIndexRequester<IDTYPE>::IIndexRequester(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
+IIndexRequester<IDTYPE>::IIndexRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp):IDatabase(db),IFCPConnected(fcp)\r
{\r
InitializeIIndexRequester();\r
}\r
{\r
m_maxrequests=-1;\r
m_fcpuniquename="";\r
+ Option option(m_db);\r
\r
- Option::Instance()->Get("MessageBase",m_messagebase);\r
+ option.Get("MessageBase",m_messagebase);\r
m_tempdate=Poco::Timestamp();\r
m_lastreceived=Poco::Timestamp();\r
m_lastpopulated=Poco::Timestamp();\r
class InactiveMessageListRequester:public MessageListRequester\r
{\r
public:\r
- InactiveMessageListRequester();\r
- InactiveMessageListRequester(FCPv2::Connection *fcp);\r
+ InactiveMessageListRequester(SQLite3DB::DB *db);\r
+ InactiveMessageListRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
private:\r
virtual void Initialize();\r
class IntroductionPuzzleInserter:public IIndexInserter<long>\r
{\r
public:\r
- IntroductionPuzzleInserter();\r
- IntroductionPuzzleInserter(FCPv2::Connection *fcp);\r
+ IntroductionPuzzleInserter(SQLite3DB::DB *db);\r
+ IntroductionPuzzleInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
private:\r
void Initialize();\r
class IntroductionPuzzleRequester:public IIndexRequester<long>\r
{\r
public:\r
- IntroductionPuzzleRequester();\r
- IntroductionPuzzleRequester(FCPv2::Connection *fcp);\r
+ IntroductionPuzzleRequester(SQLite3DB::DB *db);\r
+ IntroductionPuzzleRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
private:\r
void Initialize();\r
class MessageInserter:public IIndexInserter<std::string>\r
{\r
public:\r
- MessageInserter();\r
- MessageInserter(FCPv2::Connection *fcp);\r
+ MessageInserter(SQLite3DB::DB *db);\r
+ MessageInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
private:\r
void Initialize();\r
class MessageListInserter:public IIndexInserter<long>\r
{\r
public:\r
- MessageListInserter();\r
- MessageListInserter(FCPv2::Connection *fcp);\r
+ MessageListInserter(SQLite3DB::DB *db);\r
+ MessageListInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
private:\r
void Initialize();\r
class MessageListRequester:public IIndexRequester<long>\r
{\r
public:\r
- MessageListRequester();\r
- MessageListRequester(FCPv2::Connection *fcp);\r
+ MessageListRequester(SQLite3DB::DB *db);\r
+ MessageListRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
private:\r
virtual void Initialize();\r
class MessageRequester:public IIndexRequester<std::string>\r
{\r
public:\r
- MessageRequester();\r
- MessageRequester(FCPv2::Connection *fcp);\r
+ MessageRequester(SQLite3DB::DB *db);\r
+ MessageRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
private:\r
void Initialize();\r
class SiteInserter:public IIndexInserter<long>\r
{\r
public:\r
- SiteInserter();\r
- SiteInserter(FCPv2::Connection *fcp);\r
+ SiteInserter(SQLite3DB::DB *db);\r
+ SiteInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
private:\r
void Initialize();\r
class TrustListInserter:public IFreenetRegistrable,public IFCPConnected,public IFCPMessageHandler,public IPeriodicProcessor,public IDatabase,public ILogger\r
{\r
public:\r
- TrustListInserter();\r
- TrustListInserter(FCPv2::Connection *fcp);\r
+ TrustListInserter(SQLite3DB::DB *db);\r
+ TrustListInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
void FCPConnected();\r
void FCPDisconnected();\r
class TrustListRequester:public IIndexRequester<long>//public IFreenetRegistrable,public IFCPConnected,public IFCPMessageHandler,public IPeriodicProcessor,public IDatabase,public ILogger\r
{\r
public:\r
- TrustListRequester();\r
- TrustListRequester(FCPv2::Connection *fcp);\r
+ TrustListRequester(SQLite3DB::DB *db);\r
+ TrustListRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
private:\r
void Initialize();\r
class UnkeyedIDCreator:public IFreenetRegistrable,public IFCPConnected,public IFCPMessageHandler,public IDatabase,public IPeriodicProcessor,public ILogger\r
{\r
public:\r
- UnkeyedIDCreator();\r
- UnkeyedIDCreator(FCPv2::Connection *fcp);\r
+ UnkeyedIDCreator(SQLite3DB::DB *db);\r
+ UnkeyedIDCreator(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
const bool HandleMessage(FCPv2::Message &message);\r
\r
class UnknownIdentityRequester:public IdentityRequester\r
{\r
public:\r
- UnknownIdentityRequester();\r
- UnknownIdentityRequester(FCPv2::Connection *fcp);\r
+ UnknownIdentityRequester(SQLite3DB::DB *db);\r
+ UnknownIdentityRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
\r
private:\r
void Initialize();\r
\r
#define VERSION_MAJOR "0"\r
#define VERSION_MINOR "3"\r
-#define VERSION_RELEASE "28"\r
+#define VERSION_RELEASE "29"\r
#define FMS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_RELEASE\r
-#define FMS_FREESITE_USK "USK@0npnMrqZNKRCRoGojZV93UNHCMN-6UU3rRSAmP6jNLE,~BG-edFtdCC1cSH4O3BWdeIYa8Sw5DfyrSV-TKdO5ec,AQACAAE/fms/90/"\r
-#define FMS_VERSION_EDITION "30"\r
+#define FMS_FREESITE_USK "USK@0npnMrqZNKRCRoGojZV93UNHCMN-6UU3rRSAmP6jNLE,~BG-edFtdCC1cSH4O3BWdeIYa8Sw5DfyrSV-TKdO5ec,AQACAAE/fms/91/"\r
+#define FMS_VERSION_EDITION "31"\r
\r
typedef Poco::ScopedLock<Poco::FastMutex> Guard;\r
\r
#include "ipagehandler.h"\r
#include "../ipaddressacl.h"\r
#include "../ilogger.h"\r
+#include "../idatabase.h"\r
\r
#include <Poco/Net/HTTPRequestHandlerFactory.h>\r
#include <Poco/Net/HTTPServerRequest.h>\r
\r
-class FMSHTTPRequestHandlerFactory:public Poco::Net::HTTPRequestHandlerFactory,public ILogger\r
+class FMSHTTPRequestHandlerFactory:public Poco::Net::HTTPRequestHandlerFactory,public ILogger,public IDatabase\r
{\r
public:\r
- FMSHTTPRequestHandlerFactory();\r
+ FMSHTTPRequestHandlerFactory(SQLite3DB::DB *db);\r
~FMSHTTPRequestHandlerFactory();\r
\r
Poco::Net::HTTPRequestHandler *createRequestHandler(const Poco::Net::HTTPServerRequest &request);\r
\r
#include "../threadwrapper/cancelablerunnable.h"\r
#include "../ilogger.h"\r
-#include "../idatabase.h"\r
+#include "../ithreaddatabase.h"\r
\r
#include <cstdlib>\r
\r
-class HTTPThread:public CancelableRunnable,public ILogger, public IDatabase\r
+class HTTPThread:public CancelableRunnable,public ILogger, public IThreadDatabase\r
{\r
public:\r
HTTPThread();\r
#define _ipagehandler_\r
\r
#include "../ilogger.h"\r
+#include "../idatabase.h"\r
\r
#include <Poco/Net/HTTPRequestHandler.h>\r
#include <Poco/Net/HTTPServerRequest.h>\r
#include <map>\r
#include <vector>\r
\r
-class IPageHandler:public Poco::Net::HTTPRequestHandler,public ILogger\r
+class IPageHandler:public Poco::Net::HTTPRequestHandler,public ILogger,public IDatabase\r
{\r
public:\r
- IPageHandler() {}\r
- IPageHandler(const std::string &templatestr, const std::string &pagename):m_template(templatestr),m_pagename(pagename) { }\r
+ IPageHandler(SQLite3DB::DB *db):IDatabase(db) {}\r
+ IPageHandler(SQLite3DB::DB *db, const std::string &templatestr, const std::string &pagename):IDatabase(db),m_template(templatestr),m_pagename(pagename) { }\r
virtual ~IPageHandler() {}\r
virtual const bool WillHandleURI(const std::string &uri);\r
\r
#define _addpeerpage_\r
\r
#include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
\r
-class AddPeerPage:public IPageHandler,public IDatabase\r
+class AddPeerPage:public IPageHandler\r
{\r
public:\r
- AddPeerPage(const std::string &templatestr):IPageHandler(templatestr,"addpeer.htm") {}\r
+ AddPeerPage(SQLite3DB::DB *db, const std::string &templatestr):IPageHandler(db,templatestr,"addpeer.htm") {}\r
\r
- IPageHandler *New() { return new AddPeerPage(m_template); }\r
+ IPageHandler *New() { return new AddPeerPage(m_db,m_template); }\r
\r
private:\r
const bool WillHandleURI(const std::string &uri);\r
#define _announceidentitypage_\r
\r
#include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
\r
-class AnnounceIdentityPage:public IPageHandler,public IDatabase\r
+class AnnounceIdentityPage:public IPageHandler\r
{\r
public:\r
- AnnounceIdentityPage(const std::string &templatestr):IPageHandler(templatestr,"announceidentity.htm") {}\r
+ AnnounceIdentityPage(SQLite3DB::DB *db, const std::string &templatestr):IPageHandler(db,templatestr,"announceidentity.htm") {}\r
\r
- IPageHandler *New() { return new AnnounceIdentityPage(m_template); }\r
+ IPageHandler *New() { return new AnnounceIdentityPage(m_db,m_template); }\r
\r
private:\r
const bool WillHandleURI(const std::string &uri);\r
#define _boardspage_\r
\r
#include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
\r
-class BoardsPage:public IPageHandler,public IDatabase\r
+class BoardsPage:public IPageHandler\r
{\r
public:\r
- BoardsPage(const std::string &templatestr):IPageHandler(templatestr,"boards.htm") {}\r
+ BoardsPage(SQLite3DB::DB *db, const std::string &templatestr):IPageHandler(db,templatestr,"boards.htm") {}\r
\r
- IPageHandler *New() { return new BoardsPage(m_template); }\r
+ IPageHandler *New() { return new BoardsPage(m_db,m_template); }\r
\r
private:\r
const bool WillHandleURI(const std::string &uri);\r
class ConfirmPage:public IPageHandler\r
{\r
public:\r
- ConfirmPage(const std::string &templatestr):IPageHandler(templatestr,"confirm.htm") {}\r
+ ConfirmPage(SQLite3DB::DB *db, const std::string &templatestr):IPageHandler(db,templatestr,"confirm.htm") {}\r
\r
- IPageHandler *New() { return new ConfirmPage(m_template); }\r
+ IPageHandler *New() { return new ConfirmPage(m_db,m_template); }\r
\r
private:\r
const bool WillHandleURI(const std::string &uri);\r
#define _controlboardpage_\r
\r
#include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
\r
-class ControlBoardPage:public IPageHandler,public IDatabase\r
+class ControlBoardPage:public IPageHandler\r
{\r
public:\r
- ControlBoardPage(const std::string &templatestr):IPageHandler(templatestr,"controlboard.htm") {}\r
+ ControlBoardPage(SQLite3DB::DB *db, const std::string &templatestr):IPageHandler(db,templatestr,"controlboard.htm") {}\r
\r
- IPageHandler *New() { return new ControlBoardPage(m_template); }\r
+ IPageHandler *New() { return new ControlBoardPage(m_db,m_template); }\r
\r
private:\r
const bool WillHandleURI(const std::string &uri);\r
#define _createidentitypage_\r
\r
#include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
\r
-class CreateIdentityPage:public IPageHandler,public IDatabase\r
+class CreateIdentityPage:public IPageHandler\r
{\r
public:\r
- CreateIdentityPage(const std::string &templatestr):IPageHandler(templatestr,"createidentity.htm") {}\r
+ CreateIdentityPage(SQLite3DB::DB *db, const std::string &templatestr):IPageHandler(db,templatestr,"createidentity.htm") {}\r
\r
- IPageHandler *New() { return new CreateIdentityPage(m_template); }\r
+ IPageHandler *New() { return new CreateIdentityPage(m_db,m_template); }\r
\r
private:\r
const bool WillHandleURI(const std::string &uri);\r
#define _execquerypage_\r
\r
#include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
\r
-class ExecQueryPage:public IPageHandler,public IDatabase\r
+class ExecQueryPage:public IPageHandler\r
{\r
public:\r
- ExecQueryPage(const std::string &templatestr):IPageHandler(templatestr,"execquery.htm") {}\r
+ ExecQueryPage(SQLite3DB::DB *db, const std::string &templatestr):IPageHandler(db,templatestr,"execquery.htm") {}\r
\r
- IPageHandler *New() { return new ExecQueryPage(m_template); }\r
+ IPageHandler *New() { return new ExecQueryPage(m_db,m_template); }\r
\r
private:\r
const bool WillHandleURI(const std::string &uri);\r
class ForumCreatePostPage:public ForumPage\r
{\r
public:\r
- ForumCreatePostPage(const std::string &templatestr):ForumPage(templatestr,"forumcreatepost.htm") {}\r
+ ForumCreatePostPage(SQLite3DB::DB *db, const std::string &templatestr):ForumPage(db,templatestr,"forumcreatepost.htm") {}\r
\r
- IPageHandler *New() { return new ForumCreatePostPage(m_template); }\r
+ IPageHandler *New() { return new ForumCreatePostPage(m_db,m_template); }\r
private:\r
const std::string GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars);\r
\r
class ForumMainPage:public ForumPage\r
{\r
public:\r
- ForumMainPage(const std::string &templatestr):ForumPage(templatestr,"forummain.htm") {}\r
+ ForumMainPage(SQLite3DB::DB *db,const std::string &templatestr):ForumPage(db,templatestr,"forummain.htm") {}\r
\r
- IPageHandler *New() { return new ForumMainPage(m_template); }\r
+ IPageHandler *New() { return new ForumMainPage(m_db,m_template); }\r
\r
private:\r
const std::string GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars);\r
#define _forumpage_\r
\r
#include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
\r
-class ForumPage:public IPageHandler,public IDatabase\r
+class ForumPage:public IPageHandler\r
{\r
public:\r
- ForumPage(const std::string &templatestr, const std::string &pagename):IPageHandler(templatestr,pagename) {}\r
+ ForumPage(SQLite3DB::DB *db, const std::string &templatestr, const std::string &pagename):IPageHandler(db,templatestr,pagename) {}\r
\r
virtual IPageHandler *New()=0; // returns a new instance of the object\r
\r
class ForumThreadsPage:public ForumPage\r
{\r
public:\r
- ForumThreadsPage(const std::string &templatestr):ForumPage(templatestr,"forumthreads.htm") {}\r
+ ForumThreadsPage(SQLite3DB::DB *db, const std::string &templatestr):ForumPage(db,templatestr,"forumthreads.htm") {}\r
\r
- IPageHandler *New() { return new ForumThreadsPage(m_template); }\r
+ IPageHandler *New() { return new ForumThreadsPage(m_db,m_template); }\r
\r
private:\r
const std::string GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars);\r
class ForumViewThreadPage:public ForumPage\r
{\r
public:\r
- ForumViewThreadPage(const std::string &templatestr):ForumPage(templatestr,"forumviewthread.htm") {}\r
+ ForumViewThreadPage(SQLite3DB::DB *db,const std::string &templatestr):ForumPage(db,templatestr,"forumviewthread.htm") {}\r
\r
- IPageHandler *New() { return new ForumViewThreadPage(m_template); }\r
+ IPageHandler *New() { return new ForumViewThreadPage(m_db,m_template); }\r
private:\r
const std::string GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars);\r
\r
#define _homepage_\r
\r
#include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
\r
-class HomePage:public IPageHandler,public IDatabase\r
+class HomePage:public IPageHandler\r
{\r
public:\r
- HomePage(const std::string &templatestr):IPageHandler(templatestr,"index.htm") {}\r
+ HomePage(SQLite3DB::DB *db, const std::string &templatestr):IPageHandler(db,templatestr,"index.htm") {}\r
\r
- IPageHandler *New() { return new HomePage(m_template); }\r
+ IPageHandler *New() { return new HomePage(m_db,m_template); }\r
\r
private:\r
const bool WillHandleURI(const std::string &uri);\r
#define _insertedfilespage_\r
\r
#include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
\r
-class InsertedFilesPage:public IPageHandler,public IDatabase\r
+class InsertedFilesPage:public IPageHandler\r
{\r
public:\r
- InsertedFilesPage(const std::string &templatestr):IPageHandler(templatestr,"insertedfiles.htm") {}\r
+ InsertedFilesPage(SQLite3DB::DB *db, const std::string &templatestr):IPageHandler(db,templatestr,"insertedfiles.htm") {}\r
\r
- IPageHandler *New() { return new InsertedFilesPage(m_template); }\r
+ IPageHandler *New() { return new InsertedFilesPage(m_db,m_template); }\r
\r
private:\r
const bool WillHandleURI(const std::string &uri);\r
#define _localidentitiespage_\r
\r
#include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
\r
-class LocalIdentitiesPage:public IPageHandler,public IDatabase\r
+class LocalIdentitiesPage:public IPageHandler\r
{\r
public:\r
- LocalIdentitiesPage(const std::string &templatestr):IPageHandler(templatestr,"localidentities.htm") {}\r
+ LocalIdentitiesPage(SQLite3DB::DB *db, const std::string &templatestr):IPageHandler(db,templatestr,"localidentities.htm") {}\r
\r
- IPageHandler *New() { return new LocalIdentitiesPage(m_template); }\r
+ IPageHandler *New() { return new LocalIdentitiesPage(m_db,m_template); }\r
\r
void handleRequest(Poco::Net::HTTPServerRequest &request, Poco::Net::HTTPServerResponse &response);\r
\r
#define _optionspage_\r
\r
#include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
\r
-class OptionsPage:public IPageHandler,public IDatabase\r
+class OptionsPage:public IPageHandler\r
{\r
public:\r
- OptionsPage(const std::string &templatestr):IPageHandler(templatestr,"options.htm") {}\r
+ OptionsPage(SQLite3DB::DB *db, const std::string &templatestr):IPageHandler(db,templatestr,"options.htm") {}\r
\r
- IPageHandler *New() { return new OptionsPage(m_template); }\r
+ IPageHandler *New() { return new OptionsPage(m_db,m_template); }\r
\r
private:\r
const bool WillHandleURI(const std::string &uri);\r
const std::string GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars);\r
- const std::string CreateDropDown(const std::string &name, const std::vector<std::string> &items, const std::string &selecteditem);\r
+ \r
+ const std::string CreateTextBox(const std::string &name, const std::string ¤tvalue, const std::string ¶m1, const std::string ¶m2);\r
+ const std::string CreateDropDown(const std::string &name, const std::vector<std::string> &items, const std::string &selecteditem, const std::string ¶m1, const std::string ¶m2);\r
+ const std::string CreateTextArea(const std::string &name, const std::string ¤tvalue, const std::string ¶m1, const std::string ¶m2);\r
+\r
+\r
+ static int m_mode;\r
+\r
};\r
\r
#endif // _optionspage_\r
#define _peerdetailspage_\r
\r
#include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
\r
-class PeerDetailsPage:public IPageHandler,public IDatabase\r
+class PeerDetailsPage:public IPageHandler\r
{\r
public:\r
- PeerDetailsPage(const std::string templatestr):IPageHandler(templatestr,"peerdetails.htm") {}\r
+ PeerDetailsPage(SQLite3DB::DB *db, const std::string templatestr):IPageHandler(db,templatestr,"peerdetails.htm") {}\r
\r
- IPageHandler *New() { return new PeerDetailsPage(m_template); }\r
+ IPageHandler *New() { return new PeerDetailsPage(m_db,m_template); }\r
\r
private:\r
const bool WillHandleURI(const std::string &uri);\r
#define _peermaintenancepage_\r
\r
#include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
\r
-class PeerMaintenancePage:public IPageHandler,public IDatabase\r
+class PeerMaintenancePage:public IPageHandler\r
{\r
public:\r
- PeerMaintenancePage(const std::string &templatestr):IPageHandler(templatestr,"peermaintenance.htm") {}\r
+ PeerMaintenancePage(SQLite3DB::DB *db, const std::string &templatestr):IPageHandler(db,templatestr,"peermaintenance.htm") {}\r
\r
- IPageHandler *New() { return new PeerMaintenancePage(m_template); }\r
+ IPageHandler *New() { return new PeerMaintenancePage(m_db,m_template); }\r
\r
private:\r
const bool WillHandleURI(const std::string &uri);\r
#define _peertrustpage_\r
\r
#include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
\r
-class PeerTrustPage:public IPageHandler,public IDatabase\r
+class PeerTrustPage:public IPageHandler\r
{\r
public:\r
- PeerTrustPage(const std::string &templatestr):IPageHandler(templatestr,"peertrust.htm") {}\r
+ PeerTrustPage(SQLite3DB::DB *db, const std::string &templatestr):IPageHandler(db,templatestr,"peertrust.htm") {}\r
\r
- IPageHandler *New() { return new PeerTrustPage(m_template); }\r
+ IPageHandler *New() { return new PeerTrustPage(m_db,m_template); }\r
\r
private:\r
const std::string GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars);\r
#define _recentlyaddedpage_\r
\r
#include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
\r
-class RecentlyAddedPage:public IPageHandler,public IDatabase\r
+class RecentlyAddedPage:public IPageHandler\r
{\r
public:\r
- RecentlyAddedPage(const std::string &templatestr):IPageHandler(templatestr,"recentlyadded.htm") {}\r
+ RecentlyAddedPage(SQLite3DB::DB *db, const std::string &templatestr):IPageHandler(db,templatestr,"recentlyadded.htm") {}\r
\r
- IPageHandler *New() { return new RecentlyAddedPage(m_template); }\r
+ IPageHandler *New() { return new RecentlyAddedPage(m_db,m_template); }\r
\r
private:\r
const std::string GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars);\r
#include "../ipagehandler.h"\r
#include "../../idatabase.h"\r
\r
-class ShowCaptchaPage:public IPageHandler,public IDatabase\r
+class ShowCaptchaPage:public IPageHandler\r
{\r
public:\r
+ ShowCaptchaPage(SQLite3DB::DB *db):IPageHandler(db) {}\r
\r
void handleRequest(Poco::Net::HTTPServerRequest &request, Poco::Net::HTTPServerResponse &response);\r
\r
- IPageHandler *New() { return new ShowCaptchaPage; }\r
+ IPageHandler *New() { return new ShowCaptchaPage(m_db); }\r
\r
private:\r
const bool WillHandleURI(const std::string &uri);\r
class ShowImagePage:public IPageHandler\r
{\r
public:\r
+ ShowImagePage(SQLite3DB::DB *db):IPageHandler(m_db) {}\r
\r
void handleRequest(Poco::Net::HTTPServerRequest &request, Poco::Net::HTTPServerResponse &response);\r
\r
- IPageHandler *New() { return new ShowImagePage; }\r
+ IPageHandler *New() { return new ShowImagePage(m_db); }\r
\r
private:\r
const bool WillHandleURI(const std::string &uri);\r
--- /dev/null
+#ifndef _showpmessagepage_\r
+#define _showpmessagepage_\r
+\r
+#include "../ipagehandler.h"\r
+\r
+class ShowPendingMessagePage:public IPageHandler\r
+{\r
+public:\r
+ ShowPendingMessagePage(SQLite3DB::DB *db, const std::string &templatestr):IPageHandler(db,templatestr,"showpendingmessage.htm") {}\r
+\r
+ IPageHandler *New() { return new ShowPendingMessagePage(m_db,m_template); }\r
+\r
+private:\r
+ const std::string GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars);\r
+};\r
+\r
+#endif // _showpmessage_\r
#define _versioninfopage_\r
\r
#include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
\r
-class VersionInfoPage:public IPageHandler,public IDatabase\r
+class VersionInfoPage:public IPageHandler\r
{\r
public:\r
- VersionInfoPage(const std::string &templatestr):IPageHandler(templatestr,"versioninfo.htm") {}\r
+ VersionInfoPage(SQLite3DB::DB *db, const std::string &templatestr):IPageHandler(db,templatestr,"versioninfo.htm") {}\r
\r
- IPageHandler *New() { return new VersionInfoPage(m_template); }\r
+ IPageHandler *New() { return new VersionInfoPage(m_db,m_template); }\r
\r
private:\r
const std::string GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars);\r
class IDatabase\r
{\r
public:\r
- IDatabase():m_db(SQLite3DB::DB::Instance()) {}\r
+ IDatabase(SQLite3DB::DB *db):m_db(db) {}\r
+\r
+ void SetDB(SQLite3DB::DB *db) { m_db=db; }\r
\r
protected:\r
SQLite3DB::DB *m_db;\r
--- /dev/null
+#ifndef _ithreaddatabase_\r
+#define _ithreaddatabase_\r
+\r
+#include "db/sqlite3db.h"\r
+\r
+// each thread using the database must inherit from this class\r
+class IThreadDatabase\r
+{\r
+public:\r
+ IThreadDatabase():m_db(0) {}\r
+ virtual ~IThreadDatabase()\r
+ {\r
+ delete m_db;\r
+ }\r
+ \r
+ void LoadDatabase()\r
+ {\r
+ if(m_db)\r
+ {\r
+ delete m_db; \r
+ }\r
+ m_db=new SQLite3DB::DB("fms.db3");\r
+ m_db->SetBusyTimeout(40000); // set timeout to 40 seconds\r
+ m_db->Execute("PRAGMA synchronous = FULL;");\r
+\r
+ // MessageInserter will insert a record into this temp table which the MessageListInserter will query for and insert a MessageList when needed\r
+ m_db->Execute("CREATE TEMPORARY TABLE IF NOT EXISTS tmpMessageListInsert(\\r
+ MessageListInsertID INTEGER PRIMARY KEY,\\r
+ LocalIdentityID INTEGER,\\r
+ Date DATETIME\\r
+ );");\r
+\r
+ // A temporary table that will hold a local identity id of the last identity who was loaded in the trust list page\r
+ m_db->Execute("CREATE TEMPORARY TABLE IF NOT EXISTS tmpLocalIdentityPeerTrustPage(\\r
+ LocalIdentityID INTEGER\\r
+ );");\r
+\r
+ // Temporary table for form passwords\r
+ m_db->Execute("CREATE TEMPORARY TABLE IF NOT EXISTS tmpFormPassword(\\r
+ Date DATETIME,\\r
+ Password TEXT\\r
+ );");\r
+\r
+ }\r
+ \r
+protected:\r
+ SQLite3DB::DB *m_db;\r
+};\r
+\r
+#endif // _ithreaddatabase_\r
class LocalIdentity:public IDatabase\r
{\r
public:\r
- LocalIdentity();\r
+ LocalIdentity(SQLite3DB::DB *db);\r
\r
const bool Load(const int id);\r
const bool Load(const std::string &name);\r
class Message:public IDatabase,public ILogger\r
{\r
public:\r
- Message();\r
- Message(const long messageid);\r
- Message(const std::string &messageuuid);\r
+ Message(SQLite3DB::DB *db);\r
+ Message(SQLite3DB::DB *db, const long messageid);\r
+ Message(SQLite3DB::DB *db, const std::string &messageuuid);\r
\r
const long GetMessageID() const { return m_messageid; }\r
const std::string GetMessageUUID() const { return m_messageuuid; }\r
class MessageList:public std::vector<Message>,public ILogger,public IDatabase\r
{\r
public:\r
+ MessageList(SQLite3DB::DB *db):IDatabase(db) {}\r
\r
/**\r
\brief Loads all messages with an id between lowmessageid and highmessageid inclusive\r
class MessageThread:public IDatabase\r
{\r
public:\r
+ MessageThread(SQLite3DB::DB *db):IDatabase(db) {}\r
+\r
struct threadnode\r
{\r
long m_messageid;\r
class TrustExtension:public IDatabase\r
{\r
public:\r
- TrustExtension();\r
- TrustExtension(const int &localidentityid);\r
+ TrustExtension(SQLite3DB::DB *db);\r
+ TrustExtension(SQLite3DB::DB *db, const int &localidentityid);\r
\r
struct trust\r
{\r
#include "../ilogger.h"\r
#include "../message.h"\r
#include "../localidentity.h"\r
+#include "../ithreaddatabase.h"\r
\r
#include <string>\r
#include <vector>\r
#include <arpa/inet.h>\r
#endif\r
\r
-class NNTPConnection:public CancelableRunnable,public ILogger\r
+class NNTPConnection:public CancelableRunnable,public ILogger,public IThreadDatabase\r
{\r
public:\r
NNTPConnection(SOCKET sock);\r
};\r
struct ClientStatus\r
{\r
+ ClientStatus(SQLite3DB::DB *db):m_authuser(db) {}\r
+\r
ClientMode m_mode;\r
bool m_allowpost;\r
bool m_isposting;\r
#include "../threadwrapper/threadedexecutor.h"\r
#include "../socketdefines.h"\r
#include "../ilogger.h"\r
+#include "../ithreaddatabase.h"\r
\r
/**\r
\brief Listens for NNTP connections\r
*/\r
-class NNTPListener:public CancelableRunnable,public ILogger\r
+class NNTPListener:public CancelableRunnable,public ILogger,public IThreadDatabase\r
{\r
public:\r
NNTPListener();\r
~NNTPListener();\r
\r
void run();\r
- void StartListen();\r
\r
private:\r
\r
+ void StartListen();\r
+\r
unsigned short m_listenport;\r
std::vector<SOCKET> m_listensockets;\r
\r
#ifndef _option_\r
#define _option_\r
\r
-#include "db/sqlite3db.h"\r
+#include "idatabase.h"\r
\r
#include <sstream>\r
-#include "threadwrapper/singleton.h"\r
\r
//just a wrapper around the database for the options table\r
-class Option:public Singleton<Option>\r
+class Option:public IDatabase\r
{\r
public:\r
+ Option(SQLite3DB::DB *db):IDatabase(db) {}\r
+\r
const bool Get(const std::string &option, std::string &value);\r
const bool GetInt(const std::string &option, int &value);\r
template<class T>\r
std::string tempval;\r
if(Get(option,tempval)==true)\r
{\r
- SQLite3DB::Statement st=SQLite3DB::DB::Instance()->Prepare("UPDATE tblOption SET OptionValue=? WHERE Option=?;");\r
+ SQLite3DB::Statement st=m_db->Prepare("UPDATE tblOption SET OptionValue=? WHERE Option=?;");\r
st.Bind(0,valuestr.str());\r
st.Bind(1,option);\r
st.Step();\r
}\r
else\r
{\r
- SQLite3DB::Statement st=SQLite3DB::DB::Instance()->Prepare("INSERT INTO tblOption(Option,OptionValue) VALUES(?,?);");\r
+ SQLite3DB::Statement st=m_db->Prepare("INSERT INTO tblOption(Option,OptionValue) VALUES(?,?);");\r
st.Bind(0,option);\r
st.Bind(1,valuestr.str());\r
st.Step();\r
#ifndef _optionssetup_\r
#define _optionssetup_\r
\r
+#include "db/sqlite3db.h"\r
+\r
// inserts default options into the database\r
-void SetupDefaultOptions();\r
+void SetupDefaultOptions(SQLite3DB::DB *db);\r
\r
#endif // _optionssetup_\r
class ThreadBuilder:public IDatabase,ILogger\r
{\r
public:\r
+ ThreadBuilder(SQLite3DB::DB *db):IDatabase(db) {}\r
\r
const bool Build(const long messageid, const long boardid, const bool bydate=false);\r
\r
-D ALTERNATE_CAPTCHA=ON to the cmake command line. This option requires the\r
FreeImage library to be installed.\r
\r
+Query logging may be turned on by adding a -D QUERY_LOG=ON. This will create a\r
+file called query.log in the working directory. Straight SQL statements will\r
+be captured, as well as the setup of prepared statements. Each step through a\r
+prepared statement is also logged, but the details are not, so there should be\r
+no sensitive information in this log file.\r
+\r
UPGRADING\r
---------\r
*ALWAYS* make a copy of your current FMS installation before continuing. First\r
#include <xmem.h>\r
#endif\r
\r
-Board::Board()\r
+Board::Board(SQLite3DB::DB *db):IDatabase(db)\r
{\r
m_boardid=-1;\r
m_boardname="";\r
m_addedmethod="";\r
}\r
\r
-Board::Board(const long boardid)\r
+Board::Board(SQLite3DB::DB *db, const long boardid):IDatabase(db)\r
{\r
Load(boardid); \r
}\r
\r
-Board::Board(const std::string &boardname)\r
+Board::Board(SQLite3DB::DB *db, const std::string &boardname):IDatabase(db)\r
{\r
Load(boardname);\r
}\r
\r
-Board::Board(const long boardid, const std::string &boardname, const std::string &boarddescription, const std::string datecreated, const long lowmessageid, const long highmessageid, const long messagecount, const bool savereceivedmessages, const std::string &addedmethod)\r
+Board::Board(SQLite3DB::DB *db, const long boardid, const std::string &boardname, const std::string &boarddescription, const std::string datecreated, const long lowmessageid, const long highmessageid, const long messagecount, const bool savereceivedmessages, const std::string &addedmethod):IDatabase(db)\r
{\r
m_boardid=boardid;\r
m_boardname=boardname;\r
savereceived=false;\r
}\r
\r
- push_back(Board(boardid,boardname,boarddescription,dateadded,lowmessageid,highmessageid,messagecount,savereceived,addedmethod));\r
+ push_back(Board(m_db,boardid,boardname,boarddescription,dateadded,lowmessageid,highmessageid,messagecount,savereceived,addedmethod));\r
st.Step();\r
}\r
}\r
while(st.RowReturned())\r
{\r
st.ResultInt(0,tempint);\r
- push_back(Board(tempint));\r
+ push_back(Board(m_db,tempint));\r
st.Step();\r
}\r
}\r
#include "../../include/db/sqlite3db.h"\r
\r
+#ifdef QUERY_LOG\r
+#include <Poco/Logger.h>\r
+#include <Poco/PatternFormatter.h>\r
+#include <Poco/FileChannel.h>\r
+#include "../../include/stringfunctions.h"\r
+#endif\r
+\r
#ifdef XMEM\r
#include <xmem.h>\r
#endif\r
{\r
if(IsOpen())\r
{\r
- Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
+ sqlite3_stmt *st=0;\r
+ while((st=sqlite3_next_stmt(m_db,0))!=0)\r
+ {\r
+ sqlite3_finalize(st);\r
+ }\r
+\r
m_lastresult=sqlite3_close(m_db);\r
if(m_lastresult==SQLITE_OK)\r
{\r
{\r
if(IsOpen())\r
{\r
- Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
m_lastresult=sqlite3_exec(m_db,sql.c_str(),NULL,NULL,NULL);\r
+#ifdef QUERY_LOG\r
+ Poco::Logger::get("querylog").information("Execute : "+sql);\r
+#endif\r
if(m_lastresult==SQLITE_OK)\r
{\r
return true;\r
{\r
if(IsOpen())\r
{\r
- Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
m_lastresult=sqlite3_exec(m_db,sql.c_str(),NULL,NULL,NULL);\r
+#ifdef QUERY_LOG\r
+ Poco::Logger::get("querylog").information("Execute Insert : "+sql);\r
+#endif\r
if(m_lastresult==SQLITE_OK)\r
{\r
insertid=sqlite3_last_insert_rowid(m_db);\r
{\r
if(IsOpen())\r
{\r
- Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
int errcode=sqlite3_errcode(m_db);\r
const char *errmsg=sqlite3_errmsg(m_db);\r
if(errmsg)\r
\r
const bool DB::IsOpen()\r
{\r
- Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
return m_db ? true : false;\r
}\r
\r
}\r
if(IsOpen()==false)\r
{\r
- Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
m_lastresult=sqlite3_open(filename.c_str(),&m_db);\r
if(m_lastresult==SQLITE_OK)\r
{\r
{\r
if(IsOpen())\r
{\r
- Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
sqlite3_stmt *statement=NULL;\r
m_lastresult=sqlite3_prepare_v2(m_db,sql.c_str(),sql.size(),&statement,NULL);\r
+#ifdef QUERY_LOG\r
+ size_t temp=reinterpret_cast<size_t>(statement);\r
+ std::string tempstr("");\r
+ StringFunctions::Convert(temp,tempstr);\r
+ Poco::Logger::get("querylog").information("Prepare : "+sql+" "+tempstr);\r
+#endif\r
if(m_lastresult==SQLITE_OK)\r
{\r
return Statement(statement);\r
{\r
if(IsOpen())\r
{\r
- Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
char **rs=NULL;\r
int rows,cols;\r
m_lastresult=sqlite3_get_table(m_db,sql.c_str(),&rs,&rows,&cols,NULL);\r
+#ifdef QUERY_LOG\r
+ Poco::Logger::get("querylog").information("Query : "+sql);\r
+#endif\r
if(m_lastresult==SQLITE_OK)\r
{\r
return Recordset(rs,rows,cols);\r
{\r
if(IsOpen())\r
{\r
- Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
m_lastresult=sqlite3_busy_timeout(m_db,ms);\r
return m_lastresult;\r
}\r
Free();\r
m_currentrow=0;\r
\r
- Poco::ScopedLock<Poco::FastMutex> g(DB::Instance()->m_mutex);\r
if(sqlite3_get_table(db->GetDB(),sql.c_str(),&m_rs,&m_rows,&m_cols,NULL)==SQLITE_OK)\r
{\r
}\r
#include "../../include/db/sqlite3db/sqlite3statement.h"\r
\r
+#ifdef QUERY_LOG\r
+#include <Poco/Logger.h>\r
+#include <Poco/FormattingChannel.h>\r
+#include <Poco/PatternFormatter.h>\r
+#include <Poco/FileChannel.h>\r
+#include "../../include/stringfunctions.h"\r
+#endif\r
+\r
#ifdef XMEM\r
#include <xmem.h>\r
#endif\r
namespace SQLite3DB\r
{\r
\r
+Poco::FastMutex Statement::m_mutex;\r
std::map<sqlite3_stmt *, long> Statement::m_statementcount;\r
\r
Statement::Statement():m_statement(0),m_parametercount(0),m_resultcolumncount(0),m_rowreturned(false),m_lastinsertrowid(-1)\r
\r
if(m_statement)\r
{\r
+ Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
m_statementcount[m_statement]++;\r
}\r
}\r
{\r
if(m_statement)\r
{\r
- Poco::ScopedLock<Poco::FastMutex> g(DB::Instance()->m_mutex);\r
+ Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
m_statementcount[m_statement]--;\r
if(m_statementcount[m_statement]<=0)\r
{\r
\r
if(m_statement)\r
{\r
- Poco::ScopedLock<Poco::FastMutex> g(DB::Instance()->m_mutex);\r
+ Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
m_statementcount[m_statement]++;\r
}\r
}\r
{\r
if(Valid())\r
{\r
- Poco::ScopedLock<Poco::FastMutex> g(DB::Instance()->m_mutex);\r
if(sqlite3_reset(m_statement)==SQLITE_OK)\r
{\r
return true;\r
m_rowreturned=false;\r
if(Valid())\r
{\r
- Poco::ScopedLock<Poco::FastMutex> g(DB::Instance()->m_mutex);\r
int result=sqlite3_step(m_statement);\r
+#ifdef QUERY_LOG\r
+ size_t temp=reinterpret_cast<size_t>(m_statement);\r
+ std::string tempstr("");\r
+ StringFunctions::Convert(temp,tempstr);\r
+ Poco::Logger::get("querylog").information("Step : "+tempstr);\r
+#endif\r
if(result==SQLITE_OK || result==SQLITE_ROW || result==SQLITE_DONE)\r
{\r
if(result==SQLITE_ROW)\r
}\r
if(saveinsertrowid)\r
{\r
- m_lastinsertrowid=sqlite3_last_insert_rowid(DB::Instance()->GetDB());\r
+ m_lastinsertrowid=sqlite3_last_insert_rowid(sqlite3_db_handle(m_statement));\r
}\r
return true;\r
}\r
\r
const bool Statement::Valid()\r
{\r
- Poco::ScopedLock<Poco::FastMutex> g(DB::Instance()->m_mutex);\r
return m_statement ? true : false ;\r
}\r
\r
#include <Poco/Timestamp.h>\r
#include <Poco/DateTimeFormatter.h>\r
\r
-void ConvertDB0100To0101()\r
+void ConvertDB0100To0101(SQLite3DB::DB *db)\r
{\r
// added unique constraint to public and private key\r
- SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
db->Execute("CREATE TEMPORARY TABLE tblLocalIdentityTemp AS SELECT * FROM tblLocalIdentity;");\r
db->Execute("DROP TABLE IF EXISTS tblLocalIdentity;");\r
db->Execute("CREATE TABLE IF NOT EXISTS tblLocalIdentity(\\r
db->Execute("UPDATE tblDBVersion SET Major=1, Minor=1;");\r
}\r
\r
-void ConvertDB0101To0103()\r
+void ConvertDB0101To0103(SQLite3DB::DB *db)\r
{\r
// remove default 50 from trust fields and set default to NULL\r
- SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
db->Execute("CREATE TEMPORARY TABLE tblIdentityTemp AS SELECT * FROM tblIdentity;");\r
db->Execute("DROP TABLE IF EXISTS tblIdentity;");\r
db->Execute("CREATE TABLE IF NOT EXISTS tblIdentity(\\r
db->Execute("UPDATE tblDBVersion SET Major=1, Minor=3;");\r
}\r
\r
-void ConvertDB0103To0104()\r
+void ConvertDB0103To0104(SQLite3DB::DB *db)\r
{\r
// add MessageIndex to tblMessage\r
Poco::Timestamp date;\r
- SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
db->Execute("ALTER TABLE tblMessage ADD COLUMN MessageIndex INTEGER;");\r
db->Execute("CREATE UNIQUE INDEX IF NOT EXISTS idxMessageRequest ON tblMessageRequests(IdentityID,Day,RequestIndex);");\r
db->Execute("ALTER TABLE tblLocalIdentity ADD COLUMN DateCreated DATETIME;");\r
db->Execute("UPDATE tblDBVersion SET Major=1, Minor=4;");\r
}\r
\r
-void ConvertDB0104To0105()\r
+void ConvertDB0104To0105(SQLite3DB::DB *db)\r
{\r
// add AddedMethod, MessageTrustComment, TrustListTrustComment to tblIdentity\r
// add MessageTrustComment,TrustListTrustComment to tblPeerTrust\r
- SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
db->Execute("ALTER TABLE tblIdentity ADD COLUMN AddedMethod TEXT;");\r
db->Execute("ALTER TABLE tblIdentity ADD COLUMN MessageTrustComment TEXT;");\r
db->Execute("ALTER TABLE tblIdentity ADD COLUMN TrustListTrustComment TEXT;");\r
db->Execute("UPDATE tblDBVersion SET Major=1, Minor=5;");\r
}\r
\r
-void ConvertDB0105To0106()\r
+void ConvertDB0105To0106(SQLite3DB::DB *db)\r
{\r
// add Publish Freesite\r
- SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
db->Execute("ALTER TABLE tblLocalIdentity ADD COLUMN PublishFreesite BOOL CHECK(PublishFreesite IN('true','false')) DEFAULT 'false';");\r
db->Execute("ALTER TABLE tblLocalIdentity ADD COLUMN LastInsertedFreesite DATETIME;");\r
db->Execute("UPDATE tblDBVersion SET Major=1, Minor=6;");\r
}\r
\r
-void ConvertDB0106To0107()\r
+void ConvertDB0106To0107(SQLite3DB::DB *db)\r
{\r
// add AddedMethod to tblBoard\r
- SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
db->Execute("ALTER TABLE tblBoard ADD COLUMN AddedMethod TEXT;");\r
db->Execute("ALTER TABLE tblIdentity ADD COLUMN Hidden BOOL CHECK(Hidden IN('true','false')) DEFAULT 'false';");\r
db->Execute("UPDATE tblIdentity SET Hidden='false' WHERE Hidden IS NULL;");\r
db->Execute("UPDATE tblDBVersion SET Major=1, Minor=7;");\r
}\r
\r
-void ConvertDB0107To0108()\r
+void ConvertDB0107To0108(SQLite3DB::DB *db)\r
{\r
// add FreesiteEdition to tblLocalIdentity and tblIdentity\r
- SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
db->Execute("ALTER TABLE tblLocalIdentity ADD COLUMN FreesiteEdition INTEGER;");\r
db->Execute("ALTER TABLE tblIdentity ADD COLUMN FreesiteEdition INTEGER;");\r
db->Execute("UPDATE tblDBVersion SET Major=1, Minor=8;");\r
}\r
\r
-void ConvertDB0108To0109()\r
+void ConvertDB0108To0109(SQLite3DB::DB *db)\r
{\r
- SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
db->Execute("CREATE TABLE IF NOT EXISTS tblFileInserts(\\r
FileInsertID INTEGER PRIMARY KEY,\\r
MessageUUID TEXT,\\r
db->Execute("UPDATE tblDBVersion SET Major=1, Minor=9;");\r
}\r
\r
-void ConvertDB0109To0110()\r
+void ConvertDB0109To0110(SQLite3DB::DB *db)\r
{\r
- SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
db->Execute("ALTER TABLE tblFileInserts ADD COLUMN MimeType TEXT;");\r
db->Execute("UPDATE tblDBVersion SET Major=1, Minor=10;");\r
}\r
\r
-void ConvertDB0110To0111()\r
+void ConvertDB0110To0111(SQLite3DB::DB *db)\r
{\r
/*\r
Drop MessageTrustComment, TrustListTrustComment FROM tblIdentity\r
\r
Add SendDate to tblMessageInserts\r
*/\r
- SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
\r
db->Execute("ALTER TABLE tblMessageInserts ADD COLUMN SendDate DATETIME;");\r
\r
db->Execute("UPDATE tblDBVersion SET Major=1, Minor=11;");\r
}\r
\r
-void ConvertDB0111To0112()\r
+void ConvertDB0111To0112(SQLite3DB::DB *db)\r
{\r
/*\r
Add Section, SortOrder, ValidValues to tblOption\r
Add PurgeDate to tblIdentity\r
*/\r
- SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
\r
db->Execute("ALTER TABLE tblOption ADD COLUMN Section TEXT;");\r
db->Execute("ALTER TABLE tblOption ADD COLUMN SortOrder INTEGER;");\r
db->Execute("UPDATE tblDBVersion SET Major=1, Minor=12;");\r
}\r
\r
-void ConvertDB0112To0113()\r
+void ConvertDB0112To0113(SQLite3DB::DB *db)\r
{\r
// Add Tries and Key (for anonymous messages) to tblMessageRequests \r
- SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
\r
db->Execute("ALTER TABLE tblMessageRequests ADD COLUMN Tries INTEGER DEFAULT 0;");\r
db->Execute("ALTER TABLE tblMessageRequests ADD COLUMN Key TEXT;");\r
db->Execute("UPDATE tblDBVersion SET Major=1, Minor=13;");\r
}\r
\r
-void ConvertDB0113To0114()\r
+void ConvertDB0113To0114(SQLite3DB::DB *db)\r
{\r
- SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
\r
db->Execute("ALTER TABLE tblBoard ADD COLUMN Forum TEXT CHECK(Forum IN ('true','false')) DEFAULT 'false';");\r
db->Execute("ALTER TABLE tblMessage ADD COLUMN Read INTEGER CHECK(Read IN (0,1)) DEFAULT 0;");\r
db->Execute("UPDATE tblDBVersion SET Major=1, Minor=14;");\r
}\r
\r
-void FixCapitalBoardNames()\r
+void ConvertDB0114To0115(SQLite3DB::DB *db)\r
+{\r
+\r
+ db->Execute("ALTER TABLE tblOption ADD COLUMN DisplayType TEXT CHECK (DisplayType IN ('textbox','textarea','select','multiselect')) DEFAULT 'textbox';");\r
+ db->Execute("ALTER TABLE tblOption ADD COLUMN DisplayParam1 TEXT;");\r
+ db->Execute("ALTER TABLE tblOption ADD COLUMN DisplayParam2 TEXT;");\r
+ db->Execute("ALTER TABLE tblOption ADD COLUMN Mode TEXT CHECK (Mode IN ('simple','advanced')) DEFAULT 'simple';");\r
+\r
+ db->Execute("UPDATE tblDBVersion SET Major=1, Minor=15;");\r
+}\r
+\r
+void FixCapitalBoardNames(SQLite3DB::DB *db)\r
{\r
- SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
\r
SQLite3DB::Statement st=db->Prepare("SELECT BoardID,BoardName FROM tblBoard WHERE BoardID NOT IN (SELECT BoardID FROM tblAdministrationBoard);");\r
SQLite3DB::Statement st2=db->Prepare("SELECT BoardID FROM tblBoard WHERE BoardName=?;");\r
m_last1day=Poco::Timestamp();\r
m_last1day-=Poco::Timespan(0,23,51,0,0);\r
\r
- m_deletemessagesolderthan=180;\r
- std::string tempval="180";\r
- Option::Instance()->Get("DeleteMessagesOlderThan",tempval);\r
- StringFunctions::Convert(tempval,m_deletemessagesolderthan);\r
\r
- m_messagedownloadmaxdaysbackward=5;\r
- tempval="5";\r
- Option::Instance()->Get("MessageDownloadMaxDaysBackward",tempval);\r
- StringFunctions::Convert(tempval,m_messagedownloadmaxdaysbackward);\r
\r
}\r
\r
\r
void DBMaintenanceThread::Do10MinuteMaintenance()\r
{\r
- std::string ll="";\r
- Option::Instance()->Get("LogLevel",ll);\r
+ Option option(m_db);\r
+ std::string ll("");\r
+ option.Get("LogLevel",ll);\r
\r
// TODO - remove after corruption issue fixed\r
if(ll=="8")\r
{\r
- std::string dbres=TestDBIntegrity();\r
+ std::string dbres=TestDBIntegrity(m_db);\r
m_log->trace("DBMaintenanceThread::Do10MinuteMaintenance() start TestDBIntegrity returned "+dbres);\r
}\r
\r
- ThreadBuilder tb;\r
+ ThreadBuilder tb(m_db);\r
SQLite3DB::Statement boardst=m_db->Prepare("SELECT BoardID FROM tblBoard WHERE Forum='true';");\r
// select messages for a board that aren't in a thread\r
SQLite3DB::Statement selectst=m_db->Prepare("SELECT tblMessage.MessageID FROM tblMessage \\r
// TODO - remove after corruption issue fixed\r
if(ll=="8")\r
{\r
- std::string dbres=TestDBIntegrity();\r
+ std::string dbres=TestDBIntegrity(m_db);\r
m_log->trace("DBMaintenanceThread::Do10MinuteMaintenance() middle TestDBIntegrity returned "+dbres);\r
}\r
\r
// TODO - remove after corruption issue fixed\r
if(ll=="8")\r
{\r
- std::string dbres=TestDBIntegrity();\r
+ std::string dbres=TestDBIntegrity(m_db);\r
m_log->trace("DBMaintenanceThread::Do10MinuteMaintenance() end TestDBIntegrity returned "+dbres);\r
}\r
\r
\r
void DBMaintenanceThread::Do1HourMaintenance()\r
{\r
+\r
+ m_db->Execute("BEGIN;");\r
// recalculate all trust levels - this is CPU instensive\r
// do 1 identity at a time as doing it with 1 UPDATE statement locks that database for the duration\r
SQLite3DB::Statement st=m_db->Prepare("SELECT TargetIdentityID,PeerMessageTrust,PeerTrustListTrust FROM vwCalculatedPeerTrust;");\r
// insert all identities not in trust list already\r
m_db->Execute("INSERT INTO tblIdentityTrust(LocalIdentityID,IdentityID) SELECT LocalIdentityID,IdentityID FROM tblLocalIdentity,tblIdentity WHERE LocalIdentityID || '_' || IdentityID NOT IN (SELECT LocalIdentityID || '_' || IdentityID FROM tblIdentityTrust);");\r
\r
+ m_db->Execute("COMMIT;");\r
+\r
m_log->debug("PeriodicDBMaintenance::Do1HourMaintenance");\r
}\r
\r
void DBMaintenanceThread::Do6HourMaintenance()\r
{\r
\r
+ m_db->Execute("BEGIN;");\r
+\r
// if we remove a board and the reply boardid is still set to it, we need to replace it with a boardid that does exist\r
SQLite3DB::Statement st=m_db->Prepare("SELECT MessageID FROM tblMessage WHERE ReplyBoardID NOT IN (SELECT BoardID FROM tblBoard);");\r
SQLite3DB::Statement st2=m_db->Prepare("SELECT BoardID FROM tblMessageBoard WHERE MessageID=?;");\r
st.Step();\r
}\r
\r
+ m_db->Execute("COMMIT;");\r
+\r
m_log->debug("PeriodicDBMaintenance::Do6HourMaintenance");\r
}\r
\r
{\r
Poco::DateTime date;\r
\r
+ m_db->Execute("BEGIN;");\r
+\r
// delete all puzzles 2 or more days old\r
date=Poco::Timestamp();\r
date-=Poco::Timespan(2,0,0,0,0);\r
m_db->Execute("DELETE FROM tblIdentityTrust WHERE LocalIdentityID NOT IN (SELECT LocalIdentityID FROM tblLocalIdentity);");\r
m_db->Execute("DELETE FROM tblIdentityTrust WHERE IdentityID NOT IN (SELECT IdentityID FROM tblIdentity);");\r
\r
+ m_db->Execute("COMMIT;");\r
+\r
m_log->debug("PeriodicDBMaintenance::Do1DayMaintenance");\r
\r
}\r
{\r
m_log->debug("DBMaintenanceThread::run thread started.");\r
\r
+ LoadDatabase();\r
+ Option option(m_db);\r
+ std::string tempval("");\r
+\r
+ m_deletemessagesolderthan=180;\r
+ tempval="180";\r
+ option.Get("DeleteMessagesOlderThan",tempval);\r
+ StringFunctions::Convert(tempval,m_deletemessagesolderthan);\r
+\r
+ m_messagedownloadmaxdaysbackward=5;\r
+ tempval="5";\r
+ option.Get("MessageDownloadMaxDaysBackward",tempval);\r
+ StringFunctions::Convert(tempval,m_messagedownloadmaxdaysbackward);\r
+\r
+\r
Poco::DateTime now;\r
int i=0;\r
\r
#include <Poco/Timespan.h>\r
#include <Poco/DateTimeFormatter.h>\r
\r
-void SetupDB()\r
+void SetupDB(SQLite3DB::DB *db)\r
{\r
\r
Poco::DateTime date;\r
std::string tempval="";\r
- SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
-\r
- db->Open("fms.db3");\r
- db->SetBusyTimeout(20000); // set timeout to 20 seconds\r
- db->Execute("PRAGMA synchronous = FULL;");\r
\r
db->Execute("CREATE TABLE IF NOT EXISTS tblDBVersion(\\r
Major INTEGER,\\r
st.Finalize();\r
if(major==1 && minor==0)\r
{\r
- ConvertDB0100To0101();\r
+ ConvertDB0100To0101(db);\r
major=1;\r
minor=1;\r
}\r
if(major==1 && (minor==1 || minor==2))\r
{\r
- ConvertDB0101To0103();\r
+ ConvertDB0101To0103(db);\r
major=1;\r
minor=3;\r
}\r
if(major==1 && minor==3)\r
{\r
- ConvertDB0103To0104();\r
+ ConvertDB0103To0104(db);\r
major=1;\r
minor=4;\r
}\r
if(major==1 && minor==4)\r
{\r
- ConvertDB0104To0105();\r
+ ConvertDB0104To0105(db);\r
major=1;\r
minor=5;\r
}\r
if(major==1 && minor==5)\r
{\r
- ConvertDB0105To0106();\r
+ ConvertDB0105To0106(db);\r
major=1;\r
minor=6;\r
}\r
if(major==1 && minor==6)\r
{\r
- ConvertDB0106To0107();\r
+ ConvertDB0106To0107(db);\r
major=1;\r
minor=7;\r
}\r
if(major==1 && minor==7)\r
{\r
- ConvertDB0107To0108();\r
+ ConvertDB0107To0108(db);\r
major=1;\r
minor=8;\r
}\r
if(major==1 && minor==8)\r
{\r
- ConvertDB0108To0109();\r
+ ConvertDB0108To0109(db);\r
major=1;\r
minor=9;\r
}\r
if(major==1 && minor==9)\r
{\r
- ConvertDB0109To0110();\r
+ ConvertDB0109To0110(db);\r
major=1;\r
minor=10;\r
}\r
if(major==1 && minor==10)\r
{\r
- ConvertDB0110To0111();\r
+ ConvertDB0110To0111(db);\r
major=1;\r
minor=11;\r
}\r
if(major==1 && minor==11)\r
{\r
- ConvertDB0111To0112();\r
+ ConvertDB0111To0112(db);\r
major=1;\r
minor=12;\r
}\r
if(major==1 && minor==12)\r
{\r
- ConvertDB0112To0113();\r
+ ConvertDB0112To0113(db);\r
major=1;\r
minor=13;\r
}\r
if(major==1 && minor==13)\r
{\r
- ConvertDB0113To0114();\r
+ ConvertDB0113To0114(db);\r
major=1;\r
minor=14;\r
}\r
+ if(major==1 && minor==14)\r
+ {\r
+ ConvertDB0114To0115(db);\r
+ major=1;\r
+ minor=15;\r
+ }\r
}\r
else\r
{\r
- db->Execute("INSERT INTO tblDBVersion(Major,Minor) VALUES(1,14);");\r
+ db->Execute("INSERT INTO tblDBVersion(Major,Minor) VALUES(1,15);");\r
}\r
\r
- db->Execute("UPDATE tblDBVersion SET Major=1, Minor=14;");\r
+ db->Execute("UPDATE tblDBVersion SET Major=1, Minor=15;");\r
\r
db->Execute("CREATE TABLE IF NOT EXISTS tblFMSVersion(\\r
Major INTEGER,\\r
OptionDescription TEXT,\\r
Section TEXT,\\r
SortOrder INTEGER,\\r
- ValidValues TEXT\\r
+ ValidValues TEXT,\\r
+ DisplayType TEXT CHECK (DisplayType IN ('textbox','textarea','select','multiselect')) DEFAULT 'textbox',\\r
+ DisplayParam1 TEXT,\\r
+ DisplayParam2 TEXT,\\r
+ Mode TEXT CHECK (Mode IN ('simple','advanced')) DEFAULT 'simple'\\r
);");\r
\r
db->Execute("CREATE TABLE IF NOT EXISTS tblLocalIdentity(\\r
Forum TEXT CHECK(Forum IN('true','false')) DEFAULT 'false'\\r
);");\r
\r
- db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded,AddedMethod,Forum) VALUES('fms','Freenet Message System','2007-12-01 12:00:00','Initial Board','true');");\r
- db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded,AddedMethod,Forum) VALUES('freenet','Discussion about Freenet','2007-12-01 12:00:00','Initial Board','true');");\r
- db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded,AddedMethod,Forum) VALUES('public','Public discussion','2007-12-01 12:00:00','Initial Board','true');");\r
- db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded,AddedMethod,Forum) VALUES('test','Test board','2007-12-01 12:00:00','Initial Board','true');");\r
+ db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded,AddedMethod,Forum) VALUES('fms','Freenet Message System','2007-12-01 12:00:00','Seed Board','true');");\r
+ db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded,AddedMethod,Forum) VALUES('freenet','Discussion about Freenet','2007-12-01 12:00:00','Seed Board','true');");\r
+ db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded,AddedMethod,Forum) VALUES('public','Public discussion','2007-12-01 12:00:00','Seed Board','true');");\r
+ db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded,AddedMethod,Forum) VALUES('test','Test board','2007-12-01 12:00:00','Seed Board','true');");\r
\r
db->Execute("CREATE TABLE IF NOT EXISTS tblMessage(\\r
MessageID INTEGER PRIMARY KEY,\\r
END;");\r
// end thread db schema\r
\r
- // MessageInserter will insert a record into this temp table which the MessageListInserter will query for and insert a MessageList when needed\r
- db->Execute("CREATE TEMPORARY TABLE IF NOT EXISTS tmpMessageListInsert(\\r
- MessageListInsertID INTEGER PRIMARY KEY,\\r
- LocalIdentityID INTEGER,\\r
- Date DATETIME\\r
- );");\r
-\r
- // A temporary table that will hold a local identity id of the last identity who was loaded in the trust list page\r
- db->Execute("CREATE TEMPORARY TABLE IF NOT EXISTS tmpLocalIdentityPeerTrustPage(\\r
- LocalIdentityID INTEGER\\r
- );");\r
-\r
- // Temporary table for form passwords\r
- db->Execute("CREATE TEMPORARY TABLE IF NOT EXISTS tmpFormPassword(\\r
- Date DATETIME,\\r
- Password TEXT\\r
- );");\r
-\r
// low / high / message count for each board\r
db->Execute("CREATE VIEW IF NOT EXISTS vwBoardStats AS \\r
SELECT tblBoard.BoardID AS 'BoardID', IFNULL(MIN(MessageID),0) AS 'LowMessageID', IFNULL(MAX(MessageID),0) AS 'HighMessageID', COUNT(MessageID) AS 'MessageCount' \\r
\r
date=Poco::Timestamp();\r
// insert SomeDude's public key\r
- db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,LocalTrustListTrust,AddedMethod) VALUES('SSK@NuBL7aaJ6Cn4fB7GXFb9Zfi8w1FhPyW3oKgU9TweZMw,iXez4j3qCpd596TxXiJgZyTq9o-CElEuJxm~jNNZAuA,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"',50,'Initial Identity');");\r
+ db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,LocalTrustListTrust,AddedMethod) VALUES('SSK@NuBL7aaJ6Cn4fB7GXFb9Zfi8w1FhPyW3oKgU9TweZMw,iXez4j3qCpd596TxXiJgZyTq9o-CElEuJxm~jNNZAuA,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"',50,'Seed Identity');");\r
// insert Shadow Panther's public key - haven't seen in a while - disabling for now\r
- //db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@~mimyB1kmH4f7Cgsd2wM2Qv2NxrZHRMM6IY8~7EWRVQ,fxTKkR0TYhgMYb-vEGAv55sMOxCGD2xhE4ZxWHxdPz4,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"','Initial Identity');");\r
+ //db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@~mimyB1kmH4f7Cgsd2wM2Qv2NxrZHRMM6IY8~7EWRVQ,fxTKkR0TYhgMYb-vEGAv55sMOxCGD2xhE4ZxWHxdPz4,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"','Seed Identity');");\r
// insert garfield's public key -haven't seen in a while - disabling for now\r
- //db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@T8l1IEGU4-PoASFzgc2GYhIgRzUvZsKdoQWeuLHuTmM,QLxAPfkGis8l5NafNpSCdbxzXhBlu9WL8svcqJw9Mpo,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"','Initial Identity');");\r
+ //db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@T8l1IEGU4-PoASFzgc2GYhIgRzUvZsKdoQWeuLHuTmM,QLxAPfkGis8l5NafNpSCdbxzXhBlu9WL8svcqJw9Mpo,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"','Seed Identity');");\r
// insert alek's public key - haven't seen in a while - disabling for now\r
- //db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@lTjeI6V0lQsktXqaqJ6Iwk4TdsHduQI54rdUpHfhGbg,0oTYfrxxx8OmdU1~60gqpf3781qzEicM4Sz97mJsBM4,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"','Initial Identity');");\r
+ //db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@lTjeI6V0lQsktXqaqJ6Iwk4TdsHduQI54rdUpHfhGbg,0oTYfrxxx8OmdU1~60gqpf3781qzEicM4Sz97mJsBM4,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"','Seed Identity');");\r
// insert Luke771's public key\r
- db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@mdXK~ZVlfTZhF1SLBrvZ--i0vOsOpa~w9wv~~psQ-04,gXonsXKc7aexKSO8Gt8Fwre4Qgmmbt2WueO7VzxNKkk,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"','Initial Identity');");\r
+ db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@mdXK~ZVlfTZhF1SLBrvZ--i0vOsOpa~w9wv~~psQ-04,gXonsXKc7aexKSO8Gt8Fwre4Qgmmbt2WueO7VzxNKkk,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"','Seed Identity');");\r
// insert falafel's public key\r
- db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@IxVqeqM0LyYdTmYAf5z49SJZUxr7NtQkOqVYG0hvITw,RM2wnMn5zAufCMt5upkkgq25B1elfBAxc7htapIWg1c,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"','Initial Identity');");\r
+ db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@IxVqeqM0LyYdTmYAf5z49SJZUxr7NtQkOqVYG0hvITw,RM2wnMn5zAufCMt5upkkgq25B1elfBAxc7htapIWg1c,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"','Seed Identity');");\r
// insert cptn_insano's public key\r
- db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@bloE1LJ~qzSYUkU2nt7sB9kq060D4HTQC66pk5Q8NpA,DOOASUnp0kj6tOdhZJ-h5Tk7Ka50FSrUgsH7tCG1usU,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"','Initial Identity');");\r
- // insert Flink's public key\r
- db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@q2TtkNBOuuniyJ56~8NSopCs3ttwe5KlB31ugZtWmXA,6~PzIupS8YK7L6oFNpXGKJmHT2kBMDfwTg73nHdNur8,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"','Initial Identity');");\r
+ db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@bloE1LJ~qzSYUkU2nt7sB9kq060D4HTQC66pk5Q8NpA,DOOASUnp0kj6tOdhZJ-h5Tk7Ka50FSrUgsH7tCG1usU,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"','Seed Identity');");\r
+ // insert Flink's public key - haven't seen in a while - disabling for now\r
+ //db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@q2TtkNBOuuniyJ56~8NSopCs3ttwe5KlB31ugZtWmXA,6~PzIupS8YK7L6oFNpXGKJmHT2kBMDfwTg73nHdNur8,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"','Seed Identity');");\r
// insert Kane's public key\r
- db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@Ofm~yZivDJ5Z2fSzZbMiLEUUQaIc0KHRdZMBTaPLO6I,WLm4s4hNbOOurJ6ijfOq4odz7-dN7uTUvYxJRwWnlMI,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"','Initial Identity');");\r
+ db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@Ofm~yZivDJ5Z2fSzZbMiLEUUQaIc0KHRdZMBTaPLO6I,WLm4s4hNbOOurJ6ijfOq4odz7-dN7uTUvYxJRwWnlMI,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"','Seed Identity');");\r
// inserts boardstat's public key\r
- db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@aYWBb6zo2AM13XCNhsmmRKMANEx6PG~C15CWjdZziKA,X1pAG4EIqR1gAiyGFVZ1iiw-uTlh460~rFACJ7ZHQXk,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"','Initial Identity');");\r
+ db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@aYWBb6zo2AM13XCNhsmmRKMANEx6PG~C15CWjdZziKA,X1pAG4EIqR1gAiyGFVZ1iiw-uTlh460~rFACJ7ZHQXk,AQACAAE/','"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"','Seed Identity');");\r
\r
// TODO remove sometime after 0.1.17\r
- FixCapitalBoardNames();\r
+ FixCapitalBoardNames(db);\r
\r
// run analyze - may speed up some queries\r
db->Execute("ANALYZE;");\r
\r
}\r
\r
-const bool VerifyDB()\r
+const bool VerifyDB(SQLite3DB::DB *db)\r
{\r
- SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
SQLite3DB::Statement st=db->Prepare("PRAGMA integrity_check;");\r
st.Step();\r
if(st.RowReturned())\r
}\r
}\r
\r
-const std::string TestDBIntegrity()\r
+const std::string TestDBIntegrity(SQLite3DB::DB *db)\r
{\r
std::string result="";\r
\r
- SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
SQLite3DB::Statement st=db->Prepare("PRAGMA integrity_check;");\r
st.Step();\r
while(st.RowReturned())\r
}\r
int rval=chdir(m_workingdirectory.c_str());\r
\r
- SetupDB();\r
- SetupDefaultOptions();\r
+#ifdef QUERY_LOG\r
+ {\r
+ Poco::AutoPtr<Poco::FormattingChannel> formatter=new Poco::FormattingChannel(new Poco::PatternFormatter("%Y-%m-%d %H:%M:%S | %t"));\r
+ Poco::AutoPtr<Poco::FileChannel> fc=new Poco::FileChannel("query.log");\r
+ fc->setProperty("rotation","daily");\r
+ fc->setProperty("times","utc");\r
+ fc->setProperty("archive","timestamp");\r
+ fc->setProperty("purgeCount","5");\r
+ fc->setProperty("compress","true");\r
+ formatter->setChannel(fc);\r
+ Poco::Logger::create("querylog",formatter,Poco::Message::PRIO_INFORMATION);\r
+ }\r
+#endif\r
+\r
+ LoadDatabase();\r
+ SetupDB(m_db);\r
+ SetupDefaultOptions(m_db);\r
initializeLogger();\r
config().setString("application.logger","logfile");\r
}\r
int initiallevel=Poco::Message::PRIO_TRACE;\r
\r
std::string tempval="";\r
- if(Option::Instance()->Get("LogLevel",tempval))\r
+ Option option(m_db);\r
+\r
+ if(option.Get("LogLevel",tempval))\r
{\r
StringFunctions::Convert(tempval,initiallevel);\r
}\r
setLogger(Poco::Logger::create("logfile",formatter,Poco::Message::PRIO_INFORMATION));\r
Poco::Logger::get("logfile").information("LogLevel set to "+tempval);\r
Poco::Logger::get("logfile").setLevel(initiallevel);\r
+\r
}\r
\r
int FMSApp::main(const std::vector<std::string> &args)\r
// so we need to set the working directory again\r
int rval=chdir(m_workingdirectory.c_str());\r
\r
- if(VerifyDB()==false)\r
+ if(VerifyDB(m_db)==false)\r
{\r
std::cout << "The FMS database failed verification. It is most likely corrupt!" << std::endl;\r
logger().fatal("The FMS database failed verification. It is most likely corrupt!");\r
logger().information("FMS startup v"FMS_VERSION);\r
logger().information("Using SQLite "SQLITE_VERSION);\r
\r
- std::string tempval="";\r
- Option::Instance()->Get("VacuumOnStartup",tempval);\r
+ std::string tempval("");\r
+ Option option(m_db);\r
+ option.Get("VacuumOnStartup",tempval);\r
if(tempval=="true")\r
{\r
logger().information("VACUUMing database");\r
- SQLite3DB::DB::Instance()->Execute("VACUUM;");\r
+ m_db->Execute("VACUUM;");\r
}\r
\r
StartThreads();\r
{\r
for(std::map<std::string,std::string>::iterator i=m_setoptions.begin(); i!=m_setoptions.end(); i++)\r
{\r
- std::string tempval="";\r
- if(Option::Instance()->Get((*i).first,tempval))\r
+ std::string tempval("");\r
+ Option option(m_db);\r
+ if(option.Get((*i).first,tempval))\r
{\r
- Option::Instance()->Set((*i).first,(*i).second);\r
+ option.Set((*i).first,(*i).second);\r
std::cout << "Option " << (*i).first << " set to " << (*i).second << std::endl;\r
}\r
else\r
\r
void FMSApp::showOptions()\r
{\r
- SQLite3DB::Statement st=SQLite3DB::DB::Instance()->Prepare("SELECT Option, OptionValue FROM tblOption;");\r
+ SQLite3DB::Statement st=m_db->Prepare("SELECT Option, OptionValue FROM tblOption;");\r
st.Step();\r
while(st.RowReturned())\r
{\r
\r
void FMSApp::StartThreads()\r
{\r
- std::string tempval="";\r
+ std::string tempval("");\r
+ Option option(m_db);\r
\r
// always start the DB maintenance thread\r
logger().trace("FMSApp::StartThreads starting DBMaintenanceThread");\r
m_threads.Start(new DBMaintenanceThread());\r
\r
- Option::Instance()->Get("StartHTTP",tempval);\r
+ option.Get("StartHTTP",tempval);\r
if(tempval=="true")\r
{\r
logger().trace("FMSApp::StartThreads starting HTTPThread");\r
}\r
\r
tempval="";\r
- Option::Instance()->Get("StartNNTP",tempval);\r
+ option.Get("StartNNTP",tempval);\r
if(tempval=="true")\r
{\r
logger().trace("FMSApp::StartThreads starting NNTPListener");\r
}\r
\r
tempval="";\r
- Option::Instance()->Get("StartFreenetUpdater",tempval);\r
+ option.Get("StartFreenetUpdater",tempval);\r
if(tempval=="true")\r
{\r
logger().trace("FMSApp::StartThreads starting FreenetMasterThread");\r
#include <xmem.h>\r
#endif\r
\r
-BoardListInserter::BoardListInserter()\r
+BoardListInserter::BoardListInserter(SQLite3DB::DB *db):IIndexInserter<long>(db)\r
{\r
Initialize();\r
}\r
\r
-BoardListInserter::BoardListInserter(FCPv2::Connection *fcp):IIndexInserter<long>(fcp)\r
+BoardListInserter::BoardListInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp):IIndexInserter<long>(db,fcp)\r
{\r
Initialize();\r
}\r
#include <xmem.h>\r
#endif\r
\r
-BoardListRequester::BoardListRequester()\r
+BoardListRequester::BoardListRequester(SQLite3DB::DB *db):IIndexRequester<long>(db)\r
{\r
Initialize();\r
}\r
\r
-BoardListRequester::BoardListRequester(FCPv2::Connection *fcp):IIndexRequester<long>(fcp)\r
+BoardListRequester::BoardListRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp):IIndexRequester<long>(db,fcp)\r
{\r
Initialize();\r
}\r
\r
m_fcpuniquename="BoardListRequester";\r
m_maxrequests=0;\r
+ Option option(m_db);\r
\r
- Option::Instance()->GetInt("MaxBoardListRequests",m_maxrequests);\r
+ option.GetInt("MaxBoardListRequests",m_maxrequests);\r
if(m_maxrequests<0)\r
{\r
m_maxrequests=0;\r
m_log->warning("Option MaxBoardListRequests is currently set at "+tempval+". This value might be incorrectly configured.");\r
}\r
\r
- Option::Instance()->Get("SaveMessagesFromNewBoards",tempval);\r
+ option.Get("SaveMessagesFromNewBoards",tempval);\r
if(tempval=="true")\r
{\r
m_savemessagesfromnewboards=true;\r
m_savemessagesfromnewboards=false;\r
}\r
\r
- Option::Instance()->Get("LocalTrustOverridesPeerTrust",tempval);\r
+ option.Get("LocalTrustOverridesPeerTrust",tempval);\r
if(tempval=="true")\r
{\r
m_localtrustoverrides=true;\r
#include <sstream>\r
#include <algorithm>\r
#include <cstdarg>\r
+#include <cstring>\r
+#include <cstdlib>\r
\r
#ifdef _WIN32\r
#include <ws2tcpip.h>\r
#include <xmem.h>\r
#endif\r
\r
-FileInserter::FileInserter()\r
+FileInserter::FileInserter(SQLite3DB::DB *db):IIndexInserter<long>(db)\r
{\r
Initialize();\r
}\r
\r
-FileInserter::FileInserter(FCPv2::Connection *fcp):IIndexInserter<long>(fcp)\r
+FileInserter::FileInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp):IIndexInserter<long>(db,fcp)\r
{\r
Initialize();\r
}\r
#include <Poco/Timestamp.h>\r
#include <Poco/Timespan.h>\r
\r
-FMSVersionRequester::FMSVersionRequester()\r
+FMSVersionRequester::FMSVersionRequester(SQLite3DB::DB *db):IDatabase(db)\r
{\r
Initialize();\r
}\r
\r
-FMSVersionRequester::FMSVersionRequester(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
+FMSVersionRequester::FMSVersionRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp):IDatabase(db),IFCPConnected(fcp)\r
{\r
Initialize();\r
}\r
if(parts.size()>2)\r
{\r
std::string editionstr=parts[2];\r
- Option::Instance()->Set("FMSVersionEdition",editionstr);\r
+ Option option(m_db);\r
+ option.Set("FMSVersionEdition",editionstr);\r
}\r
\r
// parse file into xml and update the database\r
if(parts.size()>2)\r
{\r
std::string editionstr=parts[2];\r
- Option::Instance()->Set("FMSVersionEdition",editionstr);\r
+ Option option(m_db);\r
+ option.Set("FMSVersionEdition",editionstr);\r
}\r
m_log->debug("FMSVersionRequester::HandleGetFailed Fatal GetFailed for "+message["Identifier"]);\r
}\r
std::string editionstr="0";\r
int edition=0;\r
\r
- Option::Instance()->Get("FMSVersionKey",key);\r
- if(Option::Instance()->Get("FMSVersionEdition",editionstr))\r
+ Option option(m_db);\r
+ option.Get("FMSVersionKey",key);\r
+ if(option.Get("FMSVersionEdition",editionstr))\r
{\r
StringFunctions::Convert(editionstr,edition);\r
edition++;\r
#include <xmem.h>\r
#endif\r
\r
-FreenetMasterThread::FreenetMasterThread()\r
+FreenetMasterThread::FreenetMasterThread():m_receivednodehello(false)\r
{\r
\r
- if(Option::Instance()->Get("FCPHost",m_fcphost)==false)\r
- {\r
- m_fcphost="localhost";\r
- Option::Instance()->Set("FCPHost",m_fcphost);\r
- }\r
- if(Option::Instance()->GetInt("FCPPort",m_fcpport)==false)\r
- {\r
- m_fcpport=9481;\r
- Option::Instance()->Set("FCPPort",m_fcpport);\r
- }\r
- else\r
- {\r
- if(m_fcpport<1 || m_fcpport>65535)\r
- {\r
- m_fcpport=9481;\r
- Option::Instance()->Set("FCPPort",m_fcpport);\r
- }\r
- }\r
-\r
- m_receivednodehello=false;\r
-\r
}\r
\r
FreenetMasterThread::~FreenetMasterThread()\r
\r
m_log->debug("FreenetMasterThread::run thread started.");\r
\r
+ LoadDatabase();\r
+\r
+\r
+\r
Setup();\r
\r
do\r
void FreenetMasterThread::Setup()\r
{\r
\r
+ Option option(m_db);\r
+ if(option.Get("FCPHost",m_fcphost)==false)\r
+ {\r
+ m_fcphost="localhost";\r
+ option.Set("FCPHost",m_fcphost);\r
+ }\r
+ if(option.GetInt("FCPPort",m_fcpport)==false)\r
+ {\r
+ m_fcpport=9481;\r
+ option.Set("FCPPort",m_fcpport);\r
+ }\r
+ else\r
+ {\r
+ if(m_fcpport<1 || m_fcpport>65535)\r
+ {\r
+ m_fcpport=9481;\r
+ option.Set("FCPPort",m_fcpport);\r
+ }\r
+ }\r
+\r
// seed random number generator\r
srand(time(NULL));\r
\r
- m_registrables.push_back(new UnkeyedIDCreator(&m_fcp));\r
- m_registrables.push_back(new IdentityInserter(&m_fcp));\r
- m_registrables.push_back(new IdentityRequester(&m_fcp));\r
- m_registrables.push_back(new UnknownIdentityRequester(&m_fcp));\r
- m_registrables.push_back(new IntroductionPuzzleInserter(&m_fcp));\r
- m_registrables.push_back(new IdentityIntroductionRequester(&m_fcp));\r
- m_registrables.push_back(new IntroductionPuzzleRequester(&m_fcp));\r
- m_registrables.push_back(new IdentityIntroductionInserter(&m_fcp));\r
- m_registrables.push_back(new TrustListInserter(&m_fcp));\r
- m_registrables.push_back(new TrustListRequester(&m_fcp));\r
- m_registrables.push_back(new MessageListInserter(&m_fcp));\r
- m_registrables.push_back(new MessageListRequester(&m_fcp));\r
- m_registrables.push_back(new InactiveMessageListRequester(&m_fcp));\r
- m_registrables.push_back(new MessageInserter(&m_fcp));\r
- m_registrables.push_back(new MessageRequester(&m_fcp));\r
- m_registrables.push_back(new BoardListInserter(&m_fcp));\r
- m_registrables.push_back(new BoardListRequester(&m_fcp));\r
- m_registrables.push_back(new SiteInserter(&m_fcp));\r
- m_registrables.push_back(new FileInserter(&m_fcp));\r
- m_registrables.push_back(new FMSVersionRequester(&m_fcp));\r
+ m_registrables.push_back(new UnkeyedIDCreator(m_db,&m_fcp));\r
+ m_registrables.push_back(new IdentityInserter(m_db,&m_fcp));\r
+ m_registrables.push_back(new IdentityRequester(m_db,&m_fcp));\r
+ m_registrables.push_back(new UnknownIdentityRequester(m_db,&m_fcp));\r
+ m_registrables.push_back(new IntroductionPuzzleInserter(m_db,&m_fcp));\r
+ m_registrables.push_back(new IdentityIntroductionRequester(m_db,&m_fcp));\r
+ m_registrables.push_back(new IntroductionPuzzleRequester(m_db,&m_fcp));\r
+ m_registrables.push_back(new IdentityIntroductionInserter(m_db,&m_fcp));\r
+ m_registrables.push_back(new TrustListInserter(m_db,&m_fcp));\r
+ m_registrables.push_back(new TrustListRequester(m_db,&m_fcp));\r
+ m_registrables.push_back(new MessageListInserter(m_db,&m_fcp));\r
+ m_registrables.push_back(new MessageListRequester(m_db,&m_fcp));\r
+ m_registrables.push_back(new InactiveMessageListRequester(m_db,&m_fcp));\r
+ m_registrables.push_back(new MessageInserter(m_db,&m_fcp));\r
+ m_registrables.push_back(new MessageRequester(m_db,&m_fcp));\r
+ m_registrables.push_back(new BoardListInserter(m_db,&m_fcp));\r
+ m_registrables.push_back(new BoardListRequester(m_db,&m_fcp));\r
+ m_registrables.push_back(new SiteInserter(m_db,&m_fcp));\r
+ m_registrables.push_back(new FileInserter(m_db,&m_fcp));\r
+ m_registrables.push_back(new FMSVersionRequester(m_db,&m_fcp));\r
\r
for(std::vector<IFreenetRegistrable *>::iterator i=m_registrables.begin(); i!=m_registrables.end(); i++)\r
{\r
#include <xmem.h>\r
#endif\r
\r
-IdentityInserter::IdentityInserter()\r
+IdentityInserter::IdentityInserter(SQLite3DB::DB *db):IDatabase(db)\r
{\r
Initialize();\r
}\r
\r
-IdentityInserter::IdentityInserter(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
+IdentityInserter::IdentityInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp):IDatabase(db),IFCPConnected(fcp)\r
{\r
Initialize();\r
}\r
}\r
StringFunctions::Convert(index,indexstr);\r
\r
- Option::Instance()->Get("MessageBase",messagebase);\r
+ Option option(m_db);\r
+ option.Get("MessageBase",messagebase);\r
\r
if(rs.GetField(0))\r
{\r
#include <xmem.h>\r
#endif\r
\r
-IdentityIntroductionInserter::IdentityIntroductionInserter()\r
+IdentityIntroductionInserter::IdentityIntroductionInserter(SQLite3DB::DB *db):IDatabase(db)\r
{\r
Initialize();\r
}\r
\r
-IdentityIntroductionInserter::IdentityIntroductionInserter(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
+IdentityIntroductionInserter::IdentityIntroductionInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp):IDatabase(db),IFCPConnected(fcp)\r
{\r
Initialize();\r
}\r
void IdentityIntroductionInserter::Initialize()\r
{\r
m_inserting=false;\r
- Option::Instance()->Get("MessageBase",m_messagebase);\r
+ Option option(m_db);\r
+ option.Get("MessageBase",m_messagebase);\r
}\r
\r
void IdentityIntroductionInserter::Process()\r
#include <xmem.h>\r
#endif\r
\r
-IdentityIntroductionRequester::IdentityIntroductionRequester()\r
+IdentityIntroductionRequester::IdentityIntroductionRequester(SQLite3DB::DB *db):IDatabase(db)\r
{\r
Initialize();\r
}\r
\r
-IdentityIntroductionRequester::IdentityIntroductionRequester(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
+IdentityIntroductionRequester::IdentityIntroductionRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp):IDatabase(db),IFCPConnected(fcp)\r
{\r
Initialize();\r
}\r
void IdentityIntroductionRequester::Initialize()\r
{\r
m_maxrequests=0;\r
- Option::Instance()->GetInt("MaxIdentityIntroductionRequests",m_maxrequests);\r
+ Option option(m_db);\r
+ option.GetInt("MaxIdentityIntroductionRequests",m_maxrequests);\r
if(m_maxrequests<1)\r
{\r
m_maxrequests=1;\r
{\r
m_log->warning("Option MaxIdentityIntroductionRequests is currently set at more than 100. This value might be incorrectly configured.");\r
}\r
- Option::Instance()->Get("MessageBase",m_messagebase);\r
+ option.Get("MessageBase",m_messagebase);\r
m_tempdate=Poco::Timestamp();\r
}\r
\r
#include <xmem.h>\r
#endif\r
\r
-IdentityRequester::IdentityRequester()\r
+IdentityRequester::IdentityRequester(SQLite3DB::DB *db):IIndexRequester<long>(db)\r
{\r
Initialize();\r
}\r
\r
-IdentityRequester::IdentityRequester(FCPv2::Connection *fcp):IIndexRequester<long>(fcp)\r
+IdentityRequester::IdentityRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp):IIndexRequester<long>(db,fcp)\r
{\r
Initialize();\r
}\r
void IdentityRequester::Initialize()\r
{\r
m_fcpuniquename="KnownIdentityRequester";\r
- Option::Instance()->GetInt("MaxIdentityRequests",m_maxrequests);\r
+ Option option(m_db);\r
+ option.GetInt("MaxIdentityRequests",m_maxrequests);\r
\r
// known identities get 4/5 + any remaining if not evenly divisible - unknown identities get 1/5 of the max requests option\r
m_maxrequests=((m_maxrequests*4)/5)+(m_maxrequests%5);\r
#include <xmem.h>\r
#endif\r
\r
-InactiveMessageListRequester::InactiveMessageListRequester()\r
+InactiveMessageListRequester::InactiveMessageListRequester(SQLite3DB::DB *db):MessageListRequester(db)\r
{\r
Initialize();\r
}\r
\r
-InactiveMessageListRequester::InactiveMessageListRequester(FCPv2::Connection *fcp):MessageListRequester(fcp)\r
+InactiveMessageListRequester::InactiveMessageListRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp):MessageListRequester(db,fcp)\r
{\r
Initialize();\r
}\r
std::string tempval="";\r
\r
m_maxrequests=0;\r
- Option::Instance()->GetInt("MaxMessageListRequests",m_maxrequests);\r
+ Option option(m_db);\r
+ option.GetInt("MaxMessageListRequests",m_maxrequests);\r
\r
// inactive identities get 1/2 of the max requests option - active identities get 1/2 + any remaining if not evenly divisible\r
m_maxrequests=(m_maxrequests/2);\r
}\r
\r
tempval="";\r
- Option::Instance()->Get("LocalTrustOverridesPeerTrust",tempval);\r
+ option.Get("LocalTrustOverridesPeerTrust",tempval);\r
if(tempval=="true")\r
{\r
m_localtrustoverrides=true;\r
}\r
\r
tempval="";\r
- Option::Instance()->Get("SaveMessagesFromNewBoards",tempval);\r
+ option.Get("SaveMessagesFromNewBoards",tempval);\r
if(tempval=="true")\r
{\r
m_savetonewboards=true;\r
\r
m_messagedownloadmaxdaysbackward=5;\r
tempval="5";\r
- Option::Instance()->Get("MessageDownloadMaxDaysBackward",tempval);\r
+ option.Get("MessageDownloadMaxDaysBackward",tempval);\r
StringFunctions::Convert(tempval,m_messagedownloadmaxdaysbackward);\r
\r
}\r
#include <xmem.h>\r
#endif\r
\r
-IntroductionPuzzleInserter::IntroductionPuzzleInserter():IIndexInserter<long>()\r
+IntroductionPuzzleInserter::IntroductionPuzzleInserter(SQLite3DB::DB *db):IIndexInserter<long>(db)\r
{\r
Initialize();\r
}\r
\r
-IntroductionPuzzleInserter::IntroductionPuzzleInserter(FCPv2::Connection *fcp):IIndexInserter<long>(fcp)\r
+IntroductionPuzzleInserter::IntroductionPuzzleInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp):IIndexInserter<long>(db,fcp)\r
{\r
Initialize();\r
}\r
}\r
}\r
\r
- Option::Instance()->Get("MessageBase",messagebase);\r
+ Option option(m_db);\r
+ option.Get("MessageBase",messagebase);\r
\r
GenerateCaptcha(encodedpuzzle,solutionstring);\r
if(encodedpuzzle.size()==0)\r
#include <xmem.h>\r
#endif\r
\r
-IntroductionPuzzleRequester::IntroductionPuzzleRequester()\r
+IntroductionPuzzleRequester::IntroductionPuzzleRequester(SQLite3DB::DB *db):IIndexRequester<long>(db)\r
{\r
Initialize();\r
}\r
\r
-IntroductionPuzzleRequester::IntroductionPuzzleRequester(FCPv2::Connection *fcp):IIndexRequester<long>(fcp)\r
+IntroductionPuzzleRequester::IntroductionPuzzleRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp):IIndexRequester<long>(db,fcp)\r
{\r
Initialize();\r
}\r
{\r
m_fcpuniquename="IntroductionPuzzleRequester";\r
m_maxrequests=0;\r
- Option::Instance()->GetInt("MaxIntroductionPuzzleRequests",m_maxrequests);\r
+ Option option(m_db);\r
+ option.GetInt("MaxIntroductionPuzzleRequests",m_maxrequests);\r
if(m_maxrequests<1)\r
{\r
m_maxrequests=1;\r
#include <Poco/DateTimeFormatter.h>\r
#include <Poco/Timestamp.h>\r
\r
-MessageInserter::MessageInserter()\r
+MessageInserter::MessageInserter(SQLite3DB::DB *db):IIndexInserter<std::string>(db)\r
{\r
Initialize();\r
}\r
\r
-MessageInserter::MessageInserter(FCPv2::Connection *fcp):IIndexInserter<std::string>(fcp)\r
+MessageInserter::MessageInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp):IIndexInserter<std::string>(db,fcp)\r
{\r
Initialize();\r
}\r
#include <xmem.h>\r
#endif\r
\r
-MessageListInserter::MessageListInserter()\r
+MessageListInserter::MessageListInserter(SQLite3DB::DB *db):IIndexInserter<long>(db)\r
{\r
Initialize();\r
}\r
\r
-MessageListInserter::MessageListInserter(FCPv2::Connection *fcp):IIndexInserter<long>(fcp)\r
+MessageListInserter::MessageListInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp):IIndexInserter<long>(db,fcp)\r
{\r
Initialize();\r
}\r
\r
void MessageListInserter::Initialize()\r
{\r
- std::string tempval;\r
-\r
+ std::string tempval("");\r
m_fcpuniquename="MessageListInserter";\r
m_daysbackward=0;\r
- Option::Instance()->Get("MessageListDaysBackward",tempval);\r
+ Option option(m_db);\r
+\r
+ option.Get("MessageListDaysBackward",tempval);\r
StringFunctions::Convert(tempval,m_daysbackward);\r
}\r
\r
#include <xmem.h>\r
#endif\r
\r
-MessageListRequester::MessageListRequester()\r
+MessageListRequester::MessageListRequester(SQLite3DB::DB *db):IIndexRequester<long>(db)\r
{\r
Initialize();\r
}\r
\r
-MessageListRequester::MessageListRequester(FCPv2::Connection *fcp):IIndexRequester<long>(fcp)\r
+MessageListRequester::MessageListRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp):IIndexRequester<long>(db,fcp)\r
{\r
Initialize();\r
}\r
if(data.size()>0 && xml.ParseXML(std::string(data.begin(),data.end()))==true)\r
{\r
\r
+ m_db->Execute("BEGIN;");\r
+\r
SQLite3DB::Statement st=m_db->Prepare("SELECT IdentityID FROM tblMessageRequests WHERE IdentityID=? AND Day=? AND RequestIndex=?;");\r
SQLite3DB::Statement spk=m_db->Prepare("SELECT IdentityID FROM tblIdentity WHERE PublicKey=?;");\r
SQLite3DB::Statement mst=m_db->Prepare("INSERT INTO tblMessageRequests(IdentityID,Day,RequestIndex,FromMessageList) VALUES(?,?,?,'true');");\r
st.Step();\r
st.Finalize();\r
\r
+ m_db->Execute("COMMIT;");\r
+\r
m_log->debug(m_fcpuniquename+"::HandleAllData parsed MessageList XML file : "+message["Identifier"]);\r
}\r
else\r
void MessageListRequester::Initialize()\r
{\r
m_fcpuniquename="ActiveMessageListRequester";\r
- std::string tempval="";\r
-\r
+ std::string tempval("");\r
m_maxrequests=0;\r
- Option::Instance()->GetInt("MaxMessageListRequests",m_maxrequests);\r
+ Option option(m_db);\r
+\r
+ option.GetInt("MaxMessageListRequests",m_maxrequests);\r
\r
// active identities get 1/2 of the max requests option + any remaining if not evenly divisible - inactive identities get 1/2\r
m_maxrequests=(m_maxrequests/2)+(m_maxrequests%2);\r
}\r
\r
tempval="";\r
- Option::Instance()->Get("LocalTrustOverridesPeerTrust",tempval);\r
+ option.Get("LocalTrustOverridesPeerTrust",tempval);\r
if(tempval=="true")\r
{\r
m_localtrustoverrides=true;\r
}\r
\r
tempval="";\r
- Option::Instance()->Get("SaveMessagesFromNewBoards",tempval);\r
+ option.Get("SaveMessagesFromNewBoards",tempval);\r
if(tempval=="true")\r
{\r
m_savetonewboards=true;\r
\r
m_messagedownloadmaxdaysbackward=5;\r
tempval="5";\r
- Option::Instance()->Get("MessageDownloadMaxDaysBackward",tempval);\r
+ option.Get("MessageDownloadMaxDaysBackward",tempval);\r
StringFunctions::Convert(tempval,m_messagedownloadmaxdaysbackward);\r
\r
}\r
#include <xmem.h>\r
#endif\r
\r
-MessageRequester::MessageRequester()\r
+MessageRequester::MessageRequester(SQLite3DB::DB *db):IIndexRequester<std::string>(db)\r
{\r
Initialize();\r
}\r
\r
-MessageRequester::MessageRequester(FCPv2::Connection *fcp):IIndexRequester<std::string>(fcp)\r
+MessageRequester::MessageRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp):IIndexRequester<std::string>(db,fcp)\r
{\r
Initialize();\r
}\r
nntpbody+="\r\n";\r
}\r
\r
+ m_db->Execute("BEGIN;");\r
+\r
st=m_db->Prepare("INSERT INTO tblMessage(IdentityID,FromName,MessageDate,MessageTime,Subject,MessageUUID,ReplyBoardID,Body,MessageIndex) VALUES(?,?,?,?,?,?,?,?,?);");\r
st.Bind(0,identityid);\r
st.Bind(1,GetIdentityName(identityid));\r
//m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"MessageRequester::HandleAddData could not insert message into database. "+message["Identifier"]);\r
}\r
\r
+ m_db->Execute("COMMIT;");\r
+\r
} // if validmessage\r
}\r
else\r
void MessageRequester::Initialize()\r
{\r
m_fcpuniquename="MessageRequester";\r
- std::string tempval;\r
-\r
+ std::string tempval("");\r
m_maxrequests=0;\r
- Option::Instance()->GetInt("MaxMessageRequests",m_maxrequests);\r
+ Option option(m_db);\r
+\r
+ option.GetInt("MaxMessageRequests",m_maxrequests);\r
if(m_maxrequests<1)\r
{\r
m_maxrequests=1;\r
}\r
\r
m_maxdaysbackward=0;\r
- Option::Instance()->GetInt("MessageDownloadMaxDaysBackward",m_maxdaysbackward);\r
+ option.GetInt("MessageDownloadMaxDaysBackward",m_maxdaysbackward);\r
if(m_maxdaysbackward<0)\r
{\r
m_maxdaysbackward=0;\r
}\r
\r
m_maxpeermessages=0;\r
- Option::Instance()->GetInt("MaxPeerMessagesPerDay",m_maxpeermessages);\r
+ option.GetInt("MaxPeerMessagesPerDay",m_maxpeermessages);\r
if(m_maxpeermessages<1)\r
{\r
m_maxpeermessages=1;\r
}\r
\r
m_maxboardspermessage=0;\r
- Option::Instance()->GetInt("MaxBoardsPerMessage",m_maxboardspermessage);\r
+ option.GetInt("MaxBoardsPerMessage",m_maxboardspermessage);\r
if(m_maxboardspermessage<1)\r
{\r
m_maxboardspermessage=1;\r
m_log->warning("Option MaxBoardsPerMessage is currently set at "+tempval+". This value might be incorrectly configured.");\r
}\r
\r
- Option::Instance()->Get("SaveMessagesFromNewBoards",tempval);\r
+ option.Get("SaveMessagesFromNewBoards",tempval);\r
if(tempval=="true")\r
{\r
m_savemessagesfromnewboards=true;\r
m_savemessagesfromnewboards=false;\r
}\r
\r
- Option::Instance()->Get("LocalTrustOverridesPeerTrust",tempval);\r
+ option.Get("LocalTrustOverridesPeerTrust",tempval);\r
if(tempval=="true")\r
{\r
m_localtrustoverrides=true;\r
#include <Poco/DateTime.h>\r
#include <Poco/Timespan.h>\r
#include <Poco/DateTimeFormatter.h>\r
+#include <cstdio>\r
\r
#ifdef XMEM\r
#include <xmem.h>\r
#endif\r
\r
-SiteInserter::SiteInserter()\r
+SiteInserter::SiteInserter(SQLite3DB::DB *db):IIndexInserter<long>(db)\r
{\r
Initialize();\r
}\r
\r
-SiteInserter::SiteInserter(FCPv2::Connection *fcp):IIndexInserter<long>(fcp)\r
+SiteInserter::SiteInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp):IIndexInserter<long>(db,fcp)\r
{\r
Initialize();\r
}\r
#include <xmem.h>\r
#endif\r
\r
-TrustListInserter::TrustListInserter()\r
+TrustListInserter::TrustListInserter(SQLite3DB::DB *db):IDatabase(db)\r
{\r
Initialize();\r
}\r
\r
-TrustListInserter::TrustListInserter(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
+TrustListInserter::TrustListInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp):IDatabase(db),IFCPConnected(fcp)\r
{\r
Initialize();\r
}\r
\r
void TrustListInserter::Initialize()\r
{\r
- Option::Instance()->Get("MessageBase",m_messagebase);\r
+ Option option(m_db);\r
+ option.Get("MessageBase",m_messagebase);\r
m_lastchecked=Poco::Timestamp();\r
}\r
\r
#include <xmem.h>\r
#endif\r
\r
-TrustListRequester::TrustListRequester()\r
+TrustListRequester::TrustListRequester(SQLite3DB::DB *db):IIndexRequester<long>(db)\r
{\r
Initialize();\r
}\r
\r
-TrustListRequester::TrustListRequester(FCPv2::Connection *fcp):IIndexRequester<long>(fcp)\r
+TrustListRequester::TrustListRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp):IIndexRequester<long>(db,fcp)\r
{\r
Initialize();\r
}\r
}\r
st.Finalize();\r
\r
+ m_db->Execute("BEGIN;");\r
+\r
// drop all existing peer trust from this identity - we will rebuild it when we go through each trust in the xml file\r
st=m_db->Prepare("DELETE FROM tblPeerTrust WHERE IdentityID=?;");\r
st.Bind(0,identityid);\r
st.Step();\r
st.Finalize();\r
\r
+ m_db->Execute("COMMIT;");\r
+\r
m_log->debug("TrustListRequester::HandleAllData parsed TrustList XML file : "+message["Identifier"]);\r
}\r
else\r
{\r
std::string tempval="";\r
m_fcpuniquename="TrustListRequester";\r
-\r
m_maxrequests=0;\r
- Option::Instance()->GetInt("MaxIdentityRequests",m_maxrequests);\r
+ Option option(m_db);\r
+\r
+ option.GetInt("MaxIdentityRequests",m_maxrequests);\r
if(m_maxrequests<1)\r
{\r
m_maxrequests=1;\r
#include <xmem.h>\r
#endif\r
\r
-UnkeyedIDCreator::UnkeyedIDCreator()\r
+UnkeyedIDCreator::UnkeyedIDCreator(SQLite3DB::DB *db):IDatabase(db)\r
{\r
Initialize();\r
}\r
\r
-UnkeyedIDCreator::UnkeyedIDCreator(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
+UnkeyedIDCreator::UnkeyedIDCreator(SQLite3DB::DB *db, FCPv2::Connection *fcp):IDatabase(db),IFCPConnected(fcp)\r
{\r
Initialize();\r
}\r
#include <xmem.h>\r
#endif\r
\r
-UnknownIdentityRequester::UnknownIdentityRequester()\r
+UnknownIdentityRequester::UnknownIdentityRequester(SQLite3DB::DB *db):IdentityRequester(db)\r
{\r
Initialize();\r
}\r
\r
-UnknownIdentityRequester::UnknownIdentityRequester(FCPv2::Connection *fcp):IdentityRequester(fcp)\r
+UnknownIdentityRequester::UnknownIdentityRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp):IdentityRequester(db,fcp)\r
{\r
Initialize();\r
}\r
\r
void UnknownIdentityRequester::Initialize()\r
{\r
+ Option option(m_db);\r
+\r
m_fcpuniquename="UnknownIdentityRequester";\r
- Option::Instance()->GetInt("MaxIdentityRequests",m_maxrequests);\r
+ option.GetInt("MaxIdentityRequests",m_maxrequests);\r
\r
// unknown identities get 1/5 of the max requests option - known identities get 4/5 + any remaining if not evenly divisible\r
m_maxrequests=(m_maxrequests/5);\r
#include "../../include/http/pages/forumthreadspage.h"\r
#include "../../include/http/pages/forumviewthreadpage.h"\r
#include "../../include/http/pages/forumcreatepostpage.h"\r
+//ROBERT CHANGE\r
+#include "../../include/http/pages/showpendingmessagepage.h"\r
\r
-FMSHTTPRequestHandlerFactory::FMSHTTPRequestHandlerFactory()\r
+#include <cstdio>\r
+\r
+FMSHTTPRequestHandlerFactory::FMSHTTPRequestHandlerFactory(SQLite3DB::DB *db):IDatabase(db)\r
{\r
+ Option option(m_db);\r
+\r
// set template\r
std::string templatestr="<html><head></head><body><a href=\"home.htm\">Home</a><br><h1>Could not open template.htm! Place in program directory and restart!</h1><br>[CONTENT]</body></html>";\r
FILE *infile=fopen("template.htm","rb");\r
}\r
\r
// push back page handlers\r
- m_pagehandlers.push_back(new OptionsPage(templatestr));\r
- m_pagehandlers.push_back(new CreateIdentityPage(templatestr));\r
- m_pagehandlers.push_back(new LocalIdentitiesPage(templatestr));\r
- m_pagehandlers.push_back(new ConfirmPage(templatestr));\r
- m_pagehandlers.push_back(new ShowCaptchaPage());\r
- m_pagehandlers.push_back(new AnnounceIdentityPage(templatestr));\r
- m_pagehandlers.push_back(new ExecQueryPage(templatestr));\r
- m_pagehandlers.push_back(new BoardsPage(templatestr));\r
- m_pagehandlers.push_back(new InsertedFilesPage(templatestr));\r
- m_pagehandlers.push_back(new AddPeerPage(templatestr));\r
- m_pagehandlers.push_back(new PeerDetailsPage(templatestr));\r
- m_pagehandlers.push_back(new ControlBoardPage(templatestr));\r
- m_pagehandlers.push_back(new PeerMaintenancePage(templatestr));\r
- m_pagehandlers.push_back(new PeerTrustPage(templatestr));\r
- m_pagehandlers.push_back(new VersionInfoPage(templatestr));\r
- m_pagehandlers.push_back(new RecentlyAddedPage(templatestr));\r
- m_pagehandlers.push_back(new ShowImagePage());\r
- m_pagehandlers.push_back(new ForumMainPage(forumtemplate));\r
- m_pagehandlers.push_back(new ForumThreadsPage(forumtemplate));\r
- m_pagehandlers.push_back(new ForumViewThreadPage(forumtemplate));\r
- m_pagehandlers.push_back(new ForumCreatePostPage(forumtemplate));\r
+ m_pagehandlers.push_back(new OptionsPage(m_db,templatestr));\r
+ m_pagehandlers.push_back(new CreateIdentityPage(m_db,templatestr));\r
+ m_pagehandlers.push_back(new LocalIdentitiesPage(m_db,templatestr));\r
+ m_pagehandlers.push_back(new ConfirmPage(m_db,templatestr));\r
+ m_pagehandlers.push_back(new ShowCaptchaPage(m_db));\r
+ m_pagehandlers.push_back(new AnnounceIdentityPage(m_db,templatestr));\r
+ m_pagehandlers.push_back(new ExecQueryPage(m_db,templatestr));\r
+ m_pagehandlers.push_back(new BoardsPage(m_db,templatestr));\r
+ m_pagehandlers.push_back(new InsertedFilesPage(m_db,templatestr));\r
+ m_pagehandlers.push_back(new AddPeerPage(m_db,templatestr));\r
+ m_pagehandlers.push_back(new PeerDetailsPage(m_db,templatestr));\r
+ m_pagehandlers.push_back(new ControlBoardPage(m_db,templatestr));\r
+ m_pagehandlers.push_back(new PeerMaintenancePage(m_db,templatestr));\r
+ m_pagehandlers.push_back(new PeerTrustPage(m_db,templatestr));\r
+ m_pagehandlers.push_back(new VersionInfoPage(m_db,templatestr));\r
+ m_pagehandlers.push_back(new RecentlyAddedPage(m_db,templatestr));\r
+ m_pagehandlers.push_back(new ShowImagePage(m_db));\r
+ m_pagehandlers.push_back(new ForumMainPage(m_db,forumtemplate));\r
+ m_pagehandlers.push_back(new ForumThreadsPage(m_db,forumtemplate));\r
+ m_pagehandlers.push_back(new ForumViewThreadPage(m_db,forumtemplate));\r
+ m_pagehandlers.push_back(new ForumCreatePostPage(m_db,forumtemplate));\r
+ //ROBERT CHANGE\r
+ m_pagehandlers.push_back(new ShowPendingMessagePage(m_db,templatestr));\r
// homepage must be last - catch all page handler\r
- m_pagehandlers.push_back(new HomePage(templatestr));\r
+ m_pagehandlers.push_back(new HomePage(m_db,templatestr));\r
\r
// initialize the access control list\r
std::string aclstr;\r
std::vector<std::string> aclparts;\r
- Option::Instance()->Get("HTTPAccessControl",aclstr);\r
+ option.Get("HTTPAccessControl",aclstr);\r
StringFunctions::Split(aclstr,",",aclparts);\r
for(std::vector<std::string>::iterator i=aclparts.begin(); i!=aclparts.end(); i++)\r
{\r
HTTPThread::HTTPThread()\r
{\r
m_listenport=8080;\r
- std::string portstr;\r
- Option::Instance()->Get("HTTPListenPort",portstr);\r
- StringFunctions::Convert(portstr,m_listenport);\r
}\r
\r
void HTTPThread::run()\r
{\r
m_log->debug("HTTPThread::run thread started.");\r
\r
+ LoadDatabase();\r
+ Option option(m_db);\r
+\r
+ std::string portstr("8080");\r
+ option.Get("HTTPListenPort",portstr);\r
+ StringFunctions::Convert(portstr,m_listenport);\r
+\r
try\r
{\r
Poco::Net::ServerSocket sock(m_listenport);\r
Poco::Net::HTTPServerParams* pParams = new Poco::Net::HTTPServerParams;\r
pParams->setMaxQueued(30);\r
pParams->setMaxThreads(5);\r
- Poco::Net::HTTPServer srv(new FMSHTTPRequestHandlerFactory,sock,pParams);\r
+ Poco::Net::HTTPServer srv(new FMSHTTPRequestHandlerFactory(m_db),sock,pParams);\r
\r
srv.start();\r
m_log->trace("Started HTTPServer");\r
#include "../../include/http/ipagehandler.h"\r
#include "../../include/stringfunctions.h"\r
#include "../../include/http/multipartparser.h"\r
-#include "../../include/db/sqlite3db.h"\r
\r
#include <Poco/Net/HTMLForm.h>\r
#include <Poco/UUIDGenerator.h>\r
{\r
}\r
\r
- SQLite3DB::Statement st=SQLite3DB::DB::Instance()->Prepare("INSERT INTO tmpFormPassword(Date,Password) VALUES(?,?);");\r
+ SQLite3DB::Statement st=m_db->Prepare("INSERT INTO tmpFormPassword(Date,Password) VALUES(?,?);");\r
st.Bind(0,Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S"));\r
st.Bind(1,uuid.toString());\r
st.Step();\r
Poco::DateTime date;\r
date-=Poco::Timespan(0,1,0,0,0);\r
\r
- SQLite3DB::Statement st=SQLite3DB::DB::Instance()->Prepare("DELETE FROM tmpFormPassword WHERE Date<?;");\r
+ SQLite3DB::Statement st=m_db->Prepare("DELETE FROM tmpFormPassword WHERE Date<?;");\r
st.Bind(0,Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S"));\r
st.Step();\r
\r
std::map<std::string,std::string>::const_iterator i=vars.find("formpassword");\r
if(i!=vars.end())\r
{\r
- st=SQLite3DB::DB::Instance()->Prepare("SELECT COUNT(*) FROM tmpFormPassword WHERE Password=?;");\r
+ st=m_db->Prepare("SELECT COUNT(*) FROM tmpFormPassword WHERE Password=?;");\r
st.Bind(0,(*i).second);\r
st.Step();\r
if(st.RowReturned())\r
\r
if(error=="")\r
{\r
- Message mess;\r
+ Message mess(m_db);\r
\r
long localidentityid=-1;\r
long boardid=-1;\r
const std::string HomePage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
{\r
\r
+ Option option(m_db);\r
+\r
std::string messagecountstr="";\r
std::string filecountstr="";\r
std::string fcphost="127.0.0.1";\r
std::string fproxyport="8888";\r
\r
- Option::Instance()->Get("FCPHost",fcphost);\r
- Option::Instance()->Get("FProxyPort",fproxyport);\r
+ option.Get("FCPHost",fcphost);\r
+ option.Get("FProxyPort",fproxyport);\r
\r
if(queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="shutdown" && ValidateFormPassword(queryvars))\r
{\r
{\r
st.ResultText(0,messagecountstr);\r
}\r
- content+="Messages waiting to be inserted:"+messagecountstr+"<br>";\r
+ content+="Messages waiting to be inserted:"+messagecountstr;\r
+ if (messagecountstr!="0") //show link to message page\r
+ {\r
+ content+=" (<a href=\"showpendingmessage.htm\">show messages</a>)";\r
+ }\r
+ content+="<br>";\r
st=m_db->Prepare("SELECT COUNT(*) FROM tblFileInserts WHERE Key IS NULL;");\r
st.Step();\r
if(st.RowReturned())\r
st.ResultText(0,filecountstr);\r
}\r
content+="Files waiting to be inserted:"+filecountstr+"<br>";\r
-\r
content+="<p class=\"paragraph\">";\r
content+="<form name=\"frmshutdown\" method=\"POST\">";\r
content+=CreateFormPassword();\r
{\r
std::string content="<h2>Inserted Files</h2>";\r
\r
+ Option option(m_db);\r
std::string node="localhost";\r
- Option::Instance()->Get("FCPHost",node);\r
+ option.Get("FCPHost",node);\r
std::string fproxyport="8888";\r
- Option::Instance()->Get("FProxyPort",fproxyport);\r
-\r
+ option.Get("FProxyPort",fproxyport);\r
\r
if(queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="removefile" && queryvars.find("fileid")!=queryvars.end() && ValidateFormPassword(queryvars))\r
{\r
#include <xmem.h>\r
#endif\r
\r
-const std::string OptionsPage::CreateDropDown(const std::string &name, const std::vector<std::string> &items, const std::string &selecteditem)\r
+int OptionsPage::m_mode=1;\r
+\r
+const std::string OptionsPage::CreateDropDown(const std::string &name, const std::vector<std::string> &items, const std::string &selecteditem, const std::string ¶m1, const std::string ¶m2)\r
{\r
- std::string rval="";\r
+ std::string rval("");\r
\r
rval+="<select name=\""+name+"\">";\r
\r
return rval;\r
}\r
\r
+const std::string OptionsPage::CreateTextArea(const std::string &name, const std::string ¤tvalue, const std::string ¶m1, const std::string ¶m2)\r
+{\r
+ std::string html("");\r
+\r
+ html+="<textarea name=\""+name+"\"";\r
+ if(param1!="")\r
+ {\r
+ html+=" cols=\""+param1+"\"";\r
+ }\r
+ if(param2!="")\r
+ {\r
+ html+=" rows=\""+param2+"\"";\r
+ }\r
+ html+=">";\r
+ html+=SanitizeTextAreaOutput(currentvalue);\r
+ html+="</textarea>";\r
+\r
+ return html;\r
+}\r
+\r
+const std::string OptionsPage::CreateTextBox(const std::string &name, const std::string ¤tvalue, const std::string ¶m1, const std::string ¶m2)\r
+{\r
+ std::string html("");\r
+\r
+ html+="<input type=\"text\" name=\""+name+"\" value=\""+currentvalue+"\"";\r
+ if(param1!="")\r
+ {\r
+ html+=" size=\""+param1+"\"";\r
+ }\r
+ if(param2!="")\r
+ {\r
+ html+=" maxlength=\""+param2+"\"";\r
+ }\r
+ html+=">";\r
+\r
+ return html;\r
+\r
+}\r
+\r
const std::string OptionsPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
{\r
- std::string content="<h2 style=\"text-align:center;\">Options</h2>\r\n";\r
- content+="<form name=\"frmoptions\" method=\"POST\"><input type=\"hidden\" name=\"formaction\" value=\"save\">";\r
- content+=CreateFormPassword();\r
- content+="<table><tr><th>Option</th><th>Value</th><th>Description</th></tr>";\r
+ std::string content("");\r
+ std::string sql("");\r
\r
if(queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="save" && ValidateFormPassword(queryvars))\r
{\r
\r
}\r
\r
- SQLite3DB::Statement st=m_db->Prepare("SELECT Option,OptionValue,OptionDescription,Section,ValidValues FROM tblOption ORDER BY SortOrder;");\r
+ if(queryvars.find("mode")!=queryvars.end())\r
+ {\r
+ if((*queryvars.find("mode")).second=="2")\r
+ {\r
+ m_mode=2;\r
+ }\r
+ else\r
+ {\r
+ m_mode=1;\r
+ }\r
+ }\r
+\r
+ content+="<h2 style=\"text-align:center;\">Options</h2>\r\n";\r
+ content+="<div style=\"text-align:center;\">";\r
+ if(m_mode==1)\r
+ {\r
+ content+="Simple | <a href=\""+m_pagename+"?mode=2\">Advanced</a>";\r
+ }\r
+ else\r
+ {\r
+ content+="<a href=\""+m_pagename+"?mode=1\">Simple</a> | Advanced</a>";\r
+ }\r
+ content+="</div>";\r
+\r
+ content+="<form name=\"frmoptions\" method=\"POST\"><input type=\"hidden\" name=\"formaction\" value=\"save\">";\r
+ content+=CreateFormPassword();\r
+ content+="<table>\r\n";\r
+\r
+ if(m_mode==1)\r
+ {\r
+ sql="SELECT Option,OptionValue,OptionDescription,Section,ValidValues,DisplayType,DisplayParam1,DisplayParam2 FROM tblOption WHERE Mode='simple' ORDER BY SortOrder;";\r
+ }\r
+ else\r
+ {\r
+ sql="SELECT Option,OptionValue,OptionDescription,Section,ValidValues,DisplayType,DisplayParam1,DisplayParam2 FROM tblOption ORDER BY SortOrder;";\r
+ }\r
+ SQLite3DB::Statement st=m_db->Prepare(sql);\r
st.Step();\r
\r
int count=0;\r
std::string countstr;\r
- std::string lastsection="";\r
+ std::string lastsection("");\r
while(st.RowReturned())\r
{\r
- std::string option;\r
- std::string value;\r
- std::string description;\r
- std::string section;\r
- std::string validvalues;\r
+ std::string option("");\r
+ std::string value("");\r
+ std::string description("");\r
+ std::string section("");\r
+ std::string validvalues("");\r
std::vector<std::string> validvaluevec;\r
+ std::string displaytype("");\r
+ std::string displayparam1("");\r
+ std::string displayparam2("");\r
\r
st.ResultText(0,option);\r
st.ResultText(1,value);\r
st.ResultText(4,validvalues);\r
StringFunctions::Split(validvalues,"|",validvaluevec);\r
}\r
+ st.ResultText(5,displaytype);\r
+ st.ResultText(6,displayparam1);\r
+ st.ResultText(7,displayparam2);\r
\r
if(section!=lastsection)\r
{\r
\r
StringFunctions::Convert(count,countstr);\r
content+="<tr>";\r
- content+="<td valign=\"top\"><input type=\"hidden\" name=\"option["+countstr+"]\" value=\""+option+"\">"+option+"</td>";\r
+ content+="<td valign=\"top\" class=\"optionname\"><input type=\"hidden\" name=\"option["+countstr+"]\" value=\""+option+"\">"+option+"</td>";\r
content+="<td valign=\"top\"><input type=\"hidden\" name=\"oldvalue["+countstr+"]\" value=\""+value+"\">";\r
\r
+ if(displaytype=="textbox")\r
+ {\r
+ content+=CreateTextBox("value["+countstr+"]",value,displayparam1,displayparam2);\r
+ }\r
+ else if(displaytype=="select")\r
+ {\r
+ content+=CreateDropDown("value["+countstr+"]",validvaluevec,value,displayparam1,displayparam2);\r
+ }\r
+ else if(displaytype=="textarea")\r
+ {\r
+ content+=CreateTextArea("value["+countstr+"]",value,displayparam1,displayparam2);\r
+ }\r
+ else\r
+ {\r
+ content+="Currently Unsupported";\r
+ }\r
+\r
+ /*\r
if(validvaluevec.size()>0)\r
{\r
content+=CreateDropDown("value["+countstr+"]",validvaluevec,value);\r
}\r
else if(value!="true" && value!="false")\r
{\r
- content+="<input type=\"text\" name=\"value["+countstr+"]\" value=\""+value+"\"></td>";\r
+ content+="<input type=\"text\" name=\"value["+countstr+"]\" value=\""+value+"\">";\r
}\r
else\r
{\r
content+=CreateTrueFalseDropDown("value["+countstr+"]",value);\r
}\r
+ */\r
\r
- content+="<td valign=\"top\">"+description+"</td>";\r
- content+="</tr>";\r
+ content+="</td></tr>\r\n";\r
+ content+="<tr><td valign=\"top\" class=\"optiondescription\" colspan=\"2\">"+description+"</td>";\r
+ content+="</tr>\r\n";\r
st.Step();\r
count++;\r
}\r
std::string publishtrustlist="";\r
std::string messagebase="";\r
\r
+ Option option(m_db);\r
std::string fproxyport="8888";\r
- Option::Instance()->Get("FProxyPort",fproxyport);\r
- Option::Instance()->Get("MessageBase",messagebase);\r
+ option.Get("FProxyPort",fproxyport);\r
+ option.Get("MessageBase",messagebase);\r
+ option.Get("FCPHost",fcphost);\r
\r
if(queryvars.find("identityid")!=queryvars.end() && (*queryvars.find("identityid")).second!="")\r
{\r
del.Step();\r
}\r
\r
- Option::Instance()->Get("FCPHost",fcphost);\r
-\r
SQLite3DB::Statement st=m_db->Prepare("SELECT Name,PublicKey,DateAdded,LastSeen,AddedMethod,Hidden,FreesiteEdition,PublishTrustList FROM tblIdentity WHERE IdentityID=?;");\r
st.Bind(0,identityid);\r
st.Step();\r
#include "../../../include/http/pages/showimagepage.h"\r
\r
+#include <cstdio>\r
+\r
#ifdef XMEM\r
#include <xmem.h>\r
#endif\r
--- /dev/null
+#include "../../../include/http/pages/showpendingmessagepage.h"\r
+#include "../../../include/stringfunctions.h"\r
+#include "../../../include/global.h"\r
+#include "../../../include/fmsapp.h"\r
+#include "../../../include/option.h"\r
+#include "../../../include/localidentity.h"\r
+#include "../../../include/freenet/messagexml.h"\r
+\r
+#ifdef XMEM\r
+ #include <xmem.h>\r
+#endif\r
+\r
+const std::string ShowPendingMessagePage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
+{\r
+ if(queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="delete" && ValidateFormPassword(queryvars))\r
+ {\r
+ m_log->information("User requested to delete message "+(*queryvars.find("uuid")).second);\r
+ m_db->Execute("DELETE FROM tblMessageInserts WHERE MessageUUID=\""+(*queryvars.find("uuid")).second+"\"");\r
+ }\r
+\r
+ SQLite3DB::Statement st=m_db->Prepare("SELECT LocalIdentityID, MessageXML, SendDate, MessageUUID FROM tblMessageInserts WHERE Inserted='false';");\r
+ st.Step();\r
+ int msgcount=0;\r
+ std::string tblcontent="";\r
+ std::string content="";\r
+ tblcontent+="<table><tr><td>Identity</td><td>Boards</td><td>Subject</td><td>Time</td></tr>";\r
+ while (st.RowReturned())\r
+ { \r
+ int identityid=0;\r
+ std::string time("");\r
+ std::string uuid("");\r
+ std::string subject("");\r
+\r
+ st.ResultInt(0,identityid);\r
+ st.ResultText(2,time);\r
+ st.ResultText(3, uuid);\r
+\r
+ LocalIdentity ident(m_db); //found a canned way, thanks SomeDude!\r
+ ident.Load(identityid);\r
+\r
+ tblcontent+="<tr><td>";\r
+ tblcontent+=SanitizeOutput(ident.GetName())+"</td><td>";\r
+ //yes, the next bit sucks but there's no better way to do it (that I could find)\r
+ //we will look at the message XML to find the board(s) posted to.... \r
+ std::string xml="";\r
+ st.ResultText(1,xml);\r
+ MessageXML mxml;\r
+ mxml.ParseXML(xml);\r
+ std::vector<std::string> boards=mxml.GetBoards();\r
+ std::vector<std::string>::iterator iter;\r
+ for (iter=boards.begin(); iter!=boards.end(); iter++) tblcontent+=*iter+", ";\r
+ tblcontent.erase(tblcontent.length()-2); //strip final ", "\r
+ tblcontent+="</td><td>";\r
+ subject=mxml.GetSubject();\r
+ tblcontent+=subject;\r
+ tblcontent+="</td><td>";\r
+ tblcontent+=time+"</td><td>";\r
+ //button\r
+ tblcontent+="<form name=\"frmdelete\" method=\"POST\">";\r
+ tblcontent+=CreateFormPassword();\r
+ tblcontent+="<input type=\"hidden\" name=\"formaction\" value=\"delete\">";\r
+ tblcontent+="<input type=\"hidden\" name=\"uuid\" value=\""+uuid+"\">";\r
+ tblcontent+="<input type=\"submit\" value=\"Delete Message\">";\r
+ tblcontent+="</form>";\r
+ tblcontent+="</td></tr>";\r
+ st.Step();\r
+ msgcount++;\r
+ }\r
+ tblcontent+="</table>";\r
+\r
+ std::string msgcountstr("");\r
+ StringFunctions::Convert(msgcount,msgcountstr);\r
+ content="<h2>"+msgcountstr+" messages waiting to be inserted</h2>";\r
+\r
+ content+=tblcontent;\r
+\r
+ return StringFunctions::Replace(m_template,"[CONTENT]",content);\r
+}\r
#include <xmem.h>\r
#endif\r
\r
-LocalIdentity::LocalIdentity()\r
+LocalIdentity::LocalIdentity(SQLite3DB::DB *db):IDatabase(db)\r
{\r
Initialize();\r
}\r
#include <xmem.h>\r
#endif\r
\r
-Message::Message()\r
+Message::Message(SQLite3DB::DB *db):IDatabase(db)\r
{\r
Initialize();\r
}\r
\r
-Message::Message(const long messageid)\r
+Message::Message(SQLite3DB::DB *db, const long messageid):IDatabase(db)\r
{\r
Load(messageid);\r
}\r
m_inreplyto.clear();\r
m_fileattachments.clear();\r
m_changemessagetrustonreply=0;\r
- Option::Instance()->Get("ChangeMessageTrustOnReply",tempval);\r
+ Option option(m_db);\r
+\r
+ option.Get("ChangeMessageTrustOnReply",tempval);\r
StringFunctions::Convert(tempval,m_changemessagetrustonreply);\r
- Option::Instance()->Get("AddNewPostFromIdentities",tempval);\r
+ option.Get("AddNewPostFromIdentities",tempval);\r
if(tempval=="true")\r
{\r
m_addnewpostfromidentities=true;\r
m_addnewpostfromidentities=false;\r
}\r
tempval="50";\r
- Option::Instance()->Get("MinLocalMessageTrust",tempval);\r
+ option.Get("MinLocalMessageTrust",tempval);\r
StringFunctions::Convert(tempval,m_minlocalmessagetrust);\r
tempval="51";\r
- Option::Instance()->Get("MinLocalTrustListTrust",tempval);\r
+ option.Get("MinLocalTrustListTrust",tempval);\r
StringFunctions::Convert(tempval,m_minlocaltrustlisttrust);\r
}\r
\r
{\r
int result;\r
st.ResultInt(0,result);\r
- push_back(Message(result));\r
+ push_back(Message(m_db,result));\r
st.Step();\r
}\r
\r
#include <xmem.h>\r
#endif\r
\r
-TrustExtension::TrustExtension()\r
+TrustExtension::TrustExtension(SQLite3DB::DB *db):IDatabase(db)\r
{\r
m_localidentityid=-1;\r
}\r
\r
-TrustExtension::TrustExtension(const int &localidentityid)\r
+TrustExtension::TrustExtension(SQLite3DB::DB *db, const int &localidentityid):IDatabase(db)\r
{\r
m_localidentityid=localidentityid;\r
}\r
#include <stdlib.h>\r
#include <time.h>\r
#include <cstring>\r
+#include <cstdio>\r
\r
#ifndef _WIN32\r
#define stricmp strcasecmp\r
#include <xmem.h>\r
#endif\r
\r
-NNTPConnection::NNTPConnection(SOCKET sock):m_socket(sock)\r
+NNTPConnection::NNTPConnection(SOCKET sock):m_socket(sock),m_status(0)\r
{\r
- std::string tempval("");\r
\r
m_tempbuffer.resize(32768);\r
\r
m_status.m_mode=MODE_NONE;\r
m_status.m_authenticated=false;\r
\r
- Option::Instance()->Get("NNTPAllowPost",tempval);\r
- if(tempval=="true")\r
- {\r
- m_status.m_allowpost=true;\r
- }\r
-\r
}\r
\r
NNTPConnection::~NNTPConnection()\r
}\r
if(arg=="USER")\r
{\r
- LocalIdentity localid;\r
+ LocalIdentity localid(m_db);\r
if(localid.Load(name))\r
{\r
m_status.m_authuser=localid;\r
nntpname+=command.m_arguments[i];\r
}\r
\r
- TrustExtension tr(m_status.m_authuser.GetID());\r
+ TrustExtension tr(m_db,m_status.m_authuser.GetID());\r
\r
if(type=="MESSAGE")\r
{\r
{\r
if(m_status.m_authenticated)\r
{\r
- TrustExtension tr(m_status.m_authuser.GetID());\r
+ TrustExtension tr(m_db,m_status.m_authuser.GetID());\r
std::map<std::string,TrustExtension::trust> trustlist;\r
if(tr.GetTrustList(trustlist))\r
{\r
{\r
if(command.m_arguments.size()==1)\r
{\r
- Board board;\r
+ Board board(m_db);\r
if(board.Load(command.m_arguments[0])==true)\r
{\r
std::ostringstream tempstr;\r
{\r
if(m_status.m_messageid!=-1)\r
{\r
- Message mess;\r
+ Message mess(m_db);\r
\r
if(mess.LoadPrevious(m_status.m_messageid,m_status.m_boardid))\r
{\r
{\r
bool show;\r
std::ostringstream tempstr;\r
- BoardList bl;\r
+ BoardList bl(m_db);\r
bl.Load();\r
\r
SendBufferedLine("215 list of newsgroups follows");\r
{\r
bool show;\r
std::ostringstream tempstr;\r
- BoardList bl;\r
+ BoardList bl(m_db);\r
bl.Load();\r
\r
SendBufferedLine("215 list of newsgroups follows");\r
{\r
\r
std::ostringstream tempstr;\r
- Board board;\r
+ Board board(m_db);\r
bool validgroup=false;\r
int lownum=-1;\r
int highnum=-1;\r
tempstr << "211 " << board.GetMessageCount() << " " << board.GetLowMessageID() << " " << board.GetHighMessageID() << " " << board.GetBoardName();\r
SendBufferedLine(tempstr.str());\r
\r
- MessageList ml;\r
+ MessageList ml(m_db);\r
ml.LoadRange(lownum,highnum,board.GetBoardID());\r
\r
for(std::vector<Message>::iterator i=ml.begin(); i!=ml.end(); i++)\r
}\r
}\r
\r
- BoardList bl;\r
+ BoardList bl(m_db);\r
\r
bl.LoadNew(Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S"));\r
\r
{\r
if(m_status.m_messageid!=-1)\r
{\r
- Message mess;\r
+ Message mess(m_db);\r
\r
if(mess.LoadNext(m_status.m_messageid,m_status.m_boardid))\r
{\r
\r
if(messageuuid!="")\r
{\r
- Message mess;\r
+ Message mess(m_db);\r
if(mess.Load(messageuuid))\r
{\r
SendBufferedLine("224 Overview information follows");\r
}\r
else\r
{\r
- Board bd;\r
+ Board bd(m_db);\r
if(m_status.m_boardid!=-1 && bd.Load(m_status.m_boardid))\r
{\r
// single message\r
if(highmessageid==-2)\r
{\r
- Message mess;\r
+ Message mess(m_db);\r
if(mess.Load(lowmessageid,m_status.m_boardid))\r
{\r
SendBufferedLine("224 Overview information follows");\r
// range with no upper bound\r
else if(highmessageid==-1)\r
{\r
- MessageList ml;\r
+ MessageList ml(m_db);\r
ml.LoadRange(lowmessageid,bd.GetHighMessageID(),m_status.m_boardid);\r
if(ml.size()>0)\r
{\r
// range with upper and lower bound\r
else if(highmessageid>=lowmessageid)\r
{\r
- MessageList ml;\r
+ MessageList ml(m_db);\r
ml.LoadRange(lowmessageid,highmessageid,m_status.m_boardid);\r
if(ml.size()>0)\r
{\r
\r
void NNTPConnection::HandlePostedMessage(const std::string &message)\r
{\r
- Message mess;\r
+ Message mess(m_db);\r
\r
if(mess.ParseNNTPMessage(message))\r
{\r
valid=true;\r
}\r
\r
- TrustExtension tr(m_status.m_authuser.GetID());\r
+ TrustExtension tr(m_db,m_status.m_authuser.GetID());\r
\r
if(type=="MESSAGE")\r
{\r
struct timeval tv;\r
fd_set writefs,readfs;\r
int rval;\r
+ std::string tempval("");\r
+\r
+ LoadDatabase();\r
+\r
+ m_status.m_authuser.SetDB(m_db);\r
+ Option option(m_db);\r
+ option.Get("NNTPAllowPost",tempval);\r
+ if(tempval=="true")\r
+ {\r
+ m_status.m_allowpost=true;\r
+ }\r
\r
// seed random number generater for this thread\r
srand(time(NULL));\r
successcode="223";\r
}\r
\r
- Message message;\r
+ Message message(m_db);\r
int messageid=m_status.m_messageid;\r
std::string articleid="";\r
int type=0; // default to current messageid, 1=messageid, 2=articleid\r
\r
m_log->debug("NNTPListener::run thread started.");\r
\r
+ LoadDatabase();\r
+\r
StartListen();\r
\r
do\r
void NNTPListener::StartListen()\r
{\r
\r
- std::string bindaddresses;\r
std::vector<std::string> listenaddresses;\r
+ std::string bindaddresses; \r
std::string nntpport;\r
- if(Option::Instance()->Get("NNTPListenPort",nntpport)==false)\r
+ Option option(m_db);\r
+\r
+ if(option.Get("NNTPListenPort",nntpport)==false)\r
{\r
nntpport="1119";\r
- Option::Instance()->Set("NNTPListenPort",nntpport);\r
+ option.Set("NNTPListenPort",nntpport);\r
}\r
- if(Option::Instance()->Get("NNTPBindAddresses",bindaddresses)==false)\r
+ if(option.Get("NNTPBindAddresses",bindaddresses)==false)\r
{\r
bindaddresses="127.0.0.1";\r
- Option::Instance()->Set("NNTPBindAddresses",bindaddresses);\r
+ option.Set("NNTPBindAddresses",bindaddresses);\r
}\r
+\r
StringFunctions::Split(bindaddresses,",",listenaddresses);\r
\r
for(std::vector<std::string>::iterator i=listenaddresses.begin(); i!=listenaddresses.end(); i++)\r
#include "../../include/nntp/uwildmat.h"\r
#include <string>\r
#include <cstring>\r
+#ifndef _WIN32\r
+#include <stdint.h>\r
+#endif\r
\r
#define ABORT -1\r
\r
\r
const bool Option::Get(const std::string &option, std::string &value)\r
{\r
- SQLite3DB::Statement st=SQLite3DB::DB::Instance()->Prepare("SELECT OptionValue FROM tblOption WHERE Option=?;");\r
+ SQLite3DB::Statement st=m_db->Prepare("SELECT OptionValue FROM tblOption WHERE Option=?;");\r
st.Bind(0,option);\r
st.Step();\r
if(st.RowReturned())\r
#include <string>\r
#include <sstream>\r
\r
-void SetupDefaultOptions()\r
+void SetupDefaultOptions(SQLite3DB::DB *db)\r
{\r
// OptionValue should always be inserted as a string, even if the option really isn't a string - just to keep the field data type consistent\r
\r
+ db->Execute("BEGIN;");\r
+\r
std::ostringstream tempstr; // must set tempstr to "" between db inserts\r
- SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
SQLite3DB::Statement st=db->Prepare("INSERT INTO tblOption(Option,OptionValue) VALUES(?,?);");\r
- SQLite3DB::Statement upd=db->Prepare("UPDATE tblOption SET Section=?, SortOrder=?, ValidValues=?, OptionDescription=? WHERE Option=?;");\r
+ SQLite3DB::Statement upd=db->Prepare("UPDATE tblOption SET Section=?, SortOrder=?, ValidValues=?, OptionDescription=?, DisplayType=?, DisplayParam1=?, DisplayParam2=?, Mode=? WHERE Option=?;");\r
int order=0;\r
\r
// LogLevel\r
upd.Bind(1,order++);\r
upd.Bind(2,"1|1 - Fatal Errors|2|2 - Critical Errors|3|3 - Errors|4|4 - Warnings|5|5 - Notices|6|6 - Informational Messages|7|7 - Debug Messages|8|8 - Trace Messages");\r
upd.Bind(3,"The maximum logging level that will be written to file. Higher levels will include all messages from the previous levels.");\r
- upd.Bind(4,"LogLevel");\r
+ upd.Bind(4,"select");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"LogLevel");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2,"true|true|false|false");\r
upd.Bind(3,"VACUUM the database every time FMS starts. This will defragment the free space in the database and create a smaller database file. Vacuuming the database can be CPU and disk intensive.");\r
- upd.Bind(4,"VacuumOnStartup");\r
+ upd.Bind(4,"select");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"VacuumOnStartup");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"A unique string shared by all clients who want to communicate with each other. This should not be changed unless you want to create your own separate communications network.");\r
- upd.Bind(4,"MessageBase");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"advanced");\r
+ upd.Bind(8,"MessageBase");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"The USK key which contains information about the latest version of FMS.");\r
- upd.Bind(4,"FMSVersionKey");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5,"80");\r
+ upd.Bind(6);\r
+ upd.Bind(7,"advanced");\r
+ upd.Bind(8,"FMSVersionKey");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"The latest found edition of the FMS version USK.");\r
- upd.Bind(4,"FMSVersionEdition");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"advanced");\r
+ upd.Bind(8,"FMSVersionEdition");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2,"true|true|false|false");\r
upd.Bind(3,"Start NNTP server.");\r
- upd.Bind(4,"StartNNTP");\r
+ upd.Bind(4,"select");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"StartNNTP");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"The port that the NNTP service will listen for incoming connections.");\r
- upd.Bind(4,"NNTPListenPort");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"NNTPListenPort");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"A comma separated list of valid IPv4 or IPv6 addresses/hostnames that the NNTP service will try to bind to.");\r
- upd.Bind(4,"NNTPBindAddresses");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"NNTPBindAddresses");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2,"true|true|false|false");\r
upd.Bind(3,"Allow posting messages from NNTP. Setting to false will make the newsgroups read only.");\r
- upd.Bind(4,"NNTPAllowPost");\r
+ upd.Bind(4,"select");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"NNTPAllowPost");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2,"true|true|false|false");\r
upd.Bind(3,"Start HTTP server. WARNING: If you turn this off, you won't be able to access the administration pages.");\r
- upd.Bind(4,"StartHTTP");\r
+ upd.Bind(4,"select");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"StartHTTP");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"Port HTTP server will listen on.");\r
- upd.Bind(4,"HTTPListenPort");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"HTTPListenPort");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"Comma separated list of addresses and/or subnet masks that are allowed access to the administration pages. Default is localhost only. + allows a host, - denies a host.");\r
- upd.Bind(4,"HTTPAccessControl");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"HTTPAccessControl");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2,"true|true|false|false");\r
upd.Bind(3,"Set to true to start the Freenet Updater thread and connect to Freenet. Set to false to prevent communication with Freenet.");\r
- upd.Bind(4,"StartFreenetUpdater");\r
+ upd.Bind(4,"select");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"StartFreenetUpdater");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"Host name or address of Freenet node.");\r
- upd.Bind(4,"FCPHost");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"FCPHost");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"The port that Freenet is listening for FCP connections on.");\r
- upd.Bind(4,"FCPPort");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"FCPPort");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"The port that Freenet is listening for http connections on.");\r
- upd.Bind(4,"FProxyPort");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"FProxyPort");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"Maximum number of concurrent requests for new Identity xml files");\r
- upd.Bind(4,"MaxIdentityRequests");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"advanced");\r
+ upd.Bind(8,"MaxIdentityRequests");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"Maximum number of concurrent identities requesting IdentityIntroduction xml files. Each identity may have multiple requests pending.");\r
- upd.Bind(4,"MaxIdentityIntroductionRequests");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"advanced");\r
+ upd.Bind(8,"MaxIdentityIntroductionRequests");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"Maximum number of concurrent requests for new IntroductionPuzzle xml files");\r
- upd.Bind(4,"MaxIntroductionPuzzleRequests");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"advanced");\r
+ upd.Bind(8,"MaxIntroductionPuzzleRequests");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"Maximum number of concurrent requests for new Trust Lists");\r
- upd.Bind(4,"MaxTrustListRequests");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"advanced");\r
+ upd.Bind(8,"MaxTrustListRequests");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"Maximum number of concurrent requests for new Message Lists");\r
- upd.Bind(4,"MaxMessageListRequests");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"advanced");\r
+ upd.Bind(8,"MaxMessageListRequests");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"Maximum number of concurrent requests for new Messages");\r
- upd.Bind(4,"MaxMessageRequests");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"advanced");\r
+ upd.Bind(8,"MaxMessageRequests");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"The maximum number of concurrent requests for new Board Lists. Set to 0 to disable.");\r
- upd.Bind(4,"MaxBoardListRequests");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"advanced");\r
+ upd.Bind(8,"MaxBoardListRequests");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"Specifies a local message trust level that a peer must have before its messages will be downloaded.");\r
- upd.Bind(4,"MinLocalMessageTrust");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"MinLocalMessageTrust");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"Specifies a peer message trust level that a peer must have before its messages will be downloaded.");\r
- upd.Bind(4,"MinPeerMessageTrust");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"MinPeerMessageTrust");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"Specifies a local trust list trust level that a peer must have before its trust list will be included in the weighted average. Any peers below this number will be excluded from the results.");\r
- upd.Bind(4,"MinLocalTrustListTrust");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"MinLocalTrustListTrust");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"Specifies a peer trust list trust level that a peer must have before its trust list will be included in the weighted average. Any peers below this number will be excluded from the results.");\r
- upd.Bind(4,"MinPeerTrustListTrust");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"MinPeerTrustListTrust");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2,"true|true|false|false");\r
upd.Bind(3,"Set to true if you want your local trust levels to override the peer levels when determining which identities you will poll.");\r
- upd.Bind(4,"LocalTrustOverridesPeerTrust");\r
+ upd.Bind(4,"select");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"LocalTrustOverridesPeerTrust");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"The maximum number of days backward that messages will be downloaded from each identity");\r
- upd.Bind(4,"MessageDownloadMaxDaysBackward");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"MessageDownloadMaxDaysBackward");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"The number of days backward that messages you have inserted will appear in your MessageLists");\r
- upd.Bind(4,"MessageListDaysBackward");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"MessageListDaysBackward");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"The maximum number of messages you will download from each peer on a given day.");\r
- upd.Bind(4,"MaxPeerMessagesPerDay");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"MaxPeerMessagesPerDay");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"The maximum number of boards a received message may be sent to. Boards over this limit will be ignored.");\r
- upd.Bind(4,"MaxBoardsPerMessage");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"MaxBoardsPerMessage");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2,"true|true|false|false");\r
upd.Bind(3,"Set to true to automatically save messages posted to new boards. Set to false to ignore messages to new boards.");\r
- upd.Bind(4,"SaveMessagesFromNewBoards");\r
+ upd.Bind(4,"select");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"SaveMessagesFromNewBoards");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"How much the local message trust level of an identity should change when you reply to one of their messages.");\r
- upd.Bind(4,"ChangeMessageTrustOnReply");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"ChangeMessageTrustOnReply");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2,"true|true|false|false");\r
upd.Bind(3,"Set to true to automatically create new identities when you send a message using a new name. If you set this to false, posting messages will fail until you manually create the identity.");\r
- upd.Bind(4,"AddNewPostFromIdentities");\r
+ upd.Bind(4,"select");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"AddNewPostFromIdentities");\r
upd.Step();\r
upd.Reset();\r
\r
upd.Bind(1,order++);\r
upd.Bind(2);\r
upd.Bind(3,"Automatically delete messages older than this many days.");\r
- upd.Bind(4,"DeleteMessagesOlderThan");\r
+ upd.Bind(4,"textbox");\r
+ upd.Bind(5);\r
+ upd.Bind(6);\r
+ upd.Bind(7,"simple");\r
+ upd.Bind(8,"DeleteMessagesOlderThan");\r
upd.Step();\r
upd.Reset();\r
\r
+ db->Execute("COMMIT;");\r
+\r
}\r
\r
#include "../include/dbsetup.h"\r
#include "../include/stringfunctions.h"\r
-#include "../include/option.h"\r
\r
const bool ThreadBuilder::Build(const long messageid, const long boardid, const bool bydate)\r
{\r
int count=0;\r
int threadid=-1;\r
- MessageThread mt;\r
+ MessageThread mt(m_db);\r
std::vector<MessageThread::threadnode> m_threadmessages;\r
\r
- std::string ll="";\r
- Option::Instance()->Get("LogLevel",ll);\r
-\r
- // TODO - remove after corruption issue fixed\r
- if(ll=="8")\r
- {\r
- std::string dbres=TestDBIntegrity();\r
- std::string messageidstr="";\r
- std::string boardidstr="";\r
- StringFunctions::Convert(messageid,messageidstr);\r
- StringFunctions::Convert(boardid,boardidstr);\r
- m_log->trace("ThreadBuilder::Build start TestDBIntegrity("+messageidstr+","+boardidstr+") returned "+dbres);\r
- }\r
-\r
mt.Load(messageid,boardid,bydate);\r
m_threadmessages=mt.GetNodes();\r
\r
+ m_db->Execute("BEGIN;");\r
+\r
// find threadid of this mesage if it already exists in a thread\r
SQLite3DB::Statement st=m_db->Prepare("SELECT tblThread.ThreadID FROM tblThread INNER JOIN tblThreadPost ON tblThread.ThreadID=tblThreadPost.ThreadID WHERE tblThread.BoardID=? AND tblThreadPost.MessageID=?;");\r
st.Bind(0,boardid);\r
}\r
}\r
\r
- // TODO - remove after corruption issue fixed\r
- if(ll=="8")\r
- {\r
- std::string dbres=TestDBIntegrity();\r
- if(dbres!="ok")\r
- {\r
- m_log->trace("ThreadBuilder::Build middle TestDBIntegrity returned "+dbres);\r
- }\r
- }\r
-\r
if(m_threadmessages.size()>0)\r
{\r
SQLite3DB::Statement st2=m_db->Prepare("UPDATE tblThread SET FirstMessageID=?, LastMessageID=? WHERE ThreadID=?;");\r
st2.Bind(2,threadid);\r
st2.Step();\r
\r
- // TODO - remove after corruption issue fixed\r
- if(ll=="8")\r
- {\r
- std::string dbres=TestDBIntegrity();\r
- if(dbres!="ok")\r
- {\r
- m_log->trace("ThreadBuilder::Build after thread update TestDBIntegrity returned "+dbres);\r
- }\r
- }\r
-\r
SQLite3DB::Statement st3=m_db->Prepare("DELETE FROM tblThreadPost WHERE ThreadID=?;");\r
st3.Bind(0,threadid);\r
st3.Step();\r
\r
- // TODO - remove after corruption issue fixed\r
- if(ll=="8")\r
- {\r
- std::string dbres=TestDBIntegrity();\r
- if(dbres!="ok")\r
- {\r
- m_log->trace("ThreadBuilder::Build after thread post delete TestDBIntegrity returned "+dbres);\r
- }\r
- }\r
-\r
SQLite3DB::Statement deleteotherst=m_db->Prepare("DELETE FROM tblThread WHERE ThreadID IN (SELECT tblThread.ThreadID FROM tblThreadPost INNER JOIN tblThread ON tblThreadPost.ThreadID=tblThread.ThreadID WHERE tblThread.BoardID=? AND tblThreadPost.MessageID=?);");\r
\r
count=0;\r
m_log->trace("ThreadBuilder::Build deleted thread");\r
}\r
\r
- // TODO - remove after corruption issue fixed\r
- if(ll=="8")\r
- {\r
- std::string dbres=TestDBIntegrity();\r
- m_log->trace("ThreadBuilder::Build end TestDBIntegrity returned "+dbres);\r
- }\r
+ m_db->Execute("COMMIT;");\r
\r
return true;\r
\r
if(ignorechars.size()==0 || wcstring.find_first_of(wcignorechars,currentpos)!=currentpos)\r
{\r
lastnewlinepos=wcstring.rfind(m_unicodenewline,currentpos+linelength);\r
+ whitespacepos=wcstring.find_last_of(m_unicodewhitespace,currentpos+linelength);\r
// newline found within line length - we don't need to wrap\r
if(lastnewlinepos!=std::wstring::npos && lastnewlinepos>=currentpos)\r
{\r
currentpos=lastnewlinepos+1;\r
}\r
- // newline doesn't exist at all - force one in\r
- else if(lastnewlinepos==std::wstring::npos)\r
+ // whitespace found within line length - erase whitespace and insert newline\r
+ else if((lastnewlinepos<currentpos || lastnewlinepos==std::wstring::npos) && whitespacepos!=std::wstring::npos && whitespacepos>=currentpos)\r
{\r
- wcstring.insert(currentpos+linelength,m_unicodenewline);\r
- currentpos+=linelength+m_unicodenewline.length();\r
+ wcstring.erase(whitespacepos,1);\r
+ wcstring.insert(whitespacepos,m_unicodenewline);\r
+ currentpos=whitespacepos+m_unicodenewline.length();\r
}\r
+ // whitespace or newline not found within line length - force newline at line length\r
else\r
{\r
- whitespacepos=wcstring.find_last_of(m_unicodewhitespace,currentpos+linelength);\r
- // whitespace found within line length - erase whitespace and insert newline\r
- if(whitespacepos!=std::wstring::npos && whitespacepos>=currentpos)\r
- {\r
- wcstring.erase(whitespacepos,1);\r
- wcstring.insert(whitespacepos,m_unicodenewline);\r
- currentpos=whitespacepos+m_unicodenewline.length();\r
- }\r
- // whitespace not found within line length - force newline at line length\r
- else\r
- {\r
- wcstring.insert(currentpos+linelength,m_unicodenewline);\r
- currentpos+=linelength+m_unicodenewline.length();\r
- }\r
+ wcstring.insert(currentpos+linelength,m_unicodenewline);\r
+ currentpos+=linelength+m_unicodenewline.length();\r
}\r
}\r
else\r
padding-left:10px;\r
padding-right:10px;\r
}\r
- \r
+\r
.calcrow td {\r
background-color:#EEEEEE;\r
text-align:right;\r
}\r
- \r
+\r
.totalrow td {\r
text-align:right;\r
}\r
- \r
+\r
/* layout */\r
\r
body {\r
.paragraph {\r
margin-bottom:.5em;\r
}\r
+\r
+.optiondescription {\r
+ padding-bottom:10px;\r
+ }\r
+\r
+.optionname {\r
+ font-weight:bolder;\r
+ }\r
+\r
</style>\r
<style type="text/css">\r
\r