亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? file.cpp

?? FastDb是高效的內存數據庫系統
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
//-< 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 dependent implementation of mapped on memory file
//-------------------------------------------------------------------*--------*

#define INSIDE_FASTDB

#include "stdtp.h"
#include "file.h"


dbFile::dbFile()
{
  sharedName = NULL;
  mmapAddr = NULL;
  mmapSize = 0;

#ifdef REPLICATION_SUPPORT

  currUpdateCount = NULL;
  diskUpdateCount = NULL;
  rootPage = NULL;
  db = NULL;
#endif
}

#if defined(REPLICATION_SUPPORT) || defined(NO_MMAP)
const int dbMaxSyncSegmentSize = 128*1024 / dbModMapBlockSize;
#endif

#ifdef REPLICATION_SUPPORT

#include "database.h"

int dbFile::dbSyncTimeout = 1000; // one second

bool dbFile::updatePages(socket_t* s, size_t pos, int pageUpdateCounter, int size)
{
  if (pos + size > mmapSize)
  {
    size_t newSize = pos + size > mmapSize*2 ? pos + size : mmapSize*2;
    setSize(newSize, sharedName);
  }

  if (s->read(mmapAddr + pos, size))
  {
    int pageNo = pos >> dbModMapBlockBits;

    if (updateCounter < pageUpdateCounter)
    {
      updateCounter = pageUpdateCounter;
    }

    while (size > 0)
    {
      currUpdateCount[pageNo++] = pageUpdateCounter;
      size -= dbModMapBlockSize;
    }

    return true;
  }

  return false;
}

bool dbFile::concurrentUpdatePages(socket_t* s, size_t pos, int pageUpdateCounter, int size)
{
  if (pos + size > mmapSize)
  {
    size_t newSize = pos + size > mmapSize*2 ? pos + size : mmapSize*2;
    db->beginTransaction(dbDatabase::dbCommitLock);
    setSize(newSize, sharedName);
    ((dbHeader*)mmapAddr)->size = newSize;
    db->version = db->monitor->version += 1;
  }

  if (pos == 0 && size <= pageSize)
  {
    if (!s->read(rootPage, size))
    {
      return false;
    }

    if (((dbHeader*)rootPage)->curr != ((dbHeader*)mmapAddr)->curr)
    {
      db->beginTransaction(dbDatabase::dbCommitLock);
      memcpy(mmapAddr, rootPage, size);
      // now readers will see updated data
      db->monitor->curr ^= 1;
      db->endTransaction();
    }
    else
    {
      memcpy(mmapAddr, rootPage, size);
    }
  }
  else
  {
    if (!s->read(mmapAddr + pos, size))
    {
      return false;
    }
  }

  int pageNo = pos >> dbModMapBlockBits;

  if (updateCounter < pageUpdateCounter)
  {
    updateCounter = pageUpdateCounter;
  }

  while (size > 0)
  {
    currUpdateCount[pageNo++] = pageUpdateCounter;
    size -= dbModMapBlockSize;
  }

  return true;
}

int dbFile::getUpdateCountTableSize()
{
  int nPages = mmapSize >> dbModMapBlockBits;

  while (--nPages >= 0 && diskUpdateCount[nPages] == 0)

    ;
  return nPages + 1;
}

int dbFile::getMaxPages()
{
  return 1 << (dbDatabaseOffsetBits - dbModMapBlockBits);
}


void dbFile::startSync()
{
#ifndef DISKLESS_CONFIGURATION
  doSync = true;
  closing = false;
  syncEvent.reset();
  syncThread.create(startSyncToDisk, this);
#endif
}

void dbFile::stopSync()
{
#ifndef DISKLESS_CONFIGURATION
  doSync = false;
  syncEvent.signal();
  syncThread.join();
#endif
}

void thread_proc dbFile::startSyncToDisk(void* arg)
{
  ((dbFile*)arg)->syncToDisk();
}

void thread_proc dbFile::startRecovery(void* arg)
{
  RecoveryRequest* rr = (RecoveryRequest*)arg;
  rr->file->doRecovery(rr->nodeId, rr->updateCounters, rr->nPages);
  {
    dbCriticalSection cs(rr->file->replCS);

    if (--rr->file->nRecovered == 0)
    {
      rr->file->recoveredEvent.signal();
    }
  }

  delete rr;
}

