version 0.3.29
authorSomeDude <SomeDude@NuBL7aaJ6Cn4fB7GXFb9Zfi8w1FhPyW3oKgU9TweZMw>
Sat, 17 Jan 2009 08:40:00 +0000 (09:40 +0100)
committerDavid ‘Bombe’ Roden <bombe@freenetproject.org>
Sat, 17 Jan 2009 08:40:00 +0000 (09:40 +0100)
128 files changed:
CMakeLists.txt
include/board.h
include/boardlist.h
include/db/sqlite3db/sqlite3db.h
include/db/sqlite3db/sqlite3statement.h
include/dbconversions.h
include/dbmaintenancethread.h
include/dbsetup.h
include/fmsapp.h
include/freenet/boardlistinserter.h
include/freenet/boardlistrequester.h
include/freenet/fcpv2.h
include/freenet/fileinserter.h
include/freenet/fmsversionrequester.h
include/freenet/freenetmasterthread.h
include/freenet/identityinserter.h
include/freenet/identityintroductioninserter.h
include/freenet/identityintroductionrequester.h
include/freenet/identityrequester.h
include/freenet/iindexinserter.h
include/freenet/iindexrequester.h
include/freenet/inactivemessagelistrequester.h
include/freenet/introductionpuzzleinserter.h
include/freenet/introductionpuzzlerequester.h
include/freenet/messageinserter.h
include/freenet/messagelistinserter.h
include/freenet/messagelistrequester.h
include/freenet/messagerequester.h
include/freenet/siteinserter.h
include/freenet/trustlistinserter.h
include/freenet/trustlistrequester.h
include/freenet/unkeyedidcreator.h
include/freenet/unknownidentityrequester.h
include/global.h
include/http/fmshttprequesthandlerfactory.h
include/http/httpthread.h
include/http/ipagehandler.h
include/http/pages/addpeerpage.h
include/http/pages/announceidentitypage.h
include/http/pages/boardspage.h
include/http/pages/confirmpage.h
include/http/pages/controlboardpage.h
include/http/pages/createidentitypage.h
include/http/pages/execquerypage.h
include/http/pages/forumcreatepostpage.h
include/http/pages/forummainpage.h
include/http/pages/forumpage.h
include/http/pages/forumthreadspage.h
include/http/pages/forumviewthreadpage.h
include/http/pages/homepage.h
include/http/pages/insertedfilespage.h
include/http/pages/localidentitiespage.h
include/http/pages/optionspage.h
include/http/pages/peerdetailspage.h
include/http/pages/peermaintenancepage.h
include/http/pages/peertrustpage.h
include/http/pages/recentlyaddedpage.h
include/http/pages/showcaptchapage.h
include/http/pages/showimagepage.h
include/http/pages/showpendingmessagepage.h [new file with mode: 0644]
include/http/pages/versioninfopage.h
include/idatabase.h
include/ithreaddatabase.h [new file with mode: 0644]
include/localidentity.h
include/message.h
include/messagelist.h
include/messagethread.h
include/nntp/extensiontrust.h
include/nntp/nntpconnection.h
include/nntp/nntplistener.h
include/option.h
include/optionssetup.h
include/threadbuilder.h
readme.txt
src/board.cpp
src/boardlist.cpp
src/db/sqlite3db.cpp
src/db/sqlite3recordset.cpp
src/db/sqlite3statement.cpp
src/dbconversions.cpp
src/dbmaintenancethread.cpp
src/dbsetup.cpp
src/fmsapp.cpp
src/freenet/boardlistinserter.cpp
src/freenet/boardlistrequester.cpp
src/freenet/fcpv2.cpp
src/freenet/fileinserter.cpp
src/freenet/fmsversionrequester.cpp
src/freenet/freenetmasterthread.cpp
src/freenet/identityinserter.cpp
src/freenet/identityintroductioninserter.cpp
src/freenet/identityintroductionrequester.cpp
src/freenet/identityrequester.cpp
src/freenet/inactivemessagelistrequester.cpp
src/freenet/introductionpuzzleinserter.cpp
src/freenet/introductionpuzzlerequester.cpp
src/freenet/messageinserter.cpp
src/freenet/messagelistinserter.cpp
src/freenet/messagelistrequester.cpp
src/freenet/messagerequester.cpp
src/freenet/siteinserter.cpp
src/freenet/trustlistinserter.cpp
src/freenet/trustlistrequester.cpp
src/freenet/unkeyedidcreator.cpp
src/freenet/unknownidentityrequester.cpp
src/http/fmshttprequesthandlerfactory.cpp
src/http/httpthread.cpp
src/http/ipagehandler.cpp
src/http/pages/forumcreatepostpage.cpp
src/http/pages/homepage.cpp
src/http/pages/insertedfilespage.cpp
src/http/pages/optionspage.cpp
src/http/pages/peerdetailspage.cpp
src/http/pages/showimagepage.cpp
src/http/pages/showpendingmessagepage.cpp [new file with mode: 0644]
src/localidentity.cpp
src/message.cpp
src/messagelist.cpp
src/nntp/extensiontrust.cpp
src/nntp/mime/Mime.cpp
src/nntp/nntpconnection.cpp
src/nntp/nntplistener.cpp
src/nntp/uwildmat.cpp
src/option.cpp
src/optionssetup.cpp
src/threadbuilder.cpp
src/unicode/unicodeformatter.cpp
template.htm

