Transfer では、データベースクエリを発行する場所は、transfer.com.sql.QueryExecution の executeQuery() に集約されているので、どんなクエリが発行されているのかを把握することが簡単である。
実際に、80行目に以下のコードを入れてみた。
バイナリデータは、無視してある。
<cfset eLen = ArrayLen(evaluation) />
<cfobject type="Java" class="java.lang.StringBuffer" name="stringBuffer" action="create" />
<cfset sBuffer = stringBuffer.init() />
<cfloop from="1" to="#eLen#" index="eCounter">
<cfset block = evaluation[eCounter] />
<cfset sBuffer.append(#PreserveSingleQuotes(block.preSQL)#) />
<cfif StructKeyExists(block, "mapParam")>
<cfset param = getMappedParam(block.mapparam.name) />
<cfif StructKeyExists(param, "operator")>
<cfset sBuffer.append(#param.operator#) />
</cfif>
<cfif StructKeyExists(param, "mapValueReplace")>
<cfset sBuffer.append(#param.mapValueReplace#) />
<cfelse>
<cfset value = 0/>
<cfif StructKeyExists(param, "value")>
<cfset value = param.value />
</cfif>
<cfif block.mapparam.type eq "date">
<cfset sBuffer.append("'#value#'") />
<cfelseif block.mapparam.type eq "numeric">
<cfset sBuffer.append(#value#) />
<cfelseif block.mapparam.type eq "boolean">
<cfset sBuffer.append(#value#) />
<cfelseif block.mapparam.type eq "binary">
<cfelse>
<cfset sBuffer.append("'#value#'") />
</cfif>
</cfif>
</cfif>
</cfloop>
<cfset buffer = sBuffer.toString() />
<cflog application="yes" text="#buffer#" type="information" file="querylog" />
おおおお、出る出る。こんなクエリが発行されているのかと。
しかもこれは、実際に発行される前にクエリを拾うので、エラーになったときに、どんなクエリを発行してエラーになったのかがわかる。
自分なりには、便利だ。
ただし、当然、テスト環境のみで利用することがお勧め。