亚洲欧美第一页_禁久久精品乱码_粉嫩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| 久久众筹精品私拍模特| 欧美丝袜自拍制服另类| 粉嫩嫩av羞羞动漫久久久| 日韩专区一卡二卡| 一区二区三区毛片| 国产精品美女久久久久久| 日韩欧美中文一区二区| 欧美无砖专区一中文字| 成人理论电影网| 热久久免费视频| 香蕉加勒比综合久久| 成人免费一区二区三区在线观看 | 色综合天天综合狠狠| 麻豆久久久久久| 亚洲国产你懂的| 亚洲精品视频在线观看网站| 久久久99久久| 久久婷婷一区二区三区| 欧美一区二区久久| 欧美精品一级二级三级| 在线日韩av片| 在线观看网站黄不卡| 99久久精品99国产精品| 成人三级在线视频| 国产精品资源网站| 国产一区激情在线| 久久 天天综合| 麻豆精品在线播放| 欧美aⅴ一区二区三区视频| 亚洲成av人片一区二区梦乃| 夜夜操天天操亚洲| 一区二区日韩av| 伊人色综合久久天天| 曰韩精品一区二区| 亚洲最色的网站| 亚洲激情网站免费观看| 亚洲美女淫视频| 一个色在线综合| 亚洲一二三专区| 亚洲一区二区三区四区在线免费观看| 综合激情网...| 亚洲综合自拍偷拍| 亚洲成av人影院| 日本午夜精品视频在线观看| 日本不卡123| 久久精品国产**网站演员| 麻豆视频观看网址久久| 国内精品伊人久久久久av一坑| 蜜桃一区二区三区在线观看| 蜜桃精品视频在线| 国产成人在线色| 成人激情动漫在线观看| 99国产欧美久久久精品| 色婷婷综合久久久中文字幕| 欧美视频中文字幕| 欧美电影影音先锋| 精品国产伦一区二区三区免费| 久久亚洲精品国产精品紫薇| 国产女人aaa级久久久级| 1000部国产精品成人观看| 一区二区激情视频| 免费观看30秒视频久久| 国产一区不卡精品| 91偷拍与自偷拍精品| 欧美日韩国产三级| 久久一区二区三区四区| 中文字幕在线观看一区二区| 亚洲午夜在线视频| 韩国在线一区二区| 色综合一区二区三区| 91精品婷婷国产综合久久| 337p日本欧洲亚洲大胆精品| 中文字幕五月欧美| 日韩电影在线观看网站| 国产v日产∨综合v精品视频| 色噜噜偷拍精品综合在线| 欧美一区二区三区爱爱| 国产女人18毛片水真多成人如厕| 亚洲精品国产无天堂网2021| 免费久久99精品国产| jizzjizzjizz欧美| 欧美疯狂做受xxxx富婆| 国产亚洲精品aa午夜观看| 亚洲成人精品在线观看| 国产精品一区二区视频| 欧美日韩综合在线免费观看| 日本中文在线一区| 国产精品一区在线| 精品污污网站免费看| 中文字幕av一区二区三区高| 性欧美疯狂xxxxbbbb| 成人免费观看av| 日韩欧美你懂的| 亚洲精品国产a久久久久久 | 欧美日韩综合在线免费观看| 久久精品日产第一区二区三区高清版 | 亚洲一区二区三区中文字幕| 国产成人亚洲精品狼色在线 | 777a∨成人精品桃花网| 国产精品欧美久久久久一区二区 | 91在线无精精品入口| 精品欧美一区二区在线观看| 亚洲亚洲人成综合网络| 成人动漫在线一区| 久久久国产午夜精品| 日韩电影免费一区| 欧美性色黄大片手机版| 欧美激情一区二区三区不卡| 另类小说欧美激情| 在线综合视频播放| 亚洲中国最大av网站| jvid福利写真一区二区三区| 26uuu久久天堂性欧美| 免费成人美女在线观看.| 91国模大尺度私拍在线视频| 最新热久久免费视频| 福利电影一区二区| 久久综合久色欧美综合狠狠| 强制捆绑调教一区二区| 777久久久精品| 色狠狠一区二区三区香蕉| 久久久精品免费网站| 精品一区二区三区视频| 日韩你懂的电影在线观看| 日韩高清不卡在线| 欧美挠脚心视频网站| 亚洲国产视频直播| 欧美日韩国产免费| 亚洲线精品一区二区三区八戒| 色久优优欧美色久优优| 亚洲综合一区二区三区| 一本到高清视频免费精品| 亚洲视频1区2区| 91黄色免费观看| 亚洲成a人片在线观看中文| 欧美日韩中文字幕一区| 亚洲成人动漫在线观看| 5566中文字幕一区二区电影| 婷婷夜色潮精品综合在线| 欧美日韩免费观看一区三区| 午夜av一区二区| 日韩欧美一级精品久久| 狠狠网亚洲精品| 亚洲国产电影在线观看| 99这里只有久久精品视频| 亚洲欧美区自拍先锋| 在线观看国产91| 午夜av区久久| 久久影院午夜片一区| 成人黄色av电影| 亚洲精品国产无套在线观| 欧美精品国产精品| 九色综合狠狠综合久久| 国产午夜精品在线观看| 99热99精品| 亚洲国产精品久久人人爱| 日韩女优毛片在线| 国产成人av一区二区三区在线观看| 中文字幕av一区二区三区免费看| 91在线视频播放地址| 亚洲成人先锋电影| 精品国产乱码久久久久久老虎 | 久久久青草青青国产亚洲免观| 国产福利电影一区二区三区| 成人欧美一区二区三区小说| 欧美在线影院一区二区| 毛片av一区二区三区| 国产精品嫩草久久久久| 欧美视频一区在线| 精品亚洲国内自在自线福利| 国产精品久久久久7777按摩| 欧美午夜精品免费| 国产综合色在线| 亚洲制服丝袜在线| 国产亚洲一二三区| 在线亚洲一区二区| 精品一区二区三区的国产在线播放 | 看电视剧不卡顿的网站| 中文字幕第一区二区| 欧美日韩国产欧美日美国产精品| 国产一区二区网址| 亚洲一区二区在线观看视频| 久久久久国产精品麻豆ai换脸| 色爱区综合激月婷婷| 国内精品写真在线观看| 亚洲高清免费视频| 国产午夜精品理论片a级大结局| 在线欧美日韩国产| 国产99一区视频免费| 日韩成人午夜精品| 亚洲黄色在线视频| 欧美国产综合一区二区| 91精品国产入口| 色综合天天天天做夜夜夜夜做| 国产一区二区91| 蜜桃视频一区二区三区在线观看|