@sqlrooms/duckdb 0.29.0-rc.7 → 0.29.0-rc.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +2 -1
- package/README.md +61 -4
- package/dist/DuckDbSlice.d.ts +20 -5
- package/dist/DuckDbSlice.d.ts.map +1 -1
- package/dist/DuckDbSlice.js +136 -49
- package/dist/DuckDbSlice.js.map +1 -1
- package/dist/connectors/WasmDuckDbConnector.d.ts.map +1 -1
- package/dist/connectors/WasmDuckDbConnector.js +8 -0
- package/dist/connectors/WasmDuckDbConnector.js.map +1 -1
- package/dist/connectors/WebSocketDuckDbConnector.d.ts +23 -0
- package/dist/connectors/WebSocketDuckDbConnector.d.ts.map +1 -1
- package/dist/connectors/WebSocketDuckDbConnector.js +62 -0
- package/dist/connectors/WebSocketDuckDbConnector.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/loadTableSchemas.d.ts +2 -0
- package/dist/loadTableSchemas.d.ts.map +1 -1
- package/dist/loadTableSchemas.js +18 -10
- package/dist/loadTableSchemas.js.map +1 -1
- package/dist/useDataTable.d.ts +14 -0
- package/dist/useDataTable.d.ts.map +1 -0
- package/dist/useDataTable.js +21 -0
- package/dist/useDataTable.js.map +1 -0
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketDuckDbConnector.js","sourceRoot":"","sources":["../../src/connectors/WebSocketDuckDbConnector.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BaseDuckDbConnectorImpl,\n DuckDbConnector,\n createBaseDuckDbConnector,\n} from '@sqlrooms/duckdb-core';\nimport {load, loadObjects, loadSpatial} from '@sqlrooms/duckdb-core';\n\nimport {\n LoadFileOptions,\n StandardLoadOptions,\n isSpatialLoadFileOptions,\n} from '@sqlrooms/room-config';\nimport {splitFilePath} from '@sqlrooms/utils';\nimport * as arrow from 'apache-arrow';\n\n/**\n * Options for the WebSocket DuckDB connector.\n *\n * @public\n */\nexport interface WebSocketDuckDbConnectorOptions {\n /**\n * WebSocket endpoint of the DuckDB server.\n */\n wsUrl?: string;\n\n /** SQL to run after initialization */\n initializationQuery?: string;\n\n /** Optional handler for server notifications `{ type: 'notify', payload }` */\n onNotification?: (payload: any) => void;\n\n /** Optional list of channels to subscribe to upon (re)connect */\n subscribeChannels?: string[];\n\n /** Optional bearer token to authenticate with the server */\n authToken?: string;\n}\n\nexport interface WebSocketDuckDbConnector extends DuckDbConnector {\n readonly type: 'ws';\n}\n\n/**\n * Create a DuckDB connector that talks to a WebSocket backend.\n *\n * Protocol expectations (as implemented by the servers):\n * - Persistent connection; messages are correlated via `queryId`.\n * - Client sends JSON: `{ type: 'arrow', sql: string, queryId?: string }`.\n * - Server responds with a binary frame for Arrow results using framing:\n * `[4-byte big-endian header length][header JSON { type, queryId }][Arrow IPC stream bytes]`.\n * - Errors are sent as JSON text frames: `{ type: 'error', queryId, error }`.\n * - Cancellation: client sends `{ type: 'cancel', queryId }` and keeps socket open.\n * - Notifications: server may push `{ type: 'notify', payload }` as JSON text.\n */\n/**\n * Create a WebSocket-based DuckDB connector.\n *\n * @public\n */\nexport function createWebSocketDuckDbConnector(\n options: WebSocketDuckDbConnectorOptions = {},\n): WebSocketDuckDbConnector {\n const {\n wsUrl = 'ws://localhost:4000',\n initializationQuery = '',\n subscribeChannels,\n authToken,\n } = options;\n\n // Persistent socket and per-query waiters\n let socket: WebSocket | null = null;\n let opening: Promise<void> | null = null;\n const lastSubscribedChannels: string[] | undefined = subscribeChannels;\n const pending = new Map<\n string,\n {\n resolve: (table: arrow.Table<any>) => void;\n reject: (err: any) => void;\n }\n >();\n const pendingUploads = new Map<\n string,\n {\n resolve: () => void;\n reject: (err: any) => void;\n }\n >();\n\n const closeAndRejectAll = (reason: string) => {\n for (const [qid, waiter] of pending.entries()) {\n try {\n waiter.reject(new Error(reason));\n // eslint-disable-next-line no-empty\n } catch {}\n pending.delete(qid);\n }\n for (const [qid, waiter] of pendingUploads.entries()) {\n try {\n waiter.reject(new Error(reason));\n // eslint-disable-next-line no-empty\n } catch {}\n pendingUploads.delete(qid);\n }\n };\n\n // Guard to avoid duplicate subscribe sends on open + initialize\n const resubscribe = () => {\n if (!socket || socket.readyState !== WebSocket.OPEN) return;\n if (!lastSubscribedChannels || lastSubscribedChannels.length === 0) return;\n for (const ch of lastSubscribedChannels) {\n try {\n socket.send(JSON.stringify({type: 'subscribe', channel: ch}));\n // eslint-disable-next-line no-empty\n } catch {}\n }\n };\n\n const ensureSocket = (): Promise<void> => {\n if (socket && socket.readyState === WebSocket.OPEN)\n return Promise.resolve();\n if (opening) return opening;\n opening = new Promise<void>((resolve, reject) => {\n try {\n const ws = new WebSocket(wsUrl);\n socket = ws;\n ws.binaryType = 'arraybuffer';\n\n let authAcked = !authToken;\n\n ws.onopen = () => {\n // If auth is required, perform first-message auth and wait for ack\n try {\n if (authToken) {\n try {\n ws.send(JSON.stringify({type: 'auth', token: authToken}));\n // eslint-disable-next-line no-empty\n } catch {}\n } else {\n // No auth required; resolve immediately\n opening = null;\n resubscribe();\n resolve();\n }\n // eslint-disable-next-line no-empty\n } catch {}\n };\n\n ws.onmessage = (event: MessageEvent) => {\n (async () => {\n if (typeof event.data === 'string') {\n let parsed: any;\n try {\n parsed = JSON.parse(event.data);\n } catch {\n return;\n }\n const t = parsed?.type;\n if (!authAcked) {\n if (t === 'authAck') {\n authAcked = true;\n opening = null;\n // Subscribe once authed\n resubscribe();\n resolve();\n } else if (t === 'error') {\n const msg = parsed?.error || 'Unauthorized';\n opening = null;\n reject(new Error(msg));\n }\n return;\n }\n if (t === 'cancelAck') return;\n if (t === 'notify') {\n const payload = parsed?.payload;\n try {\n options.onNotification?.(payload);\n // eslint-disable-next-line no-empty\n } catch {}\n return;\n }\n // After initialization: if we ever receive a global unauthorized error, throw and close\n if (t === 'error') {\n const errMsg = String(parsed?.error || '').toLowerCase();\n const hasQid = typeof parsed?.queryId === 'string';\n if (!hasQid && errMsg.includes('unauthorized')) {\n closeAndRejectAll('Unauthorized');\n try {\n ws.close();\n // eslint-disable-next-line no-empty\n } catch {}\n socket = null;\n return;\n }\n }\n const qid: string | undefined = parsed?.queryId;\n if (qid) {\n const uploadWaiter = pendingUploads.get(qid);\n if (uploadWaiter) {\n if (t === 'uploadAck') {\n pendingUploads.delete(qid);\n uploadWaiter.resolve();\n } else if (t === 'error') {\n pendingUploads.delete(qid);\n uploadWaiter.reject(\n new Error(parsed?.error || 'Arrow upload failed'),\n );\n }\n return;\n }\n }\n if (!qid) return;\n const waiter = pending.get(qid);\n if (!waiter) return;\n if (t === 'error') {\n pending.delete(qid);\n waiter.reject(new Error(parsed?.error || 'Unknown error'));\n } else if (t === 'ok') {\n // Server acknowledged an arrow query with no result set\n pending.delete(qid);\n const empty = arrow.tableFromArrays(\n {},\n ) as unknown as arrow.Table;\n waiter.resolve(empty);\n }\n return;\n }\n\n // Binary result: [4-byte BE header length][header JSON][Arrow bytes]\n let buffer: ArrayBuffer;\n if (event.data instanceof ArrayBuffer) buffer = event.data;\n else if (event.data instanceof Blob)\n buffer = await event.data.arrayBuffer();\n else return;\n\n const view = new DataView(buffer, 0, 4);\n const headerLen = view.getUint32(0, false);\n const headerStart = 4;\n const headerEnd = headerStart + headerLen;\n const headerBytes = new Uint8Array(\n buffer.slice(headerStart, headerEnd),\n );\n const headerStr = new TextDecoder().decode(headerBytes);\n let header: any;\n try {\n header = JSON.parse(headerStr);\n } catch {\n return;\n }\n const qid = header?.queryId as string | undefined;\n if (!qid) return;\n const waiter = pending.get(qid);\n if (!waiter) return;\n\n const arrowBytes = new Uint8Array(buffer.slice(headerEnd));\n try {\n const reader = await arrow.RecordBatchReader.from(arrowBytes);\n const batches: arrow.RecordBatch[] = [];\n for await (const batch of reader) batches.push(batch);\n const table = batches.length\n ? new arrow.Table(reader.schema, batches)\n : (arrow.tableFromArrays({}) as unknown as arrow.Table);\n pending.delete(qid);\n waiter.resolve(table);\n } catch (e) {\n pending.delete(qid);\n waiter.reject(e);\n }\n })();\n };\n\n ws.onerror = () => {\n if (opening) {\n opening = null;\n reject(new Error('WebSocket connection error'));\n } else {\n closeAndRejectAll('WebSocket error');\n }\n try {\n ws.close();\n // eslint-disable-next-line no-empty\n } catch {}\n };\n\n ws.onclose = () => {\n if (opening) {\n opening = null;\n reject(new Error('WebSocket closed during open'));\n }\n closeAndRejectAll('WebSocket closed');\n socket = null;\n };\n } catch (e) {\n opening = null;\n reject(e);\n }\n });\n return opening;\n };\n\n const impl: BaseDuckDbConnectorImpl = {\n async initializeInternal() {\n await ensureSocket();\n // Subscribe on initialize, too (if socket was already open)\n resubscribe();\n },\n\n async destroyInternal() {\n try {\n socket?.close();\n // eslint-disable-next-line no-empty\n } catch {}\n socket = null;\n },\n\n async executeQueryInternal<T extends arrow.TypeMap = any>(\n query: string,\n signal: AbortSignal,\n queryId?: string,\n ): Promise<arrow.Table<T>> {\n if (signal.aborted) {\n throw new DOMException('Query was cancelled', 'AbortError');\n }\n await ensureSocket();\n const qid =\n queryId || `q_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n return new Promise<arrow.Table<T>>((resolve, reject) => {\n const onAbort = () => {\n try {\n if (socket && socket.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify({type: 'cancel', queryId: qid}));\n }\n // eslint-disable-next-line no-empty\n } catch {}\n pending.delete(qid);\n reject(new DOMException('Query was cancelled', 'AbortError'));\n };\n signal.addEventListener('abort', onAbort, {once: true});\n\n pending.set(qid, {\n resolve: (t) => {\n try {\n signal.removeEventListener('abort', onAbort);\n // eslint-disable-next-line no-empty\n } catch {}\n resolve(t as arrow.Table<T>);\n },\n reject: (e) => {\n try {\n signal.removeEventListener('abort', onAbort);\n // eslint-disable-next-line no-empty\n } catch {}\n reject(e);\n },\n });\n\n try {\n socket!.send(\n JSON.stringify({\n type: 'arrow',\n sql: query,\n queryId: qid,\n }),\n );\n } catch (e) {\n pending.delete(qid);\n try {\n signal.removeEventListener('abort', onAbort);\n // eslint-disable-next-line no-empty\n } catch {}\n reject(e);\n }\n });\n },\n\n async loadFileInternal(\n file: string | File,\n tableName: string,\n opts?: LoadFileOptions,\n ) {\n // This backend executes SQL on a remote DuckDB. For local files, the path must\n // be accessible to the server process.\n const filePath = file instanceof File ? file.name : file;\n const {ext} = splitFilePath(filePath);\n if (ext === 'arrow') {\n // No dedicated insert endpoint over WS; fall back to SQL semantics.\n // Users should provide a server-accessible path.\n const sql = `CREATE OR REPLACE TABLE ${tableName} AS SELECT * FROM read_ipc('${filePath}')`;\n await impl.executeQueryInternal?.(sql, new AbortController().signal);\n return;\n }\n\n let sql: string;\n if (opts && isSpatialLoadFileOptions(opts)) {\n sql = loadSpatial(tableName, filePath, opts);\n } else {\n sql = load(opts?.method ?? 'auto', tableName, filePath, opts);\n }\n await impl.executeQueryInternal?.(sql, new AbortController().signal);\n },\n\n async loadArrowInternal(file: arrow.Table | Uint8Array, tableName: string) {\n await ensureSocket();\n const qid = `upload_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const payload =\n file instanceof Uint8Array ? file : arrow.tableToIPC(file, 'stream');\n const header = new TextEncoder().encode(\n JSON.stringify({\n type: 'uploadArrow',\n queryId: qid,\n tableName,\n }),\n );\n const framed = new Uint8Array(4 + header.length + payload.length);\n new DataView(framed.buffer, framed.byteOffset, 4).setUint32(\n 0,\n header.length,\n false,\n );\n framed.set(header, 4);\n framed.set(payload, 4 + header.length);\n await new Promise<void>((resolve, reject) => {\n pendingUploads.set(qid, {\n resolve: () => resolve(),\n reject: (err) => reject(err),\n });\n try {\n socket!.send(framed);\n } catch (error) {\n pendingUploads.delete(qid);\n reject(error);\n }\n });\n },\n\n async loadObjectsInternal(\n file: Record<string, unknown>[],\n tableName: string,\n opts?: StandardLoadOptions,\n ) {\n const sql = loadObjects(tableName, file, opts);\n await impl.executeQueryInternal?.(sql, new AbortController().signal);\n },\n };\n\n const base = createBaseDuckDbConnector(\n {initializationQuery: initializationQuery},\n impl,\n );\n\n return {\n ...base,\n get type() {\n return 'ws' as const;\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"WebSocketDuckDbConnector.js","sourceRoot":"","sources":["../../src/connectors/WebSocketDuckDbConnector.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BaseDuckDbConnectorImpl,\n DuckDbConnector,\n createBaseDuckDbConnector,\n} from '@sqlrooms/duckdb-core';\nimport {load, loadObjects, loadSpatial} from '@sqlrooms/duckdb-core';\n\nimport {\n LoadFileOptions,\n StandardLoadOptions,\n isSpatialLoadFileOptions,\n} from '@sqlrooms/room-config';\nimport {splitFilePath} from '@sqlrooms/utils';\nimport * as arrow from 'apache-arrow';\n\n/**\n * Options for the WebSocket DuckDB connector.\n *\n * @public\n */\nexport interface WebSocketDuckDbConnectorOptions {\n /**\n * WebSocket endpoint of the DuckDB server.\n */\n wsUrl?: string;\n\n /** SQL to run after initialization */\n initializationQuery?: string;\n\n /** Optional handler for server notifications `{ type: 'notify', payload }` */\n onNotification?: (payload: any) => void;\n\n /** Optional handler for persistent WebSocket connection lifecycle changes. */\n onConnectionStatusChange?: (status: WebSocketDuckDbConnectionStatus) => void;\n\n /** Optional list of channels to subscribe to upon (re)connect */\n subscribeChannels?: string[];\n\n /** Optional bearer token to authenticate with the server */\n authToken?: string;\n}\n\n/**\n * Persistent WebSocket connection lifecycle status.\n *\n * @public\n */\nexport type WebSocketDuckDbConnectionStatus =\n | 'idle'\n | 'connecting'\n | 'connected'\n | 'disconnected';\n\nexport interface WebSocketDuckDbConnector extends DuckDbConnector {\n readonly type: 'ws';\n\n /**\n * Current persistent WebSocket connection status.\n */\n readonly connectionStatus: WebSocketDuckDbConnectionStatus;\n\n /**\n * Subscribe to persistent WebSocket connection lifecycle changes.\n *\n * @returns Unsubscribe callback.\n */\n subscribeConnectionStatus(\n listener: (status: WebSocketDuckDbConnectionStatus) => void,\n ): () => void;\n\n /**\n * Reopen the persistent WebSocket and rerun connector initialization SQL\n * without destroying the connector instance.\n */\n reconnect(): Promise<void>;\n}\n\n/**\n * Create a DuckDB connector that talks to a WebSocket backend.\n *\n * Protocol expectations (as implemented by the servers):\n * - Persistent connection; messages are correlated via `queryId`.\n * - Client sends JSON: `{ type: 'arrow', sql: string, queryId?: string }`.\n * - Server responds with a binary frame for Arrow results using framing:\n * `[4-byte big-endian header length][header JSON { type, queryId }][Arrow IPC stream bytes]`.\n * - Errors are sent as JSON text frames: `{ type: 'error', queryId, error }`.\n * - Cancellation: client sends `{ type: 'cancel', queryId }` and keeps socket open.\n * - Notifications: server may push `{ type: 'notify', payload }` as JSON text.\n */\n/**\n * Create a WebSocket-based DuckDB connector.\n *\n * @public\n */\nexport function createWebSocketDuckDbConnector(\n options: WebSocketDuckDbConnectorOptions = {},\n): WebSocketDuckDbConnector {\n const {\n wsUrl = 'ws://localhost:4000',\n initializationQuery = '',\n subscribeChannels,\n authToken,\n } = options;\n\n // Persistent socket and per-query waiters\n let socket: WebSocket | null = null;\n let opening: Promise<void> | null = null;\n let intentionalClose = false;\n let connectionStatus: WebSocketDuckDbConnectionStatus = 'idle';\n const connectionStatusListeners = new Set<\n (status: WebSocketDuckDbConnectionStatus) => void\n >();\n const lastSubscribedChannels: string[] | undefined = subscribeChannels;\n const pending = new Map<\n string,\n {\n resolve: (table: arrow.Table<any>) => void;\n reject: (err: any) => void;\n }\n >();\n const pendingUploads = new Map<\n string,\n {\n resolve: () => void;\n reject: (err: any) => void;\n }\n >();\n\n const closeAndRejectAll = (reason: string) => {\n for (const [qid, waiter] of pending.entries()) {\n try {\n waiter.reject(new Error(reason));\n // eslint-disable-next-line no-empty\n } catch {}\n pending.delete(qid);\n }\n for (const [qid, waiter] of pendingUploads.entries()) {\n try {\n waiter.reject(new Error(reason));\n // eslint-disable-next-line no-empty\n } catch {}\n pendingUploads.delete(qid);\n }\n };\n\n const setConnectionStatus = (status: WebSocketDuckDbConnectionStatus) => {\n if (connectionStatus === status) return;\n connectionStatus = status;\n try {\n options.onConnectionStatusChange?.(status);\n // eslint-disable-next-line no-empty\n } catch {}\n for (const listener of connectionStatusListeners) {\n try {\n listener(status);\n // eslint-disable-next-line no-empty\n } catch {}\n }\n };\n\n // Guard to avoid duplicate subscribe sends on open + initialize\n const resubscribe = () => {\n if (!socket || socket.readyState !== WebSocket.OPEN) return;\n if (!lastSubscribedChannels || lastSubscribedChannels.length === 0) return;\n for (const ch of lastSubscribedChannels) {\n try {\n socket.send(JSON.stringify({type: 'subscribe', channel: ch}));\n // eslint-disable-next-line no-empty\n } catch {}\n }\n };\n\n const ensureSocket = (): Promise<void> => {\n if (socket && socket.readyState === WebSocket.OPEN)\n return Promise.resolve();\n if (opening) return opening;\n setConnectionStatus('connecting');\n opening = new Promise<void>((resolve, reject) => {\n try {\n const ws = new WebSocket(wsUrl);\n socket = ws;\n intentionalClose = false;\n ws.binaryType = 'arraybuffer';\n\n let authAcked = !authToken;\n\n ws.onopen = () => {\n // If auth is required, perform first-message auth and wait for ack\n try {\n if (authToken) {\n try {\n ws.send(JSON.stringify({type: 'auth', token: authToken}));\n // eslint-disable-next-line no-empty\n } catch {}\n } else {\n // No auth required; resolve immediately\n opening = null;\n resubscribe();\n setConnectionStatus('connected');\n resolve();\n }\n // eslint-disable-next-line no-empty\n } catch {}\n };\n\n ws.onmessage = (event: MessageEvent) => {\n (async () => {\n if (typeof event.data === 'string') {\n let parsed: any;\n try {\n parsed = JSON.parse(event.data);\n } catch {\n return;\n }\n const t = parsed?.type;\n if (!authAcked) {\n if (t === 'authAck') {\n authAcked = true;\n opening = null;\n // Subscribe once authed\n resubscribe();\n setConnectionStatus('connected');\n resolve();\n } else if (t === 'error') {\n const msg = parsed?.error || 'Unauthorized';\n opening = null;\n setConnectionStatus('disconnected');\n reject(new Error(msg));\n try {\n ws.close();\n // eslint-disable-next-line no-empty\n } catch {}\n socket = null;\n }\n return;\n }\n if (t === 'cancelAck') return;\n if (t === 'notify') {\n const payload = parsed?.payload;\n try {\n options.onNotification?.(payload);\n // eslint-disable-next-line no-empty\n } catch {}\n return;\n }\n // After initialization: if we ever receive a global unauthorized error, throw and close\n if (t === 'error') {\n const errMsg = String(parsed?.error || '').toLowerCase();\n const hasQid = typeof parsed?.queryId === 'string';\n if (!hasQid && errMsg.includes('unauthorized')) {\n closeAndRejectAll('Unauthorized');\n try {\n ws.close();\n // eslint-disable-next-line no-empty\n } catch {}\n socket = null;\n return;\n }\n }\n const qid: string | undefined = parsed?.queryId;\n if (qid) {\n const uploadWaiter = pendingUploads.get(qid);\n if (uploadWaiter) {\n if (t === 'uploadAck') {\n pendingUploads.delete(qid);\n uploadWaiter.resolve();\n } else if (t === 'error') {\n pendingUploads.delete(qid);\n uploadWaiter.reject(\n new Error(parsed?.error || 'Arrow upload failed'),\n );\n }\n return;\n }\n }\n if (!qid) return;\n const waiter = pending.get(qid);\n if (!waiter) return;\n if (t === 'error') {\n pending.delete(qid);\n waiter.reject(new Error(parsed?.error || 'Unknown error'));\n } else if (t === 'ok') {\n // Server acknowledged an arrow query with no result set\n pending.delete(qid);\n const empty = arrow.tableFromArrays(\n {},\n ) as unknown as arrow.Table;\n waiter.resolve(empty);\n }\n return;\n }\n\n // Binary result: [4-byte BE header length][header JSON][Arrow bytes]\n let buffer: ArrayBuffer;\n if (event.data instanceof ArrayBuffer) buffer = event.data;\n else if (event.data instanceof Blob)\n buffer = await event.data.arrayBuffer();\n else return;\n\n const view = new DataView(buffer, 0, 4);\n const headerLen = view.getUint32(0, false);\n const headerStart = 4;\n const headerEnd = headerStart + headerLen;\n const headerBytes = new Uint8Array(\n buffer.slice(headerStart, headerEnd),\n );\n const headerStr = new TextDecoder().decode(headerBytes);\n let header: any;\n try {\n header = JSON.parse(headerStr);\n } catch {\n return;\n }\n const qid = header?.queryId as string | undefined;\n if (!qid) return;\n const waiter = pending.get(qid);\n if (!waiter) return;\n\n const arrowBytes = new Uint8Array(buffer.slice(headerEnd));\n try {\n const reader = await arrow.RecordBatchReader.from(arrowBytes);\n const batches: arrow.RecordBatch[] = [];\n for await (const batch of reader) batches.push(batch);\n const table = batches.length\n ? new arrow.Table(reader.schema, batches)\n : (arrow.tableFromArrays({}) as unknown as arrow.Table);\n pending.delete(qid);\n waiter.resolve(table);\n } catch (e) {\n pending.delete(qid);\n waiter.reject(e);\n }\n })();\n };\n\n ws.onerror = () => {\n if (opening) {\n opening = null;\n reject(new Error('WebSocket connection error'));\n } else {\n closeAndRejectAll('WebSocket error');\n }\n try {\n ws.close();\n // eslint-disable-next-line no-empty\n } catch {}\n setConnectionStatus('disconnected');\n };\n\n ws.onclose = () => {\n if (opening) {\n opening = null;\n reject(new Error('WebSocket closed during open'));\n }\n closeAndRejectAll('WebSocket closed');\n socket = null;\n setConnectionStatus(intentionalClose ? 'idle' : 'disconnected');\n intentionalClose = false;\n };\n } catch (e) {\n opening = null;\n setConnectionStatus('disconnected');\n reject(e);\n }\n });\n return opening;\n };\n\n const impl: BaseDuckDbConnectorImpl = {\n async initializeInternal() {\n await ensureSocket();\n // Subscribe on initialize, too (if socket was already open)\n resubscribe();\n },\n\n async destroyInternal() {\n try {\n intentionalClose = true;\n socket?.close();\n // eslint-disable-next-line no-empty\n } catch {}\n socket = null;\n setConnectionStatus('idle');\n },\n\n async executeQueryInternal<T extends arrow.TypeMap = any>(\n query: string,\n signal: AbortSignal,\n queryId?: string,\n ): Promise<arrow.Table<T>> {\n if (signal.aborted) {\n throw new DOMException('Query was cancelled', 'AbortError');\n }\n await ensureSocket();\n const qid =\n queryId || `q_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n return new Promise<arrow.Table<T>>((resolve, reject) => {\n const onAbort = () => {\n try {\n if (socket && socket.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify({type: 'cancel', queryId: qid}));\n }\n // eslint-disable-next-line no-empty\n } catch {}\n pending.delete(qid);\n reject(new DOMException('Query was cancelled', 'AbortError'));\n };\n signal.addEventListener('abort', onAbort, {once: true});\n\n pending.set(qid, {\n resolve: (t) => {\n try {\n signal.removeEventListener('abort', onAbort);\n // eslint-disable-next-line no-empty\n } catch {}\n resolve(t as arrow.Table<T>);\n },\n reject: (e) => {\n try {\n signal.removeEventListener('abort', onAbort);\n // eslint-disable-next-line no-empty\n } catch {}\n reject(e);\n },\n });\n\n try {\n socket!.send(\n JSON.stringify({\n type: 'arrow',\n sql: query,\n queryId: qid,\n }),\n );\n } catch (e) {\n pending.delete(qid);\n try {\n signal.removeEventListener('abort', onAbort);\n // eslint-disable-next-line no-empty\n } catch {}\n reject(e);\n }\n });\n },\n\n async loadFileInternal(\n file: string | File,\n tableName: string,\n opts?: LoadFileOptions,\n ) {\n // This backend executes SQL on a remote DuckDB. For local files, the path must\n // be accessible to the server process.\n const filePath = file instanceof File ? file.name : file;\n const {ext} = splitFilePath(filePath);\n if (ext === 'arrow') {\n // No dedicated insert endpoint over WS; fall back to SQL semantics.\n // Users should provide a server-accessible path.\n const sql = `CREATE OR REPLACE TABLE ${tableName} AS SELECT * FROM read_ipc('${filePath}')`;\n await impl.executeQueryInternal?.(sql, new AbortController().signal);\n return;\n }\n\n let sql: string;\n if (opts && isSpatialLoadFileOptions(opts)) {\n sql = loadSpatial(tableName, filePath, opts);\n } else if (!opts?.method && /\\.geojson$/i.test(filePath)) {\n sql = loadSpatial(tableName, filePath, opts ?? {});\n try {\n await impl.executeQueryInternal?.(sql, new AbortController().signal);\n return;\n } catch {\n sql = load('auto', tableName, filePath, opts);\n }\n } else {\n sql = load(opts?.method ?? 'auto', tableName, filePath, opts);\n }\n await impl.executeQueryInternal?.(sql, new AbortController().signal);\n },\n\n async loadArrowInternal(file: arrow.Table | Uint8Array, tableName: string) {\n await ensureSocket();\n const qid = `upload_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const payload =\n file instanceof Uint8Array ? file : arrow.tableToIPC(file, 'stream');\n const header = new TextEncoder().encode(\n JSON.stringify({\n type: 'uploadArrow',\n queryId: qid,\n tableName,\n }),\n );\n const framed = new Uint8Array(4 + header.length + payload.length);\n new DataView(framed.buffer, framed.byteOffset, 4).setUint32(\n 0,\n header.length,\n false,\n );\n framed.set(header, 4);\n framed.set(payload, 4 + header.length);\n await new Promise<void>((resolve, reject) => {\n pendingUploads.set(qid, {\n resolve: () => resolve(),\n reject: (err) => reject(err),\n });\n try {\n socket!.send(framed);\n } catch (error) {\n pendingUploads.delete(qid);\n reject(error);\n }\n });\n },\n\n async loadObjectsInternal(\n file: Record<string, unknown>[],\n tableName: string,\n opts?: StandardLoadOptions,\n ) {\n const sql = loadObjects(tableName, file, opts);\n await impl.executeQueryInternal?.(sql, new AbortController().signal);\n },\n };\n\n const base = createBaseDuckDbConnector(\n {initializationQuery: initializationQuery},\n impl,\n );\n\n return {\n ...base,\n get type() {\n return 'ws' as const;\n },\n get connectionStatus() {\n return connectionStatus;\n },\n subscribeConnectionStatus(listener) {\n connectionStatusListeners.add(listener);\n return () => {\n connectionStatusListeners.delete(listener);\n };\n },\n async reconnect() {\n await ensureSocket();\n if (initializationQuery) {\n await impl.executeQueryInternal(\n initializationQuery,\n new AbortController().signal,\n );\n }\n },\n };\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,12 +6,13 @@ export { DuckDBAccessMode } from '@duckdb/duckdb-wasm';
|
|
|
6
6
|
export type { DuckDBBundles, DuckDBConfig } from '@duckdb/duckdb-wasm';
|
|
7
7
|
export { isSpatialLoadFileOptions, LoadFileOptions, SpatialLoadFileOptions, } from '@sqlrooms/room-config';
|
|
8
8
|
export { createDuckDbConnector, createWasmDuckDbConnector, isWasmDuckDbConnector, type DuckDbConnectorOptions, type DuckDbConnectorType, type WasmDuckDbConnector, type WasmDuckDbConnectorOptions, } from './connectors/createDuckDbConnector';
|
|
9
|
-
export { createWebSocketDuckDbConnector, type WebSocketDuckDbConnector, type WebSocketDuckDbConnectorOptions, } from './connectors/WebSocketDuckDbConnector';
|
|
9
|
+
export { createWebSocketDuckDbConnector, type WebSocketDuckDbConnector, type WebSocketDuckDbConnectionStatus, type WebSocketDuckDbConnectorOptions, } from './connectors/WebSocketDuckDbConnector';
|
|
10
10
|
export { createDuckDbSlice, useStoreWithDuckDb, createDefaultLoadTableSchemasFilter, defaultLoadSchemaCatalogFilter, defaultLoadTableSchemasFilter, type CreateDuckDbSliceProps, type DuckDbSliceState, } from './DuckDbSlice';
|
|
11
11
|
export { loadSchemaCatalog, type LoadSchemaCatalogFilterFunction, type LoadSchemaCatalogOptions, type LoadTableSchemasFilterFunction, type SchemaCatalogFilterEntry, type LoadTableSchemasFilter, type LoadTableSchemasOptions, } from './loadTableSchemas';
|
|
12
12
|
export { useExportToCsv, type UseExportToCsvReturn } from './use-export-to-csv';
|
|
13
13
|
export { useCopyAsTsv, type CopyAsTsvOptions, type CopyAsTsvResult, type UseCopyAsTsvReturn, } from './use-copy-as-tsv';
|
|
14
14
|
export { useDuckDb } from './useDuckDb';
|
|
15
|
+
export { useDataTable } from './useDataTable';
|
|
15
16
|
export { useDuckDbQuery, useSql, type DuckDbQueryResult, type UseSqlQueryResult, } from './useSql';
|
|
16
|
-
export { arrowTableToJson, createBaseDuckDbConnector, createDbSchemaTrees, createTypedRowAccessor, escapeId, escapeVal, findTableInSchemaTrees, getAllTablesFromSchemaTrees, getArrowColumnTypeCategory, getColValAsNumber, getDuckDbTypeCategory, getSqlErrorWithPointer, isNumericDuckType, isQualifiedTableName, joinStatements, literalToSQL, load, loadCSV, loadJSON, loadObjects, loadParquet, loadSpatial, makeLimitQuery, makeQualifiedTableName, sanitizeQuery, separateLastStatement, splitSqlStatements, sqlFrom, getFunctionSuggestions, getFunctionDocumentation, type BaseDuckDbConnectorImpl, type BaseDuckDbConnectorOptions, type ColumnNodeObject, type ColumnTypeCategory, type DatabaseNodeObject, type DataTable, type DbSchemaNode, type DuckDbConnector, type FunctionSuggestion, type GroupedFunctionSuggestion, type NodeObject, type QualifiedTableName, type QueryHandle, type QueryOptions, type SchemaNodeObject, type SchemaWithTables, type SeparatedStatements, type TableColumn, type TableNodeObject, type TypedRowAccessor, } from '@sqlrooms/duckdb-core';
|
|
17
|
+
export { arrowTableToJson, createBaseDuckDbConnector, createDbSchemaTrees, createTypedRowAccessor, escapeId, escapeVal, findTableInSchemaTrees, getAllTablesFromSchemaTrees, getArrowColumnTypeCategory, getColValAsNumber, getDuckDbTypeCategory, getSqlErrorWithPointer, getUnqualifiedSqlIdentifier, isNumericDuckType, isQualifiedTableName, joinStatements, literalToSQL, load, loadCSV, loadJSON, loadObjects, loadParquet, loadSpatial, makeLimitQuery, makeQualifiedTableName, parseQualifiedSqlIdentifier, quoteTableReference, resolveTableReference, sanitizeQuery, separateLastStatement, splitSqlStatements, sqlFrom, getFunctionSuggestions, getFunctionDocumentation, type BaseDuckDbConnectorImpl, type BaseDuckDbConnectorOptions, type ColumnNodeObject, type ColumnTypeCategory, type DatabaseNodeObject, type DataTable, type DbSchemaNode, type DuckDbConnector, type FunctionSuggestion, type GroupedFunctionSuggestion, type NodeObject, type QualifiedTableName, type QueryHandle, type QueryOptions, type ResolveTableReferenceResult, type SchemaNodeObject, type SchemaWithTables, type SeparatedStatements, type TableColumn, type TableNodeObject, type TypedRowAccessor, } from '@sqlrooms/duckdb-core';
|
|
17
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAC,aAAa,EAAE,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAErE,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,GAChC,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,8BAA8B,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,+BAA+B,GACrC,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,mCAAmC,EACnC,8BAA8B,EAC9B,6BAA6B,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,iBAAiB,EACjB,KAAK,+BAA+B,EACpC,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,EACnC,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,GAC7B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAC,cAAc,EAAE,KAAK,oBAAoB,EAAC,MAAM,qBAAqB,CAAC;AAE9E,OAAO,EACL,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAC,aAAa,EAAE,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAErE,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,GAChC,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,8BAA8B,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,GACrC,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,mCAAmC,EACnC,8BAA8B,EAC9B,6BAA6B,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,iBAAiB,EACjB,KAAK,+BAA+B,EACpC,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,EACnC,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,GAC7B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAC,cAAc,EAAE,KAAK,oBAAoB,EAAC,MAAM,qBAAqB,CAAC;AAE9E,OAAO,EACL,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AACtC,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EACL,cAAc,EACd,MAAM,EACN,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,GACvB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,EACnB,sBAAsB,EACtB,QAAQ,EACR,SAAS,EACT,sBAAsB,EACtB,2BAA2B,EAC3B,0BAA0B,EAC1B,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,2BAA2B,EAC3B,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,YAAY,EACZ,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,EACd,sBAAsB,EACtB,2BAA2B,EAC3B,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,OAAO,EACP,sBAAsB,EACtB,wBAAwB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,EAC/B,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,2BAA2B,EAChC,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -11,7 +11,8 @@ export { loadSchemaCatalog, } from './loadTableSchemas';
|
|
|
11
11
|
export { useExportToCsv } from './use-export-to-csv';
|
|
12
12
|
export { useCopyAsTsv, } from './use-copy-as-tsv';
|
|
13
13
|
export { useDuckDb } from './useDuckDb';
|
|
14
|
+
export { useDataTable } from './useDataTable';
|
|
14
15
|
export { useDuckDbQuery, useSql, } from './useSql';
|
|
15
16
|
// Re-export from @sqlrooms/duckdb-core
|
|
16
|
-
export { arrowTableToJson, createBaseDuckDbConnector, createDbSchemaTrees, createTypedRowAccessor, escapeId, escapeVal, findTableInSchemaTrees, getAllTablesFromSchemaTrees, getArrowColumnTypeCategory, getColValAsNumber, getDuckDbTypeCategory, getSqlErrorWithPointer, isNumericDuckType, isQualifiedTableName, joinStatements, literalToSQL, load, loadCSV, loadJSON, loadObjects, loadParquet, loadSpatial, makeLimitQuery, makeQualifiedTableName, sanitizeQuery, separateLastStatement, splitSqlStatements, sqlFrom, getFunctionSuggestions, getFunctionDocumentation, } from '@sqlrooms/duckdb-core';
|
|
17
|
+
export { arrowTableToJson, createBaseDuckDbConnector, createDbSchemaTrees, createTypedRowAccessor, escapeId, escapeVal, findTableInSchemaTrees, getAllTablesFromSchemaTrees, getArrowColumnTypeCategory, getColValAsNumber, getDuckDbTypeCategory, getSqlErrorWithPointer, getUnqualifiedSqlIdentifier, isNumericDuckType, isQualifiedTableName, joinStatements, literalToSQL, load, loadCSV, loadJSON, loadObjects, loadParquet, loadSpatial, makeLimitQuery, makeQualifiedTableName, parseQualifiedSqlIdentifier, quoteTableReference, resolveTableReference, sanitizeQuery, separateLastStatement, splitSqlStatements, sqlFrom, getFunctionSuggestions, getFunctionDocumentation, } from '@sqlrooms/duckdb-core';
|
|
17
18
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,GAKtB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,8BAA8B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,GAKtB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,8BAA8B,GAI/B,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,mCAAmC,EACnC,8BAA8B,EAC9B,6BAA6B,GAG9B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,iBAAiB,GAOlB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAC,cAAc,EAA4B,MAAM,qBAAqB,CAAC;AAE9E,OAAO,EACL,YAAY,GAIb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AACtC,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EACL,cAAc,EACd,MAAM,GAGP,MAAM,UAAU,CAAC;AAElB,uCAAuC;AACvC,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,EACnB,sBAAsB,EACtB,QAAQ,EACR,SAAS,EACT,sBAAsB,EACtB,2BAA2B,EAC3B,0BAA0B,EAC1B,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,2BAA2B,EAC3B,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,YAAY,EACZ,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,EACd,sBAAsB,EACtB,2BAA2B,EAC3B,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,OAAO,EACP,sBAAsB,EACtB,wBAAwB,GAsBzB,MAAM,uBAAuB,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nexport {DuckDBAccessMode} from '@duckdb/duckdb-wasm';\nexport type {DuckDBBundles, DuckDBConfig} from '@duckdb/duckdb-wasm';\n\nexport {\n isSpatialLoadFileOptions,\n LoadFileOptions,\n SpatialLoadFileOptions,\n} from '@sqlrooms/room-config';\n\nexport {\n createDuckDbConnector,\n createWasmDuckDbConnector,\n isWasmDuckDbConnector,\n type DuckDbConnectorOptions,\n type DuckDbConnectorType,\n type WasmDuckDbConnector,\n type WasmDuckDbConnectorOptions,\n} from './connectors/createDuckDbConnector';\n\nexport {\n createWebSocketDuckDbConnector,\n type WebSocketDuckDbConnector,\n type WebSocketDuckDbConnectionStatus,\n type WebSocketDuckDbConnectorOptions,\n} from './connectors/WebSocketDuckDbConnector';\n\nexport {\n createDuckDbSlice,\n useStoreWithDuckDb,\n createDefaultLoadTableSchemasFilter,\n defaultLoadSchemaCatalogFilter,\n defaultLoadTableSchemasFilter,\n type CreateDuckDbSliceProps,\n type DuckDbSliceState,\n} from './DuckDbSlice';\n\nexport {\n loadSchemaCatalog,\n type LoadSchemaCatalogFilterFunction,\n type LoadSchemaCatalogOptions,\n type LoadTableSchemasFilterFunction,\n type SchemaCatalogFilterEntry,\n type LoadTableSchemasFilter,\n type LoadTableSchemasOptions,\n} from './loadTableSchemas';\n\nexport {useExportToCsv, type UseExportToCsvReturn} from './use-export-to-csv';\n\nexport {\n useCopyAsTsv,\n type CopyAsTsvOptions,\n type CopyAsTsvResult,\n type UseCopyAsTsvReturn,\n} from './use-copy-as-tsv';\n\nexport {useDuckDb} from './useDuckDb';\nexport {useDataTable} from './useDataTable';\n\nexport {\n useDuckDbQuery,\n useSql,\n type DuckDbQueryResult,\n type UseSqlQueryResult,\n} from './useSql';\n\n// Re-export from @sqlrooms/duckdb-core\nexport {\n arrowTableToJson,\n createBaseDuckDbConnector,\n createDbSchemaTrees,\n createTypedRowAccessor,\n escapeId,\n escapeVal,\n findTableInSchemaTrees,\n getAllTablesFromSchemaTrees,\n getArrowColumnTypeCategory,\n getColValAsNumber,\n getDuckDbTypeCategory,\n getSqlErrorWithPointer,\n getUnqualifiedSqlIdentifier,\n isNumericDuckType,\n isQualifiedTableName,\n joinStatements,\n literalToSQL,\n load,\n loadCSV,\n loadJSON,\n loadObjects,\n loadParquet,\n loadSpatial,\n makeLimitQuery,\n makeQualifiedTableName,\n parseQualifiedSqlIdentifier,\n quoteTableReference,\n resolveTableReference,\n sanitizeQuery,\n separateLastStatement,\n splitSqlStatements,\n sqlFrom,\n getFunctionSuggestions,\n getFunctionDocumentation,\n type BaseDuckDbConnectorImpl,\n type BaseDuckDbConnectorOptions,\n type ColumnNodeObject,\n type ColumnTypeCategory,\n type DatabaseNodeObject,\n type DataTable,\n type DbSchemaNode,\n type DuckDbConnector,\n type FunctionSuggestion,\n type GroupedFunctionSuggestion,\n type NodeObject,\n type QualifiedTableName,\n type QueryHandle,\n type QueryOptions,\n type ResolveTableReferenceResult,\n type SchemaNodeObject,\n type SchemaWithTables,\n type SeparatedStatements,\n type TableColumn,\n type TableNodeObject,\n type TypedRowAccessor,\n} from '@sqlrooms/duckdb-core';\n"]}
|
|
@@ -7,6 +7,7 @@ export type LoadTableSchemasFilter = {
|
|
|
7
7
|
};
|
|
8
8
|
export type LoadTableSchemasOptions = LoadTableSchemasFilter & {
|
|
9
9
|
filterFunction?: LoadTableSchemasFilterFunction | null;
|
|
10
|
+
defaultDatabase?: string;
|
|
10
11
|
};
|
|
11
12
|
export type SchemaCatalogFilterEntry = {
|
|
12
13
|
type: 'database';
|
|
@@ -22,6 +23,7 @@ export type SchemaCatalogFilterEntry = {
|
|
|
22
23
|
export type LoadSchemaCatalogFilterFunction = (entry: SchemaCatalogFilterEntry) => boolean;
|
|
23
24
|
export type LoadSchemaCatalogOptions = LoadTableSchemasFilter & {
|
|
24
25
|
filterFunction?: LoadSchemaCatalogFilterFunction | null;
|
|
26
|
+
defaultDatabase?: string;
|
|
25
27
|
};
|
|
26
28
|
/**
|
|
27
29
|
* Internal helper to load table schemas with optional filter bypass.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadTableSchemas.d.ts","sourceRoot":"","sources":["../src/loadTableSchemas.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,eAAe,EAGf,kBAAkB,EAClB,gBAAgB,EAEjB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,8BAA8B,GAAG,CAC3C,KAAK,EAAE,kBAAkB,KACtB,OAAO,CAAC;AAEb,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,sBAAsB,GAAG;IAC7D,cAAc,CAAC,EAAE,8BAA8B,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"loadTableSchemas.d.ts","sourceRoot":"","sources":["../src/loadTableSchemas.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,eAAe,EAGf,kBAAkB,EAClB,gBAAgB,EAEjB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,8BAA8B,GAAG,CAC3C,KAAK,EAAE,kBAAkB,KACtB,OAAO,CAAC;AAEb,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,sBAAsB,GAAG;IAC7D,cAAc,CAAC,EAAE,8BAA8B,GAAG,IAAI,CAAC;IACvD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAChC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,GACpC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,GAClD;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,kBAAkB,CAAA;CAAC,CAAC;AAE/C,MAAM,MAAM,+BAA+B,GAAG,CAC5C,KAAK,EAAE,wBAAwB,KAC5B,OAAO,CAAC;AAEb,MAAM,MAAM,wBAAwB,GAAG,sBAAsB,GAAG;IAC9D,cAAc,CAAC,EAAE,+BAA+B,GAAG,IAAI,CAAC;IACxD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,eAAe,EAC1B,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,SAAS,EAAE,CAAC,CAmBtB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,eAAe,EAC1B,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA2C7B"}
|
package/dist/loadTableSchemas.js
CHANGED
|
@@ -5,12 +5,14 @@ import { escapeVal, makeQualifiedTableName, } from '@sqlrooms/duckdb-core';
|
|
|
5
5
|
* Omit `filterFunction` to bypass filtering.
|
|
6
6
|
*/
|
|
7
7
|
export async function loadTableSchemas(connector, options = {}) {
|
|
8
|
-
const { filterFunction, ...filter } = options;
|
|
8
|
+
const { filterFunction, defaultDatabase, ...filter } = options;
|
|
9
9
|
const sql = buildTableSchemasQuery(filter);
|
|
10
10
|
const describeResults = await connector.query(sql);
|
|
11
11
|
const tables = [];
|
|
12
12
|
for (let i = 0; i < describeResults.numRows; i++) {
|
|
13
|
-
const dataTable = parseTableSchemaRow(describeResults, i
|
|
13
|
+
const dataTable = parseTableSchemaRow(describeResults, i, {
|
|
14
|
+
defaultDatabase,
|
|
15
|
+
});
|
|
14
16
|
// Apply filter (if not provided or null, include all tables)
|
|
15
17
|
if (!filterFunction || filterFunction(dataTable.table)) {
|
|
16
18
|
tables.push(dataTable);
|
|
@@ -24,7 +26,7 @@ export async function loadTableSchemas(connector, options = {}) {
|
|
|
24
26
|
* schemas and empty attached database `main` schemas are preserved.
|
|
25
27
|
*/
|
|
26
28
|
export async function loadSchemaCatalog(connector, options = {}) {
|
|
27
|
-
const { filterFunction, ...filter } = options;
|
|
29
|
+
const { filterFunction, defaultDatabase, ...filter } = options;
|
|
28
30
|
const result = await connector.query(buildSchemaCatalogQuery(filter));
|
|
29
31
|
const groups = new Map();
|
|
30
32
|
const includedDatabases = new Set();
|
|
@@ -51,7 +53,7 @@ export async function loadSchemaCatalog(connector, options = {}) {
|
|
|
51
53
|
group = { database, schema, tables: [] };
|
|
52
54
|
groups.set(key, group);
|
|
53
55
|
}
|
|
54
|
-
const table = parseSchemaCatalogTableRow(result, i);
|
|
56
|
+
const table = parseSchemaCatalogTableRow(result, i, { defaultDatabase });
|
|
55
57
|
if (table &&
|
|
56
58
|
(!filterFunction || filterFunction({ type: 'table', table: table.table }))) {
|
|
57
59
|
group.tables.push(table);
|
|
@@ -62,14 +64,19 @@ export async function loadSchemaCatalog(connector, options = {}) {
|
|
|
62
64
|
function isDuckDbPlaceholderViewColumn(columnName, columnType) {
|
|
63
65
|
return columnName === '__' && columnType.toUpperCase() === 'UNKNOWN';
|
|
64
66
|
}
|
|
67
|
+
function getMetadataString(value) {
|
|
68
|
+
if (value === undefined || value === null)
|
|
69
|
+
return undefined;
|
|
70
|
+
return String(value);
|
|
71
|
+
}
|
|
65
72
|
/**
|
|
66
73
|
* Parses a single row from the table schema query results into a DataTable object.
|
|
67
74
|
*/
|
|
68
|
-
function parseTableSchemaRow(describeResults, index) {
|
|
75
|
+
function parseTableSchemaRow(describeResults, index, options = {}) {
|
|
69
76
|
const isView = describeResults.getChild('isView')?.get(index);
|
|
70
|
-
const rowDatabase = describeResults.getChild('database')?.get(index);
|
|
71
|
-
const rowSchema = describeResults.getChild('schema')?.get(index);
|
|
72
|
-
const rowTable = describeResults.getChild('name')?.get(index);
|
|
77
|
+
const rowDatabase = getMetadataString(describeResults.getChild('database')?.get(index));
|
|
78
|
+
const rowSchema = getMetadataString(describeResults.getChild('schema')?.get(index)) ?? '';
|
|
79
|
+
const rowTable = getMetadataString(describeResults.getChild('name')?.get(index)) ?? '';
|
|
73
80
|
const sql = describeResults.getChild('sql')?.get(index);
|
|
74
81
|
const comment = describeResults.getChild('comment')?.get(index);
|
|
75
82
|
const estimatedSize = describeResults.getChild('estimated_size')?.get(index);
|
|
@@ -79,6 +86,7 @@ function parseTableSchemaRow(describeResults, index) {
|
|
|
79
86
|
database: rowDatabase,
|
|
80
87
|
schema: rowSchema,
|
|
81
88
|
table: rowTable,
|
|
89
|
+
defaultDatabase: options.defaultDatabase,
|
|
82
90
|
});
|
|
83
91
|
const columns = [];
|
|
84
92
|
for (let ci = 0; ci < (columnNames?.length ?? 0); ci++) {
|
|
@@ -108,11 +116,11 @@ function parseTableSchemaRow(describeResults, index) {
|
|
|
108
116
|
: estimatedSize,
|
|
109
117
|
};
|
|
110
118
|
}
|
|
111
|
-
function parseSchemaCatalogTableRow(result, index) {
|
|
119
|
+
function parseSchemaCatalogTableRow(result, index, options = {}) {
|
|
112
120
|
const rowTable = result.getChild('name')?.get(index);
|
|
113
121
|
if (rowTable == null)
|
|
114
122
|
return null;
|
|
115
|
-
return parseTableSchemaRow(result, index);
|
|
123
|
+
return parseTableSchemaRow(result, index, options);
|
|
116
124
|
}
|
|
117
125
|
function buildMetadataWhereClause(nameColumn, filter) {
|
|
118
126
|
const { schema, database, table } = filter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadTableSchemas.js","sourceRoot":"","sources":["../src/loadTableSchemas.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DataTable,\n DuckDbConnector,\n escapeVal,\n makeQualifiedTableName,\n QualifiedTableName,\n SchemaWithTables,\n TableColumn,\n} from '@sqlrooms/duckdb-core';\n\nexport type LoadTableSchemasFilterFunction = (\n table: QualifiedTableName,\n) => boolean;\n\nexport type LoadTableSchemasFilter = {\n schema?: string;\n database?: string;\n table?: string;\n};\n\nexport type LoadTableSchemasOptions = LoadTableSchemasFilter & {\n filterFunction?: LoadTableSchemasFilterFunction | null;\n};\n\nexport type SchemaCatalogFilterEntry =\n | {type: 'database'; database: string}\n | {type: 'schema'; database: string; schema: string}\n | {type: 'table'; table: QualifiedTableName};\n\nexport type LoadSchemaCatalogFilterFunction = (\n entry: SchemaCatalogFilterEntry,\n) => boolean;\n\nexport type LoadSchemaCatalogOptions = LoadTableSchemasFilter & {\n filterFunction?: LoadSchemaCatalogFilterFunction | null;\n};\n\n/**\n * Internal helper to load table schemas with optional filter bypass.\n * Used for exact lookups where we don't want the visibility filter to hide results.\n * Omit `filterFunction` to bypass filtering.\n */\nexport async function loadTableSchemas(\n connector: DuckDbConnector,\n options: LoadTableSchemasOptions = {},\n): Promise<DataTable[]> {\n const {filterFunction, ...filter} = options;\n\n const sql = buildTableSchemasQuery(filter);\n const describeResults = await connector.query(sql);\n const tables: DataTable[] = [];\n\n for (let i = 0; i < describeResults.numRows; i++) {\n const dataTable = parseTableSchemaRow(describeResults, i);\n\n // Apply filter (if not provided or null, include all tables)\n if (!filterFunction || filterFunction(dataTable.table)) {\n tables.push(dataTable);\n }\n }\n\n return tables;\n}\n\n/**\n * Load the visible DuckDB schema catalog in one metadata query.\n * Starts from schemas, then left-joins tables, views, and columns so empty\n * schemas and empty attached database `main` schemas are preserved.\n */\nexport async function loadSchemaCatalog(\n connector: DuckDbConnector,\n options: LoadSchemaCatalogOptions = {},\n): Promise<SchemaWithTables[]> {\n const {filterFunction, ...filter} = options;\n const result = await connector.query(buildSchemaCatalogQuery(filter));\n const groups = new Map<string, SchemaWithTables>();\n const includedDatabases = new Set<string>();\n const keyOf = (database: string, schema: string) =>\n `${database}\\x00${schema}`;\n\n for (let i = 0; i < result.numRows; i++) {\n const database = String(result.getChild('database')?.get(i) ?? '').trim();\n const schema = String(result.getChild('schema')?.get(i) ?? '').trim();\n if (!database || !schema) continue;\n\n if (!includedDatabases.has(database)) {\n if (filterFunction?.({type: 'database', database}) === false) {\n continue;\n } else {\n includedDatabases.add(database);\n }\n }\n\n if (filterFunction?.({type: 'schema', database, schema}) === false) {\n continue;\n }\n\n const key = keyOf(database, schema);\n let group = groups.get(key);\n\n if (!group) {\n group = {database, schema, tables: []};\n groups.set(key, group);\n }\n\n const table = parseSchemaCatalogTableRow(result, i);\n if (\n table &&\n (!filterFunction || filterFunction({type: 'table', table: table.table}))\n ) {\n group.tables.push(table);\n }\n }\n\n return Array.from(groups.values());\n}\n\nfunction isDuckDbPlaceholderViewColumn(\n columnName: string,\n columnType: string,\n): boolean {\n return columnName === '__' && columnType.toUpperCase() === 'UNKNOWN';\n}\n\n/**\n * Parses a single row from the table schema query results into a DataTable object.\n */\nfunction parseTableSchemaRow(describeResults: any, index: number): DataTable {\n const isView = describeResults.getChild('isView')?.get(index);\n const rowDatabase = describeResults.getChild('database')?.get(index);\n const rowSchema = describeResults.getChild('schema')?.get(index);\n const rowTable = describeResults.getChild('name')?.get(index);\n const sql = describeResults.getChild('sql')?.get(index);\n const comment = describeResults.getChild('comment')?.get(index);\n const estimatedSize = describeResults.getChild('estimated_size')?.get(index);\n const columnNames = describeResults.getChild('column_names')?.get(index);\n const columnTypes = describeResults.getChild('column_types')?.get(index);\n\n const qualifiedTable = makeQualifiedTableName({\n database: rowDatabase,\n schema: rowSchema,\n table: rowTable,\n });\n\n const columns: TableColumn[] = [];\n for (let ci = 0; ci < (columnNames?.length ?? 0); ci++) {\n const columnName = String(columnNames.get(ci));\n const columnType = String(columnTypes?.get(ci));\n if (isDuckDbPlaceholderViewColumn(columnName, columnType)) {\n continue;\n }\n columns.push({\n name: columnName,\n type: columnType,\n });\n }\n\n return {\n table: qualifiedTable,\n database: rowDatabase,\n schema: rowSchema,\n tableName: rowTable,\n columns,\n sql,\n comment,\n isView: Boolean(isView),\n rowCount:\n typeof estimatedSize === 'bigint'\n ? Number(estimatedSize)\n : estimatedSize === null\n ? undefined\n : estimatedSize,\n };\n}\n\nfunction parseSchemaCatalogTableRow(\n result: any,\n index: number,\n): DataTable | null {\n const rowTable = result.getChild('name')?.get(index);\n if (rowTable == null) return null;\n return parseTableSchemaRow(result, index);\n}\n\nfunction buildMetadataWhereClause(\n nameColumn: string,\n filter: LoadTableSchemasFilter,\n): string {\n const {schema, database, table} = filter;\n return [\n database\n ? `database_name = ${escapeVal(database)}`\n : `database_name != 'system'`,\n schema ? `schema_name = ${escapeVal(schema)}` : '',\n table ? `${nameColumn} = ${escapeVal(table)}` : '',\n ]\n .filter(Boolean)\n .join(' AND ');\n}\n\nfunction buildSchemaWhereClause(filter: LoadTableSchemasFilter): string {\n const {schema, database} = filter;\n return [\n database\n ? `database_name = ${escapeVal(database)}`\n : `database_name != 'system'`,\n schema ? `schema_name = ${escapeVal(schema)}` : 'schema_name IS NOT NULL',\n `(internal = false OR schema_name = 'main')`,\n ]\n .filter(Boolean)\n .join(' AND ');\n}\n\nfunction buildSchemaCatalogQuery(filter: LoadTableSchemasFilter): string {\n const schemaWhereClause = buildSchemaWhereClause(filter);\n const tableWhereClause = buildMetadataWhereClause('table_name', filter);\n const viewWhereClause = buildMetadataWhereClause('view_name', filter);\n\n return `WITH schemas AS (\n FROM duckdb_schemas() SELECT DISTINCT\n COALESCE(\n NULLIF(CAST(database_name AS VARCHAR), ''),\n current_database()\n ) AS database,\n CAST(schema_name AS VARCHAR) AS schema\n WHERE ${schemaWhereClause}\n ),\n tables_and_views AS (\n FROM duckdb_tables() SELECT\n database_name AS database,\n schema_name AS schema,\n table_name AS name,\n sql,\n comment,\n estimated_size,\n FALSE AS isView\n WHERE ${tableWhereClause}\n UNION ALL\n FROM duckdb_views() SELECT\n database_name AS database,\n schema_name AS schema,\n view_name AS name,\n sql,\n comment,\n NULL AS estimated_size,\n TRUE AS isView\n WHERE ${viewWhereClause}\n ),\n columns AS (\n FROM duckdb_columns() SELECT\n database_name AS database,\n schema_name AS schema,\n table_name AS name,\n list(column_name ORDER BY column_index) AS column_names,\n list(data_type ORDER BY column_index) AS column_types\n WHERE ${tableWhereClause}\n GROUP BY database_name, schema_name, table_name\n )\n SELECT\n tables_and_views.isView AS isView,\n schemas.database AS database,\n schemas.schema AS schema,\n tables_and_views.name AS name,\n columns.column_names AS column_names,\n columns.column_types AS column_types,\n tables_and_views.sql AS sql,\n tables_and_views.comment AS comment,\n tables_and_views.estimated_size AS estimated_size\n FROM schemas\n LEFT JOIN tables_and_views USING (database, schema)\n LEFT JOIN columns USING (database, schema, name)\n ORDER BY schemas.database, schemas.schema, tables_and_views.isView, tables_and_views.name`;\n}\n\n/**\n * Builds the SQL query to load table and view schemas from DuckDB system catalogs.\n * Uses CTEs to efficiently join table/view metadata with column information.\n */\nfunction buildTableSchemasQuery(filter: LoadTableSchemasFilter): string {\n const tableWhereClause = buildMetadataWhereClause('table_name', filter);\n const viewWhereClause = buildMetadataWhereClause('view_name', filter);\n\n return `WITH tables_and_views AS (\n FROM duckdb_tables() SELECT\n database_name AS database,\n schema_name AS schema,\n table_name AS name,\n sql,\n comment,\n estimated_size,\n FALSE AS isView\n WHERE ${tableWhereClause}\n UNION ALL\n FROM duckdb_views() SELECT\n database_name AS database,\n schema_name AS schema,\n view_name AS name,\n sql,\n comment,\n NULL AS estimated_size,\n TRUE AS isView\n WHERE ${viewWhereClause}\n ),\n columns AS (\n FROM duckdb_columns() SELECT\n database_name AS database,\n schema_name AS schema,\n table_name AS name,\n list(column_name ORDER BY column_index) AS column_names,\n list(data_type ORDER BY column_index) AS column_types\n WHERE ${tableWhereClause}\n GROUP BY database_name, schema_name, table_name\n )\n SELECT\n isView,\n database,\n schema,\n name,\n column_names,\n column_types,\n sql,\n comment,\n estimated_size\n FROM tables_and_views\n LEFT JOIN columns USING (database, schema, name)\n ORDER BY isView, database, schema, name`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"loadTableSchemas.js","sourceRoot":"","sources":["../src/loadTableSchemas.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DataTable,\n DuckDbConnector,\n escapeVal,\n makeQualifiedTableName,\n QualifiedTableName,\n SchemaWithTables,\n TableColumn,\n} from '@sqlrooms/duckdb-core';\n\nexport type LoadTableSchemasFilterFunction = (\n table: QualifiedTableName,\n) => boolean;\n\nexport type LoadTableSchemasFilter = {\n schema?: string;\n database?: string;\n table?: string;\n};\n\nexport type LoadTableSchemasOptions = LoadTableSchemasFilter & {\n filterFunction?: LoadTableSchemasFilterFunction | null;\n defaultDatabase?: string;\n};\n\nexport type SchemaCatalogFilterEntry =\n | {type: 'database'; database: string}\n | {type: 'schema'; database: string; schema: string}\n | {type: 'table'; table: QualifiedTableName};\n\nexport type LoadSchemaCatalogFilterFunction = (\n entry: SchemaCatalogFilterEntry,\n) => boolean;\n\nexport type LoadSchemaCatalogOptions = LoadTableSchemasFilter & {\n filterFunction?: LoadSchemaCatalogFilterFunction | null;\n defaultDatabase?: string;\n};\n\n/**\n * Internal helper to load table schemas with optional filter bypass.\n * Used for exact lookups where we don't want the visibility filter to hide results.\n * Omit `filterFunction` to bypass filtering.\n */\nexport async function loadTableSchemas(\n connector: DuckDbConnector,\n options: LoadTableSchemasOptions = {},\n): Promise<DataTable[]> {\n const {filterFunction, defaultDatabase, ...filter} = options;\n\n const sql = buildTableSchemasQuery(filter);\n const describeResults = await connector.query(sql);\n const tables: DataTable[] = [];\n\n for (let i = 0; i < describeResults.numRows; i++) {\n const dataTable = parseTableSchemaRow(describeResults, i, {\n defaultDatabase,\n });\n\n // Apply filter (if not provided or null, include all tables)\n if (!filterFunction || filterFunction(dataTable.table)) {\n tables.push(dataTable);\n }\n }\n\n return tables;\n}\n\n/**\n * Load the visible DuckDB schema catalog in one metadata query.\n * Starts from schemas, then left-joins tables, views, and columns so empty\n * schemas and empty attached database `main` schemas are preserved.\n */\nexport async function loadSchemaCatalog(\n connector: DuckDbConnector,\n options: LoadSchemaCatalogOptions = {},\n): Promise<SchemaWithTables[]> {\n const {filterFunction, defaultDatabase, ...filter} = options;\n const result = await connector.query(buildSchemaCatalogQuery(filter));\n const groups = new Map<string, SchemaWithTables>();\n const includedDatabases = new Set<string>();\n const keyOf = (database: string, schema: string) =>\n `${database}\\x00${schema}`;\n\n for (let i = 0; i < result.numRows; i++) {\n const database = String(result.getChild('database')?.get(i) ?? '').trim();\n const schema = String(result.getChild('schema')?.get(i) ?? '').trim();\n if (!database || !schema) continue;\n\n if (!includedDatabases.has(database)) {\n if (filterFunction?.({type: 'database', database}) === false) {\n continue;\n } else {\n includedDatabases.add(database);\n }\n }\n\n if (filterFunction?.({type: 'schema', database, schema}) === false) {\n continue;\n }\n\n const key = keyOf(database, schema);\n let group = groups.get(key);\n\n if (!group) {\n group = {database, schema, tables: []};\n groups.set(key, group);\n }\n\n const table = parseSchemaCatalogTableRow(result, i, {defaultDatabase});\n if (\n table &&\n (!filterFunction || filterFunction({type: 'table', table: table.table}))\n ) {\n group.tables.push(table);\n }\n }\n\n return Array.from(groups.values());\n}\n\nfunction isDuckDbPlaceholderViewColumn(\n columnName: string,\n columnType: string,\n): boolean {\n return columnName === '__' && columnType.toUpperCase() === 'UNKNOWN';\n}\n\nfunction getMetadataString(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n return String(value);\n}\n\n/**\n * Parses a single row from the table schema query results into a DataTable object.\n */\nfunction parseTableSchemaRow(\n describeResults: any,\n index: number,\n options: {defaultDatabase?: string} = {},\n): DataTable {\n const isView = describeResults.getChild('isView')?.get(index);\n const rowDatabase = getMetadataString(\n describeResults.getChild('database')?.get(index),\n );\n const rowSchema =\n getMetadataString(describeResults.getChild('schema')?.get(index)) ?? '';\n const rowTable =\n getMetadataString(describeResults.getChild('name')?.get(index)) ?? '';\n const sql = describeResults.getChild('sql')?.get(index);\n const comment = describeResults.getChild('comment')?.get(index);\n const estimatedSize = describeResults.getChild('estimated_size')?.get(index);\n const columnNames = describeResults.getChild('column_names')?.get(index);\n const columnTypes = describeResults.getChild('column_types')?.get(index);\n\n const qualifiedTable = makeQualifiedTableName({\n database: rowDatabase,\n schema: rowSchema,\n table: rowTable,\n defaultDatabase: options.defaultDatabase,\n });\n\n const columns: TableColumn[] = [];\n for (let ci = 0; ci < (columnNames?.length ?? 0); ci++) {\n const columnName = String(columnNames.get(ci));\n const columnType = String(columnTypes?.get(ci));\n if (isDuckDbPlaceholderViewColumn(columnName, columnType)) {\n continue;\n }\n columns.push({\n name: columnName,\n type: columnType,\n });\n }\n\n return {\n table: qualifiedTable,\n database: rowDatabase,\n schema: rowSchema,\n tableName: rowTable,\n columns,\n sql,\n comment,\n isView: Boolean(isView),\n rowCount:\n typeof estimatedSize === 'bigint'\n ? Number(estimatedSize)\n : estimatedSize === null\n ? undefined\n : estimatedSize,\n };\n}\n\nfunction parseSchemaCatalogTableRow(\n result: any,\n index: number,\n options: {defaultDatabase?: string} = {},\n): DataTable | null {\n const rowTable = result.getChild('name')?.get(index);\n if (rowTable == null) return null;\n return parseTableSchemaRow(result, index, options);\n}\n\nfunction buildMetadataWhereClause(\n nameColumn: string,\n filter: LoadTableSchemasFilter,\n): string {\n const {schema, database, table} = filter;\n return [\n database\n ? `database_name = ${escapeVal(database)}`\n : `database_name != 'system'`,\n schema ? `schema_name = ${escapeVal(schema)}` : '',\n table ? `${nameColumn} = ${escapeVal(table)}` : '',\n ]\n .filter(Boolean)\n .join(' AND ');\n}\n\nfunction buildSchemaWhereClause(filter: LoadTableSchemasFilter): string {\n const {schema, database} = filter;\n return [\n database\n ? `database_name = ${escapeVal(database)}`\n : `database_name != 'system'`,\n schema ? `schema_name = ${escapeVal(schema)}` : 'schema_name IS NOT NULL',\n `(internal = false OR schema_name = 'main')`,\n ]\n .filter(Boolean)\n .join(' AND ');\n}\n\nfunction buildSchemaCatalogQuery(filter: LoadTableSchemasFilter): string {\n const schemaWhereClause = buildSchemaWhereClause(filter);\n const tableWhereClause = buildMetadataWhereClause('table_name', filter);\n const viewWhereClause = buildMetadataWhereClause('view_name', filter);\n\n return `WITH schemas AS (\n FROM duckdb_schemas() SELECT DISTINCT\n COALESCE(\n NULLIF(CAST(database_name AS VARCHAR), ''),\n current_database()\n ) AS database,\n CAST(schema_name AS VARCHAR) AS schema\n WHERE ${schemaWhereClause}\n ),\n tables_and_views AS (\n FROM duckdb_tables() SELECT\n database_name AS database,\n schema_name AS schema,\n table_name AS name,\n sql,\n comment,\n estimated_size,\n FALSE AS isView\n WHERE ${tableWhereClause}\n UNION ALL\n FROM duckdb_views() SELECT\n database_name AS database,\n schema_name AS schema,\n view_name AS name,\n sql,\n comment,\n NULL AS estimated_size,\n TRUE AS isView\n WHERE ${viewWhereClause}\n ),\n columns AS (\n FROM duckdb_columns() SELECT\n database_name AS database,\n schema_name AS schema,\n table_name AS name,\n list(column_name ORDER BY column_index) AS column_names,\n list(data_type ORDER BY column_index) AS column_types\n WHERE ${tableWhereClause}\n GROUP BY database_name, schema_name, table_name\n )\n SELECT\n tables_and_views.isView AS isView,\n schemas.database AS database,\n schemas.schema AS schema,\n tables_and_views.name AS name,\n columns.column_names AS column_names,\n columns.column_types AS column_types,\n tables_and_views.sql AS sql,\n tables_and_views.comment AS comment,\n tables_and_views.estimated_size AS estimated_size\n FROM schemas\n LEFT JOIN tables_and_views USING (database, schema)\n LEFT JOIN columns USING (database, schema, name)\n ORDER BY schemas.database, schemas.schema, tables_and_views.isView, tables_and_views.name`;\n}\n\n/**\n * Builds the SQL query to load table and view schemas from DuckDB system catalogs.\n * Uses CTEs to efficiently join table/view metadata with column information.\n */\nfunction buildTableSchemasQuery(filter: LoadTableSchemasFilter): string {\n const tableWhereClause = buildMetadataWhereClause('table_name', filter);\n const viewWhereClause = buildMetadataWhereClause('view_name', filter);\n\n return `WITH tables_and_views AS (\n FROM duckdb_tables() SELECT\n database_name AS database,\n schema_name AS schema,\n table_name AS name,\n sql,\n comment,\n estimated_size,\n FALSE AS isView\n WHERE ${tableWhereClause}\n UNION ALL\n FROM duckdb_views() SELECT\n database_name AS database,\n schema_name AS schema,\n view_name AS name,\n sql,\n comment,\n NULL AS estimated_size,\n TRUE AS isView\n WHERE ${viewWhereClause}\n ),\n columns AS (\n FROM duckdb_columns() SELECT\n database_name AS database,\n schema_name AS schema,\n table_name AS name,\n list(column_name ORDER BY column_index) AS column_names,\n list(data_type ORDER BY column_index) AS column_types\n WHERE ${tableWhereClause}\n GROUP BY database_name, schema_name, table_name\n )\n SELECT\n isView,\n database,\n schema,\n name,\n column_names,\n column_types,\n sql,\n comment,\n estimated_size\n FROM tables_and_views\n LEFT JOIN columns USING (database, schema, name)\n ORDER BY isView, database, schema, name`;\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DataTable, QualifiedTableName } from '@sqlrooms/duckdb-core';
|
|
2
|
+
/**
|
|
3
|
+
* Resolves a table reference against the DuckDB table schema cache.
|
|
4
|
+
*
|
|
5
|
+
* String inputs are delegated to `db.findTable`, which parses qualified
|
|
6
|
+
* SQL identifiers such as `main.events` and
|
|
7
|
+
* `"memory"."main"."events.2026"`. Unqualified names resolve in the current
|
|
8
|
+
* schema/database from the last schema refresh.
|
|
9
|
+
*
|
|
10
|
+
* @param tableName - A bare, qualified, or structured table reference.
|
|
11
|
+
* @returns The matching data table, including its loaded columns, or undefined.
|
|
12
|
+
*/
|
|
13
|
+
export declare function useDataTable(tableName: string | QualifiedTableName | undefined): DataTable | undefined;
|
|
14
|
+
//# sourceMappingURL=useDataTable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDataTable.d.ts","sourceRoot":"","sources":["../src/useDataTable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAE,kBAAkB,EAAC,MAAM,uBAAuB,CAAC;AAGzE;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,GACjD,SAAS,GAAG,SAAS,CAOvB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { useStoreWithDuckDb } from './DuckDbSlice';
|
|
2
|
+
/**
|
|
3
|
+
* Resolves a table reference against the DuckDB table schema cache.
|
|
4
|
+
*
|
|
5
|
+
* String inputs are delegated to `db.findTable`, which parses qualified
|
|
6
|
+
* SQL identifiers such as `main.events` and
|
|
7
|
+
* `"memory"."main"."events.2026"`. Unqualified names resolve in the current
|
|
8
|
+
* schema/database from the last schema refresh.
|
|
9
|
+
*
|
|
10
|
+
* @param tableName - A bare, qualified, or structured table reference.
|
|
11
|
+
* @returns The matching data table, including its loaded columns, or undefined.
|
|
12
|
+
*/
|
|
13
|
+
export function useDataTable(tableName) {
|
|
14
|
+
return useStoreWithDuckDb((state) => {
|
|
15
|
+
if (!tableName) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
return state.db.findTable(tableName);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=useDataTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDataTable.js","sourceRoot":"","sources":["../src/useDataTable.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,kBAAkB,EAAC,MAAM,eAAe,CAAC;AAEjD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAC1B,SAAkD;IAElD,OAAO,kBAAkB,CAAC,CAAC,KAAK,EAAE,EAAE;QAClC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type {DataTable, QualifiedTableName} from '@sqlrooms/duckdb-core';\nimport {useStoreWithDuckDb} from './DuckDbSlice';\n\n/**\n * Resolves a table reference against the DuckDB table schema cache.\n *\n * String inputs are delegated to `db.findTable`, which parses qualified\n * SQL identifiers such as `main.events` and\n * `\"memory\".\"main\".\"events.2026\"`. Unqualified names resolve in the current\n * schema/database from the last schema refresh.\n *\n * @param tableName - A bare, qualified, or structured table reference.\n * @returns The matching data table, including its loaded columns, or undefined.\n */\nexport function useDataTable(\n tableName: string | QualifiedTableName | undefined,\n): DataTable | undefined {\n return useStoreWithDuckDb((state) => {\n if (!tableName) {\n return undefined;\n }\n return state.db.findTable(tableName);\n });\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sqlrooms/duckdb",
|
|
3
|
-
"version": "0.29.0-rc.
|
|
3
|
+
"version": "0.29.0-rc.9",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+https://github.com/sqlrooms/sqlrooms.git"
|
|
@@ -26,17 +26,17 @@
|
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"@duckdb/duckdb-wasm": "^1.32.0",
|
|
29
|
-
"@sqlrooms/duckdb-core": "0.29.0-rc.
|
|
30
|
-
"@sqlrooms/room-config": "0.29.0-rc.
|
|
31
|
-
"@sqlrooms/room-store": "0.29.0-rc.
|
|
32
|
-
"@sqlrooms/utils": "0.29.0-rc.
|
|
29
|
+
"@sqlrooms/duckdb-core": "0.29.0-rc.9",
|
|
30
|
+
"@sqlrooms/room-config": "0.29.0-rc.9",
|
|
31
|
+
"@sqlrooms/room-store": "0.29.0-rc.9",
|
|
32
|
+
"@sqlrooms/utils": "0.29.0-rc.9",
|
|
33
33
|
"fast-deep-equal": "^3.1.3",
|
|
34
34
|
"immer": "^11.0.1",
|
|
35
35
|
"zod": "^4.1.8",
|
|
36
36
|
"zustand": "^5.0.8"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@sqlrooms/duckdb-node": "0.29.0-rc.
|
|
39
|
+
"@sqlrooms/duckdb-node": "0.29.0-rc.9",
|
|
40
40
|
"@types/jest": "^30.0.0",
|
|
41
41
|
"jest": "^30.1.3",
|
|
42
42
|
"ts-jest": "^29.4.4"
|
|
@@ -47,5 +47,5 @@
|
|
|
47
47
|
"publishConfig": {
|
|
48
48
|
"access": "public"
|
|
49
49
|
},
|
|
50
|
-
"gitHead": "
|
|
50
|
+
"gitHead": "e9e4ed45ebb0ceb3e1e647674a7039b8d9325583"
|
|
51
51
|
}
|