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

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

?? server.cpp

?? FastDb是高效的內存數據庫系統
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
  data += strlen(data) + 1;
  char* fieldName = data;
  data += strlen(data) + 1;
  int newFlags = *data++ & 0xFF;
  int4 response = dbCLI::alter_index(db, tableName, fieldName, newFlags);
  pack4(response);
  return session->sock->write(&response, sizeof response);
}


bool dbServer::select(dbSession* session, int stmt_id, char* msg, bool prepare)
{
  int4 response;
  int i, n_params, tkn, n_columns;
  dbStatement* stmt = findStatement(session, stmt_id);
  dbCursorType cursorType;
  dbTableDescriptor* desc;

  if (prepare)
  {
    if (stmt == NULL)
    {
      stmt = new dbStatement(stmt_id);
      stmt->next = session->stmts;
      session->stmts = stmt;
    }
    else
    {
      stmt->reset();
    }

    stmt->n_params = *msg++;
    stmt->n_columns = n_columns = *msg++;
    stmt->params = new dbParameterBinding[stmt->n_params];
    stmt->firstFetch = true;
    int len = unpack2(msg);
    msg += 2;
    session->scanner.reset(msg);
    char *p, *end = msg + len;

    if (session->scanner.get() != tkn_select)
    {
      response = cli_bad_statement;
      goto return_response;
    }

    if ((tkn = session->scanner.get()) == tkn_all)
    {
      tkn = session->scanner.get();
    }

    if (tkn == tkn_from && session->scanner.get() == tkn_ident)
    {
      if ((desc = db->findTable(session->scanner.ident)) != NULL)
      {
        msg = checkColumns(stmt, n_columns, desc, end, response);

        if (response != cli_ok)
        {
          goto return_response;
        }

        stmt->cursor = new dbAnyCursor(*desc, dbCursorViewOnly, NULL);
        stmt->cursor->setPrefetchMode(false);
      }
      else
      {
        response = cli_table_not_found;
        goto return_response;
      }
    }
    else
    {
      response = cli_bad_statement;
      goto return_response;
    }

    p = session->scanner.p;

    for (i = 0; p < end; i++)
    {
      stmt->query.append(dbQueryElement::qExpression, p);
      p += strlen(p) + 1;

      if (p < end)
      {
        int cliType = *p++;
        static const dbQueryElement::ElementType type_map[] =
          {
            dbQueryElement::qVarReference, // cli_oid
            dbQueryElement::qVarBool,      // cli_bool
            dbQueryElement::qVarInt1,      // cli_int1
            dbQueryElement::qVarInt2,      // cli_int2
            dbQueryElement::qVarInt4,      // cli_int4
            dbQueryElement::qVarInt8,      // cli_int8
            dbQueryElement::qVarReal4,     // cli_real4
            dbQueryElement::qVarReal8,     // cli_real8
            dbQueryElement::qVarStringPtr, // cli_asciiz
            dbQueryElement::qVarStringPtr, // cli_pasciiz
          };

        stmt->params[i].type = cliType;
        stmt->query.append(type_map[cliType], &stmt->params[i].u);
      }
    }
  }
  else
  {
    if (stmt == NULL)
    {
      response = cli_bad_descriptor;
      goto return_response;
    }
  }

  cursorType = *msg++ ? dbCursorForUpdate : dbCursorViewOnly;

  for (i = 0, n_params = stmt->n_params; i < n_params; i++)
  {
    switch (stmt->params[i].type)
    {

    case cli_oid:
      stmt->params[i].u.oid = unpack_oid(msg);
      msg += sizeof(cli_oid_t);
      break;

    case cli_int1:
      stmt->params[i].u.i1 = *msg++;
      break;

    case cli_int2:
      msg = unpack2((char*)&stmt->params[i].u.i2, msg);
      break;

    case cli_int4:
      msg = unpack4((char*)&stmt->params[i].u.i4, msg);
      break;

    case cli_int8:
      msg = unpack8((char*)&stmt->params[i].u.i8, msg);
      break;

    case cli_real4:
      msg = unpack4((char*)&stmt->params[i].u.r4, msg);
      break;

    case cli_real8:
      msg = unpack8((char*)&stmt->params[i].u.r8, msg);
      break;

    case cli_bool:
      stmt->params[i].u.b = *msg++;
      break;

    case cli_asciiz:

    case cli_pasciiz:
      stmt->params[i].u.str = msg;
      msg += strlen(msg) + 1;
      break;

    default:
      response = cli_bad_statement;
      goto return_response;
    }
  }

#ifdef THROW_EXCEPTION_ON_ERROR
  try
  {
    response = stmt->cursor->select(stmt->query, cursorType);
  }
  catch (dbException const& x)
  {
    response = (x.getErrCode() == dbDatabase::QueryError)
               ? cli_bad_statement : cli_runtime_error;
  }

#else
  {
    dbDatabaseThreadContext* ctx = db->threadContext.get();
    ctx->catched = true;
    int errorCode = setjmp(ctx->unwind);

    if (errorCode == 0)
    {
      response = stmt->cursor->select(stmt->query, cursorType);
    }
    else
    {
      response = (errorCode == dbDatabase::QueryError)
                 ? cli_bad_statement : cli_runtime_error;
    }

    ctx->catched = false;
  }
#endif

return_response:
        pack4(response);

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


void dbServer::serveClient()
{
  dbStatement *sp, **spp;
  db->attach();

  while (true)
  {
    dbSession* session;
    {
      dbCriticalSection cs(mutex);

      do
      {
        go.wait(mutex);

        if (cancelWait)
        {
          nIdleThreads -= 1;
          done.signal();
          db->detach();
          return;
        }
      }
      while (waitList == NULL);

      session = waitList;

      waitList = waitList->next;

      session->next = activeList;

      activeList = session;

      nIdleThreads -= 1;

      nActiveThreads += 1;

      waitListLength -= 1;
    }

    cli_request req;
    int4 response = cli_ok;
    bool online = true;

    while (online && session->sock->read(&req, sizeof req))
    {
      req.unpack();
      int length = req.length - sizeof(req);
      dbSmallBuffer msg(length);

      if (length > 0)
      {
        if (!session->sock->read(msg, length))
        {
          break;
        }
      }

      switch(req.cmd)
      {

      case cli_cmd_close_session:

        while (session->dropped_tables != NULL)
        {
          dbTableDescriptor* next = session->dropped_tables->nextDbTable;
          delete session->dropped_tables;
          session->dropped_tables = next;
        }

        db->commit();
        session->in_transaction = false;
        online = false;
        break;

      case cli_cmd_prepare_and_execute:
        online = select(session, req.stmt_id, msg, true);
        session->in_transaction = true;
        break;

      case cli_cmd_execute:
        online = select(session, req.stmt_id, msg, false);
        break;

      case cli_cmd_get_first:
        online = get_first(session, req.stmt_id);
        break;

      case cli_cmd_get_last:
        online = get_last(session, req.stmt_id);
        break;

      case cli_cmd_get_next:
        online = get_next(session, req.stmt_id);
        break;

      case cli_cmd_get_prev:
        online = get_prev(session, req.stmt_id);
        break;

      case cli_cmd_skip:
        online = skip(session, req.stmt_id, msg);
        break;

      case cli_cmd_seek:
        online = seek(session, req.stmt_id, msg);
        break;

      case cli_cmd_freeze:
        online = freeze(session, req.stmt_id);
        break;

      case cli_cmd_unfreeze:
        online = unfreeze(session, req.stmt_id);
        break;

      case cli_cmd_free_statement:

        for (spp = &session->stmts; (sp = *spp) != NULL; spp = &sp->next)
        {
          if (sp->id == req.stmt_id)
          {
            *spp = sp->next;
            delete sp;
            break;
          }
        }

        break;

      case cli_cmd_abort:

        while (session->dropped_tables != NULL)
        {
          dbTableDescriptor* next = session->dropped_tables->nextDbTable;
          db->linkTable(session->dropped_tables, session->dropped_tables->tableId);
          session->dropped_tables = next;
        }

        if (session->existed_tables != NULL)
        {
          while (db->tables != session->existed_tables)
          {
            dbTableDescriptor* table = db->tables;
            db->unlinkTable(table);
            delete table;
          }

          session->existed_tables = NULL;
        }

        db->rollback();
        session->in_transaction = false;
        online = session->sock->write(&response, sizeof response);
        break;

      case cli_cmd_commit:

        while (session->dropped_tables != NULL)
        {
          dbTableDescriptor* next = session->dropped_tables->nextDbTable;
          delete session->dropped_tables;
          session->dropped_tables = next;
        }

        session->existed_tables = NULL;
        db->commit();
        session->in_transaction = false;
        online = session->sock->write(&response, sizeof response);
        break;

      case cli_cmd_precommit:
        db->precommit();
        online = session->sock->write(&response, sizeof response);
        break;

      case cli_cmd_update:
        update(session, req.stmt_id, msg);
        break;

      case cli_cmd_remove:

        remove
          (session, req.stmt_id);

        break;

      case cli_cmd_prepare_and_insert:
        insert(session, req.stmt_id, msg, true);

        session->in_transaction = true;

        break;

      case cli_cmd_insert:
        insert(session, req.stmt_id, msg, false);

        break;

      case cli_cmd_describe_table:
        describe_table(session, (char*)msg);

        break;

      case cli_cmd_show_tables:
        show_tables(session);

        break;

      case cli_cmd_create_table:
        online = create_table(session, msg);

        break;

      case cli_cmd_drop_table:
        online = drop_table(session, msg);

        break;

      case cli_cmd_alter_index:
        online = alter_index(session, msg);

        break;
      }
    }

    if (session->in_transaction)
    {
      while (session->dropped_tables != NULL)
      {
        dbTableDescriptor* next = session->dropped_tables->nextDbTable;
        db->linkTable(session->dropped_tables, session->dropped_tables->tableId);
        session->dropped_tables = next;
      }

      if (session->existed_tables != NULL)
      {
        while (db->tables != session->existed_tables)
        {
          dbTableDescriptor* table = db->tables;
          db->unlinkTable(table);
          delete table;
        }

        session->existed_tables = NULL;
      }

      db->rollback();
    }

    // Finish session
    {
      dbCriticalSection cs(mutex);
      dbSession** spp;
      delete session->sock;

      for (spp = &activeList; *spp != session; spp = &(*spp)->next)

        ;
      *spp = session->next;

      session->next = freeList;

      freeList = session;

      nActiveThreads -= 1;

      if (cancelSession)
      {
        done.signal();
        break;
      }

      if (nActiveThreads + nIdleThreads >= optimalNumberOfThreads)
      {
        break;
      }

      nIdleThreads += 1;
    }
  }

  db->detach();
}

void dbServer::acceptConnection(socket_t* acceptSock)
{
  while (true)
  {
    socket_t* sock = acceptSock->accept();
    dbCriticalSection cs(mutex);

    if (cancelAccept)
    {
      return;
    }

    if (sock != NULL)
    {
      if (freeList == NULL)
      {
        freeList = new dbSession;
        freeList->next = NULL;
      }

      dbSession* session = freeList;
      freeList = session->next;
      session->sock = sock;
      session->stmts = NULL;
      session->next = waitList;
      session->in_transaction = false;
      session->existed_tables = NULL;
      session->dropped_tables = NULL;
      waitList = session;
      waitListLength += 1;

      if (nIdleThreads < waitListLength)
      {
        dbThread thread;
        nIdleThreads += 1;
        thread.create(serverThread, this);
        thread.detach();
      }

      go.signal();
    }
  }
}

dbServer::~dbServer()
{
  dbServer** spp;

  for (spp = &chain; *spp != this; spp = &(*spp)->next)

    ;
  *spp = next;

  delete globalAcceptSock;

  delete localAcceptSock;

  delete[] URL;
}





?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人午夜精品影院观看视频| 中文字幕一区二区三区色视频 | 亚洲人成在线观看一区二区| wwwwxxxxx欧美| 久久精品网站免费观看| 久久精品综合网| 国产女人18毛片水真多成人如厕 | 亚洲品质自拍视频| 一区二区三区国产精华| 亚洲一区二区影院| 午夜精品一区在线观看| 久久精品国产99国产精品| 日韩在线卡一卡二| 国产一区二区中文字幕| 国产98色在线|日韩| 色综合久久中文综合久久牛| 欧美人牲a欧美精品| 久久久久久日产精品| 国产精品第13页| 樱花草国产18久久久久| 日日夜夜免费精品视频| 精品在线视频一区| 国产福利一区二区三区视频在线| 高清国产一区二区| 色噜噜狠狠色综合中国| 5566中文字幕一区二区电影| 日韩欧美二区三区| 久久―日本道色综合久久| 国产精品婷婷午夜在线观看| 一区二区三区欧美在线观看| 欧美aaa在线| 99久久国产综合精品麻豆| 69精品人人人人| 中文字幕第一区| 午夜亚洲福利老司机| 国产又粗又猛又爽又黄91精品| 成人av集中营| 欧美日韩国产不卡| 国产欧美视频一区二区三区| 亚洲影院在线观看| 国产一区二区剧情av在线| aaa国产一区| 欧美精品一区二区三区在线播放| 亚洲欧美日韩人成在线播放| 国产精品一区在线观看你懂的| 91成人在线观看喷潮| 久久久久国产精品麻豆ai换脸| 日本vs亚洲vs韩国一区三区二区| 成人黄色一级视频| 精品久久久久久久久久久久久久久 | 欧美系列亚洲系列| 中文字幕精品一区| 国产一区二区三区四区五区入口| 欧美亚洲一区二区在线| 国产精品国产三级国产普通话99| 精品一区二区三区在线播放| 欧美日韩国产中文| 一区二区三区四区中文字幕| 成人黄色电影在线| 国产欧美日韩精品在线| 国产精品影视网| 欧美电影免费观看完整版| 日本美女一区二区| 欧美一三区三区四区免费在线看| 亚洲一区二区黄色| 色综合中文字幕国产| 久久精品视频在线看| 久久er精品视频| 日韩免费看的电影| 日韩av在线发布| 欧美一级欧美一级在线播放| 青青草精品视频| 日韩一区二区三区在线视频| 蜜桃久久av一区| 日韩午夜精品电影| 狠狠色2019综合网| 久久久精品免费网站| 国产成人免费在线视频| 国产人成一区二区三区影院| 国产99久久久精品| 亚洲视频免费看| 色综合久久综合网97色综合| 亚洲一本大道在线| 欧美一区国产二区| 精品一区二区三区在线视频| 国产日韩欧美a| 91欧美一区二区| 亚洲美女在线国产| 91麻豆精品国产91久久久久久 | 日韩欧美激情四射| 国产精品一级二级三级| 中文字幕视频一区二区三区久| 99国产欧美久久久精品| 亚洲成人7777| 精品不卡在线视频| 99精品视频在线观看| 午夜精品国产更新| 国产日产欧美一区二区视频| 91丨九色丨国产丨porny| 亚洲在线成人精品| 亚洲精品一区二区三区精华液| av一本久道久久综合久久鬼色| 亚洲高清三级视频| 久久久亚洲精华液精华液精华液 | 久久国产欧美日韩精品| 国产日韩一级二级三级| 欧美制服丝袜第一页| 狠狠色丁香久久婷婷综合丁香| 亚洲欧美乱综合| 精品国产青草久久久久福利| 99久久久精品| 精品在线亚洲视频| 亚洲一区二区三区爽爽爽爽爽| 精品乱人伦一区二区三区| 色综合天天在线| 国产成人高清在线| 午夜视频在线观看一区二区三区| 久久久午夜电影| 欧美精品一级二级三级| 成人一区在线观看| 日本中文字幕不卡| 亚洲柠檬福利资源导航| 日韩精品专区在线| 日本高清不卡一区| 国产高清不卡一区| 日韩电影免费在线| 亚洲乱码一区二区三区在线观看| 精品奇米国产一区二区三区| 在线看国产一区二区| 国产91露脸合集magnet| 日本欧美在线观看| 亚洲精品自拍动漫在线| 国产欧美一区二区在线观看| 欧美福利电影网| 91成人免费网站| www.亚洲国产| 国产经典欧美精品| 国产真实乱对白精彩久久| 性感美女久久精品| 夜夜精品视频一区二区| 亚洲视频一区二区在线| 国产欧美1区2区3区| 精品国产91亚洲一区二区三区婷婷| 欧美写真视频网站| 在线观看亚洲一区| 在线观看免费亚洲| eeuss国产一区二区三区| 国产1区2区3区精品美女| 国产乱子伦一区二区三区国色天香| 美女视频网站久久| 久久疯狂做爰流白浆xx| 另类成人小视频在线| 奇米色777欧美一区二区| 日韩电影在线观看电影| 天使萌一区二区三区免费观看| 亚洲黄色在线视频| 一区二区久久久久久| 亚洲v精品v日韩v欧美v专区| 亚洲成av人影院| 日韩国产一区二| 美腿丝袜在线亚洲一区| 免费成人av在线| 久久超碰97人人做人人爱| 美女脱光内衣内裤视频久久网站 | 国产日韩av一区| 国产精品萝li| 一片黄亚洲嫩模| 亚洲成av人影院在线观看网| 天天亚洲美女在线视频| 美女脱光内衣内裤视频久久影院| 久久国产麻豆精品| 国产精品99久| 色综合天天综合网天天狠天天| 欧美日韩欧美一区二区| 日韩欧美视频在线| 国产精品久久久久久久岛一牛影视| 国产精品女人毛片| 亚洲综合在线免费观看| 日韩不卡免费视频| 国产高清不卡一区| 欧洲一区二区av| 欧美不卡一区二区三区四区| 国产欧美日韩另类一区| 亚洲一区二区三区免费视频| 日韩av一区二区三区四区| 国产福利精品一区二区| 欧美在线观看视频一区二区| 日韩一区二区在线免费观看| 日本一区二区三区久久久久久久久不| 国产精品热久久久久夜色精品三区 | 国产传媒久久文化传媒| 色悠悠久久综合| 欧美一级在线观看| 亚洲日本一区二区| 久久精品国产一区二区三区免费看 | 久久电影网电视剧免费观看| 99久久99久久久精品齐齐| 日韩一区二区三区视频| 亚洲欧洲精品成人久久奇米网| 青青草国产精品97视觉盛宴|