Requirements

  • basic abstraction of connections, drivers, transactions…
  • no abstraction of queries → there are quite a few alternatives if this is needed
  1. > use existing layer? FIXME

Design

Interfaces

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;
	};
 
}
}

Drivers

  • sqlite

Examples

 
component/yakedb.txt · Last modified: 2008/02/21 21:54 (external edit)
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki