Datei: NDODLL/SqlPersistenceHandling/SqlColumnListGenerator.cs

Last Commit (123a4dc)
1 using NDO.Mapping;
2 using NDOInterfaces;
3 using System;
4 using System.Collections.Generic;
5 using System.Linq;
6 using System.Reflection;
7 using System.Text;
8
9 namespace NDO.SqlPersistenceHandling
10 {
11 ····/// <summary>
12 ····/// Helper class to generate lists of columns which can be used in Sql queries
13 ····/// </summary>
14 ····public class SqlColumnListGenerator
15 ····{
16 ········IProvider provider;
17 ········List<string> baseColumnList = new List<string>();
18 ········List<string> selectColumnList = new List<string>();
19 ········List<string> paramList = new List<string>();
20 ········List<string> hollowList = new List<string>();
21
22 ········string tableName;
23 ········Type resultType;
24
25 ········/// <summary>
26 ········/// Constructor
27 ········/// </summary>
28 ········/// <param name="cls"></param>
29 ········public SqlColumnListGenerator( Class cls )
30 ········{
31 ············Init( cls );
32 ········}
33
34 ········/// <summary>
35 ········/// Initializes the ColumnListGenerator
36 ········/// </summary>
37 ········/// <param name="cls"></param>
38 ········public void Init( Class cls )
39 ········{
40 ············this.tableName = cls.TableName;
41 ············this.resultType = cls.SystemType;
42
43 ············provider = cls.Provider;
44 ············FieldMap fm = new FieldMap( cls );
45 ············var persistentFields = fm.PersistentFields;
46 ············var relationInfos = new RelationCollector( cls ).CollectRelations().ToList();
 
47
48 ············foreach (OidColumn oidColumn in cls.Oid.OidColumns)
49 ············{
50 ················hollowList.Add( oidColumn.Name );
51
52 ················Relation r = oidColumn.Relation;
53 ················if (r != null && r.ForeignKeyTypeColumnName != null)
54 ····················hollowList.Add( r.ForeignKeyTypeColumnName );··// Die Frage ist, ob das nicht auch in der baseColumnList auftauchen muss.
55
56 ················if (!oidColumn.AutoIncremented && oidColumn.FieldName == null && oidColumn.RelationName == null)
57 ················{
58 ····················baseColumnList.Add( oidColumn.Name );
59 ····················paramList.Add( oidColumn.Name );
60 ················}
61 ············}
62
63 ············foreach (var e in persistentFields)
64 ············{
65 ················Type memberType;
66 ················if (e.Value is FieldInfo)
67 ····················memberType = ((FieldInfo)e.Value).FieldType;
68 ················else
69 ····················memberType = ((PropertyInfo)e.Value).PropertyType;
70
71 ················var fieldMapping = cls.FindField( (string)e.Key );
 
 
 
 
 
 
 
72
73 ················// Ignore fields without mapping.
74 ················if (null == fieldMapping)
75 ····················continue;
76
77 ················if (null == fieldMapping.Column.DbType)
78 ················{
79 ····················fieldMapping.ColumnDbType = (int)provider.GetDbType( memberType );
80 ················}
81 ················else
82 ················{
83 ····················fieldMapping.ColumnDbType = (int)provider.GetDbType( fieldMapping.Column.DbType );
84 ················}
85
 
 
86 ················baseColumnList.Add( fieldMapping.Column.Name );
87 ················paramList.Add( fieldMapping.Column.Name );
88 ············}
 
89
90 ············foreach (RelationFieldInfo ri in relationInfos)
91 ············{
92 ················Relation r = ri.Rel;
93 ················foreach (ForeignKeyColumn fkColumn in r.ForeignKeyColumns)
94 ················{
95 ····················baseColumnList.Add( fkColumn.Name );
96 ····················paramList.Add( fkColumn.Name );
97 ················}
98 ················if (r.ForeignKeyTypeColumnName != null)
99 ················{
100 ····················baseColumnList.Add( r.ForeignKeyTypeColumnName );
101 ····················paramList.Add( r.ForeignKeyTypeColumnName );
102 ················}
103
104 ············}
105
106 ············if (cls.TimeStampColumn != null)
107 ············{
108 ················baseColumnList.Add( cls.TimeStampColumn );
109 ················paramList.Add( cls.TimeStampColumn );
110 ················hollowList.Add( cls.TimeStampColumn );
111 ············}
112
113 ············if (cls.TypeNameColumn != null)
114 ············{
115 ················var typeColumnName = cls.TypeNameColumn.Name;
116 ················baseColumnList.Add( typeColumnName );
117 ················paramList.Add( typeColumnName );
118 ················hollowList.Add( typeColumnName );
119 ············}
120
121 ············foreach (OidColumn oidColumn in cls.Oid.OidColumns)
122 ············{
123 ················if (oidColumn.FieldName == null && oidColumn.RelationName == null && oidColumn.AutoIncremented)
124 ····················selectColumnList.Add( oidColumn.Name );
125 ············}
126
127 ············selectColumnList.AddRange( baseColumnList );
 
128
129 ········}
130
131 ········/// <summary/>
132 ········public string BaseList => Result( this.baseColumnList, false, false );
133 ········/// <summary/>
134 ········public string SelectList => Result( this.selectColumnList, false, false );
135 ········/// <summary/>
136 ········public string SelectListWithAlias => Result( this.selectColumnList, true, false );
137 ········/// <summary/>
138 ········public string HollowFields => Result( this.hollowList, false, false );
139 ········/// <summary/>
140 ········public string HollowFieldsWithAlias => Result( this.hollowList, true, false );
141
142 ········/// <summary/>
143 ········public string ParamList
144 ········{
145 ············get
146 ············{
147 ················StringBuilder result = new StringBuilder();
148 ················int ende = this.paramList.Count - 1;
149 ················for (int i = 0; i < this.paramList.Count; i++)
150 ················{
151 ····················if (this.provider.UseNamedParams)
152 ····················{
153 ························result.Append( this.provider.GetNamedParameter( this.paramList[i] ) );
154 ························if (i < ende)
155 ························{
156 ····························result.Append( ", " );
157 ························}
158 ····················}
159 ····················else
160 ····················{
161 ························if (i < ende)
162 ························{
163 ····························result.Append( "?, " );
164 ························}
165 ························else
166 ····························result.Append( "?" );
167 ····················}
168 ················}
169
170 ················return result.ToString();
171 ············}
172 ········}
173
174 ········/// <summary/>
175 ········public string Result(bool hollow, bool generateAliasNames, bool useTableName)
176 ········{
177 ············return Result( hollow ? this.hollowList : this.selectColumnList, generateAliasNames, useTableName );
178 ········}
179
180 ········string Result(List<string> columnList, bool generateAliasNames, bool useTableName )
181 ········{
182 ············StringBuilder sb = new StringBuilder();
183 ············int ende = columnList.Count - 1;
184 ············for (int i = 0; i < columnList.Count; i++)
185 ············{
186 ················string f = columnList[i];
187 ················if (useTableName)
188 ················{
189 ····················sb.Append( provider.GetQualifiedTableName( tableName ) );
190 ····················sb.Append( '.' );
191 ················}
192 ················sb.Append( provider.GetQuotedName( f ) );
193 ················if (generateAliasNames)
194 ················{
195 ····················sb.Append( " AS " );
196 ····················sb.Append( provider.GetQuotedName( f ) );
197 ················}
198 ················if (i < ende)
199 ················{
200 ····················sb.Append( ", " );
201 ················}
202 ············}
203
204 ············return sb.ToString();
205 ········}
206 ····}
207 }
208
New Commit (16046d5)
1 using NDO.Mapping;
2 using NDOInterfaces;
3 using System;
4 using System.Collections.Generic;
5 using System.Linq;
6 using System.Reflection;
7 using System.Text;
8
9 namespace NDO.SqlPersistenceHandling
10 {
11 ····/// <summary>
12 ····/// Helper class to generate lists of columns which can be used in Sql queries
13 ····/// </summary>
14 ····public class SqlColumnListGenerator
15 ····{
16 ········IProvider provider;
17 ········List<string> baseColumnList = new List<string>();
18 ········List<string> selectColumnList = new List<string>();
19 ········List<string> paramList = new List<string>();
20 ········List<string> hollowList = new List<string>();
21
22 ········string tableName;
23 ········Type resultType;
24
25 ········/// <summary>
26 ········/// Constructor
27 ········/// </summary>
28 ········/// <param name="cls"></param>
29 ········public SqlColumnListGenerator( Class cls )
30 ········{
31 ············Init( cls );
32 ········}
33
34 ········/// <summary>
35 ········/// Initializes the ColumnListGenerator
36 ········/// </summary>
37 ········/// <param name="cls"></param>
38 ········public void Init( Class cls )
39 ········{
40 ············this.tableName = cls.TableName;
41 ············this.resultType = cls.SystemType;
42
43 ············provider = cls.Provider;
44 ············FieldMap fm = new FieldMap( cls );
45 ············var persistentFields = fm.PersistentFields;
46 ············var relationInfos = new RelationCollector( cls ).CollectRelations().ToList();
47 ············List<string> readOnlyColumns = new List<string>();
48
49 ············foreach (OidColumn oidColumn in cls.Oid.OidColumns)
50 ············{
51 ················hollowList.Add( oidColumn.Name );
52
53 ················Relation r = oidColumn.Relation;
54 ················if (r != null && r.ForeignKeyTypeColumnName != null)
55 ····················hollowList.Add( r.ForeignKeyTypeColumnName );··// Die Frage ist, ob das nicht auch in der baseColumnList auftauchen muss.
56
57 ················if (!oidColumn.AutoIncremented && oidColumn.FieldName == null && oidColumn.RelationName == null)
58 ················{
59 ····················baseColumnList.Add( oidColumn.Name );
60 ····················paramList.Add( oidColumn.Name );
61 ················}
62 ············}
63
64 ············foreach (var e in persistentFields)
65 ············{
66 ················Type memberType;
67 ················if (e.Value is FieldInfo)
68 ····················memberType = ((FieldInfo)e.Value).FieldType;
69 ················else
70 ····················memberType = ((PropertyInfo)e.Value).PropertyType;
71
72 ················var fieldMapping = cls.FindField( (string)e.Key );
73 ················bool isReadOnly = false;
74
75 ················if (e.Value.CustomAttributes.Any( c => c.AttributeType == typeof( NDOReadOnlyAttribute ) ))
76 ················{
77 ····················readOnlyColumns.Add( fieldMapping.Column.Name );
78 ····················isReadOnly = true;
79 ················}
80
81 ················// Ignore fields without mapping.
82 ················if (null == fieldMapping)
83 ····················continue;
84
85 ················if (null == fieldMapping.Column.DbType)
86 ················{
87 ····················fieldMapping.ColumnDbType = (int)provider.GetDbType( memberType );
88 ················}
89 ················else
90 ················{
91 ····················fieldMapping.ColumnDbType = (int)provider.GetDbType( fieldMapping.Column.DbType );
92 ················}
93
94 ················if (!isReadOnly)
95 ················{
96 ····················baseColumnList.Add( fieldMapping.Column.Name );
97 ····················paramList.Add( fieldMapping.Column.Name );
98 ················}
99 ············}
100
101 ············foreach (RelationFieldInfo ri in relationInfos)
102 ············{
103 ················Relation r = ri.Rel;
104 ················foreach (ForeignKeyColumn fkColumn in r.ForeignKeyColumns)
105 ················{
106 ····················baseColumnList.Add( fkColumn.Name );
107 ····················paramList.Add( fkColumn.Name );
108 ················}
109 ················if (r.ForeignKeyTypeColumnName != null)
110 ················{
111 ····················baseColumnList.Add( r.ForeignKeyTypeColumnName );
112 ····················paramList.Add( r.ForeignKeyTypeColumnName );
113 ················}
114
115 ············}
116
117 ············if (cls.TimeStampColumn != null)
118 ············{
119 ················baseColumnList.Add( cls.TimeStampColumn );
120 ················paramList.Add( cls.TimeStampColumn );
121 ················hollowList.Add( cls.TimeStampColumn );
122 ············}
123
124 ············if (cls.TypeNameColumn != null)
125 ············{
126 ················var typeColumnName = cls.TypeNameColumn.Name;
127 ················baseColumnList.Add( typeColumnName );
128 ················paramList.Add( typeColumnName );
129 ················hollowList.Add( typeColumnName );
130 ············}
131
132 ············foreach (OidColumn oidColumn in cls.Oid.OidColumns)
133 ············{
134 ················if (oidColumn.FieldName == null && oidColumn.RelationName == null && oidColumn.AutoIncremented)
135 ····················selectColumnList.Add( oidColumn.Name );
136 ············}
137
138 ············selectColumnList.AddRange( baseColumnList );
139 ············selectColumnList.AddRange( readOnlyColumns );
140
141 ········}
142
143 ········/// <summary/>
144 ········public string BaseList => Result( this.baseColumnList, false, false );
145 ········/// <summary/>
146 ········public string SelectList => Result( this.selectColumnList, false, false );
147 ········/// <summary/>
148 ········public string SelectListWithAlias => Result( this.selectColumnList, true, false );
149 ········/// <summary/>
150 ········public string HollowFields => Result( this.hollowList, false, false );
151 ········/// <summary/>
152 ········public string HollowFieldsWithAlias => Result( this.hollowList, true, false );
153
154 ········/// <summary/>
155 ········public string ParamList
156 ········{
157 ············get
158 ············{
159 ················StringBuilder result = new StringBuilder();
160 ················int ende = this.paramList.Count - 1;
161 ················for (int i = 0; i < this.paramList.Count; i++)
162 ················{
163 ····················if (this.provider.UseNamedParams)
164 ····················{
165 ························result.Append( this.provider.GetNamedParameter( this.paramList[i] ) );
166 ························if (i < ende)
167 ························{
168 ····························result.Append( ", " );
169 ························}
170 ····················}
171 ····················else
172 ····················{
173 ························if (i < ende)
174 ························{
175 ····························result.Append( "?, " );
176 ························}
177 ························else
178 ····························result.Append( "?" );
179 ····················}
180 ················}
181
182 ················return result.ToString();
183 ············}
184 ········}
185
186 ········/// <summary/>
187 ········public string Result(bool hollow, bool generateAliasNames, bool useTableName)
188 ········{
189 ············return Result( hollow ? this.hollowList : this.selectColumnList, generateAliasNames, useTableName );
190 ········}
191
192 ········string Result(List<string> columnList, bool generateAliasNames, bool useTableName )
193 ········{
194 ············StringBuilder sb = new StringBuilder();
195 ············int ende = columnList.Count - 1;
196 ············for (int i = 0; i < columnList.Count; i++)
197 ············{
198 ················string f = columnList[i];
199 ················if (useTableName)
200 ················{
201 ····················sb.Append( provider.GetQualifiedTableName( tableName ) );
202 ····················sb.Append( '.' );
203 ················}
204 ················sb.Append( provider.GetQuotedName( f ) );
205 ················if (generateAliasNames)
206 ················{
207 ····················sb.Append( " AS " );
208 ····················sb.Append( provider.GetQuotedName( f ) );
209 ················}
210 ················if (i < ende)
211 ················{
212 ····················sb.Append( ", " );
213 ················}
214 ············}
215
216 ············return sb.ToString();
217 ········}
218 ····}
219 }
220