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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? cli.cpp

?? FastDb是高效的內(nèi)存數(shù)據(jù)庫系統(tǒng)
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
//-< CLI.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 *
//-------------------------------------------------------------------*--------*
// Call level interface client part implementation
//-------------------------------------------------------------------*--------*

#define INSIDE_FASTDB

#include <ctype.h>
#include "stdtp.h"
#include "sockio.h"
#include "repsock.h"
#include "sync.h"
#include "cli.h"
#include "cliproto.h"

struct parameter_binding
{
  parameter_binding* next;
  char* name;
  int   var_type;
  int   var_len;
  void* var_ptr;

  ~parameter_binding()
  {
    delete[] name;
  }
};

struct column_binding
{
  column_binding* next;
  char* name;
  int   var_type;
  int*  var_len;
  void* var_ptr;
  void* arr_ptr;
  int   arr_len;
  cli_column_get_ex get_fnc;
  cli_column_set_ex set_fnc;

  ~column_binding()
  {
    delete[] name;
  }
};

struct session_desc;

struct statement_desc
{
  int                id;
  statement_desc*    next;
  char*              stmt;
  column_binding*    columns;
  parameter_binding* params;
  session_desc*      session;
  bool               for_update;
  bool               updated;
  bool               prepared;
  bool               autoincrement;
  cli_oid_t          oid;
  int                stmt_len;
  int                n_params;
  int                n_columns;
  int                columns_len;

  void deallocate()
  {
    delete[] stmt;
    column_binding *cb, *next_cb;

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

    parameter_binding *pb, *next_pb;

    for (pb = params; pb != NULL; pb = next_pb)
    {
      next_pb = pb->next;
      delete pb;
    }
  }

  statement_desc(int id, statement_desc* next)
  {
    this->id = id;
    this->next = next;
  }

  statement_desc()
  {}

}

;

struct session_desc
{
  int             id;
  session_desc*   next;
  socket_t*       sock;
  statement_desc* stmts;

  session_desc(int id, session_desc* next)
  {
    this->id = id;
    this->next = next;
  }

  session_desc()
  {}

}

;

template<class T>

class descriptor_table
{

protected:
  T**         table;
  T*          free_desc;
  int         descriptor_table_size;
  dbMutex     mutex;

public:
  descriptor_table()
  {
    int i;
    descriptor_table_size = 16;
    table = new T*[descriptor_table_size];
    T* next = NULL;

    for (i = 0; i < descriptor_table_size; i++)
    {
      table[i] = next = new T(i, next);
    }

    free_desc = next;
  }

  T* get
    (int desc)
  {
    dbCriticalSection cs(mutex);
    return (desc >= descriptor_table_size) ? (T*)0 : table[desc];
  }

  T* allocate()
  {
    dbCriticalSection cs(mutex);

    if (free_desc == NULL)
    {
      int i, n;
      T** desc = new T*[descriptor_table_size * 2];
      memcpy(desc, table, descriptor_table_size*sizeof(T*));
      delete[] table;
      table = desc;
      T* next = NULL;

      for (i = descriptor_table_size, n = i*2; i < n; i++)
      {
        table[i] = next = new T(i, next);
      }

      free_desc = next;
      descriptor_table_size = n;
    }

    T* desc = free_desc;
    free_desc = desc->next;
    return desc;
  }

  void deallocate(T* desc)
  {
    dbCriticalSection cs(mutex);
    desc->next = free_desc;
    free_desc = desc;
  }
};

static descriptor_table<session_desc>   sessions;

static descriptor_table<statement_desc> statements;

