Ext.data.AirDB = Ext.extend(Ext.data.SqlDB, {
        open
: function(db, cb, scope){
               
this.conn = new air.SQLConnection();

               
var file = air.File.applicationResourceDirectory.resolve(db);

               
this.conn.addEventListener(air.SQLEvent.OPEN, this.onOpen.createDelegate(this, [cb, scope]));
               
this.conn.addEventListener(air.SQLEvent.CLOSE, this.onClose.createDelegate(this));
               
this.conn.open(file, true);
       
},

        close
: function(){
               
this.conn.close();
       
},

        onOpen
: function(cb, scope){
               
this.openState = true;
               
Ext.callback(cb, scope, [this]);
               
this.fireEvent('open', this);
       
},

        onClose
: function(){
               
this.fireEvent('close', this);
       
},

        onError
: function(e, stmt, type, cb, scope){
               
Ext.callback(cb, scope, [false, e, stmt]);
       
},

        onResult
: function(e, stmt, type, cb, scope){
               
if(type == 'exec'){
                       
Ext.callback(cb, scope, [true, e, stmt]);
               
}else{
                       
var r = [];
                       
var result = stmt.getResult();
                       
if(result && result.data){
                       
var len = result.data.length;
                       
for(var i = 0; i < len; i++) {
                            r
[r.length] = result.data[i];
                       
}
                   
}
                       
Ext.callback(cb, scope, [r, e, stmt]);
               
}
       
},

        createStatement
: function(type, cb, scope){

               
var stmt = new air.SQLStatement();

                stmt
.addEventListener(air.SQLErrorEvent.ERROR, this.onError.createDelegate(this, [stmt, type, cb, scope], true));
                stmt
.addEventListener(air.SQLEvent.RESULT, this.onResult.createDelegate(this, [stmt, type, cb, scope], true));

                stmt
.sqlConnection = this.conn;

               
return stmt;
       
},

        exec
: function(sql, cb, scope){
               
var stmt = this.createStatement('exec', cb, scope);
                stmt
.text = sql;
                stmt
.execute();
       
},

        execBy
: function(sql, args, cb, scope){
               
var stmt = this.createStatement('exec', cb, scope);
                stmt
.text = sql;
               
this.addParams(stmt, args);
                stmt
.execute();
       
},

        query
: function(sql, cb, scope){
               
var stmt = this.createStatement('query', cb, scope);
                stmt
.text = sql;
                stmt
.execute(this.maxResults);
       
},

        queryBy
: function(sql, args, cb, scope){
               
var stmt = this.createStatement('query', cb, scope);
                stmt
.text = sql;
               
this.addParams(stmt, args);
                stmt
.execute(this.maxResults);
       
},

    addParams
: function(stmt, args){
               
if(!args){ return; }
               
for(var key in args){
                       
if(args.hasOwnProperty(key)){
                               
if(!isNaN(key)){
                                        stmt
.parameters[parseInt(key)+1] = args[key];
                               
}else{
                                        stmt
.parameters[':' + key] = args[key];
                               
}
                       
}
               
}
               
return stmt;
       
}
});