version 0.2.11
[fms.git] / src / freenet / fileinserter.cpp
1 #include "../../include/freenet/fileinserter.h"\r
2 \r
3 #ifdef XMEM\r
4         #include <xmem.h>\r
5 #endif\r
6 \r
7 FileInserter::FileInserter()\r
8 {\r
9         Initialize();\r
10 }\r
11 \r
12 FileInserter::FileInserter(FCPv2 *fcp):IIndexInserter<long>(fcp)\r
13 {\r
14         Initialize();\r
15 }\r
16 \r
17 void FileInserter::CheckForNeededInsert()\r
18 {\r
19         // only do 1 insert at a time\r
20         if(m_inserting.size()==0)\r
21         {\r
22                 SQLite3DB::Statement st=m_db->Prepare("SELECT FileInsertID FROM tblFileInserts WHERE Key IS NULL;");\r
23                 st.Step();\r
24                 if(st.RowReturned())\r
25                 {\r
26                         int id=-1;\r
27                         st.ResultInt(0,id);\r
28                         StartInsert(id);\r
29                 }\r
30         }\r
31 }\r
32 \r
33 const bool FileInserter::HandlePutFailed(FCPMessage &message)\r
34 {\r
35         std::vector<std::string> idparts;\r
36         long fileinsertid;\r
37 \r
38         StringFunctions::Split(message["Identifier"],"|",idparts);\r
39         StringFunctions::Convert(idparts[1],fileinsertid);\r
40 \r
41         RemoveFromInsertList(fileinsertid);\r
42 \r
43         m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"FileInserter::HandlePutFailed failed to insert "+message["Identifier"]);\r
44 \r
45         return true;\r
46 \r
47 }\r
48 \r
49 const bool FileInserter::HandlePutSuccessful(FCPMessage &message)\r
50 {\r
51         std::vector<std::string> idparts;\r
52         long fileinsertid;\r
53 \r
54         StringFunctions::Split(message["Identifier"],"|",idparts);\r
55         StringFunctions::Convert(idparts[1],fileinsertid);\r
56 \r
57         SQLite3DB::Statement st=m_db->Prepare("UPDATE tblFileInserts SET Key=?, Data=NULL WHERE FileInsertID=?;");\r
58         st.Bind(0,message["URI"]);\r
59         st.Bind(1,fileinsertid);\r
60         st.Step();\r
61 \r
62         RemoveFromInsertList(fileinsertid);\r
63 \r
64         return true;\r
65 }\r
66 \r
67 void FileInserter::Initialize()\r
68 {\r
69         m_fcpuniquename="FileInserter";\r
70 }\r
71 \r
72 void FileInserter::StartInsert(const long &fileinsertid)\r
73 {\r
74         FCPMessage message;\r
75         std::string fileinsertidstr="";\r
76         std::string sizestr="";\r
77         std::string filename="";\r
78         int datalen=-1;\r
79         std::vector<char> data;\r
80 \r
81         StringFunctions::Convert(fileinsertid,fileinsertidstr);\r
82 \r
83 \r
84         SQLite3DB::Statement st=m_db->Prepare("SELECT FileName,Size,Data FROM tblFileInserts WHERE FileInsertID=?;");\r
85         st.Bind(0,fileinsertid);\r
86         st.Step();\r
87 \r
88         st.ResultText(0,filename);\r
89         st.ResultInt(1,datalen);\r
90         data.resize(datalen,0);\r
91         st.ResultBlob(2,&data[0],datalen);\r
92         data.resize(datalen);\r
93 \r
94         StringFunctions::Convert(data.size(),sizestr);\r
95 \r
96         message.SetName("ClientPut");\r
97         message["URI"]="CHK@";\r
98         message["TargetFilename"]=filename;\r
99         message["Identifier"]=m_fcpuniquename+"|"+fileinsertidstr;\r
100         message["UploadFrom"]="direct";\r
101         message["DataLength"]=sizestr;\r
102         m_fcp->SendMessage(message);\r
103         m_fcp->SendRaw(&data[0],data.size());\r
104 \r
105         m_inserting.push_back(fileinsertid);\r
106 }\r