version 0.1.0
[fms.git] / src / freenet / messagelistinserter.cpp
diff --git a/src/freenet/messagelistinserter.cpp b/src/freenet/messagelistinserter.cpp
new file mode 100644 (file)
index 0000000..57d40f9
--- /dev/null
@@ -0,0 +1,182 @@
+#include "../../include/freenet/messagelistinserter.h"\r
+#include "../../include/freenet/messagexml.h"\r
+#include "../../include/freenet/messagelistxml.h"\r
+\r
+#ifdef XMEM\r
+       #include <xmem.h>\r
+#endif\r
+\r
+MessageListInserter::MessageListInserter()\r
+{\r
+       Initialize();\r
+}\r
+\r
+MessageListInserter::MessageListInserter(FCPv2 *fcp):IIndexInserter(fcp)\r
+{\r
+       Initialize();\r
+}\r
+\r
+void MessageListInserter::CheckForNeededInsert()\r
+{\r
+       // only do 1 insert at a time\r
+       if(m_inserting.size()==0)\r
+       {\r
+               DateTime now;\r
+               DateTime previous;\r
+\r
+               now.SetToGMTime();\r
+               previous.SetToGMTime();\r
+\r
+               previous.Add(0,0,0,-m_daysbackward);\r
+\r
+               // query for identities that have messages in the past X days and we haven't inserted lists for in the past hour\r
+               SQLite3DB::Statement st=m_db->Prepare("SELECT tblLocalIdentity.LocalIdentityID FROM tblLocalIdentity INNER JOIN tblMessageInserts ON tblLocalIdentity.LocalIdentityID=tblMessageInserts.LocalIdentityID WHERE tblMessageInserts.Day>=? AND (tblLocalIdentity.LastInsertedMessageList<=? OR tblLocalIdentity.LastInsertedMessageList IS NULL OR tblLocalIdentity.LastInsertedMessageList='');");\r
+               st.Bind(0,previous.Format("%Y-%m-%d"));\r
+               st.Bind(1,(now-(1.0/24.0)).Format("%Y-%m-%d %H:%M:%S"));\r
+               st.Step();\r
+\r
+               if(st.RowReturned())\r
+               {\r
+                       int localidentityid;\r
+                       st.ResultInt(0,localidentityid);\r
+                       StartInsert(localidentityid);\r
+               }\r
+       }\r
+\r
+}\r
+\r
+const bool MessageListInserter::HandlePutFailed(FCPMessage &message)\r
+{\r
+       std::vector<std::string> idparts;\r
+       long localidentityid;\r
+       long index;\r
+\r
+       StringFunctions::Split(message["Identifier"],"|",idparts);\r
+       StringFunctions::Convert(idparts[1],localidentityid);\r
+       StringFunctions::Convert(idparts[2],index);\r
+\r
+       if(message["Fatal"]=="true" || message["Code"]=="9")\r
+       {\r
+               SQLite3DB::Statement st=m_db->Prepare("INSERT INTO tblMessageListInserts(LocalIdentityID,Day,InsertIndex,Inserted) VALUES(?,?,?,'false');");\r
+               st.Bind(0,localidentityid);\r
+               st.Bind(1,idparts[4]);\r
+               st.Bind(2,index);\r
+               st.Step();\r
+       }\r
+\r
+       RemoveFromInsertList(localidentityid);\r
+\r
+       return true;\r
+\r
+}\r
+\r
+const bool MessageListInserter::HandlePutSuccessful(FCPMessage &message)\r
+{\r
+       DateTime now;\r
+       std::vector<std::string> idparts;\r
+       long localidentityid;\r
+       long index;\r
+\r
+       StringFunctions::Split(message["Identifier"],"|",idparts);\r
+       StringFunctions::Convert(idparts[1],localidentityid);\r
+       StringFunctions::Convert(idparts[2],index);\r
+\r
+       SQLite3DB::Statement st=m_db->Prepare("INSERT INTO tblMessageListInserts(LocalIdentityID,Day,InsertIndex,Inserted) VALUES(?,?,?,'true');");\r
+       st.Bind(0,localidentityid);\r
+       st.Bind(1,idparts[4]);\r
+       st.Bind(2,index);\r
+       st.Step();\r
+\r
+       now.SetToGMTime();\r
+       st=m_db->Prepare("UPDATE tblLocalIdentity SET LastInsertedMessageList=? WHERE LocalIdentityID=?;");\r
+       st.Bind(0,now.Format("%Y-%m-%d %H:%M:%S"));\r
+       st.Bind(1,localidentityid);\r
+       st.Step();\r
+\r
+       RemoveFromInsertList(localidentityid);\r
+\r
+       return true;\r
+}\r
+\r
+void MessageListInserter::Initialize()\r
+{\r
+       std::string tempval;\r
+\r
+       m_fcpuniquename="MessageListInserter";\r
+       m_daysbackward=0;\r
+       Option::instance()->Get("MessageListDaysBackward",tempval);\r
+       StringFunctions::Convert(tempval,m_daysbackward);\r
+}\r
+\r
+void MessageListInserter::StartInsert(const long &localidentityid)\r
+{\r
+       FCPMessage message;\r
+       DateTime date;\r
+       DateTime now;\r
+       std::string privatekey;\r
+       std::string localidentityidstr;\r
+       MessageListXML mlxml;\r
+       MessageXML messxml;\r
+       std::string xmlstr;\r
+       std::string xmlsizestr;\r
+       int index;\r
+       std::string indexstr;\r
+\r
+       now.SetToGMTime();\r
+       date.SetToGMTime();\r
+       date.Add(0,0,0,-m_daysbackward);\r
+       StringFunctions::Convert(localidentityid,localidentityidstr);\r
+\r
+       SQLite3DB::Statement st=m_db->Prepare("SELECT Day, InsertIndex, MessageXML, PrivateKey FROM tblMessageInserts INNER JOIN tblLocalIdentity ON tblMessageInserts.LocalIdentityID=tblLocalIdentity.LocalIdentityID WHERE tblLocalIdentity.LocalIdentityID=? AND Day>=?;");\r
+       st.Bind(0,localidentityid);\r
+       st.Bind(1,date.Format("%Y-%m-%d"));\r
+       st.Step();\r
+\r
+       while(st.RowReturned())\r
+       {\r
+               std::string day;\r
+               int index;\r
+               std::string xmlstr;\r
+               std::vector<std::string> boards;\r
+\r
+               st.ResultText(0,day);\r
+               st.ResultInt(1,index);\r
+               st.ResultText(2,xmlstr);\r
+               st.ResultText(3,privatekey);\r
+\r
+               messxml.ParseXML(xmlstr);\r
+\r
+               mlxml.AddMessage(day,index,messxml.GetBoards());\r
+\r
+               st.Step();\r
+       }\r
+       st.Finalize();\r
+\r
+       // get last inserted messagelist index for this day\r
+       index=0;\r
+       st=m_db->Prepare("SELECT MAX(InsertIndex) FROM tblMessageListInserts WHERE LocalIdentityID=? AND Day=?;");\r
+       st.Bind(0,localidentityid);\r
+       st.Bind(1,now.Format("%Y-%m-%d"));\r
+       st.Step();\r
+       if(st.ResultNull(0)==false)\r
+       {\r
+               st.ResultInt(0,index);\r
+               index++;\r
+       }\r
+       StringFunctions::Convert(index,indexstr);\r
+\r
+       // actually insert message\r
+       xmlstr=mlxml.GetXML();\r
+       StringFunctions::Convert(xmlstr.size(),xmlsizestr);\r
+\r
+       message.SetName("ClientPut");\r
+       message["URI"]=privatekey+m_messagebase+"|"+now.Format("%Y-%m-%d")+"|MessageList|"+indexstr+".xml";\r
+       message["Identifier"]=m_fcpuniquename+"|"+localidentityidstr+"|"+indexstr+"|"+message["URI"];\r
+       message["UploadFrom"]="direct";\r
+       message["DataLength"]=xmlsizestr;\r
+       m_fcp->SendMessage(message);\r
+       m_fcp->SendRaw(xmlstr.c_str(),xmlstr.size());\r
+\r
+       m_inserting.push_back(localidentityid);\r
+\r
+}\r