[変更点]
- (U/A 共通) [インタラクティブ SQL] の結果表示領域に [パラメータ] タブを追加。
- (U/A 共通) IBX を高速化。
・"パラメータ" タブについて
Delphi / C++Builder を使っているヒトには便利な機能だと思います。実行したクエリのフィールドやパラメータを FieldByName() / ParamByName() のコードとして取得できます。
・IBX の高速化について
劇的に高速化される訳ではない事を最初にお断りしておきます。元ネタは https://github.com/goldensoftwareltd/gedemin/issues/1108 です。
2007 の場合、IB.pas を以下のように修正します。
procedure IBAlloc(var P; OldSize, NewSize: Integer); var i: Integer; begin if Assigned(Pointer(P)) then ReallocMem(Pointer(P), NewSize) else GetMem(Pointer(P), NewSize); for i := OldSize to NewSize - 1 do PChar(P)[i] := #0; end;
↓
procedure IBAlloc(var P; OldSize, NewSize: Integer); begin if Assigned(Pointer(P)) then ReallocMem(Pointer(P), NewSize) else GetMem(Pointer(P), NewSize); if NewSize > OldSize then FillChar((PChar(P) + OldSize)^, NewSize - OldSize, 0); end;
XE8 の場合、IBX.IB.pas を以下のように修正します。
procedure IBAlloc(var P; OldSize, NewSize: Integer); var i: Integer; begin if Assigned(Pointer(P)) then ReallocMem(Pointer(P), NewSize) else GetMem(Pointer(P), NewSize); for i := OldSize to NewSize - 1 do PByte(P)[i] := 0; end;
↓
procedure IBAlloc(var P; OldSize, NewSize: Integer); begin if Assigned(Pointer(P)) then ReallocMem(Pointer(P), NewSize) else GetMem(Pointer(P), NewSize); if NewSize > OldSize then FillChar((PByte(P) + OldSize)^, NewSize - OldSize, 0); end;
もう一か所あります。
{$ELSE} procedure IBAlloc(var p : TRecordBuffer; OldSize, NewSize: Integer); var i: Integer; begin ReallocMem(p, NewSize); for i := OldSize to NewSize - 1 do p[i] := 0; end; {$ENDIF NEXTGEN}
↓
{$ELSE} procedure IBAlloc(var p : TRecordBuffer; OldSize, NewSize: Integer); begin ReallocMem(p, NewSize); if NewSize > OldSize then FillChar((PByte(P) + OldSize)^, NewSize - OldSize, 0); end; {$ENDIF NEXTGEN}
要は配列を for で回してゼロクリアするより FillChar() でゼロクリアした方が速いというものです。この IBAlloc() は一回のクエリで数百回実行される事があるので、チリも積もれば…という奴です。改変した (IBX.)IB.pas はプロジェクトに組み込んでお使いください。
一応、当方で元ネタをテストした結果を貼っておきますね。
[Alloc1()]
[Alloc2()]
かなりチリを積もらせた結果ですので、過度な期待はしないでくださいね (^^;A
|