亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
91视频国产观看| 日韩av电影天堂| 色成人在线视频| 欧美视频一区二区三区在线观看| 精品无人码麻豆乱码1区2区 | 欧美日本一区二区| 亚洲国产成人午夜在线一区| 欧美一区二区三区色| 欧美日韩一区二区三区高清 | 一区二区三区高清| 亚洲摸摸操操av| 亚洲日穴在线视频| 亚洲狠狠丁香婷婷综合久久久| 久久精品欧美日韩| 欧美色手机在线观看| 欧美色欧美亚洲另类二区| 欧美无砖砖区免费| 欧美精品在线视频| 91精品国产色综合久久不卡电影| 美女免费视频一区二区| 91一区二区三区在线观看| av在线不卡免费看| 色婷婷亚洲综合| 欧美三级电影在线看| 欧美日韩国产成人在线91| 久久精品99国产国产精| 欧美日韩日日夜夜| 91精品麻豆日日躁夜夜躁| 欧美不卡在线视频| 欧美国产乱子伦| 一区二区三区av电影| 免费成人在线网站| 国产传媒日韩欧美成人| 免费亚洲电影在线| 国产成人av一区二区三区在线| 成人av资源在线| 欧美久久久久久久久| 精品91自产拍在线观看一区| 久久天天做天天爱综合色| 91精品国模一区二区三区| 精品国产网站在线观看| 国产精品色哟哟网站| 一区二区三区自拍| 美女看a上一区| 天堂在线一区二区| 韩国三级在线一区| www.亚洲在线| 欧美一区二区视频网站| 日本一区二区综合亚洲| 亚洲成a人v欧美综合天堂 | 亚洲一区在线视频观看| 捆绑紧缚一区二区三区视频| 91丝袜美女网| 免费欧美日韩国产三级电影| 欧美性大战久久久久久久蜜臀| 日韩欧美中文字幕公布| 国产精品欧美精品| 美女性感视频久久| 色综合久久久久久久| 日韩欧美中文字幕精品| 亚洲综合偷拍欧美一区色| 蜜臀av性久久久久av蜜臀妖精| 丝袜亚洲精品中文字幕一区| 岛国精品一区二区| 日韩美一区二区三区| 亚洲精品videosex极品| 国产精品亚洲人在线观看| 在线观看国产日韩| 91久久精品一区二区三| 久久久久久亚洲综合| 日韩精品亚洲专区| 一本一道久久a久久精品| 久久精品日产第一区二区三区高清版| 制服丝袜日韩国产| 久久99蜜桃精品| 在线中文字幕一区| 欧美激情综合在线| 久久精品国产久精国产爱| 欧美中文字幕不卡| 亚洲丝袜自拍清纯另类| 国产一区二区福利| 99re这里只有精品视频首页| 日韩美女视频在线| 日韩电影在线观看电影| 欧美自拍偷拍一区| 一区二区三区国产精品| 成年人网站91| 国产精品美女久久久久久久网站| 日本欧美韩国一区三区| 粉嫩aⅴ一区二区三区四区| 91精品国产综合久久婷婷香蕉 | 久久久久久久综合狠狠综合| 中文字幕av不卡| 国产精品自拍一区| 亚洲精品一区二区三区在线观看| 亚洲成人免费在线| 欧美日本精品一区二区三区| 伊人性伊人情综合网| 色综合天天综合狠狠| 国产精品久久久久aaaa樱花 | 91精品在线一区二区| 午夜久久久久久电影| 欧美理论在线播放| 亚洲成a人片在线观看中文| 在线视频你懂得一区二区三区| 综合激情成人伊人| 91黄视频在线| 午夜影院久久久| 欧美二区三区的天堂| 图片区小说区国产精品视频| 7777精品伊人久久久大香线蕉完整版 | 在线观看一区二区精品视频| 亚洲蜜臀av乱码久久精品 | 国产区在线观看成人精品| 国产福利一区二区三区| 久久久无码精品亚洲日韩按摩| 国产精品中文字幕日韩精品| 国产日本一区二区| 成人h精品动漫一区二区三区| 国产精品久久网站| 一本色道久久综合狠狠躁的推荐| 一区二区三区在线观看视频| 欧美体内she精高潮| 亚洲va韩国va欧美va精品| 5月丁香婷婷综合| 久久黄色级2电影| 国产人妖乱国产精品人妖| 91在线无精精品入口| 亚洲成人激情av| 欧美精品一区二区久久婷婷| 懂色中文一区二区在线播放| 国产欧美精品一区二区色综合| 丁香另类激情小说| 综合久久久久久| 欧美日韩精品一区二区在线播放 | 成人av免费网站| 亚洲综合偷拍欧美一区色| 3atv在线一区二区三区| 国产精品一区在线| 一区二区三区毛片| 日韩视频免费观看高清完整版在线观看 | 蜜桃av一区二区三区| 国产校园另类小说区| 日本韩国欧美三级| 免费在线观看视频一区| 亚洲国产精品成人综合 | 在线成人午夜影院| 国产精品小仙女| 亚洲国产欧美另类丝袜| 欧美精品一区二区久久久| 色婷婷一区二区三区四区| 麻豆成人av在线| 亚洲欧美二区三区| 日韩免费高清av| 色偷偷成人一区二区三区91| 另类小说综合欧美亚洲| 亚洲天堂久久久久久久| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 紧缚奴在线一区二区三区| 中文字幕乱码一区二区免费| 欧美二区三区91| 91色视频在线| 久久精品免费观看| 一区二区三区四区不卡视频| 久久久综合精品| 4438x亚洲最大成人网| 成人激情动漫在线观看| 琪琪久久久久日韩精品| 亚洲日本在线天堂| 国产亚洲精品资源在线26u| 欧美三区在线观看| av激情成人网| 国产精品资源在线| 奇米色一区二区| 亚洲一区在线观看免费 | 韩国视频一区二区| 亚洲不卡在线观看| 中文字幕视频一区二区三区久| 日韩女优av电影在线观看| 欧美日韩高清影院| 色综合久久久久综合体| 国产成人亚洲综合a∨婷婷图片| 视频一区视频二区中文| 亚洲精品国产第一综合99久久 | 国产一区二区三区黄视频| 婷婷开心激情综合| 亚洲一区二区三区四区在线观看| 欧美激情一区二区在线| 欧美精品一区二区三区很污很色的| 欧美久久久久中文字幕| 欧美日韩在线播放一区| 色欧美乱欧美15图片| av高清久久久| zzijzzij亚洲日本少妇熟睡| 国产高清精品久久久久| 狠狠色综合播放一区二区| 一区二区激情视频| 一区二区三区蜜桃| 亚洲高清免费观看| 亚洲一卡二卡三卡四卡|