UNPKG

postgrejs

Version:

Professional PostgreSQL client NodeJS

42 lines (41 loc) 1.54 kB
import { DataTypeOIDs } from '../constants.js'; import { arrayCalculateDim } from './array-calculatedim.js'; export function encodeBinaryArray(io, value, itemOid, options, encode, encodeCalculateDimFn) { encodeCalculateDimFn = encodeCalculateDimFn || arrayCalculateDim; itemOid = itemOid || DataTypeOIDs.varchar; const dim = encodeCalculateDimFn(value); const ndims = dim.length; const zeroOffset = io.offset; io.writeInt32BE(ndims) // Number of dimensions .writeInt32BE(0) // reserved for has-null flag .writeInt32BE(itemOid); for (let d = 0; d < ndims; d++) { io.writeInt32BE(dim[d]); // Number of items in dimension io.writeInt32BE(0); // LBound always 0. } let hasNull = false; let pos; const writeDim = (arr, level) => { const elemCount = dim[level]; for (let i = 0; i < elemCount; i++) { if (level < dim.length - 1) { writeDim(arr && arr[i], level + 1); continue; } // if value is null if (!arr || arr[i] == null) { hasNull = true; io.writeInt32BE(-1); continue; } io.writeInt32BE(0); // reserved for data len pos = io.offset; encode(io, arr[i], options); // Update item data size io.buffer.writeInt32BE(io.length - pos, pos - 4); } }; writeDim(value, 0); if (hasNull) io.buffer.writeInt32BE(1, zeroOffset + 4); }