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

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

?? class.cpp

?? FastDb是高效的內存數據庫系統
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
//-< CLASS.CPP >-----------------------------------------------------*--------*
// FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *
// (Main Memory Database Management System)                          *   /\|  *
//                                                                   *  /  \  *
//                          Created:     20-Nov-98    K.A. Knizhnik  * / [] \ *
//                          Last update:  1-Jan-99    K.A. Knizhnik  * GARRET *
//-------------------------------------------------------------------*--------*
// Metaclass information
//-------------------------------------------------------------------*--------*

#define INSIDE_FASTDB

#include "fastdb.h"
#include "compiler.h"
#include "symtab.h"

#ifndef CHECK_RECORD_SIZE
#define CHECK_RECORD_SIZE 1
#endif

dbTableDescriptor* dbTableDescriptor::chain;

void* dbFieldDescriptor::operator new(size_t size EXTRA_DEBUG_NEW_PARAMS)
{
  return dbMalloc(size);
}

void  dbFieldDescriptor::operator delete(void* p EXTRA_DEBUG_NEW_PARAMS)
{
  dbFree(p);
}

dbFieldDescriptor::dbFieldDescriptor(char* name)
{
  next = prev = this;
  this->name = name;
  longName = NULL;

  dbSymbolTable::add
    (this->name, tkn_ident, FASTDB_CLONE_ANY_IDENTIFIER);

  appOffs = dbsOffs = 0;

  defTable = refTable = NULL;

  refTableName = NULL;

  components = NULL;

  inverseRefName = NULL;

  indexType = 0;

  method = NULL;

  attr = OneToOneMapping;

  tTree = 0;

  hashTable = 0;

  comparator = (dbUDTComparator)&memcmp;
}


dbFieldDescriptor::dbFieldDescriptor(char*              fieldName,
                                     int                offs,
                                     int                size,
                                     int                index,
                                     char*              inverse,
                                     dbFieldDescriptor* fieldComponents)
{
  next = prev = this;
  name = fieldName;
  longName = NULL;

  dbSymbolTable::add
    (name, tkn_ident, FASTDB_CLONE_ANY_IDENTIFIER);

  appOffs = offs;

  dbsOffs = 0;

  alignment = appSize = dbsSize = size;

  defTable = refTable = NULL;

  indexType = index;

  type = appType = dbField::tpStructure;

  inverseRefName = inverse;

  if (inverseRefName != NULL)
  {

    dbSymbolTable::add
      (inverseRefName, tkn_ident, FASTDB_CLONE_ANY_IDENTIFIER);
  }

  inverseRef = NULL;
  components = fieldComponents;
  method = NULL;
  attr = 0;
  tTree = 0;
  hashTable = 0;
  comparator = (dbUDTComparator)&memcmp;
}

dbFieldDescriptor::~dbFieldDescriptor()
{
  if (type == dbField::tpString)
  {
    delete components;
  }
  else if (type == dbField::tpStructure)
  {
    dbFieldDescriptor* last = components->prev;

    while (last->method != NULL)
    {
      dbFieldDescriptor* prev = last->prev;
      delete last->method;
      delete last;

      if (last == components)
      {
        break;
      }

      last = prev;
    }
  }

  delete[] longName;
}


dbFieldDescriptor* dbFieldDescriptor::find(const char* name)
{
  dbFieldDescriptor* field = components;

  do
  {
    if (field->name == name)
    {
      return field;
    }
  }
  while ((field = field->next) != components);

  return NULL;
}


void dbFieldDescriptor::adjustReferences(byte* record,
    size_t base, size_t size, long shift)
{
  dbFieldDescriptor* fd = this;

  do
  {

    if (fd->type == dbField::tpArray)
    {
      byte** ptr = (byte**)((dbAnyArray*)(record + fd->appOffs) + 1);

      if ((unsigned long)*ptr - base <= size)
      {
        *ptr += shift;
      }
      else
      {
        if (fd->attr & HasArrayComponents)
        {
          int nElems = ((dbAnyArray*)(record+fd->appOffs))->length();
          byte* arrBase = *ptr;

          while (--nElems >= 0)
          {
            fd->components->adjustReferences(arrBase,
                                             base, size, shift);
            arrBase += fd->components->appSize;
          }
        }
      }
    }
    else if (fd->type == dbField::tpString)
    {
      char** str = (char**)(record + fd->appOffs);

      if ((unsigned long)*str - base <= size)
      {
        *str += shift;
      }
    }
    else if (fd->attr & HasArrayComponents)
    {
      fd->components->adjustReferences(record + fd->appOffs,
                                       base, size, shift);
    }
  }
  while ((fd = fd->next) != this);
}


