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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? hashtab.cpp

?? FastDb是高效的內(nèi)存數(shù)據(jù)庫系統(tǒng)
?? CPP
字號:
//-< HASHTAB.CPP >---------------------------------------------------*--------*
// FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *
// (Main Memory Database Management System)                          *   /\|  *
//                                                                   *  /  \  *
//                          Created:     20-Nov-98    K.A. Knizhnik  * / [] \ *
//                          Last update: 19-Dec-98    K.A. Knizhnik  * GARRET *
//-------------------------------------------------------------------*--------*
// Extensible hash table implementation
//-------------------------------------------------------------------*--------*

#define INSIDE_FASTDB

#include <ctype.h>
#include "fastdb.h"
#include "hashtab.h"

int const dbHashTable::keySize[] =
  {
    1,  // tpBool
    1,  // tpInt1
    2,  // tpInt2
    4,  // tpInt4
    8,  // tpInt8
    4,  // tpReal4
    8,  // tpReal8
    0,  // tpString,
    sizeof(oid_t), // tpReference
    -1, // tpArray,
    -1  // tpStructure,
  };

oid_t dbHashTable::allocate(dbDatabase* db, size_t nRows)
{
  size_t size = dbInitHashTableSize;

  while (size <= nRows)
  {
    size = (size+1)*2 - 1;
  }

  oid_t hashId = db->allocateObject(dbHashTableMarker);
  int nPages = (size+1) / dbIdsPerPage;
  oid_t pageId = db->allocateId(nPages);
  offs_t pos = db->allocate((size+1)*sizeof(oid_t));
  assert((pos & (dbPageSize-1)) == 0);
  memset(db->baseAddr+pos, 0, (size+1)*sizeof(oid_t));

  dbHashTable* hash = (dbHashTable*)db->get
                      (hashId);

  hash->size = size;

  hash->page = pageId;

  hash->used = 0;

  while (--nPages >= 0)
  {
    db->currIndex[pageId++] = pos + dbPageObjectMarker;
    pos += dbPageSize;
  }

  return hashId;
}


inline unsigned dbHashTable::strHashCode(byte* key, int keylen)
{
  unsigned h;
#ifdef IGNORE_CASE

  for (h = 0; --keylen >= 0;)
  {
    int code = *key++;
    h = h*31 + toupper(code);
  }

#else
  for (h = 0; --keylen >= 0; h = h*31 + *key++)

    ;
#endif

  return h;
}

inline unsigned dbHashTable::hashCode(byte* key, int keylen)
{
  unsigned h;

  for (h = 0; --keylen >= 0; h = h*31 + *key++)

    ;
  return h;
}

void dbHashTable::insert(dbDatabase* db, oid_t hashId,
                         oid_t rowId, int type, int sizeofType, int offs, size_t nRows)
{

  dbHashTable* hash = (dbHashTable*)db->get
                      (hashId);

  byte* record = db->get
                 (rowId);

  byte* key = record + offs;

  unsigned hashkey;

  if (type == dbField::tpString)
  {
    int len = ((dbVarying*)key)->size - 1;
    key = record + ((dbVarying*)key)->offs;
    hashkey = strHashCode(key, len);
  }
  else
  {
    hashkey = hashCode(key, sizeofType);
  }

  size_t size = hash->size;
  oid_t pageId = hash->page;

  if (size < nRows && hash->used*2/3 > size)
  {
    int nPages = (size+1) / dbIdsPerPage;
    size = (size+1)*2-1;
    oid_t newPageId = db->allocateId((size+1) / dbIdsPerPage);
    offs_t pos = db->allocate((size+1)*sizeof(oid_t));
    assert((pos & (dbPageSize-1)) == 0);
    memset(db->baseAddr + pos, 0, (size+1)*sizeof(oid_t));
    hash = (dbHashTable*)db->put(hashId);
    hash->size = size;
    hash->page = newPageId;
    size_t used = 0;

    while (--nPages >= 0)
    {
      for (size_t i = 0; i < dbIdsPerPage; i++)
      {

        oid_t itemId = ((oid_t*)db->get
                        (pageId))[i];

        while (itemId != 0)
        {

          dbHashTableItem* item = (dbHashTableItem*)db->get
                                  (itemId);

          oid_t nextId = item->next;

          unsigned h = item->hash % size;

          oid_t* tab = (oid_t*)(db->baseAddr + pos);

          if (item->next != tab[h])
          {
            item = (dbHashTableItem*)db->put(itemId);
            tab = (oid_t*)(db->baseAddr + pos);
            item->next = tab[h];
          }

          if (tab[h] == 0)
          {
            used += 1;
          }

          tab[h] = itemId;
          itemId = nextId;
        }
      }

      db->freeObject(pageId++);
    }

    ((dbHashTable*)db->get
     (hashId))->used = used;

    pageId = newPageId;

    for (nPages = (size+1)/dbIdsPerPage; --nPages >= 0; pos += dbPageSize)
    {
      db->currIndex[newPageId++] = pos + dbPageObjectMarker;
    }
  }

  oid_t itemId = db->allocateObject(dbHashTableItemMarker);
  unsigned h = hashkey % size;
  oid_t* ptr = (oid_t*)db->put(pageId + h/dbIdsPerPage) + h%dbIdsPerPage;

  dbHashTableItem* item = (dbHashTableItem*)db->get
                          (itemId);

  item->record = rowId;

  item->hash = hashkey;

  item->next = *ptr;

  *ptr = itemId;

  if (item->next == 0)
  {

    ((dbHashTable*)db->get
     (hashId))->used += 1;

    db->file.markAsDirty(db->currIndex[hashId] & ~dbInternalObjectMarker, sizeof(dbHashTable));

    ((dbHashTable*)db->put(hashId))->used += 1;
  }
}


