Merge lp:~colinwinning/dbversion/cmdtimeout into lp:dbversion

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
Reviewer Review Type Date Requested Status
Adam Connelly Pending
Review via email: mp+121866@code.launchpad.net

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 }

Subscribers

People subscribed via source and target branches

to all changes: