1 | 'use strict';
|
2 |
|
3 | const EOL = require('os').EOL;
|
4 | const utils = require('./utils');
|
5 |
|
6 | const parsingErrorCode = {
|
7 | unclosedMLC: 0,
|
8 | unclosedText: 1,
|
9 | unclosedQI: 2,
|
10 | multiLineQI: 3
|
11 | };
|
12 |
|
13 | Object.freeze(parsingErrorCode);
|
14 |
|
15 | const errorMessages = [
|
16 | {name: 'unclosedMLC', message: 'Unclosed multi-line comment.'},
|
17 | {name: 'unclosedText', message: 'Unclosed text block.'},
|
18 | {name: 'unclosedQI', message: 'Unclosed quoted identifier.'},
|
19 | {name: 'multiLineQI', message: 'Multi-line quoted identifiers are not supported.'}
|
20 | ];
|
21 |
|
22 | class SQLParsingError extends Error {
|
23 | constructor(code, position) {
|
24 | const err = errorMessages[code].message;
|
25 | const message = 'Error parsing SQL at {line:' + position.line + ',col:' + position.column + '}: ' + err;
|
26 | super(message);
|
27 | this.name = this.constructor.name;
|
28 | this.error = err;
|
29 | this.code = code;
|
30 | this.position = position;
|
31 | Error.captureStackTrace(this, this.constructor);
|
32 | }
|
33 | }
|
34 |
|
35 | SQLParsingError.prototype.toString = function (level) {
|
36 | level = level > 0 ? parseInt(level) : 0;
|
37 | const gap = utils.messageGap(level + 1);
|
38 | const lines = [
|
39 | 'SQLParsingError {',
|
40 | gap + 'code: parsingErrorCode.' + errorMessages[this.code].name,
|
41 | gap + 'error: "' + this.error + '"',
|
42 | gap + 'position: {line: ' + this.position.line + ', col: ' + this.position.column + '}',
|
43 | utils.messageGap(level) + '}'
|
44 | ];
|
45 | return lines.join(EOL);
|
46 | };
|
47 |
|
48 | utils.addInspection(SQLParsingError, function () {
|
49 | return this.toString();
|
50 | });
|
51 |
|
52 | module.exports = {
|
53 | SQLParsingError,
|
54 | parsingErrorCode
|
55 | };
|