void dbHashTable::remove
  (dbDatabase* db, oid_t hashId,
   oid_t rowId, int type, int sizeofType, int offs)
{

  dbHashTable* hash = (dbHashTable*)db->get
                      (hashId);

  byte* record = (byte*)db->getRow(rowId);

  byte* key = record + offs;

  unsigned hashkey;

  if (type == dbField::tpString)
  {
    int len = ((dbVarying*)key)->size - 1;
    key = record + ((dbVarying*)key)->offs;
    hashkey = strHashCode(key, len);
  }
  else
  {
    hashkey = hashCode(key, sizeofType);
  }

  unsigned h = hashkey % hash->size;
  oid_t pageId = hash->page + h / dbIdsPerPage;
  int i = h % dbIdsPerPage;

  oid_t itemId = ((oid_t*)db->get
                  (pageId))[i];

  oid_t prevItemId = 0;

  while (true)
  {
    assert(itemId != 0);

    dbHashTableItem* item = (dbHashTableItem*)db->get
                            (itemId);

    if (item->record == rowId)
    {
      oid_t next = item->next;

      if (prevItemId == 0)
      {
        if (next == 0)
        {
          hash->used -= 1; // consistency can be violated
          db->file.markAsDirty(db->currIndex[hashId] & ~dbInternalObjectMarker,
                               sizeof(dbHashTable));
        }

        *((oid_t*)db->put(pageId) + i) = next;
      }
      else
      {
        item = (dbHashTableItem*)db->put(prevItemId);
        item->next = next;
      }

      db->freeObject(itemId);
      return;
    }

    prevItemId = itemId;
    itemId = item->next;
  }
}

void dbHashTable::find(dbDatabase* db, oid_t hashId, dbSearchContext& sc)
{

  dbHashTable* hash = (dbHashTable*)db->get
                      (hashId);

  unsigned hashkey;

  unsigned keylen;

  if (hash->size == 0)
  {
    return;
  }

  if (sc.type == dbField::tpString)
  {
    keylen = strlen(sc.firstKey);
    hashkey = strHashCode((byte*)sc.firstKey, keylen);
  }
  else
  {
    keylen = sc.sizeofType;
    hashkey = hashCode((byte*)sc.firstKey, keylen);
  }

  unsigned h = hashkey % hash->size;
  oid_t itemId =

    ((oid_t*)db->get
     (hash->page + h/dbIdsPerPage))[h % dbIdsPerPage];

  dbTable* table = (dbTable*)db->getRow(sc.cursor->table->tableId);

  while (itemId != 0)
  {

    dbHashTableItem* item = (dbHashTableItem*)db->get
                            (itemId);

    sc.probes += 1;

    if (item->hash == hashkey)
    {
      byte* rec = (byte*)db->getRow(item->record);

      if ((sc.type == dbField::tpString
           && keylen == ((dbVarying*)(rec + sc.offs))->size - 1
#ifdef IGNORE_CASE
           && stricmp(sc.firstKey,
                      (char*)rec+((dbVarying*)(rec+sc.offs))->offs) == 0)
#else
           && memcmp(sc.firstKey, rec+((dbVarying*)(rec+sc.offs))->offs,
                     keylen) == 0)
#endif

          || (sc.type != dbField::tpString
              && sc.comparator(sc.firstKey, rec + sc.offs, keylen) == 0))
      {
        if (!sc.condition
            || db->evaluate(sc.condition, item->record, table, sc.cursor))
        {
          if (!sc.cursor->add
              (item->record))
          {
            return;
          }
        }
      }
    }

    itemId = item->next;
  }
}