void dbFile::recovery(int nodeId, int* updateCounters, int nPages)
{
  RecoveryRequest* rr = new RecoveryRequest;
  rr->nodeId = nodeId;
  rr->updateCounters = updateCounters;
  rr->nPages = nPages;
  rr->file = this;
  {
    dbCriticalSection cs(replCS);

    if (nRecovered++ == 0)
    {
      recoveredEvent.reset();
    }
  }

  dbThread recoveryThread;
  recoveryThread.create(startRecovery, rr);
  recoveryThread.setPriority(dbThread::THR_PRI_HIGH);
}

void dbFile::doRecovery(int nodeId, int* updateCounters, int nPages)
{
  ReplicationRequest rr;
  memset(updateCounters+nPages, 0, (getMaxPages() - nPages)*sizeof(int));
  int i, j, n;

  if (db->con[nodeId].reqSock == NULL)
  {
    char buf[256];
    socket_t* s = socket_t::connect(db->serverURL[nodeId],
                                    socket_t::sock_global_domain,
                                    dbReplicatedDatabase::dbRecoveryConnectionAttempts);

    if (!s->is_ok())
    {
      s->get_error_text(buf, sizeof buf);
      dbTrace("Failed to establish connection with node %d: %s\n",
              nodeId, buf);
      delete s;
      return;
    }

    rr.op = ReplicationRequest::RR_GET_STATUS;
    rr.nodeId = db->id;

    if (!s->write(&rr, sizeof rr) || !s->read(&rr, sizeof rr))
    {
      s->get_error_text(buf, sizeof buf);
      dbTrace("Connection with node %d is broken: %s\n",
              nodeId, buf);
      delete s;
      return;
    }

    if (rr.op != ReplicationRequest::RR_STATUS && rr.status != dbReplicatedDatabase::ST_STANDBY)
    {
      dbTrace("Unexpected response from standby node %d: code %d status %d\n",
              nodeId, rr.op, rr.status);
      delete s;
      return;
    }
    else
    {
      db->addConnection(nodeId, s);
    }
  }

  while (true)
  {
    int maxUpdateCount = 0;
    {
      dbCriticalSection cs(syncCS);

      for (i = 0, j = 0, n = mmapSize >> dbModMapBlockBits; i < n; i++)
      {
        if (updateCounters[i] > currUpdateCount[i])
        {
          updateCounters[i] = 0;
        }
        else
        {
          if (updateCounters[i] > maxUpdateCount)
          {
            maxUpdateCount = updateCounters[i];
          }
        }

        if (i > j && (currUpdateCount[i] <= updateCounters[i] || i-j >= dbMaxSyncSegmentSize
                      || currUpdateCount[i] != currUpdateCount[j]))
        {
          rr.op = ReplicationRequest::RR_UPDATE_PAGE;
          rr.nodeId = nodeId;
          rr.size = (i-j)*dbModMapBlockSize;
          rr.page.offs = (size_t)j << dbModMapBlockBits;
          rr.page.updateCount = currUpdateCount[j];

          if (!db->writeReq(nodeId, rr, mmapAddr + rr.page.offs, rr.size))
          {
            delete[] updateCounters;
            return;
          }

          j = i;
        }

        if (currUpdateCount[i] > updateCounters[i])
        {
          if (currUpdateCount[i] > maxUpdateCount)
          {
            maxUpdateCount = currUpdateCount[i];
          }

          updateCounters[i] = currUpdateCount[i];
        }
        else
        {
          j = i + 1;
        }
      }

      if (i != j)
      {
        rr.op = ReplicationRequest::RR_UPDATE_PAGE;
        rr.nodeId = nodeId;
        rr.size = (i-j)*dbModMapBlockSize;
        rr.page.offs = (size_t)j << dbModMapBlockBits;
        rr.page.updateCount = currUpdateCount[j];

        if (!db->writeReq(nodeId, rr, mmapAddr + rr.page.offs, rr.size))
        {
          delete[] updateCounters;
          return;
        }
      }
    }

    {
      dbCriticalSection cs(replCS);

      if (maxUpdateCount == updateCounter)
      {
        dbTrace("Complete recovery of node %d\n", nodeId);
        delete[] updateCounters;
        rr.op = ReplicationRequest::RR_STATUS;
        rr.nodeId = nodeId;
        db->con[nodeId].status = rr.status = dbReplicatedDatabase::ST_STANDBY;

        for (i = 0, n = db->nServers; i < n; i++)
        {
          if (db->con[i].status != dbReplicatedDatabase::ST_OFFLINE && i != db->id)
          {
            db->writeReq(i, rr);
          }
        }

        return;
      }
    }
  }
}


