Skip to content

Commit 3883a47

Browse files
committed
docs: fix stale architecture references, shortcut conflict, and missing databases
1 parent 7152055 commit 3883a47

11 files changed

Lines changed: 152 additions & 206 deletions

File tree

TablePro/Resources/Localizable.xcstrings

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1772,6 +1772,7 @@
17721772
}
17731773
},
17741774
"AI Provider" : {
1775+
"extractionState" : "stale",
17751776
"localizations" : {
17761777
"vi" : {
17771778
"stringUnit" : {
@@ -2660,6 +2661,7 @@
26602661
}
26612662
},
26622663
"Cell Renderer" : {
2664+
"extractionState" : "stale",
26632665
"localizations" : {
26642666
"vi" : {
26652667
"stringUnit" : {
@@ -14397,6 +14399,7 @@
1439714399
}
1439814400
},
1439914401
"Sidebar Panel" : {
14402+
"extractionState" : "stale",
1440014403
"localizations" : {
1440114404
"vi" : {
1440214405
"stringUnit" : {
@@ -14570,6 +14573,7 @@
1457014573
}
1457114574
},
1457214575
"SQL Dialect" : {
14576+
"extractionState" : "stale",
1457314577
"localizations" : {
1457414578
"vi" : {
1457514579
"stringUnit" : {

docs/development/architecture.mdx

Lines changed: 38 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -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

docs/development/setup.mdx

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -79,44 +79,39 @@ open TablePro.xcodeproj
7979
<Tree>
8080
<Tree.Folder name="tablepro" defaultOpen>
8181
<Tree.Folder name="TablePro" defaultOpen>
82-
<Tree.Folder name="Models">
83-
<Tree.File name="DatabaseConnection.swift" />
84-
<Tree.File name="QueryResult.swift" />
85-
<Tree.File name="TableInfo.swift" />
86-
<Tree.File name="AppSettings.swift" />
82+
<Tree.Folder name="Core" defaultOpen>
83+
<Tree.Folder name="Database">
84+
<Tree.File name="DatabaseDriver.swift" />
85+
<Tree.File name="DatabaseManager.swift" />
86+
</Tree.Folder>
87+
<Tree.Folder name="Plugins">
88+
<Tree.File name="PluginDriverAdapter.swift" />
89+
<Tree.File name="PluginManager.swift" />
90+
</Tree.Folder>
91+
<Tree.Folder name="Services" />
92+
<Tree.Folder name="Utilities" />
8793
</Tree.Folder>
94+
<Tree.Folder name="Models" />
8895
<Tree.Folder name="Views">
8996
<Tree.Folder name="Connection" />
9097
<Tree.Folder name="Editor" />
98+
<Tree.Folder name="Main" />
9199
<Tree.Folder name="Results" />
92-
<Tree.Folder name="Structure" />
93100
<Tree.Folder name="Settings" />
94101
</Tree.Folder>
95-
<Tree.Folder name="ViewModels">
96-
<Tree.File name="DatabaseManager.swift" />
97-
</Tree.Folder>
98-
<Tree.Folder name="Core">
99-
<Tree.Folder name="Database">
100-
<Tree.File name="DatabaseDriver.swift" />
101-
<Tree.File name="MySQLDriver.swift" />
102-
<Tree.File name="PostgreSQLDriver.swift" />
103-
<Tree.File name="SQLiteDriver.swift" />
104-
</Tree.Folder>
105-
<Tree.Folder name="Autocomplete">
106-
<Tree.File name="CompletionEngine.swift" />
107-
<Tree.File name="SQLContextAnalyzer.swift" />
108-
<Tree.File name="SQLKeywords.swift" />
109-
</Tree.Folder>
110-
<Tree.Folder name="SSH">
111-
<Tree.File name="SSHTunnelManager.swift" />
112-
</Tree.Folder>
113-
</Tree.Folder>
102+
<Tree.Folder name="ViewModels" />
114103
<Tree.Folder name="Extensions" />
115-
<Tree.Folder name="Theme">
116-
<Tree.File name="Theme.swift" />
117-
</Tree.Folder>
104+
<Tree.Folder name="Theme" />
118105
<Tree.Folder name="Resources" />
119106
</Tree.Folder>
107+
<Tree.Folder name="Plugins" defaultOpen>
108+
<Tree.Folder name="TableProPluginKit" />
109+
<Tree.Folder name="MySQLDriverPlugin" />
110+
<Tree.Folder name="PostgreSQLDriverPlugin" />
111+
<Tree.Folder name="SQLiteDriverPlugin" />
112+
<Tree.Folder name="ClickHouseDriverPlugin" />
113+
<Tree.Folder name="..." />
114+
</Tree.Folder>
120115
<Tree.Folder name="TableProTests" />
121116
<Tree.Folder name="Libs" />
122117
<Tree.Folder name="scripts">
@@ -285,10 +280,11 @@ logger.error("Failed to connect: \(error.localizedDescription)")
285280

286281
### Adding a Database Feature
287282

288-
1. Implement in the appropriate driver (`MySQLDriver.swift`, etc.)
289-
2. Add to `DatabaseDriver` protocol if generic
290-
3. Add UI in relevant view components
291-
4. Add tests
283+
1. Create a new plugin bundle under `Plugins/`, or modify an existing driver plugin
284+
2. Implement `PluginDatabaseDriver` protocol methods
285+
3. Update `PluginDriverAdapter` if bridging new protocol methods
286+
4. Add UI in relevant view components
287+
5. Add tests
292288

293289
### Modifying Settings
294290

docs/features/keyboard-shortcuts.mdx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ TablePro is keyboard-driven. Most actions have shortcuts, and most menu shortcut
5151

5252
| Action | Shortcut |
5353
|--------|----------|
54-
| Go to line | `Cmd+Shift+L` |
5554
| Go to beginning | `Cmd+Up` |
5655
| Go to end | `Cmd+Down` |
5756
| Move line up | `Option+Up` |

docs/index.mdx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
title: Introduction
3-
description: Native macOS database client supporting MySQL, PostgreSQL, SQLite, MongoDB, and Redshift with AI SQL assistance
3+
description: Native macOS database client supporting MySQL, PostgreSQL, SQLite, MongoDB, Redis, SQL Server, ClickHouse, Oracle, and Redshift with AI SQL assistance
44
---
55

66
# TablePro
@@ -28,7 +28,7 @@ A native macOS database client. Fast, lightweight, with built-in AI SQL assistan
2828
Swift and Apple-native frameworks. No Electron, no web views. Just the responsiveness you expect from a real Mac app.
2929
</Card>
3030
<Card title="Multiple Databases" icon="database">
31-
MySQL, MariaDB, PostgreSQL, SQLite, MongoDB, and Amazon Redshift in one interface.
31+
MySQL, MariaDB, PostgreSQL, SQLite, MongoDB, Redis, SQL Server, ClickHouse, Oracle, and Amazon Redshift in one interface.
3232
</Card>
3333
<Card title="Smart Autocomplete" icon="wand-magic-sparkles">
3434
Context-aware SQL autocomplete that knows your schema, tables, columns, and SQL syntax.
@@ -75,12 +75,16 @@ Write queries in plain English, get Copilot-style inline suggestions, and right-
7575
| SQLite | Fully Supported | N/A (file-based) |
7676
| Amazon Redshift | Fully Supported | 5439 |
7777
| MongoDB | Fully Supported | 27017 |
78+
| Redis | Fully Supported | 6379 |
79+
| Microsoft SQL Server | Fully Supported | 1433 |
80+
| ClickHouse | Fully Supported | 8123 |
81+
| Oracle Database | Fully Supported | 1521 |
7882

7983
## System Requirements
8084

8185
- **macOS**: 14.0 (Sonoma) or later
8286
- **Architecture**: Apple Silicon (arm64) or Intel (x86_64)
83-
- **Storage**: ~50 MB for the application
87+
- **Storage**: ~50 MB for the application (~200 MB recommended free disk space including data)
8488

8589
## Getting Started
8690

docs/installation.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ description: Install TablePro via Homebrew or DMG on macOS 14.0+
1414
| **macOS Version** | macOS 14.0 (Sonoma) or later |
1515
| **Processor** | Apple Silicon (M1/M2/M3/M4/M5) or Intel x86_64 |
1616
| **Memory** | 4 GB RAM minimum |
17-
| **Storage** | ~200 MB free disk space |
17+
| **Storage** | ~200 MB free disk space (app is ~50 MB; extra space for query history, tab state, and plugins) |
1818

1919
### Recommended
2020

0 commit comments

Comments
 (0)