123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- var path = require('path');
- var binary = require('node-pre-gyp');
- var path = require('path')
- var binding_path = binary.find(path.resolve(path.join(__dirname,'../package.json')));
- var binding = require(binding_path);
- var sqlite3 = module.exports = exports = binding;
- var util = require('util');
- var EventEmitter = require('events').EventEmitter;
- function errorCallback(args) {
- if (typeof args[args.length - 1] === 'function') {
- var callback = args[args.length - 1];
- return function(err) { if (err) callback(err); };
- }
- }
- function inherits(target, source) {
- for (var k in source.prototype)
- target.prototype[k] = source.prototype[k];
- }
- sqlite3.cached = {
- Database: function(file, a, b) {
- if (file === '' || file === ':memory:') {
- // Don't cache special databases.
- return new Database(file, a, b);
- }
- if (file[0] !== '/') {
- file = path.join(process.cwd(), file);
- }
- if (!sqlite3.cached.objects[file]) {
- var db =sqlite3.cached.objects[file] = new Database(file, a, b);
- }
- else {
- // Make sure the callback is called.
- var db = sqlite3.cached.objects[file];
- var callback = (typeof a === 'number') ? b : a;
- if (typeof callback === 'function') {
- function cb() { callback.call(db, null); }
- if (db.open) process.nextTick(cb);
- else db.once('open', cb);
- }
- }
- return db;
- },
- objects: {}
- };
- var Database = sqlite3.Database;
- var Statement = sqlite3.Statement;
- inherits(Database, EventEmitter);
- inherits(Statement, EventEmitter);
- // Database#prepare(sql, [bind1, bind2, ...], [callback])
- Database.prototype.prepare = function(sql) {
- var params = Array.prototype.slice.call(arguments, 1);
- if (!params.length || (params.length === 1 && typeof params[0] === 'function')) {
- return new Statement(this, sql, params[0]);
- }
- else {
- var statement = new Statement(this, sql, errorCallback(params));
- return statement.bind.apply(statement, params);
- }
- };
- // Database#run(sql, [bind1, bind2, ...], [callback])
- Database.prototype.run = function(sql) {
- var params = Array.prototype.slice.call(arguments, 1);
- var statement = new Statement(this, sql, errorCallback(params));
- statement.run.apply(statement, params).finalize();
- return this;
- };
- // Database#get(sql, [bind1, bind2, ...], [callback])
- Database.prototype.get = function(sql) {
- var params = Array.prototype.slice.call(arguments, 1);
- var statement = new Statement(this, sql, errorCallback(params));
- statement.get.apply(statement, params).finalize();
- return this;
- };
- // Database#all(sql, [bind1, bind2, ...], [callback])
- Database.prototype.all = function(sql) {
- var params = Array.prototype.slice.call(arguments, 1);
- var statement = new Statement(this, sql, errorCallback(params));
- statement.all.apply(statement, params).finalize();
- return this;
- };
- // Database#each(sql, [bind1, bind2, ...], [callback], [complete])
- Database.prototype.each = function(sql) {
- var params = Array.prototype.slice.call(arguments, 1);
- var statement = new Statement(this, sql, errorCallback(params));
- statement.each.apply(statement, params).finalize();
- return this;
- };
- Database.prototype.map = function(sql) {
- var params = Array.prototype.slice.call(arguments, 1);
- var statement = new Statement(this, sql, errorCallback(params));
- statement.map.apply(statement, params).finalize();
- return this;
- };
- Statement.prototype.map = function() {
- var params = Array.prototype.slice.call(arguments);
- var callback = params.pop();
- params.push(function(err, rows) {
- if (err) return callback(err);
- var result = {};
- if (rows.length) {
- var keys = Object.keys(rows[0]), key = keys[0];
- if (keys.length > 2) {
- // Value is an object
- for (var i = 0; i < rows.length; i++) {
- result[rows[i][key]] = rows[i];
- }
- } else {
- var value = keys[1];
- // Value is a plain value
- for (var i = 0; i < rows.length; i++) {
- result[rows[i][key]] = rows[i][value];
- }
- }
- }
- callback(err, result);
- });
- return this.all.apply(this, params);
- };
- var isVerbose = false;
- var supportedEvents = [ 'trace', 'profile', 'insert', 'update', 'delete' ];
- Database.prototype.addListener = Database.prototype.on = function(type) {
- var val = EventEmitter.prototype.addListener.apply(this, arguments);
- if (supportedEvents.indexOf(type) >= 0) {
- this.configure(type, true);
- }
- return val;
- };
- Database.prototype.removeListener = function(type) {
- var val = EventEmitter.prototype.removeListener.apply(this, arguments);
- if (supportedEvents.indexOf(type) >= 0 && !this._events[type]) {
- this.configure(type, false);
- }
- return val;
- };
- Database.prototype.removeAllListeners = function(type) {
- var val = EventEmitter.prototype.removeAllListeners.apply(this, arguments);
- if (supportedEvents.indexOf(type) >= 0) {
- this.configure(type, false);
- }
- return val;
- };
- // Save the stack trace over EIO callbacks.
- sqlite3.verbose = function() {
- if (!isVerbose) {
- 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, 'map');
- 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, 'map');
- trace.extendTrace(Statement.prototype, 'reset');
- trace.extendTrace(Statement.prototype, 'finalize');
- isVerbose = true;
- }
- return this;
- };
|