Skip to content

Commit ddacea5

Browse files
committed
feat(app,main): initial support for postgres & mysql
1 parent 8205329 commit ddacea5

12 files changed

Lines changed: 259 additions & 35 deletions

File tree

.vscode/settings.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@
4646
"editor.formatOnSave": true
4747
},
4848
"cSpell.words": [
49+
"airi",
4950
"Deditor",
51+
"duckdb",
5052
"Splitpanes",
5153
"vueuse"
5254
]

electron.vite.config.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ export default defineConfig({
88
include: [
99
'drizzle-orm',
1010
'drizzle-orm/postgres-js',
11+
'drizzle-orm/mysql2',
1112
'postgres',
13+
'mysql2',
1214
],
1315
})],
1416
},
@@ -17,7 +19,9 @@ export default defineConfig({
1719
include: [
1820
'drizzle-orm',
1921
'drizzle-orm/postgres-js',
22+
'drizzle-orm/mysql2',
2023
'postgres',
24+
'mysql2',
2125
],
2226
})],
2327
},

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444
"@xsai-transformers/shared": "^0.0.6",
4545
"@xsai/embed": "^0.2.2",
4646
"@xsai/shared": "^0.2.2",
47+
"mysql2": "^3.14.1",
48+
"nanoid": "^5.1.5",
4749
"ofetch": "^1.4.1",
4850
"splitpanes": "^4.0.3",
4951
"std-env": "^3.9.0",

pnpm-lock.yaml

Lines changed: 81 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/databases/remote/mysql.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import type { MySql2Database } from 'drizzle-orm/mysql2'
2+
import type { BrowserWindow } from 'electron'
3+
4+
import { drizzle } from 'drizzle-orm/mysql2'
5+
import { ipcMain } from 'electron'
6+
7+
import { nanoid } from '../../utils/nanoid'
8+
9+
const databaseSessions = new Map<string, MySql2Database>()
10+
11+
export function registerMySQL2DatabaseDialect(window: BrowserWindow) {
12+
ipcMain.on('request:connect-remote-database-mysql2', (_, databaseDsn: string) => {
13+
try {
14+
const dbSession = drizzle(databaseDsn)
15+
const dbSessionId = nanoid()
16+
databaseSessions.set(dbSessionId, dbSession)
17+
18+
// eslint-disable-next-line no-console
19+
dbSession.execute('SELECT 1').then(res => console.log(res))
20+
window.webContents.send('response:connect-remote-database-mysql2', { databaseSessionId: dbSessionId, dialect: 'mysql2' })
21+
}
22+
catch (err) {
23+
window.webContents.send('response:error:connect-remote-database-mysql2', err)
24+
}
25+
})
26+
27+
ipcMain.on('request:query-remote-database-mysql2', (_, { databaseSessionId, statement }: { databaseSessionId: string, statement: string, params: any[] }) => {
28+
if (!databaseSessions.has(databaseSessionId)) {
29+
window.webContents.send('response:error:query-remote-database-mysql2', new Error('Database session ID not found in session map, please connect to the database first.'))
30+
return
31+
}
32+
33+
const dbSession = databaseSessions.get(databaseSessionId)!
34+
dbSession.execute(statement)
35+
.then((res) => {
36+
window.webContents.send('response:query-remote-database-mysql2', { databaseSessionId, results: res })
37+
})
38+
.catch((err) => {
39+
window.webContents.send('response:error:query-remote-database-mysql2', { databaseSessionId, error: err })
40+
})
41+
})
42+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import type { PostgresJsDatabase } from 'drizzle-orm/postgres-js'
2+
import type { BrowserWindow } from 'electron'
3+
4+
import { drizzle } from 'drizzle-orm/postgres-js'
5+
import { ipcMain } from 'electron'
6+
7+
import { nanoid } from '../../utils/nanoid'
8+
9+
const databaseSessions = new Map<string, PostgresJsDatabase>()
10+
11+
export function registerPostgresJsDatabaseDialect(window: BrowserWindow) {
12+
ipcMain.on('request:connect-remote-database', (_, databaseDsn: string) => {
13+
try {
14+
const dbSession = drizzle(databaseDsn)
15+
const dbSessionId = nanoid()
16+
databaseSessions.set(dbSessionId, dbSession)
17+
18+
// eslint-disable-next-line no-console
19+
dbSession.execute('SELECT 1').then(res => console.log(res))
20+
window.webContents.send('response:connect-remote-database', { databaseSessionId: dbSessionId, dialect: 'postgres' })
21+
}
22+
catch (err) {
23+
window.webContents.send('response:error:connect-remote-database', err)
24+
}
25+
})
26+
27+
ipcMain.on('request:query-remote-database', (_, { databaseSessionId, statement }: { databaseSessionId: string, statement: string, params: any[] }) => {
28+
if (!databaseSessions.has(databaseSessionId)) {
29+
window.webContents.send('response:error:query-remote-database', new Error('Database session ID not found in session map, please connect to the database first.'))
30+
return
31+
}
32+
33+
const dbSession = databaseSessions.get(databaseSessionId)!
34+
dbSession.execute(statement)
35+
.then((res) => {
36+
window.webContents.send('response:query-remote-database', { databaseSessionId, results: res })
37+
})
38+
.catch((err) => {
39+
window.webContents.send('response:error:query-remote-database', { databaseSessionId, error: err })
40+
})
41+
})
42+
}

0 commit comments

Comments
 (0)