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

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

?? server.cpp

?? FastDb是高效的內存數據庫系統
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
//-< SERVER.CPP >----------------------------------------------------*--------*
// FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *
// (Main Memory Database Management System)                          *   /\|  *
//                                                                   *  /  \  *
//                          Created:     13-Jan-2000 K.A. Knizhnik   * / [] \ *
//                          Last update: 13-Jan-2000 K.A. Knizhnik   * GARRET *
//-------------------------------------------------------------------*--------*
// CLI multithreaded server implementation
//-------------------------------------------------------------------*--------*

#include <ctype.h>
#include "fastdb.h"
#include "compiler.h"
#include "wwwapi.h"
#include "subsql.h"
#include "symtab.h"
#include "hashtab.h"
#include "ttree.h"
#include "cli.h"
#include "cliproto.h"
#include "server.h"
#include "localcli.h"

#if !THREADS_SUPPORTED
#error Server requires multithreading support
#endif

int dbColumnBinding::unpackArray(char* dst, size_t offs)
{
  int len = this->len;
  int i;

  if (cliType >= cli_array_of_oid)
  {
    switch (sizeof_type[cliType - cli_array_of_oid])
    {

    case 1:
      memcpy(dst + offs, ptr + 4, len);
      break;

    case 2:

      for (i = 0; i < len; i++)
      {
        unpack2(dst + offs + i*2, ptr + 4 + i*2);
      }

      break;

    case 4:

      for (i = 0; i < len; i++)
      {
        unpack4(dst + offs + i*4, ptr + 4 + i*4);
      }

      break;

    case 8:

      for (i = 0; i < len; i++)
      {
        unpack8(dst + offs + i*8, ptr + 4 + i*8);
      }

      break;

    default:
      assert(false);
    }
  }
  else
  { // string
    memcpy(dst + offs, ptr + 4, len);
  }

  return len;
}

void dbColumnBinding::unpackScalar(char* dst)
{
  if (cliType == cli_autoincrement)
  {
    assert(fd->type == dbField::tpInt4);
#ifdef AUTOINCREMENT_SUPPORT

    *(int4*)(dst+fd->dbsOffs) = fd->defTable->autoincrementCount;
#else

    *(int4*)(dst+fd->dbsOffs) = ((dbTable*)fd->defTable->db->getRow(fd->defTable->tableId))->nRows;
#endif

    return;
  }

  switch (fd->type)
  {

  case dbField::tpBool:

  case dbField::tpInt1:

    switch (sizeof_type[cliType])
    {

    case 1:
      *(dst + fd->dbsOffs) = *ptr;
      break;

    case 2:
      *(dst + fd->dbsOffs) = (char)unpack2(ptr);
      break;

    case 4:
      *(dst + fd->dbsOffs) = (char)unpack4(ptr);
      break;

    case 8:
      *(dst + fd->dbsOffs) = (char)unpack8(ptr);
      break;

    default:
      assert(false);
    }

    break;

  case dbField::tpInt2:

    switch (sizeof_type[cliType])
    {

    case 1:
      *(int2*)(dst+fd->dbsOffs) = *ptr;
      break;

    case 2:
      unpack2(dst+fd->dbsOffs, ptr);
      break;

    case 4:
      *(int2*)(dst+fd->dbsOffs) = (int2)unpack4(ptr);
      break;

    case 8:
      *(int2*)(dst+fd->dbsOffs) = (int2)unpack8(ptr);
      break;

    default:
      assert(false);
    }

    break;

  case dbField::tpInt4:

    switch (sizeof_type[cliType])
    {

    case 1:
      *(int4*)(dst+fd->dbsOffs) = *ptr;
      break;

    case 2:
      *(int4*)(dst+fd->dbsOffs) = unpack2(ptr);
      break;

    case 4:
      unpack4(dst+fd->dbsOffs, ptr);
      break;

    case 8:
      *(int4*)(dst+fd->dbsOffs) = (int4)unpack8(ptr);
      break;

    default:
      assert(false);
    }

    break;

  case dbField::tpInt8:

    switch (sizeof_type[cliType])
    {

    case 1:
      *(db_int8*)(dst+fd->dbsOffs) = *ptr;
      break;

    case 2:
      *(db_int8*)(dst+fd->dbsOffs) = unpack2(ptr);
      break;

    case 4:
      *(db_int8*)(dst+fd->dbsOffs) = unpack4(ptr);
      break;

    case 8:
      unpack8(dst+fd->dbsOffs, ptr);
      break;

    default:
      assert(false);
    }

    break;

  case dbField::tpReal4:

    switch (cliType)
    {

    case cli_real4:
      unpack4(dst+fd->dbsOffs, ptr);
      break;

    case cli_real8:
      {
        real8 temp;
        unpack8((char*)&temp, ptr);
        *(real4*)(dst + fd->dbsOffs) = (real4)temp;
      }

      break;

    default:
      assert(false);
    }

    break;

  case dbField::tpReal8:

    switch (cliType)
    {

    case cli_real4:
      {
        real4 temp;
        unpack4((char*)&temp, ptr);
        *(real8*)(dst + fd->dbsOffs) = temp;
      }

      break;

    case cli_real8:
      unpack8(dst+fd->dbsOffs, ptr);
      break;

    default:
      assert(false);
    }

    break;

  default:
    assert(false);
  }
}

