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

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

?? server.cpp

?? FastDb是高效的內存數據庫系統
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
bool dbServer::unfreeze(dbSession* session, int stmt_id)
{
  dbStatement* stmt = findStatement(session, stmt_id);
  int4 response = cli_ok;

  if (stmt == NULL || stmt->cursor == NULL)
  {
    response = cli_bad_descriptor;
  }
  else
  {
    stmt->cursor->unfreeze();
  }

  pack4(response);
  return session->sock->write(&response, sizeof response);
}

bool dbServer::get_first(dbSession* session, int stmt_id)
{
  dbStatement* stmt = findStatement(session, stmt_id);
  int4 response;

  if (stmt == NULL || stmt->cursor == NULL)
  {
    response = cli_bad_descriptor;
  }
  else if (!stmt->cursor->gotoFirst())
  {
    response = cli_not_found;
  }
  else
  {
    return fetch(session, stmt);
  }

  pack4(response);
  return session->sock->write(&response, sizeof response);
}

bool dbServer::get_last(dbSession* session, int stmt_id)
{
  dbStatement* stmt = findStatement(session, stmt_id);
  int4 response;

  if (stmt == NULL || stmt->cursor == NULL)
  {
    response = cli_bad_descriptor;
  }
  else if (!stmt->cursor->gotoLast())
  {
    response = cli_not_found;
  }
  else
  {
    return fetch(session, stmt);
  }

  pack4(response);
  return session->sock->write(&response, sizeof response);
}

bool dbServer::get_next(dbSession* session, int stmt_id)
{
  dbStatement* stmt = findStatement(session, stmt_id);
  int4 response;

  if (stmt == NULL || stmt->cursor == NULL)
  {
    response = cli_bad_descriptor;
  }
  else if (!((stmt->firstFetch && stmt->cursor->gotoFirst()) ||
             (!stmt->firstFetch && stmt->cursor->gotoNext())))
  {
    response = cli_not_found;
  }
  else
  {
    return fetch(session, stmt);
  }

  pack4(response);
  return session->sock->write(&response, sizeof response);
}

bool dbServer::get_prev(dbSession* session, int stmt_id)
{
  dbStatement* stmt = findStatement(session, stmt_id);
  int4 response;

  if (stmt == NULL || stmt->cursor == NULL)
  {
    response = cli_bad_descriptor;
  }
  else if (!((stmt->firstFetch && stmt->cursor->gotoLast()) ||
             (!stmt->firstFetch && stmt->cursor->gotoPrev())))
  {
    response = cli_not_found;
  }
  else
  {
    return fetch(session, stmt);
  }

  pack4(response);
  return session->sock->write(&response, sizeof response);
}


bool dbServer::skip(dbSession* session, int stmt_id, char* buf)
{
  dbStatement* stmt = findStatement(session, stmt_id);
  int4 response;

  if (stmt == NULL || stmt->cursor == NULL)
  {
    response = cli_bad_descriptor;
  }
  else
  {
    int n = unpack4(buf);

    if ((n > 0 && !((stmt->firstFetch && stmt->cursor->gotoFirst() && stmt->cursor->skip(n-1)
                     || (!stmt->firstFetch && stmt->cursor->skip(n)))))
        || (n < 0 && !((stmt->firstFetch && stmt->cursor->gotoLast() && stmt->cursor->skip(n+1)
                        || (!stmt->firstFetch && stmt->cursor->skip(n))))))
    {
      response = cli_not_found;
    }
    else
    {
      return fetch(session, stmt);
    }
  }

  pack4(response);
  return session->sock->write(&response, sizeof response);
}

bool dbServer::seek(dbSession* session, int stmt_id, char* buf)
{
  dbStatement* stmt = findStatement(session, stmt_id);
  int4 response;

  if (stmt == NULL || stmt->cursor == NULL)
  {
    response = cli_bad_descriptor;
  }
  else
  {
    oid_t oid = unpack_oid(buf);
    int pos = stmt->cursor->seek(oid);

    if (pos < 0)
    {
      response = cli_not_found;
    }
    else
    {
      return fetch(session, stmt, pos);
    }
  }

  pack4(response);
  return session->sock->write(&response, sizeof response);
}

