The library is based on a set of ADTs which describe the functionality of the library in an abstract manner. These ADTs are then implemented for the particular database engines and compilers supported by the library. Implementations of the API interface for a particular compiler-currently just the one for SmallEiffel. Classes implementing the eSQL ADTs in terms of the API interface. Extra classes which provide functionality specific to the particular database engine.
Data sources have the capability to provide some sort of textual error descriptions.
Queries which produce no results can be distinguished from those that produce an empty result set. Result sets can be retrieved a row at a time. Columns in a result set have a name. For any particular engine, a single class will be defined which will implement all the ADTs that the engine is capable of supporting. Despite the general dislike for downcasting in the OO community, I believe this to be a sound application of the technique, and I believe it will minimize maintenance problems down the road.