I have attached a simplification of this proposal which I believe
encapsulates most of the ways it improves on the original design, but
still leaves a pretty simple interface.
[I couldn't think of a sensible way to put this into the reviewboard
stream sorry]
This is still pretty rough so don't take the detailed types too
seriously; I think it might well be better in this scheme to have the
original hierarchy of handles as suggested in the original proposal.
Andrew
#include <stdint.h>
#include <string>
using std::string;
namespace qpid {
namespace broker {
class BrokerContext;
class AsyncHandle {
public:
AsyncHandle(BrokerContext*);
virtual ~AsyncHandle() = 0;
};
class DataSource {
public:
virtual ~DataSource() = 0;
virtual uint64_t getSize() = 0;
virtual void write(char* target) = 0;
};
class AsyncResult;
class ResultFactory {
public:
virtual AsyncResult* createSuccessResult(AsyncHandle*) = 0;
virtual AsyncResult* createFailureResult(AsyncHandle*, const int errNo, const std::string& errMsg) = 0;
};
typedef void (*ResultCallback)(AsyncResult*);
class StoreAsyncInterface {
public:
StoreAsyncInterface();
virtual ~StoreAsyncInterface() = 0;
virtual AsyncHandle* createDataHandle(BrokerContext*, DataSource& data) = 0;
// Next line lightly editted to make it compile - add the last parameter back in in your head!
virtual AsyncHandle* createQueueHandle(BrokerContext*, const std::string& queueName /*, const qpid::types::Variant::Map& queueOptions*/) = 0;
virtual AsyncHandle* createConfigHandle(BrokerContext*) = 0;
virtual AsyncHandle* createFlushHandle(BrokerContext*) = 0;
virtual AsyncHandle* createTxnHandle(BrokerContext*, const std::string& xid=std::string()) = 0;
virtual AsyncHandle* createEventHandle(BrokerContext*) = 0;
virtual AsyncHandle* createEnqueueHandle(BrokerContext*) = 0;
virtual void submitStoreConfig(AsyncHandle* cfgHndl, const AsyncHandle* dataHndl, ResultCallback*) = 0;
virtual void submitDestroyConfig(AsyncHandle* cfgHndl, ResultCallback*) = 0;
virtual void submitCreateQueue(AsyncHandle* queueHndl, ResultCallback*) = 0;
virtual void submitDestroyQueue(AsyncHandle* queueHndl, ResultCallback*) = 0;
virtual void submitFlushQueue(AsyncHandle* flushHndl, const AsyncHandle* queueHndl, ResultCallback*) = 0;
virtual void submitBeginTxn(AsyncHandle* txnHndl, ResultCallback*) = 0;
virtual void submitPrepareTxn(AsyncHandle* txnHndl, ResultCallback*) = 0;
virtual void submitCommitTxn(AsyncHandle* txnHndl, ResultCallback*) = 0;
virtual void submitAbortTxn(AsyncHandle* txnHndl, ResultCallback*) = 0;
virtual void submitStoreEvent(AsyncHandle* eventHndl, const AsyncHandle* dataHndl, const AsyncHandle* queueHndl, const AsyncHandle* txnHndl, ResultCallback*) = 0;
virtual void submitEnqueueMsg(AsyncHandle* enqHndl, const AsyncHandle* dataHndl, const AsyncHandle* queueHndl, const AsyncHandle* txnHndl, ResultCallback*) = 0;
virtual void submitDequeueMsg(AsyncHandle* enqHndl, const AsyncHandle* txnHndl, ResultCallback*) = 0;
// Legacy - Restore FTD message, is NOT async!
virtual int loadContent(AsyncHandle* enqHndl, const AsyncHandle* queueHndl, char* data, uint64_t offset, const uint64_t length) = 0;
};
}}
---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project: http://qpid.apache.org
Use/Interact: mailto:[email protected]