version 0.1.2
[fms.git] / src / freenet / messagelistinserter.cpp
1 #include "../../include/freenet/messagelistinserter.h"\r
2 #include "../../include/freenet/messagexml.h"\r
3 #include "../../include/freenet/messagelistxml.h"\r
4 \r
5 #ifdef XMEM\r
6         #include <xmem.h>\r
7 #endif\r
8 \r
9 MessageListInserter::MessageListInserter()\r
10 {\r
11         Initialize();\r
12 }\r
13 \r
14 MessageListInserter::MessageListInserter(FCPv2 *fcp):IIndexInserter<long>(fcp)\r
15 {\r
16         Initialize();\r
17 }\r
18 \r
19 void MessageListInserter::CheckForNeededInsert()\r
20 {\r
21         // only do 1 insert at a time\r
22         if(m_inserting.size()==0)\r
23         {\r
24                 DateTime now;\r
25                 DateTime previous;\r
26 \r
27                 now.SetToGMTime();\r
28                 previous.SetToGMTime();\r
29 \r
30                 previous.Add(0,0,0,-m_daysbackward);\r
31 \r
32                 // query for identities that have messages in the past X days and we haven't inserted lists for in the past 30 minutes\r
33                 SQLite3DB::Statement st=m_db->Prepare("SELECT tblLocalIdentity.LocalIdentityID FROM tblLocalIdentity INNER JOIN tblMessageInserts ON tblLocalIdentity.LocalIdentityID=tblMessageInserts.LocalIdentityID WHERE tblMessageInserts.Day>=? AND (tblLocalIdentity.LastInsertedMessageList<=? OR tblLocalIdentity.LastInsertedMessageList IS NULL OR tblLocalIdentity.LastInsertedMessageList='');");\r
34                 st.Bind(0,previous.Format("%Y-%m-%d"));\r
35                 st.Bind(1,(now-(1.0/48.0)).Format("%Y-%m-%d %H:%M:%S"));\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 \r
48 const bool MessageListInserter::HandlePutFailed(FCPMessage &message)\r
49 {\r
50         std::vector<std::string> idparts;\r
51         long localidentityid;\r
52         long index;\r
53 \r
54         StringFunctions::Split(message["Identifier"],"|",idparts);\r
55         StringFunctions::Convert(idparts[1],localidentityid);\r
56         StringFunctions::Convert(idparts[2],index);\r
57 \r
58         if(message["Fatal"]=="true" || message["Code"]=="9")\r
59         {\r
60                 SQLite3DB::Statement st=m_db->Prepare("INSERT INTO tblMessageListInserts(LocalIdentityID,Day,InsertIndex,Inserted) VALUES(?,?,?,'false');");\r
61                 st.Bind(0,localidentityid);\r
62                 st.Bind(1,idparts[4]);\r
63                 st.Bind(2,index);\r
64                 st.Step();\r
65         }\r
66 \r
67         RemoveFromInsertList(localidentityid);\r
68 \r
69         return true;\r
70 \r
71 }\r
72 \r
73 const bool MessageListInserter::HandlePutSuccessful(FCPMessage &message)\r
74 {\r
75         DateTime now;\r
76         std::vector<std::string> idparts;\r
77         long localidentityid;\r
78         long index;\r
79 \r
80         StringFunctions::Split(message["Identifier"],"|",idparts);\r
81         StringFunctions::Convert(idparts[1],localidentityid);\r
82         StringFunctions::Convert(idparts[2],index);\r
83 \r
84         SQLite3DB::Statement st=m_db->Prepare("INSERT INTO tblMessageListInserts(LocalIdentityID,Day,InsertIndex,Inserted) VALUES(?,?,?,'true');");\r
85         st.Bind(0,localidentityid);\r
86         st.Bind(1,idparts[4]);\r
87         st.Bind(2,index);\r
88         st.Step();\r
89 \r
90         now.SetToGMTime();\r
91         st=m_db->Prepare("UPDATE tblLocalIdentity SET LastInsertedMessageList=? WHERE LocalIdentityID=?;");\r
92         st.Bind(0,now.Format("%Y-%m-%d %H:%M:%S"));\r
93         st.Bind(1,localidentityid);\r
94         st.Step();\r
95 \r
96         RemoveFromInsertList(localidentityid);\r
97 \r
98         return true;\r
99 }\r
100 \r
101 void MessageListInserter::Initialize()\r
102 {\r
103         std::string tempval;\r
104 \r
105         m_fcpuniquename="MessageListInserter";\r
106         m_daysbackward=0;\r
107         Option::instance()->Get("MessageListDaysBackward",tempval);\r
108         StringFunctions::Convert(tempval,m_daysbackward);\r
109 }\r
110 \r
111 void MessageListInserter::StartInsert(const long &localidentityid)\r
112 {\r
113         FCPMessage message;\r
114         DateTime date;\r
115         DateTime now;\r
116         std::string privatekey;\r
117         std::string localidentityidstr;\r
118         MessageListXML mlxml;\r
119         MessageXML messxml;\r
120         std::string xmlstr;\r
121         std::string xmlsizestr;\r
122         int index;\r
123         std::string indexstr;\r
124 \r
125         now.SetToGMTime();\r
126         date.SetToGMTime();\r
127         date.Add(0,0,0,-m_daysbackward);\r
128         StringFunctions::Convert(localidentityid,localidentityidstr);\r
129 \r
130         SQLite3DB::Statement st=m_db->Prepare("SELECT Day, InsertIndex, MessageXML, PrivateKey FROM tblMessageInserts INNER JOIN tblLocalIdentity ON tblMessageInserts.LocalIdentityID=tblLocalIdentity.LocalIdentityID WHERE tblLocalIdentity.LocalIdentityID=? AND Day>=?;");\r
131         st.Bind(0,localidentityid);\r
132         st.Bind(1,date.Format("%Y-%m-%d"));\r
133         st.Step();\r
134 \r
135         while(st.RowReturned())\r
136         {\r
137                 std::string day;\r
138                 int index;\r
139                 std::string xmlstr;\r
140                 std::vector<std::string> boards;\r
141 \r
142                 st.ResultText(0,day);\r
143                 st.ResultInt(1,index);\r
144                 st.ResultText(2,xmlstr);\r
145                 st.ResultText(3,privatekey);\r
146 \r
147                 messxml.ParseXML(xmlstr);\r
148 \r
149                 mlxml.AddMessage(day,index,messxml.GetBoards());\r
150 \r
151                 st.Step();\r
152         }\r
153         st.Finalize();\r
154 \r
155         // get last inserted messagelist index for this day\r
156         index=0;\r
157         st=m_db->Prepare("SELECT MAX(InsertIndex) FROM tblMessageListInserts WHERE LocalIdentityID=? AND Day=?;");\r
158         st.Bind(0,localidentityid);\r
159         st.Bind(1,now.Format("%Y-%m-%d"));\r
160         st.Step();\r
161         if(st.ResultNull(0)==false)\r
162         {\r
163                 st.ResultInt(0,index);\r
164                 index++;\r
165         }\r
166         StringFunctions::Convert(index,indexstr);\r
167 \r
168         // actually insert message\r
169         xmlstr=mlxml.GetXML();\r
170         StringFunctions::Convert(xmlstr.size(),xmlsizestr);\r
171 \r
172         message.SetName("ClientPut");\r
173         message["URI"]=privatekey+m_messagebase+"|"+now.Format("%Y-%m-%d")+"|MessageList|"+indexstr+".xml";\r
174         message["Identifier"]=m_fcpuniquename+"|"+localidentityidstr+"|"+indexstr+"|"+message["URI"];\r
175         message["UploadFrom"]="direct";\r
176         message["DataLength"]=xmlsizestr;\r
177         m_fcp->SendMessage(message);\r
178         m_fcp->SendRaw(xmlstr.c_str(),xmlstr.size());\r
179 \r
180         m_inserting.push_back(localidentityid);\r
181 \r
182 }\r