⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file_8h-source.html

📁 最新版本!fastdb是高效的内存数据库系统
💻 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> &nbsp; <a class="qindex" href="hierarchy.html">Class Hierarchy</a> &nbsp; <a class="qindex" href="annotated.html">Compound List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </center>
<hr><h1>file.h</h1><div class="fragment"><pre>00001 <span class="comment">//-&lt; FILE.CPP &gt;------------------------------------------------------*--------*</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 &lt;&lt; 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 &lt;&lt; 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&amp; writtenBytes, size_t size);
00104     <span class="keywordtype">int</span>    read(<span class="keywordtype">void</span>* ptr, size_t&amp; 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 &gt;&gt; dbModMapBlockBits;
00118         size_t last = (pos + size + dbModMapBlockSize - 1) &gt;&gt; dbModMapBlockBits;
00119         assert(<span class="keywordtype">int</span>(last &gt;&gt; 5) &lt;= pageMapSize);
00120         <span class="keywordflow">while</span> (page &lt; last) { 
00121             pageMap[page &gt;&gt; 5] |= 1 &lt;&lt; (page &amp; 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-&gt;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 + -