index 6412e14..e874c91 100644 (file)
@@ -12,6 +12,7 @@ ENDIF(APPLE)
 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
@@ -99,6 +100,7 @@ src/http/pages/peertrustpage.cpp
 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
@@ -274,3 +276,7 @@ ENDIF(ALTERNATE_CAPTCHA)
 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
index f70e4f8..bf9eb09 100644 (file)
 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
index a5c9508..697ecb6 100644 (file)
@@ -13,6 +13,7 @@
 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
index f60961b..59fb89d 100644 (file)
@@ -1,11 +1,9 @@
 #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
@@ -14,7 +12,7 @@
 namespace SQLite3DB\r
 {\r
 \r
-class DB:public Singleton<DB>\r
+class DB\r
 {\r
 public:\r
        DB();\r
@@ -38,8 +36,6 @@ public:
 \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
index d245d49..e57fbe5 100644 (file)
@@ -3,6 +3,8 @@
 \r
 #include "sqlite3db.h"\r
 \r
+#include <Poco/Mutex.h>\r
+\r
 #include <vector>\r
 #include <map>\r
 \r
@@ -57,6 +59,7 @@ private:
        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
index 4db308c..597e171 100644 (file)
@@ -1,21 +1,24 @@
 #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
index 74a7fd8..e7c3dd6 100644 (file)
@@ -3,11 +3,11 @@
 \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
index 84ae815..4b61a50 100644 (file)
@@ -3,12 +3,14 @@
 \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
index 56b6125..810325d 100644 (file)
@@ -2,13 +2,14 @@
 #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
index f0883a1..f66f4b4 100644 (file)
@@ -6,8 +6,8 @@
 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
index 3eb7823..c0a124f 100644 (file)
@@ -6,8 +6,8 @@
 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
index 1f033a9..f83d73a 100644 (file)
@@ -115,6 +115,8 @@ public:
                \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
@@ -138,13 +140,13 @@ public:
        /**\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
@@ -265,7 +267,7 @@ public:
                \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
index 6ac76bd..cb5da95 100644 (file)
@@ -6,8 +6,8 @@
 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
index afe18ca..e784d03 100644 (file)
@@ -13,8 +13,8 @@
 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
index 3e9cae5..f7f176c 100644 (file)
@@ -2,6 +2,7 @@
 #define _freenetmasterthread_\r
 \r
 #include "../ilogger.h"\r
+#include "../ithreaddatabase.h"\r
 #include "ifreenetregistrable.h"\r
 #include "ifcpmessagehandler.h"\r
 #include "ifcpconnected.h"\r
@@ -12,7 +13,7 @@
 // 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
index 1170e99..d3bfb4f 100644 (file)
@@ -13,8 +13,8 @@
 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
index 77f2bba..1cd4265 100644 (file)
@@ -13,8 +13,8 @@
 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
index cd66727..2f419ea 100644 (file)
@@ -13,8 +13,8 @@
 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
index 0b70abd..601bdc9 100644 (file)
@@ -6,8 +6,8 @@
 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
index fb65b0e..2135e45 100644 (file)
@@ -22,8 +22,8 @@ template <class IDTYPE>
 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
@@ -52,13 +52,13 @@ protected:
 };\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
@@ -127,8 +127,9 @@ const bool IIndexInserter<IDTYPE>::HandleMessage(FCPv2::Message &message)
 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
index 37dcdda..1966407 100644 (file)
@@ -24,8 +24,8 @@ template <class IDTYPE>
 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
@@ -59,13 +59,13 @@ protected:
 };\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
@@ -143,8 +143,9 @@ void IIndexRequester<IDTYPE>::InitializeIIndexRequester()
 {\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
index f7787a9..95ab173 100644 (file)
@@ -8,8 +8,8 @@
 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
index a65d96d..e376dbf 100644 (file)
@@ -9,8 +9,8 @@
 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
index e2ca076..46108df 100644 (file)
@@ -8,8 +8,8 @@
 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
index 04d6169..0b8e970 100644 (file)
@@ -7,8 +7,8 @@
 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
index 4afed68..c13383a 100644 (file)
@@ -6,8 +6,8 @@
 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
index 1b324e2..079fbe7 100644 (file)
@@ -8,8 +8,8 @@
 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
index 76feb71..b9c6c96 100644 (file)
@@ -6,8 +6,8 @@
 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
index 5c17e79..2fe4af4 100644 (file)
@@ -6,8 +6,8 @@
 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
index 26cdd52..5cfe1c1 100644 (file)
@@ -13,8 +13,8 @@
 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
index 0bbf69f..3ae1c2e 100644 (file)
@@ -6,8 +6,8 @@
 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
index 054a95d..1cdd7b9 100644 (file)
@@ -17,8 +17,8 @@
 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
index 67c8372..d0357fd 100644 (file)
@@ -6,8 +6,8 @@
 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
index eb0deae..4fc4ad5 100644 (file)
@@ -7,10 +7,10 @@
 \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
index 3e42513..b6c163d 100644 (file)
@@ -4,14 +4,15 @@
 #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
index b6d7035..b57906d 100644 (file)
@@ -3,11 +3,11 @@
 \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
index f6f2cc0..d0c5856 100644 (file)
@@ -2,6 +2,7 @@
 #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
index 1425b10..1176a51 100644 (file)
@@ -2,14 +2,13 @@
 #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
index b4bf78a..e84ff85 100644 (file)
@@ -2,14 +2,13 @@
 #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
index 0e4383c..9583a60 100644 (file)
@@ -2,14 +2,13 @@
 #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
index aaf0c78..5236d10 100644 (file)
@@ -6,9 +6,9 @@
 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
index 0f8fcde..3021edc 100644 (file)
@@ -2,14 +2,13 @@
 #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
index a1a912f..9583c7a 100644 (file)
@@ -2,14 +2,13 @@
 #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
index caedd08..3ba8423 100644 (file)
@@ -2,14 +2,13 @@
 #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
index 7f2b592..fb057cd 100644 (file)
@@ -6,9 +6,9 @@
 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
index 63af3c5..1c28b6d 100644 (file)
@@ -6,9 +6,9 @@
 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
index 3124b9e..7a52204 100644 (file)
@@ -2,12 +2,11 @@
 #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
index 71131c1..37fef3e 100644 (file)
@@ -6,9 +6,9 @@
 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
index 78c2e2c..6374105 100644 (file)
@@ -6,9 +6,9 @@
 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
index 0b8c5e2..cfdbb4b 100644 (file)
@@ -2,14 +2,13 @@
 #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
index d9d4832..e187288 100644 (file)
@@ -2,14 +2,13 @@
 #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
index 162777c..bc0ae7c 100644 (file)
@@ -2,14 +2,13 @@
 #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
index 9589205..8aa13b0 100644 (file)
@@ -2,19 +2,25 @@
 #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 &currentvalue, const std::string &param1, const std::string &param2);\r
+       const std::string CreateDropDown(const std::string &name, const std::vector<std::string> &items, const std::string &selecteditem, const std::string &param1, const std::string &param2);\r
+       const std::string CreateTextArea(const std::string &name, const std::string &currentvalue, const std::string &param1, const std::string &param2);\r
+\r
+\r
+       static int m_mode;\r
+\r
 };\r
 \r
 #endif // _optionspage_\r
index 1c69303..00672cc 100644 (file)
@@ -2,14 +2,13 @@
 #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
index efacffa..9022504 100644 (file)
@@ -2,14 +2,13 @@
 #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
index a62ad68..0fb6dd3 100644 (file)
@@ -2,14 +2,13 @@
 #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
index 9f00760..1ed00e1 100644 (file)
@@ -2,14 +2,13 @@
 #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
index 739e412..58af3f0 100644 (file)
@@ -4,13 +4,14 @@
 #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
index 2c8c648..15aa304 100644 (file)
@@ -6,10 +6,11 @@
 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
diff --git a/include/http/pages/showpendingmessagepage.h b/include/http/pages/showpendingmessagepage.h
new file mode 100644 (file)
index 0000000..2e99dab
--- /dev/null
@@ -0,0 +1,17 @@
+#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
index 9f22d4e..0f2176a 100644 (file)
@@ -2,14 +2,13 @@
 #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
index ddf9ba9..1696b9c 100644 (file)
@@ -9,7 +9,9 @@
 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
diff --git a/include/ithreaddatabase.h b/include/ithreaddatabase.h
new file mode 100644 (file)
index 0000000..b5d303a
--- /dev/null
@@ -0,0 +1,50 @@
+#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
index 4a0598e..830b288 100644 (file)
@@ -6,7 +6,7 @@
 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
index 8c56633..3c4c666 100644 (file)
@@ -9,9 +9,9 @@
 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
index be1df9e..6688200 100644 (file)
@@ -8,6 +8,7 @@
 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
index 0dfe628..50cde62 100644 (file)
@@ -6,6 +6,8 @@
 class MessageThread:public IDatabase\r
 {\r
 public:\r
+       MessageThread(SQLite3DB::DB *db):IDatabase(db)                  {}\r
+\r
        struct threadnode\r
        {\r
                long m_messageid;\r
index b916fc7..8a67bc1 100644 (file)
@@ -6,8 +6,8 @@
 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
index 15c2080..d048375 100644 (file)
@@ -6,6 +6,7 @@
 #include "../ilogger.h"\r
 #include "../message.h"\r
 #include "../localidentity.h"\r
+#include "../ithreaddatabase.h"\r
 \r
 #include <string>\r
 #include <vector>\r
@@ -21,7 +22,7 @@
        #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
@@ -46,6 +47,8 @@ private:
        };\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
index 0bcca8f..065b013 100644 (file)
@@ -6,21 +6,23 @@
 #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
index 9de5adf..c0dff16 100644 (file)
@@ -1,15 +1,16 @@
 #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
@@ -26,14 +27,14 @@ void Option::Set(const std::string &option, const T &value)
        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
index 576857d..791a559 100644 (file)
@@ -1,7 +1,9 @@
 #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
index f614d69..090b34e 100644 (file)
@@ -7,6 +7,7 @@
 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
index 5e5cf8c..98cc111 100644 (file)
@@ -15,6 +15,12 @@ recommended.  If you would like to compile using the alternate captchas, add a
 -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
index ed8e869..9d249ad 100644 (file)
@@ -7,7 +7,7 @@
        #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
@@ -20,17 +20,17 @@ Board::Board()
        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
index 931e096..7a7a5e2 100644 (file)
@@ -43,7 +43,7 @@ void BoardList::Load()
                        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
@@ -60,7 +60,7 @@ void BoardList::LoadNew(const std::string &date)
        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
index f8bb003..a828a4a 100644 (file)
@@ -1,5 +1,12 @@
 #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
@@ -30,7 +37,12 @@ const bool DB::Close()
 {\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
@@ -52,8 +64,10 @@ const bool DB::Execute(const std::string &sql)
 {\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
@@ -73,8 +87,10 @@ const bool DB::ExecuteInsert(const std::string &sql, long &insertid)
 {\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
@@ -95,7 +111,6 @@ const int DB::GetLastError(std::string &errormessage)
 {\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
@@ -118,7 +133,6 @@ void DB::Initialize()
 \r
 const bool DB::IsOpen()\r
 {\r
-       Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
        return m_db ? true : false;\r
 }\r
 \r
@@ -130,7 +144,6 @@ const bool DB::Open(const std::string &filename)
        }\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
@@ -151,9 +164,14 @@ Statement DB::Prepare(const std::string &sql)
 {\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
@@ -173,10 +191,12 @@ Recordset DB::Query(const std::string &sql)
 {\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
@@ -197,7 +217,6 @@ const int DB::SetBusyTimeout(const int ms)
 {\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
index 2c37223..2ec0791 100644 (file)
@@ -90,7 +90,6 @@ void Recordset::Open(const std::string &sql, DB *db)
        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
index 31c6ea5..7ef5e27 100644 (file)
@@ -1,5 +1,13 @@
 #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
@@ -7,6 +15,7 @@
 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
@@ -21,6 +30,7 @@ Statement::Statement(sqlite3_stmt *statement):m_statement(statement),m_rowreturn
 \r
        if(m_statement)\r
        {\r
+               Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
                m_statementcount[m_statement]++;\r
        }\r
 }\r
@@ -134,7 +144,7 @@ void Statement::Finalize()
 {\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
@@ -159,7 +169,7 @@ Statement &Statement::operator=(const Statement &rhs)
 \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
@@ -170,7 +180,6 @@ const bool Statement::Reset()
 {\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
@@ -287,8 +296,13 @@ const bool Statement::Step(const bool saveinsertrowid)
        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
@@ -297,7 +311,7 @@ const bool Statement::Step(const bool saveinsertrowid)
                        }\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
@@ -314,7 +328,6 @@ const bool Statement::Step(const bool saveinsertrowid)
 \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
index b0cb73e..78d906a 100644 (file)
@@ -5,10 +5,9 @@
 #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
@@ -35,10 +34,9 @@ void ConvertDB0100To0101()
        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
@@ -64,11 +62,10 @@ void ConvertDB0101To0103()
        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
@@ -76,11 +73,10 @@ void ConvertDB0103To0104()
        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
@@ -89,37 +85,33 @@ void ConvertDB0104To0105()
        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
@@ -131,14 +123,13 @@ void ConvertDB0108To0109()
        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
@@ -148,7 +139,6 @@ void ConvertDB0110To0111()
 \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
@@ -205,13 +195,12 @@ void ConvertDB0110To0111()
        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
@@ -222,10 +211,9 @@ void ConvertDB0111To0112()
        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
@@ -233,9 +221,8 @@ void ConvertDB0112To0113()
        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
@@ -243,9 +230,19 @@ void ConvertDB0113To0114()
        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
index ae4dc88..e9f03e0 100644 (file)
@@ -22,32 +22,25 @@ DBMaintenanceThread::DBMaintenanceThread()
        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
@@ -84,7 +77,7 @@ void DBMaintenanceThread::Do10MinuteMaintenance()
        // 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
@@ -110,7 +103,7 @@ void DBMaintenanceThread::Do10MinuteMaintenance()
        // 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
@@ -125,6 +118,8 @@ void DBMaintenanceThread::Do30MinuteMaintenance()
 \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
@@ -182,12 +177,16 @@ void DBMaintenanceThread::Do1HourMaintenance()
        // 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
@@ -216,6 +215,8 @@ void DBMaintenanceThread::Do6HourMaintenance()
                st.Step();\r
        }\r
 \r
+       m_db->Execute("COMMIT;");\r
+\r
        m_log->debug("PeriodicDBMaintenance::Do6HourMaintenance");\r
 }\r
 \r
@@ -223,6 +224,8 @@ void DBMaintenanceThread::Do1DayMaintenance()
 {\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
@@ -352,6 +355,8 @@ void DBMaintenanceThread::Do1DayMaintenance()
        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
@@ -360,6 +365,21 @@ void DBMaintenanceThread::run()
 {\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
index 1316bb2..e763469 100644 (file)
@@ -7,16 +7,11 @@
 #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
@@ -34,89 +29,95 @@ void SetupDB()
                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
@@ -136,7 +137,11 @@ void SetupDB()
                                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
@@ -293,10 +298,10 @@ void SetupDB()
                                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
@@ -428,24 +433,6 @@ void SetupDB()
                                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
@@ -560,37 +547,36 @@ void SetupDB()
 \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
@@ -629,11 +615,10 @@ const bool VerifyDB()
        }\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
index 261ea46..2daf6c8 100644 (file)
@@ -108,8 +108,23 @@ void FMSApp::initialize(Poco::Util::Application &self)
        }\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
@@ -119,7 +134,9 @@ void FMSApp::initializeLogger()
        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
@@ -153,6 +170,7 @@ void FMSApp::initializeLogger()
        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
@@ -162,7 +180,7 @@ int FMSApp::main(const std::vector<std::string> &args)
        // 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
@@ -183,12 +201,13 @@ int FMSApp::main(const std::vector<std::string> &args)
                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
@@ -220,10 +239,11 @@ void FMSApp::setOptions()
 {\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
@@ -235,7 +255,7 @@ void FMSApp::setOptions()
 \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
@@ -252,13 +272,14 @@ void FMSApp::showOptions()
 \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
@@ -274,7 +295,7 @@ void FMSApp::StartThreads()
        }\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
@@ -290,7 +311,7 @@ void FMSApp::StartThreads()
        }\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
index a3b9b22..52ded53 100644 (file)
@@ -9,12 +9,12 @@
        #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
index 21e82b7..41df7d6 100644 (file)
@@ -8,12 +8,12 @@
        #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
@@ -192,8 +192,9 @@ void BoardListRequester::Initialize()
 \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
@@ -204,7 +205,7 @@ void BoardListRequester::Initialize()
                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
@@ -214,7 +215,7 @@ void BoardListRequester::Initialize()
                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
index ecd81e7..4951fdb 100644 (file)
@@ -3,6 +3,8 @@
 #include <sstream>\r
 #include <algorithm>\r
 #include <cstdarg>\r
+#include <cstring>\r
+#include <cstdlib>\r
 \r
 #ifdef _WIN32\r
        #include <ws2tcpip.h>\r
index 0ed526c..f4b6a79 100644 (file)
@@ -4,12 +4,12 @@
        #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
index 39fb027..0d72722 100644 (file)
@@ -6,12 +6,12 @@
 #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
@@ -42,7 +42,8 @@ const bool FMSVersionRequester::HandleAllData(FCPv2::Message &message)
        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
@@ -80,7 +81,8 @@ const bool FMSVersionRequester::HandleGetFailed(FCPv2::Message &message)
                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
@@ -152,8 +154,9 @@ void FMSVersionRequester::StartRequest()
        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
index 4890339..9c75a06 100644 (file)
        #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
@@ -195,6 +174,10 @@ void FreenetMasterThread::run()
 \r
        m_log->debug("FreenetMasterThread::run thread started.");\r
 \r
+       LoadDatabase();\r
+\r
+\r
+\r
        Setup();\r
 \r
        do\r
@@ -288,29 +271,49 @@ void FreenetMasterThread::run()
 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
index 15e52aa..1ae04a5 100644 (file)
        #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
@@ -184,7 +184,8 @@ void IdentityInserter::StartInsert(const long localidentityid)
                }\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
index 78a0f93..5d01882 100644 (file)
        #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
@@ -91,7 +91,8 @@ const bool IdentityIntroductionInserter::HandleMessage(FCPv2::Message &message)
 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
index 20fb31f..b9532f3 100644 (file)
        #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
@@ -178,7 +178,8 @@ const bool IdentityIntroductionRequester::HandleMessage(FCPv2::Message &message)
 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
@@ -188,7 +189,7 @@ void IdentityIntroductionRequester::Initialize()
        {\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
index 9e7a769..18810d5 100644 (file)
        #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
@@ -163,7 +163,8 @@ const bool IdentityRequester::HandleGetFailed(FCPv2::Message &message)
 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
index 2a47d81..a0a0277 100644 (file)
@@ -6,12 +6,12 @@
        #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
@@ -22,7 +22,8 @@ void InactiveMessageListRequester::Initialize()
        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
@@ -38,7 +39,7 @@ void InactiveMessageListRequester::Initialize()
        }\r
 \r
        tempval="";\r
-       Option::Instance()->Get("LocalTrustOverridesPeerTrust",tempval);\r
+       option.Get("LocalTrustOverridesPeerTrust",tempval);\r
        if(tempval=="true")\r
        {\r
                m_localtrustoverrides=true;\r
@@ -49,7 +50,7 @@ void InactiveMessageListRequester::Initialize()
        }\r
 \r
        tempval="";\r
-       Option::Instance()->Get("SaveMessagesFromNewBoards",tempval);\r
+       option.Get("SaveMessagesFromNewBoards",tempval);\r
        if(tempval=="true")\r
        {\r
                m_savetonewboards=true;\r
@@ -61,7 +62,7 @@ void InactiveMessageListRequester::Initialize()
 \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
index 089e4ac..000d973 100644 (file)
        #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
@@ -224,7 +224,8 @@ const bool IntroductionPuzzleInserter::StartInsert(const long &localidentityid)
                        }\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
index fd81f14..9f1ee76 100644 (file)
        #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
@@ -186,7 +186,8 @@ void IntroductionPuzzleRequester::Initialize()
 {\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
index c1688f3..f3aab00 100644 (file)
@@ -5,12 +5,12 @@
 #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
index 04ab9f3..56e7013 100644 (file)
        #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
@@ -152,11 +152,12 @@ const bool MessageListInserter::HandlePutSuccessful(FCPv2::Message &message)
 \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
index 17aba0a..c5cb291 100644 (file)
        #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
@@ -136,6 +136,8 @@ const bool MessageListRequester::HandleAllData(FCPv2::Message &message)
        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
@@ -271,6 +273,8 @@ const bool MessageListRequester::HandleAllData(FCPv2::Message &message)
                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
@@ -333,10 +337,11 @@ const bool MessageListRequester::HandleGetFailed(FCPv2::Message &message)
 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
@@ -352,7 +357,7 @@ void MessageListRequester::Initialize()
        }\r
 \r
        tempval="";\r
-       Option::Instance()->Get("LocalTrustOverridesPeerTrust",tempval);\r
+       option.Get("LocalTrustOverridesPeerTrust",tempval);\r
        if(tempval=="true")\r
        {\r
                m_localtrustoverrides=true;\r
@@ -363,7 +368,7 @@ void MessageListRequester::Initialize()
        }\r
 \r
        tempval="";\r
-       Option::Instance()->Get("SaveMessagesFromNewBoards",tempval);\r
+       option.Get("SaveMessagesFromNewBoards",tempval);\r
        if(tempval=="true")\r
        {\r
                m_savetonewboards=true;\r
@@ -375,7 +380,7 @@ void MessageListRequester::Initialize()
 \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
index fbd767c..f1429ab 100644 (file)
        #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
@@ -224,6 +224,8 @@ const bool MessageRequester::HandleAllData(FCPv2::Message &message)
                                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
@@ -272,6 +274,8 @@ const bool MessageRequester::HandleAllData(FCPv2::Message &message)
                                //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
@@ -319,10 +323,11 @@ const bool MessageRequester::HandleGetFailed(FCPv2::Message &message)
 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
@@ -334,7 +339,7 @@ void MessageRequester::Initialize()
        }\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
@@ -346,7 +351,7 @@ void MessageRequester::Initialize()
        }\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
@@ -358,7 +363,7 @@ void MessageRequester::Initialize()
        }\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
@@ -369,7 +374,7 @@ void MessageRequester::Initialize()
                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
@@ -379,7 +384,7 @@ void MessageRequester::Initialize()
                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
index 0ae9fc5..7ffee25 100644 (file)
@@ -4,17 +4,18 @@
 #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
index 0851c61..10bfbce 100644 (file)
        #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
@@ -108,7 +108,8 @@ const bool TrustListInserter::HandleMessage(FCPv2::Message &message)
 \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
index bedc845..96d24df 100644 (file)
        #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
@@ -109,6 +109,8 @@ const bool TrustListRequester::HandleAllData(FCPv2::Message &message)
                }\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
@@ -209,6 +211,8 @@ const bool TrustListRequester::HandleAllData(FCPv2::Message &message)
                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
@@ -266,9 +270,10 @@ void TrustListRequester::Initialize()
 {\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
index e873dad..53f6c0e 100644 (file)
@@ -9,12 +9,12 @@
        #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
index 63e12c3..5906b02 100644 (file)
@@ -5,20 +5,22 @@
        #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
index 84952d2..146d8f4 100644 (file)
 #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
@@ -63,34 +69,36 @@ FMSHTTPRequestHandlerFactory::FMSHTTPRequestHandlerFactory()
        }\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
index 2ddfbcd..2315439 100644 (file)
 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
index 560c912..1ec7947 100644 (file)
@@ -1,7 +1,6 @@
 #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
@@ -54,7 +53,7 @@ const std::string IPageHandler::CreateFormPassword()
        {\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
@@ -167,14 +166,14 @@ const bool IPageHandler::ValidateFormPassword(const std::map<std::string,std::st
        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
index c89e1ac..b211ae3 100644 (file)
@@ -71,7 +71,7 @@ const std::string ForumCreatePostPage::GeneratePage(const std::string &method, c
 \r
                if(error=="")\r
                {\r
-                       Message mess;\r
+                       Message mess(m_db);\r
                        \r
                        long localidentityid=-1;\r
                        long boardid=-1;\r
index ec4ea32..15cf76e 100644 (file)
 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
@@ -87,7 +89,12 @@ const std::string HomePage::GeneratePage(const std::string &method, const std::m
        {\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
@@ -95,7 +102,6 @@ const std::string HomePage::GeneratePage(const std::string &method, const std::m
                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
index e97bf63..dbd27b0 100644 (file)
@@ -10,11 +10,11 @@ const std::string InsertedFilesPage::GeneratePage(const std::string &method, con
 {\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
index 5c61e16..4ec3233 100644 (file)
@@ -5,9 +5,11 @@
        #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 &param1, const std::string &param2)\r
 {\r
-       std::string rval="";\r
+       std::string rval("");\r
 \r
        rval+="<select name=\""+name+"\">";\r
 \r
@@ -34,12 +36,49 @@ const std::string OptionsPage::CreateDropDown(const std::string &name, const std
        return rval;\r
 }\r
 \r
+const std::string OptionsPage::CreateTextArea(const std::string &name, const std::string &currentvalue, const std::string &param1, const std::string &param2)\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 &currentvalue, const std::string &param1, const std::string &param2)\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
@@ -64,20 +103,59 @@ const std::string OptionsPage::GeneratePage(const std::string &method, const std
 \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
@@ -88,6 +166,9 @@ const std::string OptionsPage::GeneratePage(const std::string &method, const std
                        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
@@ -99,24 +180,44 @@ const std::string OptionsPage::GeneratePage(const std::string &method, const std
 \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
index 4148c57..a569bd9 100644 (file)
@@ -26,9 +26,11 @@ const std::string PeerDetailsPage::GeneratePage(const std::string &method, const
        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
@@ -57,8 +59,6 @@ const std::string PeerDetailsPage::GeneratePage(const std::string &method, const
                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
index 8b653ee..cff1a2c 100644 (file)
@@ -1,5 +1,7 @@
 #include "../../../include/http/pages/showimagepage.h"\r
 \r
+#include <cstdio>\r
+\r
 #ifdef XMEM\r
        #include <xmem.h>\r
 #endif\r
diff --git a/src/http/pages/showpendingmessagepage.cpp b/src/http/pages/showpendingmessagepage.cpp
new file mode 100644 (file)
index 0000000..8a1babd
--- /dev/null
@@ -0,0 +1,78 @@
+#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
index fc749b9..8f69535 100644 (file)
@@ -4,7 +4,7 @@
        #include <xmem.h>\r
 #endif\r
 \r
-LocalIdentity::LocalIdentity()\r
+LocalIdentity::LocalIdentity(SQLite3DB::DB *db):IDatabase(db)\r
 {\r
        Initialize();\r
 }\r
index 0445e29..4c897e3 100644 (file)
        #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
@@ -400,9 +400,11 @@ void Message::Initialize()
        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
@@ -412,10 +414,10 @@ void Message::Initialize()
                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
index 902d5cb..fd4c806 100644 (file)
@@ -27,7 +27,7 @@ void MessageList::LoadRange(const long lowmessageid, const long highmessageid, c
        {\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
index eb0a765..e0a7ad4 100644 (file)
@@ -5,12 +5,12 @@
        #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
index 723ae14..0da5a04 100644 (file)
@@ -13,6 +13,7 @@
 #include <stdlib.h>\r
 #include <time.h>\r
 #include <cstring>\r
+#include <cstdio>\r
 \r
 #ifndef _WIN32\r
        #define stricmp strcasecmp\r
index 0212e23..431c1e6 100644 (file)
@@ -17,9 +17,8 @@
        #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
@@ -30,12 +29,6 @@ NNTPConnection::NNTPConnection(SOCKET sock):m_socket(sock)
        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
@@ -96,7 +89,7 @@ const bool NNTPConnection::HandleAuthInfoCommand(const NNTPCommand &command)
                }\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
@@ -273,7 +266,7 @@ const bool NNTPConnection::HandleGetTrustCommand(const NNTPCommand &command)
                                        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
@@ -341,7 +334,7 @@ const bool NNTPConnection::HandleGetTrustListCommand(const NNTPCommand &command)
 {\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
@@ -410,7 +403,7 @@ const bool NNTPConnection::HandleGroupCommand(const NNTPCommand &command)
 {\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
@@ -462,7 +455,7 @@ const bool NNTPConnection::HandleLastCommand(const NNTPCommand &command)
        {\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
@@ -532,7 +525,7 @@ const bool NNTPConnection::HandleListCommand(const NNTPCommand &command)
        {\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
@@ -563,7 +556,7 @@ const bool NNTPConnection::HandleListCommand(const NNTPCommand &command)
        {\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
@@ -616,7 +609,7 @@ const bool NNTPConnection::HandleListGroupCommand(const NNTPCommand &command)
 {\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
@@ -685,7 +678,7 @@ const bool NNTPConnection::HandleListGroupCommand(const NNTPCommand &command)
                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
@@ -791,7 +784,7 @@ const bool NNTPConnection::HandleNewGroupsCommand(const NNTPCommand &command)
                        }\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
@@ -826,7 +819,7 @@ const bool NNTPConnection::HandleNextCommand(const NNTPCommand &command)
        {\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
@@ -916,7 +909,7 @@ const bool NNTPConnection::HandleOverCommand(const NNTPCommand &command)
 \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
@@ -930,13 +923,13 @@ const bool NNTPConnection::HandleOverCommand(const NNTPCommand &command)
        }\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
@@ -951,7 +944,7 @@ const bool NNTPConnection::HandleOverCommand(const NNTPCommand &command)
                        // 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
@@ -970,7 +963,7 @@ const bool NNTPConnection::HandleOverCommand(const NNTPCommand &command)
                        // 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
@@ -1019,7 +1012,7 @@ const bool NNTPConnection::HandlePostCommand(const NNTPCommand &command)
 \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
@@ -1193,7 +1186,7 @@ const bool NNTPConnection::HandleSetTrustCommand(const NNTPCommand &command)
                                        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
@@ -1276,6 +1269,17 @@ void NNTPConnection::run()
        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
@@ -1400,7 +1404,7 @@ void NNTPConnection::SendArticleParts(const NNTPConnection::NNTPCommand &command
                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
index 04fa1e1..a34fc15 100644 (file)
@@ -40,6 +40,8 @@ void NNTPListener::run()
 \r
        m_log->debug("NNTPListener::run thread started.");\r
 \r
+       LoadDatabase();\r
+\r
        StartListen();\r
 \r
        do\r
@@ -104,19 +106,22 @@ void NNTPListener::run()
 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
index cee9ba2..b4d0a23 100644 (file)
@@ -67,6 +67,9 @@
 #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
index 9694a45..983ba37 100644 (file)
@@ -7,7 +7,7 @@
 \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
index 1f3562f..b1ec99e 100644 (file)
@@ -7,14 +7,15 @@
 #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
@@ -28,7 +29,11 @@ void SetupDefaultOptions()
        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
@@ -40,7 +45,11 @@ void SetupDefaultOptions()
        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
@@ -52,7 +61,11 @@ void SetupDefaultOptions()
        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
@@ -64,7 +77,11 @@ void SetupDefaultOptions()
        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
@@ -76,7 +93,11 @@ void SetupDefaultOptions()
        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
@@ -89,7 +110,11 @@ void SetupDefaultOptions()
        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
@@ -102,7 +127,11 @@ void SetupDefaultOptions()
        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
@@ -115,7 +144,11 @@ void SetupDefaultOptions()
        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
@@ -127,7 +160,11 @@ void SetupDefaultOptions()
        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
@@ -139,7 +176,11 @@ void SetupDefaultOptions()
        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
@@ -151,7 +192,11 @@ void SetupDefaultOptions()
        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
@@ -163,7 +208,11 @@ void SetupDefaultOptions()
        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
@@ -176,7 +225,11 @@ void SetupDefaultOptions()
        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
@@ -189,7 +242,11 @@ void SetupDefaultOptions()
        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
@@ -202,7 +259,11 @@ void SetupDefaultOptions()
        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
@@ -214,7 +275,11 @@ void SetupDefaultOptions()
        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
@@ -226,7 +291,11 @@ void SetupDefaultOptions()
        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
@@ -238,7 +307,11 @@ void SetupDefaultOptions()
        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
@@ -250,7 +323,11 @@ void SetupDefaultOptions()
        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
@@ -262,7 +339,11 @@ void SetupDefaultOptions()
        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
@@ -274,7 +355,11 @@ void SetupDefaultOptions()
        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
@@ -286,7 +371,11 @@ void SetupDefaultOptions()
        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
@@ -298,7 +387,11 @@ void SetupDefaultOptions()
        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
@@ -310,7 +403,11 @@ void SetupDefaultOptions()
        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
@@ -322,7 +419,11 @@ void SetupDefaultOptions()
        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
@@ -334,7 +435,11 @@ void SetupDefaultOptions()
        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
@@ -346,7 +451,11 @@ void SetupDefaultOptions()
        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
@@ -358,7 +467,11 @@ void SetupDefaultOptions()
        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
@@ -370,7 +483,11 @@ void SetupDefaultOptions()
        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
@@ -382,7 +499,11 @@ void SetupDefaultOptions()
        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
@@ -394,7 +515,11 @@ void SetupDefaultOptions()
        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
@@ -406,7 +531,11 @@ void SetupDefaultOptions()
        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
@@ -418,7 +547,11 @@ void SetupDefaultOptions()
        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
@@ -430,7 +563,11 @@ void SetupDefaultOptions()
        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
@@ -442,7 +579,11 @@ void SetupDefaultOptions()
        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
@@ -454,8 +595,14 @@ void SetupDefaultOptions()
        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
index cf21aab..79102b9 100644 (file)
@@ -3,32 +3,19 @@
 \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
@@ -68,16 +55,6 @@ const bool ThreadBuilder::Build(const long messageid, const long boardid, const
                }\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
@@ -86,30 +63,10 @@ const bool ThreadBuilder::Build(const long messageid, const long boardid, const
                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
@@ -137,12 +94,7 @@ const bool ThreadBuilder::Build(const long messageid, const long boardid, const
                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
index bc6a238..f017fa2 100644 (file)
@@ -26,33 +26,24 @@ const bool UnicodeFormatter::LineWrap(const std::string &utf8input, const int li
                        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
index 248c006..6de958a 100644 (file)
@@ -104,16 +104,16 @@ ul                {
                                        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
@@ -181,6 +181,15 @@ h1, h2, h3, h4, h5, h6 {
 .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