--- /dev/null
+#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