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

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

?? subsql.cpp

?? FastDb是高效的內存數據庫系統
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
      fields[nFields++].type = type;
    }
    else if (type == dbField::tpReference)
    {
      fields[nFields-1].refTableName = refTableName;
      varyingLength += strlen(refTableName);

      if (inverseRefName != NULL)
      {
        fields[nFields-1].inverseRefName = inverseRefName;
        varyingLength += strlen(inverseRefName);
      }
    }

    tkn = scan();
  }

  if (tkn == tkn_rpar)
  {
    beginTransaction(dbExclusiveLock);
    dbTableDescriptor* oldDesc = findTable(name);

    if (oldDesc != NULL)
    {
      if (create)
      {
        error("Table already exists");
        return false;
      }
    }
    else
    {
      if (!create)
      {
        error("Table not found");
        return false;
      }
    }

    dbTable* table;
    oid_t oid;

    if (create)
    {
      modified = true;
      oid = allocateRow(dbMetaTableId,
                        sizeof(dbTable) + sizeof(dbField)*nFields + varyingLength);
      table = (dbTable*)getRow(oid);
    }
    else
    {
      oid = oldDesc->tableId;
      table = (dbTable*)new char[sizeof(dbTable) + sizeof(dbField)*nFields + varyingLength];
    }

    int offs = sizeof(dbTable) + sizeof(dbField)*nFields;
    table->name.offs = offs;
    table->name.size = strlen(name)+1;
    strcpy((char*)table + offs, name);
    offs += table->name.size;
    size_t size = sizeof(dbRecord);
    table->fields.offs = sizeof(dbTable);
    dbField* field = (dbField*)((char*)table + table->fields.offs);
    offs -= sizeof(dbTable);
    bool arrayComponent = false;

    for (int i = 0; i < nFields; i++)
    {
      field->name.offs = offs;
      field->name.size = strlen(fields[i].name) + 1;
      strcpy((char*)field + offs, fields[i].name);
      offs += field->name.size;

      field->tableName.offs = offs;

      if (fields[i].refTableName)
      {
        field->tableName.size = strlen(fields[i].refTableName) + 1;
        strcpy((char*)field + offs, fields[i].refTableName);
        offs += field->tableName.size;
      }
      else
      {
        field->tableName.size = 1;
        *((char*)field + offs++) = '\0';
      }

      field->inverse.offs = offs;

      if (fields[i].inverseRefName)
      {
        field->inverse.size = strlen(fields[i].inverseRefName) + 1;
        strcpy((char*)field + offs, fields[i].inverseRefName);
        offs += field->inverse.size;
      }
      else
      {
        field->inverse.size = 1;
        *((char*)field + offs++) = '\0';
      }

      field->type = fields[i].type;
      field->size = typeDesc[fields[i].type].size;

      if (!arrayComponent)
      {
        size = DOALIGN(size, typeDesc[fields[i].type].alignment);
        field->offset = size;
        size += field->size;
      }
      else
      {
        field->offset = 0;
      }

      field->hashTable = 0;
      field->tTree = 0;
      arrayComponent = field->type == dbField::tpArray;
      field += 1;
      offs -= sizeof(dbField);
    }

    table->fields.size = nFields;
    table->fixedSize = size;
    table->nRows = 0;
    table->nColumns = nColumns;
    table->firstRow = 0;
    table->lastRow = 0;

    if (create)
    {
      linkTable(new dbTableDescriptor(table), oid);
    }
    else
    {
      dbTableDescriptor* newDesc = new dbTableDescriptor(table);
      delete[] (char*)table;
      dbTable* oldTable = (dbTable*)getRow(oid);

      if (!newDesc->equal(oldTable))
      {
        bool saveConfirmDeleteColumns = confirmDeleteColumns;
        confirmDeleteColumns = true;
        modified = true;
        schemeVersion += 1;
        unlinkTable(oldDesc);

        if (oldTable->nRows == 0)
        {
          updateTableDescriptor(newDesc, oid);
        }
        else
        {
          reformatTable(oid, newDesc);
        }

        delete oldDesc;
        confirmDeleteColumns = saveConfirmDeleteColumns;
      }
    }

    if (!completeDescriptorsInitialization())
    {
      warning("Reference to undefined table");
    }
  }

  return tkn == tkn_rpar;
}

