1 #include "../../include/freenet/boardlistinserter.h"
\r
2 #include "../../include/freenet/boardlistxml.h"
\r
4 #include <Poco/DateTime.h>
\r
5 #include <Poco/Timespan.h>
\r
6 #include <Poco/DateTimeFormatter.h>
\r
12 BoardListInserter::BoardListInserter()
\r
17 BoardListInserter::BoardListInserter(FCPv2 *fcp):IIndexInserter<long>(fcp)
\r
22 void BoardListInserter::CheckForNeededInsert()
\r
24 // only do 1 insert at a time
\r
25 if(m_inserting.size()==0)
\r
27 Poco::DateTime today;
\r
28 Poco::DateTime daysback;
\r
31 daysback-=Poco::Timespan(20,0,0,0,0);
\r
33 // get identities who posted messages to boards in the past 20 days
\r
34 SQLite3DB::Statement st=m_db->Prepare("SELECT tblLocalIdentity.LocalIdentityID FROM tblLocalIdentity INNER JOIN tblMessageInserts ON tblLocalIdentity.LocalIdentityID=tblMessageInserts.LocalIdentityID WHERE tblLocalIdentity.PublishBoardList='true' AND (tblLocalIdentity.LastInsertedBoardList<? OR tblLocalIdentity.LastInsertedBoardList IS NULL) AND tblMessageInserts.Day>=? GROUP BY tblLocalIdentity.LocalIdentityID;");
\r
35 st.Bind(0,Poco::DateTimeFormatter::format(today,"%Y-%m-%d"));
\r
36 st.Bind(1,Poco::DateTimeFormatter::format(daysback,"%Y-%m-%d"));
\r
39 if(st.RowReturned())
\r
41 int localidentityid;
\r
42 st.ResultInt(0,localidentityid);
\r
43 StartInsert(localidentityid);
\r
48 const bool BoardListInserter::HandlePutFailed(FCPMessage &message)
\r
50 std::vector<std::string> idparts;
\r
51 long localidentityid;
\r
54 StringFunctions::Split(message["Identifier"],"|",idparts);
\r
55 StringFunctions::Convert(idparts[1],localidentityid);
\r
56 StringFunctions::Convert(idparts[2],index);
\r
58 if(message["Fatal"]=="true" || message["Code"]=="9")
\r
60 SQLite3DB::Statement st=m_db->Prepare("INSERT INTO tblBoardListInserts(LocalIdentityID,Day,InsertIndex,Inserted) VALUES(?,?,?,'false');");
\r
61 st.Bind(0,localidentityid);
\r
62 st.Bind(1,idparts[4]);
\r
67 RemoveFromInsertList(localidentityid);
\r
72 const bool BoardListInserter::HandlePutSuccessful(FCPMessage &message)
\r
75 std::vector<std::string> idparts;
\r
76 long localidentityid;
\r
79 StringFunctions::Split(message["Identifier"],"|",idparts);
\r
80 StringFunctions::Convert(idparts[1],localidentityid);
\r
81 StringFunctions::Convert(idparts[2],index);
\r
83 SQLite3DB::Statement st=m_db->Prepare("INSERT INTO tblBoardListInserts(LocalIdentityID,Day,InsertIndex,Inserted) VALUES(?,?,?,'true');");
\r
84 st.Bind(0,localidentityid);
\r
85 st.Bind(1,idparts[4]);
\r
89 st=m_db->Prepare("UPDATE tblLocalIdentity SET LastInsertedBoardList=? WHERE LocalIdentityID=?;");
\r
90 st.Bind(0,Poco::DateTimeFormatter::format(now,"%Y-%m-%d %H:%M:%S"));
\r
91 st.Bind(1,localidentityid);
\r
94 RemoveFromInsertList(localidentityid);
\r
96 m_log->debug("BoardListInserter::HandlePutSuccessful successfully inserted BoardList.");
\r
101 void BoardListInserter::Initialize()
\r
103 m_fcpuniquename="BoardListInserter";
\r
106 const bool BoardListInserter::StartInsert(const long &localidentityid)
\r
108 Poco::DateTime daysback;
\r
109 Poco::DateTime now;
\r
111 FCPMessage message;
\r
113 std::string datasizestr;
\r
114 std::string privatekey="";
\r
116 std::string indexstr="";
\r
117 std::string localidentityidstr;
\r
120 daysback-=Poco::Timespan(20,0,0,0,0);
\r
123 SQLite3DB::Statement st=m_db->Prepare("SELECT BoardName,BoardDescription FROM tblBoard INNER JOIN tblMessageBoard ON tblBoard.BoardID=tblMessageBoard.BoardID INNER JOIN tblMessage ON tblMessageBoard.MessageID=tblMessage.MessageID INNER JOIN tblMessageInserts ON tblMessage.MessageUUID=tblMessageInserts.MessageUUID WHERE tblMessageInserts.LocalIdentityID=? AND tblMessageInserts.Day>=? GROUP BY tblBoard.BoardID;");
\r
124 st.Bind(0,localidentityid);
\r
125 st.Bind(1,Poco::DateTimeFormatter::format(daysback,"%Y-%m-%d"));
\r
128 while(st.RowReturned())
\r
130 std::string name="";
\r
131 std::string description="";
\r
133 st.ResultText(0,name);
\r
134 st.ResultText(1,description);
\r
136 xml.AddBoard(name,description);
\r
142 st=m_db->Prepare("SELECT PrivateKey FROM tblLocalIdentity WHERE LocalIdentityID=?;");
\r
143 st.Bind(0,localidentityid);
\r
145 if(st.RowReturned())
\r
147 st.ResultText(0,privatekey);
\r
152 st=m_db->Prepare("SELECT MAX(InsertIndex) FROM tblBoardListInserts WHERE LocalIdentityID=? AND Day=?;");
\r
153 st.Bind(0,localidentityid);
\r
154 st.Bind(1,Poco::DateTimeFormatter::format(now,"%Y-%m-%d"));
\r
156 if(st.RowReturned())
\r
158 if(st.ResultNull(0)==false)
\r
160 st.ResultInt(0,index);
\r
164 StringFunctions::Convert(index,indexstr);
\r
167 StringFunctions::Convert(data.size(),datasizestr);
\r
168 StringFunctions::Convert(localidentityid,localidentityidstr);
\r
170 message.SetName("ClientPut");
\r
171 message["URI"]=privatekey+m_messagebase+"|"+Poco::DateTimeFormatter::format(now,"%Y-%m-%d")+"|BoardList|"+indexstr+".xml";
\r
172 message["Identifier"]=m_fcpuniquename+"|"+localidentityidstr+"|"+indexstr+"|"+message["URI"];
\r
173 message["UploadFrom"]="direct";
\r
174 message["DataLength"]=datasizestr;
\r
175 m_fcp->SendMessage(message);
\r
176 m_fcp->SendRaw(data.c_str(),data.size());
\r
178 m_inserting.push_back(localidentityid);
\r