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

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

?? myldbexpressions.pas

?? 一個本地database引擎,支持中文T_Sql查詢,兼容DELPHI標準數據庫控件
?? PAS
?? 第 1 頁 / 共 5 頁
字號:
    doMAX:          Result := 'MAX';
    doCOUNT:        Result := 'COUNT';
    doCOUNTALL:     Result := 'COUNT(*)';
    else            Result:='unknown';
  end;
end;//GetOperatorName


//------------------------------------------------------------------------------
// Return FieldType
//------------------------------------------------------------------------------
function GetFieldType(const TypeName: string): TMYLDBAdvancedFieldType;
var
  i: Integer;
  s: String;
begin
  Result := aftUnknown;
  s := UpperCase(TypeName);
  for i:=Low(SQLFieldTypes) to High(SQLFieldTypes) do
    if SQLFieldTypes[i].SqlName = s then
      begin
        Result := SQLFieldTypes[i].AdvancedFieldType;
        break;
      end;
end;//GetFieldType



////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBExpression
//
////////////////////////////////////////////////////////////////////////////////


//------------------------------------------------------------------------------
// Constructor
//------------------------------------------------------------------------------
constructor TMYLDBExpression.Create;
begin
  FRootExprNode := nil;
  LLex := nil;
  FCaseInsensitive := False;
  FPartialKey := False;
  F3ValueLogic := True;
end;//Create


//------------------------------------------------------------------------------
// Constructor
//------------------------------------------------------------------------------
constructor TMYLDBExpression.Create(RootNode: TMYLDBExprNode);
begin
  Create;
  FRootExprNode := RootNode;
end;//Create


//------------------------------------------------------------------------------
// Constructor
//------------------------------------------------------------------------------
//constructor TMYLDBExpression.Create(Lexer: TMYLDBLexer);
//begin
//  Create;
//  LLex := Lexer;
//end;//Create



//------------------------------------------------------------------------------
// Destructor
//------------------------------------------------------------------------------
destructor TMYLDBExpression.Destroy;
begin
  Clear;
  inherited;
end;//Destroy


//------------------------------------------------------------------------------
// Clear all Variables
//------------------------------------------------------------------------------
procedure TMYLDBExpression.Clear;
begin
  // free nodes tree
  if (FRootExprNode <> nil) then
    begin
      FRootExprNode.Free;
      FRootExprNode := nil;
    end;
end;//Clear


//------------------------------------------------------------------------------
// Parsing for Locate
//------------------------------------------------------------------------------
procedure TMYLDBExpression.ParseForLocate(
                                          Cursor: TMYLDBCursor;
                                          FieldNames: String; // name1;name2
                                          KeyValues: Variant; //
                                          CaseInsensitive: boolean = true;
                                          PartialKey: boolean = false
                                       );
var
  i, ArrLen: Integer;
  FieldNamesList: TStringList;
  //Arr: Pointer;
  LeftNField: TMYLDBExprNodeField;
  RightNConst: TMYLDBExprNodeConst;
  EqNode: TMYLDBExprNodeComparison;
  IsArray: Boolean;
  //AndNode: TMYLDBExprNodeBoolean;
  //val: TMYLDBVariant;

  procedure AssignConstValue(const Value: Variant);
  begin
    if (LeftNField.BaseFieldType in [bftDate, bftTime, bftDateTime]) and
       (VarType(Value) in [varInteger, varDouble]) then
      RightNConst.Value.AsVariant := TDateTime(Value)
    else
      RightNConst.Value.AsVariant := Value;
  end;