void dbHashTable::purge(dbDatabase* db, oid_t hashId)
{
  dbHashTable* hash = (dbHashTable*)db->put(hashId);
  oid_t pageId = hash->page;
  int nPages = (hash->size+1) / dbIdsPerPage;
  hash->used = 0;

  while (--nPages >= 0)
  {
    for (size_t i = 0; i < dbIdsPerPage; i++)
    {

      oid_t itemId = ((oid_t*)db->get
                      (pageId))[i];

      while (itemId != 0)
      {

        oid_t nextId = ((dbHashTableItem*)db->get
                        (itemId))->next;

        db->freeObject(itemId);

        itemId = nextId;
      }
    }

    memset(db->put(pageId++), 0, dbPageSize);
  }
}

void dbHashTable::drop(dbDatabase* db, oid_t hashId)
{

  dbHashTable* hash = (dbHashTable*)db->get
                      (hashId);

  oid_t pageId = hash->page;

  int nPages = (hash->size+1) / dbIdsPerPage;

  while (--nPages >= 0)
  {
    for (size_t i = 0; i < dbIdsPerPage; i++)
    {

      oid_t itemId = ((oid_t*)db->get
                      (pageId))[i];

      while (itemId != 0)
      {

        oid_t nextId = ((dbHashTableItem*)db->get
                        (itemId))->next;

        db->freeObject(itemId);

        itemId = nextId;
      }
    }

    db->freeObject(pageId++);
  }

  db->freeObject(hashId);
}







