mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-18 07:56:01 +00:00
#187 split query stream
This commit is contained in:
41
packages/query-splitter/src/splitQueryStream.ts
Normal file
41
packages/query-splitter/src/splitQueryStream.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
import stream from 'stream';
|
||||
import { SplitStreamContext, getInitialDelimiter, SplitLineContext, splitQueryLine } from './splitQuery';
|
||||
import { SplitterOptions } from './options';
|
||||
|
||||
export class SplitQueryStream extends stream.Transform {
|
||||
context: SplitStreamContext;
|
||||
|
||||
constructor(options: SplitterOptions) {
|
||||
super({ objectMode: true });
|
||||
this.context = {
|
||||
commandPart: '',
|
||||
options,
|
||||
currentDelimiter: getInitialDelimiter(options),
|
||||
pushOutput: cmd => this.push(cmd),
|
||||
};
|
||||
}
|
||||
_transform(chunk, encoding, done) {
|
||||
const lineContext: SplitLineContext = {
|
||||
...this.context,
|
||||
position: 0,
|
||||
currentCommandStart: 0,
|
||||
wasDataOnLine: false,
|
||||
source: chunk,
|
||||
end: chunk.length,
|
||||
};
|
||||
splitQueryLine(lineContext);
|
||||
this.context.commandPart = lineContext.commandPart;
|
||||
done();
|
||||
}
|
||||
_flush(done) {
|
||||
const trimmed = this.context.commandPart;
|
||||
if (trimmed) this.push(trimmed);
|
||||
done();
|
||||
}
|
||||
}
|
||||
|
||||
export function splitQueryStream(sourceStream, options: SplitterOptions) {
|
||||
const splitter = new SplitQueryStream(options);
|
||||
sourceStream.pipe(splitter);
|
||||
return splitter;
|
||||
}
|
||||
Reference in New Issue
Block a user