📄 file_8h-source.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>file.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.2.18 -->
<center>
<a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Compound Members</a> </center>
<hr><h1>file.h</h1><div class="fragment"><pre>00001 <span class="comment">//-< FILE.CPP >------------------------------------------------------*--------*</span>
00002 <span class="comment">// FastDB Version 1.0 (c) 1999 GARRET * ? *</span>
00003 <span class="comment">// (Main Memory Database Management System) * /\| *</span>
00004 <span class="comment">// * / \ *</span>
00005 <span class="comment">// Created: 20-Nov-98 K.A. Knizhnik * / [] \ *</span>
00006 <span class="comment">// Last update: 10-Dec-98 K.A. Knizhnik * GARRET *</span>
00007 <span class="comment">//-------------------------------------------------------------------*--------*</span>
00008 <span class="comment">// System independent intrface to mapped on memory file</span>
00009 <span class="comment">//-------------------------------------------------------------------*--------*</span>
00010
00011 <span class="preprocessor">#ifndef __FILE_H__</span>
00012 <span class="preprocessor"></span><span class="preprocessor">#define __FILE_H__</span>
00013 <span class="preprocessor"></span>
00014 <span class="preprocessor">#include "sync.h"</span>
00015
00016 BEGIN_FASTDB_NAMESPACE
00017
00018 <span class="preprocessor">#if defined(REPLICATION_SUPPORT)</span>
00019 <span class="preprocessor"></span><span class="keyword">const</span> <span class="keywordtype">int</span> dbModMapBlockBits = 12; <span class="comment">// 10;</span>
00020 <span class="keyword">const</span> <span class="keywordtype">int</span> dbModMapBlockSize = 1 << dbModMapBlockBits;
00021 <span class="preprocessor">#elif defined(NO_MMAP)</span>
00022 <span class="preprocessor"></span><span class="keyword">const</span> <span class="keywordtype">int</span> dbModMapBlockBits = 12;
00023 <span class="keyword">const</span> <span class="keywordtype">int</span> dbModMapBlockSize = 1 << dbModMapBlockBits;
00024 <span class="preprocessor">#endif</span>
00025 <span class="preprocessor"></span>
00026 <span class="preprocessor">#ifdef REPLICATION_SUPPORT</span>
00027 <span class="preprocessor"></span>
00028 <span class="keyword">class </span>dbFile;
00029 <span class="keyword">class </span>dbReplicatedDatabase;
00030 <span class="keyword">class </span>socket_t;
00031
00032 <span class="keyword">struct </span>ReplicationRequest {
00033 <span class="keyword">enum</span> {
00034 RR_CONNECT,
00035 RR_RECOVERY,
00036 RR_GET_STATUS,
00037 RR_STATUS,
00038 RR_UPDATE_PAGE,
00039 RR_RECOVER_PAGE,
00040 RR_NEW_ACTIVE_NODE,
00041 RR_CHANGE_ACTIVE_NODE,
00042 RR_CLOSE,
00043 RR_READY,
00044 RR_COMMITTED
00045 };
00046 byte op;
00047 byte nodeId;
00048 byte status;
00049 <span class="keywordtype">int</span> size;
00050 <span class="keyword">struct </span>{
00051 <span class="keywordtype">int</span> updateCount;
00052 <span class="keywordtype">int</span> offs;
00053 } page;
00054 };
00055
00056 <span class="keyword">struct </span>RecoveryRequest {
00057 dbFile* file;
00058 <span class="keywordtype">int</span> nodeId;
00059 <span class="keywordtype">int</span> nPages;
00060 <span class="keywordtype">int</span>* updateCounters;
00061 };
00062 <span class="preprocessor">#endif</span>
00063 <span class="preprocessor"></span>
00064 <span class="preprocessor">#ifdef FUZZY_CHECKPOINT</span>
00065 <span class="preprocessor"></span><span class="keyword">class </span>dbFileWriter;
00066 <span class="preprocessor">#endif</span>
00067 <span class="preprocessor"></span>
00068 <span class="keyword">class </span>dbFile {
00069 <span class="keyword">protected</span>:
00070 <span class="preprocessor">#ifdef _WIN32</span>
00071 <span class="preprocessor"></span> HANDLE fh;
00072 HANDLE mh;
00073 <span class="preprocessor">#else</span>
00074 <span class="preprocessor"></span><span class="preprocessor">#ifdef USE_SYSV_SHARED_MEMORY</span>
00075 <span class="preprocessor"></span> dbSharedMemory shmem;
00076 <span class="preprocessor">#endif</span>
00077 <span class="preprocessor"></span> <span class="keywordtype">int</span> fd;
00078 <span class="preprocessor">#endif</span>
00079 <span class="preprocessor"></span> <span class="keywordtype">char</span>* sharedName;
00080 <span class="keywordtype">char</span>* mmapAddr;
00081 size_t mmapSize;
00082 <span class="keywordtype">bool</span> readonly;
00083 <span class="keyword">public</span>:
00084 <span class="keyword">enum</span> {
00085 ok = 0
00086 };
00087 <span class="comment">//</span>
00088 <span class="comment">// Create backup file</span>
00089 <span class="comment">//</span>
00090 <span class="keywordtype">int</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, <span class="keywordtype">bool</span> noBuffering = <span class="keyword">true</span>);
00091 <span class="comment">//</span>
00092 <span class="comment">// Open database file and create file mapping object </span>
00093 <span class="comment">//</span>
00094 <span class="keywordtype">int</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* fileName, <span class="keywordtype">char</span> <span class="keyword">const</span>* sharedName,
00095 <span class="keywordtype">bool</span> readonly, size_t initSize, <span class="keywordtype">bool</span> replicationSupport);
00096
00097 <span class="keywordtype">void</span>* getAddr()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> mmapAddr; }
00098 size_t getSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> mmapSize; }
00099 <span class="keywordtype">int</span> setSize(size_t size, <span class="keywordtype">char</span> <span class="keyword">const</span>* sharedName, <span class="keywordtype">bool</span> initialize = <span class="keyword">true</span>);
00100 <span class="keywordtype">int</span> flush(<span class="keywordtype">bool</span> physical = <span class="keyword">false</span>);
00101 <span class="keywordtype">int</span> close();
00102 <span class="keywordtype">int</span> erase();
00103 <span class="keywordtype">int</span> write(<span class="keywordtype">void</span> <span class="keyword">const</span>* ptr, size_t& writtenBytes, size_t size);
00104 <span class="keywordtype">int</span> read(<span class="keywordtype">void</span>* ptr, size_t& readBytes, size_t size);
00105 <span class="keywordtype">bool</span> write(<span class="keywordtype">void</span> <span class="keyword">const</span>* ptr, size_t size);
00106
00107 <span class="keyword">static</span> <span class="keywordtype">char</span>* errorText(<span class="keywordtype">int</span> code, <span class="keywordtype">char</span>* buf, size_t bufSize);
00108
00109 <span class="preprocessor">#if defined(NO_MMAP) || defined(REPLICATION_SUPPORT)</span>
00110 <span class="preprocessor"></span>
00111 <span class="preprocessor">#ifdef PROTECT_DATABASE</span>
00112 <span class="preprocessor"></span> <span class="keywordtype">void</span> protect(size_t pos, size_t size);
00113 <span class="keywordtype">void</span> unprotect(size_t pos, size_t size);
00114 <span class="preprocessor">#endif</span>
00115 <span class="preprocessor"></span>
00116 <span class="keywordtype">void</span> markAsDirty(size_t pos, size_t size) {
00117 size_t page = pos >> dbModMapBlockBits;
00118 size_t last = (pos + size + dbModMapBlockSize - 1) >> dbModMapBlockBits;
00119 assert(<span class="keywordtype">int</span>(last >> 5) <= pageMapSize);
00120 <span class="keywordflow">while</span> (page < last) {
00121 pageMap[page >> 5] |= 1 << (page & 31);
00122 page += 1;
00123 }
00124 }
00125
00126 <span class="keyword">private</span>:
00127 <span class="keywordtype">int</span>* pageMap;
00128 <span class="keywordtype">int</span> pageMapSize;
00129 <span class="keywordtype">int</span> pageSize;
00130
00131 <span class="preprocessor">#ifdef FUZZY_CHECKPOINT</span>
00132 <span class="preprocessor"></span> dbFileWriter* writer;
00133 <span class="keyword">public</span>:
00134 <span class="keywordtype">void</span> setCheckpointBufferSize(size_t nPages);
00135 <span class="preprocessor">#endif</span>
00136 <span class="preprocessor"></span>
00137 <span class="keyword">public</span>:
00138 <span class="keywordtype">int</span> updateCounter;
00139
00140 <span class="preprocessor">#ifdef REPLICATION_SUPPORT</span>
00141 <span class="preprocessor"></span> <span class="keywordtype">int</span>* currUpdateCount;
00142 <span class="keywordtype">int</span>* diskUpdateCount;
00143 byte* rootPage;
00144 <span class="keywordtype">bool</span> doSync;
00145 <span class="keywordtype">bool</span> closing;
00146
00147 dbReplicatedDatabase* db;
00148
00149 <span class="keywordtype">int</span> getUpdateCountTableSize();
00150 <span class="keywordtype">int</span> getMaxPages();
00151
00152 dbMutex replCS;
00153 dbMutex syncCS;
00154
00155 dbThread syncThread;
00156 dbLocalEvent syncEvent;
00157 dbLocalEvent recoveredEvent;
00158 <span class="keywordtype">int</span> nRecovered;
00159
00160 <span class="keyword">static</span> <span class="keywordtype">int</span> dbSyncTimeout; <span class="comment">// milliseconds</span>
00161
00162 <span class="preprocessor">#ifdef _WIN32</span>
00163 <span class="preprocessor"></span> HANDLE cfh;
00164 HANDLE cmh;
00165 <span class="preprocessor">#else</span>
00166 <span class="preprocessor"></span> <span class="keywordtype">int</span> cfd;
00167 <span class="preprocessor">#endif</span>
00168 <span class="preprocessor"></span>
00169 <span class="keyword">static</span> <span class="keywordtype">void</span> thread_proc startSyncToDisk(<span class="keywordtype">void</span>* arg);
00170 <span class="keyword">static</span> <span class="keywordtype">void</span> thread_proc startRecovery(<span class="keywordtype">void</span>* arg);
00171
00172
00173 <span class="keywordtype">void</span> doRecovery(<span class="keywordtype">int</span> nodeId, <span class="keywordtype">int</span>* updateCounters, <span class="keywordtype">int</span> nPages);
00174
00175 <span class="keywordtype">int</span> sendChanges(<span class="keywordtype">int</span> nodeId, <span class="keywordtype">int</span>* updateCounters, <span class="keywordtype">int</span> nPages);
00176 <span class="keywordtype">void</span> completeRecovery(<span class="keywordtype">int</span> nodeId);
00177
00178 <span class="keywordtype">void</span> syncToDisk();
00179 <span class="keywordtype">void</span> startSync();
00180 <span class="keywordtype">void</span> stopSync();
00181
00182 <span class="keyword">public</span>:
00183 <span class="keywordtype">void</span> configure(dbReplicatedDatabase* db) {
00184 this->db = db;
00185 }
00186
00187 <span class="keywordtype">bool</span> updatePages(socket_t* s, size_t pos, <span class="keywordtype">int</span> updateCount, <span class="keywordtype">int</span> size);
00188 <span class="keywordtype">bool</span> concurrentUpdatePages(socket_t* s, size_t pos, <span class="keywordtype">int</span> updateCount, <span class="keywordtype">int</span> size);
00189 <span class="keywordtype">void</span> recovery(<span class="keywordtype">int</span> nodeId, <span class="keywordtype">int</span>* updateCounters, <span class="keywordtype">int</span> nPages);
00190 <span class="preprocessor">#endif</span>
00191 <span class="preprocessor"></span>
00192
00193 <span class="preprocessor">#else</span>
00194 <span class="preprocessor"></span> <span class="keywordtype">void</span> markAsDirty(size_t, size_t) {}
00195 <span class="preprocessor">#endif</span>
00196 <span class="preprocessor"></span>
00197 <span class="keywordtype">bool</span> write(size_t pos, <span class="keywordtype">void</span> <span class="keyword">const</span>* ptr, size_t size);
00198
00199 dbFile();
00200 ~dbFile();
00201 };
00202
00203
00204 END_FASTDB_NAMESPACE
00205
00206 <span class="preprocessor">#endif</span>
00207 <span class="preprocessor"></span>
</pre></div><hr><address style="align: right;"><small>Generated on Thu Feb 14 12:42:30 2008 for FastDB by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border=0
width=110 height=53></a>1.2.18 </small></address>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -