チェンジセット 1647 (default)
- 日時:
- 2024/05/28 12:44:10 (4ヵ月前)
- 場所:
- framework/trunk
- ファイル:
-
- 8個の追加
- 4個の更新
凡例:
- 未変更
- 追加
- 削除
-
framework/trunk/CoreLibrary/Sources/Data/DbDataOperator.cs
r1646 r1647 59 59 60 60 /// <summary> 61 /// 変数を表す正規表現。 62 /// </summary> 63 private static readonly Regex VariableRegex 64 = new Regex( 65 @"\${(?<name>[^${:}]+)}", 66 RegexOptions.ExplicitCapture); 67 68 /// <summary> 69 /// SQLCMD 形式を含む変数を表す正規表現。 70 /// </summary> 71 private static readonly Regex Variable2Regex 72 = new Regex( 73 @"\$({(?<name>[^${:}]+)}|\((?<name>[^$(:)]+)\))", 74 RegexOptions.ExplicitCapture); 75 76 77 /// <summary> 61 78 /// コマンドを実行し、その結果の一覧を返します。 62 79 /// </summary> … … 1908 1925 if (line == null || line == "}}}") 1909 1926 { 1910 affectedRows += ExecuteNonQuery(transaction, rawCommand.ToString());1927 affectedRows += ExecuteNonQuery(transaction, ResolveVariable(Variable2Regex, rawCommand.ToString(), variables)); 1911 1928 rawCommand = null; 1912 1929 … … 1994 2011 } 1995 2012 2013 /// MEMO: このメソッドは DbDataComparer.ResolveVariable と同じ実装 2014 /// <summary> 2015 /// 文字列中の変数を解決して返します。 2016 /// </summary> 2017 /// <param name="regex">変数にマッチする正規表現。グループ名 <c>name</c> を使用します。</param> 2018 /// <param name="value">文字列。</param> 2019 /// <param name="variables">変数名をキーとして埋め込む値を値としたディクショナリ。</param> 2020 /// <returns> 2021 /// 変数を解決した文字列。 2022 /// </returns> 2023 private static string ResolveVariable(Regex regex, string value, IDictionary<string, object> variables) 2024 { 2025 // 変数が未設定の場合や、変数の文字数に足りていない場合 2026 if (variables == null || value.Length < 4) 2027 { 2028 return value; 2029 } 2030 2031 return regex.Replace( 2032 value, 2033 delegate(Match match) 2034 { 2035 string variableName = match.Groups["name"].Value; 2036 object variableValue; 2037 if (!variables.TryGetValue(variableName, out variableValue)) 2038 { 2039 throw new VariableNotFoundException(variableName, (string)null); 2040 } 2041 2042 return variableValue != null ? variableValue.ToString() : string.Empty; 2043 }); 2044 } 2045 1996 2046 /// <summary> 1997 2047 /// SQL 文を実行します。 … … 2341 2391 /// </summary> 2342 2392 private static readonly char[] ColumnSeparatorChars = { ColumnSeparatorChar }; 2343 2344 /// <summary>2345 /// 変数を表す正規表現。2346 /// </summary>2347 private static readonly Regex VariableRegex2348 = new Regex(2349 @"\${(?<name>[^${:}]+)}",2350 RegexOptions.ExplicitCapture);2351 2393 2352 2394 /// <summary> … … 2585 2627 if (column[column.Length - 1] == '`') 2586 2628 { 2587 // 変数 の解決はしない2588 parameterValue = GetValue(transaction, column.Substring(1, column.Length - 2));2629 // 変数を解決してからクエリーとして実行 2630 parameterValue = GetValue(transaction, ResolveVariable(Variable2Regex, column.Substring(1, column.Length - 2), variables)); 2589 2631 break; 2590 2632 } … … 2594 2636 default: 2595 2637 // 変数の解決 2596 parameterValue = ResolveVariable( column, variables);2638 parameterValue = ResolveVariable(VariableRegex, column, variables); 2597 2639 break; 2598 2640 } … … 2670 2712 } 2671 2713 2672 /// MEMO: このメソッドは DbDataComparer.TableQuery.ResolveVariable と同じ実装2673 /// <summary>2674 /// 文字列中の変数を解決して返します。2675 /// </summary>2676 /// <param name="value">文字列。</param>2677 /// <param name="variables">変数名をキーとして埋め込む値を値としたディクショナリ。</param>2678 /// <returns>2679 /// 変数を解決した文字列。2680 /// </returns>2681 private static string ResolveVariable(string value, IDictionary<string, object> variables)2682 {2683 // 変数が未設定の場合や、変数の文字数に足りていない場合2684 if (variables == null || value.Length < 4)2685 {2686 return value;2687 }2688 2689 return VariableRegex.Replace(2690 value,2691 delegate(Match match)2692 {2693 string variableName = match.Groups["name"].Value;2694 object variableValue;2695 if (!variables.TryGetValue(variableName, out variableValue))2696 {2697 throw new VariableNotFoundException(variableName, (string)null);2698 }2699 2700 return variableValue != null ? variableValue.ToString() : string.Empty;2701 });2702 }2703 2704 2714 /// <summary> 2705 2715 /// 実行するクエリを準備します。 -
framework/trunk/CoreTest/CoreTest.csproj
r1645 r1647 383 383 <EmbeddedResource Include="TestResources\Data\DbDataOperatorImportTest\34-VariableOnlyString-0-NoVariable.txt" /> 384 384 </ItemGroup> 385 <ItemGroup> 386 <EmbeddedResource Include="TestResources\Data\DbDataOperatorImportTest\01-Append-0-TableQuery.txt" /> 387 </ItemGroup> 388 <ItemGroup> 389 <EmbeddedResource Include="TestResources\Data\DbDataOperatorImportTest\01-Append-0-TableQueryWithVariable.txt" /> 390 </ItemGroup> 391 <ItemGroup> 392 <EmbeddedResource Include="TestResources\Data\DbDataOperatorImportTest\62-SubQueryWithVariable-0.txt" /> 393 <EmbeddedResource Include="TestResources\Data\DbDataOperatorImportTest\62-SubQueryWithVariable-2.txt" /> 394 </ItemGroup> 395 <ItemGroup> 396 <EmbeddedResource Include="TestResources\Data\DbDataOperatorImportTest\82-CommandWithVariable-0.txt" /> 397 <EmbeddedResource Include="TestResources\Data\DbDataOperatorImportTest\82-CommandWithVariable-2.txt" /> 398 </ItemGroup> 385 399 <Import Project="$(MSBuildThisFileDirectory)..\MSBuild.Common.targets" /> 386 400 </Project> -
framework/trunk/CoreTest/Sources/Data/DbDataOperatorImportTest.cs
r1645 r1647 105 105 [TestCase(@"61-SubQuery.txt", 0, 2, false, @"61-SubQuery-0.txt")] 106 106 [TestCase(@"61-SubQuery.txt", 2, 2, false, @"61-SubQuery-2.txt")] 107 [TestCase(@"62-SubQueryWithVariable.txt", 0, 2, true, @"62-SubQueryWithVariable-0.txt")] 108 [TestCase(@"62-SubQueryWithVariable.txt", 2, 2, true, @"62-SubQueryWithVariable-2.txt")] 107 109 [TestCase(@"71-MultiTable.txt", 0, 4, false, @"71-MultiTable-0.txt")] 108 110 [TestCase(@"71-MultiTable.txt", 2, 4, false, @"71-MultiTable-2.txt")] 109 111 [TestCase(@"81-Command.txt", 0, 2, false, @"81-Command-0.txt")] 110 112 [TestCase(@"81-Command.txt", 2, 3, false, @"81-Command-2.txt")] 113 [TestCase(@"82-CommandWithVariable.txt", 0, 2, true, @"82-CommandWithVariable-0.txt")] 114 [TestCase(@"82-CommandWithVariable.txt", 2, 3, true, @"82-CommandWithVariable-2.txt")] 111 115 public void TestImport(string importFileName, int initialRows, int affectedRows, bool useVariables, string expedtedDataFile) 112 116 { … … 177 181 /// <param name="expedtedDataFile">結果のデータ。</param> 178 182 [Test] 183 [TestCase(@"01-Append.txt", false, @"01-Append-0-TableQuery.txt")] 184 [TestCase(@"01-Append.txt", true, @"01-Append-0-TableQueryWithVariable.txt")] 179 185 [TestCase(@"01-Append.txt", false, @"01-Append-0.txt")] 180 186 [TestCase(@"01-Append.txt", false, @"01-Append-0-QuoteString.txt")] -
framework/trunk/TestLibrary/Sources/DbDataComparer.cs
r1646 r1647 42 42 { 43 43 /// <summary> 44 /// 変数を表す正規表現。 45 /// </summary> 46 private static readonly Regex VariableRegex 47 = new Regex( 48 @"\${(?<name>[^${:}]+)}", 49 RegexOptions.ExplicitCapture); 50 51 /// <summary> 52 /// SQLCMD 形式を含む変数を表す正規表現。 53 /// </summary> 54 private static readonly Regex Variable2Regex 55 = new Regex( 56 @"\$({(?<name>[^${:}]+)}|\((?<name>[^$(:)]+)\))", 57 RegexOptions.ExplicitCapture); 58 59 60 /// <summary> 44 61 /// 比較元のテキストデータを元にデータベースにクエリーを発行して結果を比較を行います。 45 62 /// </summary> … … 138 155 } 139 156 140 tableQuery = new TableQuery(tableLineNumber, transaction, notify, builder );157 tableQuery = new TableQuery(tableLineNumber, transaction, notify, builder, variables); 141 158 continue; 142 159 } … … 259 276 } 260 277 278 /// MEMO: このメソッドは DbDataOperator.ResolveVariable と同じ実装 279 /// <summary> 280 /// 文字列中の変数を解決して返します。 281 /// </summary> 282 /// <param name="regex">変数にマッチする正規表現。グループ名 <c>name</c> を使用します。</param> 283 /// <param name="value">文字列。</param> 284 /// <param name="variables">変数名をキーとして埋め込む値を値としたディクショナリ。</param> 285 /// <returns> 286 /// 変数を解決した文字列。 287 /// </returns> 288 private static string ResolveVariable(Regex regex, string value, IDictionary<string, object> variables) 289 { 290 // 変数が未設定の場合や、変数の文字数に足りていない場合 291 if (variables == null || value.Length < 4) 292 { 293 return value; 294 } 295 296 return regex.Replace( 297 value, 298 delegate(Match match) 299 { 300 string variableName = match.Groups["name"].Value; 301 object variableValue; 302 if (!variables.TryGetValue(variableName, out variableValue)) 303 { 304 throw new VariableNotFoundException(variableName, (string)null); 305 } 306 307 return variableValue != null ? variableValue.ToString() : string.Empty; 308 }); 309 } 310 261 311 262 312 /// <summary> … … 277 327 278 328 /// <summary> 279 /// 変数を表す正規表現。280 /// </summary>281 private static readonly Regex VariableRegex282 = new Regex(283 @"\${(?<name>[^${:}]+)}",284 RegexOptions.ExplicitCapture);285 286 /// <summary>287 329 /// テーブル定義の行番号。 288 330 /// </summary> … … 387 429 /// <param name="notify">通知先。</param> 388 430 /// <param name="query">クエリー。</param> 389 internal TableQuery(int tableLineNumber, ICommonDbTransaction transaction, DbDataComparerNotify notify, StringBuilder query) 431 /// <param name="variables">変数名をキーとして埋め込む値を値としたディクショナリ。</param> 432 internal TableQuery(int tableLineNumber, ICommonDbTransaction transaction, DbDataComparerNotify notify, StringBuilder query, IDictionary<string, object> variables) 390 433 { 391 434 this.tableLineNumber = tableLineNumber; 392 435 this.transaction = transaction; 393 436 this.notify = notify; 394 this.query = query.ToString();437 this.query = ResolveVariable(Variable2Regex, query.ToString(), variables); 395 438 } 396 439 … … 671 714 } 672 715 673 column = ResolveVariable( column, variables);716 column = ResolveVariable(VariableRegex, column, variables); 674 717 } 675 718 … … 678 721 679 722 return actual.Equals(expected); 680 }681 682 /// MEMO: このメソッドは DbDataOperator.InsertCommand.ResolveVariable と同じ実装683 /// <summary>684 /// 文字列中の変数を解決して返します。685 /// </summary>686 /// <param name="value">文字列。</param>687 /// <param name="variables">変数名をキーとして埋め込む値を値としたディクショナリ。</param>688 /// <returns>689 /// 変数を解決した文字列。690 /// </returns>691 private static string ResolveVariable(string value, IDictionary<string, object> variables)692 {693 // 変数が未設定の場合や、変数の文字数に足りていない場合694 if (variables == null || value.Length < 4)695 {696 return value;697 }698 699 return VariableRegex.Replace(700 value,701 delegate(Match match)702 {703 string variableName = match.Groups["name"].Value;704 object variableValue;705 if (!variables.TryGetValue(variableName, out variableValue))706 {707 throw new VariableNotFoundException(variableName, (string)null);708 }709 710 return variableValue != null ? variableValue.ToString() : string.Empty;711 });712 723 } 713 724
※ 詳しい使い方は
TracChangeset を参照してください。