UNPKG

q-sqlite3

Version:

The node-sqlite3 module wrapped with Q promises.

244 lines (224 loc) 5.16 kB
/* * q-sqlite3 * https://github.com/eugene-bulkin/q-sqlite3 * * Copyright (c) 2014 Eugene Bulkin * Licensed under the MIT license. */ 'use strict'; var Q = require('q'); var sqlite3 = require('sqlite3').verbose(); // export constants first var consts = { // OPEN_* constants "OPEN_READONLY": 1, "OPEN_READWRITE": 2, "OPEN_CREATE": 4, // response constants "OK": 0, "ERROR": 1, "INTERNAL": 2, "PERM": 3, "ABORT": 4, "BUSY": 5, "LOCKED": 6, "NOMEM": 7, "READONLY": 8, "INTERRUPT": 9, "IOERR": 10, "CORRUPT": 11, "NOTFOUND": 12, "FULL": 13, "CANTOPEN": 14, "PROTOCOL": 15, "EMPTY": 16, "SCHEMA": 17, "TOOBIG": 18, "CONSTRAINT": 19, "MISMATCH": 20, "MISUSE": 21, "NOLFS": 22, "AUTH": 23, "FORMAT": 24, "RANGE": 25, "NOTADB": 26 }; for(var key in consts) { exports[key] = consts[key]; } /* * A wrapper for the Statement object. */ var Statement = function(stmt) { this.stmt = stmt; this.sql = stmt.sql; }; Statement.prototype.run = function() { var deferred = Q.defer(); var args = Array.prototype.slice.call(arguments); var cb = function(error) { if(error) { deferred.reject(error); } else { deferred.resolve(this); } }; args.push(cb); this.stmt.run.apply(this.stmt, args); return deferred.promise; }; Statement.prototype.get = function(sql) { var deferred = Q.defer(); var args = Array.prototype.slice.call(arguments); var cb = function(error, row) { if(error) { deferred.reject(error); } else { deferred.resolve(row); } }; args.push(cb); this.stmt.get.apply(this.stmt, args); return deferred.promise; }; Statement.prototype.finalize = function() { var deferred = Q.defer(); this.stmt.finalize(function(error) { if(error) { deferred.reject(error); } else { deferred.resolve(); } }); return deferred.promise; }; Statement.prototype.reset = function() { var deferred = Q.defer(); this.stmt.reset(function(error) { if(error) { // shouldn't happen according to node-sqlite3 api deferred.reject(error); } else { deferred.resolve(); } }); return deferred.promise; }; Statement.prototype.bind = function() { var deferred = Q.defer(); var args = Array.prototype.slice.call(arguments); var cb = function(error) { if(error) { deferred.reject(error); } else { deferred.resolve(); } }; args.push(cb); this.stmt.bind.apply(this.stmt, args); return deferred.promise; }; /* * This is a wrapper for the database object. It exposes several methods for you * to act as if it were the sqlite3 database, but with promises. */ var Database = function(db) { this.db = db; }; Database.prototype.close = function() { var deferred = Q.defer(); this.db.close(); this.db.on('close', function() { this.db = null; deferred.resolve(); }); this.db.on('error', function(err) { deferred.reject(err); }); return deferred.promise; }; Database.prototype.run = function(sql) { var deferred = Q.defer(); var args = [sql].concat(Array.prototype.slice.call(arguments, 1)); var cb = function(error) { if(error) { deferred.reject(error); } else { deferred.resolve(this); } }; args.push(cb); this.db.run.apply(this.db, args); return deferred.promise; }; Database.prototype.get = function(sql) { var deferred = Q.defer(); var args = [sql].concat(Array.prototype.slice.call(arguments, 1)); var cb = function(error, row) { if(error) { deferred.reject(error); } else { deferred.resolve(row); } }; args.push(cb); this.db.get.apply(this.db, args); return deferred.promise; }; Database.prototype.all = function(sql) { var deferred = Q.defer(); var args = [sql].concat(Array.prototype.slice.call(arguments, 1)); var cb = function(error, rows) { if(error) { deferred.reject(error); } else { deferred.resolve(rows); } }; args.push(cb); this.db.all.apply(this.db, args); return deferred.promise; }; Database.prototype.exec = function(sql) { var deferred = Q.defer(); this.db.exec(sql, function(error) { if(error) { deferred.reject(error); } else { deferred.resolve(this); } }.bind(this)); return deferred.promise; }; Database.prototype.prepare = function(sql) { var deferred = Q.defer(); var args = [sql].concat(Array.prototype.slice.call(arguments, 1)); var stmt; var cb = function(error) { if(error) { deferred.reject(error); } else { deferred.resolve(new Statement(stmt)); } }; args.push(cb); stmt = this.db.prepare.apply(this.db, args); return deferred.promise; }; exports.createDatabase = function(filename, mode) { var deferred = Q.defer(); try { var db = new sqlite3.Database(filename, mode); db.on('open', function() { deferred.resolve(new Database(db)); }); db.on('error', function(err) { deferred.reject(err); }); } catch(err) { deferred.reject(err); } return deferred.promise; }; // Export Database class for alternate intialization exports.Database = Database;