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

📄 file.h

📁 用于嵌入式环境的数据库
💻 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_SUPPORT

class 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;
};
#endif


class 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 + -