diff --git a/packages/api/src/proc/databaseConnectionProcess.js b/packages/api/src/proc/databaseConnectionProcess.js index 2d7d613c5..2bb0c1375 100644 --- a/packages/api/src/proc/databaseConnectionProcess.js +++ b/packages/api/src/proc/databaseConnectionProcess.js @@ -255,7 +255,7 @@ async function handleDriverDataCore(msgid, callMethod, { logName }) { const driver = requireEngineDriver(storedConnection); try { const result = await callMethod(driver); - process.send({ msgtype: 'response', msgid, result }); + process.send({ msgtype: 'response', msgid, result: serializeJsTypesForJsonStringify(result) }); } catch (err) { logger.error(extractErrorLogData(err, { logName }), `Error when handling message ${logName}`); process.send({ msgtype: 'response', msgid, errorMessage: extractErrorMessage(err, 'Error executing DB data') }); diff --git a/packages/tools/src/stringTools.ts b/packages/tools/src/stringTools.ts index adf6aec3c..41a27e5ff 100644 --- a/packages/tools/src/stringTools.ts +++ b/packages/tools/src/stringTools.ts @@ -81,7 +81,7 @@ export function parseCellValue(value, editorTypes?: DataEditorTypesBehaviour) { if (editorTypes?.parseNumber) { if (/^-?[0-9]+(?:\.[0-9]+)?$/.test(value)) { - return parseFloat(value); + return parseNumberSafe(value); } } @@ -215,6 +215,12 @@ export function stringifyCellValue( gridStyle: 'valueCellStyle', }; } + if (typeof value === 'bigint') { + return { + value: value.toString(), + gridStyle: 'valueCellStyle', + }; + } if (editorTypes?.parseDateAsDollar) { if (value?.$date) { diff --git a/packages/web/src/datagrid/CellValue.svelte b/packages/web/src/datagrid/CellValue.svelte index 013a5ff99..8d006962e 100644 --- a/packages/web/src/datagrid/CellValue.svelte +++ b/packages/web/src/datagrid/CellValue.svelte @@ -16,6 +16,8 @@ { useThousandsSeparator: getBoolSettingsValue('dataGrid.thousandsSeparator', false) }, jsonParsedValue ); + + // $: console.log('CellValue', value, stringified); {#if rowData == null} diff --git a/plugins/dbgate-plugin-mongo/src/backend/driver.js b/plugins/dbgate-plugin-mongo/src/backend/driver.js index 9c10ba8eb..b2d400377 100644 --- a/plugins/dbgate-plugin-mongo/src/backend/driver.js +++ b/plugins/dbgate-plugin-mongo/src/backend/driver.js @@ -5,6 +5,7 @@ const driverBase = require('../frontend/driver'); const Analyser = require('./Analyser'); const { MongoClient, ObjectId, AbstractCursor } = require('mongodb'); const { EJSON } = require('bson'); +const { serializeJsTypesForJsonStringify } = require('dbgate-tools'); const createBulkInsertStream = require('./createBulkInsertStream'); const { convertToMongoCondition, @@ -13,7 +14,9 @@ const { } = require('../frontend/convertToMongoCondition'); function transformMongoData(row) { - return EJSON.serialize(row); + // TODO process LONG type + // console.log('ROW', row); + return EJSON.serialize(serializeJsTypesForJsonStringify(row)); } async function readCursor(cursor, options) { diff --git a/plugins/dbgate-plugin-mongo/src/frontend/driver.js b/plugins/dbgate-plugin-mongo/src/frontend/driver.js index 45d3f66b3..8b93696db 100644 --- a/plugins/dbgate-plugin-mongo/src/frontend/driver.js +++ b/plugins/dbgate-plugin-mongo/src/frontend/driver.js @@ -5,11 +5,17 @@ const { mongoSplitterOptions } = require('dbgate-query-splitter/lib/options'); const _pickBy = require('lodash/pickBy'); const _fromPairs = require('lodash/fromPairs'); +function mongoReplacer(key, value) { + if (typeof value === 'bigint') { + return { $bigint: value.toString() }; + } + return value; +} + function jsonStringifyWithObjectId(obj) { - return JSON.stringify(obj, undefined, 2).replace( - /\{\s*\"\$oid\"\s*\:\s*\"([0-9a-f]+)\"\s*\}/g, - (m, id) => `ObjectId("${id}")` - ); + return JSON.stringify(obj, mongoReplacer, 2) + .replace(/\{\s*\"\$oid\"\s*\:\s*\"([0-9a-f]+)\"\s*\}/g, (m, id) => `ObjectId("${id}")`) + .replace(/\{\s*\"\$bigint\"\s*\:\s*\"([0-9]+)\"\s*\}/g, (m, num) => `${num}n`); } /** @type {import('dbgate-types').SqlDialect} */