sqlite3.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. var path = require('path');
  2. var binary = require('node-pre-gyp');
  3. var path = require('path')
  4. var binding_path = binary.find(path.resolve(path.join(__dirname,'../package.json')));
  5. var binding = require(binding_path);
  6. var sqlite3 = module.exports = exports = binding;
  7. var util = require('util');
  8. var EventEmitter = require('events').EventEmitter;
  9. function errorCallback(args) {
  10. if (typeof args[args.length - 1] === 'function') {
  11. var callback = args[args.length - 1];
  12. return function(err) { if (err) callback(err); };
  13. }
  14. }
  15. function inherits(target, source) {
  16. for (var k in source.prototype)
  17. target.prototype[k] = source.prototype[k];
  18. }
  19. sqlite3.cached = {
  20. Database: function(file, a, b) {
  21. if (file === '' || file === ':memory:') {
  22. // Don't cache special databases.
  23. return new Database(file, a, b);
  24. }
  25. if (file[0] !== '/') {
  26. file = path.join(process.cwd(), file);
  27. }
  28. if (!sqlite3.cached.objects[file]) {
  29. var db =sqlite3.cached.objects[file] = new Database(file, a, b);
  30. }
  31. else {
  32. // Make sure the callback is called.
  33. var db = sqlite3.cached.objects[file];
  34. var callback = (typeof a === 'number') ? b : a;
  35. if (typeof callback === 'function') {
  36. function cb() { callback.call(db, null); }
  37. if (db.open) process.nextTick(cb);
  38. else db.once('open', cb);
  39. }
  40. }
  41. return db;
  42. },
  43. objects: {}
  44. };
  45. var Database = sqlite3.Database;
  46. var Statement = sqlite3.Statement;
  47. inherits(Database, EventEmitter);
  48. inherits(Statement, EventEmitter);
  49. // Database#prepare(sql, [bind1, bind2, ...], [callback])
  50. Database.prototype.prepare = function(sql) {
  51. var params = Array.prototype.slice.call(arguments, 1);
  52. if (!params.length || (params.length === 1 && typeof params[0] === 'function')) {
  53. return new Statement(this, sql, params[0]);
  54. }
  55. else {
  56. var statement = new Statement(this, sql, errorCallback(params));
  57. return statement.bind.apply(statement, params);
  58. }
  59. };
  60. // Database#run(sql, [bind1, bind2, ...], [callback])
  61. Database.prototype.run = function(sql) {
  62. var params = Array.prototype.slice.call(arguments, 1);
  63. var statement = new Statement(this, sql, errorCallback(params));
  64. statement.run.apply(statement, params).finalize();
  65. return this;
  66. };
  67. // Database#get(sql, [bind1, bind2, ...], [callback])
  68. Database.prototype.get = function(sql) {
  69. var params = Array.prototype.slice.call(arguments, 1);
  70. var statement = new Statement(this, sql, errorCallback(params));
  71. statement.get.apply(statement, params).finalize();
  72. return this;
  73. };
  74. // Database#all(sql, [bind1, bind2, ...], [callback])
  75. Database.prototype.all = function(sql) {
  76. var params = Array.prototype.slice.call(arguments, 1);
  77. var statement = new Statement(this, sql, errorCallback(params));
  78. statement.all.apply(statement, params).finalize();
  79. return this;
  80. };
  81. // Database#each(sql, [bind1, bind2, ...], [callback], [complete])
  82. Database.prototype.each = function(sql) {
  83. var params = Array.prototype.slice.call(arguments, 1);
  84. var statement = new Statement(this, sql, errorCallback(params));
  85. statement.each.apply(statement, params).finalize();
  86. return this;
  87. };
  88. Database.prototype.map = function(sql) {
  89. var params = Array.prototype.slice.call(arguments, 1);
  90. var statement = new Statement(this, sql, errorCallback(params));
  91. statement.map.apply(statement, params).finalize();
  92. return this;
  93. };
  94. Statement.prototype.map = function() {
  95. var params = Array.prototype.slice.call(arguments);
  96. var callback = params.pop();
  97. params.push(function(err, rows) {
  98. if (err) return callback(err);
  99. var result = {};
  100. if (rows.length) {
  101. var keys = Object.keys(rows[0]), key = keys[0];
  102. if (keys.length > 2) {
  103. // Value is an object
  104. for (var i = 0; i < rows.length; i++) {
  105. result[rows[i][key]] = rows[i];
  106. }
  107. } else {
  108. var value = keys[1];
  109. // Value is a plain value
  110. for (var i = 0; i < rows.length; i++) {
  111. result[rows[i][key]] = rows[i][value];
  112. }
  113. }
  114. }
  115. callback(err, result);
  116. });
  117. return this.all.apply(this, params);
  118. };
  119. var isVerbose = false;
  120. var supportedEvents = [ 'trace', 'profile', 'insert', 'update', 'delete' ];
  121. Database.prototype.addListener = Database.prototype.on = function(type) {
  122. var val = EventEmitter.prototype.addListener.apply(this, arguments);
  123. if (supportedEvents.indexOf(type) >= 0) {
  124. this.configure(type, true);
  125. }
  126. return val;
  127. };
  128. Database.prototype.removeListener = function(type) {
  129. var val = EventEmitter.prototype.removeListener.apply(this, arguments);
  130. if (supportedEvents.indexOf(type) >= 0 && !this._events[type]) {
  131. this.configure(type, false);
  132. }
  133. return val;
  134. };
  135. Database.prototype.removeAllListeners = function(type) {
  136. var val = EventEmitter.prototype.removeAllListeners.apply(this, arguments);
  137. if (supportedEvents.indexOf(type) >= 0) {
  138. this.configure(type, false);
  139. }
  140. return val;
  141. };
  142. // Save the stack trace over EIO callbacks.
  143. sqlite3.verbose = function() {
  144. if (!isVerbose) {
  145. var trace = require('./trace');
  146. trace.extendTrace(Database.prototype, 'prepare');
  147. trace.extendTrace(Database.prototype, 'get');
  148. trace.extendTrace(Database.prototype, 'run');
  149. trace.extendTrace(Database.prototype, 'all');
  150. trace.extendTrace(Database.prototype, 'each');
  151. trace.extendTrace(Database.prototype, 'map');
  152. trace.extendTrace(Database.prototype, 'exec');
  153. trace.extendTrace(Database.prototype, 'close');
  154. trace.extendTrace(Statement.prototype, 'bind');
  155. trace.extendTrace(Statement.prototype, 'get');
  156. trace.extendTrace(Statement.prototype, 'run');
  157. trace.extendTrace(Statement.prototype, 'all');
  158. trace.extendTrace(Statement.prototype, 'each');
  159. trace.extendTrace(Statement.prototype, 'map');
  160. trace.extendTrace(Statement.prototype, 'reset');
  161. trace.extendTrace(Statement.prototype, 'finalize');
  162. isVerbose = true;
  163. }
  164. return this;
  165. };