
Proposal:
namespace yake { namespace db { struct DbException : public std::exception { //... }; enum ValueType { DBVT_INT, DBVT_STRING, DBVT_BOOL, DBVT_BINARY, DBVT_DATE, DBVT_OTHER }; class DbResource { public: virtual ~DbResource() {} }; class IValue : public DbResource { public: virtual ValueType getType() const = 0; virtual void asString( String& rRet ) const = 0; virtual String asString() const = 0; virtual bool asBool() const = 0; virtual int32 asInt32() const = 0; virtual void asBinary( DataChunk& rRet ) const = 0; }; class IResultSet : public DbResource { public: virtual void getNextRow( ValueList& rValues ) throw DbException = 0; virtual size_t getNumRowsTotal() const = 0; virtual size_t getNumRowsRemaining() const = 0; }; class IOperation : public DbResource { IOperation(); IOperation(const IOperation&); public: class ICallableStatement : public Operation { public: }; class IPreparedStatement : public Operation { public: }; virtual void execute( const String& rQuery ) = 0; virtual IResultSetWeakPtr executeQuery( const String& rQuery ) = 0; virtual IResultSetWeakPtr getResultSet() const = 0; virtual size_t getNumAffectedRows() const = 0; }; class IConnection : public DbResource { public: virtual void beginTransaction() throw DbException = 0; virtual void commitTransaction() throw DbException = 0; virtual void rollbackTransaction() throw DbException = 0; virtual void createOperation(...) throw DbException = 0; virtual void destroyOperation(...) throw DbException = 0; virtual void addOperationToQueue( ...) throw DbException = 0; }; class Driver { public: virtual void createConnection( const String& rDsn ) throw DbException = 0; virtual void closeConnection( IConnectionWeakPtr& conn ) throw DbException = 0; typedef Signal1< IConnectionWeakPtr > ConnectionSignal; virtual void subscribeToConnectionCreated( const ConnectionSignal::slot_type& slot ) = 0; }; } }