version 0.3.29
[fms.git] / src / board.cpp
index aee9339..9d249ad 100644 (file)
@@ -1,33 +1,36 @@
 #include "../include/board.h"\r
 #include "../include/stringfunctions.h"\r
 \r
+#include <Poco/DateTimeParser.h>\r
+\r
 #ifdef XMEM\r
        #include <xmem.h>\r
 #endif\r
 \r
-Board::Board()\r
+Board::Board(SQLite3DB::DB *db):IDatabase(db)\r
 {\r
        m_boardid=-1;\r
        m_boardname="";\r
        m_boarddescription="";\r
-       m_datecreated.Set(1970,1,1);\r
+       m_datecreated.assign(1970,1,1);\r
        m_lowmessageid=0;\r
        m_highmessageid=0;\r
        m_messagecount=0;\r
        m_savereceivedmessages=true;\r
+       m_addedmethod="";\r
 }\r
 \r
-Board::Board(const long boardid)\r
+Board::Board(SQLite3DB::DB *db, const long boardid):IDatabase(db)\r
 {\r
        Load(boardid);  \r
 }\r
 \r
-Board::Board(const std::string &boardname)\r
+Board::Board(SQLite3DB::DB *db, const std::string &boardname):IDatabase(db)\r
 {\r
        Load(boardname);\r
 }\r
 \r
-Board::Board(const long boardid, const std::string &boardname, const std::string &boarddescription, const std::string datecreated, const long lowmessageid, const long highmessageid, const long messagecount, const bool savereceivedmessages)\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
@@ -36,6 +39,7 @@ Board::Board(const long boardid, const std::string &boardname, const std::string
        m_highmessageid=highmessageid;\r
        m_messagecount=messagecount;\r
        m_savereceivedmessages=savereceivedmessages;\r
+       m_addedmethod=addedmethod;\r
 \r
        SetDateFromString(datecreated);\r
 \r
@@ -48,12 +52,15 @@ const bool Board::Load(const long boardid)
        m_boardid=-1;\r
        m_boardname="";\r
        m_boarddescription="";\r
-       m_datecreated.Set(1970,1,1);\r
+       m_datecreated.assign(1970,1,1);\r
        m_lowmessageid=0;\r
        m_highmessageid=0;\r
        m_messagecount=0;\r
+       m_addedmethod="";\r
 \r
-       SQLite3DB::Statement st=m_db->Prepare("SELECT BoardName, BoardDescription, DateAdded, HighMessageID, LowMessageID, MessageCount, SaveReceivedMessages FROM tblBoard LEFT JOIN vwBoardStats ON tblBoard.BoardID=vwBoardStats.BoardID WHERE tblBoard.BoardID=?;");\r
+       // Optimize query by not using vwBoardStats\r
+       //SQLite3DB::Statement st=m_db->Prepare("SELECT BoardName, BoardDescription, DateAdded, HighMessageID, LowMessageID, MessageCount, SaveReceivedMessages, AddedMethod FROM tblBoard LEFT JOIN vwBoardStats ON tblBoard.BoardID=vwBoardStats.BoardID WHERE tblBoard.BoardID=?;");\r
+       SQLite3DB::Statement st=m_db->Prepare("SELECT BoardName, BoardDescription, DateAdded, IFNULL(MAX(MessageID),'0') AS HighMessageID, IFNULL(MIN(MessageID),'0') AS LowMessageID, COUNT(MessageID) AS MessageCount, SaveReceivedMessages, AddedMethod FROM tblBoard LEFT JOIN tblMessageBoard ON tblBoard.BoardID=tblMessageBoard.BoardID WHERE tblBoard.BoardID=? AND (MessageID IS NULL OR MessageID>=0);");\r
        st.Bind(0,boardid);\r
        st.Step();\r
 \r
@@ -88,6 +95,7 @@ const bool Board::Load(const long boardid)
                {\r
                        m_savereceivedmessages=false;\r
                }\r
+               st.ResultText(7,m_addedmethod);\r
 \r
                return true;\r
        }\r
@@ -97,57 +105,74 @@ const bool Board::Load(const long boardid)
        }\r
 }\r
 \r