size_t dbFieldDescriptor::calculateRecordSize(byte* base, size_t offs)
{
  dbFieldDescriptor* fd = this;

  do
  {
    switch (fd->appType)
    {

    case dbField::tpArray:
      {
        int nElems = ((dbAnyArray*)(base + fd->appOffs))->length();
        offs = DOALIGN(offs, fd->components->alignment)
               + nElems*fd->components->dbsSize;

        if (fd->attr & HasArrayComponents)
        {
          byte* elem = (byte*)((dbAnyArray*)(base+fd->appOffs))->base();
          dbFieldDescriptor* component = fd->components;
          size_t elemSize = component->appSize;

          while (--nElems >= 0)
          {
            offs = component->calculateRecordSize(elem, offs);
            elem += elemSize;
          }
        }

        continue;
      }

    case dbField::tpString:
      {
        char* str = *(char**)(base + fd->appOffs);

        if (str != NULL)
        {
          offs += strlen(str) + 1;
        }
        else
        {
          offs += 1;
        }

        continue;
      }

#ifdef USE_STD_STRING

    case dbField::tpStdString:
      offs += ((std::string*)(base + fd->appOffs))->length() + 1;
      continue;
#endif

    default:

      if (fd->attr & HasArrayComponents)
      {
        offs = fd->components->calculateRecordSize(base+fd->appOffs, offs);
      }
    }
  }
  while ((fd = fd->next) != this);

  return offs;
}



size_t dbFieldDescriptor::calculateNewRecordSize(byte* base, size_t offs)
{
  dbFieldDescriptor* fd = this;

  do
  {
    if (fd->type == dbField::tpArray)
    {
      if (fd->oldDbsType == dbField::tpUnknown)
      {
        continue;
      }

      int nElems = ((dbVarying*)(base + fd->oldDbsOffs))->size;
      offs = DOALIGN(offs, fd->components->alignment)
             + nElems*fd->components->dbsSize;

      if (fd->attr & HasArrayComponents)
      {
        byte* elem = base + ((dbVarying*)(base+fd->oldDbsOffs))->offs;

        while (--nElems >= 0)
        {
          offs = fd->components->calculateNewRecordSize(elem, offs);
          elem += fd->components->oldDbsSize;
        }
      }
    }
    else if (fd->type == dbField::tpString)
    {
      if (fd->oldDbsType == dbField::tpUnknown)
      {
        offs += 1;
      }
      else
      {
        offs += ((dbVarying*)(base + fd->oldDbsOffs))->size;
      }
    }
    else if (fd->attr & HasArrayComponents)
    {
      offs = fd->components->calculateNewRecordSize(base, offs);
    }
  }
  while ((fd = fd->next) != this);

  return offs;
}

