1 #ifndef _iindexinserter_
\r
2 #define _iindexinserter_
\r
4 #include "../idatabase.h"
\r
5 #include "../ilogger.h"
\r
6 #include "../option.h"
\r
7 #include "../datetime.h"
\r
8 #include "../stringfunctions.h"
\r
9 #include "ifreenetregistrable.h"
\r
10 #include "ifcpconnected.h"
\r
11 #include "ifcpmessagehandler.h"
\r
12 #include "iperiodicprocessor.h"
\r
18 template <class IDTYPE>
\r
19 class IIndexInserter:public IFreenetRegistrable,public IFCPConnected,public IFCPMessageHandler,public IPeriodicProcessor,public IDatabase,public ILogger
\r
23 IIndexInserter(FCPv2 *fcp);
\r
24 virtual ~IIndexInserter() {}
\r
26 virtual void FCPConnected();
\r
27 virtual void FCPDisconnected();
\r
28 virtual const bool HandleMessage(FCPMessage &message);
\r
30 virtual void Process();
\r
32 virtual void RegisterWithThread(FreenetMasterThread *thread);
\r
35 void InitializeIIndexInserter();
\r
36 virtual void Initialize()=0; // initialize m_fcpuniquename
\r
37 virtual const bool HandlePutSuccessful(FCPMessage &message)=0;
\r
38 virtual const bool HandlePutFailed(FCPMessage &message)=0;
\r
39 virtual void StartInsert(const IDTYPE &id)=0;
\r
40 virtual void CheckForNeededInsert()=0;
\r
41 virtual void RemoveFromInsertList(const IDTYPE id);
\r
43 std::vector<IDTYPE> m_inserting; // list of ids we are inserting
\r
44 std::string m_messagebase;
\r
45 DateTime m_lastchecked;
\r
47 // these MUST be populated by child class
\r
48 std::string m_fcpuniquename;
\r
51 template <class IDTYPE>
\r
52 IIndexInserter<IDTYPE>::IIndexInserter()
\r
54 InitializeIIndexInserter();
\r
57 template <class IDTYPE>
\r
58 IIndexInserter<IDTYPE>::IIndexInserter(FCPv2 *fcp):IFCPConnected(fcp)
\r
60 InitializeIIndexInserter();
\r
63 template <class IDTYPE>
\r
64 void IIndexInserter<IDTYPE>::FCPConnected()
\r
66 // make sure variables have been initialized by the derived class
\r
67 if(m_fcpuniquename=="")
\r
69 m_log->WriteLog(LogFile::LOGLEVEL_FATAL,"IIndexInserter<IDTYPE>::FCPConnected fcpuniquename not initialized correctly!");
\r
71 if(m_fcpuniquename.find("|")!=std::string::npos)
\r
73 m_log->WriteLog(LogFile::LOGLEVEL_FATAL,"IIndexInserter<IDTYPE>::FCPConnected fcpuniquename contains | character! This is not a valid character!");
\r
76 m_inserting.clear();
\r
79 template <class IDTYPE>
\r
80 void IIndexInserter<IDTYPE>::FCPDisconnected()
\r
85 template <class IDTYPE>
\r
86 const bool IIndexInserter<IDTYPE>::HandleMessage(FCPMessage &message)
\r
89 if(message["Identifier"].find(m_fcpuniquename)==0)
\r
91 if(message.GetName()=="URIGenerated")
\r
96 if(message.GetName()=="PutSuccessful")
\r
98 return HandlePutSuccessful(message);
\r
101 if(message.GetName()=="PutFailed")
\r
103 return HandlePutFailed(message);
\r
106 if(message.GetName()=="IdentifierCollision")
\r
108 // remove one of the ids from the requesting list
\r
110 std::vector<std::string> idparts;
\r
111 StringFunctions::Split(message["Identifier"],"|",idparts);
\r
112 StringFunctions::Convert(idparts[1],id);
\r
113 RemoveFromInsertList(id);
\r
121 template <class IDTYPE>
\r
122 void IIndexInserter<IDTYPE>::InitializeIIndexInserter()
\r
124 m_fcpuniquename="";
\r
125 Option::Instance()->Get("MessageBase",m_messagebase);
\r
126 m_lastchecked.SetToGMTime();
\r
129 template <class IDTYPE>
\r
130 void IIndexInserter<IDTYPE>::Process()
\r
135 if(m_lastchecked<(now-(1.0/1440.0)))
\r
137 CheckForNeededInsert();
\r
142 template <class IDTYPE>
\r
143 void IIndexInserter<IDTYPE>::RegisterWithThread(FreenetMasterThread *thread)
\r
145 thread->RegisterFCPConnected(this);
\r
146 thread->RegisterFCPMessageHandler(this);
\r
147 thread->RegisterPeriodicProcessor(this);
\r
150 template <class IDTYPE>
\r
151 void IIndexInserter<IDTYPE>::RemoveFromInsertList(const IDTYPE identityid)
\r
153 typename std::vector<IDTYPE>::iterator i=m_inserting.begin();
\r
154 while(i!=m_inserting.end() && (*i)!=identityid)
\r
158 if(i!=m_inserting.end())
\r
160 m_inserting.erase(i);
\r
164 #endif // _iindexrequester_
\r