| |
| /* |
| * 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) |