ドキュメントと詳細な調査のために、多くのプロジェクトのすべての DFM ファイルで「文字列の抽出」を実行して、すべての SQL ステートメントを見つけたいと考えています。これを実行できるコマンド ライン ツールはありますか? DFM ファイルはすべてテキスト形式です。
5 に答える
使用しているクエリ コンポーネントの種類によっては、プロジェクト フォルダーでコマンドライン grep (またはその他のテキスト検索ツール) を使用してこれを実行できると思います。DFM では、通常の TQuery に似たコンポーネントの場合、次のようなものがあります。
SQL.Strings=( 'select * from mytable' )
またはおそらく(チェックするDelphiがありません。家にいる喜びです!)
SQL.Text=( 'select * from mytable' )
これらの文字列が DFM 内の複数の「行」にどのように広がるかを考えると、チェックする必要があるいくつかのバリエーションがどのように存在するかを考えると、個人的にはこれを行うために Delphi の小さな部分を書きます。
基本的な考え方は次のとおりです。特定のディレクトリ内のすべてのファイル/サブフォルダーを反復処理し、すべての DFM ファイルを探し、それぞれについて、それを TStringList に読み込み、関心のある TQuery (など) SQL プロパティのいずれかをチェックし、結果 (コンポーネント名、ファイル名、実際の SQL 文字列) を結果ファイルに出力します。実際には、せいぜい 1 時間か 2 時間以上の作業ではないはずです。
TQuery タイプのコンポーネント以外のものを使用して呼び出すストアド プロシージャがある場合は、最初に DFM の内部を覗いて、SQL がどのように表示されるかを確認する必要があります。それはおそらくの線に沿っているでしょう
CommandText=( 'exec mysproc :id, :value' )
等
編集: コメントでの議論に続いて、これは私の DFM の 1 つからのサンプルです。
(その他の物件) SQL.文字列 = ( 'SELECT D.*, ' 「C.DESCRIPTION AS CLASS_DESCRIPTION、」 「C.CHQ_NUM_THRESHOLD AS CLASS_CHQ_NUM_THRESHOLD」 「C.CREDIT_LIMIT AS CLASS_CREDIT_LIMIT」 「A.REF AS ACCOUNT_REF」 「A.SORT_CODE AS ACCOUNT_SORT_CODE」 「A.ACCOUNT_NUMBER AS ACCOUNT_ACCOUNT_NUMBER」 「A.PREFERRED_ACCOUNT AS ACCOUNT_PREFERRED_ACCOUNT」 'から ' 「DRAWER_ACCOUNTS A LEFT JOIN DRAWERS D」 'ON D.REF=A.DRAWER_REF' 「LEFT JOIN REF_DRAWER_CLASSES C」 「ON D.DRAWER_CLASS = C.CLASS_ID」 'WHERE A.SORT_CODE=:PSORT AND A.ACCOUNT_NUMBER=:PACC') (その他の物件)
したがって、私が本当に必要とするのは、SQL.Strings = (
ビットを見つけて、行の残りと後続のすべての行を読み取り、先頭と末尾の を削除して'
、終了する行に到達するまで')'
です。各行の引用符内に興味深い SQL (およびコメント) が含まれていたとしても、実際には関係ありません。興味のある各行を読み、各行の最初と最後の引用の間のテキストを切り取ります。Delphiがこれを他の方法でストリーミングする方法がわからないため、これは機能する必要があります.文字列の内容を「読み取る」ことはできません-文字列リストが(おそらく)行と各行に分割されていることに基づいて動作しているだけですDFM では開始と終了で区切られます'
であり、文字列リストの内容自体全体が 1 対の括弧内に含まれています。
それは理にかなっていますか、それともまだ何か不足していますか? :-)
私は独自の DFM パーサーを作成し、RAD Studio と私が働いている会社の両方からの 600 個のソース ファイルでテストしました。パーサーは Go で書かれています。
これを使用して DFM ファイルを解析し、メモリ内オブジェクトを再帰的に検査して、dfm.String 型のプロパティを探すことができます。
DFMは基本的にname=value形式であるため、tStringlistにロードしてから、各行をループして、関心のある特定のプロパティ名を探すことができます。
var
slDfm : tStringList;
Item : String;
ix : integer;
begin
slDFM := tStringlist.create;
try
slDFM.LoadFromFile( filename );
for ix := 0 to slDfm.Count-1 do
begin
slDfm.Strings[ix] := Trim(slDfm.Strings[ix]);
if SameText(Trim(slDfm.Names[ix]),'CommandText') then
memo1.Lines.Add('"'+Trim(slDfm.ValueFromIndex[ix])+'"');
end;
finally
slDFM.free;
end;
end;
答えてくれてありがとう!私が試みる別の解決策は、「GNU Gettext for Delphi and C++ Builder」に含まれる「文字列の抽出」ツールです。
.po ファイルには、すべてのコンポーネント テキストだけでなく、すべてのリソース文字列 (SQL コマンドが保存される別の場所) も含まれ、オリジン (どの pas または dfm ファイル、どのコンポーネント プロパティ名) への参照も完備されています。 name=value" リストが既にあります。
.po ファイルを使用すると、.pas ファイルからすべての SQL.Text と、すべてのファイル内の「SQL_...」などの名前を持つすべてのリソース文字列を簡単に整理できます。