mongo query splitter, copy as mongo insert

This commit is contained in:
Jan Prochazka
2021-12-02 10:00:48 +01:00
parent 368993597c
commit 536897a84c
10 changed files with 67 additions and 14 deletions

View File

@@ -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,

View File

@@ -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 = {

View File

@@ -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})']);
});