int dbSubSql::parseType(char*& refTableName, char*& inverseFieldName)
{
  switch (scan())
  {

  case tkn_bool:
    return dbField::tpBool;

  case tkn_int1:
    return dbField::tpInt1;

  case tkn_int2:
    return dbField::tpInt2;

  case tkn_int4:
    return dbField::tpInt4;

  case tkn_int8:
    return dbField::tpInt8;

  case tkn_real4:
    return dbField::tpReal4;

  case tkn_real8:
    return dbField::tpReal8;

  case tkn_array:
    return expect("of", tkn_of) ? dbField::tpArray : dbField::tpUnknown;

  case tkn_string:
    return dbField::tpString;

  case tkn_reference:

    if (expect("to", tkn_to) && expect("referenced table name", tkn_ident))
    {
      refTableName = new char[strlen(buf)+1];
      strcpy(refTableName, buf);
      int tkn = scan();

      if (tkn == tkn_inverse)
      {
        if (!expect("inverse reference field name", tkn_ident))
        {
          return dbField::tpUnknown;
        }

        inverseFieldName = new char[strlen(buf)+1];
        strcpy(inverseFieldName, buf);
      }
      else
      {
        inverseFieldName = NULL;
        ungetToken = tkn;
      }

      return dbField::tpReference;
    }
    else
    {
      return dbField::tpUnknown;
    }

  default:
    error("Field type expected");
  }

  return dbField::tpUnknown;
}

int dbSubSql::readExpression()
{
  int i, ch;

  for (i = 0; (ch = get
                      ()) != ';' && ch != ',' && ch != EOF; i++)
    {
      if (i+1 >= buflen)
      {
        char* newbuf = new char[buflen*2];
        memcpy(newbuf, buf, buflen);
        buf = newbuf;
        buflen *= 2;
      }

      buf[i] = ch;
    }

  buf[i] = '\0';
  return ch;
}

bool dbSubSql::readCondition()
{
  int i, ch;

  for (i = 0; (ch = get
                      ()) != ';' && ch !=  EOF; i++)
    {
      if (i+1 >= buflen)
      {
        char* newbuf = new char[buflen*2];
        memcpy(newbuf, buf, buflen);
        buf = newbuf;
        buflen *= 2;
      }

      buf[i] = ch;
    }

  buf[i] = '\0';

  if (ch != ';')
  {
    error("unexpected end of input");
    return false;
  }

  return true;
}


void dbSubSql::dumpRecord(byte* base, dbFieldDescriptor* first)
{
  int i, n;
  byte* elem;
  dbFieldDescriptor* fd = first;

  do
  {
    if (fd != first)
    {
      printf(", ");
    }

    switch (fd->type)
    {

    case dbField::tpBool:
      printf("%s", *(bool*)(base + fd->dbsOffs)
             ? "true" : "false");
      continue;

    case dbField::tpInt1:
      printf("%d", *(int1*)(base + fd->dbsOffs));
      continue;

    case dbField::tpInt2:
      printf("%d", *(int2*)(base + fd->dbsOffs));
      continue;

    case dbField::tpInt4:
      printf("%d", *(int4*)(base + fd->dbsOffs));
      continue;

    case dbField::tpInt8:
      printf(INT8_FORMAT, *(db_int8*)(base + fd->dbsOffs));
      continue;

    case dbField::tpReal4:
      printf("%f", *(real4*)(base + fd->dbsOffs));
      continue;

    case dbField::tpReal8:
      printf("%f", *(real8*)(base + fd->dbsOffs));
      continue;

    case dbField::tpString:
      printf("'%s'", (char*)base+((dbVarying*)(base+fd->dbsOffs))->offs);
      continue;

    case dbField::tpReference:
      printf("#%x", *(oid_t*)(base + fd->dbsOffs));
      continue;

    case dbField::tpRawBinary:
      n = fd->dbsSize;
      elem = base + fd->dbsOffs;
      printf("(");

      for (i = 0; i < n; i++)
      {
        if (i != 0)
        {
          printf(", ");
        }

        printf("%02x", *elem++);
      }

      printf(")");
      continue;

    case dbField::tpArray:
      n = ((dbVarying*)(base + fd->dbsOffs))->size;
      elem = base + ((dbVarying*)(base + fd->dbsOffs))->offs;
      printf("(");

      for (i = 0; i < n; i++)
      {
        if (i != 0)
        {
          printf(", ");
        }

        dumpRecord(elem, fd->components);
        elem += fd->components->dbsSize;
      }

      printf(")");
      continue;

    case dbField::tpStructure:
      printf("(");
      dumpRecord(base, fd->components);
      printf(")");
    }
  }
  while ((fd = fd->next) != first);
}

