6.1 KiB
6.1 KiB
Data Storage & Persistence
Summary
MatterControl uses SQLite for persistent data storage with a simple ORM pattern. The Datastore singleton manages database connections, schema validation, and session tracking. Entity classes provide CRUD operations through the ISQLite interface.
Technical Description
Architecture
Datastore (singleton)
├── ISQLite interface (database operations)
├── Entity tables
│ ├── PrintItemCollection
│ ├── PrintItem
│ ├── PrintTask
│ ├── Printer
│ ├── PrinterSetting
│ ├── CustomCommands
│ ├── SliceSetting
│ ├── SliceSettingsCollection
│ ├── SystemSetting
│ ├── UserSetting
│ └── ApplicationSession
└── ApplicationDataStorage (paths)
Datastore Class
The Datastore singleton manages database lifecycle:
public class Datastore
{
public ISQLite dbSQLite;
private string datastoreLocation;
private ApplicationSession activeSession;
public void Initialize(ISQLite dbSQLite);
public void Exit();
public int RecordCount(string tableName);
}
Initialization:
- Check if database file exists (first run detection)
- Connect to SQLite database
- Validate/create schema tables
- Initialize root library collection
- Start application session
Entity Base Class
All database models inherit from Entity:
public class Entity
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public virtual void Commit(); // Insert or Update
public void Delete();
}
Commit Logic:
Id == 0: Insert new recordId != 0: Update existing record- Automatic retry on database lock
Database Tables
| Table | Purpose | Key Fields |
|---|---|---|
PrintItemCollection |
Library folders | Name, ParentCollectionId |
PrintItem |
Library items | Name, FileLocation, PrintItemCollectionId |
PrintTask |
Print job history | PrintName, PrintStart, PrintEnd, PercentDone |
Printer |
Printer definitions | Name (deprecated - use profiles) |
PrinterSetting |
Printer settings | Name, Value, PrinterId |
CustomCommands |
User macros | Name, Value, PrinterId |
SliceSetting |
Slice presets | Name, Value |
SliceSettingsCollection |
Setting groups | Name, Tag |
SystemSetting |
System config | Name, Value |
UserSetting |
User preferences | Name, Value |
ApplicationSession |
Session tracking | SessionStart, SessionEnd, PrintCount |
ApplicationDataStorage
Manages file system paths:
| Path | Purpose |
|---|---|
ApplicationDataPath |
Root data directory |
DatastorePath |
SQLite database file |
GCodeOutputPath |
Generated G-code files |
LibraryAssetsPath |
Library asset files |
ApplicationLibraryDataPath |
Library data |
ApplicationFontsDataPath |
Custom fonts |
CustomLibraryFoldersPath |
User library paths |
ProfilesPath |
Printer profiles |
Default Location:
- Windows:
%LOCALAPPDATA%\MatterControl - macOS:
~/Library/Application Support/MatterControl - Linux:
~/.local/share/MatterControl
Common Entity Models
PrintItem:
public class PrintItem : Entity
{
public string Name { get; set; }
public string FileLocation { get; set; }
public DateTime DateAdded { get; set; }
[Indexed]
public int PrintItemCollectionId { get; set; }
}
PrintTask:
public class PrintTask : Entity
{
public string PrintName { get; set; }
public DateTime PrintStart { get; set; }
public DateTime PrintEnd { get; set; }
public int PrintTimeSeconds { get; set; }
public double PercentDone { get; set; }
public bool PrintComplete { get; set; }
public string PrinterName { get; set; }
}
UserSetting:
public class UserSetting : Entity
{
[Indexed]
public string Name { get; set; }
public string Value { get; set; }
}
ISQLite Interface
Database operations abstracted for testability:
| Method | Description |
|---|---|
CreateTable<T>() |
Create table from type |
Insert(object) |
Insert record |
Update(object) |
Update record |
Delete(object) |
Delete record |
Table<T>() |
Query table |
ExecuteScalar<T>(sql) |
Execute scalar query |
Close() |
Close connection |
Session Tracking
ApplicationSession records usage:
public class ApplicationSession : Entity
{
public DateTime SessionStart { get; set; }
public DateTime SessionEnd { get; set; }
public int PrintCount { get; set; }
}
Design Rationale
SQLite: Chosen for:
- Zero configuration deployment
- Single-file database
- Cross-platform support
- ACID compliance
Entity Pattern: Simple ORM provides:
- Minimal boilerplate
- Type-safe queries
- Automatic schema management
Singleton Datastore: Ensures:
- Single database connection
- Coordinated access
- Clean shutdown
Reference
Core Classes
| Class | Location | Description |
|---|---|---|
Datastore |
DataStorage/Datastore.cs | Database manager |
Entity |
DataStorage/Models.cs | Base entity class |
ApplicationDataStorage |
DataStorage/ApplicationDataStorage.cs | Path management |
Entity Models
| Class | Location | Description |
|---|---|---|
PrintItem |
DataStorage/Models.cs | Library item |
PrintItemCollection |
DataStorage/Models.cs | Library folder |
PrintTask |
DataStorage/Models.cs | Print job record |
ApplicationSession |
DataStorage/Models.cs | Session data |
UserSetting |
DataStorage/Models.cs | User preference |
Database Attributes
| Attribute | Purpose |
|---|---|
[PrimaryKey] |
Primary key column |
[AutoIncrement] |
Auto-increment integer |
[Indexed] |
Create index on column |