00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 #include "StDbXmlReader.h"
00070 #include "stdb_streams.h"
00071 #include <string.h>
00072
00073 #include "dbStruct.hh"
00074
00075 #ifndef __STDB_STANDALONE__
00076 #include "StMessMgr.h"
00077 #else
00078 #define LOG_DEBUG cout
00079 #define LOG_INFO cout
00080 #define LOG_WARN cout
00081 #define LOG_ERROR cerr
00082 #define LOG_FATAL cerr
00083 #define LOG_QA cout
00084 #define endm "\n"
00085 #endif
00086
00087 template<class T>
00088 static void passAux(elem* e, T*& i, int& len)
00089 {
00090 len = e->size.isize;
00091 i = new T[len];
00092 memset(i,0,sizeof(T)*len);
00093 const char* p1 = e->val.data;
00094 const char* p2=p1;
00095 int iloop = 0;
00096 for(;1;p2++) {
00097 if (p2[0] && p2[0]!=',') continue;
00098 i[iloop++] = (T)atof(p1);
00099 p1=p2+1;
00100 if (iloop==len || p2[0]==0) break;
00101 }
00102 }
00103
00104
00105 StDbXmlReader::StDbXmlReader(){ tab = new dbTable(); }
00106
00107
00108
00109 StDbXmlReader::~StDbXmlReader() { delete tab; }
00110
00111
00112 elem*
00113 StDbXmlReader::findElement(char* name){
00114
00115 elem* e = 0;
00116 elem* retVal = 0;
00117
00118 int k;
00119
00120
00121 if(tab->curRow==-1){
00122 for(k=0;k<tab->a.nelems;k++){
00123 e=tab->a.e[k];
00124 if(strcmp(name,e->name)==0){
00125 retVal=e;
00126 break;
00127 }
00128 }
00129 }
00130
00131 if(!retVal){
00132 if(tab->curRow==-1)tab->curRow=0;
00133 if(tab->curRow==tab->numRows)return retVal;
00134 for(k=0;k<tab->row[tab->curRow]->nelems;k++){
00135
00136 e=tab->row[tab->curRow]->e[k];
00137 if(strcmp(name,e->name)==0){
00138 retVal=e;
00139 break;
00140 }
00141 }
00142 if(k==tab->row[tab->curRow]->nelems-1)tab->curRow++;
00143 }
00144
00145 return retVal;
00146 }
00147
00148
00149
00150
00151
00152 void
00153 StDbXmlReader::readTable(ifstream &is){
00154
00155 int done = 0;
00156 int i = 0;
00157 int j,icount,k;
00158 char tmp[2];
00159 char line[256];
00160 char line2[256];
00161
00162 while(!done){
00163 if(is.eof()){
00164 done = 1;
00165 } else {
00166
00167 is.getline(line,255);
00168 k = strlen(line);
00169 j = 0;
00170 line2[j]='\0';
00171 char* ptr=&line2[0];
00172 for(icount=0;icount<k;icount++){
00173 if(!(line[icount]==' ')){
00174 *tmp=line[icount];
00175 tmp[1]='\0';
00176 j++;
00177 strncpy(ptr,tmp,1);
00178 ptr++;
00179 }
00180 }
00181 line2[j]='\0';
00182
00183 loca[i] = new char[strlen(line2)+1];
00184 strcpy(loca[i],line2);
00185
00186 i++;
00187 }
00188 }
00189
00190 maxlines = i-1;
00191
00192 buildDbTable();
00193
00194 }
00195
00196
00197
00198
00199 void
00200 StDbXmlReader::buildDbTable(){
00201
00202 int done = 0;
00203 int j=0;
00204
00205
00206 while (!done) {
00207 if(strstr(loca[j],tab->startKey)){
00208 tab->istart = j;
00209 done = 1;
00210 }
00211 j++;
00212 }
00213
00214
00215 j=tab->istart+1;
00216 done = 0;
00217 while (!done) {
00218
00219 if(strstr(loca[j],(tab->a).startKey)){
00220 (tab->a).istart = j;
00221 done = 1;
00222 }
00223 j++;
00224 }
00225
00226
00227
00228 elem* e0;
00229 elem *e = new elem();
00230
00231 done = 0;
00232 int nelems = 0;
00233 j=(tab->a).istart+1;
00234
00235 while (!done) {
00236 if(strstr(loca[j],e->startKey)){
00237 e0 = new elem();
00238 e0->istart = j;
00239 (tab->a).e.push_back(e0);
00240 nelems++;
00241 if(strstr(loca[j],e->endKey))e0->iend = j;
00242 } else if(strstr(loca[j],e->endKey)){
00243 e0->iend = j;
00244 } else if(strstr(loca[j],(tab->a).endKey)){
00245 if(strstr(loca[j],e->endKey))e0->iend = j;
00246 (tab->a).iend = j;
00247 (tab->a).nelems = nelems;
00248 done = 1;
00249 }
00250 j++;
00251 }
00252
00253
00254
00255 j=(tab->a).iend+1;
00256
00257 dbRow row;
00258 dbRow* row0;
00259
00260 done = 0;
00261 int numRows = 0;
00262 while (!done) {
00263 if(strstr(loca[j],row.startKey)){
00264 row0 = new dbRow();
00265 row0->istart = j;
00266 if(strstr(loca[j],row.endKey))row0->iend = j;
00267 tab->row.push_back(row0);
00268 row0->rowNumber = numRows;
00269 numRows++;
00270 } else if(strstr(loca[j],tab->endKey)){
00271 tab->iend = j;
00272 tab->numRows = numRows;
00273 tab->curRow = -1;
00274 done = 1;
00275 }
00276 j++;
00277 }
00278
00279
00280
00281
00282
00283
00284 for(int nrows=0; nrows<tab->numRows; nrows++){
00285 done = 0;
00286 nelems = 0;
00287 j=tab->row[nrows]->istart;
00288 while (!done) {
00289
00290 if(strstr(loca[j],e->startKey)){
00291 e0 = new elem();
00292 e0->istart = j;
00293 tab->row[nrows]->e.push_back(e0);
00294 nelems++;
00295 if(strstr(loca[j],e->endKey))e0->iend = j;
00296
00297 } else if(strstr(loca[j],e->endKey)){
00298 e0->iend = j;
00299
00300 } else if(strstr(loca[j],row.endKey)){
00301 tab->row[nrows]->nelems = nelems;
00302 done = 1;
00303
00304 }
00305 j++;
00306 }
00307 }
00308
00309 buildStruct();
00310
00311 }
00312
00313
00314
00315 void
00316 StDbXmlReader::buildStruct(){
00317
00318 char * p1 = strstr(loca[tab->istart],tab->startKey);
00319 int len = strlen(tab->startKey);
00320 int k;
00321 for(k=0;k<len+1;k++)p1++;
00322
00323 char* tmpName = new char[strlen(p1)+1];
00324 strcpy(tmpName,p1);
00325 char* id;
00326
00327 if((id=strstr(tmpName,"<")))*id='\0';
00328 tab->name=new char[strlen(tmpName)+1];
00329 strcpy(tab->name,tmpName);
00330 delete [] tmpName;
00331
00332 accessor * a = &(tab->a);
00333 fillElements(a);
00334
00335
00336 len = strlen(tab->row[0]->startKey);
00337
00338 for(int n=0; n<tab->numRows;n++){
00339
00340
00341 p1 = strstr(loca[tab->row[n]->istart],tab->row[n]->startKey);
00342 for(k=0;k<len+1;k++)p1++;
00343 tmpName = new char[strlen(p1)+1];
00344 strcpy(tmpName,p1);
00345 if((id=strstr(tmpName,"<")))*id='\0';
00346 tab->row[n]->rowID = atoi(tmpName);
00347 delete [] tmpName;
00348
00349
00350
00351 a = (accessor*)(tab->row[n]);
00352 fillElements(a);
00353
00354 }
00355
00356 }
00357
00358
00359
00360 void
00361 StDbXmlReader::fillElements(accessor* a){
00362
00363 elem* e;
00364 int len,j;
00365 char *p1,*p2,*hlen;
00366 int ilist;
00367 int iline;
00368
00369 for(int k=0;k<a->nelems;k++){
00370
00371 e=a->e[k];
00372
00373
00374
00375 p1=strstr(loca[e->istart],e->startKey) + strlen(e->startKey);
00376
00377 p2=strstr(loca[e->istart],">");
00378 len = strlen(p1) - strlen(p2);
00379 e->type = new char[len];
00380 memcpy(e->type,p1,len);
00381 e->type[len]='\0';
00382
00383
00384 p2++;
00385 while(p2[0]==' ')p2++;
00386 p1 = strstr(p2,"<");
00387 len = strlen(p2) - strlen(p1);
00388 e->name = new char[len];
00389 memcpy(e->name,p2,len);
00390 e->name[len]='\0';
00391
00392
00393
00394 p1=strstr(loca[e->istart],e->size.startKey);
00395
00396 if(p1){
00397 p1+=strlen(e->size.startKey);
00398 p2=strstr(loca[e->istart],e->size.endKey);
00399 len = strlen(p1) - strlen(p2)+1;
00400 hlen = new char[len];
00401 memcpy(hlen,p1,len);
00402 hlen[len-1]='\0';
00403 e->size.isize = atoi(hlen);
00404 }
00405 if(e->size.isize==0)e->size.isize=1;
00406
00407
00408
00409
00410 p1=strstr(loca[e->istart],(e->val).startKey);
00411 if(p1){
00412
00413
00414 p1+=strlen((e->val).startKey);
00415 while(p1[0]==' ')p1++;
00416 p2=strstr(loca[e->istart],(e->val).endKey);
00417 len = strlen(p1) - strlen(p2);
00418 (e->val).data = new char[len];
00419 memcpy((e->val).data,p1,len);
00420 (e->val).data[len]='\0';
00421 } else {
00422
00423
00424
00425
00426
00427 ilist =e->iend - e->istart;
00428 iline =0;
00429 for(j=2;j<ilist;j++)iline += strlen(loca[e->istart+j]);
00430 StString fs;
00431 for(j=2;j<ilist;j++) fs<<loca[e->istart+j];
00432 string fs2=fs.str();
00433 e->val.data = new char[fs2.length()+1];
00434
00435 strcpy(e->val.data,fs2.c_str());
00436
00437 }
00438
00439
00440
00441 }
00442
00443 }
00444
00445
00446
00447
00448 void
00449 StDbXmlReader::pass(char* name, char*& i, int& len){
00450 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00451 if(strcmp(e->type,"String")==0){
00452 i=new char[strlen((e->val).data)+1];
00453 strcpy(i,(e->val).data);
00454 }
00455 }
00456
00457
00458
00459 void
00460 StDbXmlReader::pass(char* name, unsigned char& i, int& len){
00461 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00462 if(strcmp(e->type,"Char")==0)i=atoi((e->val).data);
00463 }
00464
00466
00467 void
00468 StDbXmlReader::pass(char* name, unsigned char*& i, int& len)
00469 {
00470 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00471 if(!strstr(e->type,"UChar")) return;
00472 passAux(e,i,len);
00473 }
00474
00475
00476
00477
00478
00479
00480
00481 void
00482 StDbXmlReader::pass(char* name, short& i, int& len){
00483 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00484 if(strcmp(e->type,"Short")==0)i=atoi((e->val).data);
00485 }
00486
00487
00488
00489
00490 void
00491 StDbXmlReader::pass(char* name, short*& i, int& len){
00492
00493 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00494 if(!strstr(e->type,"Short"))return;
00495 passAux(e,i,len);
00496 }
00497
00498
00499
00500
00501 void
00502 StDbXmlReader::pass(char* name, unsigned short& i, int& len){
00503 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00504 if(strcmp(e->type,"UShort")==0)i=atoi((e->val).data);
00505 }
00506
00507
00508
00509
00510 void
00511 StDbXmlReader::pass(char* name, unsigned short*& i, int& len){
00512
00513 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00514 if(!strstr(e->type,"UShort"))return;
00515 passAux(e,i,len);
00516 }
00517
00518 void
00519 StDbXmlReader::pass(char* name, int& i, int& len){
00520
00521
00522 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00523 if(strcmp(e->type,"Int")==0)i=atoi((e->val).data);
00524 }
00525
00526
00527
00528 void
00529 StDbXmlReader::pass(char* name, int*& i, int& len){
00530
00531
00532 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00533 if(!strstr(e->type,"Int")) return;
00534 passAux(e,i,len);
00535 }
00536 void
00537 StDbXmlReader::pass(char* name,unsigned int& i, int& len){
00538 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00539 if(strcmp(e->type,"UInt")==0)i=atoi((e->val).data);
00540 }
00541
00542
00543
00544 void
00545 StDbXmlReader::pass(char* name,unsigned int*& i, int& len){
00546
00547 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00548 if(!strstr(e->type,"UInt"))return;
00549 passAux(e,i,len);
00550 }
00551
00552
00553
00554 void
00555 StDbXmlReader::pass(char* name, long& i, int& len){
00556 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00557 if(strcmp(e->type,"Long")==0)i=atol((e->val).data);
00558 }
00559
00560
00561
00562
00563 void
00564 StDbXmlReader::pass(char* name, long*& i, int& len){
00565
00566 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00567 if(!strstr(e->type,"Long")) return;
00568 passAux(e,i,len);
00569 }
00570
00571
00572
00573 void
00574 StDbXmlReader::pass(char* name, unsigned long& i, int& len){
00575 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00576 if(strcmp(e->type,"ULong")==0)i=atol((e->val).data);
00577 }
00578
00579
00580
00581 void
00582 StDbXmlReader::pass(char* name, long long& i, int& len){
00583 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00584 #ifndef __osf__
00585 if(strcmp(e->type,"LongLong")==0)i=atoll((e->val).data);
00586 #else
00587 if(strcmp(e->type,"LongLong")==0)i=atol((e->val).data);
00588 #endif
00589 }
00590 void
00591 StDbXmlReader::pass(char* name, long long*& i, int& len){
00592
00593 cout<<"Not Yet Implemented"<<endl;
00594 }
00595
00596
00597
00598
00599 void
00600 StDbXmlReader::pass(char* name, unsigned long*& i, int& len){
00601
00602 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00603 if(!strstr(e->type,"ULong"))return;
00604 passAux(e,i,len);
00605 }
00606
00607
00608
00609
00610 void
00611 StDbXmlReader::pass(char* name, float*& i, int& len){
00612
00613 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00614 if(!strstr(e->type,"Float")) return;
00615 passAux(e,i,len);
00616 }
00617
00618
00619 void
00620 StDbXmlReader::pass(char* name, double*& i, int& len){
00621
00622 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00623 if(!strstr(e->type,"Double"))return;
00624 passAux(e,i,len);
00625 }
00626
00627
00628 void
00629 StDbXmlReader::pass(char* name, float& i, int& len){
00630 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00631 if(strcmp(e->type,"Float")==0)i=(float)atof((e->val).data);
00632
00633 }
00634
00635
00636 void
00637 StDbXmlReader::pass(char* name, double& i, int& len){
00638 elem* e = findElement(name); if(!e){ LOG_ERROR<<name<<" not found"<<endm; return;}
00639 if(strcmp(e->type,"Double")==0)i=atof((e->val).data);
00640
00641 }
00642
00643
00644
00645
00646
00647
00648
00649