begin
  Clear;
  LCursor := Cursor;
  F3ValueLogic := False;

  FieldNamesList := TStringList.Create;
  try
    FillFieldNames(FieldNamesList, FieldNames);

    // Determinate KeyValues count (can be array)
    if  (VarType(KeyValues) and varArray ) <> 0 then
      begin
        IsArray := true;
        ArrLen := VarArrayHighBound(KeyValues,1) - VarArrayLowBound(KeyValues,1) + 1
      end
    else
      begin
        IsArray := False;
        ArrLen := 1;
      end;

    if (FieldNamesList.Count <> ArrLen) then
      raise EMYLDBException.Create(30112, ErrorGNotEqualCountsOfFieldNamesAndKeyValues,
                                      [FieldNamesList.Count, ArrLen]);

    if (not IsArray) then
      begin
        // Field
        LeftNField := TMYLDBExprNodeField.Create(LCursor, FieldNamesList[0]);
        // Const
        RightNConst := TMYLDBExprNodeConst.Create;
        AssignConstValue(KeyValues);
        // RootNode
        FRootExprNode := TMYLDBExprNodeComparison.Create(doEQ, LeftNField,
                                      RightNConst, F3ValueLogic, CaseInsensitive, PartialKey);
      end
    else
      begin
        FRootExprNode := TMYLDBExprNodeBoolean.Create(doAND);
        for i:=0 to ArrLen-1 do
          begin
            // Field
            LeftNField := TMYLDBExprNodeField.Create(LCursor, FieldNamesList[i]);
            // Check FieldExists
            // ...
            // Const
            RightNConst := TMYLDBExprNodeConst.Create;
            AssignConstValue(VarArrayGet(KeyValues, i));

            // EqNode
            EqNode := TMYLDBExprNodeComparison.Create(doEQ, LeftNField, RightNConst,
                                       F3ValueLogic, CaseInsensitive, PartialKey);
            // Add to RootNode
            FRootExprNode.Children.Add(EqNode);
          end;
      end;
  finally
    FieldNamesList.Free;
  end;

  if LCursor <> nil then
    FRootExprNode.PatchWideStrings;

end;//ParseForLocate


//------------------------------------------------------------------------------
// Parsing for Filter
//------------------------------------------------------------------------------
procedure TMYLDBExpression.ParseForFilter(Cursor: TMYLDBCursor; Filter: String;
  CaseInsensitive, PartialKey: boolean);
var
  Lexer: TMYLDBLexer;
begin
  LCursor := Cursor;
  FCaseInsensitive := CaseInsensitive;
  FPartialKey := PartialKey;

  Lexer := TMYLDBLexer.Create(Filter);
  try
    if (Lexer.NumCommands = 0) then
       raise EMYLDBException.Create(30119, ErrorGBlankSqlCommand);
    Lexer.GetNextCommand;
    ParseForBooleanExpression(nil, Lexer);
  finally
    Lexer.Free;
  end;
end;//ParseForFilter


//------------------------------------------------------------------------------
// parse for IsAnyRecordMatchCondition (for quantified subquery comparison)
//------------------------------------------------------------------------------
procedure TMYLDBExpression.ParseForIsAnyRecordMatchCondition(
                                           Cursor: TMYLDBCursor;
                                           const FieldName: string;
                                           const Operator: TMYLDBDataOperator;
                                           const Value: TMYLDBVariant
                                           );
var
  LeftNField: TMYLDBExprNodeField;
  RightNConst: TMYLDBExprNodeConst;
begin
  Clear;
  LCursor := Cursor;
  F3ValueLogic := False;
  // Field
  LeftNField := TMYLDBExprNodeField.Create(LCursor, FieldName);
  // Const
  RightNConst := TMYLDBExprNodeConst.Create;
  RightNConst.Value.Assign(Value);
  // RootNode
  FRootExprNode := TMYLDBExprNodeComparison.Create(Operator, LeftNField,
                   RightNConst, F3ValueLogic, False, False);
  if LCursor <> nil then
    FRootExprNode.PatchWideStrings;
end;// ParseForIsAnyRecordMatchCondition


//------------------------------------------------------------------------------
// Parse For Boolean Expression (Filter, Where-Clause)
//------------------------------------------------------------------------------
procedure TMYLDBExpression.ParseForBooleanExpression(
                                        Dataset: TDataset;
                                        Lexer: TMYLDBLexer
                                        //CaseInsensitive: boolean = true;
                                        //PartialKey: boolean = false
                                                   );
begin
  Clear;
  LDataset := Dataset;
  LLex := Lexer;

  if (not LLex.GetCurrentToken(Token)) then
    raise EMYLDBException.Create(30118, ErrorGUnexpectedEndOfCommand,
                                              [Token.LineNum, Token.ColumnNum]);
  // Parse...
  FRootExprNode := ParseSearchCondition;

  if (FRootExprNode = nil) then
    raise EMYLDBException.Create(30066, ErrorGBooleanExpressionExpected,
                               [Token.Text, Token.LineNum, Token.ColumnNum]);
  MoveAndNodesToRoot;

  if LCursor <> nil then
    FRootExprNode.PatchWideStrings;
end;//ParseForBooleanExpression


//------------------------------------------------------------------------------
// Parse ValueExpression
//------------------------------------------------------------------------------
procedure TMYLDBExpression.ParseForValueExpression(
                                        Dataset: TDataset;
                                        Lexer: TMYLDBLexer
                                        //CaseInsensitive: boolean = true;
                                        //PartialKey: boolean = false
                                                 );
