d28e262d6f4f6a5244a6061bd5310cce85b11191
[fms.git] / src / freenet / messageinserter.cpp
1 #include "../../include/freenet/messageinserter.h"\r
2 \r
3 MessageInserter::MessageInserter()\r
4 {\r
5         Initialize();\r
6 }\r
7 \r
8 MessageInserter::MessageInserter(FCPv2 *fcp):IIndexInserter<std::string>(fcp)\r
9 {\r
10         Initialize();\r
11 }\r
12 \r
13 void MessageInserter::CheckForNeededInsert()\r
14 {\r
15         // only do 1 insert at a time\r
16         if(m_inserting.size()==0)\r
17         {\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
19                 st.Step();\r
20 \r
21                 if(st.RowReturned())\r
22                 {\r
23                         std::string messageuuid;\r
24                         st.ResultText(0,messageuuid);\r
25                         StartInsert(messageuuid);\r
26                 }\r
27         }\r
28 }\r
29 \r
30 const bool MessageInserter::HandlePutFailed(FCPMessage &message)\r
31 {\r
32         int index;\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
38 \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
41         {\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
45                 st.Bind(2,index);\r
46                 st.Step();\r
47         }\r
48 \r
49         RemoveFromInsertList(idparts[1]);\r
50 \r
51         return true;\r
52 }\r
53 \r
54 const bool MessageInserter::HandlePutSuccessful(FCPMessage &message)\r
55 {\r
56         int index;\r
57         std::vector<std::string> idparts;\r
58         StringFunctions::Split(message["Identifier"],"|",idparts);\r
59         StringFunctions::Convert(idparts[3],index);\r
60 \r
61         SQLite3DB::Statement st=m_db->Prepare("UPDATE tblMessageInserts SET Day=?, InsertIndex=?, Inserted='true' WHERE MessageUUID=?;");\r
62         st.Bind(0,idparts[5]);\r
63         st.Bind(1,index);\r
64         st.Bind(2,idparts[1]);\r
65         st.Step();\r
66 \r
67         RemoveFromInsertList(idparts[1]);\r
68 \r
69         m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"MessageInserter::HandlePutSuccessful successfully inserted message "+message["Identifier"]);\r
70 \r
71         return true;\r
72 }\r
73 \r
74 void MessageInserter::Initialize()\r
75 {\r
76         m_fcpuniquename="MessageInserter";\r
77 }\r
78 \r
79 void MessageInserter::StartInsert(const std::string &messageuuid)\r
80 {\r
81         DateTime now;\r
82         now.SetToGMTime();\r
83         SQLite3DB::Statement st=m_db->Prepare("SELECT MessageXML,PrivateKey,tblLocalIdentity.LocalIdentityID FROM tblMessageInserts INNER JOIN tblLocalIdentity ON tblMessageInserts.LocalIdentityID=tblLocalIdentity.LocalIdentityID WHERE MessageUUID=?;");\r
84         st.Bind(0,messageuuid);\r
85         st.Step();\r
86 \r
87         if(st.RowReturned())\r
88         {\r
89                 int localidentityid;\r
90                 std::string idstr;\r
91                 std::string xml;\r
92                 std::string xmlsizestr;\r
93                 std::string privatekey;\r
94                 FCPMessage message;\r
95                 std::string indexstr;\r
96                 int index=0;\r
97                 \r
98                 st.ResultText(0,xml);\r
99                 st.ResultText(1,privatekey);\r
100                 st.ResultInt(2,localidentityid);\r
101                 StringFunctions::Convert(xml.size(),xmlsizestr);\r
102                 StringFunctions::Convert(localidentityid,idstr);\r
103 \r
104                 st=m_db->Prepare("SELECT MAX(InsertIndex) FROM tblMessageInserts WHERE Day=? AND LocalIdentityID=?;");\r
105                 st.Bind(0,now.Format("%Y-%m-%d"));\r
106                 st.Bind(1,localidentityid);\r
107                 st.Step();\r
108 \r
109                 if(st.ResultNull(0)==false)\r
110                 {\r
111                         st.ResultInt(0,index);\r
112                         index++;\r
113                 }\r
114                 StringFunctions::Convert(index,indexstr);\r
115 \r
116                 message.SetName("ClientPut");\r
117                 message["URI"]=privatekey+m_messagebase+"|"+now.Format("%Y-%m-%d")+"|Message|"+indexstr+".xml";\r
118                 message["Identifier"]=m_fcpuniquename+"|"+messageuuid+"|"+idstr+"|"+indexstr+"|"+message["URI"];\r
119                 message["UploadFrom"]="direct";\r
120                 message["DataLength"]=xmlsizestr;\r
121                 m_fcp->SendMessage(message);\r
122                 m_fcp->SendRaw(xml.c_str(),xml.size());\r
123 \r
124                 m_inserting.push_back(messageuuid);\r
125 \r
126                 m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"MessageInserter::StartInsert started message insert "+message["URI"]);\r
127         }\r
128 \r
129 }\r