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

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

?? localcli.cpp

?? FastDb是高效的內(nèi)存數(shù)據(jù)庫系統(tǒng)
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
//-< LOCALCLI.CPP >--------------------------------------------------*--------*
// FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *
// (Main Memory Database Management System)                          *   /\|  *
//                                                                   *  /  \  *
//                          Created:     20-Jun-2002  K.A. Knizhnik  * / [] \ *
//                          Last update: 20-Jun-2002  K.A. Knizhnik  * GARRET *
//-------------------------------------------------------------------*--------*
// Implementation of local C interface to database
//-------------------------------------------------------------------*--------*

#define INSIDE_FASTDB

#include "localcli.h"
#include "ttree.h"
#include "hashtab.h"
#include "symtab.h"
#include <ctype.h>

dbCLI dbCLI::instance;

int cli_open(char const* server_url,
             int         max_connect_attempts,
             int         reconnect_timeout_sec)
{
  return cli_bad_address;
}

int cli_create(char const* databaseName,
               char const* filePath,
               unsigned    transactionCommitDelay,
               int         openAttr,
               size_t      initDatabaseSize,
               size_t      extensionQuantum,
               size_t      initIndexSize,
               size_t      fileSizeLimit)
{
  return dbCLI::instance.create_session(databaseName, filePath, transactionCommitDelay, openAttr,
                                        initDatabaseSize, extensionQuantum, initIndexSize, fileSizeLimit);
}

session_desc* cli_get_session(int id)
{
  return dbCLI::instance.get_session(id);
}

int dbCLI::create_session(char const* databaseName,
                          char const* filePath,
                          unsigned    transactionCommitDelay,
                          int         openAttr,
                          size_t      initDatabaseSize,
                          size_t      extensionQuantum,
                          size_t      initIndexSize,
                          size_t      fileSizeLimit)
{
  dbCriticalSection cs(sessionMutex);
  dbDatabase* db = NULL;
  session_desc* s;

  for (s = active_session_list; s != NULL; s = s->next)
  {
    if (strcmp(s->name, databaseName) == 0)
    {
      db = s->db;
      db->accessCount += 1;
      break;
    }
  }

  if (db == NULL)
  {
    db = new dbDatabase((openAttr & cli_open_readonly)
                        ? (openAttr & cli_open_concurrent)
                        ? dbDatabase::dbConcurrentRead : dbDatabase::dbReadOnly
                    : (openAttr & cli_open_concurrent)
                        ? dbDatabase::dbConcurrentUpdate : dbDatabase::dbAllAccess,
                        initDatabaseSize,
                        extensionQuantum,
                        initIndexSize);

    if (!db->open(databaseName, filePath, INFINITE, transactionCommitDelay))
    {
      db->close();
      delete db;
      return cli_database_not_found;
    }

    db->setFileSizeLimit(fileSizeLimit);
    dbTable* table = (dbTable*)db->getRow(dbMetaTableId);
    dbTableDescriptor* metatable = new dbTableDescriptor(table);
    db->linkTable(metatable, dbMetaTableId);
    oid_t tableId = table->firstRow;

    while (tableId != 0)
    {
      table = (dbTable*)db->getRow(tableId);
      dbTableDescriptor* desc;

      for (desc = db->tables; desc != NULL && desc->tableId != tableId; desc = desc->nextDbTable)

        ;
      if (desc == NULL)
      {
        desc = new dbTableDescriptor(table);
        db->linkTable(desc, tableId);
        desc->setFlags();
      }

      tableId = table->next;
    }

    if (!db->completeDescriptorsInitialization())
    {
      db->close();
      delete db;
      return cli_table_not_found;
    }

    db->accessCount = 1;
  }

  s = sessions.allocate();
  s->name = new char[strlen(databaseName) + 1];
  strcpy(s->name, databaseName);
  s->db = db;
  s->stmts = NULL;
  s->next = active_session_list;
  s->existed_tables = db->tables;
  s->dropped_tables = NULL;
  active_session_list = s;
  return s->id;
}

int cli_create_replication_node(int         nodeId,
                                int         nServers,
                                char*       nodeNames[],
                                char const* databaseName,
                                char const* filePath,
                                int         openAttr,
                                size_t      initDatabaseSize,
                                size_t      extensionQuantum,
                                size_t      initIndexSize,
                                size_t      fileSizeLimit)
{
  return dbCLI::instance.create_replication_node(nodeId,
         nServers,
         nodeNames,
         databaseName,
         filePath,
         openAttr,
         initDatabaseSize,
         extensionQuantum,
         initIndexSize,
         fileSizeLimit);
}

