Datei: NDOEnhancer/NDOEnhancer/Enhancer/Generator/GenericDiffGenerator.cs

Last Commit (6626c8f)
1 //
2 // Copyright (c) 2002-2022 Mirko Matytschak
3 // (www.netdataobjects.de)
4 //
5 // Author: Mirko Matytschak
6 //
7 // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
8 // documentation files (the "Software"), to deal in the Software without restriction, including without limitation
9 // the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
10 // Software, and to permit persons to whom the Software is furnished to do so, subject to the following
11 // conditions:
12
13 // The above copyright notice and this permission notice shall be included in all copies or substantial portions
14 // of the Software.
15 //
16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
17 // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
19 // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20 // DEALINGS IN THE SOFTWARE.
21
22
23 using System;
24 using System.Text;
25 using System.IO;
26 using System.Collections.Generic;
27 using System.Data;
28 using NDO.Mapping;
29 using NDO;
30 using NDOInterfaces;
31
32 namespace NDOEnhancer
33 {
34 ····/// <summary>
35 ····/// Zusammenfassung für GenericDiffGenerator.
36 ····/// </summary>
37 ····internal class GenericDiffGenerator : GenericSqlGeneratorBase
38 ····{
39 ········IProvider provider;
40
41 ········public GenericDiffGenerator(IProvider provider, ISqlGenerator concreteGenerator, MessageAdapter messages, NDOMapping mappings)
42 ············: base(provider, concreteGenerator, messages, mappings)
43 ········{
44 ············this.provider = provider;
45 ········}
46
47 ········public void Generate(DataSet dsNewSchema, DataSet dsOldSchema, StreamWriter stream)
48 ········{
49 ············foreach(DataTable dt in dsNewSchema.Tables)
50 ············{
51 ················if (!dsOldSchema.Tables.Contains(dt.TableName))
52 ················{
53 ····················stream.Write(CreateTable(dt));
54 ················}
55 ················else
56 ················{
57 ····················DataTable dtOld = dsOldSchema.Tables[dt.TableName];
58 ····················var addedColumns = new List<DataColumn>();
59 ····················var removedColumns = new List<DataColumn>();
60 ····················var changedColumns = new List<DataColumn>();
61 ····················foreach(DataColumn dc in dt.Columns)
62 ····················{
63 ························if (!dtOld.Columns.Contains(dc.ColumnName))
64 ························{
65 ····························addedColumns.Add(dc);
66 ························}
67 ························else
68 ························{
69 ····························if (dc.DataType != dtOld.Columns[dc.ColumnName].DataType)
70 ································changedColumns.Add(dc);
71 ························}
72 ····················}
73 ····················foreach(DataColumn dc in dtOld.Columns)
74 ····················{
75 ························if (!dt.Columns.Contains(dc.ColumnName))
76 ························{
77 ····························removedColumns.Add(dc);
78 ························}
79 ····················}
80 ····················ChangeTable(dt, addedColumns, removedColumns, changedColumns, stream);
81 ················}
82
83 ············}
84 ········}
85
86 ········void ChangeTable(DataTable dt, List<DataColumn> addedColumns, List<DataColumn> removedColums, List<DataColumn> changedColumns, StreamWriter sw)
87 ········{
88 ············if (addedColumns.Count == 0 && removedColums.Count == 0 && changedColumns.Count == 0)
89 ················return;
90 ············string tableName = QualifiedTableName.Get(dt.TableName, this.provider);
91 ············string alterString = "ALTER TABLE " + tableName + ' ';
92 ············//alter table mitarbeiter modify [column] position_x char(255); (mysql)
93 ············//ALTER TABLE EMPLOYEE ALTER EMP_NUM TYPE CHAR(20); (Fb)
94
95 ············foreach(DataColumn dc in addedColumns)
96 ············{
97 ················sw.Write(alterString);
98 ················sw.Write(concreteGenerator.AddColumn());
99 ················sw.Write(' ');
100 ················sw.Write(base.CreateColumn(dc, GetClassForTable(dt.TableName, this.mappings), this.provider, false));
101 ················sw.WriteLine(";");
102 ············}
103
104 ············foreach(DataColumn dc in removedColums)
105 ············{
106 ················sw.Write(alterString);
107 ················sw.Write(concreteGenerator.RemoveColumn(provider.GetQuotedName(dc.ColumnName)));
108 ················sw.WriteLine(";");
109 ············}
110
111 ············foreach(DataColumn dc in changedColumns)
112 ············{
113 ················sw.Write(alterString);
114 ················sw.Write(concreteGenerator.AlterColumnType());
115 ················sw.Write(' ');
116 ················sw.Write(base.CreateColumn(dc, GetClassForTable(dt.TableName, this.mappings), this.provider, false));
117 ················sw.WriteLine(";");
118 ············}
119
120 ············if (removedColums.Count > 0)
121 ············{
122 ················sw.WriteLine("-- If you need to rename a column use the following syntax:");
123 ················string rename = RenameColumn(provider.GetQuotedName("YourTableName"),
124 ····················provider.GetQuotedName("OldColumnName"), provider.GetQuotedName("NewColumnName"),
125 ····················"NewColumnType [(Precision)] [" + concreteGenerator.NullExpression(true) + " | " + concreteGenerator.NullExpression(false) + "]");
126 ················string[] splittedRename = rename.Split('\n');
127 ················foreach(string s in splittedRename)
128 ····················sw.WriteLine("-- " + s);
129 ················messages.WriteLine("Warning: Dropping one or more columns. See the comment in the in ndodiff.sql file how to rename columns, if required.");
130 ············}
131
132 ········}
133
134 ········string RenameColumn(string tableName, string oldColumn, string newColumn, string typeString)
135 ········{
136 ············string s = concreteGenerator.RenameColumn(tableName, oldColumn, newColumn, typeString);
137 ············
138 ············if (s != string.Empty)
139 ············return s;
140 ········
141 ············string alterString = "ALTER TABLE " + tableName + ' ';
142
143 ············StringBuilder sb = new StringBuilder(alterString);
144 ············sb.Append(concreteGenerator.AddColumn());
145 ············sb.Append(' ');
146 ············sb.Append(newColumn);
147 ············sb.Append(' ');
148 ············sb.Append(typeString);
149 ············sb.Append(";\n");
150
151 ············sb.Append("UPDATE ");
152 ············sb.Append(tableName);
153 ············sb.Append(" SET ");············
154 ············sb.Append(newColumn);
155 ············sb.Append(" = ");
156 ············sb.Append(oldColumn);
157 ············sb.Append(";\n");
158
159 ············sb.Append(alterString);
160 ············sb.Append(concreteGenerator.RemoveColumn(oldColumn));
161 ············sb.Append(';');
162 ············return sb.ToString();
163 ········}
164 ····}
165 }
166
New Commit (b95968d)
1 //
2 // Copyright (c) 2002-2022 Mirko Matytschak
3 // (www.netdataobjects.de)
4 //
5 // Author: Mirko Matytschak
6 //
7 // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
8 // documentation files (the "Software"), to deal in the Software without restriction, including without limitation
9 // the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
10 // Software, and to permit persons to whom the Software is furnished to do so, subject to the following
11 // conditions:
12
13 // The above copyright notice and this permission notice shall be included in all copies or substantial portions
14 // of the Software.
15 //
16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
17 // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
19 // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20 // DEALINGS IN THE SOFTWARE.
21
22
23 using System;
24 using System.Text;
25 using System.IO;
26 using System.Collections.Generic;
27 using System.Data;
28 using NDO.Mapping;
 
