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

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

?? subsql.cpp

?? FastDb是高效的內存數據庫系統
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
//-< SUBSQL.CPP >----------------------------------------------------*--------*
// FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *
// (Main Memory Database Management System)                          *   /\|  *
//                                                                   *  /  \  *
//                          Created:     20-Nov-98    K.A. Knizhnik  * / [] \ *
//                          Last update: 10-Dec-98    K.A. Knizhnik  * GARRET *
//-------------------------------------------------------------------*--------*
// Interactive data manipulation language (subset of SQL)
//-------------------------------------------------------------------*--------*

#include <stdio.h>
#include <ctype.h>
#include "fastdb.h"
#include "compiler.h"
#include "wwwapi.h"
#include "subsql.h"
#include "symtab.h"
#include "hashtab.h"
#include "ttree.h"

#if THREADS_SUPPORTED
#include "server.h"
#endif

static char* typeMnem[] = {
                            "Boolean",
                            "Int1",
                            "Int2",
                            "Int4",
                            "Int8",
                            "Real4",
                            "Real8",
                            "String",
                            "Reference",
                            "Array",
                            "MethodBool",
                            "MethodInt1",
                            "MethodInt2",
                            "MethodInt4",
                            "MethodInt8",
                            "MethodReal4",
                            "MethodReal8",
                            "MethodString",
                            "MethodReference",
                            "Structure",
                            "RawBinary",
                            "StdString",
                            "Unknown"
                          };

char* dbSubSql::prompt = ">> ";


dbSubSql::dbSubSql(dbAccessType accessType)
    : dbDatabase(accessType)
{

  static struct
  {
    char* name;
    int   tag;
  }

  keywords[] = {
                 {"alter",   tkn_alter},
                 {"array",   tkn_array},
                 {"autocommit",   tkn_autocommit},
                 {"autoincrement",tkn_autoincrement},
                 {"backup",  tkn_backup},
                 {"bool",    tkn_bool},
                 {"commit",  tkn_commit},
                 {"compactify",tkn_compactify},
                 {"count",   tkn_count},
                 {"create",  tkn_create},
                 {"delete",  tkn_delete},
                 {"describe",tkn_describe},
                 {"drop",    tkn_drop},
                 {"exit",    tkn_exit},
                 {"export",  tkn_export},
                 {"hash",    tkn_hash},
                 {"help",    tkn_help},
                 {"http",    tkn_http},
                 {"import",  tkn_import},
                 {"index",   tkn_index},
                 {"int1",    tkn_int1},
                 {"int2",    tkn_int2},
                 {"int4",    tkn_int4},
                 {"int8",    tkn_int8},
                 {"inverse", tkn_inverse},
                 {"of",      tkn_of},
                 {"off",     tkn_off},
                 {"on",      tkn_on},
                 {"open",    tkn_open},
                 {"reference",tkn_reference},
                 {"real4",   tkn_real4},
                 {"real8",   tkn_real8},
                 {"rollback",tkn_rollback},
                 {"server",  tkn_server},
                 {"set",     tkn_set},
                 {"stop",    tkn_stop},
                 {"show",    tkn_show},
                 {"to",      tkn_to},
                 {"update",  tkn_update},
                 {"values",  tkn_values},
                 {"version", tkn_version}
               };

  for (unsigned i = 0; i < itemsof(keywords); i++)
  {

    dbSymbolTable::add
      (keywords[i].name, keywords[i].tag, FASTDB_CLONE_ANY_IDENTIFIER);
  }

  droppedTables = NULL;
  existedTables = NULL;
  opened = false;
  buflen = 1024;
  buf = new char[buflen];
  httpServerRunning = false;
  databaseName = NULL;
  historyUsed = historyCurr = 0;
  ungetToken = -1;
  autocommit = false;
}

dbSubSql::~dbSubSql()
{

  delete[] buf;
}


inline int strincmp(const char* p, const char* q, size_t n)
{
  while (n > 0)
  {
    int diff = toupper(*(unsigned char*)p) - toupper(*(unsigned char*)q);

    if (diff != 0)
    {
      return diff;
    }
    else if (*p == '\0')
    {
      return 0;
    }

    p += 1;
    q += 1;
    n -= 1;
  }

  return 0;
}

//
// Find one string within another, ignoring case
//

inline char* stristr(const char* haystack, const char* needle)
{
  nat4 i, hayLen, ndlLen;

  ndlLen = strlen(needle);
  hayLen = strlen(haystack);

  if (ndlLen > hayLen)
  {
    return NULL;
  }

  for (i = 0; i <= (hayLen - ndlLen); i++)
  {
    if (strincmp(&haystack[i], needle, ndlLen) == 0)
    {
      return (char*)&haystack[i];
    }
  }

  return NULL;
}


