2021/11/08/data objects refactoring

From Woozle Writes Code
Jump to navigation Jump to search

I'm making some changes to the data objects management system for #Ferreteria v0.5.

at present

Database instantiation is currently done by cDatabase::Instantiate(), which uses an internal static table to look up the cDatabase-descendant to instantiate from a slug returned by cDatabaseSpec->GetTypeString().

I suddenly realized that this makes no sense:

  • the cDatabaseSpec-descendant should just return the class it wants to use, from ->GetDatabaseClass()
  • cDatabaseSpec can instantiate directly, e.g. cMainDBSpec->MakeDatabase().
  • cDatabase should be named caDatabase, because it is abstract.

Also, Database-spec-class registration is currently done in ferreteria/data/db/0.php. This made some sense as a stopgap when I wasn't trying to properly handle app-specific databases or db-less tables, but that needs to change.


  • rename cDatabase to caDatabase
  • rename cDatabaseSpec to caDatabaseSpec
  • replace abstract caDataSpec->GetTypeString() method with caDatabaseSpec->GetDatabaseClass()
  • write caDatabaseSpec->MakeDatabase()
  • remove caDatabase->Instantiate()
  • add Database registry to csObjects:
    • AddDatabase(string $sSlug, caDatabase $db)
    • GetDatabase(string $sSlug) : caDatabase
  • registration of DB-spec classes should happen in a portable overrideable config file -- perhaps in cConfigWeb, in ferreteria/config/portable/defaults.php?

Note that the same database can (and probably should) be registered until multiple names, for easier separation of roles. For example, if the main database is the default database for application tables and also contains the user-access tables, then it could be registered as "*" (default), "main", and "users".