bool dbServer::fetch(dbSession* session, dbStatement* stmt, oid_t result)
{
  int4 response;
  dbColumnBinding* cb;

  stmt->firstFetch = false;

  if (stmt->cursor->isEmpty())
  {
    response = cli_not_found;
    pack4(response);
    return session->sock->write(&response, sizeof response);
  }

  int msg_size = sizeof(cli_oid_t) + 4;
  char* data = (char*)db->getRow(stmt->cursor->currId);

  for (cb = stmt->columns; cb != NULL; cb = cb->next)
  {
    if (cb->cliType == cli_autoincrement)
    {
      msg_size += 4;
    }
    else if (cb->cliType >= cli_array_of_oid)
    {
      msg_size += 4 + ((dbVarying*)(data + cb->fd->dbsOffs))->size
                  * sizeof_type[cb->cliType - cli_array_of_oid];
    }
    else if (cb->cliType >= cli_asciiz)
    {
      msg_size += 4 + ((dbVarying*)(data + cb->fd->dbsOffs))->size;
    }
    else
    {
      msg_size += sizeof_type[cb->cliType];
    }
  }

  if (stmt->buf_size < msg_size)
  {
    delete[] stmt->buf;
    stmt->buf = new char[msg_size];
    stmt->buf_size = msg_size;
  }

  char* p = stmt->buf;
  p = pack4(p, msg_size);
  p = pack_oid(p, result);

  for (cb = stmt->columns; cb != NULL; cb = cb->next)
  {
    char* src = data + cb->fd->dbsOffs;

    switch (cb->fd->type)
    {

    case dbField::tpBool:

    case dbField::tpInt1:

      switch (sizeof_type[cb->cliType])
      {

      case 1:
        *p++ = *src;
        break;

      case 2:
        p = pack2(p, (int2)*(char*)src);
        break;

      case 4:
        p = pack4(p, (int4)*(char*)src);
        break;

      case 8:
        p = pack8(p, (db_int8)*(char*)src);
        break;

      default:
        assert(false);
      }

      break;

    case dbField::tpInt2:

      switch (sizeof_type[cb->cliType])
      {

      case 1:
        *p++ = (char)*(int2*)src;
        break;

      case 2:
        p = pack2(p, src);
        break;

      case 4:
        p = pack4(p, (int4)*(int2*)src);
        break;

      case 8:
        p = pack8(p, (db_int8)*(int2*)src);
        break;

      default:
        assert(false);
      }

      break;

    case dbField::tpInt4:

      switch (sizeof_type[cb->cliType])
      {

      case 1:
        *p++ = (char)*(int4*)src;
        break;

      case 2:
        p = pack2(p, (int2)*(int4*)src);
        break;

      case 4:
        p = pack4(p, src);
        break;

      case 8:
        p = pack8(p, (db_int8)*(int4*)src);
        break;

      default:
        assert(false);
      }

      break;

    case dbField::tpInt8:

      switch (sizeof_type[cb->cliType])
      {

      case 1:
        *p++ = (char)*(db_int8*)src;
        break;

      case 2:
        p = pack2(p, (int2)*(db_int8*)src);
        break;

      case 4:
        p = pack4(p, (int4)*(db_int8*)src);
        break;

      case 8:
        p = pack8(p, src);
        break;

      default:
        assert(false);
      }

      break;

    case dbField::tpReal4:

      switch (cb->cliType)
      {

      case cli_real4:
        p = pack4(p, src);
        break;

      case cli_real8:
        {
          real8 temp = *(real4*)src;
          p = pack8(p, (char*)&temp);
        }

        break;

      default:
        assert(false);
      }

      break;

    case dbField::tpReal8:

      switch (cb->cliType)
      {

      case cli_real4:
        {
          real4 temp = (real4)*(real8*)src;
          p = pack4(p, (char*)&temp);
        }

        break;

      case cli_real8:
        p = pack8(p, src);
        break;

      default:
        assert(false);
      }

      break;

    case dbField::tpString:
      {
        dbVarying* v = (dbVarying*)src;
        p = pack4(p, v->size);
        memcpy(p, data + v->offs, v->size);
        p += v->size;
      }

      break;

    case dbField::tpReference:
      p = pack_oid(p, *(oid_t*)src);
      break;

    case dbField::tpArray:
      {
        dbVarying* v = (dbVarying*)src;
        int n = v->size;
        p = pack4(p, n);
        src = data + v->offs;

        switch (sizeof_type[cb->cliType-cli_array_of_oid])
        {

        case 2:

          while (--n >= 0)
          {
            p = pack2(p, src);
            src += 2;
          }

          break;

        case 4:

          while (--n >= 0)
          {
            p = pack4(p, src);
            src += 4;
          }

          break;

        case 8:

          while (--n >= 0)
          {
            p = pack8(p, src);
            src += 8;
          }

          break;

        default:
          memcpy(p, src, n);
          p += n;
        }

        break;
      }

    default:
      assert(false);
    }
  }

  assert(p - stmt->buf == msg_size);
  return session->sock->write(stmt->buf, msg_size);
}

