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

View File

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