1 #include "../../include/freenet/messageinserter.h"
\r
3 MessageInserter::MessageInserter()
\r
8 MessageInserter::MessageInserter(FCPv2 *fcp):IIndexInserter<std::string>(fcp)
\r
13 void MessageInserter::CheckForNeededInsert()
\r
15 // only do 1 insert at a time
\r
16 if(m_inserting.size()==0)
\r
18 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
21 if(st.RowReturned())
\r
23 std::string messageuuid;
\r
24 st.ResultText(0,messageuuid);
\r
25 StartInsert(messageuuid);
\r
30 const bool MessageInserter::HandlePutFailed(FCPMessage &message)
\r
33 int localidentityid;
\r
34 std::vector<std::string> idparts;
\r
35 StringFunctions::Split(message["Identifier"],"|",idparts);
\r
36 StringFunctions::Convert(idparts[2],localidentityid);
\r
37 StringFunctions::Convert(idparts[3],index);
\r
39 // fatal put - or data exists - insert bogus index into database so we'll try to insert this message again
\r
40 if(message["Fatal"]=="true" || message["Code"]=="9")
\r
42 SQLite3DB::Statement st=m_db->Prepare("INSERT INTO tblMessageInserts(LocalIdentityID,Day,InsertIndex,Inserted) VALUES(?,?,?,'true');");
\r
43 st.Bind(0,localidentityid);
\r
44 st.Bind(1,idparts[5]);
\r
49 RemoveFromInsertList(idparts[1]);
\r
54 const bool MessageInserter::HandlePutSuccessful(FCPMessage &message)
\r
57 int localidentityid;
\r
59 std::vector<std::string> idparts;
\r
60 StringFunctions::Split(message["Identifier"],"|",idparts);
\r
61 StringFunctions::Convert(idparts[3],index);
\r
62 StringFunctions::Convert(idparts[2],localidentityid);
\r
64 SQLite3DB::Statement st=m_db->Prepare("UPDATE tblMessageInserts SET Day=?, InsertIndex=?, Inserted='true' WHERE MessageUUID=?;");
\r
65 st.Bind(0,idparts[5]);
\r
67 st.Bind(2,idparts[1]);
\r
70 // insert record into temp table so MessageList will be inserted ASAP
\r
72 st=m_db->Prepare("INSERT INTO tmpMessageListInsert(LocalIdentityID,Date) VALUES(?,?);");
\r
73 st.Bind(0,localidentityid);
\r
74 st.Bind(1,date.Format("%Y-%m-%d"));
\r
77 RemoveFromInsertList(idparts[1]);
\r
79 m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"MessageInserter::HandlePutSuccessful successfully inserted message "+message["Identifier"]);
\r
84 void MessageInserter::Initialize()
\r
86 m_fcpuniquename="MessageInserter";
\r
89 void MessageInserter::StartInsert(const std::string &messageuuid)
\r
93 SQLite3DB::Statement st=m_db->Prepare("SELECT MessageXML,PrivateKey,tblLocalIdentity.LocalIdentityID FROM tblMessageInserts INNER JOIN tblLocalIdentity ON tblMessageInserts.LocalIdentityID=tblLocalIdentity.LocalIdentityID WHERE MessageUUID=?;");
\r
94 st.Bind(0,messageuuid);
\r
97 if(st.RowReturned())
\r
99 int localidentityid;
\r
102 std::string xmlsizestr;
\r
103 std::string privatekey;
\r
104 FCPMessage message;
\r
105 std::string indexstr;
\r
108 st.ResultText(0,xml);
\r
109 st.ResultText(1,privatekey);
\r
110 st.ResultInt(2,localidentityid);
\r
111 StringFunctions::Convert(xml.size(),xmlsizestr);
\r
112 StringFunctions::Convert(localidentityid,idstr);
\r
114 st=m_db->Prepare("SELECT MAX(InsertIndex) FROM tblMessageInserts WHERE Day=? AND LocalIdentityID=?;");
\r
115 st.Bind(0,now.Format("%Y-%m-%d"));
\r
116 st.Bind(1,localidentityid);
\r
119 if(st.ResultNull(0)==false)
\r
121 st.ResultInt(0,index);
\r
124 StringFunctions::Convert(index,indexstr);
\r
126 message.SetName("ClientPut");
\r
127 message["URI"]=privatekey+m_messagebase+"|"+now.Format("%Y-%m-%d")+"|Message|"+indexstr+".xml";
\r
128 message["Identifier"]=m_fcpuniquename+"|"+messageuuid+"|"+idstr+"|"+indexstr+"|"+message["URI"];
\r
129 message["UploadFrom"]="direct";
\r
130 message["DataLength"]=xmlsizestr;
\r
131 m_fcp->SendMessage(message);
\r
132 m_fcp->SendRaw(xml.c_str(),xml.size());
\r
134 m_inserting.push_back(messageuuid);
\r
136 m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"MessageInserter::StartInsert started message insert "+message["URI"]);
\r