node-query/node_modules/node-firebird/lib/messages.js

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);
});
});
};