From 6c797869c666eace49cac2b6d35dd2f35092c6a5 Mon Sep 17 00:00:00 2001 From: sbosse Date: Mon, 21 Jul 2025 23:09:35 +0200 Subject: [PATCH] Mon 21 Jul 22:43:21 CEST 2025 --- js/db/sqljson.js | 290 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 290 insertions(+) create mode 100644 js/db/sqljson.js diff --git a/js/db/sqljson.js b/js/db/sqljson.js new file mode 100644 index 0000000..0640088 --- /dev/null +++ b/js/db/sqljson.js @@ -0,0 +1,290 @@ + + +var Utils = { + // pack generic number arrays into byte buffer (with support for array arrays) + array2buffer : function (array,typ,space) { + var size=array.length,dsize=4; + typ=typ||'uint32'; + if (!space && Utils.isArray(array[0])) { + space=[size,array[0].length]; + if (Utils.isArray(array[0][0])) space.push(array[0][0].length); + } + if (space) size=space.reduce(function (a,b) { return a*b }); + if (!space) space=[size]; + switch (typ) { + case 'number': dsize=8; break; + case 'uint16': dsize=2; break; + case 'uint32': dsize=4; break; + case 'int16': dsize=2; break; + case 'int32': dsize=4; break; + case 'float32': dsize=4; break; + case 'float64': dsize=8; break; + } + var b=Buffer(size*dsize); + function set(v,off) { + switch (typ) { + case 'uint16': b.writeUInt16LE(v,off); break; + case 'uint32': b.writeUInt32LE(v,off); break; + case 'int16': b.writeInt16LE(v,off); break; + case 'int32': b.writeInt32LE(v,off); break; + case 'float32': b.writeFloatLE(v,off); break; + case 'float64': + case 'number': + default: + b.writeDoubleLE(v,off); break; + } + } + var v,off=0; + for(var i=0;i0) dsize=8; + else if (typ.indexOf('32')>0) dsize=4; + else if (typ.indexOf('16')>0) dsize=2; + else if (typ.indexOf('8')>0) dsize=1; + typ=typ.toLowerCase(); + if (space) size=space.reduce(function (a,b) { return a*b }); + if (!space) space=[bsize/dsize]; + if (size && (size*dsize)!=buffer.length) return new Error('EINVALID'); + + function get(off) { + switch (typ) { + case 'uint8': return buffer.readUInt8(off); break; + case 'uint16': return buffer.readUInt16LE(off); break; + case 'uint32': return buffer.readUInt32LE(off); break; + case 'int8': return buffer.readInt8(off); break; + case 'int16': return buffer.readInt16LE(off); break; + case 'int32': return buffer.readInt32LE(off); break; + case 'float32': return buffer.readFloatLE(off); break; + case 'float64': + case 'number': + default: + return buffer.readDoubleLE(off); break; + } + } + var v,off=0; + for(var i=0;i