int cli_open(char const* server_url,
             int         max_connect_attempts,
             int         reconnect_timeout_sec)
{
  socket_t* sock;
  int n_addresses = 1;
  char const* start = server_url;
  char const* end;

  while ((end = strchr(start, ',')) != NULL)
  {
    start = end + 1;
    n_addresses += 1;
  }

  if (n_addresses == 1)
  {
    sock = socket_t::connect(server_url,
                             socket_t::sock_any_domain,
                             max_connect_attempts,
                             reconnect_timeout_sec);
  }
  else
  {
    char** addresses = new char*[n_addresses];
    start = server_url;

    for (int i = 0; i < n_addresses; i++)
    {
      end = strchr(start, ',');

      if (end == NULL)
      {
        end = start + strlen(start);
      }

      int len = end - start;
      char* addr = new char[len+1];
      memcpy(addr, start, len);
      addr[len] = '\0';
      start = end + 1;
      addresses[i] = addr;
    }

    sock = replication_socket_t::connect((char const**)addresses,
                                         n_addresses,
                                         max_connect_attempts,
                                         reconnect_timeout_sec);

    while (--n_addresses >= 0)
    {
      delete[] addresses[n_addresses];
    }

    delete[] addresses;
  }

  if (!sock->is_ok())
  {
    delete sock;
    return cli_connection_refused;
  }

  session_desc* session = sessions.allocate();
  session->sock = sock;
  session->stmts = NULL;
  return session->id;
}


int cli_close(int session)
{
  statement_desc *stmt, *next;
  session_desc* s = sessions.get(session);

  if (s == NULL)
  {
    return cli_bad_descriptor;
  }

  cli_request req;
  req.length = sizeof(req);
  req.cmd = cli_cmd_close_session;
  req.pack();
  int result = cli_ok;

  if (!s->sock->write(&req, sizeof req))
  {
    result = cli_network_error;
  }

  delete s->sock;
  s->sock = NULL;

  for (stmt = s->stmts; stmt != NULL; stmt = next)
  {
    next = stmt->next;
    stmt->deallocate();
    statements.deallocate(stmt);
  }

  sessions.deallocate(s);
  return result;
}

int cli_statement(int session, char const* stmt_str)
{
  session_desc* s = sessions.get(session);

  if (s == NULL)
  {
    return cli_bad_descriptor;
  }

  statement_desc* stmt = statements.allocate();
  stmt->stmt = new char[strlen(stmt_str)+1];
  stmt->columns = NULL;
  stmt->params = NULL;
  stmt->session = s;
  stmt->for_update = 0;
  stmt->prepared = false;
  stmt->n_params = 0;
  stmt->n_columns = 0;
  stmt->columns_len = 0;
  stmt->oid = 0;
  stmt->next = s->stmts;
  stmt->updated = false;
  s->stmts = stmt;
  char const* p = stmt_str;
  char* dst = stmt->stmt;
  parameter_binding** last = &stmt->params;

  while (*p != '\0')
  {
    if (*p == '\'')
    {
      do
      {
        do
        {
          *dst++ = *p++;
        }
        while (*p != '\0' && *p != '\'');

        *dst++ = *p;

        if (*p == '\0')
        {
          *last = NULL;
          stmt->deallocate();
          statements.deallocate(stmt);
          return cli_bad_statement;
        }
      }
      while (*++p == '\'');
    }
    else if (*p == '%')
    {
      stmt->n_params += 1;
      char const* q = p++;

      while (isalnum((unsigned char)*p) || *p == '_')
        p += 1;

      if (*p == '%')
      {
        *last = NULL;
        stmt->deallocate();
        statements.deallocate(stmt);
        return cli_bad_statement;
      }

      parameter_binding* pb = new parameter_binding;
      int len = p - q;
      pb->name = new char[len+1];
      memcpy(pb->name, q, len);
      pb->name[len] = '\0';
      *last = pb;
      last = &pb->next;
      pb->var_ptr = NULL;
      *dst++ = '\0';
    }
    else
    {
      *dst++ = *p++;
    }
  }

  if (dst == stmt->stmt || *(dst-1) != '\0')
  {
    *dst++ = '\0';
  }

  stmt->stmt_len = dst - stmt->stmt;
  *last = NULL;
  return stmt->id;
}

