From 04d91a2255c9152fdac26dfd0fb5808b6cfb3252 Mon Sep 17 00:00:00 2001 From: jthuraisamy Date: Sat, 16 Nov 2013 12:37:07 -0500 Subject: [PATCH 1/4] add selectQuery method --- lib/sqlite-wrapper.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/sqlite-wrapper.js b/lib/sqlite-wrapper.js index 7e0af2e..b35e142 100644 --- a/lib/sqlite-wrapper.js +++ b/lib/sqlite-wrapper.js @@ -123,6 +123,14 @@ Wrapper.prototype.select = function(table, joins, columns, whereClause, whereVal this.__db.all(query, whereValues || [], cb); }; +/** + * selectQuery('SELECT * FROM Torrents', null, function(err, rows) { ... }); + */ +Wrapper.prototype.selectQuery = function(query, whereValues, cb) { + if (this.__debug) console.log(query, '\n', whereValues); + this.__db.all(query, whereValues || [], cb); +}; + /** * selectOne('Users', null, { 'Users.username': 'name' }, 'name=?', ['bar'], * function(err, row) { }); From 40502a996eb5ca34653286a16c48b3679eee4494 Mon Sep 17 00:00:00 2001 From: jthuraisamy Date: Sat, 16 Nov 2013 12:56:47 -0500 Subject: [PATCH 2/4] trailing whitespace --- lib/sqlite-wrapper.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/sqlite-wrapper.js b/lib/sqlite-wrapper.js index b35e142..0b79fec 100644 --- a/lib/sqlite-wrapper.js +++ b/lib/sqlite-wrapper.js @@ -39,15 +39,15 @@ Wrapper.prototype.createTable = function(tblName, columns, cb) { ref = columns[key].ref; var columnDec = (first ? (first = false, '') : ',') + key + (columns[key].type ? ' ' + columns[key].type : '') + - (columns[key].primary ? ' PRIMARY KEY' : '') + + (columns[key].primary ? ' PRIMARY KEY' : '') + (columns[key].unique ? ' UNIQUE' : '') + (columns[key].notnull ? ' NOT NULL' : '') + - (deflt ? (' DEFAULT ' + deflt) : '') + + (deflt ? (' DEFAULT ' + deflt) : '') + (ref ? (' REFERENCES ' + ref) : ''); query += columnDec; } query += ');'; - + this.__db.run(query, cb); }; @@ -110,7 +110,7 @@ Wrapper.prototype.remove = function(table, whereClause, whereValues, cb) { * 'Torrents.UserId=?', [1], function(err, rows) { ... }); */ Wrapper.prototype.select = function(table, joins, columns, whereClause, whereValues, cb, order, limit, distinct) { - var query = 'SELECT ' + (distinct ? 'DISTINCT ' : '') + + var query = 'SELECT ' + (distinct ? 'DISTINCT ' : '') + (columns ? utils.cols(columns) : '*') + ' FROM ' + table; if (joins) { for (var tbl in joins) { @@ -199,7 +199,7 @@ Wrapper.prototype.close = function(cb) { }; /** - * Init with DB filename, or ':memory:' for in-memory DB, or no argument for + * Init with DB filename, or ':memory:' for in-memory DB, or no argument for * anonymous DB. */ module.exports = function(dbFile, debug) { From 6a930e634cfd26cd1eacf8511062126af39cbcce Mon Sep 17 00:00:00 2001 From: jthuraisamy Date: Sat, 16 Nov 2013 18:06:57 -0500 Subject: [PATCH 3/4] add GROUP BY clause to select method --- lib/sqlite-wrapper.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/sqlite-wrapper.js b/lib/sqlite-wrapper.js index 0b79fec..12dbdeb 100644 --- a/lib/sqlite-wrapper.js +++ b/lib/sqlite-wrapper.js @@ -109,16 +109,20 @@ Wrapper.prototype.remove = function(table, whereClause, whereValues, cb) { * select('Torrents', { 'Users' : 'Users.id=Torrents.UserId' }, null, * 'Torrents.UserId=?', [1], function(err, rows) { ... }); */ -Wrapper.prototype.select = function(table, joins, columns, whereClause, whereValues, cb, order, limit, distinct) { - var query = 'SELECT ' + (distinct ? 'DISTINCT ' : '') + - (columns ? utils.cols(columns) : '*') + ' FROM ' + table; +Wrapper.prototype.select = function(table, joins, columns, whereClause, whereValues, cb, order, limit, distinct, group) { + var query = 'SELECT ' + + (distinct ? 'DISTINCT ' : '') + + (columns ? utils.cols(columns) : '*') + + ' FROM ' + table; if (joins) { for (var tbl in joins) { query += ', ' + tbl + ' ON ' + joins[tbl]; } } - query += ' WHERE ' + whereClause + (order ? ' ORDER BY ' + order : '') + - (limit ? ' LIMIT ' + limit : '') + ';'; + query += ' WHERE ' + whereClause + + (group ? ' GROUP BY ' + group : '') + + (order ? ' ORDER BY ' + order : '') + + (limit ? ' LIMIT ' + limit : '') + ';'; if (this.__debug) console.log(query, '\n', whereValues); this.__db.all(query, whereValues || [], cb); }; From 0cec8963d3bde7e137f881e38d637bc086f24bba Mon Sep 17 00:00:00 2001 From: jthuraisamy Date: Tue, 19 Nov 2013 12:27:34 -0500 Subject: [PATCH 4/4] update createTable and insert functions createTable: allow multiple primary keys insert: allow 'INSERT OR REPLACE INTO' --- lib/sqlite-wrapper.js | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/lib/sqlite-wrapper.js b/lib/sqlite-wrapper.js index 12dbdeb..1be513f 100644 --- a/lib/sqlite-wrapper.js +++ b/lib/sqlite-wrapper.js @@ -34,20 +34,42 @@ function Wrapper(db, debug) { Wrapper.prototype.createTable = function(tblName, columns, cb) { var query = 'CREATE TABLE IF NOT EXISTS ' + tblName + ' ('; var first = true; + var primaryKeys = []; for (var key in columns) { var deflt = columns[key]['default'], ref = columns[key].ref; - var columnDec = (first ? (first = false, '') : ',') + key + + var columnDec = (first ? (first = false, '') : ', ') + key + (columns[key].type ? ' ' + columns[key].type : '') + - (columns[key].primary ? ' PRIMARY KEY' : '') + (columns[key].unique ? ' UNIQUE' : '') + (columns[key].notnull ? ' NOT NULL' : '') + (deflt ? (' DEFAULT ' + deflt) : '') + (ref ? (' REFERENCES ' + ref) : ''); query += columnDec; + // Append key to primaryKeys if it is a primary key. + if (columns[key].primary) { + primaryKeys.push(key); + } + } + // Add primary keys to query. + if (primaryKeys.length > 0) { + first = true; + query += ', PRIMARY KEY('; + primaryKeys.forEach(function (primaryKey) { + if (first) { + query += primaryKey; + first = false; + } else { + query += ', ' + primaryKey; + } + }); + query += ') ON CONFLICT REPLACE'; } query += ');'; - + // Debug message. + if (this.__debug) { + console.log(query); + } + // Execute query. this.__db.run(query, cb); }; @@ -56,10 +78,13 @@ Wrapper.prototype.createTable = function(tblName, columns, cb) { /** * insert('Users', { username : 'foo', password : 'bar' }, function(err) { }); */ -Wrapper.prototype.insert = function(table, obj, cb) { +Wrapper.prototype.insert = function(table, obj, cb, orReplace) { var dissected = utils.dissect(obj); - var query = 'INSERT INTO ' + table + ' (' + dissected.columns.join(',') + ')' + - ' VALUES ' + dissected.valuesPlaceholder + ';'; + var query = 'INSERT' + + (orReplace ? ' OR REPLACE' : '') + + ' INTO ' + table + + ' (' + dissected.columns.join(',') + ')' + + ' VALUES ' + dissected.valuesPlaceholder + ';'; if (this.__debug) console.log(query, '\n', dissected.values); this.__db.run(query, dissected.values, cb); };