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

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

?? class.cpp

?? FastDb是高效的內存數據庫系統
?? CPP
?? 第 1 頁 / 共 4 頁
字號:

  indexedFields = NULL;

  inverseFields = NULL;

  tableId = 0;

  nFields = 0;

  nColumns = 0;

  db = database;

  fixedDatabase = database != NULL;

  fixedSize = sizeof(dbRecord);

  int attr = dbFieldDescriptor::OneToOneMapping;

  appSize = 0;

  autoincrementCount = initialAutoincrementCount;

  size_t maxAlignment = calculateFieldsAttributes(columns, "",
                        sizeof(dbRecord),
                        HASHED|INDEXED, attr);

#if CHECK_RECORD_SIZE

  appSize = DOALIGN(appSize, maxAlignment);

  if (appSize < objSize)
  {
    fprintf(stderr, "Warning: may be not all fields of the class '%s' "
            "were described\n", name);
  }

#endif
  *nextFieldLink = NULL;
}


int dbTableDescriptor::calculateFieldsAttributes(dbFieldDescriptor* first,
    char const*        prefix,
    int                offs,
    int                indexMask,
    int&               attr)
{
  dbFieldDescriptor *field = first;
  size_t alignment = 1;

  do
  {
    if (field->method)
    {
      assert(((void)"Not empty record", field != first));

      do
      {
        assert(((void)"Methods should be specified after variables",
                field->method != NULL));
        field->dbsOffs = first->dbsOffs;
        field->components = first;

        if (attr & dbFieldDescriptor::OneToOneMapping)
        {
          field->method = field->method->optimize();
        }
      }
      while ((field = field->next) != first);

      break;
    }

    if (*prefix != '\0')
    {
      char* p = new char[strlen(prefix)+strlen(field->name)+1];
      sprintf(p, "%s%s", prefix, field->name);
      field->longName = p;
    }
    else
    {
      nColumns += 1;
      field->longName = new char[strlen(field->name)+1];
      strcpy(field->longName, field->name);
    }

    field->defTable = this;
    field->indexType &= indexMask|DB_FIELD_INHERITED_MASK;
    field->attr = (attr & dbFieldDescriptor::ComponentOfArray)
                  | dbFieldDescriptor::OneToOneMapping;

    if (field->inverseRefName)
    {
      assert(!(attr & dbFieldDescriptor::ComponentOfArray)
             && (field->type == dbField::tpReference
                 || (field->type == dbField::tpArray
                     && field->components->type==dbField::tpReference)));
      field->nextInverseField = inverseFields;
      inverseFields = field;
    }

    *nextFieldLink = field;
    nextFieldLink = &field->nextField;
    field->fieldNo = nFields++;

    switch (field->type)
    {

    case dbField::tpArray:
      {
        size_t saveOffs = fixedSize;
        size_t saveAppSize = appSize;
        fixedSize = 0;
        attr = (attr | dbFieldDescriptor::HasArrayComponents)
               & ~dbFieldDescriptor::OneToOneMapping;
        field->attr |= dbFieldDescriptor::ComponentOfArray;
        calculateFieldsAttributes(field->components, field->longName,
                                  0, 0, field->attr);

        if (field->components->dbsSize != field->components->appSize)
        {
          field->attr &= ~dbFieldDescriptor::OneToOneMapping;
        }

        fixedSize = saveOffs;
        appSize = DOALIGN(saveAppSize, sizeof(void*))
                  + sizeof(void*)*3;
        break;
      }

    case dbField::tpStructure:
      {
        char* aggregateName = new char[strlen(field->longName) + 2];
        sprintf(aggregateName, "%s.", field->longName);
        size_t saveOffs = fixedSize;
        size_t saveAppSize = appSize;
        appSize = 0;
        size_t struct_alignment =
          calculateFieldsAttributes(field->components,
                                    aggregateName,
                                    offs + field->appOffs,
                                    field->indexType,
                                    field->attr);
        field->alignment = struct_alignment;
        field->dbsOffs = field->components->dbsOffs;
        attr |= field->attr & dbFieldDescriptor::HasArrayComponents;
        attr &= field->attr | ~dbFieldDescriptor::OneToOneMapping;
        field->dbsSize = DOALIGN(fixedSize-saveOffs, struct_alignment);

        if ((field->attr & dbFieldDescriptor::HasArrayComponents)
            && struct_alignment < sizeof(void*))
        {
          struct_alignment = sizeof(void*);
        }

        appSize = DOALIGN(appSize, struct_alignment)
                  + DOALIGN(saveAppSize, struct_alignment);
        delete[] aggregateName;
        break;
      }

    case dbField::tpString:
      attr = (attr | dbFieldDescriptor::HasArrayComponents)
             & ~dbFieldDescriptor::OneToOneMapping;
      // no break

    default:
      appSize = DOALIGN(appSize, field->appSize) + field->appSize;
    }

    if (alignment < field->alignment)
    {
      alignment = field->alignment;
    }

    if (field->type != dbField::tpStructure)
    {
      field->dbsOffs = fixedSize = DOALIGN(fixedSize, field->alignment);
      fixedSize += field->dbsSize;

      if (field->dbsOffs != offs + field->appOffs)
      {
        attr &= ~dbFieldDescriptor::OneToOneMapping;
      }

      if (field->indexType & (HASHED|INDEXED))
      {
        assert(!(field->attr & dbFieldDescriptor::ComponentOfArray));

        if (field->indexType & HASHED)
        {
          field->nextHashedField = hashedFields;
          hashedFields = field;
        }

        if (field->indexType & INDEXED)
        {
          field->nextIndexedField = indexedFields;
          indexedFields = field;
        }
      }
    }
  }
  while ((field = field->next) != first);

  return alignment;
}


