UNPKG

postgrejs

Version:

Professional PostgreSQL client NodeJS

45 lines (44 loc) 1.71 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.encodeBinaryArray = encodeBinaryArray; const constants_js_1 = require("../constants.js"); const array_calculatedim_js_1 = require("./array-calculatedim.js"); function encodeBinaryArray(io, value, itemOid, options, encode, encodeCalculateDimFn) { encodeCalculateDimFn = encodeCalculateDimFn || array_calculatedim_js_1.arrayCalculateDim; itemOid = itemOid || constants_js_1.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); }