blob: e9fa6dfc267386088fb0fd42f39f3372f98b07ad [file] [log] [blame]
/*
* weinre is available under *either* the terms of the modified BSD license *or* the
* MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
*
* Copyright (c) 2011 IBM Corporation
*/
requireClass ../common/Weinre
requireClass ../common/Native
requireClass ../common/IDGenerator
requireClass ./SqlStepper
//-----------------------------------------------------------------------------
class WiDatabaseImpl
if (!window.openDatabase) return
window.openDatabase = wrappedOpenDatabase
//-----------------------------------------------------------------------------
static method getDatabases
var result = []
for (var id in id2db) {
result.push(id2db[id])
}
return result
//-----------------------------------------------------------------------------
function logSqlError(sqlError)
console.log("SQL Error " + sqlError.code + ": " + sqlError.message)
//-----------------------------------------------------------------------------
function getTableNames_step_1()
this.executeSql("SELECT name FROM sqlite_master WHERE type='table'");
//-----------------------------------------------------------------------------
function getTableNames_step_2(resultSet)
var rows = resultSet.rows
var result = []
for (var i=0; i<rows.length; i++) {
var name = rows.item(i).name
if (name == "__WebKitDatabaseInfoTable__") continue
result.push(name)
}
Weinre.WeinreTargetCommands.sendClientCallback(this.callback, [result])
//-----------------------------------------------------------------------------
method getDatabaseTableNames( databaseId, callback)
var db = dbById(databaseId)
if (!db) return
var stepper = SqlStepper([
getTableNames_step_1,
getTableNames_step_2
])
stepper.callback = callback
stepper.run(db, logSqlError)
//-----------------------------------------------------------------------------
function executeSQL_step_1()
this.executeSql(this.query);
//-----------------------------------------------------------------------------
function executeSQL_step_2(resultSet)
var columnNames = []
var values = []
var rows = resultSet.rows
for (var i=0; i<rows.length; i++) {
var row = rows.item(i)
if (i == 0) {
for (var propName in row) {
columnNames.push(propName)
}
}
for (var j=0; j<columnNames.length; j++) {
values.push(row[columnNames[j]])
}
}
Weinre.wi.DatabaseNotify.sqlTransactionSucceeded(this.txid, columnNames, values)
//-----------------------------------------------------------------------------
function executeSQL_error(sqlError)
var error = {
code: sqlError.code,
message: sqlError.message
}
Weinre.wi.DatabaseNotify.sqlTransactionFailed(this.txid, error)
//-----------------------------------------------------------------------------
method executeSQL(/*int*/ databaseId, /*string*/ query, callback)
var db = dbById(databaseId)
if (!db) return
var txid = Weinre.targetDescription.channel + "-" + IDGenerator.next()
var stepper = SqlStepper([
executeSQL_step_1,
executeSQL_step_2,
])
stepper.txid = txid
stepper.query = query
stepper.callback = callback
stepper.run(db, executeSQL_error)
if (callback) {
Weinre.WeinreTargetCommands.sendClientCallback(callback, [true, txid])
}
//-----------------------------------------------------------------------------
function wrappedOpenDatabase(name, version, displayName, estimatedSize, creationCallback)
var db = Native.openDatabase(name, version, displayName, estimatedSize, creationCallback)
dbAdd(db, name, version)
return db
//-----------------------------------------------------------------------------
init
var id2db = {}
var name2db = {}
//-----------------------------------------------------------------------------
function dbById(id)
var record = id2db[id]
if (!record) return null
return record.db
//-----------------------------------------------------------------------------
function dbRecordById(id)
return id2db[id]
//-----------------------------------------------------------------------------
function dbRecordByName(name)
return name2db[name]
//-----------------------------------------------------------------------------
function dbAdd(db, name, version)
var record = dbRecordByName(name)
if (record) return record
record = {}
record.id = IDGenerator.next()
record.domain = window.location.origin
record.name = name
record.version = version
record.db = db
id2db[record.id] = record
name2db[name] = record
var payload = {}
payload.id = record.id
payload.domain = record.domain
payload.name = name
payload.version = version
Weinre.WeinreExtraTargetEvents.databaseOpened(payload)