int dbFieldDescriptor::sizeWithoutOneField(dbFieldDescriptor* field,
    byte* base, size_t& size)
{
  dbFieldDescriptor* fd = this;
  int offs, last = 0;

  do
  {
    if (fd != field)
    {
      if (fd->type == dbField::tpArray || fd->type == dbField::tpString)
      {
        dbVarying* arr = (dbVarying*)(base + fd->dbsOffs);

        if (arr->offs > last)
        {
          last = arr->offs;
        }

        int n = arr->size;
        size = DOALIGN(size, fd->components->alignment)
               + fd->components->dbsSize * n;

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

          while (--n >= 0)
          {
            offs = fd->components->sizeWithoutOneField(field,
                   elem, size);

            if (arr->offs + offs > last)
            {
              last = arr->offs + offs;
            }

            elem += fd->components->dbsSize;
          }
        }
      }
      else if (fd->attr & HasArrayComponents)
      {
        offs = fd->components->sizeWithoutOneField(field, base, size);

        if (offs > last)
        {
          last = offs;
        }
      }
    }
  }
  while ((fd = fd->next) != this);

  return last;
}


size_t dbFieldDescriptor::copyRecordExceptOneField(dbFieldDescriptor* field,
    byte* dst, byte* src,
    size_t offs)
{
  dbFieldDescriptor* fd = this;

  do
  {
    if (fd != field)
    {
      if (fd->type == dbField::tpArray || fd->type == dbField::tpString)
      {
        dbVarying* srcArr = (dbVarying*)(src + fd->dbsOffs);
        dbVarying* dstArr = (dbVarying*)(dst + fd->dbsOffs);
        int n = srcArr->size;
        byte* srcElem = src + srcArr->offs;
        offs = DOALIGN(offs, fd->components->alignment);
        byte* dstElem = dst + offs;
        dstArr->offs = offs;
        dstArr->size = n;
        size_t sizeElem = fd->components->dbsSize;
        size_t offsElem = sizeElem * n;
        offs += offsElem;

        if (fd->attr & HasArrayComponents)
        {
          while (--n >= 0)
          {
            offsElem = fd->components->
                       copyRecordExceptOneField(field, dstElem, srcElem,
                                                offsElem);
            offsElem -= sizeElem;
            dstElem += sizeElem;
            srcElem += sizeElem;
          }

          offs += offsElem;
        }
        else
        {
          memcpy(dstElem, srcElem, offsElem);
        }
      }
      else if (fd->attr & HasArrayComponents)
      {
        offs = fd->components->copyRecordExceptOneField(field, dst,
               src, offs);
      }
      else if (fd->method == NULL)
      {
        memcpy(dst+fd->dbsOffs, src+fd->dbsOffs, fd->dbsSize);
      }
    }
  }
  while ((fd = fd->next) != this);

  return offs;
}


