mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-20 11:16:01 +00:00
JSON array export file format, quick exports JSON, JSONL
This commit is contained in:
@@ -6,6 +6,7 @@ const copyStream = require('./copyStream');
|
|||||||
const fakeObjectReader = require('./fakeObjectReader');
|
const fakeObjectReader = require('./fakeObjectReader');
|
||||||
const consoleObjectWriter = require('./consoleObjectWriter');
|
const consoleObjectWriter = require('./consoleObjectWriter');
|
||||||
const jsonLinesWriter = require('./jsonLinesWriter');
|
const jsonLinesWriter = require('./jsonLinesWriter');
|
||||||
|
const jsonArrayWriter = require('./jsonArrayWriter');
|
||||||
const jsonLinesReader = require('./jsonLinesReader');
|
const jsonLinesReader = require('./jsonLinesReader');
|
||||||
const jslDataReader = require('./jslDataReader');
|
const jslDataReader = require('./jslDataReader');
|
||||||
const archiveWriter = require('./archiveWriter');
|
const archiveWriter = require('./archiveWriter');
|
||||||
@@ -26,6 +27,7 @@ const dbgateApi = {
|
|||||||
tableReader,
|
tableReader,
|
||||||
copyStream,
|
copyStream,
|
||||||
jsonLinesWriter,
|
jsonLinesWriter,
|
||||||
|
jsonArrayWriter,
|
||||||
jsonLinesReader,
|
jsonLinesReader,
|
||||||
fakeObjectReader,
|
fakeObjectReader,
|
||||||
consoleObjectWriter,
|
consoleObjectWriter,
|
||||||
|
|||||||
51
packages/api/src/shell/jsonArrayWriter.js
Normal file
51
packages/api/src/shell/jsonArrayWriter.js
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
const stream = require('stream');
|
||||||
|
|
||||||
|
class StringifyStream extends stream.Transform {
|
||||||
|
constructor() {
|
||||||
|
super({ objectMode: true });
|
||||||
|
this.wasHeader = false;
|
||||||
|
this.wasRecord = false;
|
||||||
|
}
|
||||||
|
_transform(chunk, encoding, done) {
|
||||||
|
let skip = false;
|
||||||
|
|
||||||
|
if (!this.wasHeader) {
|
||||||
|
skip =
|
||||||
|
chunk.__isStreamHeader ||
|
||||||
|
// TODO remove isArray test
|
||||||
|
Array.isArray(chunk.columns);
|
||||||
|
this.wasHeader = true;
|
||||||
|
}
|
||||||
|
if (!skip) {
|
||||||
|
if (!this.wasRecord) {
|
||||||
|
this.push('[\n');
|
||||||
|
} else {
|
||||||
|
this.push(',\n');
|
||||||
|
}
|
||||||
|
this.wasRecord = true;
|
||||||
|
|
||||||
|
this.push(JSON.stringify(chunk));
|
||||||
|
}
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
|
||||||
|
_flush() {
|
||||||
|
if (!this.wasRecord) {
|
||||||
|
this.push('[]\n');
|
||||||
|
} else {
|
||||||
|
this.push('\n]\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function jsonArrayWriter({ fileName, encoding = 'utf-8' }) {
|
||||||
|
console.log(`Writing file ${fileName}`);
|
||||||
|
const stringify = new StringifyStream();
|
||||||
|
const fileStream = fs.createWriteStream(fileName, encoding);
|
||||||
|
stringify.pipe(fileStream);
|
||||||
|
stringify['finisher'] = fileStream;
|
||||||
|
return stringify;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = jsonArrayWriter;
|
||||||
@@ -45,14 +45,6 @@
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildQuickExports(plugins) {
|
|
||||||
const res = [];
|
|
||||||
for (const { content } of plugins) {
|
|
||||||
if (content.quickExports) res.push(...content.quickExports);
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function buildExtensions(plugins) {
|
export function buildExtensions(plugins) {
|
||||||
const extensions = {
|
const extensions = {
|
||||||
plugins,
|
plugins,
|
||||||
@@ -71,7 +63,7 @@
|
|||||||
import { extensions, loadingPluginStore } from '../stores';
|
import { extensions, loadingPluginStore } from '../stores';
|
||||||
import axiosInstance from '../utility/axiosInstance';
|
import axiosInstance from '../utility/axiosInstance';
|
||||||
import { useInstalledPlugins } from '../utility/metadataLoaders';
|
import { useInstalledPlugins } from '../utility/metadataLoaders';
|
||||||
import { buildFileFormats } from './fileformats';
|
import { buildFileFormats, buildQuickExports } from './fileformats';
|
||||||
import { buildThemes } from './themes';
|
import { buildThemes } from './themes';
|
||||||
import dbgateTools from 'dbgate-tools';
|
import dbgateTools from 'dbgate-tools';
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { FileFormatDefinition } from 'dbgate-types';
|
import { FileFormatDefinition, QuickExportDefinition } from 'dbgate-types';
|
||||||
|
|
||||||
const jsonlFormat = {
|
const jsonlFormat = {
|
||||||
storageType: 'jsonl',
|
storageType: 'jsonl',
|
||||||
@@ -8,8 +8,37 @@ const jsonlFormat = {
|
|||||||
writerFunc: 'jsonLinesWriter',
|
writerFunc: 'jsonLinesWriter',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const jsonFormat = {
|
||||||
|
storageType: 'json',
|
||||||
|
extension: 'json',
|
||||||
|
name: 'JSON',
|
||||||
|
writerFunc: 'jsonArrayWriter',
|
||||||
|
};
|
||||||
|
|
||||||
|
const jsonlQuickExport = {
|
||||||
|
label: 'JSON lines',
|
||||||
|
extension: 'jsonl',
|
||||||
|
createWriter: fileName => ({
|
||||||
|
functionName: 'jsonLinesWriter',
|
||||||
|
props: {
|
||||||
|
fileName,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
|
||||||
|
const jsonQuickExport = {
|
||||||
|
label: 'JSON',
|
||||||
|
extension: 'json',
|
||||||
|
createWriter: fileName => ({
|
||||||
|
functionName: 'jsonArrayWriter',
|
||||||
|
props: {
|
||||||
|
fileName,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
|
||||||
export function buildFileFormats(plugins): FileFormatDefinition[] {
|
export function buildFileFormats(plugins): FileFormatDefinition[] {
|
||||||
const res = [jsonlFormat];
|
const res = [jsonlFormat, jsonFormat];
|
||||||
for (const { content } of plugins) {
|
for (const { content } of plugins) {
|
||||||
const { fileFormats } = content;
|
const { fileFormats } = content;
|
||||||
if (fileFormats) res.push(...fileFormats);
|
if (fileFormats) res.push(...fileFormats);
|
||||||
@@ -17,6 +46,14 @@ export function buildFileFormats(plugins): FileFormatDefinition[] {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function buildQuickExports(plugins): QuickExportDefinition[] {
|
||||||
|
const res = [jsonQuickExport, jsonlQuickExport];
|
||||||
|
for (const { content } of plugins) {
|
||||||
|
if (content.quickExports) res.push(...content.quickExports);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
export function findFileFormat(extensions, storageType) {
|
export function findFileFormat(extensions, storageType) {
|
||||||
return extensions.fileFormats.find(x => x.storageType == storageType);
|
return extensions.fileFormats.find(x => x.storageType == storageType);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user