Skip to content

Commit edda14d

Browse files
committed
Moving ORM builder to Foundation
1 parent 18903bf commit edda14d

File tree

7 files changed

+306
-273
lines changed

7 files changed

+306
-273
lines changed

.vs/DataCommander.sqlite

-6.04 MB
Binary file not shown.

DataCommander.Providers/ResultWriter/LogResultWriter.cs

Lines changed: 5 additions & 204 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.Data;
33
using System.Diagnostics;
44
using System.Linq;
5-
using System.Text;
65
using DataCommander.Providers.Connection;
76
using Foundation;
87
using Foundation.Data;
@@ -23,6 +22,7 @@ internal sealed class LogResultWriter : IResultWriter
2322
private long _beforeExecuteReaderTimestamp;
2423
private long _writeTableBeginTimestamp;
2524
private long _firstRowReadBeginTimestamp;
25+
private readonly OrmBuilder _ormBuilder = new OrmBuilder();
2626

2727
public LogResultWriter(Action<InfoMessage> addInfoMessage)
2828
{
@@ -49,9 +49,7 @@ void IResultWriter.BeforeExecuteReader(AsyncDataAdapterCommand asyncDataAdapterC
4949

5050
var parameters = command.Parameters;
5151
if (!parameters.IsNullOrEmpty())
52-
{
5352
message += "\r\n" + command.Parameters.ToLogString();
54-
}
5553

5654
_addInfoMessage(new InfoMessage(LocalTime.Default.Now, InfoMessageSeverity.Verbose, message));
5755
}
@@ -81,212 +79,13 @@ void IResultWriter.WriteTableBegin(DataTable schemaTable)
8179

8280
var objectId = _tableCount + 1;
8381
var objectTypeName = $"Object{objectId}";
84-
var objectInstanceName = "@object";
8582
var columns = schemaTable.Rows.Cast<DataRow>().Select(i => new DbColumn(i)).ToList();
86-
var stringBuilder = new StringBuilder();
87-
stringBuilder.Append("\r\ninternal sealed class ");
88-
stringBuilder.Append(objectTypeName);
89-
stringBuilder.Append("\r\n{\r\n");
90-
91-
var first = true;
92-
foreach (var column in columns)
93-
{
94-
if (first)
95-
first = false;
96-
else
97-
stringBuilder.AppendLine();
98-
99-
stringBuilder.Append(" public ");
100-
stringBuilder.Append(GetCSharpTypeName(column.DataType));
101-
102-
if (column.AllowDbNull == true && IsValueType(column.DataType))
103-
stringBuilder.Append('?');
104-
105-
stringBuilder.Append(' ');
106-
stringBuilder.Append(column.ColumnName);
107-
stringBuilder.Append(";");
108-
}
109-
110-
stringBuilder.AppendFormat(@"
111-
}}
112-
113-
private static {0} Read{0}(IDataRecord dataRecord)
114-
{{
115-
var {1} = new {0}();
116-
", objectTypeName, objectInstanceName);
117-
118-
first = true;
119-
var index = 0;
120-
foreach (var column in columns)
121-
{
122-
if (first)
123-
first = false;
124-
else
125-
stringBuilder.AppendLine();
126-
127-
stringBuilder.AppendFormat(" {0}.",objectInstanceName);
128-
stringBuilder.Append(column.ColumnName);
129-
stringBuilder.Append(" = dataRecord.");
130-
stringBuilder.Append(GetDataRecordMethodName(column));
131-
stringBuilder.Append('(');
132-
stringBuilder.Append(index);
133-
stringBuilder.Append(");");
134-
135-
++index;
136-
}
137-
138-
stringBuilder.AppendFormat(@"
139-
return {0};
140-
}}
141-
", objectInstanceName);
142-
143-
Log.Trace($"SchemaTable of table[{_tableCount}]:\r\n{schemaTable.ToStringTableString()}\r\n{stringBuilder}");
144-
83+
_ormBuilder.Add(objectTypeName, columns);
84+
Log.Trace($"SchemaTable of table[{_tableCount}]:\r\n{schemaTable.ToStringTableString()}");
14585
++_tableCount;
14686
_rowCount = 0;
14787
}
14888

