_base.js 6.2 KB

12345678
  1. /*
  2. Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
  3. Available via Academic Free License >= 2.1 OR the modified BSD license.
  4. see: http://dojotoolkit.org/license for details
  5. */
  6. 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);})();}