|
ImagingTools Core SDK
|
The imtdb library is a comprehensive Database Abstraction Layer (ORM-like framework) designed for managing database operations in ImtCore applications. It provides a complete ecosystem for multi-database support, object-relational mapping, transaction management, schema migrations, and metadata persistence.
The library addresses the following key requirements:
The imtdb architecture follows a layered approach with clear separation of concerns:
┌─────────────────────────────────────────────────────────────┐
│ Application Layer │
│ (IObjectCollection, Business Logic) │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ ORM Layer (Object-Relational Mapping) │
│ ISqlDatabaseObjectDelegate, CSqlDatabaseObjectDelegateComp│
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ SQL Generation Layer (Query Builders) │
│ CreateInsertQuery, CreateSelectQuery, CreateUpdateQuery │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ Database Engine Layer │
│ IDatabaseEngine, CDatabaseEngineComp │
│ (Transaction Management, Query Execution) │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ Qt SQL Driver Layer (QSqlDatabase) │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ Database Server (PostgreSQL, SQLite, Files) │
└─────────────────────────────────────────────────────────────┘
The interface layer defines the core abstractions for database management:
| Interface | Purpose |
|---|---|
| imtdb::IDatabaseEngine | Low-level SQL execution: transactions, query execution (static & from files), database/table creation |
| imtdb::IDatabaseConnector | Database connection lifecycle management (connect, disconnect, connection state) |
| imtdb::IDatabaseLoginSettings | Connection parameters: host, port, database name, username, password, file path |
| imtdb::IDatabaseObjectDelegate | Bridge between database and C++ objects; generates SQL queries for CRUD operations |
| imtdb::ISqlDatabaseObjectDelegate | Extended delegate: converts SQL records to objects, creates meta-information from records |
| imtdb::ISqlDatabaseObjectCollection | Manages collections of objects in SQL database with transaction control and filtering |
| imtdb::IMigrationController | Manages database schema versioning and executes migration scripts |
| imtdb::IDatabaseServerConnectionChecker | Verifies database server connectivity and health status |
| imtdb::IDependentMetaInfoController | Manages cascading metadata updates when related objects are deleted |
| imtdb::IJsonBasedMetaInfoDelegate | Converts object metadata to/from JSON representation |
| imtdb::IMetaInfoTableDelegate | Describes database table structure and metadata column mappings |
| imtdb::ISqlJsonXPathExtractor | Database-specific JSON field extraction (PostgreSQL vs SQLite dialects) |
| Component | Purpose |
|---|---|
| imtdb::CDatabaseEngineComp | Core database engine: manages connections, transactions, query execution, automatic database/table creation |
| imtdb::CDatabaseConnectorComp | Manages connections to remote database servers with credential handling |
| imtdb::CDatabaseAccessSettings | Stores and manages database connection credentials and settings |
| imtdb::CDatabaseAccessSettingsComp | Component wrapper for CDatabaseAccessSettings with ACF integration |
| imtdb::CDatabaseAutomaticBackupComp | Schedules periodic database backups with configurable retention policies |
| Component | Purpose |
|---|---|
| imtdb::CSqlDatabaseObjectCollectionComp | Core collection implementation: manages CRUD operations on object collections via SQL |
| imtdb::CSqlDatabaseObjectDelegateCompBase | Base implementation for object delegates: generates SQL queries for CRUD operations, handles filtering, sorting, and pagination |
| imtdb::CSqlDatabaseDocumentDelegateComp | Specialized delegate for document-based objects with JSON metadata, revision tracking, and dependent metadata management |
| imtdb::CSqlDatabaseDocumentDelegateLegacyComp | Legacy version of document delegate for backward compatibility |
| imtdb::CSqlJsonDatabaseDelegateComp | Extension supporting JSON-based object serialization and deserialization |
| imtdb::CSqliteDatabaseDocumentDelegateComp | SQLite-specific document delegate with dialect-specific SQL (LIMIT/OFFSET, JSON functions) |
| imtdb::CSqliteJsonDatabaseDelegateComp | SQLite-specific JSON delegate implementation |
| imtdb::CSqlDatabaseObjectCollectionIterator | Iterator for traversing SQL query results and converting records to objects |
| imtdb::CSqlDatabaseCollectionStructureIterator | Iterator for traversing hierarchical tree structures in database |
| Component | Purpose |
|---|---|
| imtdb::CJsonBasedMetaInfoDelegateComp | Abstract base for JSON ↔ MetaInfo conversion (subclasses implement specific representations) |
| imtdb::CStandardSqlMetaInfoTableDelegateComp | Defines metadata table schema and handles metadata field conversions |
| imtdb::CDependentTableMetaInfoControllerComp | Observes collection changes and triggers dependent metadata cleanup on deletions |
| Component | Purpose |
|---|---|
| imtdb::CPostgresXPathExtractorComp | PostgreSQL-specific JSON extraction using operators: ->, ->>, #> |
| imtdb::CSqliteXPathExtractorComp | SQLite-specific JSON extraction using functions: json_extract(), json_type() |
| imtdb::CComplexCollectionFilterConverter | Converts filter parameters (IParamsSet) to SQL WHERE clauses with proper escaping |
| imtdb::CSqlStructureDelegateCompBase | Base class for hierarchical structure management (tree nodes and leaves) |
| imtdb::CSqlStructureDelegateComp | Concrete implementation of structure delegate for tree-based data |
| Component | Purpose |
|---|---|
| imtdb::CMigrationControllerComp | Reads SQL migration scripts from folders and executes schema upgrades sequentially |
| imtdb::CMigrationControllerCompBase | Base migration logic with version range tracking and script execution |
| imtdb::CCompositeMigrationControllerComp | Combines multiple migration controllers with coordinated sequential execution |
| imtdb::CObjectCollectionMigrationControllerComp | Migration controller specialized for object collection schema changes |
| Component | Purpose |
|---|---|
| imtdb::CSqlDatabaseTransactionManagerComp | Coordinates ACID transactions across multiple collections with rollback support |
| imtdb::CRestoringDatabaseControllerComp | Database backup and restore using command-line tools (pg_dump, pg_restore) |
| imtdb::TMessageDatabaseDelegateComp | Template-based delegate for message/notification persistence |
The imtdb library extensively uses the Delegate pattern to separate collection logic from database-specific operations:
Base classes define algorithmic structure while subclasses provide specific implementations:
Uses ACF (Application Component Framework) for dependency injection:
I_BEGIN_COMPONENT / I_END_COMPONENTI_ASSIGN (references and attributes)Components observe changes and trigger cascading operations:
Adapters bridge between different abstraction layers:
Factory methods create objects based on runtime type information:
InsertNewObject(object) ↓ 1. Validate object data ↓ 2. CreateNewObjectQuery() - Generate SQL INSERT statement - Serialize object data (binary/JSON) - Create metadata JSON ↓ 3. Add operation context - User ID, timestamp - Operation description ↓ 4. ExecuteTransaction() - Begin transaction - Execute INSERT - Commit or rollback ↓ 5. Return generated object ID
GetObjectData(filters, sort, pagination)
↓
1. Build selection query
- CreateFilterQuery() → WHERE clause
- CreateSortQuery() → ORDER BY clause
- CreatePaginationQuery() → LIMIT/OFFSET
↓
2. ExecuteQuery(sql)
↓
3. For each record in result set:
a. CreateObjectFromRecord()
- Deserialize object data
b. CreateObjectInfoFromRecord()
- Extract metadata
- Parse JSON fields
↓
4. Return populated object collection
UpdateObject(objectId, newData) ↓ 1. Backup current revision (if enabled) - Serialize current state - Calculate checksum - Store in revision table ↓ 2. CreateUpdateQuery() - Generate SQL UPDATE - Update modified fields - Update LastModified timestamp ↓ 3. Update metadata - Increment revision number - Record operation context ↓ 4. ExecuteTransaction() ↓ 5. Notify observers (dependent metadata updates)
RemoveElements(objectIds) ↓ 1. For each object ID: ClearDependentMetaInfo(metaInfo) ↓ 2. Find dependent tables - Parse DataMetaInfo JSON - Identify referenced objects Example: Order objects referencing deleted Customer ↓ 3. Extract referencing object IDs - Query dependent tables - Find objects with references to deleted items ↓ 4. Update metadata JSON fields - Remove stale references - Update metadata timestamps ↓ 5. Execute batch updates - NULL out or remove dependent references - Preserve data integrity
DoMigration(targetVersion)
↓
1. GetMigrationRange()
- Determine current database version
- Calculate required migration steps
↓
2. For each version in range:
a. Load migration SQL script
- Read from configured folder
- Format: "migration_v001_to_v002.sql"
b. Validate script syntax
c. Begin transaction
d. Execute migration script
e. Update schema version table
f. Commit transaction
↓
3. Handle errors
- Rollback on failure
- Log migration errors
↓
4. Return final database version
CSqlDatabaseTransactionManagerComp::StartTransaction() ↓ 1. Disable internal transactions - Suspend auto-commit on all collections ↓ 2. DatabaseEngine.BeginTransaction() ↓ 3. Application performs operations - Multiple inserts/updates/deletes - Across multiple collections ↓ 4. EndTransaction(commit=true/false) ↓ 5. If commit: a. Execute accumulated SQL statements b. DatabaseEngine.FinishTransaction() c. Re-enable collection auto-transactions Else: a. DatabaseEngine.RollbackTransaction() b. Discard pending operations c. Re-enable collection auto-transactions
| Subsystem | Key Components | Purpose |
|---|---|---|
| Connection Management | IDatabaseEngine, CDatabaseEngineComp, CDatabaseConnectorComp | Connect/disconnect, manage database connections, execute raw SQL |
| Object Collections | CSqlDatabaseObjectCollectionComp, ISqlDatabaseObjectCollection | CRUD operations on object collections with filtering and pagination |
| Delegation & ORM | IDatabaseObjectDelegate, CSqlDatabaseObjectDelegateCompBase | SQL generation strategies, object-relational mapping |
| Document Management | CSqlDatabaseDocumentDelegateComp, CSqlJsonDatabaseDelegateComp | Serialization of complex objects, JSON-based document storage |
| Metadata System | IJsonBasedMetaInfoDelegate, CStandardSqlMetaInfoTableDelegateComp | Object metadata, attributes, custom fields |
| Revision Control | CSqlDatabaseDocumentDelegateComp (IRevisionController) | Audit trail, version history, object change tracking |
| Hierarchical Data | CSqlStructureDelegateCompBase, CSqlDatabaseCollectionStructureIterator | Tree-structured data, parent-child relationships |
| Schema Migrations | IMigrationController, CMigrationControllerComp | Database versioning, schema evolution, upgrade scripts |
| Transaction Management | CSqlDatabaseTransactionManagerComp | Multi-collection ACID transactions, coordinated commits |
| Backup & Restore | CRestoringDatabaseControllerComp, CDatabaseAutomaticBackupComp | Data persistence, disaster recovery, automated backups |
| JSON Operations | CPostgresXPathExtractorComp, CSqliteXPathExtractorComp | Database-agnostic JSON queries, field extraction |
| Dependent Data Management | CDependentTableMetaInfoControllerComp | Cascading updates, reference cleanup, referential integrity |
The imtdb library assumes specific database table structures for proper operation:
Each object collection typically has a table with these columns:
Extended metadata support (optional):
For audit trail functionality:
For tree structures:
✓ Pluggable database backends via delegate pattern
✓ Parameterized queries prevent SQL injection attacks
✓ Lazy loading for large datasets ✓ Pagination support (LIMIT/OFFSET) ✓ Indexed queries via metadata ✓ Batch operations for bulk inserts/updates ✓ Connection pooling (via Qt SQL layer) ✓ Transaction batching reduces round-trips
✓ Complex filters via IParamsSet without raw SQL:
✓ Complete revision history for objects ✓ User tracking for all modifications ✓ Timestamp tracking (created, modified) ✓ Checksum verification for data integrity ✓ Operation descriptions for audit logs ✓ Soft delete support (state column)
✓ Tree structures with parent-child relationships ✓ Recursive queries for descendants/ancestors ✓ Materialized paths for efficient traversal ✓ Level tracking for depth calculations ✓ Subtree operations (move, copy, delete)
✓ JSON-based metadata fields ✓ Custom attributes per object ✓ Dependent references tracking ✓ Cascading updates on deletions ✓ Schema-less extensions via JSON
✓ Version-controlled migrations from SQL scripts ✓ Sequential execution ensures consistency ✓ Rollback on failure maintains database integrity ✓ Multi-step migrations for complex changes ✓ Composite controllers for distributed schemas
The imtdb library provides a robust, flexible, and feature-rich database abstraction layer that:
The component-based architecture allows easy customization and extension while maintaining clean separation of concerns through well-defined interfaces and design patterns.