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
14 template <class IDTYPE>
\r
15 class IIndexInserter:public IFreenetRegistrable,public IFCPConnected,public IFCPMessageHandler,public IPeriodicProcessor,public IDatabase,public ILogger
\r
19 IIndexInserter(FCPv2 *fcp);
\r
21 virtual void FCPConnected();
\r
22 virtual void FCPDisconnected();
\r
23 virtual const bool HandleMessage(FCPMessage &message);
\r
25 virtual void Process();
\r
27 virtual void RegisterWithThread(FreenetMasterThread *thread);
\r
30 void InitializeIIndexInserter();
\r
31 virtual void Initialize()=0; // initialize m_fcpuniquename
\r
32 virtual const bool HandlePutSuccessful(FCPMessage &message)=0;
\r
33 virtual const bool HandlePutFailed(FCPMessage &message)=0;
\r
34 virtual void StartInsert(const IDTYPE &id)=0;
\r
35 virtual void CheckForNeededInsert()=0;
\r
36 virtual void RemoveFromInsertList(const IDTYPE id);
\r
38 std::vector<IDTYPE> m_inserting; // list of ids we are inserting
\r
39 std::string m_messagebase;
\r
40 DateTime m_lastchecked;
\r
42 // these MUST be populated by child class
\r
43 std::string m_fcpuniquename;
\r
46 template <class IDTYPE>
\r
47 IIndexInserter<IDTYPE>::IIndexInserter()
\r
49 InitializeIIndexInserter();
\r
52 template <class IDTYPE>
\r
53 IIndexInserter<IDTYPE>::IIndexInserter(FCPv2 *fcp):IFCPConnected(fcp)
\r
55 InitializeIIndexInserter();
\r
58 template <class IDTYPE>
\r
59 void IIndexInserter<IDTYPE>::FCPConnected()
\r
61 // make sure variables have been initialized by the derived class
\r
62 if(m_fcpuniquename=="")
\r
64 m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"IIndexInserter<IDTYPE>::FCPConnected fcpuniquename not initialized correctly!");
\r
66 if(m_fcpuniquename.find("|")!=std::string::npos)
\r
68 m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"IIndexInserter<IDTYPE>::FCPConnected fcpuniquename contains | character! This is not a valid character!");
\r
71 m_inserting.clear();
\r
74 template <class IDTYPE>
\r
75 void IIndexInserter<IDTYPE>::FCPDisconnected()
\r
80 template <class IDTYPE>
\r
81 const bool IIndexInserter<IDTYPE>::HandleMessage(FCPMessage &message)
\r
84 if(message["Identifier"].find(m_fcpuniquename)==0)
\r
86 if(message.GetName()=="URIGenerated")
\r
91 if(message.GetName()=="PutSuccessful")
\r
93 return HandlePutSuccessful(message);
\r
96 if(message.GetName()=="PutFailed")
\r
98 return HandlePutFailed(message);
\r
101 if(message.GetName()=="IdentifierCollision")
\r
103 // remove one of the ids from the requesting list
\r
105 std::vector<std::string> idparts;
\r
106 StringFunctions::Split(message["Identifier"],"|",idparts);
\r
107 StringFunctions::Convert(idparts[1],id);
\r
108 RemoveFromInsertList(id);
\r
116 template <class IDTYPE>
\r
117 void IIndexInserter<IDTYPE>::InitializeIIndexInserter()
\r
119 m_fcpuniquename="";
\r
120 Option::instance()->Get("MessageBase",m_messagebase);
\r
121 m_lastchecked.SetToGMTime();
\r
124 template <class IDTYPE>
\r
125 void IIndexInserter<IDTYPE>::Process()
\r
130 if(m_lastchecked<(now-(1.0/1440.0)))
\r
132 CheckForNeededInsert();
\r
137 template <class IDTYPE>
\r
138 void IIndexInserter<IDTYPE>::RegisterWithThread(FreenetMasterThread *thread)
\r
140 thread->RegisterFCPConnected(this);
\r
141 thread->RegisterFCPMessageHandler(this);
\r
142 thread->RegisterPeriodicProcessor(this);
\r
145 template <class IDTYPE>
\r
146 void IIndexInserter<IDTYPE>::RemoveFromInsertList(const IDTYPE identityid)
\r
148 typename std::vector<IDTYPE>::iterator i=m_inserting.begin();
\r
149 while(i!=m_inserting.end() && (*i)!=identityid)
\r
153 if(i!=m_inserting.end())
\r
155 m_inserting.erase(i);
\r
159 #endif // _iindexrequester_
\r