begin
 LLex := Lexer;
 LDataset := Dataset;
 if (Dataset <> nil) then begin
   FDatabaseName := TMYLDBDataset(Dataset).DatabaseName;
   FSessionName := TMYLDBDataset(Dataset).SessionName;
 end;
 //LCursor := Cursor;
 //FCaseInsensitive := CaseInsensitive;
 //FPartialKey := PartialKey;

 // get first token (for very beginning of the query) or current token
 if (not LLex.GetCurrentToken(Token)) then
  raise EMYLDBException.Create(30136, ErrorGUnexpectedEndOfCommand, [Token.LineNum, Token.ColumnNum]);

 // parse
 FRootExprNode := ParseValueExpression;
end;//ParseForValueExpression


//------------------------------------------------------------------------------
// default value: const or function
//------------------------------------------------------------------------------
function TMYLDBExpression.ParseForDefaultValueExpression(DefaultValue: String): Boolean;
var
  Lexer: TMYLDBLexer;
  Token: TToken;
begin
  try
    Lexer := TMYLDBLexer.Create(DefaultValue);
    try
      if (Lexer.NumCommands = 0) then
         Result := False
      else
        begin
          Lexer.GetNextCommand;
          ParseForValueExpression(nil, Lexer);
          Result := (Lexer.NumCommands = 1) and (not Lexer.LookNextToken(Token));
        end;
    finally
      Lexer.Free;
    end;
  except
    Result := False;
  end;
end;// ParseForDefaultValueExpression


//------------------------------------------------------------------------------
// Parse RowSubqueryExpression
//------------------------------------------------------------------------------
procedure TMYLDBExpression.ParseForRowSubqueryExpression(
                                    Dataset: TDataset;
                                    Lexer: TMYLDBLexer);