void dbTableDescriptor::checkRelationship()
{
  dbFieldDescriptor* fd;

  for (fd = inverseFields; fd != NULL; fd = fd->nextInverseField)
  {
    dbTableDescriptor* refTable =
      fd->refTable ? fd->refTable : fd->components->refTable;
    fd->inverseRef = refTable->findSymbol(fd->inverseRefName);

    if (fd->inverseRef == NULL
        || fd->inverseRef->inverseRefName != fd->name)
    {
      char msg[256];

      if (fd->inverseRef == NULL)
      {
        sprintf(msg, "Failed to locate inverse reference field %s.%s for field %s.%s",
                refTable->name, fd->inverseRefName, fd->defTable->name, fd->longName);
      }
      else
      {
        sprintf(msg, "Inverse references for field %s.%s is %s.%s, but its inverse reference is %s",
                fd->defTable->name, fd->longName, refTable->name, fd->inverseRefName, fd->inverseRef->inverseRefName);
      }

      db->handleError(dbDatabase::InconsistentInverseReference, msg);
    }
  }
}

dbFieldDescriptor* dbTableDescriptor::find(char const* name)
{
  char* symnam = (char*)name;

  dbSymbolTable::add
    (symnam, tkn_ident);

  return findSymbol(symnam);
}

dbFieldDescriptor* dbTableDescriptor::findSymbol(const char* name)
{
  dbFieldDescriptor* first = columns;
  dbFieldDescriptor* field = first;

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

  return NULL;
}

dbFieldDescriptor& dbFieldDescriptor::adjustOffsets(long offs)
{
  if (offs != 0)
  {
    dbFieldDescriptor* fd = this;

    do
    {
      fd->appOffs += offs;
    }
    while ((fd = fd->next) != this);
  }

  return *this;
}




bool dbTableDescriptor::match(dbTable* table, bool confirmDeleteColumns)
{
  unsigned nFields = table->fields.size;
  unsigned nMatches = 0;
  bool formatNotChanged = (nFields == this->nFields);

  for (dbFieldDescriptor* fd = firstField; fd != NULL; fd = fd->nextField)
  {
    dbField* field = (dbField*)((char*)table + table->fields.offs);
    fd->oldDbsType = dbField::tpUnknown;

    for (int n = nFields; --n >= 0; field++)
    {
      if (strcmp(fd->longName, (char*)field + field->name.offs) == 0)
      {
        assert(((void)"field can be converted to new format",
                (fd->type == dbField::tpReference
                 && field->type == dbField::tpReference
                 && strcmp((char*)field + field->tableName.offs,
                           fd->refTable->name) == 0)
                || (fd->type <= dbField::tpReal8
                    && field->type <= dbField::tpReal8)
                || (fd->type == dbField::tpString
                    && field->type == dbField::tpString)
                || (fd->type >= dbField::tpArray
                    && fd->type == field->type)));
        fd->oldDbsType = field->type;
        fd->oldDbsOffs = field->offset;
        fd->oldDbsSize = field->size;

        if (field->type != fd->type || field->offset != fd->dbsOffs)
        {
          formatNotChanged = false;
        }

        nMatches += 1;
        //
        // Try to reuse indices
        //
        fd->hashTable = 0;
        fd->tTree = 0;

        if (field->type == fd->type)
        {
          if ((fd->indexType & HASHED) != 0 && field->hashTable != 0)
          {
            fd->hashTable = field->hashTable; // reuse index
            field->hashTable = 0; // prevent index from destruction
          }

          if ((fd->indexType & INDEXED) != 0 && field->tTree != 0)
          {
            fd->tTree = field->tTree; // reuse index
            field->tTree = 0; // prevent index from destruction
          }
        }

        break;
      }
    }
  }

  if (!confirmDeleteColumns)
  {
    assert(((void)"field can be removed only from empty table",
            nFields==nMatches));
  }

  return formatNotChanged;
}

void dbTableDescriptor::setFlags()
{
  for (dbFieldDescriptor* fd = firstField; fd != NULL; fd = fd->nextField)
  {
    if (fd->tTree != 0)
    {
      fd->indexType |= INDEXED;
    }
    else if (fd->hashTable != 0)
    {
      fd->indexType |= HASHED;
    }
  }
}