#endif

bool dbFile::write(void const* buf, size_t size)
{
  size_t writtenBytes;
  bool result = write(buf, writtenBytes, size) == ok && writtenBytes == size;
  assert(result);
  return result;
}

#ifdef _WIN32

class OS_info : public OSVERSIONINFO
{

public:
  OS_info()
  {
    dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx(this);
  }
};

static OS_info osinfo;

#define BAD_POS 0xFFFFFFFF // returned by SetFilePointer and GetFileSize


int dbFile::erase()
{
  return ok;
}

int dbFile::open(char const* fileName, char const* sharedName, bool readonly,
                 size_t initSize, bool replicationSupport)
{
  int status;
  size_t fileSize;
#ifndef DISKLESS_CONFIGURATION

  fh = CreateFile(fileName, readonly ? GENERIC_READ : (GENERIC_READ|GENERIC_WRITE),
                  FILE_SHARE_READ | FILE_SHARE_WRITE, FASTDB_SECURITY_ATTRIBUTES,
                  readonly ? OPEN_EXISTING : OPEN_ALWAYS,
                  FILE_FLAG_RANDOM_ACCESS
#ifdef NO_MMAP
                  |FILE_FLAG_NO_BUFFERING
#endif
#if 0 // not needed as we do explicit flush ???
                  |FILE_FLAG_WRITE_THROUGH
#endif
                  , NULL);

  if (fh == INVALID_HANDLE_VALUE)
  {
    return GetLastError();
  }

  DWORD highSize;
  fileSize = GetFileSize(fh, &highSize);

  if (fileSize == BAD_POS && (status = GetLastError()) != ok)
  {
    CloseHandle(fh);
    return status;
  }

  assert(highSize == 0);

  mmapSize = fileSize;

  this->sharedName = new char[strlen(sharedName) + 1];
  strcpy(this->sharedName, sharedName);

  if (!readonly && fileSize == 0)
  {
    mmapSize = initSize;
  }

#else
  fh = INVALID_HANDLE_VALUE;

  this->sharedName = NULL;

  mmapSize = fileSize = initSize;

#endif
#if defined(NO_MMAP)

  if (fileSize < mmapSize && !readonly)
  {
    if (SetFilePointer(fh, mmapSize, NULL, FILE_BEGIN) != mmapSize || !SetEndOfFile(fh))
    {
      status = GetLastError();
      CloseHandle(fh);
      return status;
    }
  }

  mmapAddr = (char*)VirtualAlloc(NULL, mmapSize, MEM_COMMIT|MEM_RESERVE,
                                 PAGE_READWRITE);

#ifdef DISKLESS_CONFIGURATION

  if (mmapAddr == NULL)
#else

  DWORD readBytes;

  if (mmapAddr == NULL
      || !ReadFile(fh, mmapAddr, fileSize, &readBytes, NULL) || readBytes != fileSize)
#endif

  {
    status = GetLastError();

    if (fh != INVALID_HANDLE_VALUE)
    {
      CloseHandle(fh);
    }

    return status;
  }

  memset(mmapAddr+fileSize, 0, mmapSize - fileSize);
  mh = NULL;
#else

  mh = CreateFileMapping(fh, FASTDB_SECURITY_ATTRIBUTES, readonly ? PAGE_READONLY : PAGE_READWRITE,
                         0, mmapSize, sharedName);
  status = GetLastError();

  if (mh == NULL)
  {
    if (fh != INVALID_HANDLE_VALUE)
    {
      CloseHandle(fh);
    }

    return status;
  }

  mmapAddr = (char*)MapViewOfFile(mh, readonly
                                  ? FILE_MAP_READ : FILE_MAP_ALL_ACCESS,
                                  0, 0, 0);

  if (mmapAddr == NULL)
  {
    status = GetLastError();
    CloseHandle(mh);

    if (fh != INVALID_HANDLE_VALUE)
    {
      CloseHandle(fh);
    }

    return status;
  }

  if (status != ERROR_ALREADY_EXISTS && mmapSize > fileSize)
    // && osinfo.dwPlatformId != VER_PLATFORM_WIN32_NT)
  {
    // Windows 95 doesn't initialize pages
    memset(mmapAddr+fileSize, 0, mmapSize - fileSize);
  }
#endif

#if defined(NO_MMAP) || defined(REPLICATION_SUPPORT)
  SYSTEM_INFO systemInfo;

  GetSystemInfo(&systemInfo);

  pageSize = systemInfo.dwPageSize;

  pageMapSize = (mmapSize + dbModMapBlockSize*32 - 1) >> (dbModMapBlockBits + 5);

  pageMap = new int[pageMapSize];

  memset(pageMap, 0, pageMapSize*sizeof(int));

#endif

#if defined(REPLICATION_SUPPORT)

  db = NULL;

  int nPages = getMaxPages();

  currUpdateCount = new int[nPages];

  if (replicationSupport)
  {
    char* cFileName = new char[strlen(fileName) + 5];
    strcat(strcpy(cFileName, fileName), ".cnt");

#ifdef DISKLESS_CONFIGURATION

    cfh = INVALID_HANDLE_VALUE;
#else

    cfh = CreateFile(cFileName, GENERIC_READ|GENERIC_WRITE,
                     0, NULL, OPEN_ALWAYS,
                     FILE_FLAG_RANDOM_ACCESS|FILE_FLAG_WRITE_THROUGH,
                     NULL);
    delete[] cFileName;

    if (cfh == INVALID_HANDLE_VALUE)
    {
      status = errno;
      return status;
    }

#endif
    cmh = CreateFileMapping(cfh, NULL, PAGE_READWRITE, 0,
                            nPages*sizeof(int), NULL);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
av一二三不卡影片| 91福利在线看| 亚洲精品中文字幕乱码三区| 69堂精品视频| 色婷婷av一区| 国产亚洲欧美在线| 成人av免费在线| 狠狠色丁香婷综合久久| 五月激情综合色| 亚洲欧洲一区二区在线播放| 精品日产卡一卡二卡麻豆| 色8久久精品久久久久久蜜| 国产成人综合自拍| 久久精品国产一区二区三| 一区二区三区在线观看欧美| 日本一区二区高清| 久久一日本道色综合| 日韩女优av电影在线观看| 欧美老肥妇做.爰bbww视频| 在线看日韩精品电影| 99国产精品一区| 国产99久久久精品| 国产一区二区三区黄视频| 美国三级日本三级久久99| 婷婷开心久久网| 亚洲一二三专区| 亚洲自拍偷拍麻豆| 一区二区三区精密机械公司| 亚洲日本免费电影| 亚洲色图视频网| 中文字幕一区三区| 国产精品国产精品国产专区不片 | av在线不卡网| 国产成人综合在线观看| 国产99精品视频| 国产精品一区二区男女羞羞无遮挡| 美女视频免费一区| 亚洲蜜臀av乱码久久精品蜜桃| 精品亚洲国产成人av制服丝袜| 图片区小说区国产精品视频| 丝袜亚洲另类欧美| 婷婷久久综合九色综合伊人色| 视频一区视频二区中文字幕| 日韩精品电影在线观看| 日本视频中文字幕一区二区三区| 26uuu亚洲婷婷狠狠天堂| 色综合久久中文综合久久97| 国产精品88av| 久久99深爱久久99精品| 亚洲成人av中文| 中文在线一区二区| 国产欧美一区二区精品久导航 | 亚洲与欧洲av电影| 久久精品视频网| 精品对白一区国产伦| 91麻豆精品91久久久久同性| 国产成人免费网站| 国产在线乱码一区二区三区| 捆绑变态av一区二区三区| 精品一区二区影视| 99re这里都是精品| 欧美日韩成人在线| 91精品国产综合久久久久久| 成人涩涩免费视频| 日本道精品一区二区三区| 精品国产一区二区三区不卡| 日本一区二区久久| 亚洲欧美一区二区三区孕妇| 亚洲黄色性网站| 麻豆成人在线观看| 成人sese在线| 欧美在线播放高清精品| 欧美成人女星排名| 亚洲三级在线免费观看| 喷水一区二区三区| 成人av在线观| 欧美午夜精品免费| 欧美日韩aaa| 精品入口麻豆88视频| 精品国产乱码久久久久久蜜臀 | 七七婷婷婷婷精品国产| 亚洲成人资源网| 狂野欧美性猛交blacked| 午夜激情一区二区| 日韩成人精品在线观看| 精品欧美一区二区久久| 久久久一区二区三区| 久久免费看少妇高潮| 亚洲最大成人网4388xx| 国产一区二区三区四区在线观看 | 不卡视频在线看| 欧美二区三区91| 亚洲日本电影在线| 韩日欧美一区二区三区| 欧美伊人久久久久久久久影院| 亚洲高清三级视频| 国产一区二区久久| 欧美二区三区的天堂| 成人欧美一区二区三区在线播放| 久久99久国产精品黄毛片色诱| 欧美影院精品一区| 国产精品入口麻豆九色| 久久er99精品| 欧美顶级少妇做爰| 亚洲综合图片区| 99在线热播精品免费| 精品91自产拍在线观看一区| 亚洲www啪成人一区二区麻豆| 亚洲精品日韩综合观看成人91| 久久久蜜桃精品| 亚洲一区自拍偷拍| 99视频热这里只有精品免费| 精品久久久久久最新网址| 亚洲国产成人av网| 一本大道av一区二区在线播放| 国产亚洲欧美激情| 韩国v欧美v亚洲v日本v| 日韩一区二区三区在线观看| 天天综合网 天天综合色| 色综合视频一区二区三区高清| 欧美激情资源网| 国内精品久久久久影院薰衣草| 欧美电影精品一区二区| 蜜桃av一区二区三区| 欧美日韩免费高清一区色橹橹 | 日韩国产精品久久久久久亚洲| 欧美最新大片在线看| 亚洲欧美另类久久久精品2019| 成人天堂资源www在线| 久久久www免费人成精品| 国精产品一区一区三区mba视频| 日韩欧美色电影| 久久99热99| 久久夜色精品国产噜噜av| 精品一二三四在线| 精品播放一区二区| 国产精品一区二区免费不卡| 国产欧美一区二区三区鸳鸯浴 | 波多野结衣亚洲| 中文乱码免费一区二区| 成人免费精品视频| 椎名由奈av一区二区三区| 99国产精品久| 亚洲综合视频网| 欧美年轻男男videosbes| 日韩av一级片| 26uuu另类欧美| 国产69精品一区二区亚洲孕妇| 欧美高清一级片在线观看| 99国产精品久久久久久久久久久 | 日本最新不卡在线| 欧美tickle裸体挠脚心vk| 国内精品国产成人国产三级粉色 | 97se亚洲国产综合自在线| 亚洲精品国久久99热| 欧美日韩国产在线观看| 美日韩一区二区| 欧美激情一二三区| 欧美在线观看视频一区二区三区| 婷婷综合另类小说色区| 精品精品国产高清a毛片牛牛| 国产一区二区精品久久91| 日韩一区在线免费观看| 欧美日韩亚洲丝袜制服| 国产一二精品视频| 亚洲精品国产精品乱码不99 | 精品影视av免费| 久久久一区二区三区捆绑**| 国产成人精品网址| 一区二区三区在线免费观看| 69堂成人精品免费视频| 丁香五精品蜜臀久久久久99网站| 一区二区三区在线视频免费| 欧美精品一级二级| 国产成人在线网站| 亚洲午夜视频在线| 久久久久久99精品| 色94色欧美sute亚洲线路一久 | 中文一区二区在线观看| 欧美色图第一页| 国产a区久久久| 午夜精品福利在线| 国产精品久久久久久久久快鸭 | 亚洲欧美日韩人成在线播放| 欧美一区二区三区的| 99视频在线观看一区三区| 日韩av午夜在线观看| 国产精品素人一区二区| 欧美日本视频在线| 不卡的av在线| 青娱乐精品视频在线| 亚洲男人天堂一区| 中文字幕av一区二区三区免费看| 欧美日韩美女一区二区| 99久久久国产精品免费蜜臀| 激情文学综合丁香| 天堂资源在线中文精品| 亚洲欧洲av另类| 国产三级精品三级| 欧美不卡一区二区三区|