-
-
Notifications
You must be signed in to change notification settings - Fork 301
Expand file tree
/
Copy pathLibSQLPlugin.swift
More file actions
131 lines (120 loc) · 5.28 KB
/
Copy pathLibSQLPlugin.swift
File metadata and controls
131 lines (120 loc) · 5.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//
// LibSQLPlugin.swift
// TablePro
//
import Foundation
import os
import TableProPluginKit
final class LibSQLPlugin: NSObject, TableProPlugin, DriverPlugin {
static let pluginName = "libSQL / Turso Driver"
static let pluginVersion = "1.0.0"
static let pluginDescription = "libSQL and Turso database support via Hrana HTTP protocol"
static let capabilities: [PluginCapability] = [.databaseDriver]
static let databaseTypeId = "libSQL"
static let additionalDatabaseTypeIds = ["Turso"]
static let databaseDisplayName = "libSQL / Turso"
static let iconName = "libsql-icon"
static let defaultPort = 0
// MARK: - UI/Capability Metadata
static let connectionMode: ConnectionMode = .apiOnly
static let requiresAuthentication = false
static let supportsSSH = false
static let supportsSSL = false
static let isDownloadable = true
static let supportsImport = false
static let supportsSchemaEditing = true
static let supportsTriggers = true
static let supportsTriggerEditing = true
static let supportsDropDatabase = false
static let supportsDatabaseSwitching = false
static let databaseGroupingStrategy: GroupingStrategy = .flat
static let brandColorHex = "#4FF8D2"
static let urlSchemes: [String] = ["libsql"]
static let explainVariants: [ExplainVariant] = [
ExplainVariant(id: "plan", label: "Query Plan", sqlPrefix: "EXPLAIN QUERY PLAN")
]
static let structureColumnFields: [StructureColumnField] = [.name, .type, .nullable, .defaultValue]
static let columnTypesByCategory: [String: [String]] = [
"Integer": ["INTEGER", "INT", "TINYINT", "SMALLINT", "MEDIUMINT", "BIGINT"],
"Float": ["REAL", "DOUBLE", "FLOAT", "NUMERIC", "DECIMAL"],
"String": ["TEXT", "VARCHAR", "CHARACTER", "CHAR", "CLOB", "NVARCHAR", "NCHAR"],
"Date": ["DATE", "TIME", "DATETIME", "TIMESTAMP"],
"Binary": ["BLOB"],
"Boolean": ["BOOLEAN"]
]
static let sqlDialect: SQLDialectDescriptor? = SQLDialectDescriptor(
identifierQuote: "\"",
keywords: [
"SELECT", "FROM", "WHERE", "JOIN", "INNER", "LEFT", "RIGHT", "OUTER", "CROSS",
"ON", "AND", "OR", "NOT", "IN", "LIKE", "GLOB", "BETWEEN", "AS",
"ORDER", "BY", "GROUP", "HAVING", "LIMIT", "OFFSET",
"INSERT", "INTO", "VALUES", "UPDATE", "SET", "DELETE",
"CREATE", "ALTER", "DROP", "TABLE", "INDEX", "VIEW", "TRIGGER",
"PRIMARY", "KEY", "FOREIGN", "REFERENCES", "UNIQUE", "CONSTRAINT",
"ADD", "COLUMN", "RENAME",
"NULL", "IS", "ASC", "DESC", "DISTINCT", "ALL",
"CASE", "WHEN", "THEN", "ELSE", "END", "COALESCE", "IFNULL", "NULLIF",
"UNION", "INTERSECT", "EXCEPT",
"AUTOINCREMENT", "WITHOUT", "ROWID", "PRAGMA",
"REPLACE", "ABORT", "FAIL", "IGNORE", "ROLLBACK",
"TEMP", "TEMPORARY", "VACUUM", "EXPLAIN", "QUERY", "PLAN"
],
functions: [
"COUNT", "SUM", "AVG", "MAX", "MIN", "GROUP_CONCAT", "TOTAL",
"LENGTH", "SUBSTR", "SUBSTRING", "LOWER", "UPPER", "TRIM", "LTRIM", "RTRIM",
"REPLACE", "INSTR", "PRINTF",
"DATE", "TIME", "DATETIME", "JULIANDAY", "STRFTIME",
"ABS", "ROUND", "RANDOM",
"CAST", "TYPEOF",
"COALESCE", "IFNULL", "NULLIF", "HEX", "QUOTE"
],
dataTypes: [
"INTEGER", "REAL", "TEXT", "BLOB", "NUMERIC",
"INT", "TINYINT", "SMALLINT", "MEDIUMINT", "BIGINT",
"UNSIGNED", "BIG", "INT2", "INT8",
"CHARACTER", "VARCHAR", "VARYING", "NCHAR", "NATIVE",
"NVARCHAR", "CLOB",
"DOUBLE", "PRECISION", "FLOAT",
"DECIMAL", "BOOLEAN", "DATE", "DATETIME"
],
tableOptions: [
"WITHOUT ROWID", "STRICT"
],
regexSyntax: .unsupported,
booleanLiteralStyle: .numeric,
likeEscapeStyle: .explicit,
paginationStyle: .limit
)
static let additionalConnectionFields: [ConnectionField] = [
ConnectionField(
id: "libsqlMode",
label: String(localized: "Connection Mode"),
defaultValue: "remote",
fieldType: .dropdown(options: [
ConnectionField.DropdownOption(value: "remote", label: String(localized: "Remote (Turso)")),
ConnectionField.DropdownOption(value: "local", label: String(localized: "Local File"))
]),
section: .authentication,
hidesPassword: true
),
ConnectionField(
id: "databaseUrl",
label: String(localized: "Database URL"),
placeholder: "https://your-db.turso.io",
required: true,
section: .authentication,
visibleWhen: FieldVisibilityRule(fieldId: "libsqlMode", values: ["remote"])
),
ConnectionField(
id: "libsqlFilePath",
label: String(localized: "Database File"),
placeholder: "/path/to/database.db",
required: true,
section: .authentication,
visibleWhen: FieldVisibilityRule(fieldId: "libsqlMode", values: ["local"])
)
]
func createDriver(config: DriverConnectionConfig) -> any PluginDatabaseDriver {
LibSQLPluginDriver(config: config)
}
}