blob: df771ff9d2e7a32e54320130bb8a0b1026d3a1eb [file] [log] [blame]
// Copyright 2011 WebDriver committers
// Copyright 2011 Google Inc.
//
// Licensed 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();
var db;
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 retuned 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.
}
};