begin
 LLex := Lexer;
 LDataset := Dataset;
 FDatabaseName := TMYLDBDataset(Dataset).DatabaseName;
 FSessionName := TMYLDBDataset(Dataset).SessionName;

 // get first token (for very beginning of the query) or current token
 if (not LLex.GetCurrentToken(Token)) then
  raise EMYLDBException.Create(30497, ErrorGUnexpectedEndOfCommand, [Token.LineNum, Token.ColumnNum]);

 // parse

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费在线欧美视频| 亚洲精品国产高清久久伦理二区| 亚洲天堂2014| 午夜激情综合网| 欧美一区二区三区在线电影| 亚洲图片欧美一区| 7777精品久久久大香线蕉| 天天综合天天综合色| 日韩一区二区在线播放| 视频一区二区中文字幕| 在线播放亚洲一区| 久久se精品一区二区| 国产日韩欧美不卡| 中文字幕欧美日韩一区| 成人三级伦理片| 久久av资源网| 日韩精品三区四区| 亚洲午夜精品在线| 精品日韩一区二区三区| 精品一区二区综合| 日韩精品一区二区三区在线| 亚洲成a人v欧美综合天堂下载 | 国产人妖乱国产精品人妖| 一区二区三区在线免费视频 | 欧美日韩国产小视频| 国产精品你懂的| 大白屁股一区二区视频| 国产婷婷色一区二区三区| 久久超级碰视频| 精品日韩在线观看| 久久99精品网久久| 久久夜色精品国产噜噜av | 亚洲成人一二三| 欧美日韩一区二区在线观看视频 | 91福利国产成人精品照片| 国产精品毛片久久久久久久| 成人午夜免费av| 17c精品麻豆一区二区免费| 成人激情免费视频| 1024国产精品| 欧美天堂一区二区三区| 三级在线观看一区二区| 欧美日韩和欧美的一区二区| 婷婷成人激情在线网| 911国产精品| 激情都市一区二区| 欧美高清在线精品一区| 99re66热这里只有精品3直播| 国产精品久久777777| 99久久99久久久精品齐齐| 亚洲精品菠萝久久久久久久| 欧美日本不卡视频| 久久99日本精品| 性欧美疯狂xxxxbbbb| 天天av天天翘天天综合网| 欧美一区二区三区在线观看视频| 九色综合狠狠综合久久| 国产精品欧美极品| 欧美在线综合视频| 免费不卡在线视频| 国产精品久久久久永久免费观看| 欧美优质美女网站| 蜜桃在线一区二区三区| 中文字幕一区在线观看视频| 欧美性猛交xxxxxx富婆| 国产一区二区三区高清播放| 亚洲视频一区二区在线观看| 欧美精品自拍偷拍| 国产老妇另类xxxxx| 亚洲欧美福利一区二区| 日韩欧美色电影| 91在线无精精品入口| 日本在线播放一区二区三区| 国产亚洲婷婷免费| 欧美三级视频在线| 成人一级视频在线观看| 五月婷婷综合在线| 国产精品国产精品国产专区不蜜 | 国产suv精品一区二区三区| 一区二区三区毛片| 久久久青草青青国产亚洲免观| 欧美在线观看你懂的| 国产成人精品影院| 丝袜国产日韩另类美女| 国产精品成人免费精品自在线观看| 欧美一区二区三区在| 在线影视一区二区三区| 国产91精品在线观看| 久久99精品网久久| 日本麻豆一区二区三区视频| 亚洲靠逼com| 国产人伦精品一区二区| 欧美精品一区二区三区视频| 欧美日韩国产影片| 欧美一区二区三区免费| 中文字幕日韩一区| 国产亚洲美州欧州综合国| 欧美一区二区三级| 欧美视频三区在线播放| 99精品国产99久久久久久白柏| 国产电影一区在线| 美腿丝袜一区二区三区| 亚洲精品成人天堂一二三| 亚洲欧美综合色| 中日韩av电影| 欧美高清在线精品一区| 国产欧美综合在线| 久久美女艺术照精彩视频福利播放| 91麻豆精品91久久久久同性| 欧洲另类一二三四区| 日本伦理一区二区| 在线免费观看不卡av| 99久久777色| 99久久99久久精品免费观看 | 久久九九全国免费| 2023国产精品| 精品久久人人做人人爱| 久久综合久久综合九色| 久久久久国产免费免费| 久久久久久免费网| 国产欧美精品一区二区三区四区| 久久一区二区三区四区| 久久精品视频一区二区| 国产欧美日韩一区二区三区在线观看| 欧美xxx久久| 国产亚洲综合在线| 国产精品久久久久一区| 亚洲天堂成人在线观看| 依依成人精品视频| 午夜欧美一区二区三区在线播放| 亚洲一卡二卡三卡四卡无卡久久| 悠悠色在线精品| 免费成人在线视频观看| 国产精品一区二区三区网站| 成人美女视频在线观看18| 不卡高清视频专区| 欧美三级三级三级爽爽爽| 日韩限制级电影在线观看| xf在线a精品一区二区视频网站| 亚洲国产精品t66y| 制服.丝袜.亚洲.中文.综合 | 欧美主播一区二区三区| 欧美人与禽zozo性伦| 欧美电影免费提供在线观看| 国产人成一区二区三区影院| 亚洲乱码国产乱码精品精的特点| 亚洲一区二区综合| 麻豆91小视频| 99国产精品久久久久久久久久久 | 91丝袜美女网| 欧美巨大另类极品videosbest | 亚洲视频综合在线| 午夜精品福利久久久| 国产成人在线免费观看| 在线观看日韩一区| 欧美变态口味重另类| 亚洲欧美日韩国产一区二区三区| 三级一区在线视频先锋| 成人中文字幕在线| 欧美男男青年gay1069videost| 久久综合色婷婷| 亚洲综合999| 国产高清久久久久| 欧美日韩国产中文| 中文字幕视频一区二区三区久| 亚洲777理论| 99麻豆久久久国产精品免费优播| 欧美精品在线观看一区二区| 国产欧美日韩麻豆91| 免费在线观看一区二区三区| a4yy欧美一区二区三区| 欧美大度的电影原声| 亚洲国产精品天堂| 国产精品综合av一区二区国产馆| 99久久精品免费观看| 2023国产一二三区日本精品2022| 午夜精品123| 色欧美日韩亚洲| 亚洲国产成人午夜在线一区| 日韩高清一级片| 91成人免费电影| 亚洲欧洲在线观看av| 韩国v欧美v日本v亚洲v| 91精品黄色片免费大全| 亚洲激情中文1区| 亚洲国产一区视频| 9i在线看片成人免费| 国产亚洲成年网址在线观看| 麻豆精品新av中文字幕| 欧美日韩一区中文字幕| 亚洲理论在线观看| a在线欧美一区| 国产精品视频在线看| 国产成人自拍高清视频在线免费播放| 日韩欧美精品在线视频| 日本aⅴ亚洲精品中文乱码| 欧美巨大另类极品videosbest| 亚洲电影第三页| 欧美日韩一区二区三区不卡| 亚洲愉拍自拍另类高清精品|