bool dbServer::remove
  (dbSession* session, int stmt_id)
{
  dbStatement* stmt = findStatement(session, stmt_id);
  int4 response;

  if (stmt == NULL)
  {
    response = cli_bad_descriptor;
  }
  else
  {
    if (stmt->cursor->isEmpty())
    {
      response = cli_not_found;
    }
    else
    {
      stmt->cursor->removeAllSelected();
      response = cli_ok;
    }
  }

  pack4(response);
  return session->sock->write(&response, sizeof response);
}

bool dbServer::update(dbSession* session, int stmt_id, char* new_data)
{
  dbStatement* stmt = findStatement(session, stmt_id);
  dbColumnBinding* cb;
  int4 response;

  if (stmt == NULL)
  {
    response = cli_bad_descriptor;
    pack4(response);
    return session->sock->write(&response, sizeof response);
  }

  if (stmt->cursor->isEmpty())
  {
    response = cli_not_found;
    pack4(response);
    return session->sock->write(&response, sizeof response);
  }

  char* old_data = stmt->buf + sizeof(cli_oid_t) + 4;

  for (cb = stmt->columns; cb != NULL; cb = cb->next)
  {
    cb->ptr = new_data;

    if (cb->cliType >= cli_asciiz)
    {
      int new_len = unpack4(new_data);
      int old_len = unpack4(old_data);
      cb->len = new_len;

      if (cb->fd->indexType & (HASHED|INDEXED)
          && memcmp(new_data, old_data, new_len+4) != 0)
      {
        cb->fd->attr |= dbFieldDescriptor::Updated;
      }

      if (cb->cliType >= cli_array_of_oid)
      {
        new_len *= sizeof_type[cb->cliType - cli_array_of_oid];
        old_len *= sizeof_type[cb->cliType - cli_array_of_oid];
      }

      new_data += 4 + new_len;
      old_data += 4 + old_len;
    }
    else
    {
      int size = sizeof_type[cb->cliType];

      if (cb->fd->indexType & (HASHED|INDEXED)
          && memcmp(new_data, old_data, size) != 0)
      {
        cb->fd->attr |= dbFieldDescriptor::Updated;
      }

      new_data += size;
      old_data += size;
    }
  }

  db->beginTransaction(dbDatabase::dbExclusiveLock);

  dbRecord* rec = db->getRow(stmt->cursor->currId);
  dbTableDescriptor* table = stmt->query.table;
  dbFieldDescriptor *first = table->columns, *fd = first;
  size_t offs = table->fixedSize;

  do
  {
    if (fd->type == dbField::tpArray || fd->type == dbField::tpString)
    {
      int len = ((dbVarying*)((char*)rec + fd->dbsOffs))->size;

      for (cb = stmt->columns; cb != NULL; cb = cb->next)
      {
        if (cb->fd == fd)
        {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
波多野结衣欧美| 亚洲成a人片在线不卡一二三区| 欧美色网站导航| 在线亚洲一区二区| 色狠狠综合天天综合综合| 色综合久久九月婷婷色综合| av激情亚洲男人天堂| 91丨porny丨国产入口| 91香蕉国产在线观看软件| 天天影视色香欲综合网老头| 国产精品三级在线观看| 最新不卡av在线| 日本美女一区二区| 精品一区二区三区欧美| 成人精品亚洲人成在线| 91蜜桃婷婷狠狠久久综合9色| 91国产丝袜在线播放| 欧美一区二区三区在线看| 久久久久久99精品| 亚洲乱码国产乱码精品精的特点 | 国产精品久久久久毛片软件| 亚洲人成网站在线| 国内精品伊人久久久久av影院| 国产精品自在在线| 在线亚洲精品福利网址导航| 欧美大片在线观看一区| 亚洲激情av在线| 国产成人午夜视频| 亚洲精品在线免费观看视频| 亚洲欧美另类小说| 成人免费视频国产在线观看| 91精品国产高清一区二区三区蜜臀| 国产欧美日韩三级| 久久精品99久久久| 欧美一区二区三区免费观看视频| 亚洲欧美电影院| 99精品久久99久久久久| 欧美日韩精品久久久| 久久久久久亚洲综合| 蜜桃传媒麻豆第一区在线观看| 日本道精品一区二区三区| 中文幕一区二区三区久久蜜桃| 亚洲一区二区三区四区在线| 99精品视频在线观看免费| 国产欧美一区二区精品性色| 国产一区二三区| 欧美大黄免费观看| 国产一区二区在线电影| 精品国精品国产| 国产真实乱子伦精品视频| 日韩美女视频一区二区在线观看| 日本视频中文字幕一区二区三区| 欧美视频第二页| 麻豆精品视频在线观看| 久久综合九色综合欧美98| 国产成人综合亚洲网站| 亚洲欧洲日韩在线| 欧美日韩一区精品| 国产一区视频网站| 亚洲另类春色国产| 91精品国产品国语在线不卡| 国产美女av一区二区三区| 国产精品嫩草99a| 91麻豆精品国产91久久久久久久久 | 国产精品嫩草影院com| 国产成人亚洲综合a∨婷婷图片 | 午夜久久久久久久久| 欧美一级精品在线| 色综合久久综合网97色综合| 婷婷一区二区三区| 国产精品的网站| 欧美电影免费观看高清完整版| 狠狠色丁香久久婷婷综| 国产午夜久久久久| 欧美喷水一区二区| 色噜噜狠狠一区二区三区果冻| 男女视频一区二区| 亚洲成人中文在线| 日韩一区在线看| 日本一区二区三区电影| 欧美猛男超大videosgay| 成人aaaa免费全部观看| 国产精品资源网站| 精品一区二区三区久久| 亚洲国产一区视频| 亚洲国产va精品久久久不卡综合| 亚洲国产高清aⅴ视频| 精品88久久久久88久久久| 欧美不卡视频一区| 欧美一区二区成人| 日韩免费看的电影| 欧美激情一区二区在线| 精品少妇一区二区三区在线视频| 欧美日韩国产一区| 日韩一区二区在线观看视频| 欧美久久久久久蜜桃| 在线播放中文一区| 4438成人网| 精品国产sm最大网站免费看| 欧美v国产在线一区二区三区| 91国产成人在线| 国产精品国产三级国产aⅴ入口| 久久综合色天天久久综合图片| 7777精品伊人久久久大香线蕉完整版 | 欧美激情在线免费观看| 国产亲近乱来精品视频 | 国产精品嫩草影院av蜜臀| 亚洲特级片在线| 日本不卡一区二区| 日本91福利区| 成人黄色在线网站| 91福利区一区二区三区| 91免费版pro下载短视频| 欧美一级日韩不卡播放免费| 精品sm在线观看| 亚洲精品大片www| 毛片av一区二区三区| 一本到不卡免费一区二区| 3atv在线一区二区三区| 国产精品天天看| 午夜精品久久久久久久99樱桃| 三级欧美在线一区| 成人av电影在线观看| 欧美精品丝袜中出| 国产精品乱码一区二三区小蝌蚪| 午夜精品一区二区三区免费视频 | 国产成人a级片| 欧美色爱综合网| 久久久久久久一区| 久久99热国产| 色综合天天综合在线视频| 欧美影院精品一区| 欧美激情综合五月色丁香小说| 青娱乐精品视频在线| 在线观看不卡视频| 国产精品丝袜黑色高跟| 午夜精品福利在线| 欧美日韩视频在线一区二区| 国产精品久久网站| www.欧美色图| 1000部国产精品成人观看| 国产盗摄精品一区二区三区在线| 国产欧美综合在线| 国产mv日韩mv欧美| 国产欧美日韩激情| 成人精品免费网站| 国产精品电影一区二区三区| 不卡一卡二卡三乱码免费网站| 精品盗摄一区二区三区| 国产真实乱子伦精品视频| 欧美一级爆毛片| 成人国产精品视频| 亚洲欧洲日韩一区二区三区| 国产+成+人+亚洲欧洲自线| 精品国产乱码久久久久久蜜臀| 一区二区国产盗摄色噜噜| 日韩一级免费观看| 麻豆国产精品777777在线| www成人在线观看| 成人一级片网址| 首页国产欧美日韩丝袜| 国产亚洲va综合人人澡精品 | 全部av―极品视觉盛宴亚洲| 精品精品欲导航| 成人av免费在线| 秋霞影院一区二区| 亚洲免费av高清| 精品国产自在久精品国产| 日本乱人伦一区| 亚洲午夜免费视频| 久久久久久久久蜜桃| 91亚洲男人天堂| 国产白丝精品91爽爽久久| 自拍偷拍亚洲欧美日韩| 中文字幕欧美激情一区| 日韩午夜电影在线观看| 色呦呦国产精品| 国产在线视频一区二区三区| 蜜桃传媒麻豆第一区在线观看| 亚洲精品第1页| 亚洲欧美欧美一区二区三区| 欧美区在线观看| 欧美一级专区免费大片| 国产一区二区三区日韩| 亚洲成年人影院| 亚洲综合偷拍欧美一区色| 国产精品理伦片| 国产欧美日本一区二区三区| 在线日韩av片| 欧美一级日韩不卡播放免费| 欧美日韩一区二区三区在线 | 国产精品中文欧美| 久久电影网站中文字幕 | 欧美在线免费播放| 337p亚洲精品色噜噜| 欧美xingq一区二区| 国产三级精品三级| 亚洲一区二区四区蜜桃| 亚洲国产精品久久不卡毛片| 麻豆视频观看网址久久|