//测试函数 void Test() { HashTable T; InitTable(&T); //插入序列 int pIn[13] = { 0, 3, 6, 5, 7, 10, 23, 89, 100, 111, 81,91,93}; //int pIn[10] = { 0, 3, 6, 5, 7, 10, 23, 89, 100, 111}; //搜索序列 int pSe[11] = {11, 3, 6, 5, 7, 0 , 23, 89, 100, 111, 80 }; printf("插入序列:\n"); for (int i = 0; i < 13; i++) { printf("%d- ",i); InsertToTable(&T, pIn[i]); } printf("\n搜索序列:\n"); for (int i = 0; i < 11; i++) { int nCom = 0; printf("%d- ",i); printf("目标:%3d 哈希值:%2d 结果: %2d",pSe[i],GetHash(T,pSe[i]),SearchTable(T, pSe[i], &nCom)); printf(" 比较:%3d\n", nCom); } DestroyTable(&T); }
//______________________________________________________________________________ Bool_t ROMEXMLDataBase::Write(ROMEStr2DArray* values,const char *dataBasePath,Long64_t runNumber,Long64_t eventNumber) { int i,j; char *cstop; ROMEStr2DArray fieldArray; ROMEStrArray valueArr; ROMEString xmlPath; ROMEPath *path = new ROMEPath(); ROMEString vTemp; int retValue = SearchTable(path,values,dataBasePath,runNumber,eventNumber,true); if (retValue==0) { delete path; return false; } if (retValue==-1) { delete path; return true; } // handle folder array if (retValue==2) { if (path->IsFieldArray()) { /* for (j=path->GetFieldIndexAt(0);j<=path->GetFieldIndexAt(1);j=j+path->GetFieldIndexAt(2)) { xmlPath = fXMLBase; xmlPath += path->GetFieldName(); xmlPath.AppendFormatted("__%d",j); if (!xml->GetPathValues(xmlPath,&valueArr)) { ROMEPrint::Error("\nWrong data base path : %s\n", xmlPath.Data()); delete path; return false; } if (valueArr.GetEntriesFast()!=fIDX.GetEntriesFast()) { ROMEPrint::Error("\nInvalid Table : %s\n", path->GetTableNameAt(path->GetNumberOfTables()-1)); delete path; return false; } for (k=0;k<valueArr.GetEntriesFast();k++) { int idxValue = strtol(fIDX.At(k).Data(),&cstop,10); if (idxValue>=0) fieldArray.SetAt(valueArr.At(k),j,idxValue); } }*/ } else { for (i=0;i<fIDX.GetEntriesFast();i++) { xmlPath = fXMLBase; xmlPath.InsertFormatted(xmlPath.Length()-1,"[idx=%ld]",strtol(fIDX.At(i).Data(),&cstop,10)); xmlPath += path->GetFieldName(); path->Decode(xmlPath.Data(),0,eventNumber); vTemp = values->At(i,0); if (!WriteValue(path,fXMLBase,vTemp,-1)) { delete path; return false; } } } } // handle single folder else { if (path->IsFieldArray()) { for (j=path->GetFieldIndexAt(0);j<=path->GetFieldIndexAt(1);j=j+path->GetFieldIndexAt(2)) { vTemp = values->At(0,j); if (!WriteValue(path,fXMLBase,vTemp,j)) { delete path; return false; } } } else { vTemp = values->At(0,0); if (!WriteValue(path,fXMLBase,vTemp,-1)) { delete path; return false; } } } xml->WritePathFile(fFileName.Data()); delete path; return true; }
//______________________________________________________________________________ Bool_t ROMEXMLDataBase::Read(ROMEStr2DArray *values,const char *dataBasePath,Long64_t runNumber,Long64_t eventNumber) { int i,ii,j,k,indx; char *cstop; ROMEStr2DArray fieldArray; ROMEStrArray valueArr; ROMEString xmlPath; ROMEPath *path = new ROMEPath(); int retValue = SearchTable(path,values,dataBasePath,runNumber,eventNumber,false); if (retValue==0) { delete path; return false; } if (retValue==-1) { delete path; return true; } // handle folder array if (retValue==2) { if (path->IsFieldArray()) { for (j=path->GetFieldIndexAt(0);j<=path->GetFieldIndexAt(1);j=j+path->GetFieldIndexAt(2)) { xmlPath = fXMLBase; xmlPath += path->GetFieldName(); xmlPath.AppendFormatted("__%d",j); if (!xml->GetPathValues(xmlPath,&valueArr)) { ROMEPrint::Error("\nWrong data base path : %s\n", xmlPath.Data()); delete path; return false; } if (valueArr.GetEntriesFast()!=fIDX.GetEntriesFast()) { ROMEPrint::Error("\nInvalid Table : %s\n", path->GetTableNameAt(path->GetNumberOfTables()-1)); delete path; return false; } for (k=0;k<valueArr.GetEntriesFast();k++) { int idxValue = strtol(fIDX.At(k).Data(),&cstop,10); if (idxValue>=0) fieldArray.SetAt(valueArr.At(k),j,idxValue); } } } else { xmlPath = fXMLBase; xmlPath += path->GetFieldName(); if (!xml->GetPathValues(xmlPath,&valueArr)) { ROMEPrint::Error("\nWrong data base path : %s\n", xmlPath.Data()); delete path; return false; } if (valueArr.GetEntriesFast()!=fIDX.GetEntriesFast()) { ROMEPrint::Error("\nInvalid Table : %s\n", path->GetTableNameAt(path->GetNumberOfTables()-1)); delete path; return false; } for (j=0;j<valueArr.GetEntriesFast();j++) { int idxValue = strtol(fIDX.At(j).Data(),&cstop,10); if (idxValue>=0) fieldArray.SetAt(valueArr.At(j),0,idxValue); } } for (ii=path->GetOrderIndexAt(0);ii<=path->GetOrderIndexAt(1);ii=ii+path->GetOrderIndexAt(2)) { indx = ii; for (i=fOrderTableIndex;i<path->GetNumberOfTables();i++) { // add field if (i==path->GetNumberOfTables()-1) { // field array if (path->IsFieldArray()) { for (j=path->GetFieldIndexAt(0);j<=path->GetFieldIndexAt(1);j=j+path->GetFieldIndexAt(2)) { values->SetAt(fieldArray.At(j,indx),ii-path->GetOrderIndexAt(0),j); } } // single field else { values->SetAt(fieldArray.At(0,indx),ii-path->GetOrderIndexAt(0),0); } } else { indx = strtol(fPointerArray.At(i-fOrderTableIndex,indx).Data(),&cstop,10); } } } } // handle single folder else { if (path->IsFieldArray()) { for (j=path->GetFieldIndexAt(0);j<=path->GetFieldIndexAt(1);j=j+path->GetFieldIndexAt(2)) { xmlPath = fXMLBase; xmlPath += path->GetFieldName(); xmlPath.AppendFormatted("__%d",j); if (!xml->GetPathValues(xmlPath,&valueArr)) { ROMEPrint::Error("\nWrong data base path : %s\n", xmlPath.Data()); delete path; return false; } values->SetAt(valueArr.At(0),0,j-path->GetFieldIndexAt(0)); } } else { xmlPath = fXMLBase; xmlPath += path->GetFieldName(); if (!xml->GetPathValues(xmlPath,&valueArr)) { ROMEPrint::Error("\nWrong data base path : %s\n", xmlPath.Data()); delete path; return false; } if (valueArr.GetEntriesFast()<=0) { ROMEPrint::Error("\nWrong data base path : %s\n",xmlPath.Data()); delete path; return false; } values->SetAt(valueArr.At(0),0,0); } } delete path; return true; }