亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国内成+人亚洲+欧美+综合在线| 久99久精品视频免费观看| 在线播放中文字幕一区| 国产一区二区电影| 日韩一区欧美二区| 亚洲日本va午夜在线电影| 日韩午夜激情视频| 欧美视频日韩视频在线观看| 国产精品1区2区3区| 日韩福利视频导航| 伊人一区二区三区| 国产精品视频线看| 精品国产麻豆免费人成网站| 欧美日韩中文一区| 99国产一区二区三精品乱码| 国产精品1区二区.| 久久福利视频一区二区| 亚洲电影中文字幕在线观看| 中文字幕在线不卡国产视频| 国产亚洲人成网站| 欧美精品一区二区久久久| 欧美日韩夫妻久久| 欧美三级日韩三级国产三级| 91在线码无精品| 国产成人精品www牛牛影视| 麻豆91在线播放免费| 亚洲成人精品一区二区| 一区二区三区日本| 亚洲免费资源在线播放| 国产精品久久久久婷婷| 中文字幕精品三区| 中文字幕高清不卡| 国产日韩欧美精品综合| 久久午夜老司机| 久久综合视频网| 久久蜜臀精品av| 久久品道一品道久久精品| 欧美电影免费观看高清完整版在线 | 美女mm1313爽爽久久久蜜臀| 亚洲成人精品在线观看| 五月婷婷综合在线| 日日摸夜夜添夜夜添精品视频 | 国产精品久久久久影院亚瑟 | 美女性感视频久久| 麻豆91精品91久久久的内涵| 久久精品国内一区二区三区 | 欧美在线不卡一区| 欧美视频在线观看一区| 欧美日韩一级二级| 51精品久久久久久久蜜臀| 这里是久久伊人| 日韩一区二区三区视频在线| 精品久久久久久亚洲综合网| 国产三级精品视频| 国产精品视频观看| 亚洲色欲色欲www| 亚洲一区二区影院| 视频一区二区三区中文字幕| 美女一区二区视频| 国产白丝精品91爽爽久久| 91丨九色porny丨蝌蚪| 欧美色网一区二区| 这里是久久伊人| 国产免费成人在线视频| 亚洲免费av在线| 视频在线观看国产精品| 国产精品综合久久| 91在线看国产| 欧美一二三在线| 国产欧美一区二区精品久导航| 自拍偷拍欧美精品| 亚洲成人1区2区| 国产在线不卡一区| 91蝌蚪porny成人天涯| 欧美一区永久视频免费观看| 久久综合精品国产一区二区三区| 国产精品不卡视频| 亚洲福利国产精品| 国产在线不卡一卡二卡三卡四卡| 99视频精品免费视频| 欧美精品三级日韩久久| 国产亚洲一本大道中文在线| 一区二区理论电影在线观看| 看电影不卡的网站| 一本久道中文字幕精品亚洲嫩 | 亚洲精品欧美二区三区中文字幕| 丝袜美腿亚洲综合| 成人免费av网站| 欧美三日本三级三级在线播放| 精品久久久久99| 一区二区不卡在线播放| 极品美女销魂一区二区三区| 91视频免费看| 久久久久亚洲蜜桃| 亚洲成人免费av| 成人美女视频在线看| 粉嫩13p一区二区三区| 欧美日韩国产精选| 国产精品免费免费| 亚洲大片在线观看| 99视频在线精品| 精品国产91洋老外米糕| 丝袜a∨在线一区二区三区不卡 | 欧洲激情一区二区| 精品少妇一区二区三区在线视频 | 91久久国产最好的精华液| 日韩午夜在线观看视频| 亚洲毛片av在线| 国产传媒久久文化传媒| 91精品国产91久久久久久最新毛片 | 欧美男女性生活在线直播观看| 国产亚洲综合色| 麻豆久久一区二区| 欧美日韩国产另类不卡| 亚洲精品一二三区| 波多野结衣亚洲| 久久精品视频在线看| 九一久久久久久| 日韩精品一区在线| 亚洲高清不卡在线观看| 色综合激情五月| 亚洲精品午夜久久久| av中文字幕亚洲| 中文字幕一区二区三区不卡在线| 国产精品白丝jk白祙喷水网站 | 亚洲尤物视频在线| 色综合中文字幕国产 | 欧美成人艳星乳罩| 图片区小说区区亚洲影院| 欧洲精品在线观看| 有坂深雪av一区二区精品| 99久久精品免费精品国产| 免费人成黄页网站在线一区二区| 在线视频亚洲一区| 亚洲人成精品久久久久| av在线播放成人| 亚洲品质自拍视频| 色天天综合久久久久综合片| 亚洲男同性视频| 在线观看国产91| 亚洲成av人片在线观看无码| 欧美日韩国产一级片| 日韩精品91亚洲二区在线观看 | 久久精品视频免费观看| 国产高清在线精品| 国产精品久久三| 99re热视频这里只精品| 亚洲综合无码一区二区| 在线免费视频一区二区| 亚洲第一成年网| 欧美电影免费观看高清完整版在 | 国产成人在线观看免费网站| 久久久不卡网国产精品二区| 成人国产在线观看| 亚洲激情自拍偷拍| 欧美人与禽zozo性伦| 久久成人羞羞网站| 国产精品色一区二区三区| 日本久久一区二区| 日韩精品乱码免费| 久久久久久久久97黄色工厂| 99综合电影在线视频| 亚洲第一综合色| 精品捆绑美女sm三区| 成人污污视频在线观看| 亚洲视频一区在线观看| 欧美一区午夜视频在线观看| 福利一区二区在线| 亚洲午夜私人影院| 精品久久久久香蕉网| 91蝌蚪porny九色| 琪琪一区二区三区| 国产精品免费免费| 6080日韩午夜伦伦午夜伦| 国产成人亚洲精品狼色在线| 亚洲主播在线观看| 国产清纯美女被跳蛋高潮一区二区久久w| 99视频国产精品| 青草国产精品久久久久久| 亚洲少妇最新在线视频| 日韩一区二区免费视频| av网站免费线看精品| 蜜臀av亚洲一区中文字幕| 亚洲国产精品99久久久久久久久| 欧美网站一区二区| 国产成人av福利| 亚洲成人激情综合网| 国产精品久久福利| 678五月天丁香亚洲综合网| www.久久久久久久久| 免费高清在线一区| 一区二区成人在线| 国产女同性恋一区二区| 欧美日韩国产经典色站一区二区三区| 成人综合婷婷国产精品久久蜜臀| 视频一区二区国产| 一区二区三区不卡在线观看| 久久精品视频网| 欧美一级二级在线观看| 欧美性xxxxxx少妇|