149-
private static string GetDataRecordMethodName(DbColumn column)
150-
{
151-
var typeCode = Type.GetTypeCode(column.DataType);
152-
string methodName = null;
153-
switch (typeCode)
154-
{
155-
case TypeCode.Empty:
156-
break;
157-
case TypeCode.Object:
158-
break;
159-
case TypeCode.DBNull:
160-
break;
161-
case TypeCode.Boolean:
162-
methodName = column.AllowDbNull == true ? "GetNullableBoolean" : "GetBoolean";
163-
break;
164-
case TypeCode.Char:
165-
break;
166-
case TypeCode.SByte:
167-
break;
168-
case TypeCode.Byte:
169-
methodName = column.AllowDbNull == true ? "GetNullableByte" : "GetByte";
170-
break;
171-
case TypeCode.Int16:
172-
methodName = column.AllowDbNull == true ? "GetNullableInt16" : "GetInt16";
173-
break;
174-
case TypeCode.UInt16:
175-
break;
176-
case TypeCode.Int32:
177-
methodName = column.AllowDbNull == true ? "GetNullableInt32" : "GetInt32";
178-
break;
179-
case TypeCode.UInt32:
180-
break;
181-
case TypeCode.Int64:
182-
methodName = column.AllowDbNull == true ? "GetNullableInt64" : "GetInt64";
183-
break;
184-
case TypeCode.UInt64:
185-
break;
186-
case TypeCode.Single:
187-
methodName = column.AllowDbNull == true ? "GetNullableFloat" : "GetFloat";
188-
break;
189-
case TypeCode.Double:
190-
methodName = column.AllowDbNull == true ? "GetNullableDouble" : "GetDouble";
191-
break;
192-
case TypeCode.Decimal:
193-
methodName = column.AllowDbNull == true ? "GetNullableDecimal" : "GetDecimal";
194-
break;
195-
case TypeCode.DateTime:
196-
methodName = column.AllowDbNull == true ? "GetNullableDateTime" : "GetDateTime";
197-
break;
198-
case TypeCode.String:
199-
methodName = column.AllowDbNull == true ? "GetStringOrDefault" : "GetString";
200-
break;
201-
default:
202-
throw new ArgumentOutOfRangeException();
203-
}
204-
return methodName;
205-
}
206-
207-
private static string GetCSharpTypeName(Type dbColumnDataType)
208-
{
209-
var typeCode = Type.GetTypeCode(dbColumnDataType);
210-
string csharpTypeName;
211-
switch (typeCode)
212-
{
213-
case TypeCode.Boolean:
214-
csharpTypeName = "bool";
215-
break;
216-
case TypeCode.Char:
217-
csharpTypeName = "char";
218-
break;
219-
case TypeCode.SByte:
220-
csharpTypeName = "byte";
221-
break;
222-
case TypeCode.Byte:
223-
csharpTypeName = "byte";
224-
break;
225-
case TypeCode.Int16:
226-
csharpTypeName = "shorrt";
227-
break;
228-
case TypeCode.UInt16:
229-
csharpTypeName = "ushort";
230-
break;
231-
case TypeCode.Int32:
232-
csharpTypeName = "int";
233-
break;
234-
case TypeCode.UInt32:
235-
csharpTypeName = "uint";
236-
break;
237-
case TypeCode.Int64:
238-
csharpTypeName = "long";
239-
break;
240-
case TypeCode.UInt64:
241-
csharpTypeName = "ulong";
242-
break;
243-
case TypeCode.Single:
244-
csharpTypeName = "float";
245-
break;
246-
case TypeCode.Double:
247-
csharpTypeName = "double";
248-
break;
249-
case TypeCode.Decimal:
250-
csharpTypeName = "decimal";
251-
break;
252-
case TypeCode.String:
253-
csharpTypeName = "string";
254-
break;
255-
default:
256-
csharpTypeName = dbColumnDataType.Name;
257-
break;
258-
}
259-
return csharpTypeName;
260-
}
261-
262-
private static bool IsValueType(Type dbColumnDataType)
263-
{
264-
var typeCode = Type.GetTypeCode(dbColumnDataType);
265-
var isValueType = false;
266-
267-
switch (typeCode)
268-
{
269-
case TypeCode.Boolean:
270-
case TypeCode.Char:
271-
case TypeCode.SByte:
272-
case TypeCode.Byte:
273-
case TypeCode.Int16:
274-
case TypeCode.UInt16:
275-
case TypeCode.Int32:
276-
case TypeCode.UInt32:
277-
case TypeCode.Int64:
278-
case TypeCode.UInt64:
279-
case TypeCode.Single:
280-
case TypeCode.Double:
281-
case TypeCode.Decimal:
282-
case TypeCode.DateTime:
283-
isValueType = true;
284-
break;
285-
}
286-
287-
return isValueType;
288-
}
289-
29089
void IResultWriter.FirstRowReadBegin()
29190
{
29291
_firstRowReadBeginTimestamp = Stopwatch.GetTimestamp();
@@ -321,6 +120,8 @@ void IResultWriter.End()
321120
var duration = Stopwatch.GetTimestamp() - _beginTimestamp;
322121
var message = $"Query completed {_commandCount} command(s) in {StopwatchTimeSpan.ToString(duration, 3)} seconds.";
323122
_addInfoMessage(new InfoMessage(LocalTime.Default.Now, InfoMessageSeverity.Verbose, message));
123+
124+
Log.Trace($"\r\n{_ormBuilder}");
324125
}
325126

