cc7cfd5c13d853743fcb88ecb687f7ef4fac8d9a
[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         DateTime date;\r
57         int localidentityid;\r
58         int index;\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
63 \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
66         st.Bind(1,index);\r
67         st.Bind(2,idparts[1]);\r
68         st.Step();\r
69 \r
70         // insert record into temp table so MessageList will be inserted ASAP\r
71         date.SetToGMTime();\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
75         st.Step();\r
76 \r
77         RemoveFromInsertList(idparts[1]);\r
78 \r
79         m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"MessageInserter::HandlePutSuccessful successfully inserted message "+message["Identifier"]);\r
80 \r
81         return true;\r
82 }\r
83 \r
84 void MessageInserter::Initialize()\r
85 {\r
86         m_fcpuniquename="MessageInserter";\r
87 }\r
88 \r
89 void MessageInserter::StartInsert(const std::string &messageuuid)\r
90 {\r
91         DateTime now;\r
92         now.SetToGMTime();\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
95         st.Step();\r
96 \r
97         if(st.RowReturned())\r
98         {\r
99                 int localidentityid;\r
100                 std::string idstr;\r
101                 std::string xml;\r
102                 std::string xmlsizestr;\r
103                 std::string privatekey;\r
104                 FCPMessage message;\r
105                 std::string indexstr;\r
106                 int index=0;\r
107                 \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
113 \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
117                 st.Step();\r
118 \r
119                 if(st.ResultNull(0)==false)\r
120                 {\r
121                         st.ResultInt(0,index);\r
122                         index++;\r
123                 }\r
124                 StringFunctions::Convert(index,indexstr);\r
125 \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
133 \r
134                 m_inserting.push_back(messageuuid);\r
135 \r
136                 m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"MessageInserter::StartInsert started message insert "+message["URI"]);\r
137         }\r
138 \r
139 }\r