int dbCLI::create_replication_node(int         nodeId,
                                   int         nServers,
                                   char*       nodeNames[],
                                   char const* databaseName,
                                   char const* filePath,
                                   int         openAttr,
                                   size_t      initDatabaseSize,
                                   size_t      extensionQuantum,
                                   size_t      initIndexSize,
                                   size_t      fileSizeLimit)
{
#ifdef REPLICATION_SUPPORT
  dbCriticalSection cs(sessionMutex);
  dbDatabase* db = NULL;
  session_desc* s;

  for (s = active_session_list; s != NULL; s = s->next)
  {
    if (strcmp(s->name, databaseName) == 0)
    {
      db = s->db;
      db->accessCount += 1;
      break;
    }
  }

  if (db == NULL)
  {
    db = new dbReplicatedDatabase((openAttr & cli_open_readonly)
                                  ? (openAttr & cli_open_concurrent)
                                  ? dbDatabase::dbConcurrentRead : dbDatabase::dbReadOnly
                              : (openAttr & cli_open_concurrent)
                                  ? dbDatabase::dbConcurrentUpdate : dbDatabase::dbAllAccess,
                                  initDatabaseSize,
                                  extensionQuantum,
                                  initIndexSize);

    if (!((dbReplicatedDatabase*)db)->open(databaseName, filePath, nodeId, nodeNames, nServers))
    {
      return cli_database_not_found;
    }

    db->setFileSizeLimit(fileSizeLimit);
    dbTable* table = (dbTable*)db->getRow(dbMetaTableId);
    dbTableDescriptor* metatable = new dbTableDescriptor(table);
    db->linkTable(metatable, dbMetaTableId);
    oid_t tableId = table->firstRow;

    while (tableId != 0)
    {
      table = (dbTable*)db->getRow(tableId);
      dbTableDescriptor* desc;

      for (desc = db->tables; desc != NULL && desc->tableId != tableId; desc = desc->nextDbTable)

        ;
      if (desc == NULL)
      {
        desc = new dbTableDescriptor(table);
        db->linkTable(desc, tableId);
        desc->setFlags();
      }

      tableId = table->next;
    }

    if (!db->completeDescriptorsInitialization())
    {
      db->close();
      delete db;
      return cli_table_not_found;
    }

    db->accessCount = 1;
  }

  s = sessions.allocate();
  s->name = new char[strlen(databaseName) + 1];
  strcpy(s->name, databaseName);
  s->db = db;
  s->stmts = NULL;
  s->next = active_session_list;
  s->existed_tables = db->tables;
  s->dropped_tables = NULL;
  active_session_list = s;
  return s->id;
#else

  return cli_not_implemented;
#endif
}


int cli_close(int session)
{
  return dbCLI::instance.close(session);
}

int dbCLI::close(int session)
{
  dbCriticalSection cs(sessionMutex);
  statement_desc *stmt, *next;
  session_desc* s = sessions.get(session);

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

  dbCriticalSection cs2(s->mutex);

  for (stmt = s->stmts; stmt != NULL; stmt = next)
  {
    next = stmt->next;
    free_statement(stmt);
  }

  if (--s->db->accessCount == 0)
  {
    dbTableDescriptor *desc, *next_desc;

    for (desc = s->db->tables; desc != NULL; desc = next_desc)
    {
      next_desc = desc->nextDbTable;

      if (!desc->isStatic)
      {
        delete desc;
      }
    }

    s->db->tables = NULL;
    s->db->close();
    delete s->db;
  }

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

  session_desc** spp;

  for (spp = &active_session_list; *spp != s; spp = &(*spp)->next)

    ;
  *spp = s->next;

  delete[] s->name;

  sessions.free(s);

  return cli_ok;
}

int cli_statement(int session, char const* sql)
{
  return dbCLI::instance.create_statement(session, sql);
}

int dbCLI::create_statement(int session, char const* sql)
{
  session_desc* s = sessions.get(session);

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

  statement_desc* stmt = statements.allocate();
  stmt->sql.put(strlen(sql)+1);
  strcpy(stmt->sql.base(), sql);
  stmt->columns = NULL;
  stmt->params = NULL;
  stmt->session = s;
  stmt->for_update = 0;
  stmt->first_fetch = true;
  stmt->prepared = false;
  stmt->n_params = 0;
  stmt->n_columns = 0;
  stmt->record_struct = NULL;
  stmt->n_autoincremented_columns = 0;
  stmt->oid = 0;
  stmt->updated = false;
  stmt->table = NULL;
  {
    dbCriticalSection cs(s->mutex);
    stmt->next = s->stmts;
    s->stmts = stmt;
  }

  char const* p = sql;
  parameter_binding** last = &stmt->params;

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

        if (*p == '\0')
        {
          *last = NULL;
          free_statement(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;
        free_statement(stmt);
        return cli_bad_statement;
      }

      parameter_binding* pb = parameter_allocator.allocate();
      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;
    }
    else
    {
      p += 1;
    }
  }

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

