version 0.1.11
[fms.git] / src / freenet / boardlistinserter.cpp
1 #include "../../include/freenet/boardlistinserter.h"\r
2 #include "../../include/freenet/boardlistxml.h"\r
3 \r
4 #ifdef XMEM\r
5         #include <xmem.h>\r
6 #endif\r
7 \r
8 BoardListInserter::BoardListInserter()\r
9 {\r
10         Initialize();\r
11 }\r
12 \r
13 BoardListInserter::BoardListInserter(FCPv2 *fcp):IIndexInserter<long>(fcp)\r
14 {\r
15         Initialize();\r
16 }\r
17 \r
18 void BoardListInserter::CheckForNeededInsert()\r
19 {\r
20         // only do 1 insert at a time\r
21         if(m_inserting.size()==0)\r
22         {\r
23                 DateTime today;\r
24                 DateTime daysback;\r
25                 \r
26                 today.SetToGMTime();\r
27                 daysback.SetToGMTime();\r
28 \r
29                 // 20 days\r
30                 daysback.Add(0,0,0,-20);\r
31 \r
32                 // get identities who posted messages to boards in the past 20 days\r
33                 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
34                 st.Bind(0,today.Format("%Y-%m-%d"));\r
35                 st.Bind(1,daysback.Format("%Y-%m-%d"));\r
36                 st.Step();\r
37 \r
38                 if(st.RowReturned())\r
39                 {\r
40                         int localidentityid;\r
41                         st.ResultInt(0,localidentityid);\r
42                         StartInsert(localidentityid);\r
43                 }\r
44         }\r
45 }\r
46 \r
47 const bool BoardListInserter::HandlePutFailed(FCPMessage &message)\r
48 {\r
49         std::vector<std::string> idparts;\r
50         long localidentityid;\r
51         long index;\r
52 \r
53         StringFunctions::Split(message["Identifier"],"|",idparts);\r
54         StringFunctions::Convert(idparts[1],localidentityid);\r
55         StringFunctions::Convert(idparts[2],index);\r
56 \r
57         if(message["Fatal"]=="true" || message["Code"]=="9")\r
58         {\r
59                 SQLite3DB::Statement st=m_db->Prepare("INSERT INTO tblBoardListInserts(LocalIdentityID,Day,InsertIndex,Inserted) VALUES(?,?,?,'false');");\r
60                 st.Bind(0,localidentityid);\r
61                 st.Bind(1,idparts[4]);\r
62                 st.Bind(2,index);\r
63                 st.Step();\r
64         }\r
65 \r
66         RemoveFromInsertList(localidentityid);\r
67 \r
68         return true;\r
69 }\r
70 \r
71 const bool BoardListInserter::HandlePutSuccessful(FCPMessage &message)\r
72 {\r
73         DateTime now;\r
74         std::vector<std::string> idparts;\r
75         long localidentityid;\r
76         long index;\r
77 \r
78         StringFunctions::Split(message["Identifier"],"|",idparts);\r
79         StringFunctions::Convert(idparts[1],localidentityid);\r
80         StringFunctions::Convert(idparts[2],index);\r
81 \r
82         SQLite3DB::Statement st=m_db->Prepare("INSERT INTO tblBoardListInserts(LocalIdentityID,Day,InsertIndex,Inserted) VALUES(?,?,?,'true');");\r
83         st.Bind(0,localidentityid);\r
84         st.Bind(1,idparts[4]);\r
85         st.Bind(2,index);\r
86         st.Step();\r
87 \r
88         now.SetToGMTime();\r
89         st=m_db->Prepare("UPDATE tblLocalIdentity SET LastInsertedBoardList=? WHERE LocalIdentityID=?;");\r
90         st.Bind(0,now.Format("%Y-%m-%d %H:%M:%S"));\r
91         st.Bind(1,localidentityid);\r
92         st.Step();\r
93 \r
94         RemoveFromInsertList(localidentityid);\r
95 \r
96         m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"BoardListInserter::HandlePutSuccessful successfully inserted BoardList.");\r
97 \r
98         return true;\r
99 }\r
100 \r
101 void BoardListInserter::Initialize()\r
102 {\r
103         m_fcpuniquename="BoardListInserter";\r
104 }\r
105 \r
106 void BoardListInserter::StartInsert(const long &localidentityid)\r
107 {\r
108         DateTime daysback;\r
109         DateTime now;\r
110         BoardListXML xml;\r
111         FCPMessage message;\r
112         std::string data;\r
113         std::string datasizestr;\r
114         std::string privatekey="";\r
115         int index;\r
116         std::string indexstr="";\r
117         std::string localidentityidstr;\r
118 \r
119         now.SetToGMTime();\r
120         daysback.SetToGMTime();\r
121         daysback.Add(0,0,0,-20);\r
122 \r
123         // get boards\r
124         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
125         st.Bind(0,localidentityid);\r
126         st.Bind(1,daysback.Format("%Y-%m-%d"));\r
127         st.Step();\r
128 \r
129         while(st.RowReturned())\r
130         {\r
131                 std::string name="";\r
132                 std::string description="";\r
133 \r
134                 st.ResultText(0,name);\r
135                 st.ResultText(1,description);\r
136 \r
137                 xml.AddBoard(name,description);\r
138 \r
139                 st.Step();\r
140         }\r
141 \r
142         // get public key\r
143         st=m_db->Prepare("SELECT PrivateKey FROM tblLocalIdentity WHERE LocalIdentityID=?;");\r
144         st.Bind(0,localidentityid);\r
145         st.Step();\r
146         if(st.RowReturned())\r
147         {\r
148                 st.ResultText(0,privatekey);\r
149         }\r
150 \r
151         // get last index\r
152         index=0;\r
153         st=m_db->Prepare("SELECT MAX(InsertIndex) FROM tblBoardListInserts WHERE LocalIdentityID=? AND Day=?;");\r
154         st.Bind(0,localidentityid);\r
155         st.Bind(1,now.Format("%Y-%m-%d"));\r
156         st.Step();\r
157         if(st.RowReturned())\r
158         {\r
159                 if(st.ResultNull(0)==false)\r
160                 {\r
161                         st.ResultInt(0,index);\r
162                         index++;\r
163                 }\r
164         }\r
165         StringFunctions::Convert(index,indexstr);\r
166 \r
167         data=xml.GetXML();\r
168         StringFunctions::Convert(data.size(),datasizestr);\r
169         StringFunctions::Convert(localidentityid,localidentityidstr);\r
170 \r
171         message.SetName("ClientPut");\r
172         message["URI"]=privatekey+m_messagebase+"|"+now.Format("%Y-%m-%d")+"|BoardList|"+indexstr+".xml";\r
173         message["Identifier"]=m_fcpuniquename+"|"+localidentityidstr+"|"+indexstr+"|"+message["URI"];\r
174         message["UploadFrom"]="direct";\r
175         message["DataLength"]=datasizestr;\r
176         m_fcp->SendMessage(message);\r
177         m_fcp->SendRaw(data.c_str(),data.size());\r
178 \r
179         m_inserting.push_back(localidentityid);\r
180 \r
181 }\r