version 0.2.11
[fms.git] / src / freenet / fileinserter.cpp
diff --git a/src/freenet/fileinserter.cpp b/src/freenet/fileinserter.cpp
new file mode 100644 (file)
index 0000000..d8d2721
--- /dev/null
@@ -0,0 +1,106 @@
+#include "../../include/freenet/fileinserter.h"\r
+\r
+#ifdef XMEM\r
+       #include <xmem.h>\r
+#endif\r
+\r
+FileInserter::FileInserter()\r
+{\r
+       Initialize();\r
+}\r
+\r
+FileInserter::FileInserter(FCPv2 *fcp):IIndexInserter<long>(fcp)\r
+{\r
+       Initialize();\r
+}\r
+\r
+void FileInserter::CheckForNeededInsert()\r
+{\r
+       // only do 1 insert at a time\r
+       if(m_inserting.size()==0)\r
+       {\r
+               SQLite3DB::Statement st=m_db->Prepare("SELECT FileInsertID FROM tblFileInserts WHERE Key IS NULL;");\r
+               st.Step();\r
+               if(st.RowReturned())\r
+               {\r
+                       int id=-1;\r
+                       st.ResultInt(0,id);\r
+                       StartInsert(id);\r
+               }\r
+       }\r
+}\r
+\r
+const bool FileInserter::HandlePutFailed(FCPMessage &message)\r
+{\r
+       std::vector<std::string> idparts;\r
+       long fileinsertid;\r
+\r
+       StringFunctions::Split(message["Identifier"],"|",idparts);\r
+       StringFunctions::Convert(idparts[1],fileinsertid);\r
+\r
+       RemoveFromInsertList(fileinsertid);\r
+\r
+       m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"FileInserter::HandlePutFailed failed to insert "+message["Identifier"]);\r
+\r
+       return true;\r
+\r
+}\r
+\r
+const bool FileInserter::HandlePutSuccessful(FCPMessage &message)\r
+{\r
+       std::vector<std::string> idparts;\r
+       long fileinsertid;\r
+\r
+       StringFunctions::Split(message["Identifier"],"|",idparts);\r
+       StringFunctions::Convert(idparts[1],fileinsertid);\r
+\r
+       SQLite3DB::Statement st=m_db->Prepare("UPDATE tblFileInserts SET Key=?, Data=NULL WHERE FileInsertID=?;");\r
+       st.Bind(0,message["URI"]);\r
+       st.Bind(1,fileinsertid);\r
+       st.Step();\r
+\r
+       RemoveFromInsertList(fileinsertid);\r
+\r
+       return true;\r
+}\r
+\r
+void FileInserter::Initialize()\r
+{\r
+       m_fcpuniquename="FileInserter";\r
+}\r
+\r
+void FileInserter::StartInsert(const long &fileinsertid)\r
+{\r
+       FCPMessage message;\r
+       std::string fileinsertidstr="";\r
+       std::string sizestr="";\r
+       std::string filename="";\r
+       int datalen=-1;\r
+       std::vector<char> data;\r
+\r
+       StringFunctions::Convert(fileinsertid,fileinsertidstr);\r
+\r
+\r
+       SQLite3DB::Statement st=m_db->Prepare("SELECT FileName,Size,Data FROM tblFileInserts WHERE FileInsertID=?;");\r
+       st.Bind(0,fileinsertid);\r
+       st.Step();\r
+\r
+       st.ResultText(0,filename);\r
+       st.ResultInt(1,datalen);\r
+       data.resize(datalen,0);\r
+       st.ResultBlob(2,&data[0],datalen);\r
+       data.resize(datalen);\r
+\r
+       StringFunctions::Convert(data.size(),sizestr);\r
+\r
+       message.SetName("ClientPut");\r
+       message["URI"]="CHK@";\r
+       message["TargetFilename"]=filename;\r
+       message["Identifier"]=m_fcpuniquename+"|"+fileinsertidstr;\r
+       message["UploadFrom"]="direct";\r
+       message["DataLength"]=sizestr;\r
+       m_fcp->SendMessage(message);\r
+       m_fcp->SendRaw(&data[0],data.size());\r
+\r
+       m_inserting.push_back(fileinsertid);\r
+}\r