import { Column } from "../query/decode.ts";import { PacketReader } from "./packet.ts";import { RowDescription } from "../query/query.ts";
export class Message { public reader: PacketReader;
constructor( public type: string, public byteCount: number, public body: Uint8Array, ) { this.reader = new PacketReader(body); }}
export interface Notice { 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 function parseBackendKeyMessage(message: Message): { pid: number; secret_key: number;} { return { pid: message.reader.readInt32(), secret_key: message.reader.readInt32(), };}
export function parseCommandCompleteMessage(message: Message): string { return message.reader.readString(message.byteCount);}
export function parseNoticeMessage(message: Message): Notice { const error_fields: any = {};
let byte: number; let field_code: string; let field_value: string;
while ((byte = message.reader.readByte())) { field_code = String.fromCharCode(byte); field_value = message.reader.readCString();
switch (field_code) { case "S": error_fields.severity = field_value; break; case "C": error_fields.code = field_value; break; case "M": error_fields.message = field_value; break; case "D": error_fields.detail = field_value; break; case "H": error_fields.hint = field_value; break; case "P": error_fields.position = field_value; break; case "p": error_fields.internalPosition = field_value; break; case "q": error_fields.internalQuery = field_value; break; case "W": error_fields.where = field_value; break; case "s": error_fields.schema = field_value; break; case "t": error_fields.table = field_value; break; case "c": error_fields.column = field_value; break; case "d": error_fields.dataTypeName = field_value; break; case "n": error_fields.constraint = field_value; break; case "F": error_fields.file = field_value; break; case "L": error_fields.line = field_value; break; case "R": error_fields.routine = field_value; break; default: break; } }
return error_fields;}
export function parseRowDataMessage(message: Message): any[] { const field_count = message.reader.readInt16(); const row = [];
for (let i = 0; i < field_count; i++) { const col_length = message.reader.readInt32();
if (col_length == -1) { row.push(null); continue; }
row.push(message.reader.readBytes(col_length)); }
return row;}
export function parseRowDescriptionMessage(message: Message): RowDescription { const column_count = message.reader.readInt16(); const columns = [];
for (let i = 0; i < column_count; i++) { const column = new Column( message.reader.readCString(), message.reader.readInt32(), message.reader.readInt16(), message.reader.readInt32(), message.reader.readInt16(), message.reader.readInt32(), message.reader.readInt16(), ); columns.push(column); }
return new RowDescription(column_count, columns);}