diff --git a/src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx b/src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx index 46a7552e0f..a49e344919 100644 --- a/src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx +++ b/src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx @@ -95,6 +95,12 @@ export default function QueryEditor(props: QueryEditorProps) { const [lastExecutedQueryText, setLastExecutedQueryText] = React.useState(''); const [isQueryStreamingEnabled] = useQueryStreamingSetting(); + const [binaryDataInPlainTextDisplay] = useSetting( + SETTING_KEYS.BINARY_DATA_IN_PLAIN_TEXT_DISPLAY, + ); + + const encodeTextWithBase64 = !binaryDataInPlainTextDisplay; + const isStreamingEnabled = useStreamingAvailable() && isQueryStreamingEnabled && @@ -160,6 +166,7 @@ export default function QueryEditor(props: QueryEditorProps) { database, querySettings, enableTracingLevel, + base64: encodeTextWithBase64, }); queryManagerInstance.registerQuery(query); @@ -172,6 +179,7 @@ export default function QueryEditor(props: QueryEditorProps) { querySettings, enableTracingLevel, queryId, + base64: encodeTextWithBase64, }); queryManagerInstance.registerQuery(query); @@ -212,6 +220,7 @@ export default function QueryEditor(props: QueryEditorProps) { querySettings, enableTracingLevel, queryId, + base64: encodeTextWithBase64, }); queryManagerInstance.registerQuery(query); diff --git a/src/services/api/base.ts b/src/services/api/base.ts index 28322d711e..f56110a5aa 100644 --- a/src/services/api/base.ts +++ b/src/services/api/base.ts @@ -3,11 +3,11 @@ import type {AxiosWrapperOptions} from '@gravity-ui/axios-wrapper'; import axiosRetry from 'axios-retry'; import {backend as BACKEND, clusterName} from '../../store'; +import {readSettingValueFromLS} from '../../store/reducers/settings/utils'; import type {SchemaPathParam} from '../../types/api/common'; import {DEV_ENABLE_TRACING_FOR_ALL_REQUESTS} from '../../utils/constants'; import {prepareBackendWithMetaProxy} from '../../utils/parseBalancer'; import {isRedirectToAuth} from '../../utils/response'; -import {settingsManager} from '../settings'; export type AxiosOptions = { concurrentId?: string; @@ -42,9 +42,7 @@ export class BaseYdbAPI extends AxiosWrapper { // Make possible manually enable tracing for all requests // For development purposes this._axios.interceptors.request.use(function (config) { - const enableTracing = settingsManager.readUserSettingsValue( - DEV_ENABLE_TRACING_FOR_ALL_REQUESTS, - ); + const enableTracing = readSettingValueFromLS(DEV_ENABLE_TRACING_FOR_ALL_REQUESTS); if (enableTracing) { config.headers['X-Want-Trace'] = 1; diff --git a/src/services/api/streaming.ts b/src/services/api/streaming.ts index 3263553316..3d156501cd 100644 --- a/src/services/api/streaming.ts +++ b/src/services/api/streaming.ts @@ -8,7 +8,7 @@ import { isSessionChunk, isStreamDataChunk, } from '../../store/reducers/query/utils'; -import {SETTING_KEYS} from '../../store/reducers/settings/constants'; +import {readSettingValueFromLS} from '../../store/reducers/settings/utils'; import type {Actions, StreamQueryParams} from '../../types/api/query'; import type { QueryResponseChunk, @@ -18,7 +18,6 @@ import type { } from '../../types/store/streaming'; import {DEV_ENABLE_TRACING_FOR_ALL_REQUESTS} from '../../utils/constants'; import {isRedirectToAuth} from '../../utils/response'; -import {settingsManager} from '../settings'; import {BaseYdbAPI} from './base'; @@ -42,10 +41,7 @@ export class StreamingAPI extends BaseYdbAPI { params: StreamQueryParams, options: StreamQueryOptions, ) { - const base64 = !settingsManager.readUserSettingsValue( - SETTING_KEYS.BINARY_DATA_IN_PLAIN_TEXT_DISPLAY, - true, - ); + const base64 = params.base64; const queryParams = qs.stringify( {timeout: params.timeout, base64, schema: 'multipart'}, @@ -66,9 +62,7 @@ export class StreamingAPI extends BaseYdbAPI { headers.set('X-Trace-Verbosity', String(params.tracingLevel)); } - const enableTracing = settingsManager.readUserSettingsValue( - DEV_ENABLE_TRACING_FOR_ALL_REQUESTS, - ); + const enableTracing = readSettingValueFromLS(DEV_ENABLE_TRACING_FOR_ALL_REQUESTS); if (enableTracing) { headers.set('X-Want-Trace', '1'); diff --git a/src/services/api/viewer.ts b/src/services/api/viewer.ts index 201104f487..be3d1c9280 100644 --- a/src/services/api/viewer.ts +++ b/src/services/api/viewer.ts @@ -1,5 +1,4 @@ import type {PlanToSvgQueryParams} from '../../store/reducers/planToSvg'; -import {SETTING_KEYS} from '../../store/reducers/settings/constants'; import type {VDiskBlobIndexStatParams} from '../../store/reducers/vdisk/vdisk'; import type { AccessRightsUpdateRequest, @@ -40,7 +39,6 @@ import type {VDiskBlobIndexResponse} from '../../types/api/vdiskBlobIndex'; import type {TUserToken} from '../../types/api/whoami'; import type {TabletsApiRequestParams} from '../../types/store/tablets'; import type {Nullable} from '../../utils/typecheckers'; -import {settingsManager} from '../settings'; import type {AxiosOptions} from './base'; import {BaseYdbAPI} from './base'; @@ -416,10 +414,7 @@ export class ViewerAPI extends BaseYdbAPI { params: SendQueryParams, {concurrentId, signal, withRetries}: AxiosOptions = {}, ) { - const base64 = !settingsManager.readUserSettingsValue( - SETTING_KEYS.BINARY_DATA_IN_PLAIN_TEXT_DISPLAY, - true, - ); + const base64 = params.base64; return this.post | ErrorResponse | null>( this.getPath('/viewer/json/query'), diff --git a/src/store/reducers/query/query.ts b/src/store/reducers/query/query.ts index ed77fc696a..6895c4a423 100644 --- a/src/store/reducers/query/query.ts +++ b/src/store/reducers/query/query.ts @@ -222,6 +222,7 @@ interface SendQueryParams extends QueryRequestParams { // flag whether to send new tracing header or not // default: not send enableTracingLevel?: boolean; + base64?: boolean; } // Stream query receives queryId from session chunk. @@ -239,7 +240,7 @@ export const queryApi = api.injectEndpoints({ endpoints: (build) => ({ useStreamQuery: build.mutation({ queryFn: async ( - {query, database, querySettings = {}, enableTracingLevel}, + {query, database, querySettings = {}, enableTracingLevel, base64}, {signal, dispatch, getState}, ) => { const startTime = Date.now(); @@ -294,6 +295,7 @@ export const queryApi = api.injectEndpoints({ : undefined, output_chunk_max_size: DEFAULT_STREAM_CHUNK_SIZE, concurrent_results: DEFAULT_CONCURRENT_RESULTS || undefined, + base64, }, { signal, @@ -343,7 +345,7 @@ export const queryApi = api.injectEndpoints({ } }, }), - useSendQuery: build.mutation({ + useSendQuery: build.mutation({ queryFn: async ( { actionType = 'execute', @@ -352,7 +354,8 @@ export const queryApi = api.injectEndpoints({ querySettings = {}, enableTracingLevel, queryId, - }, + base64, + }: SendQueryParams, {signal, dispatch, getState}, ) => { const startTime = Date.now(); @@ -396,6 +399,7 @@ export const queryApi = api.injectEndpoints({ ? Number(querySettings.timeout) * 1000 : undefined, query_id: queryId, + base64, }, {signal}, ); diff --git a/src/types/api/query.ts b/src/types/api/query.ts index 3b36c9daab..14aa5185d3 100644 --- a/src/types/api/query.ts +++ b/src/types/api/query.ts @@ -327,6 +327,7 @@ export interface SendQueryParams { query_id?: string; limit_rows?: number; internal_call?: boolean; + base64?: boolean; } export interface StreamQueryParams extends SendQueryParams {