postgrejs
Version:
Professional PostgreSQL client NodeJS
45 lines (44 loc) • 1.71 kB
JavaScript
;
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);
}