| /* |
| Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved. |
| Available via Academic Free License >= 2.1 OR the modified BSD license. |
| see: http://dojotoolkit.org/license for details |
| */ |
| |
| |
| if(!dojo._hasResource["dojox.sql._base"]){ |
| dojo._hasResource["dojox.sql._base"]=true; |
| dojo.provide("dojox.sql._base"); |
| dojo.require("dojox.sql._crypto"); |
| dojo.mixin(dojox.sql,{dbName:null,debug:(dojo.exists("dojox.sql.debug")?dojox.sql.debug:false),open:function(_1){ |
| if(this._dbOpen&&(!_1||_1==this.dbName)){ |
| return; |
| } |
| if(!this.dbName){ |
| this.dbName="dot_store_"+window.location.href.replace(/[^0-9A-Za-z_]/g,"_"); |
| if(this.dbName.length>63){ |
| this.dbName=this.dbName.substring(0,63); |
| } |
| } |
| if(!_1){ |
| _1=this.dbName; |
| } |
| try{ |
| this._initDb(); |
| this.db.open(_1); |
| this._dbOpen=true; |
| } |
| catch(exp){ |
| throw exp.message||exp; |
| } |
| },close:function(_2){ |
| if(dojo.isIE){ |
| return; |
| } |
| if(!this._dbOpen&&(!_2||_2==this.dbName)){ |
| return; |
| } |
| if(!_2){ |
| _2=this.dbName; |
| } |
| try{ |
| this.db.close(_2); |
| this._dbOpen=false; |
| } |
| catch(exp){ |
| throw exp.message||exp; |
| } |
| },_exec:function(_3){ |
| try{ |
| this._initDb(); |
| if(!this._dbOpen){ |
| this.open(); |
| this._autoClose=true; |
| } |
| var _4=null; |
| var _5=null; |
| var _6=null; |
| var _7=dojo._toArray(_3); |
| _4=_7.splice(0,1)[0]; |
| if(this._needsEncrypt(_4)||this._needsDecrypt(_4)){ |
| _5=_7.splice(_7.length-1,1)[0]; |
| _6=_7.splice(_7.length-1,1)[0]; |
| } |
| if(this.debug){ |
| this._printDebugSQL(_4,_7); |
| } |
| var _8; |
| if(this._needsEncrypt(_4)){ |
| _8=new dojox.sql._SQLCrypto("encrypt",_4,_6,_7,_5); |
| return null; |
| }else{ |
| if(this._needsDecrypt(_4)){ |
| _8=new dojox.sql._SQLCrypto("decrypt",_4,_6,_7,_5); |
| return null; |
| } |
| } |
| var rs=this.db.execute(_4,_7); |
| rs=this._normalizeResults(rs); |
| if(this._autoClose){ |
| this.close(); |
| } |
| return rs; |
| } |
| catch(exp){ |
| exp=exp.message||exp; |
| if(this._autoClose){ |
| try{ |
| this.close(); |
| } |
| catch(e){ |
| } |
| } |
| throw exp; |
| } |
| return null; |
| },_initDb:function(){ |
| if(!this.db){ |
| try{ |
| this.db=google.gears.factory.create("beta.database","1.0"); |
| } |
| catch(exp){ |
| dojo.setObject("google.gears.denied",true); |
| if(dojox.off){ |
| dojox.off.onFrameworkEvent("coreOperationFailed"); |
| } |
| throw "Google Gears must be allowed to run"; |
| } |
| } |
| },_printDebugSQL:function(_9,_a){ |
| var _b="dojox.sql(\""+_9+"\""; |
| for(var i=0;i<_a.length;i++){ |
| if(typeof _a[i]=="string"){ |
| _b+=", \""+_a[i]+"\""; |
| }else{ |
| _b+=", "+_a[i]; |
| } |
| } |
| _b+=")"; |
| },_normalizeResults:function(rs){ |
| var _c=[]; |
| if(!rs){ |
| return []; |
| } |
| while(rs.isValidRow()){ |
| var _d={}; |
| for(var i=0;i<rs.fieldCount();i++){ |
| var _e=rs.fieldName(i); |
| var _f=rs.field(i); |
| _d[_e]=_f; |
| } |
| _c.push(_d); |
| rs.next(); |
| } |
| rs.close(); |
| return _c; |
| },_needsEncrypt:function(sql){ |
| return /encrypt\([^\)]*\)/i.test(sql); |
| },_needsDecrypt:function(sql){ |
| return /decrypt\([^\)]*\)/i.test(sql); |
| }}); |
| dojo.declare("dojox.sql._SQLCrypto",null,{constructor:function(_10,sql,_11,_12,_13){ |
| if(_10=="encrypt"){ |
| this._execEncryptSQL(sql,_11,_12,_13); |
| }else{ |
| this._execDecryptSQL(sql,_11,_12,_13); |
| } |
| },_execEncryptSQL:function(sql,_14,_15,_16){ |
| var _17=this._stripCryptoSQL(sql); |
| var _18=this._flagEncryptedArgs(sql,_15); |
| var _19=this; |
| this._encrypt(_17,_14,_15,_18,function(_1a){ |
| var _1b=false; |
| var _1c=[]; |
| var exp=null; |
| try{ |
| _1c=dojox.sql.db.execute(_17,_1a); |
| } |
| catch(execError){ |
| _1b=true; |
| exp=execError.message||execError; |
| } |
| if(exp!=null){ |
| if(dojox.sql._autoClose){ |
| try{ |
| dojox.sql.close(); |
| } |
| catch(e){ |
| } |
| } |
| _16(null,true,exp.toString()); |
| return; |
| } |
| _1c=dojox.sql._normalizeResults(_1c); |
| if(dojox.sql._autoClose){ |
| dojox.sql.close(); |
| } |
| if(dojox.sql._needsDecrypt(sql)){ |
| var _1d=_19._determineDecryptedColumns(sql); |
| _19._decrypt(_1c,_1d,_14,function(_1e){ |
| _16(_1e,false,null); |
| }); |
| }else{ |
| _16(_1c,false,null); |
| } |
| }); |
| },_execDecryptSQL:function(sql,_1f,_20,_21){ |
| var _22=this._stripCryptoSQL(sql); |
| var _23=this._determineDecryptedColumns(sql); |
| var _24=false; |
| var _25=[]; |
| var exp=null; |
| try{ |
| _25=dojox.sql.db.execute(_22,_20); |
| } |
| catch(execError){ |
| _24=true; |
| exp=execError.message||execError; |
| } |
| if(exp!=null){ |
| if(dojox.sql._autoClose){ |
| try{ |
| dojox.sql.close(); |
| } |
| catch(e){ |
| } |
| } |
| _21(_25,true,exp.toString()); |
| return; |
| } |
| _25=dojox.sql._normalizeResults(_25); |
| if(dojox.sql._autoClose){ |
| dojox.sql.close(); |
| } |
| this._decrypt(_25,_23,_1f,function(_26){ |
| _21(_26,false,null); |
| }); |
| },_encrypt:function(sql,_27,_28,_29,_2a){ |
| this._totalCrypto=0; |
| this._finishedCrypto=0; |
| this._finishedSpawningCrypto=false; |
| this._finalArgs=_28; |
| for(var i=0;i<_28.length;i++){ |
| if(_29[i]){ |
| var _2b=_28[i]; |
| var _2c=i; |
| this._totalCrypto++; |
| dojox.sql._crypto.encrypt(_2b,_27,dojo.hitch(this,function(_2d){ |
| this._finalArgs[_2c]=_2d; |
| this._finishedCrypto++; |
| if(this._finishedCrypto>=this._totalCrypto&&this._finishedSpawningCrypto){ |
| _2a(this._finalArgs); |
| } |
| })); |
| } |
| } |
| this._finishedSpawningCrypto=true; |
| },_decrypt:function(_2e,_2f,_30,_31){ |
| this._totalCrypto=0; |
| this._finishedCrypto=0; |
| this._finishedSpawningCrypto=false; |
| this._finalResultSet=_2e; |
| for(var i=0;i<_2e.length;i++){ |
| var row=_2e[i]; |
| for(var _32 in row){ |
| if(_2f=="*"||_2f[_32]){ |
| this._totalCrypto++; |
| var _33=row[_32]; |
| this._decryptSingleColumn(_32,_33,_30,i,function(_34){ |
| _31(_34); |
| }); |
| } |
| } |
| } |
| this._finishedSpawningCrypto=true; |
| },_stripCryptoSQL:function(sql){ |
| sql=sql.replace(/DECRYPT\(\*\)/ig,"*"); |
| var _35=sql.match(/ENCRYPT\([^\)]*\)/ig); |
| if(_35!=null){ |
| for(var i=0;i<_35.length;i++){ |
| var _36=_35[i]; |
| var _37=_36.match(/ENCRYPT\(([^\)]*)\)/i)[1]; |
| sql=sql.replace(_36,_37); |
| } |
| } |
| _35=sql.match(/DECRYPT\([^\)]*\)/ig); |
| if(_35!=null){ |
| for(i=0;i<_35.length;i++){ |
| var _38=_35[i]; |
| var _39=_38.match(/DECRYPT\(([^\)]*)\)/i)[1]; |
| sql=sql.replace(_38,_39); |
| } |
| } |
| return sql; |
| },_flagEncryptedArgs:function(sql,_3a){ |
| var _3b=new RegExp(/([\"][^\"]*\?[^\"]*[\"])|([\'][^\']*\?[^\']*[\'])|(\?)/ig); |
| var _3c; |
| var _3d=0; |
| var _3e=[]; |
| while((_3c=_3b.exec(sql))!=null){ |
| var _3f=RegExp.lastMatch+""; |
| if(/^[\"\']/.test(_3f)){ |
| continue; |
| } |
| var _40=false; |
| if(/ENCRYPT\([^\)]*$/i.test(RegExp.leftContext)){ |
| _40=true; |
| } |
| _3e[_3d]=_40; |
| _3d++; |
| } |
| return _3e; |
| },_determineDecryptedColumns:function(sql){ |
| var _41={}; |
| if(/DECRYPT\(\*\)/i.test(sql)){ |
| _41="*"; |
| }else{ |
| var _42=/DECRYPT\((?:\s*\w*\s*\,?)*\)/ig; |
| var _43=_42.exec(sql); |
| while(_43){ |
| var _44=new String(RegExp.lastMatch); |
| var _45=_44.replace(/DECRYPT\(/i,""); |
| _45=_45.replace(/\)/,""); |
| _45=_45.split(/\s*,\s*/); |
| dojo.forEach(_45,function(_46){ |
| if(/\s*\w* AS (\w*)/i.test(_46)){ |
| _46=_46.match(/\s*\w* AS (\w*)/i)[1]; |
| } |
| _41[_46]=true; |
| }); |
| _43=_42.exec(sql); |
| } |
| } |
| return _41; |
| },_decryptSingleColumn:function(_47,_48,_49,_4a,_4b){ |
| dojox.sql._crypto.decrypt(_48,_49,dojo.hitch(this,function(_4c){ |
| this._finalResultSet[_4a][_47]=_4c; |
| this._finishedCrypto++; |
| if(this._finishedCrypto>=this._totalCrypto&&this._finishedSpawningCrypto){ |
| _4b(this._finalResultSet); |
| } |
| })); |
| }}); |
| (function(){ |
| var _4d=dojox.sql; |
| dojox.sql=new Function("return dojox.sql._exec(arguments);"); |
| dojo.mixin(dojox.sql,_4d); |
| })(); |
| } |