PageRenderTime 40ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/trunk/SQlExport.Data.Adapters.Linq/ScriptHelper.cs

http://SQLExport.codeplex.com
C# | 181 lines | 148 code | 27 blank | 6 comment | 7 complexity | 4562d497b05ec278832299bf88019967 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6. using System.IO;
  7. namespace SqlExport.Data.Adapters.Linq
  8. {
  9. internal class ScriptHelper
  10. {
  11. private string[] _usings;
  12. public ScriptHelper( string[] usings )
  13. {
  14. this._usings = usings;
  15. }
  16. public List<Exception> Errors { get; set; }
  17. public int ScriptLineOffset { get; private set; }
  18. public string BuildObjectCode( IRelationalSchemaAdapter schema )
  19. {
  20. Errors = new List<Exception>();
  21. StringBuilder code = new StringBuilder();
  22. code.AppendLine( "using System;" );
  23. code.AppendLine( "using System.Data;" );
  24. code.AppendLine( "using System.Data.Common;" );
  25. code.AppendLine( "using System.Data.Linq;" );
  26. code.AppendLine( "using System.Data.Linq.Mapping;" );
  27. code.AppendLine( "using System.Linq;" );
  28. code.AppendLine( "using SqlExport.Data.Adapters.Linq;" );
  29. code.AppendLine( "namespace SqlExport.Data.Adapters.Linq" );
  30. code.AppendLine( "{" );
  31. code.AppendLine( " public abstract class GeneratedQueryWrapper" );
  32. code.AppendLine( " {" );
  33. // Data context.
  34. code.AppendLine( " private DataContext _db = null;" );
  35. // Tables.
  36. foreach( SchemaItem table in schema.GetTables() )
  37. {
  38. code.AppendFormat( " protected Table<{0}> {0} {{ get {{ return _db.GetTable<{0}>(); }} }}\n",
  39. CodeSafeName( table.Name ) );
  40. }
  41. // Output SQL.
  42. code.AppendLine( " protected void PrintSql( IQueryable query )" );
  43. code.AppendLine( " {" );
  44. code.AppendLine( " if( _db != null )" );
  45. code.AppendLine( " {" );
  46. code.AppendLine( " _db.GetCommand( query ).CommandText.Print();" );
  47. code.AppendLine( " }" );
  48. code.AppendLine( " }" );
  49. // Initialisation.
  50. code.AppendLine( " public void InitDataContext( IDbConnection connection, DbTransaction transaction, int commandTimeout )" );
  51. code.AppendLine( " {" );
  52. code.AppendLine( " if( connection != null )" );
  53. code.AppendLine( " {" );
  54. code.AppendLine( " _db = new DataContext( connection );" );
  55. code.AppendLine( " if( transaction != null )" );
  56. code.AppendLine( " {" );
  57. code.AppendLine( " _db.Transaction = transaction;" );
  58. code.AppendLine( " }" );
  59. code.AppendLine( " _db.CommandTimeout = commandTimeout;" );
  60. code.AppendLine( " }" );
  61. code.AppendLine( " }" );
  62. // Execution.
  63. code.AppendLine( " public abstract void Execute();" );
  64. code.AppendLine( " }" );
  65. foreach( SchemaItem table in schema.GetTables() )
  66. {
  67. string typeName = CodeSafeName( table.Name );
  68. Dictionary<string, int> columnNameCount = new Dictionary<string, int>();
  69. code.AppendFormat( " [Table(Name=\"[{0}]\")]\n", table.Name );
  70. code.AppendFormat( " public class {0}\n", typeName );
  71. code.AppendLine( " {" );
  72. foreach( Column col in schema.GetColumns( table.Name ) )
  73. {
  74. string propertyName;
  75. string propertyType;
  76. propertyName = CodeSafeName( col.Name );
  77. if( columnNameCount.ContainsKey( propertyName ) )
  78. {
  79. columnNameCount[propertyName]++;
  80. propertyName = string.Concat( propertyName, columnNameCount[propertyName] );
  81. }
  82. else
  83. {
  84. columnNameCount.Add( propertyName, 0 );
  85. }
  86. if( propertyName == typeName )
  87. {
  88. propertyName = string.Concat( "c_", propertyName );
  89. }
  90. Type fieldType = typeof( object );
  91. try
  92. {
  93. fieldType = schema.GetColumnType( col );
  94. }
  95. catch( Exception exp )
  96. {
  97. Errors.Add( exp );
  98. }
  99. if( fieldType.IsValueType && col.Nullable.HasValue && col.Nullable.Value )
  100. {
  101. propertyType = string.Format( "{0}?", fieldType.Name );
  102. }
  103. else
  104. {
  105. propertyType = fieldType.Name;
  106. }
  107. code.AppendFormat( " [Column(Name=\"[{0}]\")]\n", col.Name );
  108. code.AppendFormat( " public {0} {1} {{ get; set; }}\n", propertyType, propertyName );
  109. }
  110. code.AppendLine( " }" );
  111. }
  112. code.AppendLine( "}" );
  113. System.Diagnostics.Debug.WriteLine( code.ToString() );
  114. return code.ToString();
  115. }
  116. public string BuildGeneratedQuery( TextReader script, IRelationalSchemaAdapter schema )
  117. {
  118. Errors = new List<Exception>();
  119. StringBuilder code = new StringBuilder();
  120. code.AppendLine( "using System;" );
  121. code.AppendLine( "using System.Data;" );
  122. code.AppendLine( "using System.Data.Common;" );
  123. code.AppendLine( "using System.Data.Linq;" );
  124. code.AppendLine( "using System.Data.Linq.Mapping;" );
  125. code.AppendLine( "using System.Linq;" );
  126. code.AppendLine( "using SqlExport.Data.Adapters.Linq;" );
  127. foreach( string item in _usings )
  128. {
  129. code.AppendFormat( "using {0};\n", item );
  130. }
  131. code.AppendLine();
  132. code.AppendFormat( "public class GeneratedQuery : GeneratedQueryWrapper, {0}\n", typeof( IGeneratedScript ).Name );
  133. code.AppendLine( "{" );
  134. // Execution.
  135. code.AppendLine( " public override void Execute()" );
  136. code.AppendLine( " {" );
  137. ScriptLineOffset = _usings.Length + 12;
  138. code.AppendLine( script.ReadToEnd() );
  139. code.AppendLine( " }" );
  140. code.AppendLine( "}" );
  141. System.Diagnostics.Debug.WriteLine( code.ToString() );
  142. return code.ToString();
  143. }
  144. private string CodeSafeName( string name )
  145. {
  146. name = Regex.Replace( name, @"(?:^[0-9])|[^\w]", "_" );
  147. if( Array.IndexOf<string>( SyntaxDefinition.CSharpKeywords, name ) >= 0 )
  148. {
  149. name = string.Concat( "_", name );
  150. }
  151. return name;
  152. }
  153. }
  154. }