bool dbTableDescriptor::equal(dbTable* table)
{
#ifdef AUTOINCREMENT_SUPPORT
  autoincrementCount = table->count;
#endif

  if (nColumns != table->nColumns ||
      nFields != table->fields.size || fixedSize != table->fixedSize)
  {
    return false;
  }

  dbField* field = (dbField*)((char*)table + table->fields.offs);

  for (dbFieldDescriptor* fd = firstField; fd != NULL; fd = fd->nextField)
  {
    if (strcmp(fd->longName, (char*)field + field->name.offs) != 0
        || (!fd->refTable && *((char*)field+field->tableName.offs) != '\0')
        || (fd->refTable && strcmp((char*)field + field->tableName.offs,
                                   fd->refTable->name) != 0)
        || (fd->inverseRefName == NULL
            && *((char*)field + field->inverse.offs) != '\0')
        || (fd->inverseRefName != NULL
            && strcmp((char*)field + field->inverse.offs,
                      fd->inverseRefName) != 0)
        || fd->dbsOffs != field->offset
        || fd->type != field->type)
    {
      return false;
    }

    fd->tTree = field->tTree;
    fd->hashTable = field->hashTable;
    field += 1;
  }

  return true;
}


dbTableDescriptor::dbTableDescriptor(dbTable* table)
{
  next = chain;
  chain = this;
  cloneOf = NULL;
  isStatic = false;
  name = (char*)table + table->name.offs;

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

  nextFieldLink = &firstField;

  hashedFields = NULL;

  indexedFields = NULL;

  inverseFields = NULL;

  nFields = 0;

  nColumns = 0;

  fixedSize = table->fixedSize;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99在线精品观看| 国产片一区二区三区| 亚洲国产综合91精品麻豆| 99精品久久只有精品| 国产欧美精品在线观看| 成人性生交大片| 亚洲精品福利视频网站| 欧美日韩精品一二三区| 日韩国产精品久久久| 国产精品一区二区久久精品爱涩 | 成人国产精品免费观看视频| 激情综合网av| 高清在线不卡av| 99精品1区2区| 欧美视频在线不卡| 日韩一级黄色大片| 日韩精品一区二区三区在线| 日韩欧美第一区| 亚洲最大的成人av| 粉嫩蜜臀av国产精品网站| 欧美亚洲精品一区| 自拍偷拍亚洲欧美日韩| 亚洲天堂福利av| 成人亚洲精品久久久久软件| 国内欧美视频一区二区| 老司机精品视频一区二区三区| 国产麻豆日韩欧美久久| 中文字幕免费不卡在线| 在线精品视频一区二区三四| 久久成人久久鬼色| 国产欧美日韩综合| 欧美男女性生活在线直播观看| 国产在线精品免费| 亚洲精品成人悠悠色影视| 日韩欧美成人激情| 色屁屁一区二区| 国产福利电影一区二区三区| 亚洲123区在线观看| 中文字幕免费观看一区| 欧美一卡在线观看| 色老汉一区二区三区| 免费欧美在线视频| 夜夜嗨av一区二区三区中文字幕 | 国产精品久久久久久久久免费丝袜| 91片在线免费观看| 精品写真视频在线观看 | 国产精品久久久久久久裸模 | 色综合久久中文字幕综合网| 久久国产人妖系列| 亚洲动漫第一页| 亚洲图片欧美激情| 国产日韩高清在线| 精品成人一区二区| 91精品蜜臀在线一区尤物| 色婷婷国产精品| 99精品热视频| 春色校园综合激情亚洲| 久久91精品久久久久久秒播| 日本三级亚洲精品| 亚洲福利一二三区| 亚洲愉拍自拍另类高清精品| 国产精品久久久久永久免费观看| 久久人人爽人人爽| 欧美成人猛片aaaaaaa| 欧美丰满高潮xxxx喷水动漫| 欧美伊人久久大香线蕉综合69 | 7777精品伊人久久久大香线蕉 | 日韩美女视频一区二区| 中文字幕+乱码+中文字幕一区| 精品久久五月天| 精品国产网站在线观看| 欧美日韩大陆一区二区| 欧美日韩一二三| 在线观看视频一区二区欧美日韩| eeuss鲁片一区二区三区| 成人av手机在线观看| 成人免费毛片片v| 暴力调教一区二区三区| 成人激情图片网| 99re视频精品| 色婷婷av一区二区三区gif| 成人黄色片在线观看| 99久久精品国产一区| 91热门视频在线观看| 91视频免费看| 欧美三级电影精品| 8x福利精品第一导航| 粗大黑人巨茎大战欧美成人| 久久成人免费日本黄色| 日韩精品欧美精品| 亚洲成av人片在线观看无码| 亚洲成人一区在线| 一区二区三区在线影院| 国产精品你懂的| 亚洲欧美日韩人成在线播放| 国产精品电影一区二区三区| 国产欧美日韩综合精品一区二区| 欧美成人性战久久| 欧美日韩国产高清一区二区 | 日本精品视频一区二区| 国产成人福利片| 成人av资源在线观看| 欧美中文字幕亚洲一区二区va在线| 在线91免费看| 欧美日韩不卡一区| av电影天堂一区二区在线| 成人永久aaa| 91年精品国产| 一区二区三区在线观看网站| 欧美日本国产视频| 国产日产欧美一区二区视频| 17c精品麻豆一区二区免费| 性久久久久久久| 狠狠色狠狠色综合日日91app| 粉嫩av一区二区三区| 欧美性受极品xxxx喷水| 久久婷婷综合激情| 亚洲一区在线观看网站| 精品一区二区三区在线播放视频| 国产精品1区2区| 国产成人aaa| 欧美久久久久中文字幕| 国产日韩欧美一区二区三区乱码| 国产精品久久久久一区| 综合中文字幕亚洲| 狠狠色丁香婷综合久久| 欧美性生交片4| 国产日韩一级二级三级| 午夜精品视频一区| 久久亚洲精品小早川怜子| 欧美日韩高清一区二区三区| 欧美变态tickling挠脚心| 久久久久久久综合色一本| 亚洲综合无码一区二区| 国产精品99久| 91.com在线观看| 亚洲精品免费看| 国产v综合v亚洲欧| 日韩欧美激情四射| 亚洲成人一区在线| 色一情一伦一子一伦一区| 国产精品天美传媒| 激情偷乱视频一区二区三区| 欧美一区午夜视频在线观看| 伊人夜夜躁av伊人久久| 不卡的电视剧免费网站有什么| 7777精品伊人久久久大香线蕉的| 一区二区三区免费看视频| www.久久精品| 国产欧美日韩在线看| 国产精品影音先锋| 精品久久一区二区三区| 日韩av高清在线观看| 91久久精品午夜一区二区| 亚洲日穴在线视频| 99久久精品国产精品久久| 国产亚洲一区二区三区在线观看| 日本在线不卡视频| 日韩视频免费观看高清完整版| 亚洲国产美女搞黄色| 在线观看亚洲成人| 亚洲精品一卡二卡| 欧洲精品一区二区三区在线观看| 亚洲男同1069视频| 色综合久久久久综合体| 成人免费在线播放视频| 91免费观看视频在线| 综合色天天鬼久久鬼色| 成年人网站91| 国产精品国产三级国产有无不卡| eeuss国产一区二区三区| 成人免费在线观看入口| 色天天综合久久久久综合片| 一区二区在线观看视频| 欧美日韩二区三区| 麻豆精品久久久| 欧美tickling挠脚心丨vk| 国内成人自拍视频| 国产欧美日本一区视频| 97久久精品人人爽人人爽蜜臀| 综合色中文字幕| 欧美日韩大陆在线| 美女被吸乳得到大胸91| 久久精品亚洲精品国产欧美| 久久精品亚洲精品国产欧美| 91在线免费视频观看| 国产精品自拍毛片| 国内精品免费**视频| 亚洲精品视频观看| 亚洲美女偷拍久久| 中文字幕欧美三区| 精品噜噜噜噜久久久久久久久试看| 91丨porny丨户外露出| 成人免费视频一区二区| 国产精品影视在线| 国产成人精品三级麻豆| 国产成人免费视频| 粉嫩高潮美女一区二区三区| 色婷婷国产精品综合在线观看| 成人激情开心网|