void dbStatement::reset()
{
  dbColumnBinding *cb, *next;

  for (cb = columns; cb != NULL; cb = next)
  {
    next = cb->next;
    delete cb;
  }

  columns = NULL;
  delete[] params;
  params = NULL;
  delete cursor;
  cursor = NULL;
  query.reset();
  table = NULL;
}

int dbQueryScanner::get
  ()
{
  int i = 0, ch, digits;

  do
  {
    if ((ch = *p++) == '\0')
    {
      return tkn_eof;
    }
  }
  while (isspace(ch));

  if (ch == '*')
  {
    return tkn_all;
  }
  else if (isdigit(ch) || ch == '+' || ch == '-')
  {
    do
    {
      buf[i++] = ch;

      if (i == dbQueryMaxIdLength)
      {
        // Numeric constant too long
        return tkn_error;
      }

      ch = *p++;
    }
    while (ch != '\0'
           && (isdigit(ch) || ch == '+' || ch == '-' || ch == 'e' ||
               ch == 'E' || ch == '.'));

    p -= 1;

    buf[i] = '\0';

    if (sscanf(buf, INT8_FORMAT "%n", &ival, &digits) != 1)
    {
      // Bad integer constant
      return tkn_error;
    }

    if (digits != i)
    {
      if (sscanf(buf, "%lf%n", &fval, &digits) != 1 || digits != i)
      {
        // Bad float constant
        return tkn_error;
      }

      return tkn_fconst;
    }

    return tkn_iconst;
  }
  else if (isalpha(ch) || ch == '$' || ch == '_')
  {
    do
    {
      buf[i++] = ch;

      if (i == dbQueryMaxIdLength)
      {
        // Identifier too long
        return tkn_error;
      }

      ch = *p++;
    }
    while (ch != EOF && (isalnum(ch) || ch == '$' || ch == '_'));

    p -= 1;

    buf[i] = '\0';

    ident = buf;

    return dbSymbolTable::add
             (ident, tkn_ident);
  }
  else
  {
    // Invalid symbol
    return tkn_error;
  }
}

dbServer* dbServer::chain;

inline dbStatement* dbServer::findStatement(dbSession* session, int stmt_id)
{
  for (dbStatement* stmt = session->stmts; stmt != NULL; stmt = stmt->next)
  {
    if (stmt->id == stmt_id)
    {
      return stmt;
    }
  }

  return NULL;
}

void thread_proc dbServer::serverThread(void* arg)
{
  ((dbServer*)arg)->serveClient();
}

void thread_proc dbServer::acceptLocalThread(void* arg)
{
  dbServer* server = (dbServer*)arg;
  server->acceptConnection(server->localAcceptSock);
}

void thread_proc dbServer::acceptGlobalThread(void* arg)
{
  dbServer* server = (dbServer*)arg;
  server->acceptConnection(server->globalAcceptSock);
}

dbServer::dbServer(dbDatabase* db,
                   char const* serverURL,
                   int optimalNumberOfThreads,
                   int connectionQueueLen)
{
  char buf[256];
  next = chain;
  chain = this;
  this->db = db;
  this->optimalNumberOfThreads = optimalNumberOfThreads;
  this->URL = new char[strlen(serverURL)+1];
  strcpy(URL, serverURL);
  globalAcceptSock =
    socket_t::create_global(serverURL, connectionQueueLen);

  if (!globalAcceptSock->is_ok())
  {
    globalAcceptSock->get_error_text(buf, sizeof buf);
    dbTrace("Failed to create global socket: %s\n", buf);
    delete globalAcceptSock;
    globalAcceptSock = NULL;
  }

  localAcceptSock =
    socket_t::create_local(serverURL, connectionQueueLen);

  if (!localAcceptSock->is_ok())
  {
    localAcceptSock->get_error_text(buf, sizeof buf);
    dbTrace("Failed to create local socket: %s\n", buf);
    delete localAcceptSock;
    localAcceptSock = NULL;
  }

  freeList = activeList = waitList = NULL;
  waitListLength = 0;
}

