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]

Reply via email to