swc/crates/swc_bundler/tests/.cache/untrusted/717565b0ff7c78eae48cbf62b565c0619327a9ef.ts
2021-11-09 20:42:49 +09:00

122 lines
2.8 KiB
TypeScript

// Loaded from https://raw.githubusercontent.com/deno-postgres/deno-postgres/master/connection/warning.ts
import type { Message } from "./connection.ts";
export interface WarningFields {
severity: string;
code: string;
message: string;
detail?: string;
hint?: string;
position?: string;
internalPosition?: string;
internalQuery?: string;
where?: string;
schema?: string;
table?: string;
column?: string;
dataType?: string;
constraint?: string;
file?: string;
line?: string;
routine?: string;
}
export class PostgresError extends Error {
public fields: WarningFields;
constructor(fields: WarningFields) {
super(fields.message);
this.fields = fields;
this.name = "PostgresError";
}
}
export function parseError(msg: Message): PostgresError {
return new PostgresError(parseWarning(msg));
}
export function parseNotice(msg: Message): WarningFields {
return parseWarning(msg);
}
/**
* https://www.postgresql.org/docs/current/protocol-error-fields.html
* */
function parseWarning(msg: Message): WarningFields {
// https://www.postgresql.org/docs/current/protocol-error-fields.html
// deno-lint-ignore no-explicit-any
const errorFields: any = {};
let byte: number;
let char: string;
let errorMsg: string;
while ((byte = msg.reader.readByte())) {
char = String.fromCharCode(byte);
errorMsg = msg.reader.readCString();
switch (char) {
case "S":
errorFields.severity = errorMsg;
break;
case "C":
errorFields.code = errorMsg;
break;
case "M":
errorFields.message = errorMsg;
break;
case "D":
errorFields.detail = errorMsg;
break;
case "H":
errorFields.hint = errorMsg;
break;
case "P":
errorFields.position = errorMsg;
break;
case "p":
errorFields.internalPosition = errorMsg;
break;
case "q":
errorFields.internalQuery = errorMsg;
break;
case "W":
errorFields.where = errorMsg;
break;
case "s":
errorFields.schema = errorMsg;
break;
case "t":
errorFields.table = errorMsg;
break;
case "c":
errorFields.column = errorMsg;
break;
case "d":
errorFields.dataTypeName = errorMsg;
break;
case "n":
errorFields.constraint = errorMsg;
break;
case "F":
errorFields.file = errorMsg;
break;
case "L":
errorFields.line = errorMsg;
break;
case "R":
errorFields.routine = errorMsg;
break;
default:
// from Postgres docs
// > Since more field types might be added in future,
// > frontends should silently ignore fields of unrecognized type.
break;
}
}
return errorFields;
}