0ed526c5ec7d6ad14bf116b68ab2ae70b37f93b6
[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::Connection *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(FCPv2::Message &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->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(FCPv2::Message &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,StringFunctions::UriDecode(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 const bool FileInserter::StartInsert(const long &fileinsertid)\r
73 {\r
74         FCPv2::Message message;\r
75         std::string fileinsertidstr="";\r
76         std::string sizestr="";\r
77         std::string filename="";\r
78         std::string mimetype="";\r
79         int datalen=-1;\r
80         std::vector<char> data;\r
81 \r
82         StringFunctions::Convert(fileinsertid,fileinsertidstr);\r
83 \r
84 \r
85         SQLite3DB::Statement st=m_db->Prepare("SELECT FileName,Size,Data,MimeType FROM tblFileInserts WHERE FileInsertID=?;");\r
86         st.Bind(0,fileinsertid);\r
87         st.Step();\r
88 \r
89         st.ResultText(0,filename);\r
90         st.ResultInt(1,datalen);\r
91         data.resize(datalen,0);\r
92         st.ResultBlob(2,&data[0],datalen);\r
93         data.resize(datalen);\r
94         st.ResultText(3,mimetype);\r
95 \r
96         StringFunctions::Convert(data.size(),sizestr);\r
97 \r
98         message.SetName("ClientPut");\r
99         message["URI"]="CHK@";\r
100         message["TargetFilename"]=filename;\r
101         if(mimetype!="")\r
102         {\r
103                 message["Metadata.ContentType"]=mimetype;\r
104         }\r
105         message["Identifier"]=m_fcpuniquename+"|"+fileinsertidstr;\r
106         message["UploadFrom"]="direct";\r
107         message["DataLength"]=sizestr;\r
108         m_fcp->Send(message);\r
109         m_fcp->Send(data);\r
110 \r
111         m_inserting.push_back(fileinsertid);\r
112 \r
113         return true;\r
114 }\r