dbServer* dbServer::find(char const* URL)
{
  for (dbServer* server = chain; server != NULL; server = server->next)
  {
    if (strcmp(URL, server->URL) == 0)
    {
      return server;
    }
  }

  return NULL;
}

void dbServer::cleanup()
{
  dbServer *server, *next;

  for (server = chain; server != NULL; server = next)
  {
    next = server->next;
    delete server;
  }
}

void dbServer::start()
{
  nActiveThreads = nIdleThreads = 0;
  cancelWait = cancelSession = cancelAccept = false;
  go.open();
  done.open();

  if (globalAcceptSock != NULL)
  {
    globalAcceptThread.create(acceptGlobalThread, this);
  }

  if (localAcceptSock != NULL)
  {
    localAcceptThread.create(acceptLocalThread, this);
  }
}

void dbServer::stop()
{
  cancelAccept = true;

  if (globalAcceptSock != NULL)
  {
    globalAcceptSock->cancel_accept();
    globalAcceptThread.join();
  }

  delete globalAcceptSock;
  globalAcceptSock = NULL;

  if (localAcceptSock != NULL)
  {
    localAcceptSock->cancel_accept();
    localAcceptThread.join();
  }

  delete localAcceptSock;
  localAcceptSock = NULL;

  dbCriticalSection cs(mutex);
  cancelSession = true;

  while (activeList != NULL)
  {
    activeList->sock->shutdown();
    done.wait(mutex);
  }

  cancelWait = true;

  while (nIdleThreads != 0)
  {
    go.signal();
    done.wait(mutex);
  }

  while (waitList != NULL)
  {
    dbSession* next = waitList->next;
    delete waitList->sock;
    waitList->next = freeList;
    freeList = waitList;
    waitList = next;
  }

  waitListLength = 0;
  assert(nActiveThreads == 0);
  done.close();
  go.close();
}