29 using NDOInterfaces;
30
31 namespace NDOEnhancer
32 {
33 ····/// <summary>
34 ····/// Zusammenfassung für GenericDiffGenerator.
35 ····/// </summary>
36 ····internal class GenericDiffGenerator : GenericSqlGeneratorBase
37 ····{
38 ········IProvider provider;
39
40 ········public GenericDiffGenerator(IProvider provider, ISqlGenerator concreteGenerator, MessageAdapter messages, NDOMapping mappings)
41 ············: base(provider, concreteGenerator, messages, mappings)
42 ········{
43 ············this.provider = provider;
44 ········}
45
46 ········public void Generate(DataSet dsNewSchema, DataSet dsOldSchema, StreamWriter stream)
47 ········{
48 ············foreach(DataTable dt in dsNewSchema.Tables)
49 ············{
50 ················if (!dsOldSchema.Tables.Contains(dt.TableName))
51 ················{
52 ····················stream.Write(CreateTable(dt));
53 ················}
54 ················else
55 ················{
56 ····················DataTable dtOld = dsOldSchema.Tables[dt.TableName];
57 ····················var addedColumns = new List<DataColumn>();
58 ····················var removedColumns = new List<DataColumn>();
59 ····················var changedColumns = new List<DataColumn>();
60 ····················foreach(DataColumn dc in dt.Columns)
61 ····················{
62 ························if (!dtOld.Columns.Contains(dc.ColumnName))
63 ························{
64 ····························addedColumns.Add(dc);
65 ························}
66 ························else
67 ························{
68 ····························if (dc.DataType != dtOld.Columns[dc.ColumnName].DataType)
69 ································changedColumns.Add(dc);
70 ························}
71 ····················}
72 ····················foreach(DataColumn dc in dtOld.Columns)
73 ····················{
74 ························if (!dt.Columns.Contains(dc.ColumnName))
75 ························{
76 ····························removedColumns.Add(dc);
77 ························}
78 ····················}
79 ····················ChangeTable(dt, addedColumns, removedColumns, changedColumns, stream);
80 ················}
81
82 ············}
83 ········}
84
85 ········void ChangeTable(DataTable dt, List<DataColumn> addedColumns, List<DataColumn> removedColums, List<DataColumn> changedColumns, StreamWriter sw)
86 ········{
87 ············if (addedColumns.Count == 0 && removedColums.Count == 0 && changedColumns.Count == 0)
88 ················return;
89 ············string tableName = QualifiedTableName.Get(dt.TableName, this.provider);
90 ············string alterString = "ALTER TABLE " + tableName + ' ';
91 ············//alter table mitarbeiter modify [column] position_x char(255); (mysql)
92 ············//ALTER TABLE EMPLOYEE ALTER EMP_NUM TYPE CHAR(20); (Fb)
93
94 ············foreach(DataColumn dc in addedColumns)
95 ············{
96 ················sw.Write(alterString);
97 ················sw.Write(concreteGenerator.AddColumn());
98 ················sw.Write(' ');
99 ················sw.Write(base.CreateColumn(dc, GetClassForTable(dt.TableName, this.mappings), this.provider, false));
100 ················sw.WriteLine(";");
101 ············}
102
103 ············foreach(DataColumn dc in removedColums)
104 ············{
105 ················sw.Write(alterString);
106 ················sw.Write(concreteGenerator.RemoveColumn(provider.GetQuotedName(dc.ColumnName)));
107 ················sw.WriteLine(";");
108 ············}
109
110 ············foreach(DataColumn dc in changedColumns)
111 ············{
112 ················sw.Write(alterString);
113 ················sw.Write(concreteGenerator.AlterColumnType());
114 ················sw.Write(' ');
115 ················sw.Write(base.CreateColumn(dc, GetClassForTable(dt.TableName, this.mappings), this.provider, false));
116 ················sw.WriteLine(";");
117 ············}
118
119 ············if (removedColums.Count > 0)
120 ············{
121 ················sw.WriteLine("-- If you need to rename a column use the following syntax:");
122 ················string rename = RenameColumn(provider.GetQuotedName("YourTableName"),
123 ····················provider.GetQuotedName("OldColumnName"), provider.GetQuotedName("NewColumnName"),
124 ····················"NewColumnType [(Precision)] [" + concreteGenerator.NullExpression(true) + " | " + concreteGenerator.NullExpression(false) + "]");
125 ················string[] splittedRename = rename.Split('\n');
126 ················foreach(string s in splittedRename)
127 ····················sw.WriteLine("-- " + s);
128 ················messages.WriteLine("Warning: Dropping one or more columns. See the comment in the in ndodiff.sql file how to rename columns, if required.");
129 ············}
130
131 ········}
132
133 ········string RenameColumn(string tableName, string oldColumn, string newColumn, string typeString)
134 ········{
135 ············string s = concreteGenerator.RenameColumn(tableName, oldColumn, newColumn, typeString);
136 ············
137 ············if (s != string.Empty)
138 ············return s;
139 ········
140 ············string alterString = "ALTER TABLE " + tableName + ' ';
141
142 ············StringBuilder sb = new StringBuilder(alterString);
143 ············sb.Append(concreteGenerator.AddColumn());
144 ············sb.Append(' ');
145 ············sb.Append(newColumn);
146 ············sb.Append(' ');
147 ············sb.Append(typeString);
148 ············sb.Append(";\n");
149
150 ············sb.Append("UPDATE ");
151 ············sb.Append(tableName);
152 ············sb.Append(" SET ");············
153 ············sb.Append(newColumn);
154 ············sb.Append(" = ");
155 ············sb.Append(oldColumn);
156 ············sb.Append(";\n");
157
158 ············sb.Append(alterString);
159 ············sb.Append(concreteGenerator.RemoveColumn(oldColumn));
160 ············sb.Append(';');
161 ············return sb.ToString();
162 ········}
163 ····}
164 }
165