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