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 "../stringfunctions.h"
\r
8 #include "ifreenetregistrable.h"
\r
9 #include "ifcpconnected.h"
\r
10 #include "ifcpmessagehandler.h"
\r
11 #include "iperiodicprocessor.h"
\r
13 #include <Poco/DateTime.h>
\r
14 #include <Poco/Timestamp.h>
\r
15 #include <Poco/Timespan.h>
\r
21 template <class IDTYPE>
\r
22 class IIndexInserter:public IFreenetRegistrable,public IFCPConnected,public IFCPMessageHandler,public IPeriodicProcessor,public IDatabase,public ILogger
\r
25 IIndexInserter(SQLite3DB::DB *db);
\r
26 IIndexInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp);
\r
27 virtual ~IIndexInserter() {}
\r
29 virtual void FCPConnected();
\r
30 virtual void FCPDisconnected();
\r
31 virtual const bool HandleMessage(FCPv2::Message &message);
\r
33 virtual void Process();
\r
35 virtual void RegisterWithThread(FreenetMasterThread *thread);
\r
38 void InitializeIIndexInserter();
\r
39 virtual void Initialize()=0; // initialize m_fcpuniquename
\r
40 virtual const bool HandlePutSuccessful(FCPv2::Message &message)=0;
\r
41 virtual const bool HandlePutFailed(FCPv2::Message &message)=0;
\r
42 virtual const bool StartInsert(const IDTYPE &id)=0;
\r
43 virtual void CheckForNeededInsert()=0;
\r
44 virtual void RemoveFromInsertList(const IDTYPE id);
\r
46 std::vector<IDTYPE> m_inserting; // list of ids we are inserting
\r
47 std::string m_messagebase;
\r
48 Poco::DateTime m_lastchecked;
\r
50 // these MUST be populated by child class
\r
51 std::string m_fcpuniquename;
\r
54 template <class IDTYPE>
\r
55 IIndexInserter<IDTYPE>::IIndexInserter(SQLite3DB::DB *db):IDatabase(db)
\r
57 InitializeIIndexInserter();
\r
60 template <class IDTYPE>
\r
61 IIndexInserter<IDTYPE>::IIndexInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp):IDatabase(db),IFCPConnected(fcp)
\r
63 InitializeIIndexInserter();
\r
66 template <class IDTYPE>
\r
67 void IIndexInserter<IDTYPE>::FCPConnected()
\r
69 // make sure variables have been initialized by the derived class
\r
70 if(m_fcpuniquename=="")
\r
72 m_log->fatal("IIndexInserter<IDTYPE>::FCPConnected fcpuniquename not initialized correctly!");
\r
74 if(m_fcpuniquename.find("|")!=std::string::npos)
\r
76 m_log->fatal("IIndexInserter<IDTYPE>::FCPConnected fcpuniquename : "+m_fcpuniquename+" contains | character! This is not a valid character!");
\r
79 m_inserting.clear();
\r
82 template <class IDTYPE>
\r
83 void IIndexInserter<IDTYPE>::FCPDisconnected()
\r
88 template <class IDTYPE>
\r
89 const bool IIndexInserter<IDTYPE>::HandleMessage(FCPv2::Message &message)
\r
92 if(message["Identifier"].find(m_fcpuniquename)==0)
\r
94 m_log->trace("IIndexInserter<IDTYPE>::HandleMessage "+m_fcpuniquename+" received "+message.GetName()+" ID="+message["Identifier"]+" URI="+message["URI"]);
\r
96 if(message.GetName()=="URIGenerated")
\r
101 if(message.GetName()=="PutSuccessful")
\r
103 return HandlePutSuccessful(message);
\r
106 if(message.GetName()=="PutFailed")
\r
108 return HandlePutFailed(message);
\r
111 if(message.GetName()=="IdentifierCollision")
\r
113 // remove one of the ids from the requesting list
\r
115 std::vector<std::string> idparts;
\r
116 StringFunctions::Split(message["Identifier"],"|",idparts);
\r
117 StringFunctions::Convert(idparts[1],id);
\r
118 RemoveFromInsertList(id);
\r
119 m_log->debug("IIndexInserter<IDTYPE>::HandleMessage IdentifierCollision for "+m_fcpuniquename+" "+message["Identifier"]);
\r
127 template <class IDTYPE>
\r
128 void IIndexInserter<IDTYPE>::InitializeIIndexInserter()
\r
130 Option option(m_db);
\r
131 m_fcpuniquename="";
\r
132 option.Get("MessageBase",m_messagebase);
\r
133 m_lastchecked=Poco::Timestamp();
\r
136 template <class IDTYPE>
\r
137 void IIndexInserter<IDTYPE>::Process()
\r
139 if(m_lastchecked<(Poco::DateTime()-Poco::Timespan(0,0,1,0,0)))
\r
141 CheckForNeededInsert();
\r
142 m_lastchecked=Poco::DateTime();
\r
146 template <class IDTYPE>
\r
147 void IIndexInserter<IDTYPE>::RegisterWithThread(FreenetMasterThread *thread)
\r
149 thread->RegisterFCPConnected(this);
\r
150 thread->RegisterFCPMessageHandler(this);
\r
151 thread->RegisterPeriodicProcessor(this);
\r
154 template <class IDTYPE>
\r
155 void IIndexInserter<IDTYPE>::RemoveFromInsertList(const IDTYPE identityid)
\r
157 typename std::vector<IDTYPE>::iterator i=m_inserting.begin();
\r
158 while(i!=m_inserting.end() && (*i)!=identityid)
\r
162 if(i!=m_inserting.end())
\r
164 m_inserting.erase(i);
\r
168 #endif // _iindexrequester_
\r