root / trunk / web / dojo / dojox / data / CsvStore.js
History | View | Annotate | Download (8.72 KB)
| 1 |
/*
|
|---|---|
| 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 |
} |