]> git.treefish.org Git - phys/latlib.git/blobdiff - configcache.cpp
Fixed unhashed fileid creation.
[phys/latlib.git] / configcache.cpp
index 34789ee71b4dbdf0ef1af5b9aa4451567c346908..59472e9c31856ca4c297945087d93b5502bdd798 100644 (file)
@@ -4,6 +4,9 @@
 #include <iostream>
 #include <time.h>
 #include <dirent.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <fcntl.h>
 
 #include <boost/iostreams/filtering_streambuf.hpp>
 #include <boost/iostreams/stream.hpp>
@@ -50,13 +53,25 @@ configcache::configcache(const string& cacheid, const int& nequi, const int& nsk
   refetchDataFiles = false;
 }
 
-string configcache::getFileId(int actnequi, const bool& shortid)
+string configcache::paraString() {
+  stringstream parastring;
+
+  for(int ipara=0; ipara<Paras.size(); ipara++)
+    parastring << "_" << Paras[ipara].id << Paras[ipara].val;
+  
+  return parastring.str();
+}
+
+string configcache::getFileId(int actnequi, const bool& superextended, const bool& shortid)
 {
   stringstream fileid;
 
   if(!shortid) fileid << CACHEID << "_" << actnequi << "_" << NSKIP;
-  for(int ipara=0; ipara<Paras.size(); ipara++)
-    fileid << "_" << Paras[ipara].id << Paras[ipara].val;
+
+  if( superextended )
+    fileid << "_" << hash( paraString() );
+  else
+    fileid << paraString();
 
   return fileid.str();
 }
@@ -88,10 +103,18 @@ bool configcache::isValidInFile(const string& infile, infiledesc *filedesc)
 
   if( infile.size() < 4 ) return false;
 
-  if( infile.substr(infile.size()-4) == ".dat" )
+  if( infile.substr(infile.size()-4) == ".dat" ) {
     filedesc->extended = false;
-  else if( infile.substr(infile.size()-4) == "edat" )
+    filedesc->superextended = false;
+  }
+  else if( infile.substr(infile.size()-4) == "edat" ) {
     filedesc->extended = true;
+    filedesc->superextended = false;
+  }
+  else if( infile.substr(infile.size()-4) == "sdat" ) {
+    filedesc->extended = true;
+    filedesc->superextended = true;
+  }
   else
     return false;
 
@@ -123,7 +146,7 @@ bool configcache::isValidInFile(const string& infile, infiledesc *filedesc)
 
   delete[] inchar;
 
-  if( truncIn.find( getFileId(NEQUI, true) + "_" ) == string::npos ) return false;
+  if( truncIn.find( getFileId(NEQUI, filedesc->superextended, true) + "_" ) == string::npos ) return false;
 
   return true;
 }
@@ -210,6 +233,8 @@ void configcache::readConfig(bool *readnewconfig, int *nequileft, vector<unsigne
       }
 
       while( (!inFile.is_open()) && inFiles.size() > 0 ) {
+       string inFileParaString;
+
        openFileDesc = *inFileIt;
 
        if (openFileDesc.nequi < NEQUI)
@@ -222,6 +247,14 @@ void configcache::readConfig(bool *readnewconfig, int *nequileft, vector<unsigne
        if(log) *log << "CCACHE: Opening dat-file: " << inFileIt->filename << endl << flush;
        inFile.open( (DATADIR + "/" + inFileIt->filename).c_str(), std::ios::binary );
        
+       if( openFileDesc.superextended ) {
+         getline( inFile, inFileParaString );
+         if( inFileParaString != paraString() ) {
+           if(log) *log << "CCACHE: Parastring does not match. Closing dat-file..." << endl << flush;
+           inFile.close();
+         }
+       }
+       
        inFiles.erase(inFileIt);
        
        if( !inFile.is_open() ) continue;
@@ -274,12 +307,30 @@ void configcache::readConfig(bool *readnewconfig, int *nequileft, vector<unsigne
 void configcache::openOutFile(int actnequi)
 { 
   time_t secstamp = time(NULL);
+  int iseq=0;
+  
+  while (true) {
+    outFileName.str("");
+    outFileName << DATADIR << "/" << secstamp << "." << iseq << "_" << getFileId(actnequi, true, false) << "_.sdat.tmp";
 
-  outFileName.str("");
-  outFileName << DATADIR << "/" << secstamp << "_" << getFileId(actnequi) << "_.edat.tmp";
+    int tmpfd = open(outFileName.str().c_str(), O_CREAT | O_EXCL, 0644);
 
+    if ( tmpfd != -1 ) {
+      close(tmpfd);
+      break;
+    }
+    else if ( errno != EEXIST ) {
+      if(log) *log << "CCACHE: Could not create cachefile!" << endl << flush;
+      exit(1);
+    }
+
+    iseq++;
+  }
+  
   outFile.open( outFileName.str().c_str(), std::ios::binary );
 
+  outFile << paraString() << endl;
+
   ioBuffers->out = new boost::iostreams::filtering_ostreambuf;
   ioBuffers->out->push(boost::iostreams::bzip2_compressor());
   ioBuffers->out->push(outFile);