version 0.2.3
[fms.git] / src / global.cpp
index 5515e1a..251ea2a 100644 (file)
@@ -28,9 +28,6 @@ void SetupDB()
        db->Open("fms.db3");\r
        db->SetBusyTimeout(10000);              // set timeout to 10 seconds\r
        db->Execute("VACUUM;");\r
-       \r
-       // TODO remove this - temp fix for problem in 0.1.8\r
-       db->Execute("DELETE FROM tblMessageBoard WHERE MessageID NOT IN (SELECT MessageID FROM tblMessage);");\r
 \r
        db->Execute("CREATE TABLE IF NOT EXISTS tblDBVersion(\\r
                                Major                           INTEGER,\\r
@@ -58,13 +55,25 @@ void SetupDB()
                        major=1;\r
                        minor=3;\r
                }\r
+               if(major==1 && minor==3)\r
+               {\r
+                       ConvertDB0103To0104();\r
+                       major=1;\r
+                       minor=4;\r
+               }\r
+               if(major==1 && minor==4)\r
+               {\r
+                       ConvertDB0104To0105();\r
+                       major=1;\r
+                       minor=5;\r
+               }\r
        }\r
        else\r
        {\r
-               db->Execute("INSERT INTO tblDBVersion(Major,Minor) VALUES(1,1);");\r
+               db->Execute("INSERT INTO tblDBVersion(Major,Minor) VALUES(1,5);");\r
        }\r
 \r
