S2Dao.NETでコメントが削除される
S2Dao.NetでSELECT文を実行すると、SQLファイルに記述していた/* */のコメントが削除されてしまう。
今のプロジェクトでは、障害の際にどのプログラムから呼ばれたSQLなのかをログから特定するために、
発行するSQLに「SELECT /* ProgramID */ 」みたいな形でコメントを埋め込んでいる。
また、Oracleのヒント文も「/* +(HINT) */」で記述しているが、これも削除されてしまう。
Java版のs2daoでは対応されているみたいだったので、これを参考にしてdotnet版も修正してみた
参考)https://www.seasar.org/issues/browse/DAO-43
SqlParserImpl.java
protected void parseComment() {
String comment = tokenizer.getToken();
if (isTargetComment(comment)) {
if (isIfComment(comment)) {
parseIf();
} else if (isBeginComment(comment)) {
parseBegin();
} else if (isEndComment(comment)) {
return;
} else {
parseCommentBindVariable();
}
} else if (comment != null && 0 < comment.length()) {
String before = tokenizer.getBefore();
peek().addChild(
new SqlNode(before.substring(before.lastIndexOf("/*"))
.replaceAll("\\?", "")));
}
}
これのelse if以降をdotnet版にも追記
SqlParserImpl.cs
protected void ParseComment()
{
string comment = tokenizer.Token;
if (IsTargetComment(comment))
{
if (IsIfComment(comment))
{
ParseIf();
}
else if (IsBeginComment(comment))
{
ParseBegin();
}
else if (IsEndComment(comment))
{
return;
}
else
{
ParseCommentBindVariable();
}
}
else if(comment != null && 0 < comment.Length)
{
string before = tokenizer.Before;
Peek().AddChild(new SqlNode(before.Substring(before.LastIndexOf("/*")).Replace("\\?","")));}
}
とりあえず動いているみたいだが、「Replace("\\?","")」の必要性がいまいちよくわからない