int dbSubSql::calculateRecordSize(dbList* node, int offs,
                                  dbFieldDescriptor* first)
{
  dbFieldDescriptor* fd = first;

  do
  {
    if (node == NULL)
    {
      return -1;
    }

    if (fd->type == dbField::tpArray)
    {
      if (node->type != dbList::nTuple)
      {
        return -1;
      }

      int nElems = node->aggregate.nComponents;
      offs = DOALIGN(offs, fd->components->alignment)
             + nElems*fd->components->dbsSize;

      if (fd->attr & dbFieldDescriptor::HasArrayComponents)
      {
        dbList* component = node->aggregate.components;

        while (--nElems >= 0)
        {
          int d = calculateRecordSize(component,offs,fd->components);

          if (d < 0)
            return d;

          offs = d;

          component = component->next;
        }
      }
    }
    else if (fd->type == dbField::tpString)
    {
      if (node->type != dbList::nString)
      {
        return -1;
      }

      offs += strlen(node->sval) + 1;
    }
    else if (fd->type == dbField::tpRawBinary)
    {
      if (node->type != dbList::nTuple)
      {
        return -1;
      }

      int nElems = node->aggregate.nComponents;
      dbList* component = node->aggregate.components;

      if (size_t(nElems) > fd->dbsSize)
      {
        return -1;
      }

      while (--nElems >= 0)
      {
        if (component->type != dbList::nInteger
            || (component->ival & ~0xFF) != 0)
        {
          return -1;
        }

        component = component->next;
      }
    }
    else
    {
      if (!((node->type == dbList::nBool && fd->type == dbField::tpBool)
            || (node->type == dbList::nInteger
                && (fd->type == dbField::tpInt1
                    || fd->type == dbField::tpInt2
                    || fd->type == dbField::tpInt4
                    || fd->type == dbField::tpInt8
                    || fd->type == dbField::tpReference))
            || (node->type == dbList::nReal
                && (fd->type == dbField::tpReal4
                    || fd->type == dbField::tpReal8))
            || (node->type == dbList::nTuple
                && fd->type == dbField::tpStructure)))
      {
        return -1;
      }

      if (fd->attr & dbFieldDescriptor::HasArrayComponents)
      {
        int d = calculateRecordSize(node->aggregate.components,
                                    offs, fd->components);

        if (d < 0)
          return d;

        offs = d;
      }
    }

    node = node->next;
  }
  while ((fd = fd->next) != first);

  return offs;
}

bool dbSubSql::isValidOid(oid_t oid)
{
  return oid == 0 ||
         (oid < currIndexSize && (currIndex[oid] & (dbFreeHandleMarker|dbInternalObjectMarker)) == 0);
}