-const bool Board::Load(const std::string &boardname)\r
+const bool Board::Load(const std::string &boardname)           // same as loading form boardid - but using name\r
 {\r
-       SQLite3DB::Statement st=m_db->Prepare("SELECT BoardID FROM tblBoard WHERE BoardName=?;");\r
+\r
+       // clear current values\r
+       m_boardid=-1;\r
+       m_boardname="";\r
+       m_boarddescription="";\r
+       m_datecreated.assign(1970,1,1);\r
+       m_lowmessageid=0;\r
+       m_highmessageid=0;\r
+       m_messagecount=0;\r
+       int tempint=-1;\r
+       m_addedmethod="";\r
+\r
+       // Optimize query by not using vwBoardStats\r
+       //SQLite3DB::Statement st=m_db->Prepare("SELECT BoardName, BoardDescription, DateAdded, HighMessageID, LowMessageID, MessageCount, SaveReceivedMessages, tblBoard.BoardID, AddedMethod FROM tblBoard LEFT JOIN vwBoardStats ON tblBoard.BoardID=vwBoardStats.BoardID WHERE tblBoard.BoardName=?;");\r
+       SQLite3DB::Statement st=m_db->Prepare("SELECT BoardName, BoardDescription, DateAdded, IFNULL(MAX(MessageID),'0') AS HighMessageID, IFNULL(MIN(MessageID),'0') AS LowMessageID, COUNT(MessageID) AS MessageCount, SaveReceivedMessages, tblBoard.BoardID, AddedMethod FROM tblBoard LEFT JOIN tblMessageBoard ON tblBoard.BoardID=tblMessageBoard.BoardID WHERE tblBoard.BoardName=? AND (MessageID IS NULL OR MessageID>=0);");\r
        st.Bind(0,boardname);\r
        st.Step();\r
+\r
        if(st.RowReturned())\r
        {\r
                int tempint;\r
-               st.ResultInt(0,tempint);\r
-               return Load(tempint);\r
+               std::string tempstr;\r
+               std::vector<std::string> dateparts;\r
+\r
+               st.ResultText(0,m_boardname);\r
+               st.ResultText(1,m_boarddescription);\r
+               st.ResultText(2,tempstr);\r
+               st.ResultInt(7,tempint);        // boardid\r
+               m_boardid=tempint;\r
+\r
+               SetDateFromString(tempstr);\r
+\r
+               tempint=0;\r
+               st.ResultInt(3,tempint);\r
+               m_highmessageid=tempint;\r
+               tempint=0;\r
+               st.ResultInt(4,tempint);\r
+               m_lowmessageid=tempint;\r
+               tempint=0;\r
+               st.ResultInt(5,tempint);\r
+               m_messagecount=tempint;\r
+               st.ResultText(6,tempstr);\r
+               if(tempstr=="true")\r
+               {\r
+                       m_savereceivedmessages=true;\r
+               }\r
+               else\r
+               {\r
+                       m_savereceivedmessages=false;\r
+               }\r
+               st.ResultText(8,m_addedmethod);\r
+\r
+               return true;\r
        }\r
        else\r
        {\r
                return false;\r
        }\r
+\r
 }\r
 \r
 void Board::SetDateFromString(const std::string &datestring)\r
 {\r
-       // break out date created  - date should be in format yyyy-mm-dd HH:MM:SS, so we split on "-", " " (space), and ":"\r
-       int tempint=0;\r
-       std::vector<std::string> dateparts;\r
-       StringFunctions::SplitMultiple(datestring,"- :",dateparts);\r
-       if(dateparts.size()>0)\r
-       {\r
-               StringFunctions::Convert(dateparts[0],tempint);\r
-               m_datecreated.SetYear(tempint);\r
-       }\r
-       if(dateparts.size()>1)\r
-       {\r
-               StringFunctions::Convert(dateparts[1],tempint);\r
-               m_datecreated.SetMonth(tempint);\r
-       }\r
-       if(dateparts.size()>2)\r
-       {\r
-               StringFunctions::Convert(dateparts[2],tempint);\r
-               m_datecreated.SetDay(tempint);\r
-       }\r
-       if(dateparts.size()>3)\r
-       {\r
-               StringFunctions::Convert(dateparts[3],tempint);\r
-               m_datecreated.SetHour(tempint);\r
-       }\r
-       if(dateparts.size()>4)\r
-       {\r
-               StringFunctions::Convert(dateparts[4],tempint);\r
-               m_datecreated.SetMinute(tempint);\r
-       }\r
-       if(dateparts.size()>5)\r
+       int tzdiff=0;\r
+       if(Poco::DateTimeParser::tryParse(datestring,m_datecreated,tzdiff)==false)\r
        {\r
-               StringFunctions::Convert(dateparts[5],tempint);\r
-               m_datecreated.SetSecond(tempint);\r
+               m_log->error("Board::SetDateFromString could not parse date "+datestring);\r
        }\r
 }\r