bool dbServer::freeze(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->freeze();
  }

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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
av成人免费在线| 精品久久久久久久一区二区蜜臀| 福利一区二区在线观看| 国产精品正在播放| 国内精品国产成人| 国内久久婷婷综合| 久久精品国产网站| 精品一区二区三区香蕉蜜桃| 免费成人av在线| 蜜桃精品在线观看| 美美哒免费高清在线观看视频一区二区 | 免费观看一级特黄欧美大片| 日韩av一区二区三区| 久久精品国产精品亚洲综合| 麻豆一区二区三| 国产一区二区在线电影| 国产一区二区导航在线播放| 国产激情视频一区二区在线观看 | 免费在线观看精品| 蜜桃av噜噜一区二区三区小说| 免费在线观看一区二区三区| 精品一区二区三区香蕉蜜桃| 国产a级毛片一区| av电影天堂一区二区在线| 91小视频免费看| 在线精品视频免费观看| 欧美高清你懂得| 欧美mv和日韩mv的网站| 国产精品色一区二区三区| 亚洲色图在线播放| 亚洲午夜一二三区视频| 免费看欧美美女黄的网站| 国产经典欧美精品| 色综合色狠狠天天综合色| 精品视频在线看| 久久久噜噜噜久久中文字幕色伊伊 | 91天堂素人约啪| 欧美体内she精视频| 欧美一区二区视频在线观看2022| 日韩美女主播在线视频一区二区三区| 国产亚洲精品bt天堂精选| 亚洲色图欧洲色图| 日韩精品一卡二卡三卡四卡无卡| 久久国产精品99久久久久久老狼| 风流少妇一区二区| 欧美影院午夜播放| 精品三级av在线| 综合色中文字幕| 麻豆久久一区二区| 99久久精品情趣| 欧美精品久久久久久久多人混战 | 91丨porny丨首页| 91精品欧美久久久久久动漫| 国产色91在线| 午夜精品久久久久影视| 国产成人在线网站| 精品视频在线免费| 中文字幕欧美区| 三级在线观看一区二区| 成人av综合一区| 欧美一区二区福利在线| 亚洲人亚洲人成电影网站色| 美国十次了思思久久精品导航| 成人免费视频网站在线观看| 日韩精品一区二区三区在线播放| 中文字幕一区二区在线观看| 麻豆91精品视频| 色婷婷一区二区三区四区| 久久免费美女视频| 午夜精品福利一区二区蜜股av | 久久成人av少妇免费| 日本伦理一区二区| 国产精品视频看| 亚洲欧美激情在线| 亚洲一区影音先锋| 国产精品一区二区三区网站| 欧美亚洲一区二区在线观看| 国产欧美日韩综合| 秋霞电影一区二区| av一区二区不卡| 国产一区高清在线| 欧美成人艳星乳罩| 亚洲国产另类av| 99久久国产综合精品麻豆| 久久久高清一区二区三区| 舔着乳尖日韩一区| 在线看国产一区| 亚洲欧美在线视频| 福利一区在线观看| 久久久久9999亚洲精品| 麻豆精品一区二区综合av| 在线观看三级视频欧美| 一区二区三区国产| 99精品国产视频| 中文字幕在线观看一区| 国产成人精品1024| 久久久久久黄色| 国产综合色在线| 日韩写真欧美这视频| 日精品一区二区三区| 欧美日韩视频在线观看一区二区三区| 亚洲精品视频在线| 91国产成人在线| 一区二区三区在线看| 色国产精品一区在线观看| 亚洲欧美日韩精品久久久久| 99国产精品国产精品毛片| 亚洲欧洲韩国日本视频| www..com久久爱| 18成人在线观看| 一本久道久久综合中文字幕 | 亚洲国产aⅴ天堂久久| 欧美性一级生活| 亚洲一区在线视频| 欧美色中文字幕| 日韩国产欧美在线播放| 337p亚洲精品色噜噜| 日韩精品国产精品| 欧美大白屁股肥臀xxxxxx| 激情久久五月天| 久久精品欧美日韩精品| 成人av电影在线观看| 亚洲视频 欧洲视频| 在线亚洲人成电影网站色www| 夜色激情一区二区| 3d成人动漫网站| 久久精品国产精品亚洲精品| ww久久中文字幕| 成人免费va视频| 一区二区三区在线视频观看58| 欧美系列一区二区| 免费观看一级特黄欧美大片| 精品国产成人在线影院| 成人午夜在线免费| 亚洲精品成人悠悠色影视| 欧美精品在线视频| 国产一区二区三区四区五区入口| 日本一区二区三区国色天香 | 不卡一区二区三区四区| 一区二区三区高清在线| 91精品在线麻豆| 国产酒店精品激情| 一区二区三区高清在线| 日韩欧美一二三区| 粉嫩在线一区二区三区视频| 亚洲激情五月婷婷| 日韩一区二区三区电影在线观看| 国产精一区二区三区| 亚洲精品国产无天堂网2021 | 亚洲色图视频网| 日韩欧美国产不卡| 成人福利视频在线| 日韩精品欧美成人高清一区二区| 久久久久久久综合日本| 日本久久电影网| 精品一区二区日韩| 亚洲乱码中文字幕| 欧美mv和日韩mv的网站| 一本到不卡精品视频在线观看| 免费在线观看精品| ...中文天堂在线一区| 欧美一级日韩不卡播放免费| 国产很黄免费观看久久| 国产三级精品视频| 国产999精品久久久久久绿帽| 欧美日本一区二区| 亚洲色图制服诱惑| 精品一区二区在线看| 99久久99久久精品国产片果冻| 国产一区二区三区日韩| 色域天天综合网| 久久久综合视频| 亚洲一区二区三区国产| 成人中文字幕合集| 欧美精品亚洲一区二区在线播放| 日韩三级在线免费观看| 国产亚洲综合在线| 亚洲国产视频一区二区| 91黄色激情网站| 亚洲欧美在线另类| 国产经典欧美精品| 欧美精品在线观看播放| 天堂在线一区二区| 欧美日韩国产综合一区二区三区| 国产精品久久久久久久久快鸭| www.日韩在线| 日韩三级高清在线| 日本成人中文字幕在线视频| 欧美男同性恋视频网站| 一区二区三区产品免费精品久久75| av不卡一区二区三区| 亚洲一级电影视频| 日韩欧美不卡一区| 久久精品国产精品亚洲精品| 欧美成人性战久久| 成人午夜视频在线| 亚洲大尺度视频在线观看| 8x8x8国产精品| 紧缚奴在线一区二区三区| 91精品黄色片免费大全|