int dbSubSql::initializeRecordFields(dbList* node, byte* dst, int offs,
                                     dbFieldDescriptor* first)
{
  dbFieldDescriptor* fd = first;
  dbList* component;
  byte* elem;
  int len, elemOffs, elemSize;

  do
  {
    if (node->type == dbList::nString && fd->type != dbField::tpString)
    {
      char* s = node->sval;
      long  ival;

      switch (fd->type)
      {

      case dbField::tpBool:
        *(bool*)(dst+fd->dbsOffs) = *s == '1' || *s == 't' || *s == 'T';
        break;

      case dbField::tpInt1:

        if (sscanf(s, "%ld", &ival) != 1)
        {
          return -1;
        }

        *(int1*)(dst+fd->dbsOffs) = (int1)ival;

      case dbField::tpInt2:

        if (sscanf(s, "%ld", &ival) != 1)
        {
          return -1;
        }

        *(int2*)(dst+fd->dbsOffs) = (int2)ival;

      case dbField::tpInt4:

        if (sscanf(s, "%ld", &ival) != 1)
        {
          return -1;
        }

        *(int4*)(dst+fd->dbsOffs) = (int4)ival;

      case dbField::tpInt8:

        if (sscanf(s, "%ld", &ival) != 1)
        {
          return -1;
        }

        *(db_int8*)(dst+fd->dbsOffs) = ival;
        break;

      case dbField::tpReal4:

        if (sscanf(s, "%f", (real4*)(dst+fd->dbsOffs)) != 1)
        {
          return -1;
        }

        break;

      case dbField::tpReal8:

        if (sscanf(s, "%lf", (real8*)(dst+fd->dbsOffs)) != 1)
        {
          return -1;
        }

        break;
      }

#ifdef AUTOINCREMENT_SUPPORT

    }
    else if (node->type == dbList::nAutoinc)
    {
      if (fd->type != dbField::tpInt4)
      {
        *(int4*)(dst+fd->dbsOffs) = fd->defTable->autoincrementCount;
      }
      else
      {
        return -1;
      }

#endif

    }
    else
    {
      switch (fd->type)
      {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
高清不卡在线观看| 日韩一区二区高清| 亚洲成人免费在线| 精品一区二区三区视频在线观看| 中文字幕一区在线观看视频| 久久久.com| 国产精品美女一区二区三区| 亚洲精品日产精品乱码不卡| 日韩精品五月天| 国产一区二区成人久久免费影院 | 欧美日韩不卡一区| 日韩欧美视频在线| 国产精品久久二区二区| 午夜伦欧美伦电影理论片| 久久精品久久精品| 99riav久久精品riav| 在线播放中文一区| 日韩精品一区二区在线| 国产日韩欧美综合一区| 亚洲激情五月婷婷| 国产真实乱偷精品视频免| 99在线视频精品| 日韩精品中午字幕| 一区二区三区色| 成人免费视频国产在线观看| 6080午夜不卡| 国产精品二三区| 国内久久婷婷综合| 欧美日本高清视频在线观看| 国产精品每日更新| 国模套图日韩精品一区二区| 欧美日韩中文一区| 一个色综合网站| 91免费小视频| 亚洲色图视频网站| 成人精品免费看| 国产亚洲欧洲997久久综合| 成人激情动漫在线观看| 欧美一区二区三区视频| 日韩精品三区四区| 欧美日韩另类国产亚洲欧美一级| 亚洲少妇中出一区| 91免费视频观看| 亚洲欧美日本在线| 在线观看亚洲一区| 一区二区三区国产精品| 在线一区二区三区四区五区| 亚洲日本青草视频在线怡红院| 粉嫩一区二区三区在线看| 国产精品视频第一区| 美美哒免费高清在线观看视频一区二区| 成人国产视频在线观看| 中文字幕欧美一区| 91精彩视频在线| 青青草97国产精品免费观看| 欧美一区二区三区的| 韩国精品久久久| 国产精品午夜久久| 91福利在线观看| 亚洲大尺度视频在线观看| 3d动漫精品啪啪1区2区免费 | 亚洲免费av网站| 欧美视频完全免费看| 久久99精品国产91久久来源| 久久久99久久| 欧美系列日韩一区| 久草热8精品视频在线观看| 国产亚洲欧美日韩日本| 欧美精品一区二区三| 成人三级在线视频| 亚洲福利国产精品| 中文av一区特黄| 欧美日本一区二区在线观看| 国产精品一区专区| 午夜精品成人在线视频| 欧美激情在线一区二区| 欧美一区二区三区婷婷月色| av激情成人网| 国产福利一区二区三区视频| 视频一区二区三区在线| 亚洲精品高清在线观看| 久久夜色精品国产欧美乱极品| 欧美亚洲高清一区二区三区不卡| 国内精品久久久久影院薰衣草 | 成人午夜大片免费观看| 天堂午夜影视日韩欧美一区二区| 久久久99久久| 精品1区2区在线观看| 欧美日本不卡视频| 欧美自拍偷拍一区| 91色在线porny| 成人网在线播放| 粉嫩av一区二区三区在线播放| 人人精品人人爱| 日本vs亚洲vs韩国一区三区二区| 亚洲精品v日韩精品| 日韩伦理免费电影| 亚洲人成在线观看一区二区| 亚洲图片另类小说| 成人免费一区二区三区视频| 亚洲欧美日韩在线| 一区二区成人在线观看| 亚洲一本大道在线| 一区二区在线观看免费视频播放| 亚洲精品亚洲人成人网在线播放| 中文字幕一区二区三中文字幕| 国产精品传媒在线| 国产精品久久久久婷婷二区次| 中文字幕日韩一区| 亚洲精品免费在线| 免费不卡在线视频| 狠狠色丁香九九婷婷综合五月| 国产精品99久久久久久久女警| 国产盗摄精品一区二区三区在线| jvid福利写真一区二区三区| 在线精品视频一区二区三四| 在线成人免费视频| 国产欧美一区二区精品婷婷| 亚洲精品视频观看| 韩国视频一区二区| 国产一区免费电影| 国产原创一区二区| 91香蕉视频mp4| 精品国产青草久久久久福利| 欧美激情在线看| 男女男精品视频| 成人av电影在线观看| 91精品久久久久久久91蜜桃 | 成人午夜视频免费看| 欧美视频完全免费看| 国产日韩欧美在线一区| 亚洲自拍偷拍欧美| 国产69精品久久久久777| 精品视频在线免费观看| 国产精品的网站| 狠狠色丁香九九婷婷综合五月| 欧美在线免费观看视频| 欧美激情一区二区| 久久精品国产亚洲a| 欧美日韩国产免费一区二区| 中文字幕国产一区| 韩国一区二区三区| 精品乱人伦小说| 日韩国产一区二| 欧美色大人视频| 一区二区在线观看视频| 99久久精品免费看| 欧美国产97人人爽人人喊| 国产在线播放一区二区三区| 精品少妇一区二区三区免费观看 | 中文字幕在线免费不卡| 国产成人啪免费观看软件| 久久免费偷拍视频| 久久丁香综合五月国产三级网站| 欧美一区永久视频免费观看| 视频一区视频二区中文| 欧美自拍偷拍一区| 综合电影一区二区三区| 成人av电影在线网| 亚洲另类在线视频| 欧美日韩综合不卡| 日本欧美在线看| 久久久亚洲精华液精华液精华液| 国产一区二区三区高清播放| 久久精品亚洲精品国产欧美 | 成人免费毛片片v| 中文字幕欧美三区| 在线观看日韩高清av| 日韩精品一二三四| 久久久91精品国产一区二区精品 | 亚洲欧美激情在线| 欧美无乱码久久久免费午夜一区| 亚洲影院在线观看| 日韩精品专区在线影院重磅| 国产成人啪免费观看软件| 亚洲精品国产无套在线观| 欧美一级免费大片| 成人av电影在线网| 日本欧美一区二区| 1000精品久久久久久久久| 欧美日韩视频一区二区| 国产成a人无v码亚洲福利| 亚洲福利一区二区| 国产精品女上位| 欧美一区二区福利在线| 91视频在线看| 韩国中文字幕2020精品| 水野朝阳av一区二区三区| 久久精品夜夜夜夜久久| 91麻豆精品国产| 色婷婷国产精品| 丁香桃色午夜亚洲一区二区三区| 五月婷婷综合激情| 亚洲一区二三区| 精品久久五月天| 91成人网在线| 不卡的av电影| 成人免费视频播放| 国产91精品入口| 国产精品一区二区视频|