Merge lp:~colinwinning/dbversion/cmdtimeout into lp:dbversion
- cmdtimeout
- Merge into trunk
Proposed by
Colin Winning
Status: | Merged |
---|---|
Merged at revision: | 49 |
Proposed branch: | lp:~colinwinning/dbversion/cmdtimeout |
Merge into: | lp:dbversion |
Diff against target: |
344 lines (+101/-23) 7 files modified
src/DatabaseVersion.Tests/Manifests/ManifestReaderTests.cs (+3/-5) src/DatabaseVersion.Tests/Sql/ScriptTaskFactoryTests.cs (+3/-3) src/DatabaseVersion.Tests/Sql/ScriptTaskTests.cs (+50/-9) src/DatabaseVersion/Manifests/ManifestReader.cs (+1/-1) src/DatabaseVersion/Tasks/IDatabaseTaskFactory.cs (+1/-2) src/DatabaseVersion/Tasks/Sql/ScriptTask.cs (+26/-1) src/DatabaseVersion/Tasks/Sql/ScriptTaskFactory.cs (+17/-2) |
To merge this branch: | bzr merge lp:~colinwinning/dbversion/cmdtimeout |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Adam Connelly | Pending | ||
Review via email: mp+121866@code.launchpad.net |
Commit message
Description of the change
Fixes command timeout issue (bug #1043316)
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'src/DatabaseVersion.Tests/Manifests/ManifestReaderTests.cs' |
2 | --- src/DatabaseVersion.Tests/Manifests/ManifestReaderTests.cs 2011-10-10 18:43:53 +0000 |
3 | +++ src/DatabaseVersion.Tests/Manifests/ManifestReaderTests.cs 2012-08-29 13:40:23 +0000 |
4 | @@ -95,9 +95,8 @@ |
5 | |
6 | Mock<IDatabaseTaskFactory > factory = new Mock<IDatabaseTaskFactory>(); |
7 | Mock<IDatabaseTask > task = new Mock<IDatabaseTask>(); |
8 | - Mock<IMessageService> messageService = new Mock<IMessageService>(); |
9 | factory.Setup(f => f.CanCreate(It.Is<XElement>(r => r.Name == "script"))).Returns(true); |
10 | - factory.Setup(f => f.Create(It.Is<XElement>(r => r.Name == "script"), 0, It.IsAny<IDatabaseVersion>(), messageService.Object)).Returns(task.Object); |
11 | + factory.Setup(f => f.Create(It.Is<XElement>(r => r.Name == "script"), 0, It.IsAny<IDatabaseVersion>())).Returns(task.Object); |
12 | |
13 | reader.Factories = new[] { factory.Object }; |
14 | |
15 | @@ -116,9 +115,8 @@ |
16 | |
17 | Mock<IDatabaseTaskFactory > factory = new Mock<IDatabaseTaskFactory>(); |
18 | Mock<IDatabaseTask > task = new Mock<IDatabaseTask>(); |
19 | - Mock<IMessageService> messageService = new Mock<IMessageService>(); |
20 | factory.Setup(f => f.CanCreate(It.IsAny<XElement>())).Returns(true); |
21 | - factory.Setup(f => f.Create(It.IsAny<XElement>(), It.IsAny<int>(), It.IsAny<IDatabaseVersion>(), messageService.Object)).Returns(task.Object); |
22 | + factory.Setup(f => f.Create(It.IsAny<XElement>(), It.IsAny<int>(), It.IsAny<IDatabaseVersion>())).Returns(task.Object); |
23 | |
24 | reader.Factories = new[] { factory.Object }; |
25 | |
26 | @@ -129,7 +127,7 @@ |
27 | int expectedOrder = 0; |
28 | foreach (IDatabaseTask createdTask in version.Tasks) |
29 | { |
30 | - factory.Verify(f => f.Create(It.IsAny<XElement>(), expectedOrder, It.IsAny<IDatabaseVersion>(), messageService.Object)); |
31 | + factory.Verify(f => f.Create(It.IsAny<XElement>(), expectedOrder, It.IsAny<IDatabaseVersion>())); |
32 | expectedOrder++; |
33 | } |
34 | } |
35 | |
36 | === modified file 'src/DatabaseVersion.Tests/Sql/ScriptTaskFactoryTests.cs' |
37 | --- src/DatabaseVersion.Tests/Sql/ScriptTaskFactoryTests.cs 2011-10-10 09:00:52 +0000 |
38 | +++ src/DatabaseVersion.Tests/Sql/ScriptTaskFactoryTests.cs 2012-08-29 13:40:23 +0000 |
39 | @@ -63,7 +63,7 @@ |
40 | new XAttribute(XName.Get("file"), "path/file.sql")); |
41 | |
42 | // Act |
43 | - IDatabaseTask task = this.factory.Create(element, 0, null, null); |
44 | + IDatabaseTask task = this.factory.Create(element, 0, null); |
45 | |
46 | // Assert |
47 | Assert.IsType<ScriptTask>(task); |
48 | @@ -78,7 +78,7 @@ |
49 | new XAttribute(XName.Get("file"), "path/file.sql")); |
50 | |
51 | // Act |
52 | - IDatabaseTask task = this.factory.Create(element, 0, null, null); |
53 | + IDatabaseTask task = this.factory.Create(element, 0, null); |
54 | |
55 | // Assert |
56 | Assert.Equal("path/file.sql", ((ScriptTask)task).FileName); |
57 | @@ -93,7 +93,7 @@ |
58 | new XAttribute(XName.Get("file"), "path/file.sql")); |
59 | |
60 | // Act |
61 | - IDatabaseTask task = this.factory.Create(element, 25, null, null); |
62 | + IDatabaseTask task = this.factory.Create(element, 25, null); |
63 | |
64 | // Assert |
65 | Assert.Equal(25, task.ExecutionOrder); |
66 | |
67 | === modified file 'src/DatabaseVersion.Tests/Sql/ScriptTaskTests.cs' |
68 | --- src/DatabaseVersion.Tests/Sql/ScriptTaskTests.cs 2012-01-24 22:01:24 +0000 |
69 | +++ src/DatabaseVersion.Tests/Sql/ScriptTaskTests.cs 2012-08-29 13:40:23 +0000 |
70 | @@ -9,6 +9,7 @@ |
71 | using Moq; |
72 | using System.Data; |
73 | using System.IO; |
74 | + using dbversion.Property; |
75 | using dbversion.Tasks; |
76 | using dbversion.Version; |
77 | using NHibernate; |
78 | @@ -18,10 +19,12 @@ |
79 | private readonly Mock<ISession> session = new Mock<ISession>() { DefaultValue = DefaultValue.Mock }; |
80 | private readonly Mock<IDbCommand> command = new Mock<IDbCommand>(); |
81 | private readonly Mock<IMessageService> messageService = new Mock<IMessageService> { DefaultValue = DefaultValue.Mock }; |
82 | + private readonly Mock<IPropertyService> propertyService = new Mock<IPropertyService>(); |
83 | |
84 | public ScriptTaskTests() |
85 | { |
86 | this.session.Setup(s => s.Connection.CreateCommand()).Returns(command.Object); |
87 | + this.command.SetupProperty(c => c.CommandTimeout); |
88 | } |
89 | |
90 | [Fact] |
91 | @@ -32,7 +35,7 @@ |
92 | version.Setup(v => v.ManifestPath).Returns("1\\database.xml"); |
93 | version.Setup(v => v.Archive.GetScriptPath("1\\database.xml", "scripts\\schema.sql")).Returns("1\\scripts\\schema.sql"); |
94 | version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns(this.GetStream("A")); |
95 | - ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object); |
96 | + ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object, this.propertyService.Object); |
97 | |
98 | // Act |
99 | task.Execute(session.Object, 1, 1); |
100 | @@ -49,7 +52,7 @@ |
101 | version.Setup(v => v.ManifestPath).Returns("1\\database.xml"); |
102 | version.Setup(v => v.Archive.GetScriptPath("1\\database.xml", "scripts\\schema.sql")).Returns("1\\scripts\\schema.sql"); |
103 | version.Setup(v => v.Archive.GetFile("1\\scripts\\schema.sql")).Returns(GetStream("ABCDE")); |
104 | - ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object); |
105 | + ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object, this.propertyService.Object); |
106 | |
107 | // Act |
108 | task.Execute(session.Object, 1, 1); |
109 | @@ -67,7 +70,7 @@ |
110 | version.Setup(v => v.ManifestPath).Returns("1\\database.xml"); |
111 | version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns( |
112 | GetStream("ABCDE" + Environment.NewLine + "GO" + Environment.NewLine + "FGHIJ")); |
113 | - ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object); |
114 | + ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object, this.propertyService.Object); |
115 | |
116 | // Act |
117 | task.Execute(session.Object, 1, 1); |
118 | @@ -96,7 +99,7 @@ |
119 | version.Setup(v => v.ManifestPath).Returns("1\\database.xml"); |
120 | version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns( |
121 | GetStream(ScriptWithDifferentCasedSeparators)); |
122 | - ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object); |
123 | + ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object, this.propertyService.Object); |
124 | |
125 | // Act |
126 | task.Execute(session.Object, 1, 1); |
127 | @@ -124,7 +127,7 @@ |
128 | version.Setup(v => v.ManifestPath).Returns("1\\database.xml"); |
129 | version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns( |
130 | GetStream(ScriptWithSeparatorsWithinLines)); |
131 | - ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object); |
132 | + ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object, this.propertyService.Object); |
133 | |
134 | // Act |
135 | task.Execute(session.Object, 1, 1); |
136 | @@ -147,7 +150,7 @@ |
137 | version.Setup(v => v.ManifestPath).Returns("1\\database.xml"); |
138 | version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns( |
139 | GetStream(ScriptWithSeparatorAtStartOfScript)); |
140 | - ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object); |
141 | + ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object, this.propertyService.Object); |
142 | |
143 | // Act |
144 | task.Execute(session.Object, 1, 1); |
145 | @@ -168,7 +171,7 @@ |
146 | version.Setup(v => v.ManifestPath).Returns("1\\database.xml"); |
147 | version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns( |
148 | GetStream(ScriptWithSeparatorAtEndOfScript)); |
149 | - ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object); |
150 | + ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object, this.propertyService.Object); |
151 | |
152 | // Act |
153 | task.Execute(session.Object, 1, 1); |
154 | @@ -186,7 +189,7 @@ |
155 | version.Setup(v => v.Archive.GetScriptPath("1\\database.xml", "scripts\\schema.sql")).Returns("1\\scripts\\schema.sql"); |
156 | version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns( |
157 | GetStream(ScriptWithSeparatorAtEndOfScript)); |
158 | - ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object); |
159 | + ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object, this.propertyService.Object); |
160 | Exception exception = new Exception(); |
161 | command.Setup(c=>c.ExecuteNonQuery()).Throws(exception); |
162 | |
163 | @@ -207,7 +210,7 @@ |
164 | version.Setup(v => v.ManifestPath).Returns("1\\database.xml"); |
165 | version.Setup(v => v.Archive.GetScriptPath("1\\database.xml", "scripts\\schema.sql")).Returns("1\\scripts\\schema.sql"); |
166 | version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns((Stream)null); |
167 | - ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object); |
168 | + ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object, this.propertyService.Object); |
169 | |
170 | // Act |
171 | Exception thrownException = Record.Exception(() => task.Execute(new Mock<ISession>().Object, 1, 1)); |
172 | @@ -217,6 +220,44 @@ |
173 | Assert.Equal("The script file \"1\\scripts\\schema.sql\" does not exist in the archive.", thrownException.Message); |
174 | } |
175 | |
176 | + [Fact] |
177 | + public void ShouldSetCommandTimeoutIfSpecified() |
178 | + { |
179 | + // Arrange |
180 | + Mock<IDatabaseVersion> version = new Mock<IDatabaseVersion>{ DefaultValue = DefaultValue.Mock }; |
181 | + version.Setup(v => v.ManifestPath).Returns("1\\database.xml"); |
182 | + version.Setup(v => v.Archive.GetScriptPath("1\\database.xml", "scripts\\schema.sql")).Returns("1\\scripts\\schema.sql"); |
183 | + version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns( |
184 | + GetStream(ScriptWithSeparatorAtEndOfScript)); |
185 | + var task = new ScriptTask("scripts\\test.sql", 0, version.Object, this.messageService.Object, this.propertyService.Object); |
186 | + |
187 | + propertyService.Setup(p => p["dbversion.sql.command_timeout"]).Returns(new Property { Value = "100" }); |
188 | + |
189 | + // Act |
190 | + task.Execute(this.session.Object, 1, 1); |
191 | + |
192 | + // Assert |
193 | + Assert.Equal(100, task.TaskTimeout); |
194 | + } |
195 | + |
196 | + [Fact] |
197 | + public void ShouldNotSetCommandTimeoutIfNotSpecified() |
198 | + { |
199 | + // Arrange |
200 | + Mock<IDatabaseVersion> version = new Mock<IDatabaseVersion> { DefaultValue = DefaultValue.Mock }; |
201 | + version.Setup(v => v.ManifestPath).Returns("1\\database.xml"); |
202 | + version.Setup(v => v.Archive.GetScriptPath("1\\database.xml", "scripts\\schema.sql")).Returns("1\\scripts\\schema.sql"); |
203 | + version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns( |
204 | + GetStream(ScriptWithSeparatorAtEndOfScript)); |
205 | + var task = new ScriptTask("scripts\\test.sql", 0, version.Object, this.messageService.Object, this.propertyService.Object); |
206 | + |
207 | + // Act |
208 | + task.Execute(this.session.Object, 1, 1); |
209 | + |
210 | + // Assert |
211 | + Assert.Null(task.TaskTimeout); |
212 | + } |
213 | + |
214 | private Stream GetStream(string contents) |
215 | { |
216 | return new MemoryStream(Encoding.Default.GetBytes(contents)); |
217 | |
218 | === modified file 'src/DatabaseVersion/Manifests/ManifestReader.cs' |
219 | --- src/DatabaseVersion/Manifests/ManifestReader.cs 2011-10-10 18:43:53 +0000 |
220 | +++ src/DatabaseVersion/Manifests/ManifestReader.cs 2012-08-29 13:40:23 +0000 |
221 | @@ -58,7 +58,7 @@ |
222 | IDatabaseTaskFactory factory = this.Factories.FirstOrDefault(f => f.CanCreate(element)); |
223 | if (factory != null) |
224 | { |
225 | - return factory.Create(element, element.ElementsBeforeSelf().Count(), version, MessageService); |
226 | + return factory.Create(element, element.ElementsBeforeSelf().Count(), version); |
227 | } |
228 | } |
229 | |
230 | |
231 | === modified file 'src/DatabaseVersion/Tasks/IDatabaseTaskFactory.cs' |
232 | --- src/DatabaseVersion/Tasks/IDatabaseTaskFactory.cs 2011-10-10 18:43:53 +0000 |
233 | +++ src/DatabaseVersion/Tasks/IDatabaseTaskFactory.cs 2012-08-29 13:40:23 +0000 |
234 | @@ -19,8 +19,7 @@ |
235 | /// <param name="element">The element containing the definition of the task.</param> |
236 | /// <param name="executionOrder">The zero-based execution order of the task.</param> |
237 | /// <param name="version">The database version that the task is contained within.</param> |
238 | - /// <param name="messageService">The Message Service to use for logging</param> |
239 | /// <returns>The new task.</returns> |
240 | - IDatabaseTask Create(XElement element, int executionOrder, IDatabaseVersion version, IMessageService messageService); |
241 | + IDatabaseTask Create(XElement element, int executionOrder, IDatabaseVersion version); |
242 | } |
243 | } |
244 | |
245 | === modified file 'src/DatabaseVersion/Tasks/Sql/ScriptTask.cs' |
246 | --- src/DatabaseVersion/Tasks/Sql/ScriptTask.cs 2012-01-24 22:01:24 +0000 |
247 | +++ src/DatabaseVersion/Tasks/Sql/ScriptTask.cs 2012-08-29 13:40:23 +0000 |
248 | @@ -9,6 +9,7 @@ |
249 | using System.Diagnostics; |
250 | using System.Text.RegularExpressions; |
251 | |
252 | + using dbversion.Property; |
253 | using dbversion.Version; |
254 | |
255 | using NHibernate; |
256 | @@ -36,15 +37,38 @@ |
257 | /// </summary> |
258 | private readonly IDatabaseVersion version; |
259 | |
260 | + private readonly IPropertyService propertyService; |
261 | + |
262 | protected override string GetTaskDescription() |
263 | { |
264 | return string.Format("Executing script \"{0}\"", this.GetScriptPath()); |
265 | } |
266 | |
267 | - public ScriptTask(string fileName, int executionOrder, IDatabaseVersion version, IMessageService messageService) |
268 | + /// <summary> |
269 | + /// The Timeout in seconds for the task |
270 | + /// </summary> |
271 | + /// <returns>The Timeout in seconds or if none set null</returns> |
272 | + public int? TaskTimeout |
273 | + { |
274 | + get |
275 | + { |
276 | + var property = this.propertyService["dbversion.sql.command_timeout"]; |
277 | + if (property != null) |
278 | + { |
279 | + int commandTimeout; |
280 | + if (Int32.TryParse(property.Value, out commandTimeout)) |
281 | + return commandTimeout; |
282 | + } |
283 | + |
284 | + return null; |
285 | + } |
286 | + } |
287 | + |
288 | + public ScriptTask(string fileName, int executionOrder, IDatabaseVersion version, IMessageService messageService, IPropertyService propertyService) |
289 | : base(fileName, executionOrder, messageService) |
290 | { |
291 | this.version = version; |
292 | + this.propertyService = propertyService; |
293 | |
294 | this.StringSplitRegex = GetStringSplitRegex(); |
295 | } |
296 | @@ -119,6 +143,7 @@ |
297 | using (var command = session.Connection.CreateCommand()) |
298 | { |
299 | session.Transaction.Enlist(command); |
300 | + if (TaskTimeout.HasValue) command.CommandTimeout = TaskTimeout.Value; |
301 | command.CommandText = batch; |
302 | command.ExecuteNonQuery(); |
303 | } |
304 | |
305 | === modified file 'src/DatabaseVersion/Tasks/Sql/ScriptTaskFactory.cs' |
306 | --- src/DatabaseVersion/Tasks/Sql/ScriptTaskFactory.cs 2011-10-10 09:00:52 +0000 |
307 | +++ src/DatabaseVersion/Tasks/Sql/ScriptTaskFactory.cs 2012-08-29 13:40:23 +0000 |
308 | @@ -7,19 +7,34 @@ |
309 | using System.Xml.Linq; |
310 | using System.ComponentModel.Composition; |
311 | |
312 | + using dbversion.Property; |
313 | using dbversion.Version; |
314 | |
315 | [Export(typeof(IDatabaseTaskFactory))] |
316 | public class ScriptTaskFactory : IDatabaseTaskFactory |
317 | { |
318 | + [Import] |
319 | + public IPropertyService PropertyService |
320 | + { |
321 | + get; |
322 | + set; |
323 | + } |
324 | + |
325 | + [Import] |
326 | + public IMessageService MessageService |
327 | + { |
328 | + get; |
329 | + set; |
330 | + } |
331 | + |
332 | public bool CanCreate(XElement element) |
333 | { |
334 | return element != null && element.Name == "script"; |
335 | } |
336 | |
337 | - public IDatabaseTask Create(XElement element, int executionOrder, IDatabaseVersion version, IMessageService messageService) |
338 | + public IDatabaseTask Create(XElement element, int executionOrder, IDatabaseVersion version) |
339 | { |
340 | - return new ScriptTask(element.Attribute(XName.Get("file")).Value, executionOrder, version, messageService); |
341 | + return new ScriptTask(element.Attribute(XName.Get("file")).Value, executionOrder, version, this.MessageService, this.PropertyService); |
342 | } |
343 | } |
344 | } |