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(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
 \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/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
 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
 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
 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
 \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
 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
        \r
        /**\r
                \brief Loads all known boards\r
index f60961b..59fb89d 100644 (file)
@@ -1,11 +1,9 @@
 #ifndef _sqlite3db_\r
 #define _sqlite3db_\r
 \r
 #ifndef _sqlite3db_\r
 #define _sqlite3db_\r
 \r
-#include <Poco/Mutex.h>\r
 #include <sqlite3.h>\r
 #include <string>\r
 #include "../sqlite3db.h"\r
 #include <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
 \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
 namespace SQLite3DB\r
 {\r
 \r
-class DB:public Singleton<DB>\r
+class DB\r
 {\r
 public:\r
        DB();\r
 {\r
 public:\r
        DB();\r
@@ -38,8 +36,6 @@ public:
 \r
        sqlite3 *GetDB() { return m_db; }\r
 \r
 \r
        sqlite3 *GetDB() { return m_db; }\r
 \r
-       Poco::FastMutex m_mutex;                        // public so that recordset and statment can lock this mutex themselves\r
-\r
 private:\r
        void Initialize();\r
        \r
 private:\r
        void Initialize();\r
        \r
index d245d49..e57fbe5 100644 (file)
@@ -3,6 +3,8 @@
 \r
 #include "sqlite3db.h"\r
 \r
 \r
 #include "sqlite3db.h"\r
 \r
+#include <Poco/Mutex.h>\r
+\r
 #include <vector>\r
 #include <map>\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
        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
 \r
 };     //class\r
 \r
index 4db308c..597e171 100644 (file)
@@ -1,21 +1,24 @@
 #ifndef _dbconversions_\r
 #define _dbconversions_\r
 \r
 #ifndef _dbconversions_\r
 #define _dbconversions_\r
 \r
-void ConvertDB0100To0101();\r
-void ConvertDB0101To0103();\r
-void ConvertDB0103To0104();\r
-void ConvertDB0104To0105();\r
-void ConvertDB0105To0106();\r
-void ConvertDB0106To0107();\r
-void ConvertDB0107To0108();\r
-void ConvertDB0108To0109();\r
-void ConvertDB0109To0110();\r
-void ConvertDB0110To0111();\r
-void ConvertDB0111To0112();\r
-void ConvertDB0112To0113();\r
-void ConvertDB0113To0114();\r
+#include "db/sqlite3db.h"\r
+\r
+void ConvertDB0100To0101(SQLite3DB::DB *db);\r
+void ConvertDB0101To0103(SQLite3DB::DB *db);\r
+void ConvertDB0103To0104(SQLite3DB::DB *db);\r
+void ConvertDB0104To0105(SQLite3DB::DB *db);\r
+void ConvertDB0105To0106(SQLite3DB::DB *db);\r
+void ConvertDB0106To0107(SQLite3DB::DB *db);\r
+void ConvertDB0107To0108(SQLite3DB::DB *db);\r
+void ConvertDB0108To0109(SQLite3DB::DB *db);\r
+void ConvertDB0109To0110(SQLite3DB::DB *db);\r
+void ConvertDB0110To0111(SQLite3DB::DB *db);\r
+void ConvertDB0111To0112(SQLite3DB::DB *db);\r
+void ConvertDB0112To0113(SQLite3DB::DB *db);\r
+void ConvertDB0113To0114(SQLite3DB::DB *db);\r
+void ConvertDB0114To0115(SQLite3DB::DB *db);\r
 \r
 // TODO remove sometime after 0.1.17\r
 \r
 // TODO remove sometime after 0.1.17\r
-void FixCapitalBoardNames();\r
+void FixCapitalBoardNames(SQLite3DB::DB *db);\r
 \r
 #endif // _dbconversions_\r
 \r
 #endif // _dbconversions_\r
index 74a7fd8..e7c3dd6 100644 (file)
@@ -3,11 +3,11 @@
 \r
 #include "threadwrapper/cancelablerunnable.h"\r
 #include "ilogger.h"\r
 \r
 #include "threadwrapper/cancelablerunnable.h"\r
 #include "ilogger.h"\r
-#include "idatabase.h"\r
+#include "ithreaddatabase.h"\r
 \r
 #include <Poco/DateTime.h>\r
 \r
 \r
 #include <Poco/DateTime.h>\r
 \r
-class DBMaintenanceThread:public CancelableRunnable,public ILogger,public IDatabase\r
+class DBMaintenanceThread:public CancelableRunnable,public ILogger,public IThreadDatabase\r
 {\r
 public:\r
        DBMaintenanceThread();\r
 {\r
 public:\r
        DBMaintenanceThread();\r
index 84ae815..4b61a50 100644 (file)
@@ -3,12 +3,14 @@
 \r
 #include <string>\r
 \r
 \r
 #include <string>\r
 \r
+#include "db/sqlite3db.h"\r
+\r
 // opens database and creates tables and initial inserts if necessary\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
 // 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
 \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
 \r
 #endif // _dbsetup_\r
index 56b6125..810325d 100644 (file)
@@ -2,13 +2,14 @@
 #define _fmsapp_\r
 \r
 #include "threadwrapper/threadedexecutor.h"\r
 #define _fmsapp_\r
 \r
 #include "threadwrapper/threadedexecutor.h"\r
+#include "ithreaddatabase.h"\r
 \r
 #include <Poco/Util/ServerApplication.h>\r
 \r
 #include <map>\r
 \r
 // main FMS application class\r
 \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
 {\r
 public:\r
        FMSApp();\r
index f0883a1..f66f4b4 100644 (file)
@@ -6,8 +6,8 @@
 class BoardListInserter:public IIndexInserter<long>\r
 {\r
 public:\r
 class BoardListInserter:public IIndexInserter<long>\r
 {\r
 public:\r
-       BoardListInserter();\r
-       BoardListInserter(FCPv2::Connection *fcp);\r
+       BoardListInserter(SQLite3DB::DB *db);\r
+       BoardListInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
 \r
 private:\r
        void Initialize();\r
 \r
 private:\r
        void Initialize();\r
index 3eb7823..c0a124f 100644 (file)
@@ -6,8 +6,8 @@
 class BoardListRequester:public IIndexRequester<long>\r
 {\r
 public:\r
 class BoardListRequester:public IIndexRequester<long>\r
 {\r
 public:\r
-       BoardListRequester();\r
-       BoardListRequester(FCPv2::Connection *fcp);\r
+       BoardListRequester(SQLite3DB::DB *db);\r
+       BoardListRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
 \r
 private:\r
        void Initialize();\r
 \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
                \brief Gets the string representing this message in FCP\r
 \r
                This string is what is actually sent/received from the node through FCP\r
+\r
+               \return The FCP message string\r
        */\r
        const std::string GetFCPString() const;\r
 \r
        */\r
        const std::string GetFCPString() const;\r
 \r
@@ -138,13 +140,13 @@ public:
        /**\r
                \brief Construct connection with an existing socket\r
 \r
        /**\r
                \brief Construct connection with an existing socket\r
 \r
-               \param sock An existing socket connection to a Freenet node\r
+               \param sock An existing open socket connection to a Freenet node\r
        */\r
        Connection(const int sock);\r
        /**\r
        */\r
        Connection(const int sock);\r
        /**\r
-               \brief Default constructor\r
+               \brief Default destructor\r
 \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
        */\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
                \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
                \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
 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
 \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
 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
 \r
        void FCPConnected()                     {}\r
        void FCPDisconnected()          {}\r
index 3e9cae5..f7f176c 100644 (file)
@@ -2,6 +2,7 @@
 #define _freenetmasterthread_\r
 \r
 #include "../ilogger.h"\r
 #define _freenetmasterthread_\r
 \r
 #include "../ilogger.h"\r
+#include "../ithreaddatabase.h"\r
 #include "ifreenetregistrable.h"\r
 #include "ifcpmessagehandler.h"\r
 #include "ifcpconnected.h"\r
 #include "ifreenetregistrable.h"\r
 #include "ifcpmessagehandler.h"\r
 #include "ifcpconnected.h"\r
@@ -12,7 +13,7 @@
 // forward declaration\r
 class IFreenetRegistrable;\r
 \r
 // forward declaration\r
 class IFreenetRegistrable;\r
 \r
-class FreenetMasterThread:public CancelableRunnable,public ILogger, public IFCPMessageHandler\r
+class FreenetMasterThread:public CancelableRunnable,public ILogger, public IFCPMessageHandler, public IThreadDatabase\r
 {\r
 public:\r
        FreenetMasterThread();\r
 {\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
 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
 \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
 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
 \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
 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
 \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
 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
 \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
 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
        virtual ~IIndexInserter()               {}\r
 \r
        virtual void FCPConnected();\r
@@ -52,13 +52,13 @@ protected:
 };\r
 \r
 template <class IDTYPE>\r
 };\r
 \r
 template <class IDTYPE>\r
-IIndexInserter<IDTYPE>::IIndexInserter()\r
+IIndexInserter<IDTYPE>::IIndexInserter(SQLite3DB::DB *db):IDatabase(db)\r
 {\r
        InitializeIIndexInserter();\r
 }\r
 \r
 template <class IDTYPE>\r
 {\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
 {\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
 template <class IDTYPE>\r
 void IIndexInserter<IDTYPE>::InitializeIIndexInserter()\r
 {\r
+       Option option(m_db);\r
        m_fcpuniquename="";\r
        m_fcpuniquename="";\r
-       Option::Instance()->Get("MessageBase",m_messagebase);\r
+       option.Get("MessageBase",m_messagebase);\r
        m_lastchecked=Poco::Timestamp();\r
 }\r
 \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
 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
        virtual ~IIndexRequester()              {}\r
 \r
        virtual void FCPConnected();\r
@@ -59,13 +59,13 @@ protected:
 };\r
 \r
 template <class IDTYPE>\r
 };\r
 \r
 template <class IDTYPE>\r
-IIndexRequester<IDTYPE>::IIndexRequester()\r
+IIndexRequester<IDTYPE>::IIndexRequester(SQLite3DB::DB *db):IDatabase(db)\r
 {\r
        InitializeIIndexRequester();\r
 }\r
 \r
 template <class IDTYPE>\r
 {\r
        InitializeIIndexRequester();\r
 }\r
 \r
 template <class IDTYPE>\r
-IIndexRequester<IDTYPE>::IIndexRequester(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
+IIndexRequester<IDTYPE>::IIndexRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp):IDatabase(db),IFCPConnected(fcp)\r
 {\r
        InitializeIIndexRequester();\r
 }\r
 {\r
        InitializeIIndexRequester();\r
 }\r
@@ -143,8 +143,9 @@ void IIndexRequester<IDTYPE>::InitializeIIndexRequester()
 {\r
        m_maxrequests=-1;\r
        m_fcpuniquename="";\r
 {\r
        m_maxrequests=-1;\r
        m_fcpuniquename="";\r
+       Option option(m_db);\r
 \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
        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
 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
 \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
 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
 \r
 private:\r
        void Initialize();\r
index e2ca076..46108df 100644 (file)
@@ -8,8 +8,8 @@
 class IntroductionPuzzleRequester:public IIndexRequester<long>\r
 {\r
 public:\r
 class IntroductionPuzzleRequester:public IIndexRequester<long>\r
 {\r
 public:\r
-       IntroductionPuzzleRequester();\r
-       IntroductionPuzzleRequester(FCPv2::Connection *fcp);\r
+       IntroductionPuzzleRequester(SQLite3DB::DB *db);\r
+       IntroductionPuzzleRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
 \r
 private:\r
        void Initialize();\r
 \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
 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
 \r
 private:\r
        void Initialize();\r
index 4afed68..c13383a 100644 (file)
@@ -6,8 +6,8 @@
 class MessageListInserter:public IIndexInserter<long>\r
 {\r
 public:\r
 class MessageListInserter:public IIndexInserter<long>\r
 {\r
 public:\r
-       MessageListInserter();\r
-       MessageListInserter(FCPv2::Connection *fcp);\r
+       MessageListInserter(SQLite3DB::DB *db);\r
+       MessageListInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
 \r
 private:\r
        void Initialize();\r
 \r
 private:\r
        void Initialize();\r
index 1b324e2..079fbe7 100644 (file)
@@ -8,8 +8,8 @@
 class MessageListRequester:public IIndexRequester<long>\r
 {\r
 public:\r
 class MessageListRequester:public IIndexRequester<long>\r
 {\r
 public:\r
-       MessageListRequester();\r
-       MessageListRequester(FCPv2::Connection *fcp);\r
+       MessageListRequester(SQLite3DB::DB *db);\r
+       MessageListRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
 \r
 private:\r
        virtual void Initialize();\r
 \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
 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
 \r
 private:\r
        void Initialize();\r
index 5c17e79..2fe4af4 100644 (file)
@@ -6,8 +6,8 @@
 class SiteInserter:public IIndexInserter<long>\r
 {\r
 public:\r
 class SiteInserter:public IIndexInserter<long>\r
 {\r
 public:\r
-       SiteInserter();\r
-       SiteInserter(FCPv2::Connection *fcp);\r
+       SiteInserter(SQLite3DB::DB *db);\r
+       SiteInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
 \r
 private:\r
        void Initialize();\r
 \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
 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
 \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
 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
 \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
 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
 \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
 class UnknownIdentityRequester:public IdentityRequester\r
 {\r
 public:\r
-       UnknownIdentityRequester();\r
-       UnknownIdentityRequester(FCPv2::Connection *fcp);\r
+       UnknownIdentityRequester(SQLite3DB::DB *db);\r
+       UnknownIdentityRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp);\r
 \r
 private:\r
        void Initialize();\r
 \r
 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
 \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_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
 \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 "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
 \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
 {\r
 public:\r
-       FMSHTTPRequestHandlerFactory();\r
+       FMSHTTPRequestHandlerFactory(SQLite3DB::DB *db);\r
        ~FMSHTTPRequestHandlerFactory();\r
 \r
        Poco::Net::HTTPRequestHandler *createRequestHandler(const Poco::Net::HTTPServerRequest &request);\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
 \r
 #include "../threadwrapper/cancelablerunnable.h"\r
 #include "../ilogger.h"\r
-#include "../idatabase.h"\r
+#include "../ithreaddatabase.h"\r
 \r
 #include <cstdlib>\r
 \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
 {\r
 public:\r
        HTTPThread();\r
index f6f2cc0..d0c5856 100644 (file)
@@ -2,6 +2,7 @@
 #define _ipagehandler_\r
 \r
 #include "../ilogger.h"\r
 #define _ipagehandler_\r
 \r
 #include "../ilogger.h"\r
+#include "../idatabase.h"\r
 \r
 #include <Poco/Net/HTTPRequestHandler.h>\r
 #include <Poco/Net/HTTPServerRequest.h>\r
 \r
 #include <Poco/Net/HTTPRequestHandler.h>\r
 #include <Poco/Net/HTTPServerRequest.h>\r
 #include <map>\r
 #include <vector>\r
 \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
 {\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
        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
 #define _addpeerpage_\r
 \r
 #include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
 \r
 \r
-class AddPeerPage:public IPageHandler,public IDatabase\r
+class AddPeerPage:public IPageHandler\r
 {\r
 public:\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
 \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
 \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
 #define _announceidentitypage_\r
 \r
 #include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
 \r
 \r
-class AnnounceIdentityPage:public IPageHandler,public IDatabase\r
+class AnnounceIdentityPage:public IPageHandler\r
 {\r
 public:\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
 \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
 \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
 #define _boardspage_\r
 \r
 #include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
 \r
 \r
-class BoardsPage:public IPageHandler,public IDatabase\r
+class BoardsPage:public IPageHandler\r
 {\r
 public:\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
        \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
 \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
 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
 \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
 \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
 #define _controlboardpage_\r
 \r
 #include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
 \r
 \r
-class ControlBoardPage:public IPageHandler,public IDatabase\r
+class ControlBoardPage:public IPageHandler\r
 {\r
 public:\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
 \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
 \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
 #define _createidentitypage_\r
 \r
 #include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
 \r
 \r
-class CreateIdentityPage:public IPageHandler,public IDatabase\r
+class CreateIdentityPage:public IPageHandler\r
 {\r
 public:\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
 \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
 \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
 #define _execquerypage_\r
 \r
 #include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
 \r
 \r
-class ExecQueryPage:public IPageHandler,public IDatabase\r
+class ExecQueryPage:public IPageHandler\r
 {\r
 public:\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
 \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
 \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
 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
 \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
 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
 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
 \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
 \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
 #define _forumpage_\r
 \r
 #include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
 \r
 \r
-class ForumPage:public IPageHandler,public IDatabase\r
+class ForumPage:public IPageHandler\r
 {\r
 public:\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
 \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
 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
 \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
 \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
 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
 \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
 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
 #define _homepage_\r
 \r
 #include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
 \r
 \r
-class HomePage:public IPageHandler,public IDatabase\r
+class HomePage:public IPageHandler\r
 {\r
 public:\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
 \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
 \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
 #define _insertedfilespage_\r
 \r
 #include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
 \r
 \r
-class InsertedFilesPage:public IPageHandler,public IDatabase\r
+class InsertedFilesPage:public IPageHandler\r
 {\r
 public:\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
 \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
 \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
 #define _localidentitiespage_\r
 \r
 #include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
 \r
 \r
-class LocalIdentitiesPage:public IPageHandler,public IDatabase\r
+class LocalIdentitiesPage:public IPageHandler\r
 {\r
 public:\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
 \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
 \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
 #define _optionspage_\r
 \r
 #include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
 \r
 \r
-class OptionsPage:public IPageHandler,public IDatabase\r
+class OptionsPage:public IPageHandler\r
 {\r
 public:\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
        \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
 \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
 };\r
 \r
 #endif // _optionspage_\r
index 1c69303..00672cc 100644 (file)
@@ -2,14 +2,13 @@
 #define _peerdetailspage_\r
 \r
 #include "../ipagehandler.h"\r
 #define _peerdetailspage_\r
 \r
 #include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
 \r
 \r
-class PeerDetailsPage:public IPageHandler,public IDatabase\r
+class PeerDetailsPage:public IPageHandler\r
 {\r
 public:\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
 \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
 \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
 #define _peermaintenancepage_\r
 \r
 #include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
 \r
 \r
-class PeerMaintenancePage:public IPageHandler,public IDatabase\r
+class PeerMaintenancePage:public IPageHandler\r
 {\r
 public:\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
 \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
 \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
 #define _peertrustpage_\r
 \r
 #include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
 \r
 \r
-class PeerTrustPage:public IPageHandler,public IDatabase\r
+class PeerTrustPage:public IPageHandler\r
 {\r
 public:\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
 \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
 \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
 #define _recentlyaddedpage_\r
 \r
 #include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
 \r
 \r
-class RecentlyAddedPage:public IPageHandler,public IDatabase\r
+class RecentlyAddedPage:public IPageHandler\r
 {\r
 public:\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
 \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
 \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
 #include "../ipagehandler.h"\r
 #include "../../idatabase.h"\r
 \r
-class ShowCaptchaPage:public IPageHandler,public IDatabase\r
+class ShowCaptchaPage:public IPageHandler\r
 {\r
 public:\r
 {\r
 public:\r
+       ShowCaptchaPage(SQLite3DB::DB *db):IPageHandler(db)                             {}\r
 \r
        void handleRequest(Poco::Net::HTTPServerRequest &request, Poco::Net::HTTPServerResponse &response);\r
 \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
 \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
 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
 \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
 \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
 #define _versioninfopage_\r
 \r
 #include "../ipagehandler.h"\r
-#include "../../idatabase.h"\r
 \r
 \r
-class VersionInfoPage:public IPageHandler,public IDatabase\r
+class VersionInfoPage:public IPageHandler\r
 {\r
 public:\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
 \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
 \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
 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
        \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
 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
 \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
 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
 \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
 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
        \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
 class MessageThread:public IDatabase\r
 {\r
 public:\r
+       MessageThread(SQLite3DB::DB *db):IDatabase(db)                  {}\r
+\r
        struct threadnode\r
        {\r
                long m_messageid;\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
 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
 \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 "../ilogger.h"\r
 #include "../message.h"\r
 #include "../localidentity.h"\r
+#include "../ithreaddatabase.h"\r
 \r
 #include <string>\r
 #include <vector>\r
 \r
 #include <string>\r
 #include <vector>\r
@@ -21,7 +22,7 @@
        #include <arpa/inet.h>\r
 #endif\r
 \r
        #include <arpa/inet.h>\r
 #endif\r
 \r
-class NNTPConnection:public CancelableRunnable,public ILogger\r
+class NNTPConnection:public CancelableRunnable,public ILogger,public IThreadDatabase\r
 {\r
 public:\r
        NNTPConnection(SOCKET sock);\r
 {\r
 public:\r
        NNTPConnection(SOCKET sock);\r
@@ -46,6 +47,8 @@ private:
        };\r
        struct ClientStatus\r
        {\r
        };\r
        struct ClientStatus\r
        {\r
+               ClientStatus(SQLite3DB::DB *db):m_authuser(db)          {}\r
+\r
                ClientMode m_mode;\r
                bool m_allowpost;\r
                bool m_isposting;\r
                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 "../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
 \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
 {\r
 public:\r
        NNTPListener();\r
        ~NNTPListener();\r
 \r
        void run();\r
-       void StartListen();\r
 \r
 private:\r
 \r
 \r
 private:\r
 \r
+       void StartListen();\r
+\r
        unsigned short m_listenport;\r
        std::vector<SOCKET> m_listensockets;\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
 #ifndef _option_\r
 #define _option_\r
 \r
-#include "db/sqlite3db.h"\r
+#include "idatabase.h"\r
 \r
 #include <sstream>\r
 \r
 #include <sstream>\r
-#include "threadwrapper/singleton.h"\r
 \r
 //just a wrapper around the database for the options table\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
 {\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
        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
        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
                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
                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
 #ifndef _optionssetup_\r
 #define _optionssetup_\r
 \r
+#include "db/sqlite3db.h"\r
+\r
 // inserts default options into the database\r
 // inserts default options into the database\r
-void SetupDefaultOptions();\r
+void SetupDefaultOptions(SQLite3DB::DB *db);\r
 \r
 #endif // _optionssetup_\r
 \r
 #endif // _optionssetup_\r
index f614d69..090b34e 100644 (file)
@@ -7,6 +7,7 @@
 class ThreadBuilder:public IDatabase,ILogger\r
 {\r
 public:\r
 class ThreadBuilder:public IDatabase,ILogger\r
 {\r
 public:\r
+       ThreadBuilder(SQLite3DB::DB *db):IDatabase(db)                  {}\r
 \r
        const bool Build(const long messageid, const long boardid, const bool bydate=false);\r
 \r
 \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
 -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
 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
        #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
 {\r
        m_boardid=-1;\r
        m_boardname="";\r
@@ -20,17 +20,17 @@ Board::Board()
        m_addedmethod="";\r
 }\r
 \r
        m_addedmethod="";\r
 }\r
 \r
-Board::Board(const long boardid)\r
+Board::Board(SQLite3DB::DB *db, const long boardid):IDatabase(db)\r
 {\r
        Load(boardid);  \r
 }\r
 \r
 {\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
 {\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
 {\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
                        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
                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
        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
                st.Step();\r
        }\r
 }\r
index f8bb003..a828a4a 100644 (file)
@@ -1,5 +1,12 @@
 #include "../../include/db/sqlite3db.h"\r
 \r
 #include "../../include/db/sqlite3db.h"\r
 \r
+#ifdef QUERY_LOG\r
+#include <Poco/Logger.h>\r
+#include <Poco/PatternFormatter.h>\r
+#include <Poco/FileChannel.h>\r
+#include "../../include/stringfunctions.h"\r
+#endif\r
+\r
 #ifdef XMEM\r
        #include <xmem.h>\r
 #endif\r
 #ifdef XMEM\r
        #include <xmem.h>\r
 #endif\r
@@ -30,7 +37,12 @@ const bool DB::Close()
 {\r
        if(IsOpen())\r
        {\r
 {\r
        if(IsOpen())\r
        {\r
-               Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
+               sqlite3_stmt *st=0;\r
+               while((st=sqlite3_next_stmt(m_db,0))!=0)\r
+               {\r
+                       sqlite3_finalize(st);\r
+               }\r
+\r
                m_lastresult=sqlite3_close(m_db);\r
                if(m_lastresult==SQLITE_OK)\r
                {\r
                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
 {\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
                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
                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
 {\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
                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
                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
 {\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
                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
 \r
 const bool DB::IsOpen()\r
 {\r
-       Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
        return m_db ? true : false;\r
 }\r
 \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
        }\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
                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
 {\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
                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
                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
 {\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
                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
                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
 {\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
                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
        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
        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
 #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
 #ifdef XMEM\r
        #include <xmem.h>\r
 #endif\r
@@ -7,6 +15,7 @@
 namespace SQLite3DB\r
 {\r
 \r
 namespace SQLite3DB\r
 {\r
 \r
+Poco::FastMutex Statement::m_mutex;\r
 std::map<sqlite3_stmt *, long> Statement::m_statementcount;\r
 \r
 Statement::Statement():m_statement(0),m_parametercount(0),m_resultcolumncount(0),m_rowreturned(false),m_lastinsertrowid(-1)\r
 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
 \r
        if(m_statement)\r
        {\r
+               Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
                m_statementcount[m_statement]++;\r
        }\r
 }\r
                m_statementcount[m_statement]++;\r
        }\r
 }\r
@@ -134,7 +144,7 @@ void Statement::Finalize()
 {\r
        if(m_statement)\r
        {\r
 {\r
        if(m_statement)\r
        {\r
-               Poco::ScopedLock<Poco::FastMutex> g(DB::Instance()->m_mutex);\r
+               Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
                m_statementcount[m_statement]--;\r
                if(m_statementcount[m_statement]<=0)\r
                {\r
                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
 \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
                        m_statementcount[m_statement]++;\r
                }\r
        }\r
@@ -170,7 +180,6 @@ const bool Statement::Reset()
 {\r
        if(Valid())\r
        {\r
 {\r
        if(Valid())\r
        {\r
-               Poco::ScopedLock<Poco::FastMutex> g(DB::Instance()->m_mutex);\r
                if(sqlite3_reset(m_statement)==SQLITE_OK)\r
                {\r
                        return true;\r
                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
        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
                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
                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
                        }\r
                        if(saveinsertrowid)\r
                        {\r
-                               m_lastinsertrowid=sqlite3_last_insert_rowid(DB::Instance()->GetDB());\r
+                               m_lastinsertrowid=sqlite3_last_insert_rowid(sqlite3_db_handle(m_statement));\r
                        }\r
                        return true;\r
                }\r
                        }\r
                        return true;\r
                }\r
@@ -314,7 +328,6 @@ const bool Statement::Step(const bool saveinsertrowid)
 \r
 const bool Statement::Valid()\r
 {\r
 \r
 const bool Statement::Valid()\r
 {\r
-       Poco::ScopedLock<Poco::FastMutex> g(DB::Instance()->m_mutex);\r
        return m_statement ? true : false ;\r
 }\r
 \r
        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
 #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
 {\r
        // added unique constraint to public and private key\r
-       SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
        db->Execute("CREATE TEMPORARY TABLE tblLocalIdentityTemp AS SELECT * FROM tblLocalIdentity;");\r
        db->Execute("DROP TABLE IF EXISTS tblLocalIdentity;");\r
        db->Execute("CREATE TABLE IF NOT EXISTS tblLocalIdentity(\\r
        db->Execute("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
        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
 {\r
        // remove default 50 from trust fields and set default to NULL\r
-       SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
        db->Execute("CREATE TEMPORARY TABLE tblIdentityTemp AS SELECT * FROM tblIdentity;");\r
        db->Execute("DROP TABLE IF EXISTS tblIdentity;");\r
        db->Execute("CREATE TABLE IF NOT EXISTS tblIdentity(\\r
        db->Execute("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
        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
 {\r
        // add MessageIndex to tblMessage\r
        Poco::Timestamp date;\r
-       SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
        db->Execute("ALTER TABLE tblMessage ADD COLUMN MessageIndex     INTEGER;");\r
        db->Execute("CREATE UNIQUE INDEX IF NOT EXISTS idxMessageRequest ON tblMessageRequests(IdentityID,Day,RequestIndex);");\r
        db->Execute("ALTER TABLE tblLocalIdentity ADD COLUMN DateCreated DATETIME;");\r
        db->Execute("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
        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
 {\r
        // add AddedMethod, MessageTrustComment, TrustListTrustComment to tblIdentity\r
        // add MessageTrustComment,TrustListTrustComment to tblPeerTrust\r
-       SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
        db->Execute("ALTER TABLE tblIdentity ADD COLUMN AddedMethod TEXT;");\r
        db->Execute("ALTER TABLE tblIdentity ADD COLUMN MessageTrustComment TEXT;");\r
        db->Execute("ALTER TABLE tblIdentity ADD COLUMN TrustListTrustComment TEXT;");\r
        db->Execute("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
        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
 {\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
        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
 {\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
        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
 {\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
        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
 {\r
-       SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
        db->Execute("CREATE TABLE IF NOT EXISTS tblFileInserts(\\r
                        FileInsertID            INTEGER PRIMARY KEY,\\r
                        MessageUUID                     TEXT,\\r
        db->Execute("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
        db->Execute("UPDATE tblDBVersion SET Major=1, Minor=9;");\r
 }\r
 \r
-void ConvertDB0109To0110()\r
+void ConvertDB0109To0110(SQLite3DB::DB *db)\r
 {\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
        db->Execute("ALTER TABLE tblFileInserts ADD COLUMN MimeType TEXT;");\r
        db->Execute("UPDATE tblDBVersion SET Major=1, Minor=10;");\r
 }\r
 \r
-void ConvertDB0110To0111()\r
+void ConvertDB0110To0111(SQLite3DB::DB *db)\r
 {\r
        /*\r
        Drop MessageTrustComment, TrustListTrustComment FROM tblIdentity\r
 {\r
        /*\r
        Drop MessageTrustComment, TrustListTrustComment FROM tblIdentity\r
@@ -148,7 +139,6 @@ void ConvertDB0110To0111()
 \r
        Add SendDate to tblMessageInserts\r
        */\r
 \r
        Add SendDate to tblMessageInserts\r
        */\r
-       SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
 \r
        db->Execute("ALTER TABLE tblMessageInserts ADD COLUMN SendDate DATETIME;");\r
 \r
 \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
        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
 {\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
 \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
        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
 {\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
 \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
        db->Execute("UPDATE tblDBVersion SET Major=1, Minor=13;");\r
 }\r
 \r
-void ConvertDB0113To0114()\r
+void ConvertDB0113To0114(SQLite3DB::DB *db)\r
 {\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
 \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
        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
 {\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
 \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_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
 \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
 \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
 \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
                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
        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
        // 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
                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
        // 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
                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
 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
        // 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
        // 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_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
        // 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
                st.Step();\r
        }\r
 \r
+       m_db->Execute("COMMIT;");\r
+\r
        m_log->debug("PeriodicDBMaintenance::Do6HourMaintenance");\r
 }\r
 \r
        m_log->debug("PeriodicDBMaintenance::Do6HourMaintenance");\r
 }\r
 \r
@@ -223,6 +224,8 @@ void DBMaintenanceThread::Do1DayMaintenance()
 {\r
        Poco::DateTime date;\r
 \r
 {\r
        Poco::DateTime date;\r
 \r
+       m_db->Execute("BEGIN;");\r
+\r
        // delete all puzzles 2 or more days old\r
        date=Poco::Timestamp();\r
        date-=Poco::Timespan(2,0,0,0,0);\r
        // 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("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
        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
 {\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
        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
 #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
 {\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
 \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
                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
                        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
                        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
                        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
                        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
                        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
                        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
                        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
                        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
                        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
                        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
                        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
                        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
                        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
        }\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
        }\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
 \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
                                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
                                );");\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
                                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
 \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
                                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
        // 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
 \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
        // 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
        // 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
        // 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
        // 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
        // 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
        // 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
        // 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
        // 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
 \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
 \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
 {\r
-       SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
        SQLite3DB::Statement st=db->Prepare("PRAGMA integrity_check;");\r
        st.Step();\r
        if(st.RowReturned())\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
        }\r
 }\r
 \r
-const std::string TestDBIntegrity()\r
+const std::string TestDBIntegrity(SQLite3DB::DB *db)\r
 {\r
        std::string result="";\r
 \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
        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
        }\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
        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
        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
        {\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
        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
 }\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
        // 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
        {\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
                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
                if(tempval=="true")\r
                {\r
                        logger().information("VACUUMing database");\r
-                       SQLite3DB::DB::Instance()->Execute("VACUUM;");\r
+                       m_db->Execute("VACUUM;");\r
                }\r
 \r
                StartThreads();\r
                }\r
 \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
 {\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
                {\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
                        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
 \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
        st.Step();\r
        while(st.RowReturned())\r
        {\r
@@ -252,13 +272,14 @@ void FMSApp::showOptions()
 \r
 void FMSApp::StartThreads()\r
 {\r
 \r
 void FMSApp::StartThreads()\r
 {\r
-       std::string tempval="";\r
+       std::string tempval("");\r
+       Option option(m_db);\r
 \r
        // always start the DB maintenance thread\r
        logger().trace("FMSApp::StartThreads starting DBMaintenanceThread");\r
        m_threads.Start(new DBMaintenanceThread());\r
 \r
 \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
        if(tempval=="true")\r
        {\r
                logger().trace("FMSApp::StartThreads starting HTTPThread");\r
@@ -274,7 +295,7 @@ void FMSApp::StartThreads()
        }\r
 \r
        tempval="";\r
        }\r
 \r
        tempval="";\r
-       Option::Instance()->Get("StartNNTP",tempval);\r
+       option.Get("StartNNTP",tempval);\r
        if(tempval=="true")\r
        {\r
                logger().trace("FMSApp::StartThreads starting NNTPListener");\r
        if(tempval=="true")\r
        {\r
                logger().trace("FMSApp::StartThreads starting NNTPListener");\r
@@ -290,7 +311,7 @@ void FMSApp::StartThreads()
        }\r
 \r
        tempval="";\r
        }\r
 \r
        tempval="";\r
-       Option::Instance()->Get("StartFreenetUpdater",tempval);\r
+       option.Get("StartFreenetUpdater",tempval);\r
        if(tempval=="true")\r
        {\r
                logger().trace("FMSApp::StartThreads starting FreenetMasterThread");\r
        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
        #include <xmem.h>\r
 #endif\r
 \r
-BoardListInserter::BoardListInserter()\r
+BoardListInserter::BoardListInserter(SQLite3DB::DB *db):IIndexInserter<long>(db)\r
 {\r
        Initialize();\r
 }\r
 \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
 {\r
        Initialize();\r
 }\r
index 21e82b7..41df7d6 100644 (file)
@@ -8,12 +8,12 @@
        #include <xmem.h>\r
 #endif\r
 \r
        #include <xmem.h>\r
 #endif\r
 \r
-BoardListRequester::BoardListRequester()\r
+BoardListRequester::BoardListRequester(SQLite3DB::DB *db):IIndexRequester<long>(db)\r
 {\r
        Initialize();\r
 }\r
 \r
 {\r
        Initialize();\r
 }\r
 \r
-BoardListRequester::BoardListRequester(FCPv2::Connection *fcp):IIndexRequester<long>(fcp)\r
+BoardListRequester::BoardListRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp):IIndexRequester<long>(db,fcp)\r
 {\r
        Initialize();\r
 }\r
 {\r
        Initialize();\r
 }\r
@@ -192,8 +192,9 @@ void BoardListRequester::Initialize()
 \r
        m_fcpuniquename="BoardListRequester";\r
        m_maxrequests=0;\r
 \r
        m_fcpuniquename="BoardListRequester";\r
        m_maxrequests=0;\r
+       Option option(m_db);\r
 \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
        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
                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
        if(tempval=="true")\r
        {\r
                m_savemessagesfromnewboards=true;\r
@@ -214,7 +215,7 @@ void BoardListRequester::Initialize()
                m_savemessagesfromnewboards=false;\r
        }\r
 \r
                m_savemessagesfromnewboards=false;\r
        }\r
 \r
-       Option::Instance()->Get("LocalTrustOverridesPeerTrust",tempval);\r
+       option.Get("LocalTrustOverridesPeerTrust",tempval);\r
        if(tempval=="true")\r
        {\r
                m_localtrustoverrides=true;\r
        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 <sstream>\r
 #include <algorithm>\r
 #include <cstdarg>\r
+#include <cstring>\r
+#include <cstdlib>\r
 \r
 #ifdef _WIN32\r
        #include <ws2tcpip.h>\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
        #include <xmem.h>\r
 #endif\r
 \r
-FileInserter::FileInserter()\r
+FileInserter::FileInserter(SQLite3DB::DB *db):IIndexInserter<long>(db)\r
 {\r
        Initialize();\r
 }\r
 \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
 {\r
        Initialize();\r
 }\r
index 39fb027..0d72722 100644 (file)
@@ -6,12 +6,12 @@
 #include <Poco/Timestamp.h>\r
 #include <Poco/Timespan.h>\r
 \r
 #include <Poco/Timestamp.h>\r
 #include <Poco/Timespan.h>\r
 \r
-FMSVersionRequester::FMSVersionRequester()\r
+FMSVersionRequester::FMSVersionRequester(SQLite3DB::DB *db):IDatabase(db)\r
 {\r
        Initialize();\r
 }\r
 \r
 {\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
 {\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
        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
        }\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
                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
                }\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
        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
        {\r
                StringFunctions::Convert(editionstr,edition);\r
                edition++;\r
index 4890339..9c75a06 100644 (file)
        #include <xmem.h>\r
 #endif\r
 \r
        #include <xmem.h>\r
 #endif\r
 \r
-FreenetMasterThread::FreenetMasterThread()\r
+FreenetMasterThread::FreenetMasterThread():m_receivednodehello(false)\r
 {\r
 \r
 {\r
 \r
-       if(Option::Instance()->Get("FCPHost",m_fcphost)==false)\r
-       {\r
-               m_fcphost="localhost";\r
-               Option::Instance()->Set("FCPHost",m_fcphost);\r
-       }\r
-       if(Option::Instance()->GetInt("FCPPort",m_fcpport)==false)\r
-       {\r
-               m_fcpport=9481;\r
-               Option::Instance()->Set("FCPPort",m_fcpport);\r
-       }\r
-       else\r
-       {\r
-               if(m_fcpport<1 || m_fcpport>65535)\r
-               {\r
-                       m_fcpport=9481;\r
-                       Option::Instance()->Set("FCPPort",m_fcpport);\r
-               }\r
-       }\r
-\r
-       m_receivednodehello=false;\r
-\r
 }\r
 \r
 FreenetMasterThread::~FreenetMasterThread()\r
 }\r
 \r
 FreenetMasterThread::~FreenetMasterThread()\r
@@ -195,6 +174,10 @@ void FreenetMasterThread::run()
 \r
        m_log->debug("FreenetMasterThread::run thread started.");\r
 \r
 \r
        m_log->debug("FreenetMasterThread::run thread started.");\r
 \r
+       LoadDatabase();\r
+\r
+\r
+\r
        Setup();\r
 \r
        do\r
        Setup();\r
 \r
        do\r
@@ -288,29 +271,49 @@ void FreenetMasterThread::run()
 void FreenetMasterThread::Setup()\r
 {\r
 \r
 void FreenetMasterThread::Setup()\r
 {\r
 \r
+       Option option(m_db);\r
+       if(option.Get("FCPHost",m_fcphost)==false)\r
+       {\r
+               m_fcphost="localhost";\r
+               option.Set("FCPHost",m_fcphost);\r
+       }\r
+       if(option.GetInt("FCPPort",m_fcpport)==false)\r
+       {\r
+               m_fcpport=9481;\r
+               option.Set("FCPPort",m_fcpport);\r
+       }\r
+       else\r
+       {\r
+               if(m_fcpport<1 || m_fcpport>65535)\r
+               {\r
+                       m_fcpport=9481;\r
+                       option.Set("FCPPort",m_fcpport);\r
+               }\r
+       }\r
+\r
        // seed random number generator\r
        srand(time(NULL));\r
 \r
        // 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
 \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
        #include <xmem.h>\r
 #endif\r
 \r
-IdentityInserter::IdentityInserter()\r
+IdentityInserter::IdentityInserter(SQLite3DB::DB *db):IDatabase(db)\r
 {\r
        Initialize();\r
 }\r
 \r
 {\r
        Initialize();\r
 }\r
 \r
-IdentityInserter::IdentityInserter(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
+IdentityInserter::IdentityInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp):IDatabase(db),IFCPConnected(fcp)\r
 {\r
        Initialize();\r
 }\r
 {\r
        Initialize();\r
 }\r
@@ -184,7 +184,8 @@ void IdentityInserter::StartInsert(const long localidentityid)
                }\r
                StringFunctions::Convert(index,indexstr);\r
 \r
                }\r
                StringFunctions::Convert(index,indexstr);\r
 \r
-               Option::Instance()->Get("MessageBase",messagebase);\r
+               Option option(m_db);\r
+               option.Get("MessageBase",messagebase);\r
 \r
                if(rs.GetField(0))\r
                {\r
 \r
                if(rs.GetField(0))\r
                {\r
index 78a0f93..5d01882 100644 (file)
        #include <xmem.h>\r
 #endif\r
 \r
        #include <xmem.h>\r
 #endif\r
 \r
-IdentityIntroductionInserter::IdentityIntroductionInserter()\r
+IdentityIntroductionInserter::IdentityIntroductionInserter(SQLite3DB::DB *db):IDatabase(db)\r
 {\r
        Initialize();\r
 }\r
 \r
 {\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
 {\r
        Initialize();\r
 }\r
@@ -91,7 +91,8 @@ const bool IdentityIntroductionInserter::HandleMessage(FCPv2::Message &message)
 void IdentityIntroductionInserter::Initialize()\r
 {\r
        m_inserting=false;\r
 void IdentityIntroductionInserter::Initialize()\r
 {\r
        m_inserting=false;\r
-       Option::Instance()->Get("MessageBase",m_messagebase);\r
+       Option option(m_db);\r
+       option.Get("MessageBase",m_messagebase);\r
 }\r
 \r
 void IdentityIntroductionInserter::Process()\r
 }\r
 \r
 void IdentityIntroductionInserter::Process()\r
index 20fb31f..b9532f3 100644 (file)
        #include <xmem.h>\r
 #endif\r
 \r
        #include <xmem.h>\r
 #endif\r
 \r
-IdentityIntroductionRequester::IdentityIntroductionRequester()\r
+IdentityIntroductionRequester::IdentityIntroductionRequester(SQLite3DB::DB *db):IDatabase(db)\r
 {\r
        Initialize();\r
 }\r
 \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
 {\r
        Initialize();\r
 }\r
@@ -178,7 +178,8 @@ const bool IdentityIntroductionRequester::HandleMessage(FCPv2::Message &message)
 void IdentityIntroductionRequester::Initialize()\r
 {\r
        m_maxrequests=0;\r
 void IdentityIntroductionRequester::Initialize()\r
 {\r
        m_maxrequests=0;\r
-       Option::Instance()->GetInt("MaxIdentityIntroductionRequests",m_maxrequests);\r
+       Option option(m_db);\r
+       option.GetInt("MaxIdentityIntroductionRequests",m_maxrequests);\r
        if(m_maxrequests<1)\r
        {\r
                m_maxrequests=1;\r
        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
        {\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
        m_tempdate=Poco::Timestamp();\r
 }\r
 \r
index 9e7a769..18810d5 100644 (file)
        #include <xmem.h>\r
 #endif\r
 \r
        #include <xmem.h>\r
 #endif\r
 \r
-IdentityRequester::IdentityRequester()\r
+IdentityRequester::IdentityRequester(SQLite3DB::DB *db):IIndexRequester<long>(db)\r
 {\r
        Initialize();\r
 }\r
 \r
 {\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
 {\r
        Initialize();\r
 }\r
@@ -163,7 +163,8 @@ const bool IdentityRequester::HandleGetFailed(FCPv2::Message &message)
 void IdentityRequester::Initialize()\r
 {\r
        m_fcpuniquename="KnownIdentityRequester";\r
 void IdentityRequester::Initialize()\r
 {\r
        m_fcpuniquename="KnownIdentityRequester";\r
-       Option::Instance()->GetInt("MaxIdentityRequests",m_maxrequests);\r
+       Option option(m_db);\r
+       option.GetInt("MaxIdentityRequests",m_maxrequests);\r
 \r
        // known identities get 4/5 + any remaining if not evenly divisible - unknown identities get 1/5 of the max requests option\r
        m_maxrequests=((m_maxrequests*4)/5)+(m_maxrequests%5);\r
 \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
        #include <xmem.h>\r
 #endif\r
 \r
-InactiveMessageListRequester::InactiveMessageListRequester()\r
+InactiveMessageListRequester::InactiveMessageListRequester(SQLite3DB::DB *db):MessageListRequester(db)\r
 {\r
        Initialize();\r
 }\r
 \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
 {\r
        Initialize();\r
 }\r
@@ -22,7 +22,8 @@ void InactiveMessageListRequester::Initialize()
        std::string tempval="";\r
 \r
        m_maxrequests=0;\r
        std::string tempval="";\r
 \r
        m_maxrequests=0;\r
-       Option::Instance()->GetInt("MaxMessageListRequests",m_maxrequests);\r
+       Option option(m_db);\r
+       option.GetInt("MaxMessageListRequests",m_maxrequests);\r
 \r
        // inactive identities get 1/2 of the max requests option -  active identities get 1/2 + any remaining if not evenly divisible\r
        m_maxrequests=(m_maxrequests/2);\r
 \r
        // 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
        }\r
 \r
        tempval="";\r
-       Option::Instance()->Get("LocalTrustOverridesPeerTrust",tempval);\r
+       option.Get("LocalTrustOverridesPeerTrust",tempval);\r
        if(tempval=="true")\r
        {\r
                m_localtrustoverrides=true;\r
        if(tempval=="true")\r
        {\r
                m_localtrustoverrides=true;\r
@@ -49,7 +50,7 @@ void InactiveMessageListRequester::Initialize()
        }\r
 \r
        tempval="";\r
        }\r
 \r
        tempval="";\r
-       Option::Instance()->Get("SaveMessagesFromNewBoards",tempval);\r
+       option.Get("SaveMessagesFromNewBoards",tempval);\r
        if(tempval=="true")\r
        {\r
                m_savetonewboards=true;\r
        if(tempval=="true")\r
        {\r
                m_savetonewboards=true;\r
@@ -61,7 +62,7 @@ void InactiveMessageListRequester::Initialize()
 \r
        m_messagedownloadmaxdaysbackward=5;\r
        tempval="5";\r
 \r
        m_messagedownloadmaxdaysbackward=5;\r
        tempval="5";\r
-       Option::Instance()->Get("MessageDownloadMaxDaysBackward",tempval);\r
+       option.Get("MessageDownloadMaxDaysBackward",tempval);\r
        StringFunctions::Convert(tempval,m_messagedownloadmaxdaysbackward);\r
 \r
 }\r
        StringFunctions::Convert(tempval,m_messagedownloadmaxdaysbackward);\r
 \r
 }\r
index 089e4ac..000d973 100644 (file)
        #include <xmem.h>\r
 #endif\r
 \r
        #include <xmem.h>\r
 #endif\r
 \r
-IntroductionPuzzleInserter::IntroductionPuzzleInserter():IIndexInserter<long>()\r
+IntroductionPuzzleInserter::IntroductionPuzzleInserter(SQLite3DB::DB *db):IIndexInserter<long>(db)\r
 {\r
        Initialize();\r
 }\r
 \r
 {\r
        Initialize();\r
 }\r
 \r
-IntroductionPuzzleInserter::IntroductionPuzzleInserter(FCPv2::Connection *fcp):IIndexInserter<long>(fcp)\r
+IntroductionPuzzleInserter::IntroductionPuzzleInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp):IIndexInserter<long>(db,fcp)\r
 {\r
        Initialize();\r
 }\r
 {\r
        Initialize();\r
 }\r
@@ -224,7 +224,8 @@ const bool IntroductionPuzzleInserter::StartInsert(const long &localidentityid)
                        }\r
                }\r
 \r
                        }\r
                }\r
 \r
-               Option::Instance()->Get("MessageBase",messagebase);\r
+               Option option(m_db);\r
+               option.Get("MessageBase",messagebase);\r
 \r
                GenerateCaptcha(encodedpuzzle,solutionstring);\r
                if(encodedpuzzle.size()==0)\r
 \r
                GenerateCaptcha(encodedpuzzle,solutionstring);\r
                if(encodedpuzzle.size()==0)\r
index fd81f14..9f1ee76 100644 (file)
        #include <xmem.h>\r
 #endif\r
 \r
        #include <xmem.h>\r
 #endif\r
 \r
-IntroductionPuzzleRequester::IntroductionPuzzleRequester()\r
+IntroductionPuzzleRequester::IntroductionPuzzleRequester(SQLite3DB::DB *db):IIndexRequester<long>(db)\r
 {\r
        Initialize();\r
 }\r
 \r
 {\r
        Initialize();\r
 }\r
 \r
-IntroductionPuzzleRequester::IntroductionPuzzleRequester(FCPv2::Connection *fcp):IIndexRequester<long>(fcp)\r
+IntroductionPuzzleRequester::IntroductionPuzzleRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp):IIndexRequester<long>(db,fcp)\r
 {\r
        Initialize();\r
 }\r
 {\r
        Initialize();\r
 }\r
@@ -186,7 +186,8 @@ void IntroductionPuzzleRequester::Initialize()
 {\r
        m_fcpuniquename="IntroductionPuzzleRequester";\r
        m_maxrequests=0;\r
 {\r
        m_fcpuniquename="IntroductionPuzzleRequester";\r
        m_maxrequests=0;\r
-       Option::Instance()->GetInt("MaxIntroductionPuzzleRequests",m_maxrequests);\r
+       Option option(m_db);\r
+       option.GetInt("MaxIntroductionPuzzleRequests",m_maxrequests);\r
        if(m_maxrequests<1)\r
        {\r
                m_maxrequests=1;\r
        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
 #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
 {\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
 {\r
        Initialize();\r
 }\r
index 04ab9f3..56e7013 100644 (file)
        #include <xmem.h>\r
 #endif\r
 \r
        #include <xmem.h>\r
 #endif\r
 \r
-MessageListInserter::MessageListInserter()\r
+MessageListInserter::MessageListInserter(SQLite3DB::DB *db):IIndexInserter<long>(db)\r
 {\r
        Initialize();\r
 }\r
 \r
 {\r
        Initialize();\r
 }\r
 \r
-MessageListInserter::MessageListInserter(FCPv2::Connection *fcp):IIndexInserter<long>(fcp)\r
+MessageListInserter::MessageListInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp):IIndexInserter<long>(db,fcp)\r
 {\r
        Initialize();\r
 }\r
 {\r
        Initialize();\r
 }\r
@@ -152,11 +152,12 @@ const bool MessageListInserter::HandlePutSuccessful(FCPv2::Message &message)
 \r
 void MessageListInserter::Initialize()\r
 {\r
 \r
 void MessageListInserter::Initialize()\r
 {\r
-       std::string tempval;\r
-\r
+       std::string tempval("");\r
        m_fcpuniquename="MessageListInserter";\r
        m_daysbackward=0;\r
        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
        StringFunctions::Convert(tempval,m_daysbackward);\r
 }\r
 \r
index 17aba0a..c5cb291 100644 (file)
        #include <xmem.h>\r
 #endif\r
 \r
        #include <xmem.h>\r
 #endif\r
 \r
-MessageListRequester::MessageListRequester()\r
+MessageListRequester::MessageListRequester(SQLite3DB::DB *db):IIndexRequester<long>(db)\r
 {\r
        Initialize();\r
 }\r
 \r
 {\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
 {\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
        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
                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
                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
                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
 void MessageListRequester::Initialize()\r
 {\r
        m_fcpuniquename="ActiveMessageListRequester";\r
-       std::string tempval="";\r
-\r
+       std::string tempval("");\r
        m_maxrequests=0;\r
        m_maxrequests=0;\r
-       Option::Instance()->GetInt("MaxMessageListRequests",m_maxrequests);\r
+       Option option(m_db);\r
+\r
+       option.GetInt("MaxMessageListRequests",m_maxrequests);\r
 \r
        // active identities get 1/2 of the max requests option + any remaining if not evenly divisible - inactive identities get 1/2\r
        m_maxrequests=(m_maxrequests/2)+(m_maxrequests%2);\r
 \r
        // 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
        }\r
 \r
        tempval="";\r
-       Option::Instance()->Get("LocalTrustOverridesPeerTrust",tempval);\r
+       option.Get("LocalTrustOverridesPeerTrust",tempval);\r
        if(tempval=="true")\r
        {\r
                m_localtrustoverrides=true;\r
        if(tempval=="true")\r
        {\r
                m_localtrustoverrides=true;\r
@@ -363,7 +368,7 @@ void MessageListRequester::Initialize()
        }\r
 \r
        tempval="";\r
        }\r
 \r
        tempval="";\r
-       Option::Instance()->Get("SaveMessagesFromNewBoards",tempval);\r
+       option.Get("SaveMessagesFromNewBoards",tempval);\r
        if(tempval=="true")\r
        {\r
                m_savetonewboards=true;\r
        if(tempval=="true")\r
        {\r
                m_savetonewboards=true;\r
@@ -375,7 +380,7 @@ void MessageListRequester::Initialize()
 \r
        m_messagedownloadmaxdaysbackward=5;\r
        tempval="5";\r
 \r
        m_messagedownloadmaxdaysbackward=5;\r
        tempval="5";\r
-       Option::Instance()->Get("MessageDownloadMaxDaysBackward",tempval);\r
+       option.Get("MessageDownloadMaxDaysBackward",tempval);\r
        StringFunctions::Convert(tempval,m_messagedownloadmaxdaysbackward);\r
 \r
 }\r
        StringFunctions::Convert(tempval,m_messagedownloadmaxdaysbackward);\r
 \r
 }\r
index fbd767c..f1429ab 100644 (file)
        #include <xmem.h>\r
 #endif\r
 \r
        #include <xmem.h>\r
 #endif\r
 \r
-MessageRequester::MessageRequester()\r
+MessageRequester::MessageRequester(SQLite3DB::DB *db):IIndexRequester<std::string>(db)\r
 {\r
        Initialize();\r
 }\r
 \r
 {\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
 {\r
        Initialize();\r
 }\r
@@ -224,6 +224,8 @@ const bool MessageRequester::HandleAllData(FCPv2::Message &message)
                                nntpbody+="\r\n";\r
                        }\r
 \r
                                nntpbody+="\r\n";\r
                        }\r
 \r
+                       m_db->Execute("BEGIN;");\r
+\r
                        st=m_db->Prepare("INSERT INTO tblMessage(IdentityID,FromName,MessageDate,MessageTime,Subject,MessageUUID,ReplyBoardID,Body,MessageIndex) VALUES(?,?,?,?,?,?,?,?,?);");\r
                        st.Bind(0,identityid);\r
                        st.Bind(1,GetIdentityName(identityid));\r
                        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_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
                }       // 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
 void MessageRequester::Initialize()\r
 {\r
        m_fcpuniquename="MessageRequester";\r
-       std::string tempval;\r
-\r
+       std::string tempval("");\r
        m_maxrequests=0;\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
        if(m_maxrequests<1)\r
        {\r
                m_maxrequests=1;\r
@@ -334,7 +339,7 @@ void MessageRequester::Initialize()
        }\r
 \r
        m_maxdaysbackward=0;\r
        }\r
 \r
        m_maxdaysbackward=0;\r
-       Option::Instance()->GetInt("MessageDownloadMaxDaysBackward",m_maxdaysbackward);\r
+       option.GetInt("MessageDownloadMaxDaysBackward",m_maxdaysbackward);\r
        if(m_maxdaysbackward<0)\r
        {\r
                m_maxdaysbackward=0;\r
        if(m_maxdaysbackward<0)\r
        {\r
                m_maxdaysbackward=0;\r
@@ -346,7 +351,7 @@ void MessageRequester::Initialize()
        }\r
 \r
        m_maxpeermessages=0;\r
        }\r
 \r
        m_maxpeermessages=0;\r
-       Option::Instance()->GetInt("MaxPeerMessagesPerDay",m_maxpeermessages);\r
+       option.GetInt("MaxPeerMessagesPerDay",m_maxpeermessages);\r
        if(m_maxpeermessages<1)\r
        {\r
                m_maxpeermessages=1;\r
        if(m_maxpeermessages<1)\r
        {\r
                m_maxpeermessages=1;\r
@@ -358,7 +363,7 @@ void MessageRequester::Initialize()
        }\r
 \r
        m_maxboardspermessage=0;\r
        }\r
 \r
        m_maxboardspermessage=0;\r
-       Option::Instance()->GetInt("MaxBoardsPerMessage",m_maxboardspermessage);\r
+       option.GetInt("MaxBoardsPerMessage",m_maxboardspermessage);\r
        if(m_maxboardspermessage<1)\r
        {\r
                m_maxboardspermessage=1;\r
        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
                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
        if(tempval=="true")\r
        {\r
                m_savemessagesfromnewboards=true;\r
@@ -379,7 +384,7 @@ void MessageRequester::Initialize()
                m_savemessagesfromnewboards=false;\r
        }\r
 \r
                m_savemessagesfromnewboards=false;\r
        }\r
 \r
-       Option::Instance()->Get("LocalTrustOverridesPeerTrust",tempval);\r
+       option.Get("LocalTrustOverridesPeerTrust",tempval);\r
        if(tempval=="true")\r
        {\r
                m_localtrustoverrides=true;\r
        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 <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
 \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
 {\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
 {\r
        Initialize();\r
 }\r
index 0851c61..10bfbce 100644 (file)
        #include <xmem.h>\r
 #endif\r
 \r
        #include <xmem.h>\r
 #endif\r
 \r
-TrustListInserter::TrustListInserter()\r
+TrustListInserter::TrustListInserter(SQLite3DB::DB *db):IDatabase(db)\r
 {\r
        Initialize();\r
 }\r
 \r
 {\r
        Initialize();\r
 }\r
 \r
-TrustListInserter::TrustListInserter(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
+TrustListInserter::TrustListInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp):IDatabase(db),IFCPConnected(fcp)\r
 {\r
        Initialize();\r
 }\r
 {\r
        Initialize();\r
 }\r
@@ -108,7 +108,8 @@ const bool TrustListInserter::HandleMessage(FCPv2::Message &message)
 \r
 void TrustListInserter::Initialize()\r
 {\r
 \r
 void TrustListInserter::Initialize()\r
 {\r
-       Option::Instance()->Get("MessageBase",m_messagebase);\r
+       Option option(m_db);\r
+       option.Get("MessageBase",m_messagebase);\r
        m_lastchecked=Poco::Timestamp();\r
 }\r
 \r
        m_lastchecked=Poco::Timestamp();\r
 }\r
 \r
index bedc845..96d24df 100644 (file)
        #include <xmem.h>\r
 #endif\r
 \r
        #include <xmem.h>\r
 #endif\r
 \r
-TrustListRequester::TrustListRequester()\r
+TrustListRequester::TrustListRequester(SQLite3DB::DB *db):IIndexRequester<long>(db)\r
 {\r
        Initialize();\r
 }\r
 \r
 {\r
        Initialize();\r
 }\r
 \r
-TrustListRequester::TrustListRequester(FCPv2::Connection *fcp):IIndexRequester<long>(fcp)\r
+TrustListRequester::TrustListRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp):IIndexRequester<long>(db,fcp)\r
 {\r
        Initialize();\r
 }\r
 {\r
        Initialize();\r
 }\r
@@ -109,6 +109,8 @@ const bool TrustListRequester::HandleAllData(FCPv2::Message &message)
                }\r
                st.Finalize();\r
 \r
                }\r
                st.Finalize();\r
 \r
+               m_db->Execute("BEGIN;");\r
+\r
                // drop all existing peer trust from this identity - we will rebuild it when we go through each trust in the xml file\r
                st=m_db->Prepare("DELETE FROM tblPeerTrust WHERE IdentityID=?;");\r
                st.Bind(0,identityid);\r
                // 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
                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
                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
        std::string tempval="";\r
        m_fcpuniquename="TrustListRequester";\r
-\r
        m_maxrequests=0;\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
        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
        #include <xmem.h>\r
 #endif\r
 \r
-UnkeyedIDCreator::UnkeyedIDCreator()\r
+UnkeyedIDCreator::UnkeyedIDCreator(SQLite3DB::DB *db):IDatabase(db)\r
 {\r
        Initialize();\r
 }\r
 \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
 {\r
        Initialize();\r
 }\r
index 63e12c3..5906b02 100644 (file)
@@ -5,20 +5,22 @@
        #include <xmem.h>\r
 #endif\r
 \r
        #include <xmem.h>\r
 #endif\r
 \r
-UnknownIdentityRequester::UnknownIdentityRequester()\r
+UnknownIdentityRequester::UnknownIdentityRequester(SQLite3DB::DB *db):IdentityRequester(db)\r
 {\r
        Initialize();\r
 }\r
 \r
 {\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
 {\r
        Initialize();\r
 }\r
 \r
 void UnknownIdentityRequester::Initialize()\r
 {\r
+       Option option(m_db);\r
+\r
        m_fcpuniquename="UnknownIdentityRequester";\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
 \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
 #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
 \r
-FMSHTTPRequestHandlerFactory::FMSHTTPRequestHandlerFactory()\r
+#include <cstdio>\r
+\r
+FMSHTTPRequestHandlerFactory::FMSHTTPRequestHandlerFactory(SQLite3DB::DB *db):IDatabase(db)\r
 {\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
        // 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
        }\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
        // 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
 \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
        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
 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
 }\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
        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
 \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/http/ipagehandler.h"\r
 #include "../../include/stringfunctions.h"\r
 #include "../../include/http/multipartparser.h"\r
-#include "../../include/db/sqlite3db.h"\r
 \r
 #include <Poco/Net/HTMLForm.h>\r
 #include <Poco/UUIDGenerator.h>\r
 \r
 #include <Poco/Net/HTMLForm.h>\r
 #include <Poco/UUIDGenerator.h>\r
@@ -54,7 +53,7 @@ const std::string IPageHandler::CreateFormPassword()
        {\r
        }\r
 \r
        {\r
        }\r
 \r
-       SQLite3DB::Statement st=SQLite3DB::DB::Instance()->Prepare("INSERT INTO tmpFormPassword(Date,Password) VALUES(?,?);");\r
+       SQLite3DB::Statement st=m_db->Prepare("INSERT INTO tmpFormPassword(Date,Password) VALUES(?,?);");\r
        st.Bind(0,Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S"));\r
        st.Bind(1,uuid.toString());\r
        st.Step();\r
        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
        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.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
                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
 \r
                if(error=="")\r
                {\r
-                       Message mess;\r
+                       Message mess(m_db);\r
                        \r
                        long localidentityid=-1;\r
                        long boardid=-1;\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
 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
        std::string messagecountstr="";\r
        std::string filecountstr="";\r
        std::string fcphost="127.0.0.1";\r
        std::string fproxyport="8888";\r
 \r
-       Option::Instance()->Get("FCPHost",fcphost);\r
-       Option::Instance()->Get("FProxyPort",fproxyport);\r
+       option.Get("FCPHost",fcphost);\r
+       option.Get("FProxyPort",fproxyport);\r
 \r
        if(queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="shutdown" && ValidateFormPassword(queryvars))\r
        {\r
 \r
        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
        {\r
                st.ResultText(0,messagecountstr);\r
        }\r
-       content+="Messages waiting to be inserted:"+messagecountstr+"<br>";\r
+       content+="Messages waiting to be inserted:"+messagecountstr;\r
+       if (messagecountstr!="0") //show link to message page\r
+       {\r
+               content+=" (<a href=\"showpendingmessage.htm\">show messages</a>)";\r
+       }\r
+       content+="<br>";\r
        st=m_db->Prepare("SELECT COUNT(*) FROM tblFileInserts WHERE Key IS NULL;");\r
        st.Step();\r
        if(st.RowReturned())\r
        st=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
                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
        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
 {\r
        std::string content="<h2>Inserted Files</h2>";\r
 \r
+       Option option(m_db);\r
        std::string node="localhost";\r
        std::string node="localhost";\r
-       Option::Instance()->Get("FCPHost",node);\r
+       option.Get("FCPHost",node);\r
        std::string fproxyport="8888";\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
 \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
        #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
 {\r
-       std::string rval="";\r
+       std::string rval("");\r
 \r
        rval+="<select name=\""+name+"\">";\r
 \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
        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
 const std::string OptionsPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
 {\r
-       std::string content="<h2 style=\"text-align:center;\">Options</h2>\r\n";\r
-       content+="<form name=\"frmoptions\" method=\"POST\"><input type=\"hidden\" name=\"formaction\" value=\"save\">";\r
-       content+=CreateFormPassword();\r
-       content+="<table><tr><th>Option</th><th>Value</th><th>Description</th></tr>";\r
+       std::string content("");\r
+       std::string sql("");\r
 \r
        if(queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="save" && ValidateFormPassword(queryvars))\r
        {\r
 \r
        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
 \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
        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
        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::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
 \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(4,validvalues);\r
                        StringFunctions::Split(validvalues,"|",validvaluevec);\r
                }\r
+               st.ResultText(5,displaytype);\r
+               st.ResultText(6,displayparam1);\r
+               st.ResultText(7,displayparam2);\r
 \r
                if(section!=lastsection)\r
                {\r
 \r
                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
 \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
                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
                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
                else\r
                {\r
                        content+=CreateTrueFalseDropDown("value["+countstr+"]",value);\r
                }\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
                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
        std::string publishtrustlist="";\r
        std::string messagebase="";\r
 \r
+       Option option(m_db);\r
        std::string fproxyport="8888";\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
 \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
                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
        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 "../../../include/http/pages/showimagepage.h"\r
 \r
+#include <cstdio>\r
+\r
 #ifdef XMEM\r
        #include <xmem.h>\r
 #endif\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
        #include <xmem.h>\r
 #endif\r
 \r
-LocalIdentity::LocalIdentity()\r
+LocalIdentity::LocalIdentity(SQLite3DB::DB *db):IDatabase(db)\r
 {\r
        Initialize();\r
 }\r
 {\r
        Initialize();\r
 }\r
index 0445e29..4c897e3 100644 (file)
        #include <xmem.h>\r
 #endif\r
 \r
        #include <xmem.h>\r
 #endif\r
 \r
-Message::Message()\r
+Message::Message(SQLite3DB::DB *db):IDatabase(db)\r
 {\r
        Initialize();\r
 }\r
 \r
 {\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
 {\r
        Load(messageid);\r
 }\r
@@ -400,9 +400,11 @@ void Message::Initialize()
        m_inreplyto.clear();\r
        m_fileattachments.clear();\r
        m_changemessagetrustonreply=0;\r
        m_inreplyto.clear();\r
        m_fileattachments.clear();\r
        m_changemessagetrustonreply=0;\r
-       Option::Instance()->Get("ChangeMessageTrustOnReply",tempval);\r
+       Option option(m_db);\r
+\r
+       option.Get("ChangeMessageTrustOnReply",tempval);\r
        StringFunctions::Convert(tempval,m_changemessagetrustonreply);\r
        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
        if(tempval=="true")\r
        {\r
                m_addnewpostfromidentities=true;\r
@@ -412,10 +414,10 @@ void Message::Initialize()
                m_addnewpostfromidentities=false;\r
        }\r
        tempval="50";\r
                m_addnewpostfromidentities=false;\r
        }\r
        tempval="50";\r
-       Option::Instance()->Get("MinLocalMessageTrust",tempval);\r
+       option.Get("MinLocalMessageTrust",tempval);\r
        StringFunctions::Convert(tempval,m_minlocalmessagetrust);\r
        tempval="51";\r
        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
        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
        {\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
                st.Step();\r
        }\r
 \r
index eb0a765..e0a7ad4 100644 (file)
@@ -5,12 +5,12 @@
        #include <xmem.h>\r
 #endif\r
 \r
        #include <xmem.h>\r
 #endif\r
 \r
-TrustExtension::TrustExtension()\r
+TrustExtension::TrustExtension(SQLite3DB::DB *db):IDatabase(db)\r
 {\r
        m_localidentityid=-1;\r
 }\r
 \r
 {\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
 {\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 <stdlib.h>\r
 #include <time.h>\r
 #include <cstring>\r
+#include <cstdio>\r
 \r
 #ifndef _WIN32\r
        #define stricmp strcasecmp\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
        #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
 {\r
-       std::string tempval("");\r
 \r
        m_tempbuffer.resize(32768);\r
        \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
        m_status.m_mode=MODE_NONE;\r
        m_status.m_authenticated=false;\r
 \r
-       Option::Instance()->Get("NNTPAllowPost",tempval);\r
-       if(tempval=="true")\r
-       {\r
-               m_status.m_allowpost=true;\r
-       }\r
-\r
 }\r
 \r
 NNTPConnection::~NNTPConnection()\r
 }\r
 \r
 NNTPConnection::~NNTPConnection()\r
@@ -96,7 +89,7 @@ const bool NNTPConnection::HandleAuthInfoCommand(const NNTPCommand &command)
                }\r
                if(arg=="USER")\r
                {\r
                }\r
                if(arg=="USER")\r
                {\r
-                       LocalIdentity localid;\r
+                       LocalIdentity localid(m_db);\r
                        if(localid.Load(name))\r
                        {\r
                                m_status.m_authuser=localid;\r
                        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
                                        nntpname+=command.m_arguments[i];\r
                                }\r
 \r
-                               TrustExtension tr(m_status.m_authuser.GetID());\r
+                               TrustExtension tr(m_db,m_status.m_authuser.GetID());\r
 \r
                                if(type=="MESSAGE")\r
                                {\r
 \r
                                if(type=="MESSAGE")\r
                                {\r
@@ -341,7 +334,7 @@ const bool NNTPConnection::HandleGetTrustListCommand(const NNTPCommand &command)
 {\r
        if(m_status.m_authenticated)\r
        {\r
 {\r
        if(m_status.m_authenticated)\r
        {\r
-               TrustExtension tr(m_status.m_authuser.GetID());\r
+               TrustExtension tr(m_db,m_status.m_authuser.GetID());\r
                std::map<std::string,TrustExtension::trust> trustlist;\r
                if(tr.GetTrustList(trustlist))\r
                {\r
                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
 {\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
                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
        {\r
                if(m_status.m_messageid!=-1)\r
                {\r
-                       Message mess;\r
+                       Message mess(m_db);\r
 \r
                        if(mess.LoadPrevious(m_status.m_messageid,m_status.m_boardid))\r
                        {\r
 \r
                        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
        {\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
                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
        {\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
                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
 {\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
        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
                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
                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
                        }\r
                }\r
 \r
-               BoardList bl;\r
+               BoardList bl(m_db);\r
 \r
                bl.LoadNew(Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S"));\r
 \r
 \r
                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
        {\r
                if(m_status.m_messageid!=-1)\r
                {\r
-                       Message mess;\r
+                       Message mess(m_db);\r
 \r
                        if(mess.LoadNext(m_status.m_messageid,m_status.m_boardid))\r
                        {\r
 \r
                        if(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
 \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
                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
        }\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
                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
                                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
                        // 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
                                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
                        // 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
                                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
 \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
 \r
        if(mess.ParseNNTPMessage(message))\r
        {\r
@@ -1193,7 +1186,7 @@ const bool NNTPConnection::HandleSetTrustCommand(const NNTPCommand &command)
                                        valid=true;\r
                                }\r
 \r
                                        valid=true;\r
                                }\r
 \r
-                               TrustExtension tr(m_status.m_authuser.GetID());\r
+                               TrustExtension tr(m_db,m_status.m_authuser.GetID());\r
 \r
                                if(type=="MESSAGE")\r
                                {\r
 \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
        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
 \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
                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
        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
 \r
        m_log->debug("NNTPListener::run thread started.");\r
 \r
+       LoadDatabase();\r
+\r
        StartListen();\r
 \r
        do\r
        StartListen();\r
 \r
        do\r
@@ -104,19 +106,22 @@ void NNTPListener::run()
 void NNTPListener::StartListen()\r
 {\r
        \r
 void NNTPListener::StartListen()\r
 {\r
        \r
-       std::string bindaddresses;\r
        std::vector<std::string> listenaddresses;\r
        std::vector<std::string> listenaddresses;\r
+       std::string bindaddresses;      \r
        std::string nntpport;\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
        {\r
                nntpport="1119";\r
-               Option::Instance()->Set("NNTPListenPort",nntpport);\r
+               option.Set("NNTPListenPort",nntpport);\r
        }\r
        }\r
-       if(Option::Instance()->Get("NNTPBindAddresses",bindaddresses)==false)\r
+       if(option.Get("NNTPBindAddresses",bindaddresses)==false)\r
        {\r
                bindaddresses="127.0.0.1";\r
        {\r
                bindaddresses="127.0.0.1";\r
-               Option::Instance()->Set("NNTPBindAddresses",bindaddresses);\r
+               option.Set("NNTPBindAddresses",bindaddresses);\r
        }\r
        }\r
+\r
        StringFunctions::Split(bindaddresses,",",listenaddresses);\r
        \r
        for(std::vector<std::string>::iterator i=listenaddresses.begin(); i!=listenaddresses.end(); i++)\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
 #include "../../include/nntp/uwildmat.h"\r
 #include <string>\r
 #include <cstring>\r
+#ifndef _WIN32\r
+#include <stdint.h>\r
+#endif\r
 \r
 #define ABORT -1\r
 \r
 \r
 #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
 \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
        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
 #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
 {\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
        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 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
        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(1,order++);\r
        upd.Bind(2,"1|1 - Fatal Errors|2|2 - Critical Errors|3|3 - Errors|4|4 - Warnings|5|5 - Notices|6|6 - Informational Messages|7|7 - Debug Messages|8|8 - Trace Messages");\r
        upd.Bind(3,"The maximum logging level that will be written to file.  Higher levels will include all messages from the previous levels.");\r
-       upd.Bind(4,"LogLevel");\r
+       upd.Bind(4,"select");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"LogLevel");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2,"true|true|false|false");\r
        upd.Bind(3,"VACUUM the database every time FMS starts.  This will defragment the free space in the database and create a smaller database file.  Vacuuming the database can be CPU and disk intensive.");\r
-       upd.Bind(4,"VacuumOnStartup");\r
+       upd.Bind(4,"select");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"VacuumOnStartup");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"A unique string shared by all clients who want to communicate with each other.  This should not be changed unless you want to create your own separate communications network.");\r
-       upd.Bind(4,"MessageBase");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"advanced");\r
+       upd.Bind(8,"MessageBase");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"The USK key which contains information about the latest version of FMS.");\r
-       upd.Bind(4,"FMSVersionKey");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5,"80");\r
+       upd.Bind(6);\r
+       upd.Bind(7,"advanced");\r
+       upd.Bind(8,"FMSVersionKey");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"The latest found edition of the FMS version USK.");\r
-       upd.Bind(4,"FMSVersionEdition");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"advanced");\r
+       upd.Bind(8,"FMSVersionEdition");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2,"true|true|false|false");\r
        upd.Bind(3,"Start NNTP server.");\r
-       upd.Bind(4,"StartNNTP");\r
+       upd.Bind(4,"select");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"StartNNTP");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"The port that the NNTP service will listen for incoming connections.");\r
-       upd.Bind(4,"NNTPListenPort");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"NNTPListenPort");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"A comma separated list of valid IPv4 or IPv6 addresses/hostnames that the NNTP service will try to bind to.");\r
-       upd.Bind(4,"NNTPBindAddresses");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"NNTPBindAddresses");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2,"true|true|false|false");\r
        upd.Bind(3,"Allow posting messages from NNTP.  Setting to false will make the newsgroups read only.");\r
-       upd.Bind(4,"NNTPAllowPost");\r
+       upd.Bind(4,"select");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"NNTPAllowPost");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2,"true|true|false|false");\r
        upd.Bind(3,"Start HTTP server.  WARNING: If you turn this off, you won't be able to access the administration pages.");\r
-       upd.Bind(4,"StartHTTP");\r
+       upd.Bind(4,"select");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"StartHTTP");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"Port HTTP server will listen on.");\r
-       upd.Bind(4,"HTTPListenPort");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"HTTPListenPort");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"Comma separated list of addresses and/or subnet masks that are allowed access to the administration pages.  Default is localhost only. + allows a host, - denies a host.");\r
-       upd.Bind(4,"HTTPAccessControl");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"HTTPAccessControl");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2,"true|true|false|false");\r
        upd.Bind(3,"Set to true to start the Freenet Updater thread and connect to Freenet.  Set to false to prevent communication with Freenet.");\r
-       upd.Bind(4,"StartFreenetUpdater");\r
+       upd.Bind(4,"select");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"StartFreenetUpdater");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"Host name or address of Freenet node.");\r
-       upd.Bind(4,"FCPHost");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"FCPHost");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"The port that Freenet is listening for FCP connections on.");\r
-       upd.Bind(4,"FCPPort");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"FCPPort");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"The port that Freenet is listening for http connections on.");\r
-       upd.Bind(4,"FProxyPort");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"FProxyPort");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"Maximum number of concurrent requests for new Identity xml files");\r
-       upd.Bind(4,"MaxIdentityRequests");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"advanced");\r
+       upd.Bind(8,"MaxIdentityRequests");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"Maximum number of concurrent identities requesting IdentityIntroduction xml files.  Each identity may have multiple requests pending.");\r
-       upd.Bind(4,"MaxIdentityIntroductionRequests");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"advanced");\r
+       upd.Bind(8,"MaxIdentityIntroductionRequests");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"Maximum number of concurrent requests for new IntroductionPuzzle xml files");\r
-       upd.Bind(4,"MaxIntroductionPuzzleRequests");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"advanced");\r
+       upd.Bind(8,"MaxIntroductionPuzzleRequests");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"Maximum number of concurrent requests for new Trust Lists");\r
-       upd.Bind(4,"MaxTrustListRequests");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"advanced");\r
+       upd.Bind(8,"MaxTrustListRequests");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"Maximum number of concurrent requests for new Message Lists");\r
-       upd.Bind(4,"MaxMessageListRequests");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"advanced");\r
+       upd.Bind(8,"MaxMessageListRequests");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"Maximum number of concurrent requests for new Messages");\r
-       upd.Bind(4,"MaxMessageRequests");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"advanced");\r
+       upd.Bind(8,"MaxMessageRequests");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"The maximum number of concurrent requests for new Board Lists.  Set to 0 to disable.");\r
-       upd.Bind(4,"MaxBoardListRequests");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"advanced");\r
+       upd.Bind(8,"MaxBoardListRequests");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"Specifies a local message trust level that a peer must have before its messages will be downloaded.");\r
-       upd.Bind(4,"MinLocalMessageTrust");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"MinLocalMessageTrust");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"Specifies a peer message trust level that a peer must have before its messages will be downloaded.");\r
-       upd.Bind(4,"MinPeerMessageTrust");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"MinPeerMessageTrust");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"Specifies a local trust list trust level that a peer must have before its trust list will be included in the weighted average.  Any peers below this number will be excluded from the results.");\r
-       upd.Bind(4,"MinLocalTrustListTrust");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"MinLocalTrustListTrust");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"Specifies a peer trust list trust level that a peer must have before its trust list will be included in the weighted average.  Any peers below this number will be excluded from the results.");\r
-       upd.Bind(4,"MinPeerTrustListTrust");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"MinPeerTrustListTrust");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2,"true|true|false|false");\r
        upd.Bind(3,"Set to true if you want your local trust levels to override the peer levels when determining which identities you will poll.");\r
-       upd.Bind(4,"LocalTrustOverridesPeerTrust");\r
+       upd.Bind(4,"select");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"LocalTrustOverridesPeerTrust");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"The maximum number of days backward that messages will be downloaded from each identity");\r
-       upd.Bind(4,"MessageDownloadMaxDaysBackward");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"MessageDownloadMaxDaysBackward");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"The number of days backward that messages you have inserted will appear in your MessageLists");\r
-       upd.Bind(4,"MessageListDaysBackward");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"MessageListDaysBackward");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"The maximum number of messages you will download from each peer on a given day.");\r
-       upd.Bind(4,"MaxPeerMessagesPerDay");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"MaxPeerMessagesPerDay");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"The maximum number of boards a received message may be sent to.  Boards over this limit will be ignored.");\r
-       upd.Bind(4,"MaxBoardsPerMessage");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"MaxBoardsPerMessage");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2,"true|true|false|false");\r
        upd.Bind(3,"Set to true to automatically save messages posted to new boards.  Set to false to ignore messages to new boards.");\r
-       upd.Bind(4,"SaveMessagesFromNewBoards");\r
+       upd.Bind(4,"select");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"SaveMessagesFromNewBoards");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2);\r
        upd.Bind(3,"How much the local message trust level of an identity should change when you reply to one of their messages.");\r
-       upd.Bind(4,"ChangeMessageTrustOnReply");\r
+       upd.Bind(4,"textbox");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"ChangeMessageTrustOnReply");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(1,order++);\r
        upd.Bind(2,"true|true|false|false");\r
        upd.Bind(3,"Set to true to automatically create new identities when you send a message using a new name.  If you set this to false, posting messages will fail until you manually create the identity.");\r
-       upd.Bind(4,"AddNewPostFromIdentities");\r
+       upd.Bind(4,"select");\r
+       upd.Bind(5);\r
+       upd.Bind(6);\r
+       upd.Bind(7,"simple");\r
+       upd.Bind(8,"AddNewPostFromIdentities");\r
        upd.Step();\r
        upd.Reset();\r
 \r
        upd.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(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
        upd.Step();\r
        upd.Reset();\r
 \r
+       db->Execute("COMMIT;");\r
+\r
 }\r
 }\r
index cf21aab..79102b9 100644 (file)
@@ -3,32 +3,19 @@
 \r
 #include "../include/dbsetup.h"\r
 #include "../include/stringfunctions.h"\r
 \r
 #include "../include/dbsetup.h"\r
 #include "../include/stringfunctions.h"\r
-#include "../include/option.h"\r
 \r
 const bool ThreadBuilder::Build(const long messageid, const long boardid, const bool bydate)\r
 {\r
        int count=0;\r
        int threadid=-1;\r
 \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::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
        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
        // 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
                }\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
        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
                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
                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
                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
                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
 \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
                        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 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
                                {\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
                                }\r
+                               // whitespace or newline not found within line length - force newline at line length\r
                                else\r
                                {\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
                                }\r
                        }\r
                        else\r
index 248c006..6de958a 100644 (file)
@@ -104,16 +104,16 @@ ul                {
                                        padding-left:10px;\r
                                        padding-right:10px;\r
                                }\r
                                        padding-left:10px;\r
                                        padding-right:10px;\r
                                }\r
-                               \r
+\r
 .calcrow td            {\r
                                        background-color:#EEEEEE;\r
                                        text-align:right;\r
                                }\r
 .calcrow td            {\r
                                        background-color:#EEEEEE;\r
                                        text-align:right;\r
                                }\r
-                               \r
+\r
 .totalrow td   {\r
                                        text-align:right;\r
                                }\r
 .totalrow td   {\r
                                        text-align:right;\r
                                }\r
-               \r
+\r
 /* layout */\r
                                \r
 body {\r
 /* layout */\r
                                \r
 body {\r
@@ -181,6 +181,15 @@ h1, h2, h3, h4, h5, h6 {
 .paragraph             {\r
                                        margin-bottom:.5em;\r
                                }\r
 .paragraph             {\r
                                        margin-bottom:.5em;\r
                                }\r
+\r
+.optiondescription     {\r
+                                               padding-bottom:10px;\r
+                                       }\r
+\r
+.optionname                    {\r
+                                               font-weight:bolder;\r
+                                       }\r
+\r
 </style>\r
 <style type="text/css">\r
                \r
 </style>\r
 <style type="text/css">\r
                \r