duckDb: singleConnection query

This commit is contained in:
SPRINX0\prochazka
2025-04-02 16:39:23 +02:00
committed by Nybkox
parent 750265cb79
commit 890461bcf8
4 changed files with 84 additions and 13 deletions

View File

@@ -310,6 +310,7 @@ export interface EngineDriver<TClient = any> extends FilterBehaviourProvider {
analyserClass?: any;
dumperClass?: any;
singleConnectionOnly?: boolean;
}
export interface DatabaseModification {

View File

@@ -0,0 +1,52 @@
<script lang="ts">
import { createGridCache, createGridConfig, FreeTableGridDisplay } from 'dbgate-datalib';
import DataGridCore from '../datagrid/DataGridCore.svelte';
import RowsArrayGrider from '../datagrid/RowsArrayGrider';
import TabControl from '../elements/TabControl.svelte';
import { TableInfo } from 'dbgate-types';
import { writable } from 'svelte/store';
import DataGrid from '../datagrid/DataGrid.svelte';
import ErrorInfo from '../elements/ErrorInfo.svelte';
let selectedTab = 0;
export let result;
const config = writable(createGridConfig());
const cache = writable(createGridCache());
$: grider = result?.rows && result?.columns ? new RowsArrayGrider(result.rows) : null;
$: display =
result?.rows && result?.columns
? new FreeTableGridDisplay(
{
structure: {
columns: result.columns,
} as TableInfo,
rows: result.rows,
},
$config,
config.update,
$cache,
cache.update
)
: null;
</script>
<TabControl
bind:value={selectedTab}
tabs={[grider && display && { label: 'Data', slot: 1 }, { label: 'Status', slot: 2 }]}
>
<svelte:fragment slot="1">
{#if grider && display}
<DataGrid {grider} {display} gridCoreComponent={DataGridCore} />
{/if}
</svelte:fragment>
<svelte:fragment slot="2">
{#if result?.errorMessage}
<ErrorInfo message={result?.errorMessage} alignTop />
{:else if result?.rows}
<ErrorInfo message={`Returned ${result.rows.length} rows`} icon="img info" alignTop />
{/if}
</svelte:fragment>
</TabControl>

View File

@@ -143,6 +143,7 @@
import { isProApp } from '../utility/proTools';
import HorizontalSplitter from '../elements/HorizontalSplitter.svelte';
import QueryAiAssistant from '../query/QueryAiAssistant.svelte';
import SimpleQueryResultTabs from '../query/SimpleQueryResultTabs.svelte';
export let tabid;
export let conid;
@@ -196,6 +197,8 @@
let isInTransaction = false;
let isAutocommit = false;
let simpleQueryDataResult = null;
onMount(() => {
intervalId = setInterval(() => {
if (sessionId) {
@@ -323,6 +326,16 @@
return;
}
if (driver?.singleConnectionOnly) {
simpleQueryDataResult = await apiCall('database-connections/query-data', {
conid,
database,
sql,
});
visibleResultTabs = true;
return;
}
executeStartLine = startLine;
executeNumber++;
visibleResultTabs = true;
@@ -642,19 +655,23 @@
{/if}
</svelte:fragment>
<svelte:fragment slot="2">
<ResultTabs tabs={[{ label: 'Messages', slot: 0 }]} {sessionId} {executeNumber} bind:resultCount {driver}>
<svelte:fragment slot="0">
<SocketMessageView
eventName={sessionId ? `session-info-${sessionId}` : null}
onMessageClick={handleMesageClick}
{executeNumber}
startLine={executeStartLine}
showProcedure
showLine
onChangeErrors={handleChangeErrors}
/>
</svelte:fragment>
</ResultTabs>
{#if driver?.singleConnectionOnly}
<SimpleQueryResultTabs result={simpleQueryDataResult} />
{:else}
<ResultTabs tabs={[{ label: 'Messages', slot: 0 }]} {sessionId} {executeNumber} bind:resultCount {driver}>
<svelte:fragment slot="0">
<SocketMessageView
eventName={sessionId ? `session-info-${sessionId}` : null}
onMessageClick={handleMesageClick}
{executeNumber}
startLine={executeStartLine}
showProcedure
showLine
onChangeErrors={handleChangeErrors}
/>
</svelte:fragment>
</ResultTabs>
{/if}
</svelte:fragment>
</VerticalSplitter>
</svelte:fragment>

View File

@@ -53,6 +53,7 @@ const driver = {
title: 'DuckDB',
readOnlySessions: true,
supportsTransactions: true,
singleConnectionOnly: true,
getQuerySplitterOptions: (usage) =>
usage == 'editor'