326127
#endregion

Foundation/CSharpTypeName.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
namespace Foundation
2+
{
3+
internal static class CSharpTypeName
4+
{
5+
public const string Boolean = "bool";
6+
public const string Char = "char";
7+
public const string String = "string";
8+
public const string Object = "object";
9+
10+
public const string SByte = "sbyte";
11+
public const string Int16 = "short";
12+
public const string Int32 = "int";
13+
public const string Int64 = "long";
14+
15+
public const string Byte = "byte";
16+
public const string UInt16 = "ushort";
17+
public const string UInt32 = "uint";
18+
public const string UInt64 = "ulong";
19+
20+
public const string Single = "float";
21+
public const string Double = "double";
22+
public const string Decimal = "decimal";
23+
}
24+
}

Foundation/Configuration/TypeNameCollection.cs

Lines changed: 19 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Reflection;
44
using System.Xml;
55
using Foundation.Collections.IndexableCollection;
6+
using Foundation.Data;
67

78
namespace Foundation.Configuration
89
{
@@ -31,28 +32,28 @@ static TypeNameCollection()
3132
Collection = new IndexableCollection<TypeCollectionItem>(NameIndex);
3233
Collection.Indexes.Add(TypeIndex);
3334

34-
Add(TypeName.Bool, typeof (bool));
35-
Add(TypeName.Char, typeof (char));
36-
Add(TypeName.String, typeof (string));
37-
Add(TypeName.Object, typeof (object));
35+
Add(CSharpTypeName.Boolean, typeof(bool));
36+
Add(CSharpTypeName.Char, typeof(char));
37+
Add(CSharpTypeName.String, typeof(string));
38+
Add(CSharpTypeName.Object, typeof(object));
3839

39-
Add(TypeName.SByte, typeof (sbyte));
40-
Add(TypeName.Int16, typeof (short));
41-
Add(TypeName.Int32, typeof (int));
42-
Add(TypeName.Int64, typeof (long));
43-
Add(TypeName.Byte, typeof (byte));
44-
Add(TypeName.UInt16, typeof (ushort));
45-
Add(TypeName.UInt32, typeof (uint));
46-
Add(TypeName.UInt64, typeof (ulong));
40+
Add(CSharpTypeName.SByte, typeof(sbyte));
41+
Add(CSharpTypeName.Int16, typeof(short));
42+
Add(CSharpTypeName.Int32, typeof(int));
43+
Add(CSharpTypeName.Int64, typeof(long));
44+
Add(CSharpTypeName.Byte, typeof(byte));
45+
Add(CSharpTypeName.UInt16, typeof(ushort));
46+
Add(CSharpTypeName.UInt32, typeof(uint));
47+
Add(CSharpTypeName.UInt64, typeof(ulong));
4748

48-
Add(TypeName.Single, typeof (float));
49-
Add(TypeName.Double, typeof (double));
50-
Add(TypeName.Decimal, typeof (decimal));
49+
Add(CSharpTypeName.Single, typeof(float));
50+
Add(CSharpTypeName.Double, typeof(double));
51+
Add(CSharpTypeName.Decimal, typeof(decimal));
5152

52-
Add(TypeName.DateTime, typeof (DateTime));
53-
Add(TypeName.XmlNode, typeof (XmlNode));
53+
Add(TypeName.DateTime, typeof(DateTime));
54+
Add(TypeName.XmlNode, typeof(XmlNode));
5455

55-
SystemAssembly = Assembly.GetAssembly(typeof (int));
56+
SystemAssembly = Assembly.GetAssembly(typeof(int));
5657
}
5758

5859
private static void Add(string name, Type type)
@@ -165,24 +166,6 @@ public TypeCollectionItem(string name, Type type)
165166

166167
private static class TypeName
167168
{
168-
public const string Bool = "bool";
169-
public const string Char = "char";
170-
public const string String = "string";
171-
public const string Object = "object";
172-
173-
public const string SByte = "sbyte";
174-
public const string Int16 = "short";
175-
public const string Int32 = "int";
176-
public const string Int64 = "long";
177-
public const string Byte = "byte";
178-
public const string UInt16 = "ushort";
179-
public const string UInt32 = "uint";
180-
public const string UInt64 = "ulong";
181-
182-
public const string Single = "float";
183-
public const string Double = "double";
184-
public const string Decimal = "decimal";
185-
186169
public const string DateTime = "datetime";
187170
public const string XmlNode = "xmlnode";
188171
}

0 commit comments

Comments
 (0)