bool contains(dbUserFunctionArgument& arg1, dbUserFunctionArgument& arg2)
{
  assert(arg1.type == dbUserFunctionArgument::atString && arg2.type == dbUserFunctionArgument::atString);
  return stristr(arg1.u.strValue, arg2.u.strValue) != NULL;
}

USER_FUNC(contains);

int dbSubSql::get
  ()
{
  int ch = getc(in);

  if (ch == '\n')
  {
    pos = 0;
    line += 1;
  }
  else if (ch == '\t')
  {
    pos = DOALIGN(pos + 1, 8);
  }
  else
  {
    pos += 1;
  }

  return ch;
}

void dbSubSql::unget(int ch)
{
  if (ch != EOF)
  {
    if (ch != '\n')
    {
      pos -= 1;
    }
    else
    {
      line -= 1;
    }

    ungetc(ch, in);
  }
}

void dbSubSql::warning(char const* msg)
{
  fprintf(stderr, "%s at line %d position %d\n", msg, line, tknPos > 0 ? tknPos - 1 : 0);
}

void dbSubSql::error(char const* msg)
{
#ifdef THROW_EXCEPTION_ON_ERROR
  dbDatabaseThreadContext* ctx = threadContext.get();

  if (ctx != NULL)
  {
    ctx->interactive = true;
  }

  try
  {
    handleError(QueryError, msg, tknPos > 0 ? tknPos - 1 : 0);
  }
  catch(dbException)
  {}

#else

  dbDatabaseThreadContext* ctx = threadContext.get();

  if (ctx != NULL)
  {
    ctx->interactive = true;
    ctx->catched = true;

    if (setjmp(ctx->unwind) == 0)
    {
      handleError(QueryError, msg, tknPos > 0 ? tknPos - 1 : 0);
    }

    ctx->catched = false;
  }
  else
  {
    handleError(QueryError, msg, tknPos > 0 ? tknPos - 1 : 0);
  }

#endif
}


int dbSubSql::scan()
{
  int i, ch, digits;

  if (ungetToken >= 0)
  {
    int tkn = ungetToken;
    ungetToken = -1;
    return tkn;
  }

nextToken:

  do
  {
    if ((ch = get
                ()) == EOF)
      {
        return tkn_eof;
      }
  }
  while (isspace(ch));

  tknPos = pos;

  switch (ch)
  {

  case '*':
    return tkn_all;

  case '(':
    return tkn_lpar;

  case ')':
    return tkn_rpar;

  case ',':
    return tkn_comma;

  case '.':
    return tkn_dot;

  case ';':
    return tkn_semi;

  case '=':
    return tkn_eq;

  case '\'':
    i = 0;

    while (true)
    {

      ch = get
             ();

      if (ch == '\'')
      {
        if ((ch = get
                    ()) != '\'')
          {
            unget(ch);
            break;
          }
      }
      else if (ch == '\n' || ch == EOF)
      {
        unget(ch);
        error("New line within character constant");
        return tkn_error;
      }

      if (i+1 == buflen)
      {
        char* newbuf = new char[buflen*2];
        memcpy(newbuf, buf, buflen);
        delete[] buf;
        buf = newbuf;
        buflen *= 2;
      }

      buf[i++] = ch;
    }

    buf[i] = '\0';
    return tkn_sconst;

  case '-':

    if ((ch = get
                ()) == '-')
      {
        // ANSI comments

        while ((ch = get
                       ()) != EOF && ch != '\n');

        goto nextToken;
      }

    unget(ch);
    ch = '-';
    // no break

  case '0':

  case '1':

  case '2':

  case '3':

  case '4':

  case '5':

  case '6':

  case '7':

  case '8':

  case '9':

  case '+':
    i = 0;

    do
    {
      buf[i++] = ch;

      if (i == buflen)
      {
        error("Numeric constant too long");
        return tkn_error;
      }

      ch = get
             ();
    }
    while (ch != EOF
           && (isdigit(ch) || ch == '+' || ch == '-' || ch == 'e' ||
               ch == 'E' || ch == '.'));

    unget(ch);

    buf[i] = '\0';

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

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

      return tkn_fconst;
    }

    return tkn_iconst;

  default:

    if (isalpha(ch) || ch == '$' || ch == '_')
    {
      i = 0;

      do
      {
        buf[i++] = ch;

        if (i == buflen)
        {
          error("Identifier too long");
          return tkn_error;
        }

        ch = get
               ();
      }
      while (ch != EOF && (isalnum(ch) || ch == '$' || ch == '_'));

      unget(ch);

      buf[i] = '\0';

      name = buf;

      return dbSymbolTable::add
               (name, tkn_ident);
    }
    else
    {
      error("Invalid symbol");
      return tkn_error;
    }
  }
}


