📄 file.h
字号:
//-< FILE.CPP >------------------------------------------------------*--------*// FastDB Version 1.0 (c) 1999 GARRET * ? *// (Main Memory Database Management System) * /\| *// * / \ *// Created: 20-Nov-98 K.A. Knizhnik * / [] \ *// Last update: 10-Dec-98 K.A. Knizhnik * GARRET *//-------------------------------------------------------------------*--------*// System independent intrface to mapped on memory file//-------------------------------------------------------------------*--------*#ifndef __FILE_H__#define __FILE_H__#include "sync.h"#if defined(REPLICATION_SUPPORT)const int dbModMapBlockBits = 12; // 10;const int dbModMapBlockSize = 1 << dbModMapBlockBits;#elif defined(NO_MMAP)const int dbModMapBlockBits = 12;const int dbModMapBlockSize = 1 << dbModMapBlockBits;#endif#ifdef REPLICATION_SUPPORTclass dbFile;class dbReplicatedDatabase;class socket_t;struct ReplicationRequest { enum { RR_CONNECT, RR_RECOVERY, RR_GET_STATUS, RR_STATUS, RR_UPDATE_PAGE, RR_NEW_ACTIVE_NODE, RR_CLOSE, RR_READY }; byte op; byte nodeId; byte status; int size; struct { int updateCount; int offs; } page;};struct RecoveryRequest { dbFile* file; int nodeId; int nPages; int* updateCounters;};#endifclass dbFile { protected:#ifdef _WIN32 HANDLE fh; HANDLE mh;#else#ifdef USE_SYSV_SHARED_MEMORY dbSharedMemory shmem;#endif int fd;#endif char* sharedName; char* mmapAddr; size_t mmapSize; public: enum { ok = 0 }; // // Create backup file // int create(char const* name, bool noBuffering = true); // // Open database file and create file mapping object // int open(char const* fileName, char const* sharedName, bool readonly, size_t initSize, bool replicationSupport); void* getAddr() const { return mmapAddr; } size_t getSize() const { return mmapSize; } int setSize(size_t size, char const* sharedName, bool initialize = true); int flush(bool physical = false); int close(); int erase(); int write(void const* ptr, size_t& writtenBytes, size_t size); int read(void* ptr, size_t& readBytes, size_t size); bool write(void const* ptr, size_t size); static char* errorText(int code, char* buf, size_t bufSize);#if defined(NO_MMAP) || defined(REPLICATION_SUPPORT) void markAsDirty(size_t pos, size_t size) { size_t page = pos >> dbModMapBlockBits; size_t last = (pos + size + dbModMapBlockSize - 1) >> dbModMapBlockBits; assert(int(last >> 5) <= pageMapSize); while (page < last) { pageMap[page >> 5] |= 1 << (page & 31); page += 1; } } private: int* pageMap; int pageMapSize; int pageSize; public: int updateCounter;#ifdef REPLICATION_SUPPORT int* currUpdateCount; int* diskUpdateCount; byte* rootPage; bool doSync; bool closing; dbReplicatedDatabase* db; int getUpdateCountTableSize(); int getMaxPages(); dbMutex replCS; dbMutex syncCS; dbThread syncThread; dbLocalEvent syncEvent; dbLocalEvent recoveredEvent; int nRecovered; static int dbSyncTimeout; // milliseconds#ifdef _WIN32 HANDLE cfh; HANDLE cmh;#else int cfd;#endif static void thread_proc startSyncToDisk(void* arg); static void thread_proc startRecovery(void* arg); void doRecovery(int nodeId, int* updateCounters, int nPages); void syncToDisk(); void startSync(); void stopSync(); public: void configure(dbReplicatedDatabase* db) { this->db = db; } bool updatePages(socket_t* s, size_t pos, int updateCount, int size); bool concurrentUpdatePages(socket_t* s, size_t pos, int updateCount, int size); void recovery(int nodeId, int* updateCounters, int nPages);#endif#else void markAsDirty(size_t, size_t) {}#endif dbFile();};#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -