162 lines
4.3 KiB
JavaScript
162 lines
4.3 KiB
JavaScript
|
var fs = require('fs');
|
||
|
|
||
|
const
|
||
|
//ISC_MASK = 0x14000000, // Defines the code as a valid ISC code
|
||
|
FAC_MASK = 0x00FF0000, // Specifies the facility where the code is located
|
||
|
CODE_MASK = 0x0000FFFF, // Specifies the code in the message file
|
||
|
CLASS_MASK = 0xF0000000; // Defines the code as warning, error, info, or other
|
||
|
|
||
|
var msgNumber = exports.msgNumber = function(facility, code) {
|
||
|
return (facility * 10000 + code);
|
||
|
};
|
||
|
|
||
|
var getCode = exports.getCode = function(code) {
|
||
|
return (code & CODE_MASK)
|
||
|
};
|
||
|
|
||
|
var getFacility = exports.getFacility = function(code) {
|
||
|
return (code & FAC_MASK) >> 16;
|
||
|
};
|
||
|
|
||
|
exports.getClass = function(code) {
|
||
|
return (code & CLASS_MASK) >> 30
|
||
|
};
|
||
|
|
||
|
exports.lookupMessages = function(status, callback){
|
||
|
|
||
|
var handle;
|
||
|
var bucket_size;
|
||
|
var top_tree;
|
||
|
var levels;
|
||
|
var buffer;
|
||
|
|
||
|
function lookup(item, callback) {
|
||
|
|
||
|
var code = msgNumber(getFacility(item.gdscode), getCode(item.gdscode));
|
||
|
|
||
|
function readIndex(stackSize, position) {
|
||
|
|
||
|
function readNode(from) {
|
||
|
var ret = {};
|
||
|
ret.code = buffer.readUInt32LE(from);
|
||
|
ret.seek = buffer.readUInt32LE(from + 4);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
fs.read(handle, buffer, 0, bucket_size, position, function(err, bufferSize) {
|
||
|
|
||
|
if (bufferSize <= 0) {
|
||
|
callback();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (stackSize === levels) {
|
||
|
search();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var from = 0;
|
||
|
var node = readNode(from);
|
||
|
|
||
|
while (true) {
|
||
|
|
||
|
if (node.code >= code)
|
||
|
{
|
||
|
readIndex(stackSize + 1, node.seek);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
from += 8;
|
||
|
if (from >= bufferSize)
|
||
|
{
|
||
|
callback();
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
node = readNode(from);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function search() {
|
||
|
|
||
|
function readRec(from) {
|
||
|
|
||
|
function align(v) {
|
||
|
return (v + 3) & ~3;
|
||
|
}
|
||
|
|
||
|
var ret = {};
|
||
|
ret.code = buffer.readUInt32LE(from);
|
||
|
ret.length = buffer.readUInt16LE(from + 4);
|
||
|
|
||
|
if (ret.code == code){
|
||
|
from += 8;
|
||
|
ret.text = buffer.toString(null, from, from + ret.length);
|
||
|
} else
|
||
|
ret.seek = from + align(8 + ret.length, 4);
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
var rec = readRec(0);
|
||
|
|
||
|
while (rec.seek) {
|
||
|
if (rec.seek >= buffer.length)
|
||
|
break;
|
||
|
else
|
||
|
rec = readRec(rec.seek);
|
||
|
}
|
||
|
|
||
|
var str = rec.text;
|
||
|
if (item.params) {
|
||
|
for (var i = 0; i < item.params.length; i++)
|
||
|
str = str.replace('@' + String(i+1), item.params[i]);
|
||
|
}
|
||
|
|
||
|
callback(str);
|
||
|
}
|
||
|
|
||
|
readIndex(1, top_tree);
|
||
|
}
|
||
|
|
||
|
fs.open(__dirname + "/firebird.msg", 'r', function(err, h) {
|
||
|
|
||
|
if (!h) {
|
||
|
callback();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
buffer = new Buffer(14);
|
||
|
fs.read(h, buffer, 0, 14, 0, function(){
|
||
|
|
||
|
handle = h;
|
||
|
bucket_size = buffer.readUInt16LE(2);
|
||
|
top_tree = buffer.readUInt32LE(4);
|
||
|
levels = buffer.readUInt16LE(12);
|
||
|
buffer = new Buffer(bucket_size);
|
||
|
|
||
|
var i = 0;
|
||
|
var text;
|
||
|
|
||
|
function loop() {
|
||
|
lookup(status[i], function(line) {
|
||
|
if (text)
|
||
|
text = text + ', ' + line
|
||
|
else
|
||
|
text = line;
|
||
|
|
||
|
if (i === status.length - 1) {
|
||
|
fs.close(handle);
|
||
|
callback(text);
|
||
|
} else {
|
||
|
i++;
|
||
|
loop();
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
loop(0);
|
||
|
});
|
||
|
});
|
||
|
};
|