void dbFieldDescriptor::fetchRecordFields(byte* dst, byte* src)
{
  dbFieldDescriptor* fd = this;

  do
  {
    switch (fd->appType)
    {

    case dbField::tpBool:
      *(bool*)(dst+fd->appOffs) = *(bool*)(src+fd->dbsOffs);
      break;

    case dbField::tpInt1:
      *(int1*)(dst+fd->appOffs) = *(int1*)(src+fd->dbsOffs);
      break;

    case dbField::tpInt2:
      *(int2*)(dst+fd->appOffs) = *(int2*)(src+fd->dbsOffs);
      break;

    case dbField::tpInt4:
      *(int4*)(dst+fd->appOffs) = *(int4*)(src+fd->dbsOffs);
      break;

    case dbField::tpInt8:
      *(db_int8*)(dst+fd->appOffs) = *(db_int8*)(src+fd->dbsOffs);
      break;

    case dbField::tpReal4:
      *(real4*)(dst+fd->appOffs) = *(real4*)(src+fd->dbsOffs);
      break;

    case dbField::tpReal8:
      *(real8*)(dst+fd->appOffs) = *(real8*)(src+fd->dbsOffs);
      break;

    case dbField::tpRawBinary:
      memcpy(dst+fd->appOffs, src+fd->dbsOffs, fd->dbsSize);
      break;

    case dbField::tpString:
      *(char**)(dst+fd->appOffs) =
        (char*)(src + ((dbVarying*)(src+fd->dbsOffs))->offs);
      break;
#ifdef USE_STD_STRING

    case dbField::tpStdString:
      ((std::string*)(dst + fd->appOffs))->assign((char*)(src + ((dbVarying*)(src+fd->dbsOffs))->offs),
          ((dbVarying*)(src+fd->dbsOffs))->size - 1);
      break;
#endif

    case dbField::tpArray:
      {
        int nElems = ((dbVarying*)(src+fd->dbsOffs))->size;
        byte* srcElem = src + ((dbVarying*)(src+fd->dbsOffs))->offs;
        dbAnyArray* array = (dbAnyArray*)(dst+fd->appOffs);

        if (fd->attr & dbFieldDescriptor::OneToOneMapping)
        {
          fd->arrayAllocator(array, srcElem, nElems);
        }
        else
        {
          fd->arrayAllocator(array, NULL, nElems);
          byte* dstElem = (byte*)array->base();
          dbFieldDescriptor* component = fd->components;

          while (--nElems >= 0)
          {
            component->fetchRecordFields(dstElem, srcElem);
            dstElem += component->appSize;
            srcElem += component->dbsSize;
          }
        }
      }

      break;

    case dbField::tpReference:
      ((dbAnyReference*)(dst+fd->appOffs))->oid =
        *(oid_t*)(src+fd->dbsOffs);
      break;

    case dbField::tpStructure:
      fd->components->fetchRecordFields(dst + fd->appOffs, src);
      break;

    default:
      return;
    }
  }
  while ((fd = fd->next) != this);
}


