Commit 6d43ef8b by Konstantin Käfer

add tracing support. Enable with sqlite3.verbose()

parent 230674ef
var sqlite3 = module.exports = exports = require('./sqlite3_bindings');
var sys = require("sys");
var Database = sqlite3.Database;
var Statement = sqlite3.Statement;
......@@ -49,3 +47,23 @@ Database.prototype.each = function(sql) {
statement.each.apply(statement, Array.prototype.slice.call(arguments, 1)).finalize();
return this;
}
// Save the stack trace over EIO callbacks.
sqlite3.verbose = function() {
var trace = require('./trace');
trace.extendTrace(Database.prototype, 'prepare');
trace.extendTrace(Database.prototype, 'get');
trace.extendTrace(Database.prototype, 'run');
trace.extendTrace(Database.prototype, 'all');
trace.extendTrace(Database.prototype, 'each');
trace.extendTrace(Database.prototype, 'exec');
trace.extendTrace(Database.prototype, 'close');
trace.extendTrace(Statement.prototype, 'bind');
trace.extendTrace(Statement.prototype, 'get');
trace.extendTrace(Statement.prototype, 'run');
trace.extendTrace(Statement.prototype, 'all');
trace.extendTrace(Statement.prototype, 'each');
trace.extendTrace(Statement.prototype, 'reset');
trace.extendTrace(Statement.prototype, 'finalize');
return this;
};
// Inspired by https://github.com/tlrobinson/long-stack-traces
var EventEmitter = require('events').EventEmitter;
var util = require('util');
function extendTrace(object, property) {
var old = object[property];
object[property] = function(x) {
var error = new Error();
var name = object.constructor.name + '#' + property + '(' +
Array.prototype.slice.call(arguments).map(function(el) {
return util.inspect(el, false, 0);
}).join(', ') + ')';
var last = arguments.length - 1;
var cb = arguments[last];
if (typeof arguments[last] === 'function') {
arguments[last] = function replacement() {
try {
return cb.apply(this, arguments);
} catch (err) {
if (err && err.stack && !err.__augmented) {
err.stack = filter(err).join('\n');
err.stack += '\n--> in ' + name;
err.stack += '\n' + filter(error).slice(1).join('\n');
err.__augmented = true;
}
throw err;
}
};
}
return old.apply(this, arguments);
};
}
exports.extendTrace = extendTrace;
function filter(error) {
return error.stack.split('\n').filter(function(line) {
return line.indexOf(__filename) < 0;
});
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment