mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-20 00:46:01 +00:00
mongo query splitter, copy as mongo insert
This commit is contained in:
@@ -8,6 +8,9 @@ export interface SplitterOptions {
|
||||
allowGoDelimiter: boolean;
|
||||
allowDollarDollarString: boolean;
|
||||
noSplit: boolean;
|
||||
doubleDashComments: boolean;
|
||||
multilineComments: boolean;
|
||||
javaScriptComments: boolean;
|
||||
}
|
||||
|
||||
export const defaultSplitterOptions: SplitterOptions = {
|
||||
@@ -20,6 +23,10 @@ export const defaultSplitterOptions: SplitterOptions = {
|
||||
allowGoDelimiter: false,
|
||||
allowDollarDollarString: false,
|
||||
noSplit: false,
|
||||
|
||||
doubleDashComments: true,
|
||||
multilineComments: true,
|
||||
javaScriptComments: false,
|
||||
};
|
||||
|
||||
export const mysqlSplitterOptions: SplitterOptions = {
|
||||
@@ -59,6 +66,14 @@ export const sqliteSplitterOptions: SplitterOptions = {
|
||||
stringEscapes: { "'": "'", '"': '"' },
|
||||
};
|
||||
|
||||
export const mongoSplitterOptions: SplitterOptions = {
|
||||
...defaultSplitterOptions,
|
||||
|
||||
stringsBegins: ["'", '"'],
|
||||
stringsEnds: { "'": "'", '"': '"' },
|
||||
stringEscapes: { "'": '\\', '"': '\\' },
|
||||
};
|
||||
|
||||
export const noSplitSplitterOptions: SplitterOptions = {
|
||||
...defaultSplitterOptions,
|
||||
|
||||
|
||||
@@ -113,7 +113,7 @@ function scanToken(context: SplitLineContext): Token {
|
||||
return EOLN_TOKEN;
|
||||
}
|
||||
|
||||
if (ch == '-' && s[pos + 1] == '-') {
|
||||
if (context.options.doubleDashComments && ch == '-' && s[pos + 1] == '-') {
|
||||
while (pos < context.end && s[pos] != '\n') pos++;
|
||||
return {
|
||||
type: 'comment',
|
||||
@@ -121,7 +121,7 @@ function scanToken(context: SplitLineContext): Token {
|
||||
};
|
||||
}
|
||||
|
||||
if (ch == '/' && s[pos + 1] == '*') {
|
||||
if (context.options.multilineComments && ch == '/' && s[pos + 1] == '*') {
|
||||
pos += 2;
|
||||
while (pos < context.end) {
|
||||
if (s[pos] == '*' && s[pos + 1] == '/') break;
|
||||
@@ -222,7 +222,7 @@ export function splitQueryLine(context: SplitLineContext) {
|
||||
}
|
||||
|
||||
export function getInitialDelimiter(options: SplitterOptions) {
|
||||
return options?.allowSemicolon === false ? null : SEMICOLON
|
||||
return options?.allowSemicolon === false ? null : SEMICOLON;
|
||||
}
|
||||
export function splitQuery(sql: string, options: SplitterOptions = null): string[] {
|
||||
const usedOptions = {
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
import { mysqlSplitterOptions, mssqlSplitterOptions, postgreSplitterOptions, noSplitSplitterOptions } from './options';
|
||||
import {
|
||||
mysqlSplitterOptions,
|
||||
mssqlSplitterOptions,
|
||||
postgreSplitterOptions,
|
||||
mongoSplitterOptions,
|
||||
noSplitSplitterOptions,
|
||||
} from './options';
|
||||
import { splitQuery } from './splitQuery';
|
||||
|
||||
test('simple query', () => {
|
||||
@@ -77,3 +83,9 @@ test('no split', () => {
|
||||
const output = splitQuery(input, noSplitSplitterOptions);
|
||||
expect(output).toEqual(['SELECT 1;SELECT 2']);
|
||||
});
|
||||
|
||||
test('split mongo', () => {
|
||||
const input = 'db.collection.insert({x:1});db.collection.insert({y:2})';
|
||||
const output = splitQuery(input, mongoSplitterOptions);
|
||||
expect(output).toEqual(['db.collection.insert({x:1})', 'db.collection.insert({y:2})']);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user