-       db->Execute("UPDATE tblDBVersion SET Major=1, Minor=3;");\r
+       db->Execute("UPDATE tblDBVersion SET Major=1, Minor=4;");\r
 \r
        db->Execute("CREATE TABLE IF NOT EXISTS tblOption(\\r
                                Option                          TEXT UNIQUE,\\r
@@ -89,7 +98,8 @@ void SetupDB()
                                InsertingBoardList              BOOL CHECK(InsertingBoardList IN('true','false')) DEFAULT 'false',\\r
                                LastInsertedBoardList   DATETIME,\\r
                                InsertingMessageList    BOOL CHECK(InsertingMessageList IN('true','false')) DEFAULT 'false',\\r
-                               LastInsertedMessageList DATETIME\\r
+                               LastInsertedMessageList DATETIME,\\r
+                               DateCreated                             DATETIME\\r
                                );");\r
 \r
        db->Execute("CREATE TABLE IF NOT EXISTS tblLocalIdentityInserts(\\r
@@ -124,18 +134,21 @@ void SetupDB()
                                );");\r
 \r
        db->Execute("CREATE TABLE IF NOT EXISTS tblIdentity(\\r
-                               IdentityID                      INTEGER PRIMARY KEY,\\r
-                               PublicKey                       TEXT UNIQUE,\\r
-                               Name                            TEXT,\\r
-                               SingleUse                       BOOL CHECK(SingleUse IN('true','false')) DEFAULT 'false',\\r
-                               PublishTrustList        BOOL CHECK(PublishTrustList IN('true','false')) DEFAULT 'false',\\r
-                               PublishBoardList        BOOL CHECK(PublishBoardList IN('true','false')) DEFAULT 'false',\\r
-                               DateAdded                       DATETIME,\\r
-                               LastSeen                        DATETIME,\\r
-                               LocalMessageTrust       INTEGER CHECK(LocalMessageTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
-                               PeerMessageTrust        INTEGER CHECK(PeerMessageTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
-                               LocalTrustListTrust     INTEGER CHECK(LocalTrustListTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
-                               PeerTrustListTrust      INTEGER CHECK(PeerTrustListTrust BETWEEN 0 AND 100) DEFAULT NULL\\r
+                               IdentityID                              INTEGER PRIMARY KEY,\\r
+                               PublicKey                               TEXT UNIQUE,\\r
+                               Name                                    TEXT,\\r
+                               SingleUse                               BOOL CHECK(SingleUse IN('true','false')) DEFAULT 'false',\\r
+                               PublishTrustList                BOOL CHECK(PublishTrustList IN('true','false')) DEFAULT 'false',\\r
+                               PublishBoardList                BOOL CHECK(PublishBoardList IN('true','false')) DEFAULT 'false',\\r
+                               DateAdded                               DATETIME,\\r
+                               LastSeen                                DATETIME,\\r
+                               LocalMessageTrust               INTEGER CHECK(LocalMessageTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
+                               PeerMessageTrust                INTEGER CHECK(PeerMessageTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
+                               LocalTrustListTrust             INTEGER CHECK(LocalTrustListTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
+                               PeerTrustListTrust              INTEGER CHECK(PeerTrustListTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
+                               AddedMethod                             TEXT,\\r
+                               MessageTrustComment             TEXT,\\r
+                               TrustListTrustComment   TEXT\\r
                                );");\r
 \r
        db->Execute("CREATE TABLE IF NOT EXISTS tblIdentityRequests(\\r
@@ -165,10 +178,12 @@ void SetupDB()
                                );");\r
 \r
        db->Execute("CREATE TABLE IF NOT EXISTS tblPeerTrust(\\r
-                               IdentityID                      INTEGER,\\r
-                               TargetIdentityID        INTEGER,\\r
-                               MessageTrust            INTEGER CHECK(MessageTrust BETWEEN 0 AND 100),\\r
-                               TrustListTrust          INTEGER CHECK(TrustListTrust BETWEEN 0 AND 100)\\r
+                               IdentityID                              INTEGER,\\r
+                               TargetIdentityID                INTEGER,\\r
+                               MessageTrust                    INTEGER CHECK(MessageTrust BETWEEN 0 AND 100),\\r
+                               TrustListTrust                  INTEGER CHECK(TrustListTrust BETWEEN 0 AND 100),\\r
+                               MessageTrustComment             TEXT,\\r
+                               TrustListTrustComment   TEXT\\r
                                );");\r
 \r
        db->Execute("CREATE TABLE IF NOT EXISTS tblBoard(\\r
@@ -193,7 +208,8 @@ void SetupDB()
                                Subject                         TEXT,\\r
                                MessageUUID                     TEXT UNIQUE,\\r
                                ReplyBoardID            INTEGER,\\r
-                               Body                            TEXT\\r
+                               Body                            TEXT,\\r
+                               MessageIndex            INTEGER\\r
                                );");\r
 \r
        db->Execute("CREATE TABLE IF NOT EXISTS tblMessageReplyTo(\\r
@@ -222,6 +238,8 @@ void SetupDB()
                                Found                           BOOL CHECK(Found IN('true','false')) DEFAULT 'false'\\r
                                );");\r
 \r
+       db->Execute("CREATE UNIQUE INDEX IF NOT EXISTS idxMessageRequest ON tblMessageRequests(IdentityID,Day,RequestIndex);");\r
+\r
        db->Execute("CREATE TABLE IF NOT EXISTS tblMessageInserts(\\r
                                LocalIdentityID         INTEGER,\\r
                                Day                                     DATE,\\r
@@ -376,6 +394,9 @@ void SetupDB()
        // insert garfield's public key\r
        db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded) VALUES('SSK@T8l1IEGU4-PoASFzgc2GYhIgRzUvZsKdoQWeuLHuTmM,QLxAPfkGis8l5NafNpSCdbxzXhBlu9WL8svcqJw9Mpo,AQACAAE/','"+date.Format("%Y-%m-%d %H:%M:%S")+"');");\r
 \r
+       // TODO remove sometime after 0.1.17\r
+       FixCapitalBoardNames();\r
+\r
 }\r
 \r
 void ConvertDB0100To0101()\r
@@ -437,6 +458,32 @@ void ConvertDB0101To0103()
        db->Execute("UPDATE tblDBVersion SET Major=1, Minor=3;");\r
 }\r
 \r
+void ConvertDB0103To0104()\r
+{\r
+       // add MessageIndex to tblMessage\r
+       DateTime 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
+       date.SetToGMTime();\r
+       db->Execute("UPDATE tblLocalIdentity SET DateCreated='"+date.Format("%Y-%m-%d %H:%M:%S")+"' WHERE DateCreated IS NULL;");\r
+       db->Execute("UPDATE tblDBVersion SET Major=1, Minor=4;");\r
+}\r
+\r
+void ConvertDB0104To0105()\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 tblPeerTrust ADD COLUMN MessageTrustComment TEXT;");\r
+       db->Execute("ALTER TABLE tblPeerTrust ADD COLUMN TrustListTrustComment TEXT;");\r
+       db->Execute("UPDATE tblDBVersion SET Major=1, Minor=5;");\r
+}\r
+\r
 void SetupDefaultOptions()\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
@@ -493,6 +540,12 @@ void SetupDefaultOptions()
        st.Step();\r
        st.Reset();\r
 \r
+       st.Bind(0,"HTTPAccessControl");\r
+       st.Bind(1,"-0.0.0.0/0,+127.0.0.1");\r
+       st.Bind(2,"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 as host.");\r
+       st.Step();\r
+       st.Reset();\r
+\r
        // StartFreenetUpdater\r
        st.Bind(0,"StartFreenetUpdater");\r
        st.Bind(1,"true");\r
@@ -622,6 +675,12 @@ void SetupDefaultOptions()
        st.Step();\r
        st.Reset();\r
 \r
+       st.Bind(0,"DeleteMessagesOlderThan");\r
+       st.Bind(1,"180");\r
+       st.Bind(2,"Automatically delete messages older than this many days.");\r
+       st.Step();\r
+       st.Reset();\r
+\r
 }\r
 \r
 void SetupLogFile()\r
@@ -682,68 +741,66 @@ void SigHandler(int signum)
        exit(0);\r
 }\r
 \r
-/*\r
-void ShutdownThreads(std::vector<PThread::Thread *> &threads)\r
+void FixCapitalBoardNames()\r
 {\r
-       std::vector<PThread::Thread *>::iterator i;\r
-       for(i=threads.begin(); i!=threads.end(); i++)\r
-       {\r
-               (*i)->Cancel();\r
-       }\r
-\r
-       for(i=threads.begin(); i!=threads.end(); i++)\r
-       {\r
-               LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_DEBUG,"ShutdownThreads waiting for thread to exit.");\r
-               //(*i)->wait();\r
-               (*i)->Join();\r
-               delete (*i);\r
-       }\r
-\r
-       threads.clear();\r
-\r
-}\r
-\r
-void StartThreads(std::vector<PThread::Thread *> &threads)\r
-{\r
-       std::string startfreenet;\r
-       std::string startnntp;\r
-       std::string starthttp;\r
-\r
-       if(Option::Instance()->Get("StartFreenetUpdater",startfreenet)==false)\r
-       {\r
-               startfreenet="true";\r
-               Option::Instance()->Set("StartFreenetUpdater","true");\r
-       }\r
-\r
-       if(Option::Instance()->Get("StartNNTP",startnntp)==false)\r
-       {\r
-               startnntp="true";\r
-               Option::Instance()->Set("StartNNTP","true");\r
-       }\r
-\r
-       if(Option::Instance()->Get("StartHTTP",starthttp)==false)\r
-       {\r
-               starthttp="true";\r
-               Option::Instance()->Set("StartHTTP","true");\r
-       }\r
-\r
-       if(startfreenet=="true")\r
-       {\r
-               PThread::Thread *t=new PThread::Thread(new FreenetMasterThread());\r
-               threads.push_back(t);\r
-       }\r
+       SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
 \r
-       if(startnntp=="true")\r
-       {\r
-               PThread::Thread *t=new PThread::Thread(new NNTPListener());\r
-               threads.push_back(t);\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
+       SQLite3DB::Statement del=db->Prepare("DELTE FROM tblBoard WHERE BoardID=?;");\r
+       SQLite3DB::Statement upd=db->Prepare("UPDATE tblBoard SET BoardName=? WHERE BoardID=?;");\r
+       SQLite3DB::Statement upd2=db->Prepare("UPDATE tblMessage SET ReplyBoardID=? WHERE ReplyBoardID=?;");\r
+       SQLite3DB::Statement upd3=db->Prepare("UPDATE tblMessageBoard SET BoardID=? WHERE BoardID=?;");\r
 \r
-       if(starthttp=="true")\r
+       st.Step();\r
+       while(st.RowReturned())\r
        {\r
-               PThread::Thread *t=new PThread::Thread(new HTTPThread());\r
-               threads.push_back(t);\r
+               int boardid=0;\r
+               int newboardid=0;\r
+               std::string name="";\r
+               std::string lowername="";\r
+\r
+               st.ResultInt(0,boardid);\r
+               st.ResultText(1,name);\r
+\r
+               lowername=name;\r
+               StringFunctions::LowerCase(lowername,lowername);\r
+       \r
+               if(name!=lowername)\r
+               {\r
+                       st2.Bind(0,lowername);\r
+                       st2.Step();\r
+\r
+                       if(st2.RowReturned())\r
+                       {\r
+                               st2.ResultInt(0,newboardid);\r
+\r
+                               upd2.Bind(0,newboardid);\r
+                               upd2.Bind(1,boardid);\r
+                               upd2.Step();\r
+                               upd2.Reset();\r
+\r
+                               upd3.Bind(0,newboardid);\r
+                               upd3.Bind(1,boardid);\r
+                               upd3.Step();\r
+                               upd3.Reset();\r
+\r
+                               del.Bind(0,boardid);\r
+                               del.Step();\r
+                               del.Reset();\r
+                       }\r
+                       else\r
+                       {\r
+                               upd.Bind(0,lowername);\r
+                               upd.Bind(1,boardid);\r
+                               upd.Step();\r
+                               upd.Reset();\r
+                       }\r
+\r
+                       st2.Reset();\r
+               }\r
+       \r
+               st.Step();\r
        }\r
 \r
 }\r
-*/\r