first commit
This commit is contained in:
104
client/bin_decoder.js
Normal file
104
client/bin_decoder.js
Normal file
@@ -0,0 +1,104 @@
|
||||
'use strict';
|
||||
|
||||
function ArrayBufferSer(arrayBuffer) {
|
||||
this.buffer = arrayBuffer;
|
||||
this.offset = 0;
|
||||
this.sections = this.readArray();
|
||||
this.headers = this.sections[0];
|
||||
this._headersIndex = {};
|
||||
for(var i = 0; i < this.headers.length; ++i) {
|
||||
this._headersIndex[this.headers[i]] = i;
|
||||
}
|
||||
if(this.sections.length > 1) {
|
||||
this.length = this.sections[1].length;
|
||||
}
|
||||
}
|
||||
|
||||
ArrayBufferSer.INT8 = 1;
|
||||
ArrayBufferSer.UINT8 = 2;
|
||||
ArrayBufferSer.UINT8_CLAMP = 3;
|
||||
ArrayBufferSer.INT16 = 4;
|
||||
ArrayBufferSer.UINT16 = 5;
|
||||
ArrayBufferSer.INT32 = 6;
|
||||
ArrayBufferSer.UINT32 = 7;
|
||||
ArrayBufferSer.FLOAT32 = 8;
|
||||
//ArrayBufferSer.FLOAT64 = 9; not supported
|
||||
ArrayBufferSer.STRING = 10;
|
||||
ArrayBufferSer.BUFFER = 11;
|
||||
|
||||
|
||||
ArrayBufferSer.prototype = {
|
||||
|
||||
sizes: [NaN, 1, 1, 1, 2, 2, 4, 4, 4, 8],
|
||||
|
||||
types: [
|
||||
null,
|
||||
Int8Array,
|
||||
Uint8Array,
|
||||
Uint8ClampedArray,
|
||||
Int16Array,
|
||||
Uint16Array,
|
||||
Int32Array,
|
||||
Uint32Array,
|
||||
Float32Array,
|
||||
Float64Array
|
||||
],
|
||||
|
||||
get: function(columnName) {
|
||||
var i = this._headersIndex[columnName]
|
||||
if(i != undefined) {
|
||||
return this.sections[i + 1]
|
||||
}
|
||||
return;
|
||||
},
|
||||
|
||||
_paddingFor: function(offset, type) {
|
||||
var s = this.sizes[type]
|
||||
if(s) {
|
||||
var r = offset % s;
|
||||
return r == 0 ? 0 : s - r;
|
||||
}
|
||||
return 0;
|
||||
},
|
||||
|
||||
readUInt32: function() {
|
||||
var i = new DataView(this.buffer).getUint32(this.offset);
|
||||
this.offset += 4;
|
||||
return i
|
||||
},
|
||||
|
||||
readArray: function() {
|
||||
var type = this.readUInt32();
|
||||
var size = this.readUInt32();
|
||||
if(type < ArrayBufferSer.STRING) {
|
||||
var a = new this.types[type](this.buffer, this.offset, size/this.sizes[type]);
|
||||
this.offset += size;
|
||||
return a;
|
||||
} else if(type == ArrayBufferSer.STRING) {
|
||||
var target = this.offset + size;
|
||||
var b = [];
|
||||
while(this.offset < target) {
|
||||
this.offset += this._paddingFor(this.offset, ArrayBufferSer.INT32);
|
||||
var arr = this.readArray();
|
||||
if(arr) {
|
||||
var str = '';
|
||||
for(var i = 0; i < arr.length; ++i) {
|
||||
str += String.fromCharCode(arr[i]);
|
||||
}
|
||||
b.push(str);
|
||||
}
|
||||
// parse sttring
|
||||
}
|
||||
return b;
|
||||
} else if(type == ArrayBufferSer.BUFFER) {
|
||||
var b = [];
|
||||
var target = this.offset + size;
|
||||
while(this.offset < target) {
|
||||
this.offset += this._paddingFor(this.offset, ArrayBufferSer.INT32);
|
||||
b.push(this.readArray());
|
||||
}
|
||||
return b;
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
32
client/test.html
Normal file
32
client/test.html
Normal file
@@ -0,0 +1,32 @@
|
||||
|
||||
<html>
|
||||
<body>
|
||||
<script src="bin_decoder.js"></script>
|
||||
<script>
|
||||
function get(url, callback) {
|
||||
var req = new XMLHttpRequest();
|
||||
req.onreadystatechange = function() {
|
||||
if (req.readyState == 4){
|
||||
if (req.status == 200){
|
||||
callback(req);
|
||||
} else {
|
||||
callback(null);
|
||||
}
|
||||
}
|
||||
};
|
||||
req.open("GET", url, true)
|
||||
req.responseType = 'arraybuffer';
|
||||
req.send(null)
|
||||
return req;
|
||||
}
|
||||
|
||||
var q = 'select%20owner,%20array_agg(lat::integer)%20as%20arr_lat__int8,%20array_agg(long)%20as%20arr_long%20%20%20from%20antenas%20%20group%20by%20owner,%20lat,%20long%20limit%2020';
|
||||
|
||||
get('http://development.localhost.lan:8080/api/v1/sql?q=' + q+ '&format=bin', function(req) {
|
||||
var b = new ArrayBufferSer(req.response);
|
||||
console.log(b.length);
|
||||
window.b = b;
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user