亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
成人h动漫精品一区二区| 久久色中文字幕| 亚洲私人影院在线观看| 成人av网址在线| 国产精品欧美久久久久一区二区| 国产成人精品影视| 国产日韩欧美精品一区| 成人开心网精品视频| 中文字幕综合网| 色狠狠一区二区三区香蕉| 一区二区三区资源| 欧美综合一区二区三区| 日韩国产高清影视| 欧美大片一区二区三区| 黄页视频在线91| 亚洲国产精品精华液ab| 色综合久久九月婷婷色综合| 亚洲国产乱码最新视频| 欧美一级片免费看| 国产成人在线视频网站| 亚洲天堂成人在线观看| 欧美午夜理伦三级在线观看| 日本免费新一区视频| 久久久久九九视频| 一本色道久久加勒比精品| 污片在线观看一区二区| 久久久久久亚洲综合| 色婷婷一区二区三区四区| 丝袜亚洲另类丝袜在线| 久久久不卡网国产精品一区| 色吧成人激情小说| 日本不卡一区二区三区| 亚洲国产岛国毛片在线| 欧美色图一区二区三区| 精品写真视频在线观看| 亚洲欧洲在线观看av| 欧美日韩精品一区二区三区| 国产一区二区三区四区五区美女| 亚洲精品一二三区| 精品1区2区在线观看| 一本一道波多野结衣一区二区| 日本欧美肥老太交大片| 综合自拍亚洲综合图不卡区| 91精品国产乱| 91欧美一区二区| 激情图区综合网| 一区二区三区在线视频观看 | 色香蕉成人二区免费| 午夜私人影院久久久久| 国产欧美日韩不卡免费| 欧美区一区二区三区| 99久久国产综合精品色伊| 韩国av一区二区| 午夜精品福利一区二区三区蜜桃| 国产精品视频第一区| 91精品国产综合久久蜜臀| 91丨九色丨蝌蚪富婆spa| 国产麻豆精品在线| 秋霞av亚洲一区二区三| 亚洲午夜国产一区99re久久| 欧美极品aⅴ影院| 日韩精品一区二区三区四区视频| 欧美中文字幕一区| 99久久精品一区| 成人久久18免费网站麻豆| 久久狠狠亚洲综合| 日韩和欧美的一区| 亚洲成人动漫精品| 亚洲尤物在线视频观看| 亚洲天堂福利av| 日韩一区中文字幕| 国产精品美女久久久久久久久 | 欧美精品色一区二区三区| 不卡一区二区在线| 国产东北露脸精品视频| 九一九一国产精品| 久久精品国产久精国产| 视频一区视频二区中文字幕| 一区二区三区日韩精品视频| 中文字幕一区二区三区在线播放| 欧美激情综合在线| 中文字幕亚洲一区二区va在线| 国产亚洲一区字幕| 国产亚洲一区字幕| 国产精品欧美一区喷水| 亚洲视频一区二区在线| 亚洲欧美乱综合| 亚洲一区二区三区四区在线| 亚洲综合无码一区二区| 亚洲国产精品人人做人人爽| 亚洲chinese男男1069| 日韩影院精彩在线| 久久国产夜色精品鲁鲁99| 国产在线视频精品一区| 国产成人av福利| www.亚洲精品| 色偷偷88欧美精品久久久| 欧美人体做爰大胆视频| 日韩一区二区在线观看视频| 亚洲精品一区二区在线观看| 中文字幕 久热精品 视频在线| 亚洲人一二三区| 日精品一区二区三区| 九九视频精品免费| 成人中文字幕电影| 91久久精品一区二区| 3d动漫精品啪啪一区二区竹菊| 日韩亚洲欧美高清| 国产日韩欧美综合在线| 亚洲女厕所小便bbb| 亚洲成人资源网| 国产真实乱偷精品视频免| 99热国产精品| 欧美人妖巨大在线| 久久精品水蜜桃av综合天堂| ...xxx性欧美| 青草av.久久免费一区| 国产成人精品一区二| 在线观看日韩电影| 精品日韩一区二区| 亚洲精品少妇30p| 蜜桃视频一区二区三区在线观看| 久久99最新地址| 色综合久久中文综合久久牛| 日韩欧美中文字幕公布| 一区精品在线播放| 看电影不卡的网站| 91小视频免费看| 日韩欧美在线123| 亚洲色图欧洲色图| 久久99久久99精品免视看婷婷| a在线播放不卡| 日韩美女主播在线视频一区二区三区| 国产精品久久一级| 免费视频一区二区| 91视频你懂的| 久久久久亚洲蜜桃| 天天综合网天天综合色| eeuss影院一区二区三区| 欧美一区二区女人| 亚洲美女精品一区| 岛国一区二区在线观看| 日韩一区二区免费视频| 亚洲色图欧美在线| 成人午夜视频在线观看| 日韩色视频在线观看| 午夜久久久影院| 91浏览器打开| 国产欧美日韩在线视频| 免费成人在线影院| 欧美日韩精品一区二区| 一区二区三区不卡视频| 成人在线综合网站| 久久久99精品久久| 久久精品国产亚洲高清剧情介绍 | 国产综合久久久久影院| 91精品国产欧美一区二区18| 亚洲一区在线视频| 日本精品视频一区二区三区| 国产精品国产三级国产a| 国产精品一品二品| 久久久综合九色合综国产精品| 免费人成在线不卡| 欧美一级黄色片| 日韩精品亚洲专区| 欧美日韩不卡一区| 日韩精品乱码av一区二区| 欧美精品xxxxbbbb| 亚洲成人动漫一区| 在线不卡免费av| 日韩av在线免费观看不卡| 欧美精品九九99久久| 青青草97国产精品免费观看| 日韩一区二区不卡| 久久er精品视频| 久久综合九色欧美综合狠狠| 国内外精品视频| 欧美经典一区二区| 99精品国产热久久91蜜凸| 依依成人精品视频| 日本韩国一区二区| 午夜精品一区二区三区电影天堂| 欧美在线免费播放| 视频在线观看一区| 欧美成人精品1314www| 国内一区二区在线| 国产精品你懂的在线欣赏| 国产a级毛片一区| 国产精品不卡在线观看| 一本一道久久a久久精品| 亚洲国产视频一区| 欧美一区二区精品在线| 国产在线国偷精品产拍免费yy | 91小视频在线| 午夜精品福利一区二区三区av| 91精品国产综合久久福利软件| 青草国产精品久久久久久| www精品美女久久久tv| 99在线精品观看| 日韩中文字幕麻豆|