int cli_parameter(int         statement,
                  char const* param_name,
                  int         var_type,
                  void*       var_ptr)
{
  if ((unsigned)var_type > cli_pasciiz)
  {
    return cli_unsupported_type;
  }

  statement_desc* s = statements.get(statement);

  if (s == NULL)
  {
    return cli_bad_descriptor;
  }

  s->prepared = false;

  for (parameter_binding* pb = s->params; pb != NULL; pb = pb->next)
  {
    if (strcmp(pb->name, param_name) == 0)
    {
      pb->var_ptr  = var_ptr;
      pb->var_type = var_type;
      return cli_ok;
    }
  }

  return cli_parameter_not_found;
}

int cli_column(int         statement,
               char const* column_name,
               int         var_type,
               int*        var_len,
               void*       var_ptr)
{
  statement_desc* s = statements.get(statement);

  if (s == NULL)
  {
    return cli_bad_descriptor;
  }

  s->prepared = false;
  column_binding* cb = new column_binding;
  int len = strlen(column_name) + 1;
  cb->name = new char[len];
  s->columns_len += len;
  cb->next = s->columns;
  s->columns = cb;
  s->n_columns += 1;
  strcpy(cb->name, column_name);
  cb->var_type = var_type;
  cb->var_len = var_len;
  cb->var_ptr = var_ptr;
  cb->set_fnc = NULL;
  cb->get_fnc = NULL;
  return cli_ok;
}

int cli_array_column(int            statement,
                     char const*    column_name,
                     int            var_type,
                     void*          var_ptr,

                     cli_column_set set
                       ,
                       cli_column_get get
                        )
  {
    return cli_array_column_ex(statement, column_name, var_type, var_ptr,

                               (cli_column_set_ex)set
                               , (cli_column_get_ex)get
                              );
  }

int cli_array_column_ex(int               statement,
                        char const*       column_name,
                        int               var_type,
                        void*             var_ptr,

                        cli_column_set_ex set
                          ,
                          cli_column_get_ex get
                           )
  {
    statement_desc* s = statements.get(statement);

    if (s == NULL)
    {
      return cli_bad_descriptor;
    }

    if (var_type < cli_asciiz || var_type > cli_array_of_string)
    {
      return cli_unsupported_type;
    }

    s->prepared = false;
    column_binding* cb = new column_binding;
    int len = strlen(column_name) + 1;
    cb->name = new char[len];
    s->columns_len += len;
    cb->next = s->columns;
    s->columns = cb;
    s->n_columns += 1;
    strcpy(cb->name, column_name);
    cb->var_type = var_type;
    cb->var_len = NULL;
    cb->var_ptr = var_ptr;

    cb->set_fnc = set

                    ;
    cb->get_fnc = get

                    ;
    return cli_ok;
  }

