root / trunk / web / dojo / dojox / data / CsvStore.js @ 13
History | View | Annotate | Download (8.72 KB)
| 1 | 9 | andrej.cim | /*
|
|---|---|---|---|
| 2 | Copyright (c) 2004-2010, 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 | |||
| 7 | |||
| 8 | if(!dojo._hasResource["dojox.data.CsvStore"]){ |
||
| 9 | dojo._hasResource["dojox.data.CsvStore"]=true; |
||
| 10 | dojo.provide("dojox.data.CsvStore");
|
||
| 11 | dojo.require("dojo.data.util.filter");
|
||
| 12 | dojo.require("dojo.data.util.simpleFetch");
|
||
| 13 | dojo.declare("dojox.data.CsvStore",null,{constructor:function(_1){ |
||
| 14 | this._attributes=[];
|
||
| 15 | this._attributeIndexes={};
|
||
| 16 | this._dataArray=[];
|
||
| 17 | this._arrayOfAllItems=[];
|
||
| 18 | this._loadFinished=false; |
||
| 19 | if(_1.url){
|
||
| 20 | this.url=_1.url;
|
||
| 21 | } |
||
| 22 | this._csvData=_1.data;
|
||
| 23 | if(_1.label){
|
||
| 24 | this.label=_1.label;
|
||
| 25 | }else{
|
||
| 26 | if(this.label===""){ |
||
| 27 | this.label=undefined; |
||
| 28 | } |
||
| 29 | } |
||
| 30 | this._storeProp="_csvStore"; |
||
| 31 | this._idProp="_csvId"; |
||
| 32 | this._features={"dojo.data.api.Read":true,"dojo.data.api.Identity":true}; |
||
| 33 | this._loadInProgress=false; |
||
| 34 | this._queuedFetches=[];
|
||
| 35 | this.identifier=_1.identifier;
|
||
| 36 | if(this.identifier===""){ |
||
| 37 | delete this.identifier; |
||
| 38 | }else{
|
||
| 39 | this._idMap={};
|
||
| 40 | } |
||
| 41 | if("separator" in _1){ |
||
| 42 | this.separator=_1.separator;
|
||
| 43 | } |
||
| 44 | if("urlPreventCache" in _1){ |
||
| 45 | this.urlPreventCache=_1.urlPreventCache?true:false; |
||
| 46 | } |
||
| 47 | },url:"",label:"",identifier:"",separator:",",urlPreventCache:false,_assertIsItem:function(_2){ |
||
| 48 | if(!this.isItem(_2)){ |
||
| 49 | throw new Error(this.declaredClass+": a function was passed an item argument that was not an item"); |
||
| 50 | } |
||
| 51 | },_getIndex:function(_3){ |
||
| 52 | var _4=this.getIdentity(_3); |
||
| 53 | if(this.identifier){ |
||
| 54 | _4=this._idMap[_4];
|
||
| 55 | } |
||
| 56 | return _4;
|
||
| 57 | },getValue:function(_5,_6,_7){ |
||
| 58 | this._assertIsItem(_5);
|
||
| 59 | var _8=_7;
|
||
| 60 | if(typeof _6==="string"){ |
||
| 61 | var ai=this._attributeIndexes[_6]; |
||
| 62 | if(ai!=null){ |
||
| 63 | var _9=this._dataArray[this._getIndex(_5)]; |
||
| 64 | _8=_9[ai]||_7; |
||
| 65 | } |
||
| 66 | }else{
|
||
| 67 | throw new Error(this.declaredClass+": a function was passed an attribute argument that was not a string"); |
||
| 68 | } |
||
| 69 | return _8;
|
||
| 70 | },getValues:function(_a,_b){ |
||
| 71 | var _c=this.getValue(_a,_b); |
||
| 72 | return (_c?[_c]:[]);
|
||
| 73 | },getAttributes:function(_d){ |
||
| 74 | this._assertIsItem(_d);
|
||
| 75 | var _e=[];
|
||
| 76 | var _f=this._dataArray[this._getIndex(_d)]; |
||
| 77 | for(var i=0;i<_f.length;i++){ |
||
| 78 | if(_f[i]!==""){ |
||
| 79 | _e.push(this._attributes[i]);
|
||
| 80 | } |
||
| 81 | } |
||
| 82 | return _e;
|
||
| 83 | },hasAttribute:function(_10,_11){ |
||
| 84 | this._assertIsItem(_10);
|
||
| 85 | if(typeof _11==="string"){ |
||
| 86 | var _12=this._attributeIndexes[_11]; |
||
| 87 | var _13=this._dataArray[this._getIndex(_10)]; |
||
| 88 | return (typeof _12!=="undefined"&&_12<_13.length&&_13[_12]!==""); |
||
| 89 | }else{
|
||
| 90 | throw new Error(this.declaredClass+": a function was passed an attribute argument that was not a string"); |
||
| 91 | } |
||
| 92 | },containsValue:function(_14,_15,_16){ |
||
| 93 | var _17=undefined; |
||
| 94 | if(typeof _16==="string"){ |
||
| 95 | _17=dojo.data.util.filter.patternToRegExp(_16,false);
|
||
| 96 | } |
||
| 97 | return this._containsValue(_14,_15,_16,_17); |
||
| 98 | },_containsValue:function(_18,_19,_1a,_1b){ |
||
| 99 | var _1c=this.getValues(_18,_19); |
||
| 100 | for(var i=0;i<_1c.length;++i){ |
||
| 101 | var _1d=_1c[i];
|
||
| 102 | if(typeof _1d==="string"&&_1b){ |
||
| 103 | return (_1d.match(_1b)!==null); |
||
| 104 | }else{
|
||
| 105 | if(_1a===_1d){
|
||
| 106 | return true; |
||
| 107 | } |
||
| 108 | } |
||
| 109 | } |
||
| 110 | return false; |
||
| 111 | },isItem:function(_1e){ |
||
| 112 | if(_1e&&_1e[this._storeProp]===this){ |
||
| 113 | var _1f=_1e[this._idProp]; |
||
| 114 | if(this.identifier){ |
||
| 115 | var _20=this._dataArray[this._idMap[_1f]]; |
||
| 116 | if(_20){
|
||
| 117 | return true; |
||
| 118 | } |
||
| 119 | }else{
|
||
| 120 | if(_1f>=0&&_1f<this._dataArray.length){ |
||
| 121 | return true; |
||
| 122 | } |
||
| 123 | } |
||
| 124 | } |
||
| 125 | return false; |
||
| 126 | },isItemLoaded:function(_21){ |
||
| 127 | return this.isItem(_21); |
||
| 128 | },loadItem:function(_22){ |
||
| 129 | },getFeatures:function(){ |
||
| 130 | return this._features; |
||
| 131 | },getLabel:function(_23){ |
||
| 132 | if(this.label&&this.isItem(_23)){ |
||
| 133 | return this.getValue(_23,this.label); |
||
| 134 | } |
||
| 135 | return undefined; |
||
| 136 | },getLabelAttributes:function(_24){ |
||
| 137 | if(this.label){ |
||
| 138 | return [this.label]; |
||
| 139 | } |
||
| 140 | return null; |
||
| 141 | },_fetchItems:function(_25,_26,_27){ |
||
| 142 | var _28=this; |
||
| 143 | var _29=function(_2a,_2b){ |
||
| 144 | var _2c=null; |
||
| 145 | if(_2a.query){
|
||
| 146 | var key,_2d;
|
||
| 147 | _2c=[]; |
||
| 148 | var _2e=_2a.queryOptions?_2a.queryOptions.ignoreCase:false; |
||
| 149 | var _2f={};
|
||
| 150 | for(key in _2a.query){ |
||
| 151 | _2d=_2a.query[key]; |
||
| 152 | if(typeof _2d==="string"){ |
||
| 153 | _2f[key]=dojo.data.util.filter.patternToRegExp(_2d,_2e); |
||
| 154 | } |
||
| 155 | } |
||
| 156 | for(var i=0;i<_2b.length;++i){ |
||
| 157 | var _30=true; |
||
| 158 | var _31=_2b[i];
|
||
| 159 | for(key in _2a.query){ |
||
| 160 | _2d=_2a.query[key]; |
||
| 161 | if(!_28._containsValue(_31,key,_2d,_2f[key])){
|
||
| 162 | _30=false;
|
||
| 163 | } |
||
| 164 | } |
||
| 165 | if(_30){
|
||
| 166 | _2c.push(_31); |
||
| 167 | } |
||
| 168 | } |
||
| 169 | }else{
|
||
| 170 | _2c=_2b.slice(0,_2b.length);
|
||
| 171 | } |
||
| 172 | _26(_2c,_2a); |
||
| 173 | }; |
||
| 174 | if(this._loadFinished){ |
||
| 175 | _29(_25,this._arrayOfAllItems);
|
||
| 176 | }else{
|
||
| 177 | if(this.url!==""){ |
||
| 178 | if(this._loadInProgress){ |
||
| 179 | this._queuedFetches.push({args:_25,filter:_29}); |
||
| 180 | }else{
|
||
| 181 | this._loadInProgress=true; |
||
| 182 | var _32={url:_28.url,handleAs:"text",preventCache:_28.urlPreventCache}; |
||
| 183 | var _33=dojo.xhrGet(_32);
|
||
| 184 | _33.addCallback(function(_34){
|
||
| 185 | try{
|
||
| 186 | _28._processData(_34); |
||
| 187 | _29(_25,_28._arrayOfAllItems); |
||
| 188 | _28._handleQueuedFetches(); |
||
| 189 | } |
||
| 190 | catch(e){
|
||
| 191 | _27(e,_25); |
||
| 192 | } |
||
| 193 | }); |
||
| 194 | _33.addErrback(function(_35){
|
||
| 195 | _28._loadInProgress=false;
|
||
| 196 | if(_27){
|
||
| 197 | _27(_35,_25); |
||
| 198 | }else{
|
||
| 199 | throw _35;
|
||
| 200 | } |
||
| 201 | }); |
||
| 202 | var _36=null; |
||
| 203 | if(_25.abort){
|
||
| 204 | _36=_25.abort; |
||
| 205 | } |
||
| 206 | _25.abort=function(){ |
||
| 207 | var df=_33;
|
||
| 208 | if(df&&df.fired===-1){ |
||
| 209 | df.cancel(); |
||
| 210 | df=null;
|
||
| 211 | } |
||
| 212 | if(_36){
|
||
| 213 | _36.call(_25); |
||
| 214 | } |
||
| 215 | }; |
||
| 216 | } |
||
| 217 | }else{
|
||
| 218 | if(this._csvData){ |
||
| 219 | try{
|
||
| 220 | this._processData(this._csvData); |
||
| 221 | this._csvData=null; |
||
| 222 | _29(_25,this._arrayOfAllItems);
|
||
| 223 | } |
||
| 224 | catch(e){
|
||
| 225 | _27(e,_25); |
||
| 226 | } |
||
| 227 | }else{
|
||
| 228 | var _37=new Error(this.declaredClass+": No CSV source data was provided as either URL or String data input."); |
||
| 229 | if(_27){
|
||
| 230 | _27(_37,_25); |
||
| 231 | }else{
|
||
| 232 | throw _37;
|
||
| 233 | } |
||
| 234 | } |
||
| 235 | } |
||
| 236 | } |
||
| 237 | },close:function(_38){ |
||
| 238 | },_getArrayOfArraysFromCsvFileContents:function(_39){ |
||
| 239 | if(dojo.isString(_39)){
|
||
| 240 | var _3a=new RegExp("^\\s+","g"); |
||
| 241 | var _3b=new RegExp("\\s+$","g"); |
||
| 242 | var _3c=new RegExp("\"\"","g"); |
||
| 243 | var _3d=[];
|
||
| 244 | var i;
|
||
| 245 | var _3e=this._splitLines(_39); |
||
| 246 | for(i=0;i<_3e.length;++i){ |
||
| 247 | var _3f=_3e[i];
|
||
| 248 | if(_3f.length>0){ |
||
| 249 | var _40=_3f.split(this.separator); |
||
| 250 | var j=0; |
||
| 251 | while(j<_40.length){
|
||
| 252 | var _41=_40[j];
|
||
| 253 | var _42=_41.replace(_3a,""); |
||
| 254 | var _43=_42.replace(_3b,""); |
||
| 255 | var _44=_43.charAt(0); |
||
| 256 | var _45=_43.charAt(_43.length-1); |
||
| 257 | var _46=_43.charAt(_43.length-2); |
||
| 258 | var _47=_43.charAt(_43.length-3); |
||
| 259 | if(_43.length===2&&_43=="\"\""){ |
||
| 260 | _40[j]="";
|
||
| 261 | }else{
|
||
| 262 | if((_44=="\"")&&((_45!="\"")||((_45=="\"")&&(_46=="\"")&&(_47!="\"")))){ |
||
| 263 | if(j+1===_40.length){ |
||
| 264 | return;
|
||
| 265 | } |
||
| 266 | var _48=_40[j+1]; |
||
| 267 | _40[j]=_42+this.separator+_48;
|
||
| 268 | _40.splice(j+1,1); |
||
| 269 | }else{
|
||
| 270 | if((_44=="\"")&&(_45=="\"")){ |
||
| 271 | _43=_43.slice(1,(_43.length-1)); |
||
| 272 | _43=_43.replace(_3c,"\"");
|
||
| 273 | } |
||
| 274 | _40[j]=_43; |
||
| 275 | j+=1;
|
||
| 276 | } |
||
| 277 | } |
||
| 278 | } |
||
| 279 | _3d.push(_40); |
||
| 280 | } |
||
| 281 | } |
||
| 282 | this._attributes=_3d.shift();
|
||
| 283 | for(i=0;i<this._attributes.length;i++){ |
||
| 284 | this._attributeIndexes[this._attributes[i]]=i; |
||
| 285 | } |
||
| 286 | this._dataArray=_3d;
|
||
| 287 | } |
||
| 288 | },_splitLines:function(_49){ |
||
| 289 | var _4a=[];
|
||
| 290 | var i;
|
||
| 291 | var _4b=""; |
||
| 292 | var _4c=false; |
||
| 293 | for(i=0;i<_49.length;i++){ |
||
| 294 | var c=_49.charAt(i);
|
||
| 295 | switch(c){
|
||
| 296 | case "\"": |
||
| 297 | _4c=!_4c; |
||
| 298 | _4b+=c; |
||
| 299 | break;
|
||
| 300 | case "\r": |
||
| 301 | if(_4c){
|
||
| 302 | _4b+=c; |
||
| 303 | }else{
|
||
| 304 | _4a.push(_4b); |
||
| 305 | _4b="";
|
||
| 306 | if(i<(_49.length-1)&&_49.charAt(i+1)=="\n"){ |
||
| 307 | i++; |
||
| 308 | } |
||
| 309 | } |
||
| 310 | break;
|
||
| 311 | case "\n": |
||
| 312 | if(_4c){
|
||
| 313 | _4b+=c; |
||
| 314 | }else{
|
||
| 315 | _4a.push(_4b); |
||
| 316 | _4b="";
|
||
| 317 | } |
||
| 318 | break;
|
||
| 319 | default:
|
||
| 320 | _4b+=c; |
||
| 321 | } |
||
| 322 | } |
||
| 323 | if(_4b!==""){ |
||
| 324 | _4a.push(_4b); |
||
| 325 | } |
||
| 326 | return _4a;
|
||
| 327 | },_processData:function(_4d){ |
||
| 328 | this._getArrayOfArraysFromCsvFileContents(_4d);
|
||
| 329 | this._arrayOfAllItems=[];
|
||
| 330 | if(this.identifier){ |
||
| 331 | if(this._attributeIndexes[this.identifier]===undefined){ |
||
| 332 | throw new Error(this.declaredClass+": Identity specified is not a column header in the data set."); |
||
| 333 | } |
||
| 334 | } |
||
| 335 | for(var i=0;i<this._dataArray.length;i++){ |
||
| 336 | var id=i;
|
||
| 337 | if(this.identifier){ |
||
| 338 | var _4e=this._dataArray[i]; |
||
| 339 | id=_4e[this._attributeIndexes[this.identifier]]; |
||
| 340 | this._idMap[id]=i;
|
||
| 341 | } |
||
| 342 | this._arrayOfAllItems.push(this._createItemFromIdentity(id)); |
||
| 343 | } |
||
| 344 | this._loadFinished=true; |
||
| 345 | this._loadInProgress=false; |
||
| 346 | },_createItemFromIdentity:function(_4f){ |
||
| 347 | var _50={};
|
||
| 348 | _50[this._storeProp]=this; |
||
| 349 | _50[this._idProp]=_4f;
|
||
| 350 | return _50;
|
||
| 351 | },getIdentity:function(_51){ |
||
| 352 | if(this.isItem(_51)){ |
||
| 353 | return _51[this._idProp]; |
||
| 354 | } |
||
| 355 | return null; |
||
| 356 | },fetchItemByIdentity:function(_52){ |
||
| 357 | var _53;
|
||
| 358 | var _54=_52.scope?_52.scope:dojo.global;
|
||
| 359 | if(!this._loadFinished){ |
||
| 360 | var _55=this; |
||
| 361 | if(this.url!==""){ |
||
| 362 | if(this._loadInProgress){ |
||
| 363 | this._queuedFetches.push({args:_52}); |
||
| 364 | }else{
|
||
| 365 | this._loadInProgress=true; |
||
| 366 | var _56={url:_55.url,handleAs:"text"}; |
||
| 367 | var _57=dojo.xhrGet(_56);
|
||
| 368 | _57.addCallback(function(_58){
|
||
| 369 | try{
|
||
| 370 | _55._processData(_58); |
||
| 371 | var _59=_55._createItemFromIdentity(_52.identity);
|
||
| 372 | if(!_55.isItem(_59)){
|
||
| 373 | _59=null;
|
||
| 374 | } |
||
| 375 | if(_52.onItem){
|
||
| 376 | _52.onItem.call(_54,_59); |
||
| 377 | } |
||
| 378 | _55._handleQueuedFetches(); |
||
| 379 | } |
||
| 380 | catch(error){
|
||
| 381 | if(_52.onError){
|
||
| 382 | _52.onError.call(_54,error); |
||
| 383 | } |
||
| 384 | } |
||
| 385 | }); |
||
| 386 | _57.addErrback(function(_5a){
|
||
| 387 | this._loadInProgress=false; |
||
| 388 | if(_52.onError){
|
||
| 389 | _52.onError.call(_54,_5a); |
||
| 390 | } |
||
| 391 | }); |
||
| 392 | } |
||
| 393 | }else{
|
||
| 394 | if(this._csvData){ |
||
| 395 | try{
|
||
| 396 | _55._processData(_55._csvData); |
||
| 397 | _55._csvData=null;
|
||
| 398 | _53=_55._createItemFromIdentity(_52.identity); |
||
| 399 | if(!_55.isItem(_53)){
|
||
| 400 | _53=null;
|
||
| 401 | } |
||
| 402 | if(_52.onItem){
|
||
| 403 | _52.onItem.call(_54,_53); |
||
| 404 | } |
||
| 405 | } |
||
| 406 | catch(e){
|
||
| 407 | if(_52.onError){
|
||
| 408 | _52.onError.call(_54,e); |
||
| 409 | } |
||
| 410 | } |
||
| 411 | } |
||
| 412 | } |
||
| 413 | }else{
|
||
| 414 | _53=this._createItemFromIdentity(_52.identity);
|
||
| 415 | if(!this.isItem(_53)){ |
||
| 416 | _53=null;
|
||
| 417 | } |
||
| 418 | if(_52.onItem){
|
||
| 419 | _52.onItem.call(_54,_53); |
||
| 420 | } |
||
| 421 | } |
||
| 422 | },getIdentityAttributes:function(_5b){ |
||
| 423 | if(this.identifier){ |
||
| 424 | return [this.identifier]; |
||
| 425 | }else{
|
||
| 426 | return null; |
||
| 427 | } |
||
| 428 | },_handleQueuedFetches:function(){ |
||
| 429 | if(this._queuedFetches.length>0){ |
||
| 430 | for(var i=0;i<this._queuedFetches.length;i++){ |
||
| 431 | var _5c=this._queuedFetches[i]; |
||
| 432 | var _5d=_5c.filter;
|
||
| 433 | var _5e=_5c.args;
|
||
| 434 | if(_5d){
|
||
| 435 | _5d(_5e,this._arrayOfAllItems);
|
||
| 436 | }else{
|
||
| 437 | this.fetchItemByIdentity(_5c.args);
|
||
| 438 | } |
||
| 439 | } |
||
| 440 | this._queuedFetches=[];
|
||
| 441 | } |
||
| 442 | }}); |
||
| 443 | dojo.extend(dojox.data.CsvStore,dojo.data.util.simpleFetch); |
||
| 444 | } |