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

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

?? myldblexer.pas

?? 一個本地database引擎,支持中文T_Sql查詢,兼容DELPHI標準數據庫控件
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
unit MYLDBLexer;

{$I MYLDBVer.inc}

interface

uses classes, windows, sysutils, db,
{$IFDEF DEBUG_LOG}
 MYLDBDebug,
{$ENDIF}
 MYLDBVariant,
 MYLDBExcept,
 MYLDBConst;



const Lf: string = #$0A;       // binary mode line separator
const Cr: string = #$0D;       // text mode line separator
const Crlf: string = #$0D#$0A; // text mode line separator
const Tab: string = #$09; // <tab>
const Comment = '-'; // -- comment <Crlf>
const Comment1 = '#'; // # comment <Crlf>
const Dot = '.';
const Comma = ',';
const SemiColon = ';';
const Asterisk = '*';
const SingleQuote = '''';
const BackQuote = '`';
const DoubleQuote = '"';
const Space = ' ';
const LeftParenthesis = '(';
const RightParenthesis = ')';
const LeftSquareBracket = '[';
const RightSquareBracket = ']';
const Percent = '%';
const BackSlash = '\';

EMYLDBTokenType: array [0..11] of string =
(
 'tktNone', 'tktString', 'tktQuotedString', 'tktBracketedString',
 'tktInt', 'tktFloat', 'tktReservedWord',
 'tktParameter', 'tktLeftParenthesis', 'tktRightParenthesis',
 'tktComma', 'tktDot'
);

type
 TTokenType = (tktNone, tktString, tktQuotedString, tktBracketedString,
 tktInt, tktFloat, tktReservedWord,
 tktParameter, tktLeftParenthesis, tktRightParenthesis,
 tktComma, tktDot);

 TTokenTypes = set of TTokenType;

 TToken = record
  TokenType:      TTokenType;
  ReservedWord:   TReservedWord;
  Text:           String;
  ParamValue:     TMYLDBVariant;
  LineNum:        Integer; // number of line in script where token begins
  ColumnNum:      Integer; // number of column in script where token begins
 end;

 PToken = ^TToken;

 TSQLCommand = record
  Tokens:     array of TToken;
  NumTokens:  Integer;
  CurrentTokenNo: Integer;
 end;


////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBSQLParam
//
////////////////////////////////////////////////////////////////////////////////

  TMYLDBSQLParam = class (TMYLDBVariant)
   public
    Name:  String;
  end;


////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBSQLParams
//
////////////////////////////////////////////////////////////////////////////////

  TMYLDBSQLParams = class (TObject)
   private
    FParamList: TList;
   private
    function GetCount: Integer;
    function GetValue(Index: Integer): TMYLDBSQLParam;
    procedure SetValue(Index: Integer; Value: TMYLDBSQLParam);
   public
    constructor Create;
    destructor Destroy; override;
    procedure Clear;
    function AddCreated: TMYLDBSQLParam;
    function GetParamByName(Name: String): TMYLDBSQLParam;
   public
    property Count: Integer read GetCount;
    property Items[Index: Integer]: TMYLDBSQLParam read GetValue write SetValue; default;
  end;//TMYLDBSQLParams




 TMYLDBLexer = class (TObject)
  private
   FSQL:              String;
   FSQLParams:        TMYLDBSQLParams;
  private
   procedure Parse;
  public
   NumCommands:       Integer;
   Commands:          array of TSQLCommand;
   CurrentCommandNo:  Integer;

   constructor Create(SQLScript: string; SQLParams: TMYLDBSQLParams = nil);
   destructor Destroy; override;
   function Test(bGenerate: Boolean = true; bShowDetails: Boolean = true): string;
   procedure AddCommand;
   procedure AddToken(Token: TToken);

   // makes next command current
   function GetNextCommand: Boolean;
   // gets next token in current command
   function GetNextToken(var Token: TToken): Boolean;
   // gets current token in current command
   function GetCurrentToken(var Token: TToken): Boolean;
   // looks at next token
   function LookNextToken(var Token: TToken): Boolean;
   // gets current token No
   function GetCurrentTokenNo: integer;
   // sets current token No
   function SetCurrentTokenNo(TokenNo: integer; var Token: TToken): Boolean; overload;
   function SetCurrentTokenNo(TokenNo: integer): Boolean; overload;
   // gets first next token specified type
   function GetNextSpecifiedToken(var Token: TToken; TokenTypes: TTokenTypes): Boolean;
 end;

 // checks whether token is reserved word
 function IsReservedWord(Token: TToken; ReservedWord: TReservedWord=rwNone): Boolean;
 function FindReservedWord(s: string): Integer;


implementation

uses MYLDBTypes;

////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBSQLParams
//
////////////////////////////////////////////////////////////////////////////////


//------------------------------------------------------------------------------
// Constructor
//------------------------------------------------------------------------------
constructor TMYLDBSQLParams.Create;
begin
  FParamList := TList.Create;
end;//Create


//------------------------------------------------------------------------------
// Destructor
//------------------------------------------------------------------------------
destructor TMYLDBSQLParams.Destroy;
begin
  Clear;
  FParamList.Free;
end;//Destroy


//------------------------------------------------------------------------------
// return Count
//------------------------------------------------------------------------------
function TMYLDBSQLParams.GetCount: Integer;
begin
  Result := FParamList.Count;
end;//GetCount


//------------------------------------------------------------------------------
// GetValue
//------------------------------------------------------------------------------
function TMYLDBSQLParams.GetValue(Index: Integer): TMYLDBSQLParam;
begin
  Result := TMYLDBSQLParam(FParamList[Index]);
end;//GetValue


//------------------------------------------------------------------------------
// SetValue
//------------------------------------------------------------------------------
procedure TMYLDBSQLParams.SetValue(Index: Integer; Value: TMYLDBSQLParam);
begin
  TMYLDBSQLParam(FParamList[Index]).Free;
  FParamList[Index] := Value;
end;//SetValue


//------------------------------------------------------------------------------
// AddCreated
//------------------------------------------------------------------------------
function TMYLDBSQLParams.AddCreated: TMYLDBSQLParam;
begin
  Result := TMYLDBSQLParam.Create;
  FParamList.Add(Result);
end;//AddCreated


//------------------------------------------------------------------------------
// Clear
//------------------------------------------------------------------------------
procedure TMYLDBSQLParams.Clear;
var i: Integer;
begin
  for i:=0 to Count-1 do
    TMYLDBSQLParam(FParamList[i]).Free;
  FParamList.Clear;
end;//Clear


//------------------------------------------------------------------------------
// GetParamByName
//------------------------------------------------------------------------------
function TMYLDBSQLParams.GetParamByName(Name: String): TMYLDBSQLParam;
var i: Integer;
begin
  Result := nil;
  for i:=0 to Count-1 do
   if (AnsiUpperCase(items[i].Name) = AnsiUpperCase(Name)) then
    begin
     Result := items[i];
     Break;
    end;
end;//GetParamByName




////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBLexer
//
////////////////////////////////////////////////////////////////////////////////


//------------------------------------------------------------------------------
// Parse SQL script
//------------------------------------------------------------------------------
procedure TMYLDBLexer.Parse;
var i,l:      Integer;
    line,command,token,column:  Integer;
    c,priorSymbol:   char;
    numParenthesis,
    LeftParenthesisLine,
    LeftParenthesisColumn,
    RightParenthesisLine,
    RightParenthesisColumn,
    quoteLine,quoteColumn: Integer;
    bIsDelimiter:     boolean;
    bTokenStarted:    boolean;
    bCommandStarted:  boolean;
    bNewTokenStarted: boolean;
    bTokenFinished:   boolean;
    bQuoteNotClosed:  boolean;
    LastParamNo: Integer;

  function GetNextSymbol: char;
  begin
   result := ' ';
    if (i < l-1) then
     result := pChar(pChar(FSQL)+i+1)^;
  end;


 function IsNewTokenStarted: Boolean;
 begin
  result := false;
  if (bTokenStarted) then
   begin
      if (c = '>') or (c = '<') or (c = '=') or (c = '(') or (c = ')') or
         (c = ',') or (c = '/') or (c = '*') or (c = ':') or (c = '?') or (c = '|') or
         ((c=Dot) and (Commands[command].Tokens[token].TokenType<>tktInt)) then
           result := true
      else
      if (Commands[command].Tokens[token].TokenType = tktDot) then
       begin
         if not ((c >= '0') and (c <= '9')) and (c <> space) then
          result := true;
       end
      else
      if (Commands[command].Tokens[token].TokenType = tktString) then
       begin
        if (c = '+') or (c = '-') then
         result := true;
       end
      else
      if (Commands[command].Tokens[token].TokenType = tktInt) then
       begin
        if (c = '+') and (UpperCase(priorSymbol) <> 'E') then
         result := true
        else
        if (c = '-') and (UpperCase(priorSymbol) <> 'E') then
         result := true;
       end; // Int or Float token
   end // some token already started
  else
   begin
    if (not bIsDelimiter) then
     result := true;
   end; // no token started
 end; // IsNewTokenStarted

 function IsTokenFinished: Boolean;
 begin
  result := false;
  if (bTokenStarted) then
   begin
    if (bIsDelimiter) then
     result := true;
   end;
 end; // IsTokenFinished

 procedure CreateCommand;
 begin
  inc(NumCommands);
  SetLength(Commands, NumCommands);
  command := NumCommands-1;
  Commands[command].NumTokens := 0;
  Commands[command].Tokens := nil;
  token := 0;
  bCommandStarted := true;
  numParenthesis := 0;
 end; // CreateCommand;

 procedure CloseToken;
 var i:         Integer;
     Param:     TMYLDBSQLParam;
     ParamName: String;
//     oldSeparator: char;
 begin
  if (not bTokenStarted) then
   Exit;
  // check int or float
  if (Commands[command].Tokens[token].TokenType = tktInt) then
   begin
    // check int or float
    if (Pos('.',Commands[command].Tokens[token].Text) > 0) then
     Commands[command].Tokens[token].TokenType := tktFloat
    else
    if (Pos('E',UpperCase(Commands[command].Tokens[token].Text)) > 0) then
     Commands[command].Tokens[token].TokenType := tktFloat;
   end;
  // String
  if (Commands[command].Tokens[token].TokenType = tktString) then
   begin
    // check for SQLParameter ( :name)
    if (Commands[command].Tokens[token].Text[1] in [':', '?'] ) then
     begin
      Commands[command].Tokens[token].TokenType := tktParameter;
      if (Commands[command].Tokens[token].Text[1] = ':') then
       begin
        // param name without ':'
        ParamName := Copy(Commands[command].Tokens[token].Text, 2,
                         Length(Commands[command].Tokens[token].Text)-1);
        Commands[command].Tokens[token].Text := ParamName;
        // try to set param value
        if Assigned(FSQLParams) then
          Param := FSQLParams.GetParamByName(ParamName);
       end
      else
       begin
        Param := FSQLParams[LastParamNo];
        Inc(LastParamNo);
        ParamName := 'Param' + IntToStr(LastParamNo);
        Commands[command].Tokens[token].Text := ParamName;
       end;

      if (Param <> nil) then
        begin
          // commented in 5.02 (to support NULL params of unknown type)
//          if (Param.DataType = bftUnknown) then
//            raise EMYLDBException.Create(20271, ErrorAParameterOfUnknownType, [Param.Name]);
          Commands[command].Tokens[token].ParamValue := TMYLDBVariant.Create;
          Commands[command].Tokens[token].ParamValue.Assign(Param);
        end
      else
        raise EMYLDBException.Create(30358, ErrorGParameterValueNotFound, [ParamName]);
     end
    else
     begin
      // check for reserved word
      i := FindReservedWord(Commands[command].Tokens[token].Text);
      if (i > 0) then
       begin
        Commands[command].Tokens[token].ReservedWord := TReservedWord(i);
        Commands[command].Tokens[token].TokenType := tktReservedWord;
       end;
     end;
   end;// if String
  bTokenStarted := false;
 end; // CloseToken;

 procedure CreateToken;
 var NextSymbol: char;
     quoteSymbol: char;
 begin
  if (not bCommandStarted) then
   CreateCommand;
  bTokenStarted := true;
  inc(Commands[command].NumTokens);
  SetLength(Commands[command].Tokens,Commands[command].NumTokens);

  token := Commands[command].NumTokens - 1;
  Commands[command].Tokens[token].Text := c;
  Commands[command].Tokens[token].ColumnNum := column;
  Commands[command].Tokens[token].LineNum := line;
  Commands[command].Tokens[token].ReservedWord := rwNone;
  Commands[command].Tokens[token].ParamValue := nil;

  NextSymbol := GetNextSymbol;
  // here will be scanning quoted string to its end
  if (c = SingleQuote) or (c = BackQuote) or (c = DoubleQuote) or (c = LeftSquareBracket) or
     ((c=':') and (NextSymbol in [SingleQuote, DoubleQuote, LeftSquareBracket]))then
   begin
    Commands[command].Tokens[token].Text := '';
    case c of
      SingleQuote, DoubleQuote:
         Commands[command].Tokens[token].TokenType := tktQuotedString;
      BackQuote:
         Commands[command].Tokens[token].TokenType := tktString;
      LeftSquareBracket:
         Commands[command].Tokens[token].TokenType := tktBracketedString;
      ':':
         Commands[command].Tokens[token].TokenType := tktString;
    end;
    if (c = ':') then
      begin
        Commands[command].Tokens[token].Text := ':';
        if (NextSymbol <> LeftSquareBracket) then
         quoteSymbol := NextSymbol
        else
         quoteSymbol := RightSquareBracket;
        inc(i);
      end
    else
      if (c <> LeftSquareBracket) then
       quoteSymbol := c
      else
       quoteSymbol := RightSquareBracket;
    quoteLine := line;
    quoteColumn := column;
    bQuoteNotClosed := true;
    inc(i);
    while (i < l) do
     begin
      c := pChar(pChar(FSQL)+i)^;
      if ((quoteSymbol in [BackQuote]) and (c = BackSlash)) then
       begin
        Inc(i);
        if (not (i < l)) then
          Break;
        c := pChar(pChar(FSQL)+i)^;
       end;
      NextSymbol := GetNextSymbol;
      if (c = quoteSymbol) then
       begin
        if (NextSymbol = c) then
         begin
          Commands[command].Tokens[token].Text :=
            Commands[command].Tokens[token].Text + c;
          inc(i,2);
          inc(column,2);
          continue;
         end // ''
        else
         begin
          // end of QuotedStr
          bQuoteNotClosed := false;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产一二三| 精品久久久久久久久久久久包黑料| aaa欧美日韩| 欧美福利视频导航| 国产精品国产三级国产| 亚洲成a人v欧美综合天堂| 国产盗摄一区二区| 欧美日韩夫妻久久| 亚洲欧美日韩国产中文在线| 久久99精品国产| 欧美色男人天堂| 国产精品久久久99| 国产一区在线观看视频| 欧美精品在线视频| 亚洲蜜臀av乱码久久精品蜜桃| 国产在线乱码一区二区三区| 欧美色综合影院| 日本一区二区三区在线不卡| 麻豆高清免费国产一区| 国产一区二区美女| 欧美日韩精品一二三区| 亚洲精品第一国产综合野| 国内成+人亚洲+欧美+综合在线| 欧美日韩你懂得| 亚洲国产精品成人综合| 亚洲成av人片观看| 成人污污视频在线观看| 色婷婷综合中文久久一本| 久久夜色精品国产欧美乱极品| 日本怡春院一区二区| 91网站在线播放| 综合自拍亚洲综合图不卡区| 精品一区二区三区久久| 精品视频在线免费| 亚洲欧美日韩国产成人精品影院| 久久精品国产99国产精品| 欧美日韩国产欧美日美国产精品| 亚洲精品国产视频| 99精品久久久久久| 日韩免费电影一区| 久久精品国产免费| 91精品国产色综合久久| 亚洲成人先锋电影| 91小视频免费观看| 精品福利视频一区二区三区| 亚洲综合丁香婷婷六月香| 国产成人精品在线看| 久久久久国产精品人| 亚洲3atv精品一区二区三区| 91精品国产麻豆国产自产在线| 亚洲乱码中文字幕| 欧美精品一二三区| 亚洲综合免费观看高清在线观看| 欧美日本一区二区三区| 亚洲最新视频在线观看| 在线91免费看| 水野朝阳av一区二区三区| 91精品黄色片免费大全| 日本不卡免费在线视频| www国产亚洲精品久久麻豆| 久久97超碰国产精品超碰| 久久久三级国产网站| 粉嫩av一区二区三区在线播放| 亚洲人吸女人奶水| 欧美日韩精品三区| 午夜精品123| 精品美女被调教视频大全网站| 天堂午夜影视日韩欧美一区二区| 日韩色在线观看| 国产一区二区精品久久91| 中文字幕日本乱码精品影院| 日本高清不卡aⅴ免费网站| 日本怡春院一区二区| 久久久久久日产精品| 一本色道久久综合狠狠躁的推荐 | 中文字幕av一区二区三区免费看| 99久久免费视频.com| 亚洲自拍欧美精品| 精品国产99国产精品| 高清成人免费视频| 亚洲第一会所有码转帖| 91精品午夜视频| 成人高清视频在线观看| 亚洲一区二区三区小说| 久久免费视频一区| 欧美性受xxxx| 亚洲h精品动漫在线观看| 国产色综合一区| 欧美日韩激情一区二区| 激情五月播播久久久精品| 久久你懂得1024| 69久久99精品久久久久婷婷| 国产精品一区三区| 奇米精品一区二区三区在线观看 | 九九精品视频在线看| 久久久国产精品麻豆| www.欧美色图| 国产成人小视频| 亚洲超碰精品一区二区| 尤物在线观看一区| 久久九九全国免费| 日韩免费一区二区三区在线播放| 91在线你懂得| 成人成人成人在线视频| 欧美aⅴ一区二区三区视频| 亚洲va欧美va天堂v国产综合| 欧美国产欧美亚州国产日韩mv天天看完整| 欧美一区二区播放| 欧美亚洲国产bt| 色综合 综合色| 国产suv精品一区二区三区| 日日摸夜夜添夜夜添国产精品| 日韩色视频在线观看| 欧洲一区在线电影| 色久综合一二码| 99久久婷婷国产精品综合| 韩国精品主播一区二区在线观看| 亚洲大片在线观看| 艳妇臀荡乳欲伦亚洲一区| 久久久久久久综合色一本| 日韩一区二区在线看| 99久久精品久久久久久清纯| 日韩影院精彩在线| 日韩福利视频网| 美腿丝袜亚洲三区| 国产精品国产自产拍在线| 色综合天天做天天爱| 久久99久久久久| 五月激情综合色| 三级成人在线视频| 亚洲电影激情视频网站| 亚洲国产精品嫩草影院| 国产精品国产三级国产普通话三级| 国产精品久久久久久户外露出 | 99这里只有精品| 成人av一区二区三区| 久久国产人妖系列| 美女爽到高潮91| 免费观看30秒视频久久| 伦理电影国产精品| 精品一区二区三区免费毛片爱| 韩国三级在线一区| 色综合久久中文综合久久牛| 国产suv一区二区三区88区| 91一区二区在线| 91久久精品日日躁夜夜躁欧美| 欧美精品在线一区二区| 欧美性色综合网| 日韩精品一区二区三区老鸭窝| 日韩一级欧美一级| 精品伦理精品一区| 亚洲色图19p| 青青草成人在线观看| 国产激情视频一区二区在线观看 | 欧洲av一区二区嗯嗯嗯啊| 一本一道综合狠狠老| 欧美三级日韩三级| 欧美成人性福生活免费看| 欧美成人猛片aaaaaaa| 国产午夜精品福利| 亚洲午夜视频在线| 韩国av一区二区| 91黄色免费网站| 日韩女优av电影| 亚洲电影第三页| 国产麻豆欧美日韩一区| 欧美色图在线观看| 精品国精品国产尤物美女| 一区二区三区中文字幕在线观看| 亚洲美女精品一区| 处破女av一区二区| 91国产免费观看| 久久久久久免费网| 欧美96一区二区免费视频| 99久久99久久综合| 精品视频在线免费看| 国产日产欧美一区| 亚洲综合在线电影| 国内一区二区视频| 欧美日韩精品专区| 久久精品亚洲国产奇米99| 亚洲一区日韩精品中文字幕| 激情av综合网| 欧美在线不卡一区| 久久久精品国产免费观看同学| 亚洲一区二区三区四区在线观看| 精久久久久久久久久久| 日本久久电影网| 国产精品久久久久天堂| 婷婷六月综合网| 色中色一区二区| 久久久噜噜噜久久人人看| 亚洲国产成人porn| 欧美亚洲愉拍一区二区| 国产精品美女久久久久久久久| 国产精品123区| 日韩精品中文字幕一区二区三区 | 亚洲三级电影网站| 国产自产v一区二区三区c| 9191久久久久久久久久久|