UNPKG

libsqlite

Version:

Legacy SQLITE library for browser

849 lines (791 loc) 31.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SQLiteQueue = exports.SQLiteQueueItem = exports.SQLiteTransactionQueue = exports.SQLiteSession = exports.Transaction = exports.SQLiteTransactionAdapter = undefined; var _getPrototypeOf = require("babel-runtime/core-js/object/get-prototype-of"); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck"); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require("babel-runtime/helpers/createClass"); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require("babel-runtime/helpers/possibleConstructorReturn"); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require("babel-runtime/helpers/inherits"); var _inherits3 = _interopRequireDefault(_inherits2); var _list = require("hjs-collection/lib/list"); var _queue = require("hjs-collection/lib/queue"); var _event = require("./event"); var _helper = require("./helper"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** @babel */ var SQLiteTransactionAdapter = exports.SQLiteTransactionAdapter = function (_SQLiteTransactionLis) { (0, _inherits3.default)(SQLiteTransactionAdapter, _SQLiteTransactionLis); function SQLiteTransactionAdapter(_ref) { var _ref$onBegin = _ref.onBegin, onBegin = _ref$onBegin === undefined ? null : _ref$onBegin, _ref$onCommit = _ref.onCommit, onCommit = _ref$onCommit === undefined ? null : _ref$onCommit, _ref$onRollback = _ref.onRollback, onRollback = _ref$onRollback === undefined ? null : _ref$onRollback, _ref$table = _ref.table, table = _ref$table === undefined ? null : _ref$table, _ref$catchError = _ref.catchError, catchError = _ref$catchError === undefined ? false : _ref$catchError; (0, _classCallCheck3.default)(this, SQLiteTransactionAdapter); var _this = (0, _possibleConstructorReturn3.default)(this, (SQLiteTransactionAdapter.__proto__ || (0, _getPrototypeOf2.default)(SQLiteTransactionAdapter)).call(this, { onBegin: onBegin, onCommit: onCommit, onRollback: onRollback })); _this.mTable = table; _this.catchError = catchError; return _this; } (0, _createClass3.default)(SQLiteTransactionAdapter, [{ key: "canCatchError", value: function canCatchError() { return this.catchError; } }, { key: "getTable", value: function getTable() { return this.mTable; } }, { key: "setCatchError", value: function setCatchError(catchError) { this.catchError = catchError; } }, { key: "setTable", value: function setTable(table) { this.mTable = table; } }]); return SQLiteTransactionAdapter; }(_event.SQLiteTransactionListener); var Transaction = exports.Transaction = function () { function Transaction() { (0, _classCallCheck3.default)(this, Transaction); this.mId = 0; this.mMode = 0; this.mParent = null; this.mListener = null; this.mStatement = null; this.mChildFailed = false; this.mMarkedSuccessful = false; } (0, _createClass3.default)(Transaction, [{ key: "getId", value: function getId() { return this.mId; } }, { key: "getListener", value: function getListener() { return this.mListener; } }, { key: "getMode", value: function getMode() { return this.mMode; } }, { key: "getParent", value: function getParent() { return this.mParent; } }, { key: "getStatement", value: function getStatement() { return this.mStatement; } }, { key: "isChildFailed", value: function isChildFailed() { return this.mChildFailed; } }, { key: "isMarkedSuccessful", value: function isMarkedSuccessful() { return this.mMarkedSuccessful; } }, { key: "toString", value: function toString() { var str = ""; str += "Transaction[id:" + this.mId + ",\n statement:" + this.mStatement + ",\n successful:" + this.mMarkedSuccessful + ",\n childFailed:" + this.mChildFailed + "]"; return str; } }]); return Transaction; }(); var SQLiteSession = exports.SQLiteSession = function () { function SQLiteSession(connection) { (0, _classCallCheck3.default)(this, SQLiteSession); if (!connection) { throw new ReferenceError("IllegalArgumentException connection must not be null"); } this.mConnection = connection; this.mNumTransaction = 0; } (0, _createClass3.default)(SQLiteSession, [{ key: "beginTransaction", value: function beginTransaction() { var sql = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var _this2 = this; var bindArgs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var listener = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; this.mConnection.transaction(function (tx) { _this2.mNumTransaction = SQLiteSession.TRANSACTION_COUNT++; try { if (listener) { listener.onBegin(_this2); } tx.executeSql(sql, bindArgs, function (transaction, resultSet) { _this2.setTransactionSuccessful(transaction, resultSet); }, function (transaction, result) { _this2.endTransaction(transaction, result); }); var transaction = _this2.obtainTransaction(listener); transaction.mId = _this2.mNumTransaction; transaction.mStatement = sql; transaction.mParent = _this2.mTransactionStack; _this2.mTransactionStack = transaction; } catch (e) { if (_this2.mTransactionStack) { _this2.mTransactionStack = null; } _this2.mConnection.notifyListeners(new _event.SQLiteEvent({ source: _this2.mConnection, id: _event.SQLiteEvent.ERROR, data: e })); } }); } }, { key: "endTransaction", value: function endTransaction(transaction, result) { this.throwIfNoTransaction(); this.endTransactionUnchecked(result); } }, { key: "endTransactionUnchecked", value: function endTransactionUnchecked(result) { var top = this.mTransactionStack; var successful = top.mMarkedSuccessful && !top.mChildFailed; var listener = top.mListener; var listenerException = null; if (listener) { try { if (successful) { listener.onCommit(this, result); } else { listener.onRollback(this, result); } } catch (e) { listenerException = e; successful = false; } } this.mTransactionStack = top.mParent; this.recycleTransaction(top); if (this.mTransactionStack) { if (!successful) { this.mTransactionStack.mChildFailed = true; } } else { /* console.log("NOT CATCH CASE"); this.mConnection .notifyListeners(new SQLiteEvent( { source : this.mConnection, id : successful ? SQLiteEvent.CHANGE : SQLiteEvent.ERROR, data : result })); */ } if (listenerException) { throw listenerException; } } }, { key: "executeSpecial", value: function executeSpecial() { var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, transaction = _ref2.transaction, _ref2$sql = _ref2.sql, sql = _ref2$sql === undefined ? "" : _ref2$sql, _ref2$bindArgs = _ref2.bindArgs, bindArgs = _ref2$bindArgs === undefined ? [] : _ref2$bindArgs, _ref2$listener = _ref2.listener, listener = _ref2$listener === undefined ? null : _ref2$listener, _ref2$resultSet = _ref2.resultSet, resultSet = _ref2$resultSet === undefined ? {} : _ref2$resultSet; var type = _helper.DatabaseUtils.getSqlStatementType(sql); switch (type) { case _helper.DatabaseUtils.STATEMENT_BEGIN: this.beginTransaction(sql, bindArgs, listener); return true; case _helper.DatabaseUtils.STATEMENT_COMMIT: this.setTransactionSuccessful(transaction, resultSet); return true; case _helper.DatabaseUtils.STATEMENT_ABORT: this.endTransaction(transaction, resultSet); return true; } return false; } }, { key: "getNumTransaction", value: function getNumTransaction() { return this.mNumTransaction; } }, { key: "hasConnection", value: function hasConnection() { return this.mConnection !== null && this.mConnection !== undefined; } }, { key: "hasNestedTransaction", value: function hasNestedTransaction() { return this.mTransactionStack && this.mTransactionStack.mParent; } }, { key: "hasTransaction", value: function hasTransaction() { return this.mTransactionStack !== null && this.mTransactionStack !== undefined; } }, { key: "obtainTransaction", value: function obtainTransaction() { var listener = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; var transaction = this.mTransactionPool; if (transaction) { this.mTransactionPool = transaction.mParent; transaction.mParent = null; transaction.mMarkedSuccessful = false; transaction.mChildFailed = false; } else { transaction = new Transaction(); } transaction.mListener = listener; return transaction; } }, { key: "recycleTransaction", value: function recycleTransaction() { var transaction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; transaction.mParent = this.mTransactionPool; transaction.mListener = null; this.mTransactionPool = transaction; } }, { key: "setTransactionSuccessful", value: function setTransactionSuccessful(transaction) { var resultSet = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; this.throwIfNoTransaction(); this.throwIfTransactionMarkedSuccessful(); this.mTransactionStack.mMarkedSuccessful = true; this.endTransaction(transaction, resultSet); } }, { key: "throwIfNestedTransaction", value: function throwIfNestedTransaction() { if (this.hasNestedTransaction()) { throw new ReferenceError("IllegalStateException Cannot perform this operation because " + "a nested transaction is in progress."); } } }, { key: "throwIfNoTransaction", value: function throwIfNoTransaction() { if (!this.mTransactionStack) { throw new ReferenceError("IllegalStateException Cannot perform this operation because " + "there is no current transaction."); } } }, { key: "throwIfTransactionMarkedSuccessful", value: function throwIfTransactionMarkedSuccessful() { if (this.mTransactionStack && this.mTransactionStack.mMarkedSuccessful) { throw new ReferenceError("IllegalStateException Cannot perform this operation because " + "the transaction has already been marked successful. The only " + "thing you can do now is call endTransaction()."); } } }]); return SQLiteSession; }(); SQLiteSession.TRANSACTION_COUNT = 0; var SQLiteTransactionQueue = exports.SQLiteTransactionQueue = function (_AbstractQueue) { (0, _inherits3.default)(SQLiteTransactionQueue, _AbstractQueue); function SQLiteTransactionQueue() { var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, database = _ref3.database, _ref3$complete = _ref3.complete, complete = _ref3$complete === undefined ? null : _ref3$complete; (0, _classCallCheck3.default)(this, SQLiteTransactionQueue); var _this3 = (0, _possibleConstructorReturn3.default)(this, (SQLiteTransactionQueue.__proto__ || (0, _getPrototypeOf2.default)(SQLiteTransactionQueue)).call(this)); if (!database) { throw new ReferenceError("NullPointerException database object is null"); } _this3.mDatabase = database; if (complete) { _this3.mComplete = complete; } _this3.mQueue = null; _this3.mTransactions = []; return _this3; } (0, _createClass3.default)(SQLiteTransactionQueue, [{ key: "add", value: function add(e) { return this.offer(e); } }, { key: "addAll", value: function addAll(c) { var len = c.length; for (var i = 0; i < len; i++) { if (!this.add(c[i])) { return false; } } return true; } }, { key: "begin", value: function begin() { var len = this.mTransactions.length; if (this.mQueue) { this.mQueue.clear(); } this.mQueue = new _queue.Queue(len); if (this.mQueue.addAll(this.mTransactions) && this.next()) { this.mTransactions = []; } } }, { key: "clear", value: function clear() { if (!this.mQueue) { this.mTransactions = []; } else { this.mQueue.clear(); } } }, { key: "contains", value: function contains(e) { if (!this.mQueue) { return this.mTransactions.indexOf(item) !== -1; } return this.mQueue.contains(e); } }, { key: "containsAll", value: function containsAll(c) { if (!this.mQueue) { var len = c.length; while (len--) { var _item = c[len]; if (this.mTransactions.indexOf(_item) === -1) { return false; } } return true; } return this.mQueue.containsAll(c); } }, { key: "element", value: function element() { return this.peek(); } }, { key: "getDatabase", value: function getDatabase() { return this.mDatabase; } }, { key: "isEmpty", value: function isEmpty() { if (this.mQueue) { return this.mQueue.isEmpty(); } return this.mTransactions.length === 0; } }, { key: "next", value: function next() { var _this4 = this; var statement = this.poll(); if (statement) { this.mDatabase.beginTransaction(statement.statement, statement.bindArgs, new _event.SQLiteTransactionListener({ onBegin: function onBegin(session) { _this4.mDatabase.notifyListeners(new _event.SQLiteEvent({ source: _this4, id: _event.SQLiteEvent.BEGIN })); }, onCommit: function onCommit(session, resultSet) { _this4.mDatabase.notifyListeners(new _event.SQLiteEvent({ source: _this4, id: _event.SQLiteEvent.COMMIT, data: resultSet })); if (!_this4.next() && _this4.mComplete) { _this4.mComplete(_this4); } }, onRollback: function onRollback(session, error) { _this4.mDatabase.notifyListeners(new _event.SQLiteEvent({ source: _this4, id: _event.SQLiteEvent.ROLLBACK, data: error })); } })); return true; } return false; } }, { key: "offer", value: function offer(transaction) { if (!this.mQueue) { var oldLength = this.mTransactions.length; return this.mTransactions.push(transaction) > oldLength; } return false; } }, { key: "peek", value: function peek() { if (this.mQueue) { return this.mQueue.peek(); } return this.mTransactions[0]; } }, { key: "poll", value: function poll() { if (this.mQueue) { return this.mQueue.poll(); } return null; } }, { key: "remove", value: function remove() { if (this.mQueue) { return this.mTransactions.pop(); } return null; } }, { key: "size", value: function size() { return this.mTransactions.length; } }]); return SQLiteTransactionQueue; }(_queue.AbstractQueue); var SQLiteQueueItem = exports.SQLiteQueueItem = function () { function SQLiteQueueItem(_ref4) { var _ref4$name = _ref4.name, name = _ref4$name === undefined ? "" : _ref4$name, _ref4$index = _ref4.index, index = _ref4$index === undefined ? 1 : _ref4$index, _ref4$command = _ref4.command, command = _ref4$command === undefined ? "" : _ref4$command, _ref4$parameters = _ref4.parameters, parameters = _ref4$parameters === undefined ? {} : _ref4$parameters; (0, _classCallCheck3.default)(this, SQLiteQueueItem); this.mIndex = index; this.mCommand = command; this.mParameters = parameters; if (this.mParameters && this.mParameters.hasOwnProperty("name")) { this.mName = this.mParameters.name; delete this.mParameters.name; } } (0, _createClass3.default)(SQLiteQueueItem, [{ key: "getCommand", value: function getCommand() { return this.mCommand; } }, { key: "getIndex", value: function getIndex() { return this.mIndex; } }, { key: "getName", value: function getName() { return this.mName; } }, { key: "getParameters", value: function getParameters() { return this.mParameters; } }]); return SQLiteQueueItem; }(); var SQLiteQueue = exports.SQLiteQueue = function (_AbstractQueue2) { (0, _inherits3.default)(SQLiteQueue, _AbstractQueue2); function SQLiteQueue(name, database) { (0, _classCallCheck3.default)(this, SQLiteQueue); var _this5 = (0, _possibleConstructorReturn3.default)(this, (SQLiteQueue.__proto__ || (0, _getPrototypeOf2.default)(SQLiteQueue)).call(this)); _this5.mName = name; _this5.mDatabase = database; _this5.mQueue = new _list.LinkedList(); return _this5; } (0, _createClass3.default)(SQLiteQueue, [{ key: "add", value: function add(e) { return this.mQueue.add(e); } }, { key: "addAll", value: function addAll(c) { return this.mQueue.addAll(c); } }, { key: "clear", value: function clear() { this.mQueue.clear(); } }, { key: "contains", value: function contains(e) { return this.mQueue.contains(e); } }, { key: "containsAll", value: function containsAll(c) { return this.mQueue.containsAll(c); } }, { key: "DELETE", value: function DELETE() { var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref5$editTable = _ref5.editTable, editTable = _ref5$editTable === undefined ? "" : _ref5$editTable, _ref5$query = _ref5.query, query = _ref5$query === undefined ? "" : _ref5$query, _ref5$bindArgs = _ref5.bindArgs, bindArgs = _ref5$bindArgs === undefined ? [] : _ref5$bindArgs, _ref5$catchError = _ref5.catchError, catchError = _ref5$catchError === undefined ? false : _ref5$catchError, _ref5$adapter = _ref5.adapter, adapter = _ref5$adapter === undefined ? null : _ref5$adapter; this.offer(new SQLiteQueueItem({ command: "DELETE", parameters: { editTable: editTable, query: query, bindArgs: bindArgs, catchError: catchError, adapter: adapter }, index: this.mQueue.size() })); } }, { key: "DROP", value: function DROP() { var _ref6 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref6$table = _ref6.table, table = _ref6$table === undefined ? "" : _ref6$table, _ref6$adapter = _ref6.adapter, adapter = _ref6$adapter === undefined ? null : _ref6$adapter; this.offer(new SQLiteQueueItem({ command: "DROP", parameters: { table: table, adapter: adapter }, index: this.mQueue.size() })); } }, { key: "EXEC", value: function EXEC() { var _ref7 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref7$sql = _ref7.sql, sql = _ref7$sql === undefined ? "" : _ref7$sql, _ref7$bindArgs = _ref7.bindArgs, bindArgs = _ref7$bindArgs === undefined ? [] : _ref7$bindArgs, _ref7$adapter = _ref7.adapter, adapter = _ref7$adapter === undefined ? null : _ref7$adapter; this.offer(new SQLiteQueueItem({ command: "EXEC", parameters: { sql: sql, bindArgs: bindArgs, adapter: adapter }, index: this.mQueue.size() })); } }, { key: "element", value: function element() { return this.mQueue.element(); } }, { key: "execute", value: function execute() { var _this6 = this; var listener = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; var item = this.mQueue.poll(); var canExecute = item !== null && item !== undefined; if (canExecute) { var name = item.getName(); var index = item.getIndex(); var command = item.getCommand(); var parameters = item.getParameters(); var hasListener = listener !== null && listener !== undefined; var adapter = new SQLiteTransactionAdapter({ begin: function begin(session) { var evt = new _event.SQLiteEvent({ source: queue, id: _event.SQLiteEvent.BEGIN, data: { session: session, name: name, index: index, command: command } }); if (hasListener) { listener.handleExecution(evt); } else { _this6.mDatabase.notifyListeners(evt); } }, commit: function commit(session, cursor) { var id = _this6.execute(listener) ? _event.SQLiteEvent.COMMIT : _event.SQLiteEvent.READY; var evt = new _event.SQLiteEvent({ source: _this6, id: id, data: { session: session, name: name, index: index, command: command, cursor: cursor } }); if (hasListener) { listener.handleExecution(evt); } else { _this6.mDatabase.notifyListeners(evt); } }, rollback: function rollback(session, error) { var id = _this6.execute(listener) ? _event.SQLiteEvent.ROLLBACK : _event.SQLiteEvent.READY; var evt = new _event.SQLiteEvent({ source: _this6, id: id, data: { session: session, name: name, index: index, command: command, error: error } }); if (hasListener) { listener.handleExecution(evt); } else { _this6.mDatabase.notifyListeners(evt); } } }); adapter.setCatchError(true); parameters.adapter = adapter; switch (command) { case "DELETE": this.mDatabase.deleteQuery(parameters); break; case "DROP": this.mDatabase.dropTable(parameters); break; case "INSERT": this.mDatabase.insertQuery(parameters); break; case "REPLACE": this.mDatabase.replaceQuery(parameters); break; case "UPDATE": this.mDatabase.updateQuery(parameters); break; case "EXEC": this.mDatabase.execSQL(parameters.sql, parameters.bindArgs, parameters.adapter); break; } } return canExecute; } }, { key: "getName", value: function getName() { return this.mName; } }, { key: "INSERT", value: function INSERT() { var _ref8 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref8$editTable = _ref8.editTable, editTable = _ref8$editTable === undefined ? "" : _ref8$editTable, _ref8$nullColumnHack = _ref8.nullColumnHack, nullColumnHack = _ref8$nullColumnHack === undefined ? "" : _ref8$nullColumnHack, _ref8$initialValues = _ref8.initialValues, initialValues = _ref8$initialValues === undefined ? {} : _ref8$initialValues, _ref8$adapter = _ref8.adapter, adapter = _ref8$adapter === undefined ? null : _ref8$adapter; this.offer(new SQLiteQueueItem({ command: "INSERT", parameters: { editTable: editTable, nullColumnHack: nullColumnHack, initialValues: initialValues, adapter: adapter }, index: this.mQueue.size() })); } }, { key: "isEmpty", value: function isEmpty() { return this.mQueue.isEmpty(); } }, { key: "offer", value: function offer(e) { return this.mQueue.offer(e); } }, { key: "peek", value: function peek() { return this.mQueue.peek(); } }, { key: "poll", value: function poll() { return this.mQueue.poll(); } }, { key: "remove", value: function remove() { return this.mQueue.remove(); } }, { key: "REPLACE", value: function REPLACE() { var _ref9 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref9$editTable = _ref9.editTable, editTable = _ref9$editTable === undefined ? "" : _ref9$editTable, _ref9$nullColumnHack = _ref9.nullColumnHack, nullColumnHack = _ref9$nullColumnHack === undefined ? "" : _ref9$nullColumnHack, _ref9$initialValues = _ref9.initialValues, initialValues = _ref9$initialValues === undefined ? {} : _ref9$initialValues, _ref9$adapter = _ref9.adapter, adapter = _ref9$adapter === undefined ? null : _ref9$adapter; this.offer(new SQLiteQueueItem({ command: "REPLACE", parameters: { editTable: editTable, nullColumnHack: nullColumnHack, initialValues: initialValues, adapter: adapter }, index: this.mQueue.size() })); } }, { key: "size", value: function size() { return this.mQueue.size(); } }, { key: "UPDATE", value: function UPDATE() { var _ref10 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref10$editTable = _ref10.editTable, editTable = _ref10$editTable === undefined ? "" : _ref10$editTable, _ref10$query = _ref10.query, query = _ref10$query === undefined ? "" : _ref10$query, _ref10$values = _ref10.values, values = _ref10$values === undefined ? {} : _ref10$values, _ref10$bindArgs = _ref10.bindArgs, bindArgs = _ref10$bindArgs === undefined ? [] : _ref10$bindArgs, _ref10$adapter = _ref10.adapter, adapter = _ref10$adapter === undefined ? null : _ref10$adapter; this.offer(new SQLiteQueueItem({ command: "UPDATE", parameters: { editTable: editTable, query: query, values: values, bindArgs: bindArgs, adapter: adapter }, index: this.mQueue.size() })); } }]); return SQLiteQueue; }(_queue.AbstractQueue);