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
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197 #include <StString.h>
00198 #include <Stiostream.h>
00199 #include <stdlib.h>
00200
00201 #include "TString.h"
00202 #include "StMessMgr.h"
00203
00204
00205 #include "TROOT.h"
00206 #include "TBuffer.h"
00207 #include "TClass.h"
00208 #include "St_Table.h"
00209 #include "TRealData.h"
00210 #include "TDataMember.h"
00211 #include "TDataType.h"
00212
00213 #include "Api.h"
00214 #include "StDbBroker.h"
00215 #include "StDbLib/StDbManager.hh"
00216 #include "StDbLib/StDbConfigNode.hh"
00217 #include "StDbLib/StDbTable.h"
00218 #include "dbNodes.h"
00219 #include "StDbLib/StDbTableIter.hh"
00220 #include "StDbLib/StDbBuffer.h"
00221 #include "StDbLib/StDbTableDescriptor.h"
00222 #include "StDbWrappedMessenger.hh"
00223
00224 #define __CLASS__ "StDbBroker"
00225
00226
00227 ClassImp(StDbBroker)
00228
00229
00230 char **StDbBroker::GetComments(St_Table *parentTable)
00231 {
00232 char **ElementComment = new char*[m_nElements];
00233 if (!parentTable) {
00234
00235 return NULL;
00236 }
00237
00238 TClass *classPtr = parentTable->GetRowClass();
00239 if (!classPtr) return NULL;
00240
00241 if (!classPtr->GetListOfRealData()) classPtr->BuildRealData();
00242
00243 TIter next(classPtr->GetListOfDataMembers());
00244 TDataMember *member = 0;
00245 UInt_t i=0, j=0;
00246 while ( (member = (TDataMember *) next()) ) {
00247 ElementComment[i] = strdup(member->GetTitle());
00248
00249 j=strlen(ElementComment[i]);
00250 while (j != 0 && ElementComment[i][j-1] == ' ') j--;
00251 ElementComment[i][j]='\0';
00252 i++;
00253 }
00254 return ElementComment;
00255 }
00256
00257
00258 StDbBroker::StDbBroker(): m_structName(0), m_tableName(0), m_requestTimeStamp(0), m_tableVersion(0), m_database(0), m_ParentType(0), m_isVerbose(0), m_Nodes(0), m_Tree(0), m_flavor(0), m_prodTime(0) {
00259
00260 m_runNumber=0;
00261 m_node = 0;
00262 mgr=StDbManager::Instance();
00263 StDbMessService* ms=new StDbWrappedMessenger();
00264 mgr->setMessenger(ms);
00265
00266 }
00267
00268
00269 StDbBroker::~StDbBroker(){
00270 printStatistics();
00271 if(m_tableName) delete [] m_tableName;
00272 if(m_structName) delete [] m_structName;
00273 if(m_tableVersion) delete [] m_tableVersion;
00274 if(m_database) delete [] m_database;
00275 if(m_flavor) delete [] m_flavor;
00276 SafeDelete(m_Nodes);
00277 SafeDelete(m_Tree);
00278 SafeDelete(mgr);
00279 }
00280
00281
00282 void StDbBroker::printStatistics(){
00283 if(m_Tree)m_Tree->printNumberStats();
00284 if(mgr) mgr->printTimeStats();
00285 }
00286
00287
00288 void StDbBroker::CloseAllConnections(){
00289 if(mgr){
00290 mgr->closeAllConnections();
00291
00292 }
00293
00294 };
00295
00296
00297
00298 void StDbBroker::Release(){
00299
00300
00301
00302 StDbBroker::CloseAllConnections();
00303
00304 }
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338 const char *StDbBroker::GetFlavor()
00339 {
00340 return (m_node)? m_node->getFlavor():0;
00341 }
00342
00343
00344 StTableDescriptorI*
00345 StDbBroker::GetTableDescriptor(){
00346
00347 StDbBuffer buff;
00348 StDbTableDescriptor* descriptor = new StDbTableDescriptor();
00349 unsigned int numElements = mdescriptor->NumberOfColumns();
00350
00351 for(int i=0;i<(int)numElements;i++){
00352
00353 buff.WriteScalar(mdescriptor->ColumnName(i),"name");
00354
00355
00356 if(!mdescriptor->Dimensions(i)){
00357 buff.WriteScalar("1","length");
00358 } else {
00359 StString os;
00360 const unsigned int* index = mdescriptor->IndexArray(i);
00361 for(int k=0; k<(int)mdescriptor->Dimensions(i)-1;k++)
00362 os<<index[k]<<",";
00363 os<<index[mdescriptor->Dimensions(i)-1];
00364 const char* lengthString = (os.str()).c_str();
00365 buff.WriteScalar(lengthString,"length");
00366
00367
00368 }
00369
00370
00371 buff.WriteScalar(i+1,"position");
00372
00373
00374 switch ((EColumnType)mdescriptor->ColumnType(i)) {
00375 case kFloat:
00376 {
00377 buff.WriteScalar("float","type");
00378 break;
00379 }
00380 case kInt:
00381 {
00382 buff.WriteScalar("int","type");
00383 break;
00384 }
00385 case kLong:
00386 {
00387 buff.WriteScalar("long","type");
00388 break;
00389 }
00390 case kShort:
00391 {
00392 buff.WriteScalar("short","type");
00393 break;
00394 }
00395 case kDouble:
00396 {
00397 buff.WriteScalar("double","type");
00398 break;
00399 }
00400 case kUInt:
00401 {
00402 buff.WriteScalar("uint","type");
00403 break;
00404 }
00405 case kULong:
00406 {
00407 buff.WriteScalar("ulong","type");
00408 break;
00409 }
00410 case kUShort:
00411 {
00412 buff.WriteScalar("ushort","type");
00413 break;
00414 }
00415 case kUChar:
00416 {
00417 buff.WriteScalar("uchar","type");
00418 break;
00419 }
00420 case kChar:
00421 {
00422 buff.WriteScalar("char","type");
00423 break;
00424 }
00425 default:
00426 {
00427 break;
00428 }
00429 }
00430
00431 descriptor->fillElement(&buff,0);
00432
00433 buff.Raz();
00434
00435 }
00436
00437 return descriptor;
00438 }
00439
00440 void
00441 StDbBroker::addBlacklistedDomain(const char* domainName) {
00442 mgr->blacklistDbDomain(domainName);
00443 }
00444
00445
00446 void
00447 StDbBroker::SetDateTime(Int_t date, Int_t time)
00448 {
00449
00450 m_DateTime[0] = date;
00451 m_DateTime[1]= time;
00452
00453 StString ds;
00454 StString ts;
00455
00456 ts<<m_DateTime[1];
00457 int len = (ts.str()).length();
00458 ds<<m_DateTime[0];
00459 for(int i=0;i<6-len;i++)ds<<"0";
00460 ds<<m_DateTime[1];
00461
00462 const char* dateTime = (ds.str()).c_str();
00463 mgr->setRequestTime(dateTime);
00464 }
00465
00466
00467 void StDbBroker::SetProdTime(UInt_t ptime){
00468 if(m_Tree)m_Tree->setProdTime(ptime);
00469 m_prodTime = ptime;
00470 }
00471
00472
00473 void StDbBroker::AddProdTimeOverride(UInt_t ptime, char* dbType, char* dbDomain) {
00474 if (m_Tree) {
00475 m_Tree->setProdTimeOverride(ptime, dbType, dbDomain);
00476
00477 } else {
00478
00479 }
00480 m_prodTimeOverride.insert( std::make_pair<std::pair<char*,char*>, unsigned int>( std::make_pair<char*,char*>(dbType,dbDomain), ptime ) );
00481 }
00482
00483
00484 void StDbBroker::SetFlavor(const char* flavor){
00485
00486 if(!flavor)return;
00487 m_flavor = new char[strlen(flavor)+1];
00488 strcpy(m_flavor,flavor);
00489 if(m_Tree)m_Tree->setFlavor(m_flavor);
00490
00491 }
00492
00493
00494 void StDbBroker::SetTableFlavor(const char* flavor, int tabID, int parID)
00495 {
00496 StDbNode* anode = m_Nodes->getNode(tabID);
00497 StDbTable* node=dynamic_cast<StDbTable*>(anode);
00498
00499 if(!node) return;
00500 node->setFlavor(flavor);
00501 }
00502
00503
00504
00505 void * StDbBroker::Use(int tabID, int parID)
00506 {
00507
00508
00509
00510
00511
00512
00513 void* pData = 0;
00514 m_nRows = 0;
00515 SetNRows(0);
00516 SetBeginDate(19950101);
00517 SetBeginTimeStamp(788918400);
00518 SetBeginTime(0);
00519 SetEndDate(20380101);
00520 SetEndTimeStamp(2145916799);
00521 SetEndTime(0);
00522 SetZombie(false);
00523
00524
00525 StDbTableDescriptor* TD = new StDbTableDescriptor();
00526 TD->storeRowSize(m_sizeOfStruct);
00527 delete TD;
00528
00529 StDbNode* anode = m_Nodes->getNode(tabID);
00530 m_node=dynamic_cast<StDbTable*>(anode);
00531
00532 if(!m_node) return pData;
00533 if(!m_node->hasDescriptor())m_node->setDescriptor(GetTableDescriptor());
00534
00535
00536
00537
00538 bool fetchStatus;
00539 if(m_node->getDbType()==dbRunLog &&
00540 m_node->getDbDomain() != dbStar &&
00541 m_runNumber>1000000 ){
00542 fetchStatus=UseRunLog(m_node);
00543 } else {
00544 fetchStatus=mgr->fetchDbTable(m_node);
00545 }
00546
00547
00548
00549 if(fetchStatus){
00550
00551 char* thisTime;
00552 m_endTimeStamp = m_node->getEndTime();
00553 thisTime = m_node->getEndDateTime();
00554 makeDateTime(thisTime,m_EndDate,m_EndTime);
00555 m_nRows= m_node->GetNRows();
00556 pData = m_node->GetTableCpy();
00557
00558 m_beginTimeStamp = m_node->getBeginTime();
00559 thisTime = m_node->getBeginDateTime();
00560 makeDateTime(thisTime,m_BeginDate,m_BeginTime);
00561
00562 } else {
00563 SetZombie(true);
00564 }
00565
00566 return pData;
00567 }
00568
00569
00570 void StDbBroker::makeDateTime(const char* dateTime,Int_t & iDate,Int_t & iTime){
00571
00572 char* tmp1 = new char[strlen(dateTime)+1];
00573 char* tmp2 = new char[strlen(dateTime)+1];
00574 strcpy(tmp1,dateTime);
00575 strcpy(tmp2,tmp1); tmp1[8]='\0';tmp2+=8;
00576
00577 iDate = atoi(tmp1);
00578 iTime = atoi(tmp2);
00579 delete [] tmp1; tmp2-=8; delete [] tmp2;
00580
00581 }
00582
00583
00584 bool StDbBroker::UseRunLog(StDbTable* table){
00585
00586 unsigned int prodTime=table->getProdTime();
00587 StString rq;
00588 rq<<" where runNumber="<<m_runNumber;
00589
00590 if(prodTime==0){
00591 rq<<" AND deactive=0 ";
00592 } else {
00593 rq<<" AND (deactive=0 OR deactive>="<<prodTime<<")";
00594 rq<<" AND unix_timestamp(entryTime)<="<<prodTime;
00595 }
00596
00597 bool fetchStatus=mgr->fetchDbTable(table,(char*)(rq.str()).c_str());
00598
00599
00600 return fetchStatus;
00601 }
00602
00603
00604 Int_t StDbBroker::WriteToDb(void* pArray, int tabID){
00605 #define __METHOD__ "WriteToDb(pArray,tabID)"
00606
00607 StString em;
00608 if(!pArray || tabID==0) {
00609 em<<" Write Failed -> either data-array or tableID is incomplete";
00610 return mgr->printInfo((em.str()).c_str(),dbMErr,__LINE__,__CLASS__,__METHOD__);
00611 }
00612 if(!m_Nodes){
00613 em<<"Write Failed -> incomplete table context. Try InitConfig() 1st";
00614 return mgr->printInfo((em.str()).c_str(),dbMErr,__LINE__,__CLASS__,__METHOD__);
00615 }
00616 StDbNode* anode= m_Nodes->getNode(tabID);
00617 StDbTable* table=dynamic_cast<StDbTable*>(anode);
00618 if(!table){
00619 em<<"Write Failed -> tableID="<<tabID<<" is not known ";
00620 return mgr->printInfo((em.str()).c_str(),dbMErr,__LINE__,__CLASS__,__METHOD__);
00621 }
00622
00623 if(!table->hasDescriptor())table->setDescriptor(GetTableDescriptor());
00624 table->SetTable((char*)pArray,m_nRows);
00625
00626
00627
00628 mgr->setStoreTime(mgr->getUnixCheckTime());
00629 if(!mgr->storeDbTable(table))return 0;
00630 return 1;
00631 #undef __METHOD__
00632 }
00633
00634
00635 Int_t StDbBroker::WriteToDb(void* pArray, const char* fullPath, int* idList){
00636 #define __METHOD__ "WriteToDb(pArray,fullPath,idList)"
00637 StString em;
00638
00639 if(!pArray || !fullPath) {
00640 em<<" Write Failed:: either data-array or path is incomplete";
00641 return mgr->printInfo((em.str()).c_str(),dbMErr,__LINE__,__CLASS__,__METHOD__);
00642 }
00643
00644 char* path=new char[strlen(fullPath)+1];
00645 strcpy(path,fullPath);
00646
00647
00648 char* tmp=path;
00649 tmp+=strlen(path)-1;
00650 if(*tmp=='/')*tmp='\0';
00651
00652
00653
00654
00655
00656
00657 char* a1=path;
00658 char* a2;
00659 char** aword = new char*[20];
00660
00661 int icount=0;
00662 aword[icount]=a1;
00663 while((a2=strstr(a1,"/"))){
00664 *a2='\0'; a2++;
00665 icount++;
00666 aword[icount]=a2;
00667 a1=a2;
00668 }
00669
00670 char tmpName[128];
00671 char* dbName =0;
00672 StDbTable* table = 0;
00673 for(int i=icount;i>0;i--){
00674 if(i==icount){
00675 dbName=aword[i];
00676 } else {
00677 sprintf(tmpName,"%s_%s",aword[i-1],aword[i]);
00678 dbName=(char*)tmpName;
00679 }
00680 table=findTable(dbName);
00681 if(table)break;
00682 }
00683
00684 if(!table){
00685 em<<"Write Failed table="<<m_tableName<<" not found in db="<<dbName;
00686 delete [] path;
00687 return mgr->printInfo((em.str()).c_str(),dbMErr,__LINE__,__CLASS__,__METHOD__);
00688 }
00689
00690 table->setDescriptor(GetTableDescriptor());
00691 table->SetTable((char*)pArray,m_nRows,idList);
00692 mgr->setStoreTime(mgr->getUnixCheckTime());
00693 bool iswritten=mgr->storeDbTable(table);
00694 delete table;
00695
00696 return (iswritten) ? 1 : 0;
00697 #undef __METHOD__
00698 }
00699
00700
00701 StDbTable*
00702 StDbBroker::findTable(const char* databaseName){
00703
00704 StDbTable* table=0;
00705 StDbConfigNode* node= mgr->initConfig(databaseName);
00706 StDbTable* tmp=node->addDbTable(m_tableName);
00707 if(tmp)table=new StDbTable(*tmp);
00708 delete node;
00709
00710 return table;
00711 }
00712
00713
00714 void * StDbBroker::Use()
00715 {
00716
00717 Int_t date, time;
00718
00719 date = m_DateTime[0]; time = m_DateTime[1];
00720 uint datetime[4]={0,0,0,0};
00721 datetime[0]=date;
00722 datetime[1]=time;
00723 uint nRows=0;
00724
00725
00726 UInt_t i;
00727 for (i=0;i<m_nElements;i++) {
00728 m_descriptor[i].fColumnName[31]='\0';
00729 }
00730
00731
00732 char* id = strstr(m_tableName,"_hierarchy");
00733 if(id){
00734 char* tmpName = new char[strlen(m_tableName)+1];
00735 strcpy(tmpName,m_tableName);
00736 char* id2 = strstr(tmpName,"_hierarchy");
00737 *id2 = '\0';
00738 if(strcmp(tmpName,"Calib")==0){
00739 m_database = new char[strlen("Calibrations_tpc")+1];
00740 strcpy(m_database,"Calibrations_tpc");
00741 } else if(strstr(tmpName,"Geom")){
00742 m_database = new char[strlen("Geometry_tpc")+1];
00743 strcpy(m_database,"Geometry_tpc");
00744 } else if(strstr(tmpName,"RunParam")){
00745 m_database = new char[strlen("RunParams_tpc")+1];
00746 strcpy(m_database,"RunParams_tpc");
00747 } else {
00748 m_database = new char[strlen("params")+1];
00749 strcpy(m_database,"params");
00750 }
00751 *id2='_';
00752 delete [] tmpName;
00753 }
00754
00755 void *pDbData;
00756
00757 if(id || strcmp(m_database,"params")==0){
00758
00759 cout << "Looking for Table "<<m_tableName<<" In Db= "<<m_database<<endl;
00760
00761 pDbData = ::DbUse(&nRows, datetime, (const char*)m_tableName,(const char*)m_structName,m_nElements,m_sizeOfStruct,m_descriptor);
00762
00763 } else {
00764
00765 pDbData = ::DbRead(&nRows, datetime,(const char*)m_tableName,(const char*)m_structName,m_nElements,m_sizeOfStruct,m_descriptor,(const char*)m_database, (const char*)m_tableVersion );
00766
00767 }
00768
00769 if (pDbData==NULL)
00770 {
00771 SetNRows(0);
00772 SetBeginDate(19950101);
00773 SetBeginTime(0);
00774 SetEndDate(20380101);
00775 SetEndTime(0);
00776 }
00777 else
00778 {
00779 SetNRows((UInt_t)nRows);
00780 SetBeginDate(datetime[0]);
00781 SetBeginTime(datetime[1]);
00782 SetEndDate (datetime[2]);
00783 SetEndTime (datetime[3]);
00784 }
00785
00786 return pDbData;
00787 }
00788
00789
00790 dbConfig_st*
00791 StDbBroker::InitConfig(const char* configName, int& numRows, char* versionName)
00792 {
00793
00794 if(m_Nodes){
00795 delete m_Nodes;
00796 m_Nodes = 0;
00797 }
00798
00799 if(m_Tree) delete m_Tree;
00800
00801 char* dbTypeName=0;
00802 char* dbDomainName=0;
00803 if(m_ParentType) delete [] m_ParentType;
00804 m_ParentType = 0;
00805
00806 if(mgr->getDataBaseInfo(configName,dbTypeName,dbDomainName)){
00807 if(strcmp(dbDomainName,"Star")!=0){
00808 int tlen = strlen(dbTypeName);
00809 m_ParentType = new char[tlen+1];
00810 strcpy(m_ParentType,dbTypeName);
00811 }
00812 }
00813
00814 delete [] dbTypeName;
00815 delete [] dbDomainName;
00816
00817 if(m_isVerbose)mgr->setVerbose(true);
00818 if(!versionName){
00819 m_Tree=mgr->initConfig(configName,"reconV0",1);
00820 }else{
00821 m_Tree=mgr->initConfig(configName,versionName,1);
00822 }
00823
00824 dbConfig_st* configTable = 0;
00825 if(!m_Tree) return configTable;
00826
00827 if(m_prodTime!=0) {
00828 m_Tree->setProdTime(m_prodTime);
00829 for (std::map<std::pair<char*,char*>, unsigned int>::iterator it = m_prodTimeOverride.begin(); it != m_prodTimeOverride.end(); it++ ) {
00830
00831
00832
00833
00834
00835 m_Tree->setProdTimeOverride((*it).second, (*it).first.first, (*it).first.second);
00836 }
00837 }
00838 if(m_flavor)m_Tree->setFlavor(m_flavor);
00839
00840 if(m_isVerbose){
00841 cout << "****************************************************************"<<endl;
00842 cout << "*** Will Print the Tree "<<endl;
00843 bool verbCheck = mgr->IsVerbose();
00844 if(!verbCheck)mgr->setVerbose(true);
00845 m_Tree->printTree(0);
00846 if(!verbCheck)mgr->setVerbose(false);
00847 cout << "*** End Print the Tree "<<endl;
00848 cout << "****************************************************************"<<endl;
00849 };
00850 numRows = 0;
00851
00852 if(!buildNodes(m_Tree,0)) return configTable;
00853
00854
00855 return buildConfig(numRows);
00856 }
00857
00858
00859
00860 int
00861 StDbBroker::buildNodes(StDbConfigNode* parentNode, int pID){
00862
00863 if(!parentNode) return 0;
00864 if(!m_Nodes) {
00865 m_Nodes=new dbNodes;
00866 m_Nodes->addNode(parentNode,0);
00867 }
00868
00869 int cID;
00870
00871
00872 if( (parentNode->hasData()) ){
00873 StDbTableIter* itr = parentNode->getStDbTableIter();
00874 while(!itr->done())cID=m_Nodes->addNode(itr->next(),pID);
00875 delete itr;
00876 }
00877
00878 StDbConfigNode* next;
00879
00880
00881 if((parentNode->hasChildren())){
00882 next=parentNode->getFirstChildNode();
00883 cID=m_Nodes->addNode(next,pID);
00884 if(!buildNodes(next, cID))return 0;
00885 }
00886
00887
00888 int parID;
00889 if( (next=parentNode->getNextNode()) ){
00890 parID=m_Nodes->getParentID(pID);
00891 cID=m_Nodes->addNode(next,parID);
00892 if(!buildNodes(next, cID))return 0;
00893 }
00894
00895 return 1;
00896 }
00897
00898
00899 dbConfig_st*
00900 StDbBroker::buildConfig(int& numRows){
00901
00902 dbConfig_st* cTab= 0;
00903 m_Nodes->reset();
00904 int numNodes = m_Nodes->getNumNodes();
00905
00906 StDbNode* node;
00907 StDbNode* parent;
00908 char* parName;
00909 char* nodeName;
00910 char* id;
00911 unsigned int parsize=sizeof(cTab[0].parname)-1;
00912 unsigned int tabsize=sizeof(cTab[0].tabname)-1;
00913 unsigned int typsize=sizeof(cTab[0].tabtype)-1;
00914 int parID;
00915 int cRow;
00916
00917 numRows = numNodes;
00918
00919 cTab=(dbConfig_st*)calloc(numRows,sizeof(dbConfig_st));
00920 node = m_Nodes->getNode(0);
00921 strncpy(cTab[0].tabname,node->printName(),tabsize);
00922 cTab[0].tabname[tabsize]='\0';
00923 strncpy(cTab[0].tabtype,".node",typsize);
00924 cTab[0].tabtype[typsize]='\0';
00925 cTab[0].parID=cTab[0].tabID=0;
00926 cRow = 1;
00927
00928 if(m_ParentType){
00929 strncpy(cTab[0].parname,m_ParentType,parsize);
00930 } else {
00931 strncpy(cTab[0].parname,node->printName(),parsize);
00932 }
00933 cTab[0].parname[parsize]='\0';
00934
00935 for(int i=1; i<numNodes;i++){
00936
00937 node = m_Nodes->getNode(i);
00938 parent= m_Nodes->getParent(i);
00939 parID = m_Nodes->getParentID(i);
00940
00941 nodeName = node->printName();
00942 parName = parent->printName();
00943
00944 strncpy(cTab[cRow].parname,parName,parsize);
00945 cTab[cRow].parname[parsize]='\0';
00946 strncpy(cTab[cRow].tabname,nodeName,tabsize);
00947 cTab[cRow].tabname[tabsize]='\0';
00948
00949 id=cTab[cRow].tabtype; *id='.'; id++;
00950 if(node->IsTable()){
00951 strcpy(id,((StDbTable*)node)->printCstructName());
00952 } else {
00953 strcpy(id,"node");
00954 }
00955 cTab[cRow].tabtype[typsize]='\0';
00956
00957 cTab[cRow].tabID=i;
00958 cTab[cRow].parID=parID;
00959 cRow++;
00960 }
00961
00962 if(m_isVerbose){
00963 cout <<"****************************************************"<<endl;
00964 cout <<"********* Will print dbConfig table "<<endl;
00965 for(int k=0; k<numRows; k++) {
00966 cout << "row "<<k<<" name =" << cTab[k].tabname<< " tid= "<< cTab[k].tabID;
00967 cout << " type = "<<cTab[k].tabtype;
00968 cout << " parent =" << cTab[k].parname << " pid= " << cTab[k].parID<<endl;
00969 }
00970 cout <<"********* End print dbConfig table "<<endl;
00971 cout <<"****************************************************"<<endl;
00972 }
00973
00974 return cTab;
00975 }
00976
00977
00978 int StDbBroker::DbInit(const char * dbName) { return ::DbInit(dbName) ;}
00979
00980 #undef __CLASS__