blob: 72817097fd04cb54854d1c5edf385d5f12f65f10 [file] [log] [blame]
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The SFC licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
/**
* @fileoverview Atoms for executing SQL queries on web client database.
*
*/
goog.provide('bot.storage.database');
goog.provide('bot.storage.database.ResultSet');
goog.require('bot');
goog.require('bot.Error');
goog.require('bot.ErrorCode');
/**
* Opens the database to access its contents. This function will create the
* database if it does not exist. For details,
* @see http://www.w3.org/TR/webdatabase/#databases
*
* @param {string} databaseName The name of the database.
* @param {string=} opt_version The expected database version to be opened;
* defaults to the empty string.
* @param {string=} opt_displayName The name to be displayed to the user;
* defaults to the databaseName.
* @param {number=} opt_size The estimated initial quota size of the database;
* default value is 5MB.
* @param {!Window=} opt_window The window associated with the database;
* defaults to the main window.
* @return {!Database} The object to access the web database.
*
*/
bot.storage.database.openOrCreate = function(databaseName, opt_version,
opt_displayName, opt_size, opt_window) {
var version = opt_version || '';
var displayName = opt_displayName || (databaseName + 'name');
var size = opt_size || 5 * 1024 * 1024;
var win = opt_window || bot.getWindow();
return win.openDatabase(databaseName, version, displayName, size);
};
/**
* It executes a single SQL query on a given web database storage.
*
* @param {string} databaseName The name of the database.
* @param {string} query The SQL statement.
* @param {!Array.<*>} args Arguments needed for the SQL statement.
* @param {!function(!SQLTransaction, !bot.storage.database.ResultSet)}
* queryResultCallback Callback function to be invoked on successful query
* statement execution.
* @param {!function(!SQLError)} txErrorCallback
* Callback function to be invoked on transaction (commit) failure.
* @param {!function()=} opt_txSuccessCallback
* Callback function to be invoked on successful transaction execution.
* @param {function(!SQLTransaction, !SQLError)=} opt_queryErrorCallback
* Callback function to be invoked on successful query statement execution.
* @see http://www.w3.org/TR/webdatabase/#executing-sql-statements
*/
bot.storage.database.executeSql = function(databaseName, query, args,
queryResultCallback, txErrorCallback, opt_txSuccessCallback,
opt_queryErrorCallback) {
var db;
try {
db = bot.storage.database.openOrCreate(databaseName);
} catch (e) {
throw new bot.Error(bot.ErrorCode.UNKNOWN_ERROR, e.message);
}
var queryCallback = function(tx, result) {
var wrappedResult = new bot.storage.database.ResultSet(result);
queryResultCallback(tx, wrappedResult);
};
var transactionCallback = function(tx) {
tx.executeSql(query, args, queryCallback, opt_queryErrorCallback);
};
db.transaction(transactionCallback, txErrorCallback,
opt_txSuccessCallback);
};
/**
* A wrapper of the SQLResultSet object returned by the SQL statement.
*
* @param {!SQLResultSet} sqlResultSet The original SQLResultSet object.
* @constructor
*/
bot.storage.database.ResultSet = function(sqlResultSet) {
/**
* The database rows returned from the SQL query.
* @type {!Array.<*>}
*/
this.rows = [];
for (var i = 0; i < sqlResultSet.rows.length; i++) {
this.rows[i] = sqlResultSet.rows.item(i);
}
/**
* The number of rows that were changed by the SQL statement
* @type {number}
*/
this.rowsAffected = sqlResultSet.rowsAffected;
/**
* The row ID of the row that the SQLResultSet object's SQL statement
* inserted into the database, if the statement inserted a row; else
* it is assigned to -1. Originally, accessing insertId attribute of
* a SQLResultSet object returns the exception INVALID_ACCESS_ERR
* if no rows are inserted.
* @type {number}
*/
this.insertId = -1;
try {
this.insertId = sqlResultSet.insertId;
} catch (error) {
// If accessing sqlResultSet.insertId results in INVALID_ACCESS_ERR
// exception, this.insertId will be assigned to -1.
}
};