?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
香蕉久久一区二区不卡无毒影院| 2021中文字幕一区亚洲| 国产**成人网毛片九色| 国产·精品毛片| 欧美日韩一级大片网址| 日韩一区二区免费在线电影| 久久综合久久综合九色| 尤物av一区二区| 欧美一区二区三区免费观看视频| 欧美激情一区二区三区在线| 色哟哟亚洲精品| 日韩中文字幕亚洲一区二区va在线| 日韩一区二区不卡| 激情文学综合网| 亚洲欧美日韩国产成人精品影院| 欧美日韩mp4| 国产精品一级在线| 亚洲bt欧美bt精品| 中文字幕精品综合| 4438x成人网最大色成网站| 国内成人免费视频| 亚洲高清不卡在线| 国产精品欧美极品| 日韩一区二区三区电影在线观看| 成年人网站91| 麻豆专区一区二区三区四区五区| 亚洲精品视频免费看| 久久久久久夜精品精品免费| 欧美日韩日日夜夜| 欧洲精品在线观看| 粉嫩av一区二区三区在线播放 | 亚洲欧美另类久久久精品2019| 欧美日韩国产小视频在线观看| www.日韩在线| 麻豆成人av在线| 午夜激情久久久| 亚洲精品视频免费观看| 国产精品丝袜在线| 欧美人体做爰大胆视频| 99久久精品国产观看| 国产福利精品导航| 日本女优在线视频一区二区| 尤物av一区二区| 中文字幕亚洲一区二区va在线| 欧美成人video| 欧美一区二区视频观看视频| 欧美在线影院一区二区| 成人免费黄色在线| 东方aⅴ免费观看久久av| 国内外成人在线| 三级欧美在线一区| 亚洲在线视频网站| 69堂国产成人免费视频| 久久国产剧场电影| 国产综合色在线视频区| 亚洲欧美激情视频在线观看一区二区三区 | 欧美日韩中文另类| 久久精品国产久精国产| 日韩精彩视频在线观看| 亚洲成人精品影院| 国产一区不卡视频| 成人app在线观看| 97精品国产97久久久久久久久久久久| 成人午夜大片免费观看| 97久久久精品综合88久久| 色妹子一区二区| 欧美日本在线播放| 欧美xfplay| 国产精品电影一区二区| 亚洲一区二区不卡免费| 日韩精品乱码免费| 国产91丝袜在线播放0| 色综合久久中文字幕综合网| 欧美主播一区二区三区| 精品久久久久久综合日本欧美| 久久久久久97三级| 亚洲精品一二三| 久久国产精品色| 成人av资源网站| 欧美一区日韩一区| 国产免费成人在线视频| 亚洲第一会所有码转帖| 老司机精品视频导航| 99久久精品免费观看| 欧美三级日韩三级| 久久精品视频一区二区| 一区二区三区不卡视频在线观看| 日韩1区2区日韩1区2区| 懂色av一区二区三区蜜臀| 欧美人伦禁忌dvd放荡欲情| 国产亚洲一区字幕| 午夜欧美在线一二页| 国产激情一区二区三区四区| 欧美午夜在线观看| 欧美国产精品专区| 日产欧产美韩系列久久99| 99久久精品国产一区二区三区| 欧美一级日韩免费不卡| 亚洲乱码中文字幕| 国产精品香蕉一区二区三区| 91精品欧美久久久久久动漫 | 色视频一区二区| 久久精品无码一区二区三区| 亚洲成人动漫精品| 99视频一区二区| 精品国产一区二区三区久久久蜜月| 一区二区三区免费在线观看| 成人免费观看av| 国产午夜精品一区二区三区视频 | 99国产精品视频免费观看| 欧美一级生活片| 亚洲一区国产视频| 成人福利视频网站| 久久综合九色综合97_久久久| 偷拍一区二区三区| 色综合久久综合中文综合网| 国产精品久久久久婷婷| 精品一区二区在线视频| 久久综合九色综合欧美亚洲| 国产一区二区三区| 日韩视频免费观看高清完整版在线观看 | 一区二区不卡在线播放| 国产精品1024久久| 久久久久久久久久久久久女国产乱| 色婷婷精品久久二区二区蜜臀av| 日本一区二区三区国色天香 | 欧美日韩精品免费| 亚洲欧美日韩一区二区| 成人激情文学综合网| 国产亚洲精久久久久久| 美腿丝袜在线亚洲一区 | 日韩女优制服丝袜电影| 午夜精品福利久久久| 欧美自拍丝袜亚洲| 亚洲在线观看免费视频| 欧美三级中文字| 亚洲综合在线视频| 欧洲一区二区三区在线| 亚洲精品视频免费观看| 欧美午夜在线一二页| 亚洲h动漫在线| 欧美一区二区三区白人| 日韩av在线免费观看不卡| 欧美乱妇15p| 青青青伊人色综合久久| 日韩欧美黄色影院| 玖玖九九国产精品| 久久久久久久免费视频了| 成人深夜在线观看| 中文字幕日本不卡| 欧洲国内综合视频| 日本特黄久久久高潮| 精品国产免费一区二区三区四区| 激情欧美日韩一区二区| 国产欧美中文在线| 99久久伊人网影院| 亚洲国产日产av| 精品国一区二区三区| 从欧美一区二区三区| 国产精品人妖ts系列视频| 在线视频国内自拍亚洲视频| 五月天激情综合| 26uuu亚洲综合色| 成人蜜臀av电影| 亚洲一区二区在线免费观看视频| 538在线一区二区精品国产| 国产乱人伦偷精品视频免下载| 欧美激情一区二区三区在线| 色噜噜久久综合| 美女免费视频一区| 国产精品欧美久久久久无广告 | 国产午夜精品久久久久久免费视 | 欧美成人在线直播| 久久久综合精品| 精品对白一区国产伦| 日韩一区精品字幕| 欧美日韩视频专区在线播放| 波多野结衣在线一区| 色婷婷av久久久久久久| 欧美在线一区二区三区| 欧美日韩一级黄| 日韩一级完整毛片| 日本一二三不卡| 国产精品久久毛片av大全日韩| 国产精品电影一区二区三区| 中文字幕在线免费不卡| 亚洲综合色噜噜狠狠| 日韩福利视频导航| 日韩电影一区二区三区四区| 久久九九99视频| 欧美日韩不卡一区| av毛片久久久久**hd| 免费的成人av| 一区二区三区美女视频| 久久美女高清视频| 9191久久久久久久久久久| 99精品欧美一区| 国产精品一区二区视频| 日韩和欧美的一区| 亚洲日本成人在线观看|