version 0.1.0
[fms.git] / src / freenet / messageinserter.cpp
diff --git a/src/freenet/messageinserter.cpp b/src/freenet/messageinserter.cpp
new file mode 100644 (file)
index 0000000..acd6bfe
--- /dev/null
@@ -0,0 +1,129 @@
+#include "../../include/freenet/messageinserter.h"\r
+\r
+MessageInserter::MessageInserter()\r
+{\r
+       Initialize();\r
+}\r
+\r
+MessageInserter::MessageInserter(FCPv2 *fcp):IIndexInserter(fcp)\r
+{\r
+       Initialize();\r
+}\r
+\r
+void MessageInserter::CheckForNeededInsert()\r
+{\r
+       // only do 1 insert at a time\r
+       if(m_inserting.size()==0)\r
+       {\r
+               SQLite3DB::Statement st=m_db->Prepare("SELECT MessageUUID FROM tblMessageInserts INNER JOIN tblLocalIdentity ON tblMessageInserts.LocalIdentityID=tblLocalIdentity.LocalIdentityID WHERE tblLocalIdentity.PrivateKey IS NOT NULL AND tblLocalIdentity.PrivateKey <> '' AND tblMessageInserts.Inserted='false';");\r
+               st.Step();\r
+\r
+               if(st.RowReturned())\r
+               {\r
+                       std::string messageuuid;\r
+                       st.ResultText(0,messageuuid);\r
+                       StartInsert(messageuuid);\r
+               }\r
+       }\r
+}\r
+\r
+const bool MessageInserter::HandlePutFailed(FCPMessage &message)\r
+{\r
+       int index;\r
+       int localidentityid;\r
+       std::vector<std::string> idparts;\r
+       StringFunctions::Split(message["Identifier"],"|",idparts);\r
+       StringFunctions::Convert(idparts[2],localidentityid);\r
+       StringFunctions::Convert(idparts[3],index);\r
+\r
+       // fatal put - or data exists - insert bogus index into database so we'll try to insert this message again\r
+       if(message["Fatal"]=="true" || message["Code"]=="9")\r
+       {\r
+               SQLite3DB::Statement st=m_db->Prepare("INSERT INTO tblMessageInserts(LocalIdentityID,Day,InsertIndex,Inserted) VALUES(?,?,?,'true');");\r
+               st.Bind(0,localidentityid);\r
+               st.Bind(1,idparts[5]);\r
+               st.Bind(2,index);\r
+               st.Step();\r
+       }\r
+\r
+       RemoveFromInsertList(idparts[1]);\r
+\r
+       return true;\r
+}\r
+\r
+const bool MessageInserter::HandlePutSuccessful(FCPMessage &message)\r
+{\r
+       int index;\r
+       std::vector<std::string> idparts;\r
+       StringFunctions::Split(message["Identifier"],"|",idparts);\r
+       StringFunctions::Convert(idparts[3],index);\r
+\r
+       SQLite3DB::Statement st=m_db->Prepare("UPDATE tblMessageInserts SET Day=?, InsertIndex=?, Inserted='true' WHERE MessageUUID=?;");\r
+       st.Bind(0,idparts[5]);\r
+       st.Bind(1,index);\r
+       st.Bind(2,idparts[1]);\r
+       st.Step();\r
+\r
+       RemoveFromInsertList(idparts[1]);\r
+\r
+       m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"MessageInserter::HandlePutSuccessful successfully inserted message "+message["Identifier"]);\r
+\r
+       return true;\r
+}\r
+\r
+void MessageInserter::Initialize()\r
+{\r
+       m_fcpuniquename="MessageInserter";\r
+}\r
+\r
+void MessageInserter::StartInsert(const std::string &messageuuid)\r
+{\r
+       DateTime now;\r
+       now.SetToGMTime();\r
+       SQLite3DB::Statement st=m_db->Prepare("SELECT MessageXML,PrivateKey,tblLocalIdentity.LocalIdentityID FROM tblMessageInserts INNER JOIN tblLocalIdentity ON tblMessageInserts.LocalIdentityID=tblLocalIdentity.LocalIdentityID WHERE MessageUUID=?;");\r
+       st.Bind(0,messageuuid);\r
+       st.Step();\r
+\r
+       if(st.RowReturned())\r
+       {\r
+               int localidentityid;\r
+               std::string idstr;\r
+               std::string xml;\r
+               std::string xmlsizestr;\r
+               std::string privatekey;\r
+               FCPMessage message;\r
+               std::string indexstr;\r
+               int index=0;\r
+               \r
+               st.ResultText(0,xml);\r
+               st.ResultText(1,privatekey);\r
+               st.ResultInt(2,localidentityid);\r
+               StringFunctions::Convert(xml.size(),xmlsizestr);\r
+               StringFunctions::Convert(localidentityid,idstr);\r
+\r
+               st=m_db->Prepare("SELECT MAX(InsertIndex) FROM tblMessageInserts WHERE Day=? AND LocalIdentityID=?;");\r
+               st.Bind(0,now.Format("%Y-%m-%d"));\r
+               st.Bind(1,localidentityid);\r
+               st.Step();\r
+\r
+               if(st.ResultNull(0)==false)\r
+               {\r
+                       st.ResultInt(0,index);\r
+                       index++;\r
+               }\r
+               StringFunctions::Convert(index,indexstr);\r
+\r
+               message.SetName("ClientPut");\r
+               message["URI"]=privatekey+m_messagebase+"|"+now.Format("%Y-%m-%d")+"|Message|"+indexstr+".xml";\r
+               message["Identifier"]=m_fcpuniquename+"|"+messageuuid+"|"+idstr+"|"+indexstr+"|"+message["URI"];\r
+               message["UploadFrom"]="direct";\r
+               message["DataLength"]=xmlsizestr;\r
+               m_fcp->SendMessage(message);\r
+               m_fcp->SendRaw(xml.c_str(),xml.size());\r
+\r
+               m_inserting.push_back(messageuuid);\r
+\r
+               m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"MessageInserter::StartInsert started message insert "+message["URI"]);\r
+       }\r
+\r
+}\r