int cli_fetch(int statement, int for_update)
{
  parameter_binding* pb;
  column_binding*    cb;
  statement_desc* stmt = statements.get(statement);
  char *p, *s;

  if (stmt == NULL)
  {
    return cli_bad_descriptor;
  }

  stmt->for_update = for_update;
  int msg_size = sizeof(cli_request) + 1;

  for (pb = stmt->params; pb != NULL; pb = pb->next)
  {
    if (pb->var_ptr == NULL)
    {
      return cli_unbound_parameter;
    }

    if (pb->var_type == cli_asciiz)
    {
      msg_size += strlen((char*)pb->var_ptr) + 1;
    }
    else if (pb->var_type == cli_pasciiz)
    {
      msg_size += strlen(*(char**)pb->var_ptr) + 1;
    }
    else
    {
      msg_size += sizeof_type[pb->var_type];
    }
  }

  stmt->oid = 0;

  if (!stmt->prepared)
  {
    msg_size += 4 + stmt->stmt_len + stmt->n_params;
    msg_size += stmt->columns_len + stmt->n_columns;
  }

  dbSmallBuffer buf(msg_size);
  p = buf;
  cli_request* req = (cli_request*)p;
  req->length  = msg_size;
  req->cmd     = stmt->prepared
                 ? cli_cmd_execute : cli_cmd_prepare_and_execute;
  req->stmt_id = statement;
  req->pack();
  p += sizeof(cli_request);

  if (!stmt->prepared)
  {
    *p++ = stmt->n_params;
    *p++ = stmt->n_columns;
    p = pack2(p, stmt->stmt_len + stmt->n_params);
    pb = stmt->params;
    char* end = p + stmt->stmt_len + stmt->n_params;
    char* src = stmt->stmt;

    while (p < end)
    {
      while ((*p++ = *src++) != '\0')

        ;
      if (pb != NULL)
      {
        *p++ = pb->var_type == cli_pasciiz ? cli_asciiz : pb->var_type;
        pb = pb->next;
      }
    }

    for (cb = stmt->columns; cb != NULL; cb = cb->next)
    {
      *p++ = cb->var_type;
      s = cb->name;

      while ((*p++ = *s++) != '\0')

        ;
    }
  }

  *p++ = for_update;

  for (pb = stmt->params; pb != NULL; pb = pb->next)
  {
    switch (pb->var_type)
    {

    case cli_asciiz:
      s = (char*)pb->var_ptr;

      while ((*p++ = *s++) != '\0')

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美午夜精品久久久久久超碰| 国产精品日产欧美久久久久| 国产v日产∨综合v精品视频| 亚洲一区二区三区激情| 亚洲日韩欧美一区二区在线| 亚洲三级在线免费观看| 视频一区二区三区在线| 日韩精品一区二区三区swag| 成人高清免费在线播放| 亚洲美女精品一区| 成人午夜免费av| 国产综合色在线视频区| 精品国产91乱码一区二区三区| 国产精品久久久久久久久免费樱桃| 毛片基地黄久久久久久天堂| 日韩欧美在线综合网| 欧美人与z0zoxxxx视频| 91.com视频| 欧美丰满少妇xxxxx高潮对白| 精品视频一区二区不卡| 欧美日韩高清一区| 91精品国产综合久久香蕉麻豆| 欧美一区日本一区韩国一区| 久久亚洲综合色一区二区三区| 国产日韩欧美a| 樱花影视一区二区| 亚洲h精品动漫在线观看| 樱花影视一区二区| 在线观看亚洲a| 久久99国产精品尤物| 亚洲精品久久7777| 日韩精品一区二区三区四区视频 | 色综合色狠狠天天综合色| 精品国产露脸精彩对白| 欧美大胆一级视频| 欧美久久一二三四区| 国产在线精品一区二区三区不卡| 成人免费在线播放视频| 亚洲国产视频网站| 亚洲三级电影网站| 美国十次了思思久久精品导航| av动漫一区二区| 在线一区二区三区四区五区| 精品久久久久久久人人人人传媒| 久久青草欧美一区二区三区| 亚洲va国产va欧美va观看| 日韩黄色在线观看| 99re这里只有精品首页| 久久这里只精品最新地址| 亚洲国产成人tv| 成人小视频免费在线观看| 日韩欧美一区在线观看| 亚洲国产综合人成综合网站| 成人蜜臀av电影| 欧美精品一区二区不卡| 天天综合网 天天综合色| 色综合天天综合狠狠| 久久久精品免费免费| 日本中文一区二区三区| 99久久精品久久久久久清纯| 精品国产成人在线影院| 午夜a成v人精品| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美成人精品1314www| 亚洲国产wwwccc36天堂| 成人精品一区二区三区四区 | 久久综合九色综合欧美98| 国产精品国产精品国产专区不片| 麻豆成人免费电影| 欧美精品123区| 天天综合天天综合色| 欧美日本韩国一区| 日韩中文字幕区一区有砖一区| 色爱区综合激月婷婷| 亚洲欧美日韩中文播放 | 亚洲成年人网站在线观看| 97久久精品人人做人人爽| 国产日韩欧美a| 顶级嫩模精品视频在线看| 久久久午夜电影| 国产精品一区一区| 久久久久久久久蜜桃| 国产成人精品三级| 久久精品一区二区三区av| 激情图区综合网| 久久久久久久国产精品影院| 国产成人亚洲综合a∨婷婷| 久久精品视频在线免费观看| 成人一二三区视频| 国产日本欧美一区二区| 成人国产精品免费观看动漫 | 一区二区三区免费在线观看| 北条麻妃一区二区三区| 国产精品理论片在线观看| 成人aaaa免费全部观看| 亚洲免费观看视频| 欧美色图第一页| 经典三级视频一区| 日本一二三四高清不卡| 91福利精品第一导航| 日本成人在线一区| 国产拍欧美日韩视频二区| 91国偷自产一区二区三区成为亚洲经典 | 在线免费观看日本一区| 石原莉奈在线亚洲二区| 久久久午夜电影| 色狠狠av一区二区三区| 轻轻草成人在线| 国产精品久久久久久久久晋中 | 日韩理论在线观看| 欧美一二三区在线观看| 一区二区欧美国产| 欧美精品一二三| 国产精品99久久不卡二区| 日本一区二区高清| 欧洲亚洲精品在线| 国产精品对白交换视频 | 久久99精品一区二区三区三区| 国产精品另类一区| 欧美视频在线不卡| 国产成人在线视频免费播放| 性欧美大战久久久久久久久| 欧美激情一区二区三区四区| 日韩精品一区二区三区在线观看| 不卡视频一二三四| 九九在线精品视频| 亚洲综合在线视频| 中文字幕巨乱亚洲| 精品成人一区二区| 欧美一区二视频| 欧美影视一区在线| 不卡一区中文字幕| 国产成人免费视频精品含羞草妖精| 午夜精品久久久久久| 亚洲精品成人少妇| 亚洲国产精品黑人久久久| 26uuu另类欧美| 日韩午夜在线观看| 69久久99精品久久久久婷婷| 在线观看日韩国产| 99久久久久久| 不卡的av网站| 波多野结衣在线aⅴ中文字幕不卡| 国产一区二区三区免费| 美洲天堂一区二卡三卡四卡视频 | 国产精品国产三级国产a| 26uuu亚洲婷婷狠狠天堂| 日韩色视频在线观看| 欧美高清性hdvideosex| 欧美男生操女生| 91精品国产综合久久香蕉的特点 | 喷水一区二区三区| 日韩经典一区二区| 奇米色777欧美一区二区| 亚洲123区在线观看| 亚洲国产wwwccc36天堂| 午夜影院在线观看欧美| 亚洲成a人片在线观看中文| 午夜精品一区二区三区电影天堂| 亚洲综合精品久久| 亚洲国产精品久久艾草纯爱| 亚洲成av人**亚洲成av**| 亚洲福利一二三区| 人人狠狠综合久久亚洲| 日产欧产美韩系列久久99| 亚洲国产精品嫩草影院| 美女网站色91| 国产精品一二三四| 91亚洲国产成人精品一区二区三 | 亚洲一区av在线| 免费精品99久久国产综合精品| 日本大胆欧美人术艺术动态| 国产乱码字幕精品高清av | 欧美成人激情免费网| 国产网红主播福利一区二区| 国产精品视频一区二区三区不卡| 亚洲一区在线免费观看| 免费成人美女在线观看| 久久国产尿小便嘘嘘尿| 国产成人av自拍| 欧美亚洲另类激情小说| 日韩欧美一区在线观看| 欧美国产日韩a欧美在线观看| 亚洲人成网站色在线观看| 日韩激情视频网站| 成人午夜碰碰视频| 在线播放一区二区三区| 中日韩av电影| 亚洲电影一级黄| 粉嫩aⅴ一区二区三区四区| 欧美日韩卡一卡二| 久久嫩草精品久久久精品一| 一区二区三区精品视频| 另类小说欧美激情| 在线精品视频一区二区三四| 2021国产精品久久精品| 日韩伦理电影网| 免费成人美女在线观看.| 不卡大黄网站免费看| 色综合一区二区三区|