root / trunk / web / dojo / dojox / data / CsvStore.js
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 | } |