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

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

//-----------------------------------------------------------------------------
method executeSQL(/*int*/ databaseId, /*string*/ query, callback)
    var db = dbById(databaseId)
    if (!db) return
    
    // callback: function(/*boolean*/ success, /*int*/ transactionId)
    Weinre.notImplemented(arguments.callee.signature)

//-----------------------------------------------------------------------------
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.db      = db
    record.name    = name
    record.version = version
    record.id      = IDGenerator.next()
    
    id2db[record.id] = record
    name2db[name]    = record

    var payload = {}
    payload.id      = record.id
    payload.domain  = "???"
    payload.name    = name
    payload.version = version
    
    Weinre.wi.DatabaseNotify.addDatabase(payload)

//-----------------------------------------------------------------------------
function dbGetAll()
    var result = []
    
    for (var id in id2db) {
        result.push(id2db[id])
    }
    
    return result
    