size_t dbFieldDescriptor::storeRecordFields(byte* dst, byte* src, size_t offs, bool insert)
{
  dbFieldDescriptor* fd = this;

  do
  {
#ifdef AUTOINCREMENT_SUPPORT

    if (insert && (fd->indexType & AUTOINCREMENT) != 0)
    {
      assert (fd->appType == dbField::tpInt4);
      *(int4*)(dst+fd->dbsOffs) = *(int4*)(src+fd->appOffs) = fd->defTable->autoincrementCount;
      continue;
    }

#endif
    switch (fd->appType)
    {

    case dbField::tpBool:
      *(bool*)(dst+fd->dbsOffs) = *(bool*)(src+fd->appOffs);
      break;

    case dbField::tpInt1:
      *(int1*)(dst+fd->dbsOffs) = *(int1*)(src+fd->appOffs);
      break;

    case dbField::tpInt2:
      *(int2*)(dst+fd->dbsOffs) = *(int2*)(src+fd->appOffs);
      break;

    case dbField::tpInt4:
      *(int4*)(dst+fd->dbsOffs) = *(int4*)(src+fd->appOffs);
      break;

    case dbField::tpInt8:
      *(db_int8*)(dst+fd->dbsOffs) = *(db_int8*)(src+fd->appOffs);
      break;

    case dbField::tpReal4:
      *(real4*)(dst+fd->dbsOffs) = *(real4*)(src+fd->appOffs);
      break;

    case dbField::tpReal8:
      *(real8*)(dst+fd->dbsOffs) = *(real8*)(src+fd->appOffs);
      break;

    case dbField::tpRawBinary:
      memcpy(dst+fd->dbsOffs, src+fd->appOffs, fd->dbsSize);
      break;
#ifdef USE_STD_STRING

    case dbField::tpStdString:
      {
        ((dbVarying*)(dst+fd->dbsOffs))->offs = offs;
        std::string* str = (std::string*)(src + fd->appOffs);
        int len = str->length();
        str->copy((char*)dst + offs, len);
        dst[offs + len] = '\0';
        ((dbVarying*)(dst+fd->dbsOffs))->size = len+1;
        offs += (len+1);
      }

      break;
#endif

    case dbField::tpString:
      {
        ((dbVarying*)(dst+fd->dbsOffs))->offs = offs;
        char* str = *(char**)(src + fd->appOffs);

        if (str != NULL)
        {
          strcpy((char*)dst + offs, str);
          offs += ((dbVarying*)(dst+fd->dbsOffs))->size
                  = strlen(*(char**)(src + fd->appOffs)) + 1;
        }
        else
        {
          *((char*)dst + offs) = '\0';
          offs += 1;
        }
      }

      break;

    case dbField::tpArray:
      {
        int nElems = ((dbAnyArray*)(src + fd->appOffs))->length();
        byte* srcElem=(byte*)((dbAnyArray*)(src+fd->appOffs))->base();
        offs = DOALIGN(offs, fd->components->alignment);
        byte* dstElem = dst+offs;
        ((dbVarying*)(dst+fd->dbsOffs))->size = nElems;
        ((dbVarying*)(dst+fd->dbsOffs))->offs = offs;
        size_t sizeElem = fd->components->dbsSize;
        size_t offsElem = nElems*sizeElem;
        offs += offsElem;

        if (srcElem != NULL)
        {
          if (fd->attr & dbFieldDescriptor::OneToOneMapping)
          {
            memcpy(dstElem, srcElem, offsElem);
          }
          else
          {
            dbFieldDescriptor* component = fd->components;

            while (--nElems >= 0)
            {
              offsElem =
                component->storeRecordFields(dstElem,
                                             srcElem, offsElem, insert);
              offsElem -= sizeElem;
              dstElem += sizeElem;
              srcElem += component->appSize;
            }

            offs += offsElem;
          }
        }

      }

      break;

    case dbField::tpReference:
      *(oid_t*)(dst+fd->dbsOffs) =
        ((dbAnyReference*)(src+fd->appOffs))->oid;
      break;

    case dbField::tpStructure:
      offs = fd->components->storeRecordFields(dst, src+fd->appOffs, offs, insert);
      break;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产人成亚洲第一网站在线播放| 九色综合国产一区二区三区| 亚洲成人av一区| 国内成人免费视频| 制服丝袜成人动漫| 亚洲人精品午夜| 国产一区二区91| 91精品久久久久久久99蜜桃 | 欧美羞羞免费网站| 久久久精品黄色| 视频一区二区不卡| 91老司机福利 在线| 国产丝袜在线精品| 国内精品久久久久影院一蜜桃| 7777精品伊人久久久大香线蕉的| 一区二区在线看| 99视频一区二区三区| 久久综合久久鬼色中文字| 免费不卡在线视频| 欧美美女视频在线观看| 一区二区三区四区视频精品免费| 波多野结衣欧美| 国产精品乱码人人做人人爱| 国产精品一区二区男女羞羞无遮挡 | 色偷偷久久人人79超碰人人澡| 久久久国产一区二区三区四区小说| 亚洲va韩国va欧美va| 91福利精品第一导航| 成人免费视频在线观看| k8久久久一区二区三区| 中文字幕+乱码+中文字幕一区| 国产综合色视频| 久久精品在线观看| 国产一区二区三区在线观看免费 | 成人精品一区二区三区四区| 久久久综合激的五月天| 国产精品一区二区久久不卡| 国产欧美综合色| 成人午夜免费视频| 国产精品成人一区二区艾草 | 久久精品免费在线观看| 国产一区二区三区四| 久久久久国产精品麻豆| 国产成人小视频| 1000部国产精品成人观看| 91丨porny丨最新| 午夜精品久久久久久久久| 欧美一区二区久久| 国内精品嫩模私拍在线| 国产精品久久久久一区二区三区| 92精品国产成人观看免费| 一区二区三区不卡在线观看 | 日韩av不卡在线观看| 2024国产精品| 99久久久国产精品| 亚洲va欧美va天堂v国产综合| 日韩精品专区在线| 成人妖精视频yjsp地址| 亚洲精品第1页| 欧美α欧美αv大片| 成人av高清在线| 日本不卡一区二区三区高清视频| 2022国产精品视频| 色综合欧美在线| 老司机免费视频一区二区| 日本一区二区三区在线观看| 欧美中文字幕一区| 国内精品国产成人| 中文字幕日韩av资源站| 91麻豆精品国产自产在线 | 日韩码欧中文字| 91精品久久久久久久久99蜜臂| 国产99久久久精品| 视频精品一区二区| 欧美国产精品久久| 91精品国产入口在线| 成人性生交大片免费看在线播放| 亚洲国产中文字幕在线视频综合| 久久网这里都是精品| 欧美丝袜丝交足nylons| 高清日韩电视剧大全免费| 午夜精品国产更新| 国产精品国产精品国产专区不蜜 | 欧美日韩大陆在线| www.日韩大片| 韩日av一区二区| 亚洲大片一区二区三区| 国产精品久久久久久久久图文区 | 亚洲成人精品一区二区| 国产精品天干天干在线综合| 欧美成人aa大片| 欧美色成人综合| 91丨porny丨户外露出| 国产一区二区三区美女| 青青草国产精品97视觉盛宴| 一区二区三区电影在线播| 国产精品大尺度| 欧美高清一级片在线观看| 欧美精品一区二区久久婷婷| 91精品国产一区二区三区| 欧美专区亚洲专区| 色拍拍在线精品视频8848| 粉嫩av一区二区三区在线播放| 狠狠色丁香九九婷婷综合五月| 奇米在线7777在线精品| 亚洲一区二区三区不卡国产欧美| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 欧美日韩精品二区第二页| 91视频在线观看免费| youjizz国产精品| 成人激情小说网站| 成人激情小说乱人伦| 成人免费毛片片v| 成人aaaa免费全部观看| 粉嫩av一区二区三区粉嫩 | 欧美夫妻性生活| 欧美日韩日日夜夜| 欧美精品一二三| 日韩免费性生活视频播放| 欧美日本一区二区在线观看| 欧美日韩中文字幕精品| 欧美精品久久一区| 日韩午夜三级在线| 日韩欧美成人一区二区| 久久香蕉国产线看观看99| 久久久久国产精品麻豆 | 国产免费久久精品| 亚洲国产成人一区二区三区| 最新高清无码专区| 一区二区三区毛片| 日韩中文字幕不卡| 激情欧美一区二区| 成人久久18免费网站麻豆| 色先锋资源久久综合| 欧美一区二区在线观看| 国产精品久久久久四虎| 椎名由奈av一区二区三区| 亚洲一级不卡视频| 强制捆绑调教一区二区| 国产在线国偷精品产拍免费yy | 欧美三级资源在线| 日韩午夜激情电影| 国产欧美一区二区精品忘忧草| 亚洲日本欧美天堂| 天堂在线一区二区| 成人永久aaa| 欧美日韩一区二区电影| www成人在线观看| 一区二区不卡在线视频 午夜欧美不卡在 | 视频在线观看一区| 国产成人在线视频网址| 色婷婷久久一区二区三区麻豆| 欧美一区二区三区白人| 中文字幕av不卡| 日韩精品久久理论片| www.亚洲激情.com| 欧美精品一区二区久久婷婷 | 国产精品高潮呻吟久久| 天天影视涩香欲综合网| 成人综合在线观看| 欧美精品乱码久久久久久| 国产精品美女久久久久高潮| 日韩制服丝袜先锋影音| 粉嫩高潮美女一区二区三区| 91精品欧美综合在线观看最新 | 色综合咪咪久久| 久久综合狠狠综合久久综合88| 一区二区三区四区不卡在线 | 亚洲综合在线免费观看| 国产乱码精品一区二区三区忘忧草 | 99久久精品免费观看| 日韩欧美一区电影| 亚洲激情中文1区| 国产suv精品一区二区6| 日韩视频在线一区二区| 亚洲一区在线观看视频| 成人教育av在线| 国产欧美一区二区三区在线看蜜臀 | 国产91色综合久久免费分享| 欧美电影精品一区二区| 日韩精品亚洲一区二区三区免费| 91碰在线视频| 中文字幕一区二区三区四区不卡| 韩国女主播一区| 日韩一级免费观看| 天天色天天操综合| 91成人网在线| 亚洲女女做受ⅹxx高潮| 不卡一卡二卡三乱码免费网站| 久久综合狠狠综合| 经典三级视频一区| 欧美成人欧美edvon| 韩国三级中文字幕hd久久精品| 欧美高清一级片在线| 亚洲超丰满肉感bbw| 欧美日韩国产欧美日美国产精品| 亚洲欧美偷拍另类a∨色屁股| 成人av影视在线观看| 亚洲国产精品t66y| av网站一区二区三区|