int cli_parameter(int           statement,
                  char const* param_name,
                  int           var_type,
                  void*         var_ptr)
{
  return dbCLI::instance.bind_parameter(statement, param_name, var_type, var_ptr);
}


int dbCLI::bind_parameter(int           statement,
                          char const* param_name,
                          int           var_type,
                          void*         var_ptr)
{
  if ((unsigned)var_type >= cli_array_of_oid)
  {
    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)
{
  return dbCLI::instance.bind_column(statement, column_name, var_type, var_len, var_ptr);
}

int dbCLI::bind_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;
  }

  if ((unsigned)var_type >= cli_unknown)
  {
    return cli_unsupported_type;
  }

  s->prepared = false;

  if (var_type == cli_autoincrement)
  {
    s->n_autoincremented_columns += 1;
  }

  column_binding* cb = column_allocator.allocate();
  cb->name = new char[strlen(column_name) + 1];
  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
                           )
  {

    return dbCLI::instance.bind_array_column(statement, column_name, var_type, var_ptr, set
             , get
                                                );
  }


int dbCLI::bind_array_column(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;
    cb->name = new char[strlen(column_name) + 1];
    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 dbCLI::match_columns(char const* table_name, statement_desc* stmt)
{
  stmt->table = stmt->session->db->findTable(table_name);

  if (stmt->table == NULL)
  {
    return cli_table_not_found;
  }

  for (column_binding* cb = stmt->columns; cb != NULL; cb = cb->next)
  {
    cb->field = stmt->table->find(cb->name);

    if (cb->field == NULL)
    {
      return cli_column_not_found;
    }
  }

  return cli_ok;
}

int cli_fetch(int statement, int for_update)
{
  return dbCLI::instance.fetch(statement, for_update);
}

int dbCLI::fetch(int statement, int for_update)
{
  statement_desc* stmt = statements.get(statement);

  if (stmt == NULL)
  {
    return cli_bad_descriptor;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99久久伊人网影院| aaa欧美大片| 亚洲欧美激情小说另类| 欧美一区二区三区播放老司机| 国产成人综合视频| 亚洲成av人片观看| 自拍偷拍亚洲激情| 久久久夜色精品亚洲| 欧美日韩一本到| av一区二区久久| 狠狠色2019综合网| 日本在线不卡视频一二三区| 一区二区在线免费| 国产农村妇女毛片精品久久麻豆 | 国产成人免费高清| 天天av天天翘天天综合网色鬼国产| 日本一区二区视频在线| 日韩一区二区在线免费观看| 欧美影片第一页| 91丨九色丨蝌蚪丨老版| 丁香婷婷综合激情五月色| 久久精品国产网站| 男女视频一区二区| 日日摸夜夜添夜夜添国产精品| 亚洲人成亚洲人成在线观看图片| 久久久久9999亚洲精品| 精品久久久影院| 欧美tk—视频vk| 日韩欧美国产不卡| 欧美一区二区精品| 91精品国产色综合久久| 欧美美女网站色| 欧美日韩高清影院| 欧美精品在线视频| 欧美一区二区三区日韩| 91精品婷婷国产综合久久竹菊| 欧美性xxxxx极品少妇| 欧美性色黄大片| 欧美亚州韩日在线看免费版国语版| 99riav久久精品riav| 91免费视频网| 欧美主播一区二区三区美女| 欧美在线免费观看视频| 欧美日韩一二三区| 欧美一卡二卡在线| 精品国内片67194| 国产视频在线观看一区二区三区| 国产精品视频在线看| 国产精品久久久久久久久晋中| 国产精品成人免费在线| 亚洲欧美日韩综合aⅴ视频| 亚洲精品欧美激情| 亚洲不卡在线观看| 激情综合网天天干| 风间由美一区二区av101| 91在线国产福利| 欧美日韩一区二区三区四区 | 欧美大片在线观看| 欧美精品一区二| 欧美国产欧美综合| 亚洲欧美乱综合| 偷拍一区二区三区四区| 狠狠久久亚洲欧美| 91麻豆成人久久精品二区三区| 色爱区综合激月婷婷| 9191成人精品久久| 久久精品亚洲国产奇米99| 中文字幕亚洲在| 日韩av一区二区在线影视| 久久99国产精品麻豆| 不卡av免费在线观看| 欧美区视频在线观看| 26uuu精品一区二区三区四区在线| 国产精品无圣光一区二区| 亚洲国产日韩精品| 国产伦精一区二区三区| 91福利在线导航| 亚洲精品在线电影| 亚洲精品乱码久久久久久久久| 日本最新不卡在线| 91丝袜国产在线播放| 欧美成人艳星乳罩| 亚洲欧美日韩国产手机在线| 日本系列欧美系列| 91免费观看在线| 日韩久久久久久| 一级中文字幕一区二区| 国产乱子伦视频一区二区三区 | 欧美精品久久99久久在免费线 | 中文字幕国产一区| 亚洲成av人片www| 成人aa视频在线观看| 9191久久久久久久久久久| 中文字幕日韩精品一区| 久久精品国产在热久久| 欧美在线一区二区三区| 日本一区二区不卡视频| 日本不卡1234视频| 日本道免费精品一区二区三区| 亚洲精品一区在线观看| 天天影视网天天综合色在线播放| 99视频精品全部免费在线| 精品国产三级电影在线观看| 亚洲图片一区二区| aaa亚洲精品| 日本一区二区三区在线观看| 美女视频免费一区| 欧美猛男gaygay网站| 一区二区三区中文在线| 成人精品免费网站| www激情久久| 麻豆国产欧美一区二区三区| 在线电影院国产精品| 一区二区欧美国产| av不卡免费电影| 国产精品麻豆欧美日韩ww| 国产一区二区在线影院| 日韩午夜精品电影| 日韩成人免费电影| 337p亚洲精品色噜噜噜| 亚洲国产美国国产综合一区二区| 色综合久久88色综合天天免费| 国产精品久久久99| 成人一区二区三区在线观看| 久久久噜噜噜久噜久久综合| 国产综合成人久久大片91| 欧美videofree性高清杂交| 美女一区二区久久| 精品国产青草久久久久福利| 国产精品色噜噜| a美女胸又www黄视频久久| 日本一区二区三区视频视频| 成人午夜在线视频| 中文字幕在线观看不卡| 99国产精品一区| 亚洲同性gay激情无套| 一本色道综合亚洲| 一区二区不卡在线视频 午夜欧美不卡在| 色综合视频一区二区三区高清| 日韩久久一区二区| 欧美在线观看视频一区二区三区| 一区二区三区在线免费观看 | 777午夜精品免费视频| 五月激情丁香一区二区三区| 欧美一区二区三区不卡| 国内精品伊人久久久久av影院| 欧美v国产在线一区二区三区| 国产麻豆91精品| 最新国产の精品合集bt伙计| 色婷婷激情久久| 午夜精品爽啪视频| ww久久中文字幕| 成人av网在线| 夜夜精品视频一区二区| 欧美精品乱码久久久久久按摩| 裸体健美xxxx欧美裸体表演| 久久综合久色欧美综合狠狠| 成人综合在线观看| 亚洲一区二区三区四区五区黄| 欧美日韩国产首页在线观看| 久久狠狠亚洲综合| 亚洲国产成人在线| 欧美午夜一区二区| 韩国精品免费视频| 亚洲婷婷综合久久一本伊一区| 欧美日韩免费在线视频| 激情综合一区二区三区| 亚洲欧美激情插 | 亚洲电影一级片| 欧美v亚洲v综合ⅴ国产v| eeuss影院一区二区三区| 水蜜桃久久夜色精品一区的特点| 亚洲精品一线二线三线无人区| 波多野结衣91| 青青草国产精品亚洲专区无| 日本一区二区电影| 欧美一区二区网站| 国产电影精品久久禁18| 婷婷夜色潮精品综合在线| 久久久www成人免费毛片麻豆 | 激情综合一区二区三区| 亚洲天堂网中文字| 欧美大白屁股肥臀xxxxxx| 91在线视频网址| 精品一区二区三区免费| 亚洲黄色免费网站| 国产亚洲欧美中文| 欧美日韩久久不卡| 成人av午夜影院| 国产一区二三区| 精品一区免费av| 亚洲综合精品自拍| 国产喷白浆一区二区三区| 欧美丰满美乳xxx高潮www| 99免费精品视频| 国产精一区二区三区| 日韩精品福利网| 亚洲美女视频一区| 国产女主播一区| 久久久影视传媒|