]> git.treefish.org Git - phys/latlib.git/blob - configcache.h
Opening cachefiles exclusively with O_EXCL.
[phys/latlib.git] / configcache.h
1 #ifndef CONFIGCACHE_H
2 #define CONFIGCACHE_H
3
4 #include <vector>
5 #include <string>
6 #include <fstream>
7 #include <sstream>
8 #include <ostream>
9
10 #define CACHE_MODE_OO 0
11 #define CACHE_MODE_RO 1
12 #define CACHE_MODE_WO 2
13 #define CACHE_MODE_RW 3
14
15 using namespace std;
16
17 struct parameter{
18   string id;
19   double val;
20 };
21
22 struct infiledesc {
23   string filename;
24   int nequi;
25   int nskip;
26   bool extended;
27 };
28
29 class configcache{
30  public:
31   ~configcache();
32   configcache(const string& cacheid, const int& nequi, const int& nskip, const string& datadir, char **configmem, const int& configMemSize, 
33               const int& cachemode=CACHE_MODE_RW, ostream *_log=NULL);
34   void readConfig(bool *readnewconfig, int *nequileft, vector<unsigned long> *excludeFileHashes=NULL);
35   void writeConfig(int actnequi);
36   void addPara(const string& parid, const double& val=0);
37   void setPara(const string& parid, const double& value);
38   void writeHeader(const string& headerid, const char *header, long unsigned int size, int actnequi);
39   void * getHeader(const string& headerid);
40   string getOutFileName() { return outFileName.str(); }
41   string getInFileName() { return DATADIR + "/" + openFileDesc.filename; }
42   static unsigned long hash(const string& str);
43   void closeInFile() { inFile.close(); }
44   int inFilesLeft() { return inFiles.size(); }
45   char* getConfigMem() { return configMem; }
46   int getConfigSize() { return configSize; }
47   bool isOutFileOpen () { return outFile.is_open(); }
48   void finishOutFile();
49
50  private:
51   struct iobuffers;
52   iobuffers *ioBuffers;
53
54   ostream* log;
55   infiledesc openFileDesc;
56   int getParIndex(const string& parid);
57   int NEQUI;
58   int NSKIP;
59   string DATADIR;
60   string CACHEID;
61   int MODE;
62   string getFileId(int actnequi, const bool& shortid=false);
63
64   ofstream outFile;
65   ifstream inFile;
66
67   stringstream outFileName;
68
69   int readnum;
70
71   int inSize;
72
73   int configSize;
74   char *configMem;
75   char *tmpConfig;
76
77   bool refetchDataFiles;
78
79   void fetchDataFiles();
80   
81   bool isValidInFile(const string& infile, infiledesc *filedesc);
82
83   vector<infiledesc> inFiles;
84
85   vector<parameter> Paras;
86
87   int readDataToMem(char *tmpData, long unsigned int dataSize);
88
89   void openOutFile(int actnequi);
90
91   int readHeader();
92
93   bool headerWritten;
94
95   int readFullBlock(char *tmpData, long unsigned int dataSize);
96
97   vector< pair<unsigned long, void *> > headerStore;
98
99   void deleteHeaderStore();
100
101   bool readAllHeaders();
102
103   vector<infiledesc>::iterator getNextInfile(vector<unsigned long> *excludeFileHashes);
104
105   int nequileft_internal;
106
107   bool doVirtualEquilibration, firstUsedConfig;
108 };
109
110 #endif