@@ -58,46 +58,35 @@ CodeEditSourceEditor bundles a SwiftLint plugin that requires `-skipPackagePlugi
5858
5959<Tree >
6060 <Tree.Folder name = " TablePro" defaultOpen >
61- <Tree.Folder name = " Models" >
62- <Tree.File name = " DatabaseConnection.swift" />
63- <Tree.File name = " QueryResult.swift" />
64- <Tree.File name = " TableInfo.swift" />
65- <Tree.File name = " AppSettings.swift" />
66- </Tree.Folder >
67- <Tree.Folder name = " Views" >
68- <Tree.Folder name = " Main" />
69- <Tree.Folder name = " Connection" />
70- <Tree.Folder name = " Editor" />
71- <Tree.Folder name = " Results" />
72- <Tree.Folder name = " Structure" />
73- <Tree.Folder name = " Settings" />
74- <Tree.Folder name = " Welcome" />
75- </Tree.Folder >
76- <Tree.Folder name = " ViewModels" >
77- <Tree.File name = " DatabaseManager.swift" />
78- </Tree.Folder >
7961 <Tree.Folder name = " Core" >
8062 <Tree.Folder name = " Database" >
8163 <Tree.File name = " DatabaseDriver.swift" />
82- <Tree.File name = " MySQLDriver.swift" />
83- <Tree.File name = " PostgreSQLDriver.swift" />
84- <Tree.File name = " SQLiteDriver.swift" />
85- </Tree.Folder >
86- <Tree.Folder name = " Autocomplete" >
87- <Tree.File name = " CompletionEngine.swift" />
88- <Tree.File name = " SQLContextAnalyzer.swift" />
89- <Tree.File name = " SQLKeywords.swift" />
64+ <Tree.File name = " DatabaseManager.swift" />
9065 </Tree.Folder >
91- <Tree.Folder name = " SSH" >
92- <Tree.File name = " SSHTunnelManager.swift" />
66+ <Tree.Folder name = " Plugins" >
67+ <Tree.File name = " PluginManager.swift" />
68+ <Tree.File name = " PluginDriverAdapter.swift" />
9369 </Tree.Folder >
70+ <Tree.Folder name = " Autocomplete" />
71+ <Tree.Folder name = " Services" />
72+ <Tree.Folder name = " SSH" />
9473 </Tree.Folder >
74+ <Tree.Folder name = " Views" />
75+ <Tree.Folder name = " Models" />
76+ <Tree.Folder name = " ViewModels" />
9577 <Tree.Folder name = " Extensions" />
96- <Tree.Folder name = " Theme" >
97- <Tree.File name = " Theme.swift" />
98- </Tree.Folder >
78+ <Tree.Folder name = " Theme" />
9979 <Tree.Folder name = " Resources" />
10080 </Tree.Folder >
81+ <Tree.Folder name = " Plugins" defaultOpen >
82+ <Tree.Folder name = " TableProPluginKit" />
83+ <Tree.Folder name = " MySQLDriverPlugin" />
84+ <Tree.Folder name = " PostgreSQLDriverPlugin" />
85+ <Tree.File name = " ..." />
86+ </Tree.Folder >
87+ <Tree.Folder name = " Libs" />
88+ <Tree.Folder name = " TableProTests" />
89+ <Tree.Folder name = " scripts" />
10190</Tree >
10291
10392## Design Patterns
@@ -163,13 +152,7 @@ protocol DatabaseDriver: AnyObject {
163152}
164153```
165154
166- Implementations:
167-
168- ``` swift
169- class MySQLDriver : DatabaseDriver { ... }
170- class PostgreSQLDriver : DatabaseDriver { ... }
171- class SQLiteDriver : DatabaseDriver { ... }
172- ```
155+ Database drivers are implemented as ` .tableplugin ` bundles loaded at runtime. Each plugin implements ` DriverPlugin ` and ` PluginDatabaseDriver ` from the shared ` TableProPluginKit ` framework. ` PluginDriverAdapter ` bridges ` PluginDatabaseDriver ` to the core ` DatabaseDriver ` protocol.
173156
174157### Actor Isolation
175158
@@ -191,24 +174,9 @@ actor SSHTunnelManager {
191174}
192175```
193176
194- ### Factory Pattern
195-
196- Driver creation uses a factory:
177+ ### Plugin System
197178
198- ``` swift
199- enum DatabaseDriverFactory {
200- static func createDriver (for connection : DatabaseConnection) -> DatabaseDriver {
201- switch connection.type {
202- case .mysql , .mariadb :
203- return MySQLDriver (connection : connection)
204- case .postgresql :
205- return PostgreSQLDriver (connection : connection)
206- case .sqlite :
207- return SQLiteDriver (connection : connection)
208- }
209- }
210- }
211- ```
179+ Driver creation uses a plugin-based factory. ` PluginManager ` discovers and loads ` .tableplugin ` bundles at runtime. ` DatabaseDriverFactory ` looks up plugins via ` DatabaseType.pluginTypeId ` and wraps them with ` PluginDriverAdapter ` to conform to the core ` DatabaseDriver ` protocol. No switch statement or hardcoded driver list is needed.
212180
213181## Key Components
214182
@@ -235,15 +203,20 @@ class DatabaseManager: ObservableObject {
235203}
236204```
237205
238- ### Database Drivers
206+ ### Database Driver Plugins
239207
240- Each driver wraps database-specific logic :
208+ Each driver is a ` .tableplugin ` bundle under ` Plugins/ ` :
241209
242- | Driver | Library | Protocol |
243- | --------| ---------| ----------|
244- | MySQLDriver | libmariadb | MySQL wire protocol |
245- | PostgreSQLDriver | libpq | PostgreSQL protocol |
246- | SQLiteDriver | Built-in SQLite3 | File-based |
210+ | Plugin | Database Types | C Bridge |
211+ | --------| ---------------| ----------|
212+ | MySQLDriverPlugin | MySQL, MariaDB | CMariaDB (libmariadb) |
213+ | PostgreSQLDriverPlugin | PostgreSQL, Redshift | CLibPQ (libpq) |
214+ | SQLiteDriverPlugin | SQLite | Foundation sqlite3 |
215+ | ClickHouseDriverPlugin | ClickHouse | URLSession HTTP |
216+ | MSSQLDriverPlugin | SQL Server | CFreeTDS |
217+ | MongoDBDriverPlugin | MongoDB | CLibMongoc |
218+ | RedisDriverPlugin | Redis | CRedis |
219+ | OracleDriverPlugin | Oracle | OracleNIO (SPM) |
247220
248221### Autocomplete Engine
249222
@@ -293,11 +266,10 @@ flowchart TB
293266 Form --> Manager["DatabaseManager<br>.connectToSession"]
294267 Manager --> SSH["SSHTunnelManager"]
295268 Manager --> Factory["DatabaseDriverFactory"]
296- Factory --> MySQL["MySQL Driver "]
297- Factory --> Postgres["Postgres Driver "]
269+ Factory --> Plugin["PluginManager<br>(loads .tableplugin) "]
270+ Plugin --> Adapter["PluginDriverAdapter "]
298271 SSH --> Connected["Connection Established"]
299- MySQL --> Connected
300- Postgres --> Connected
272+ Adapter --> Connected
301273
302274 subgraph optional ["if SSH enabled"]
303275 SSH
0 commit comments