( messages: Array<BackendMessage>, defaultParsers: Record<number | string, Parser>, options?: QueryOptions, blob?: Blob, )
| 13 | * https://www.postgresql.org/docs/current/protocol-flow.html#PROTOCOL-FLOW-SIMPLE-QUERY |
| 14 | */ |
| 15 | export function parseResults( |
| 16 | messages: Array<BackendMessage>, |
| 17 | defaultParsers: Record<number | string, Parser>, |
| 18 | options?: QueryOptions, |
| 19 | blob?: Blob, |
| 20 | ): Array<Results> { |
| 21 | const resultSets: Results[] = [] |
| 22 | let currentResultSet: Results = { rows: [], fields: [] } |
| 23 | let affectedRows = 0 |
| 24 | const parsers = { ...defaultParsers, ...options?.parsers } |
| 25 | |
| 26 | messages.forEach((message) => { |
| 27 | switch (message.name) { |
| 28 | case 'rowDescription': { |
| 29 | const msg = message as RowDescriptionMessage |
| 30 | currentResultSet.fields = msg.fields.map((field) => ({ |
| 31 | name: field.name, |
| 32 | dataTypeID: field.dataTypeID, |
| 33 | })) |
| 34 | break |
| 35 | } |
| 36 | case 'dataRow': { |
| 37 | if (!currentResultSet) break |
| 38 | const msg = message as DataRowMessage |
| 39 | if (options?.rowMode === 'array') { |
| 40 | currentResultSet.rows.push( |
| 41 | msg.fields.map((field, i) => |
| 42 | parseType(field, currentResultSet!.fields[i].dataTypeID, parsers), |
| 43 | ), |
| 44 | ) |
| 45 | } else { |
| 46 | // rowMode === "object" |
| 47 | currentResultSet.rows.push( |
| 48 | Object.fromEntries( |
| 49 | msg.fields.map((field, i) => [ |
| 50 | currentResultSet!.fields[i].name, |
| 51 | parseType( |
| 52 | field, |
| 53 | currentResultSet!.fields[i].dataTypeID, |
| 54 | parsers, |
| 55 | ), |
| 56 | ]), |
| 57 | ), |
| 58 | ) |
| 59 | } |
| 60 | break |
| 61 | } |
| 62 | case 'commandComplete': { |
| 63 | const msg = message as CommandCompleteMessage |
| 64 | affectedRows += retrieveRowCount(msg) |
| 65 | |
| 66 | resultSets.push({ |
| 67 | ...currentResultSet, |
| 68 | affectedRows, |
| 69 | ...(blob ? { blob } : {}), |
| 70 | }) |
| 71 | |
| 72 | currentResultSet = { rows: [], fields: [] } |
no test coverage detected