You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

109 lines
3.1 KiB
JavaScript

// WebSQL
// -------
'use strict';
var inherits = require('inherits');
var _ = require('lodash');
var Transaction = require('./transaction');
var Client_SQLite3 = require('../sqlite3');
var Promise = require('../../promise');
var assign = require('lodash/object/assign');
function Client_WebSQL(config) {
Client_SQLite3.call(this, config);
this.name = config.name || 'knex_database';
this.version = config.version || '1.0';
this.displayName = config.displayName || this.name;
this.estimatedSize = config.estimatedSize || 5 * 1024 * 1024;
}
inherits(Client_WebSQL, Client_SQLite3);
assign(Client_WebSQL.prototype, {
Transaction: Transaction,
dialect: 'websql',
// Get a raw connection from the database, returning a promise with the connection object.
acquireConnection: function acquireConnection() {
var client = this;
return new Promise(function (resolve, reject) {
try {
/*jslint browser: true*/
var db = openDatabase(client.name, client.version, client.displayName, client.estimatedSize);
db.transaction(function (t) {
t.__knexUid = _.uniqueId('__knexUid');
resolve(t);
});
} catch (e) {
reject(e);
}
});
},
// Used to explicitly close a connection, called internally by the pool
// when a connection times out or the pool is shutdown.
releaseConnection: function releaseConnection() {
return Promise.resolve();
},
// Runs the query on the specified connection,
// providing the bindings and any other necessary prep work.
_query: function _query(connection, obj) {
return new Promise(function (resolver, rejecter) {
if (!connection) return rejecter(new Error('No connection provided.'));
connection.executeSql(obj.sql, obj.bindings, function (trx, response) {
obj.response = response;
return resolver(obj);
}, function (trx, err) {
rejecter(err);
});
});
},
_stream: function _stream(connection, sql, stream) {
var client = this;
return new Promise(function (resolver, rejecter) {
stream.on('error', rejecter);
stream.on('end', resolver);
return client._query(connection, sql).then(function (obj) {
return client.processResponse(obj);
}).map(function (row) {
stream.write(row);
})['catch'](function (err) {
stream.emit('error', err);
}).then(function () {
stream.end();
});
});
},
processResponse: function processResponse(obj, runner) {
var resp = obj.response;
if (obj.output) return obj.output.call(runner, resp);
switch (obj.method) {
case 'pluck':
case 'first':
case 'select':
var results = [];
for (var i = 0, l = resp.rows.length; i < l; i++) {
results[i] = _.clone(resp.rows.item(i));
}
if (obj.method === 'pluck') results = _.pluck(results, obj.pluck);
return obj.method === 'first' ? results[0] : results;
case 'insert':
return [resp.insertId];
case 'delete':
case 'update':
case 'counter':
return resp.rowsAffected;
default:
return resp;
}
}
});
module.exports = Client_WebSQL;