|
Design Architecture for WORM
|
|
|
|
This document describes the basic architecture for a DAL and ORM layer.
|
|
This is a general treatment and unfinished.
|
|
|
|
The database abstaction layer consists of four functional components that share one point of
|
|
entry to the database (via. the driver).
|
|
1. Classes which offer and API for basic CRUD interaction with the database.
|
|
These include:
|
|
* WSqlDatabase - the sole point of access recommended; all raw/direct interaction with
|
|
the database should use an instance of this class - the API is intended to provide any
|
|
direct query actions, insertions, selection of datasets, etc.
|
|
* WSqlDriver - this is a base class to be implemented by adapters for specific datastore
|
|
engines (currently MySql5, Sqlite3 and PosrgreSQL adapters are implemented). This class
|
|
does all the heavy lifting behind the scenes for the WSqlDatabase API. It should not be
|
|
used directly.
|
|
* WSqlRecord - datasets (or result sets) are encapsulated by WSqlRecord; this class is
|
|
returned by the API for queries that return results (may be empty ..) - it is initialized and
|
|
managed by the driver which hands it to WSqlDatabase. Random access to sets of the
|
|
records is supported (if cached). This is also the prefered method of insertion or update
|
|
- an initialized WSqlRecord sent to the driver is the cleanest interaction.
|
|
WSqlRecord is basically a vector of WSqlFields with some convenience methods for seeking
|
|
in the columns.
|
|
* WSqlField - represents a single data column in a record consisting of a column name
|
|
and a value (ie. simple key/value data structure). It does _not_ contain metadata about
|
|
the value. The value is stored as a string of characters as received from the database.
|
|
The value can therefor be easily converted to native C++ data types using the convenience
|
|
methods provided.
|
|
This class is intended to provide a simple and efficient data transfer - not metadata; if
|
|
metadata about the database column, data type etc. is needed WSqlColumn is to be used.
|
|
* WSqlResult - this class represents a set of returned records (or records to be inserted/updated)
|
|
it is an internal managed cache object for the driver.
|
|
|
|
2. Classes which offer and API for obtaining metadata about the database schemata. These may
|
|
instantiated for access to metadata at runtime but are primarily for use by the ORM generator.
|
|
These include:
|
|
* WSqlCatalog - access to all schemata in the DBMS (unimplemented)
|
|
* WSqlSchema - access to a metadata for a single database
|
|
* WSqlTable - metadata for a single table
|
|
* WSqlColumn - metadata for a single column
|
|
* WSqlIndex - metadata for an index in a table
|
|
* WSqlForiegnKey - metadata for a foriegn key relationship
|
|
|
|
3. Classes which deal with generating ORM class object source code representing the metadata
|
|
for existing database schemata.
|
|
These include:
|
|
|
|
* TBD
|
|
|
|
4. Generated ORM classes and scaffolding providing an alternate CRUD vector. These class
|
|
object may be used directly for CRUD functions with no interaction with the DAL classes.
|
|
Eg.:
|
|
user = new User(); user->setName("joe"); user->save();
|
|
or
|
|
int id = 33; user = User::load(id); cout << user->name();
|
|
|