bool dbSubSql::expect(char* expected, int token)
{
  int tkn = scan();

  if (tkn != token)
  {
    if (tkn != tkn_error)
    {
      char buf[256];
      sprintf(buf, "Token '%s' expected", expected);
      error(buf);
    }

    return false;
  }

  return true;
}


bool dbSubSql::updateTable(bool create)
{
  int tkn;

  if (!expect("table name", tkn_ident) || !expect("(", tkn_lpar))
  {
    return false;
  }

  char* name = this->name;
  int varyingLength = strlen(name)+1;

  static const struct
  {
    int size;
    int alignment;
  }

  typeDesc[] = {
                 { sizeof(bool), sizeof(bool) },
                 { sizeof(int1), sizeof(int1) },
                 { sizeof(int2), sizeof(int2) },
                 { sizeof(int4), sizeof(int4) },
                 { sizeof(db_int8), sizeof(db_int8) },
                 { sizeof(real4), sizeof(real4) },
                 { sizeof(real8), sizeof(real8) },
                 { sizeof(dbVarying), 4 },
                 { sizeof(oid_t), sizeof(oid_t) },
                 { sizeof(dbVarying), 4 }
               };

  const int maxFields = 256;
  tableField fields[maxFields];
  int nFields = 0;
  int nColumns = 0;
  tkn = tkn_comma;

  while (tkn == tkn_comma)
  {
    if (nFields+1 == maxFields)
    {
      error("Too many fields");
      break;
    }

    if (!expect("field name", tkn_ident))
    {
      break;
    }

    int nameLen = strlen(buf)+1;
    fields[nFields].name = new char[nameLen];
    strcpy(fields[nFields].name, buf);
    varyingLength += nameLen + 2;
    char* refTableName;
    char* inverseRefName;
    int type = parseType(refTableName, inverseRefName);
    fields[nFields++].type = type;

    if (type == dbField::tpUnknown)
    {
      break;
    }

    nColumns += 1;

    if (type == dbField::tpArray)
    {
      if (nFields+1 == maxFields)
      {
        error("Too many fields");
        break;
      }

      fields[nFields].name = new char[nameLen+2];
      sprintf(fields[nFields].name, "%s[]", fields[nFields-1].name);
      varyingLength += nameLen+2+2;
      type = parseType(refTableName, inverseRefName);

      if (type == dbField::tpUnknown)
      {
        break;
      }

      if (type == dbField::tpArray)
      {
        error("Arrays of arrays are not supported by CLI");
        break;
      }

      if (type == dbField::tpReference)
      {
        fields[nFields].refTableName = refTableName;
        varyingLength += strlen(refTableName);

        if (inverseRefName != NULL)
        {
          fields[nFields-1].inverseRefName = inverseRefName;
          varyingLength += strlen(inverseRefName);
        }
      }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品一二三四| 欧美日本免费一区二区三区| 黄页网站大全一区二区| 久久精品国产亚洲一区二区三区| 日韩国产欧美在线视频| 日韩va亚洲va欧美va久久| 日本不卡视频在线观看| 麻豆精品视频在线| 国产一区二三区好的| 国产乱人伦偷精品视频不卡 | 精品在线播放午夜| 免费成人av资源网| 久久综合综合久久综合| 久久超级碰视频| 国产盗摄视频一区二区三区| 成人深夜福利app| 色狠狠色狠狠综合| 欧美猛男男办公室激情| 日韩一二在线观看| 久久精品人人爽人人爽| 中文字幕乱码亚洲精品一区| 国产精品久久久久久久久晋中 | 中文字幕制服丝袜成人av| 成人欧美一区二区三区白人 | 久久国产精品第一页| 国产精品影视在线| av网站免费线看精品| 色播五月激情综合网| 欧美一区二区三区四区在线观看| 精品国精品自拍自在线| 国产亚洲短视频| 亚洲另类在线视频| 日韩国产精品久久久| 国产.欧美.日韩| 91精品1区2区| 日韩三级视频在线观看| 中文欧美字幕免费| 午夜亚洲国产au精品一区二区| 美国av一区二区| 97超碰欧美中文字幕| 欧美肥妇bbw| 日本一区二区三级电影在线观看| 国产精品一二三在| 99re8在线精品视频免费播放| 欧美日韩视频在线第一区| 久久久久久久综合色一本| 亚洲精选一二三| 久久激情五月婷婷| 色综合一区二区| 欧美videos中文字幕| 亚洲免费观看高清完整版在线观看| 日韩国产欧美三级| 99久久综合99久久综合网站| 欧美午夜一区二区三区| 国产欧美日韩在线视频| 丝袜国产日韩另类美女| 99久久精品国产麻豆演员表| 日韩一区二区在线观看视频播放| 亚洲欧美偷拍另类a∨色屁股| 另类欧美日韩国产在线| 色婷婷精品大视频在线蜜桃视频| 精品欧美一区二区久久| 亚洲欧美另类小说| 国产激情精品久久久第一区二区 | 成人黄页毛片网站| 日韩欧美一区二区在线视频| 亚洲精品国产一区二区三区四区在线 | 91国偷自产一区二区三区观看| 日韩欧美在线影院| 亚洲一区二区三区四区的 | 欧美天堂一区二区三区| 日本一区二区成人在线| 日韩黄色在线观看| 在线看国产日韩| 中文字幕在线观看不卡| 国产一区二区0| 日韩一二三区不卡| 亚洲成av人片在线观看无码| 成人国产在线观看| 久久久电影一区二区三区| 美女性感视频久久| 91精品国产综合久久久久久久久久 | 亚洲日本在线看| 成人免费不卡视频| 国产午夜一区二区三区| 精品无人区卡一卡二卡三乱码免费卡 | 99久久99久久久精品齐齐| 久久久精品影视| 国模无码大尺度一区二区三区| 6080国产精品一区二区| 亚洲国产日韩综合久久精品| 一本色道久久综合亚洲aⅴ蜜桃 | 91精品国产aⅴ一区二区| 亚洲激情av在线| 99国产麻豆精品| 国产精品护士白丝一区av| 成人精品小蝌蚪| 国产女人aaa级久久久级| 国产福利一区在线观看| 亚洲精品在线电影| 久久99久国产精品黄毛片色诱| 91麻豆精品国产91久久久久 | 欧美日韩国产大片| 午夜久久久影院| 欧美日本在线看| 美美哒免费高清在线观看视频一区二区| 婷婷开心久久网| 欧美吻胸吃奶大尺度电影 | 首页国产欧美日韩丝袜| 在线日韩一区二区| 一区二区三区精品久久久| 99热99精品| 亚洲精品乱码久久久久久| 欧美亚洲一区三区| 香蕉影视欧美成人| 91精品国产一区二区三区| 免费人成黄页网站在线一区二区 | 日本一区中文字幕| 欧美成人三级电影在线| 国产精品一区二区视频| 国产拍揄自揄精品视频麻豆| 国产成人99久久亚洲综合精品| 国产精品视频一区二区三区不卡| 97精品电影院| 三级一区在线视频先锋| 日韩精品在线网站| 不卡av在线网| 亚洲va欧美va天堂v国产综合| 欧美一级午夜免费电影| 国产精品一区在线观看你懂的| 国产精品久久精品日日| 欧美无砖专区一中文字| 蜜桃久久久久久久| 亚洲国产成人在线| 欧美日韩美少妇| 激情综合网av| 一区二区高清视频在线观看| 欧美美女喷水视频| 国产丶欧美丶日本不卡视频| 亚洲黄色小视频| 精品国产3级a| 色系网站成人免费| 喷水一区二区三区| 中文字幕第一区二区| 欧美日韩中文精品| 国产成人免费在线视频| 亚洲综合色婷婷| 国产亚洲婷婷免费| 欧美日韩卡一卡二| 国产精品911| 亚洲v中文字幕| 国产欧美日韩不卡| 欧美人伦禁忌dvd放荡欲情| 成人一区二区三区中文字幕| 午夜精品免费在线| 欧美国产精品久久| 777午夜精品视频在线播放| 成人av网站在线观看| 久久精品国产精品亚洲红杏| 亚洲人成亚洲人成在线观看图片 | 亚洲一二三四在线| 久久蜜桃香蕉精品一区二区三区| 久久久蜜臀国产一区二区| 日本电影亚洲天堂一区| 国产成人综合自拍| 奇米影视在线99精品| 亚洲精品日韩一| 国产午夜精品一区二区三区嫩草| 欧美特级限制片免费在线观看| 国产精品99久久久久久久vr| 五月婷婷综合在线| 亚洲人成精品久久久久| 久久久亚洲精华液精华液精华液| 欧美日韩亚洲另类| 91美女片黄在线观看| 国产精品影视天天线| 久久不见久久见免费视频7| 亚洲五码中文字幕| 亚洲欧美日韩精品久久久久| 中文字幕第一页久久| 久久综合久色欧美综合狠狠| 在线不卡免费欧美| 欧美日韩精品综合在线| 色综合色综合色综合色综合色综合| 国产精品自拍av| 黄色小说综合网站| 精品一区在线看| 日本视频中文字幕一区二区三区| 亚洲精品国久久99热| 亚洲人精品午夜| 久久精品亚洲国产奇米99| 2020国产精品久久精品美国| 777精品伊人久久久久大香线蕉| 欧美影院一区二区三区| 日本久久电影网| 91激情在线视频| 日本道色综合久久| 日本韩国一区二区| 欧洲精品中文字幕| 91久久人澡人人添人人爽欧美|