Merge lp:~adam-rpconnelly/dbversion/cmdtimeout into lp:dbversion

Proposed by Adam Connelly
Status: Merged
Merged at revision: 50
Proposed branch: lp:~adam-rpconnelly/dbversion/cmdtimeout
Merge into: lp:dbversion
Diff against target: 450 lines
To merge this branch: bzr merge lp:~adam-rpconnelly/dbversion/cmdtimeout
Reviewer Review Type Date Requested Status
Colin Winning Approve
Review via email: mp+121925@code.launchpad.net

Description of the change

Moved the code to convert the property value to an int into the PropertyService.

To post a comment you must log in.
Revision history for this message
Colin Winning (colinwinning) wrote :

All looks good to me.

Revision history for this message
Colin Winning (colinwinning) :
review: Approve

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 19:06:19 +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/Property/PropertyServiceTests.cs'
37--- src/DatabaseVersion.Tests/Property/PropertyServiceTests.cs 2011-09-02 23:16:14 +0000
38+++ src/DatabaseVersion.Tests/Property/PropertyServiceTests.cs 2012-08-29 19:06:19 +0000
39@@ -85,6 +85,6 @@
40
41 // Assert
42 Assert.Equal(0, service.Properties.Count());
43- }
44+ }
45
46 [Fact]
47 public void ShouldBeAbleToReturnPropertyAsInt()
48 {
49 // Arrange
50 var service = new PropertyService();
51 service.Add(new Property { Key = "myProperty", Value = "100" });
52
53 // Act
54 var value = service.GetInt("myProperty");
55
56 // Assert
57 Assert.Equal(100, value);
58 }
59
60 [Fact]
61 public void ShouldReturnNullIfPropertyIsNotAnInt()
62 {
63 // Arrange
64 var service = new PropertyService();
65 service.Add(new Property { Key = "myProperty", Value = "abcd" });
66
67 // Act
68 var value = service.GetInt("myProperty");
69
70 // Assert
71 Assert.Null(value);
72 }
73
74 [Fact]
75 public void ShouldReturnNullFromGetIntIfPropertyIsNotSet()
76 {
77 // Arrange
78 var service = new PropertyService();
79
80 // Act
81 var value = service.GetInt("myProperty");
82
83 // Assert
84 Assert.Null(value);
85 }
86 }
87 }
88
89=== modified file 'src/DatabaseVersion.Tests/Sql/ScriptTaskFactoryTests.cs'
90--- src/DatabaseVersion.Tests/Sql/ScriptTaskFactoryTests.cs 2011-10-10 09:00:52 +0000
91+++ src/DatabaseVersion.Tests/Sql/ScriptTaskFactoryTests.cs 2012-08-29 19:06:19 +0000
92@@ -63,7 +63,7 @@
93 new XAttribute(XName.Get("file"), "path/file.sql"));
94
95 // Act
96- IDatabaseTask task = this.factory.Create(element, 0, null, null);
97+ IDatabaseTask task = this.factory.Create(element, 0, null);
98
99 // Assert
100 Assert.IsType<ScriptTask>(task);
101@@ -78,7 +78,7 @@
102 new XAttribute(XName.Get("file"), "path/file.sql"));
103
104 // Act
105- IDatabaseTask task = this.factory.Create(element, 0, null, null);
106+ IDatabaseTask task = this.factory.Create(element, 0, null);
107
108 // Assert
109 Assert.Equal("path/file.sql", ((ScriptTask)task).FileName);
110@@ -93,7 +93,7 @@
111 new XAttribute(XName.Get("file"), "path/file.sql"));
112
113 // Act
114- IDatabaseTask task = this.factory.Create(element, 25, null, null);
115+ IDatabaseTask task = this.factory.Create(element, 25, null);
116
117 // Assert
118 Assert.Equal(25, task.ExecutionOrder);
119
120=== modified file 'src/DatabaseVersion.Tests/Sql/ScriptTaskTests.cs'
121--- src/DatabaseVersion.Tests/Sql/ScriptTaskTests.cs 2012-01-24 22:01:24 +0000
122+++ src/DatabaseVersion.Tests/Sql/ScriptTaskTests.cs 2012-08-29 19:06:19 +0000
123@@ -9,6 +9,7 @@
124 using Moq;
125 using System.Data;
126 using System.IO;
127+ using dbversion.Property;
128 using dbversion.Tasks;
129 using dbversion.Version;
130 using NHibernate;
131@@ -18,10 +19,12 @@
132 private readonly Mock<ISession> session = new Mock<ISession>() { DefaultValue = DefaultValue.Mock };
133 private readonly Mock<IDbCommand> command = new Mock<IDbCommand>();
134 private readonly Mock<IMessageService> messageService = new Mock<IMessageService> { DefaultValue = DefaultValue.Mock };
135+ private readonly Mock<IPropertyService> propertyService = new Mock<IPropertyService>();
136
137 public ScriptTaskTests()
138 {
139 this.session.Setup(s => s.Connection.CreateCommand()).Returns(command.Object);
140+ this.command.SetupProperty(c => c.CommandTimeout);
141 }
142
143 [Fact]
144@@ -32,7 +35,7 @@
145 version.Setup(v => v.ManifestPath).Returns("1\\database.xml");
146 version.Setup(v => v.Archive.GetScriptPath("1\\database.xml", "scripts\\schema.sql")).Returns("1\\scripts\\schema.sql");
147 version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns(this.GetStream("A"));
148- ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object);
149+ ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object, this.propertyService.Object);
150
151 // Act
152 task.Execute(session.Object, 1, 1);
153@@ -49,7 +52,7 @@
154 version.Setup(v => v.ManifestPath).Returns("1\\database.xml");
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("1\\scripts\\schema.sql")).Returns(GetStream("ABCDE"));
157- ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object);
158+ ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object, this.propertyService.Object);
159
160 // Act
161 task.Execute(session.Object, 1, 1);
162@@ -67,7 +70,7 @@
163 version.Setup(v => v.ManifestPath).Returns("1\\database.xml");
164 version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns(
165 GetStream("ABCDE" + Environment.NewLine + "GO" + Environment.NewLine + "FGHIJ"));
166- ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object);
167+ ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object, this.propertyService.Object);
168
169 // Act
170 task.Execute(session.Object, 1, 1);
171@@ -96,7 +99,7 @@
172 version.Setup(v => v.ManifestPath).Returns("1\\database.xml");
173 version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns(
174 GetStream(ScriptWithDifferentCasedSeparators));
175- ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object);
176+ ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object, this.propertyService.Object);
177
178 // Act
179 task.Execute(session.Object, 1, 1);
180@@ -124,7 +127,7 @@
181 version.Setup(v => v.ManifestPath).Returns("1\\database.xml");
182 version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns(
183 GetStream(ScriptWithSeparatorsWithinLines));
184- ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object);
185+ ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object, this.propertyService.Object);
186
187 // Act
188 task.Execute(session.Object, 1, 1);
189@@ -147,7 +150,7 @@
190 version.Setup(v => v.ManifestPath).Returns("1\\database.xml");
191 version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns(
192 GetStream(ScriptWithSeparatorAtStartOfScript));
193- ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object);
194+ ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object, this.propertyService.Object);
195
196 // Act
197 task.Execute(session.Object, 1, 1);
198@@ -168,7 +171,7 @@
199 version.Setup(v => v.ManifestPath).Returns("1\\database.xml");
200 version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns(
201 GetStream(ScriptWithSeparatorAtEndOfScript));
202- ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object);
203+ ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object, this.propertyService.Object);
204
205 // Act
206 task.Execute(session.Object, 1, 1);
207@@ -186,7 +189,7 @@
208 version.Setup(v => v.Archive.GetScriptPath("1\\database.xml", "scripts\\schema.sql")).Returns("1\\scripts\\schema.sql");
209 version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns(
210 GetStream(ScriptWithSeparatorAtEndOfScript));
211- ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object);
212+ ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object, this.propertyService.Object);
213 Exception exception = new Exception();
214 command.Setup(c=>c.ExecuteNonQuery()).Throws(exception);
215
216@@ -207,7 +210,7 @@
217 version.Setup(v => v.ManifestPath).Returns("1\\database.xml");
218 version.Setup(v => v.Archive.GetScriptPath("1\\database.xml", "scripts\\schema.sql")).Returns("1\\scripts\\schema.sql");
219 version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns((Stream)null);
220- ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object);
221+ ScriptTask task = new ScriptTask("scripts\\schema.sql", 0, version.Object, messageService.Object, this.propertyService.Object);
222
223 // Act
224 Exception thrownException = Record.Exception(() => task.Execute(new Mock<ISession>().Object, 1, 1));
225@@ -217,6 +220,44 @@
226 Assert.Equal("The script file \"1\\scripts\\schema.sql\" does not exist in the archive.", thrownException.Message);
227 }
228
229+ [Fact]
230+ public void ShouldSetCommandTimeoutIfSpecified()
231+ {
232+ // Arrange
233+ Mock<IDatabaseVersion> version = new Mock<IDatabaseVersion>{ DefaultValue = DefaultValue.Mock };
234+ version.Setup(v => v.ManifestPath).Returns("1\\database.xml");
235+ version.Setup(v => v.Archive.GetScriptPath("1\\database.xml", "scripts\\schema.sql")).Returns("1\\scripts\\schema.sql");
236+ version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns(
237+ GetStream(ScriptWithSeparatorAtEndOfScript));
238+ var task = new ScriptTask("scripts\\test.sql", 0, version.Object, this.messageService.Object, this.propertyService.Object);
239+
240+ propertyService.Setup(p => p.GetInt(ScriptTask.CommandTimeoutPropertyName)).Returns(100);
241+
242+ // Act
243+ task.Execute(this.session.Object, 1, 1);
244+
245+ // Assert
246+ Assert.Equal(100, task.TaskTimeout);
247+ }
248+
249+ [Fact]
250+ public void ShouldNotSetCommandTimeoutIfNotSpecified()
251+ {
252+ // Arrange
253+ Mock<IDatabaseVersion> version = new Mock<IDatabaseVersion> { DefaultValue = DefaultValue.Mock };
254+ version.Setup(v => v.ManifestPath).Returns("1\\database.xml");
255+ version.Setup(v => v.Archive.GetScriptPath("1\\database.xml", "scripts\\schema.sql")).Returns("1\\scripts\\schema.sql");
256+ version.Setup(v => v.Archive.GetFile(It.IsAny<string>())).Returns(
257+ GetStream(ScriptWithSeparatorAtEndOfScript));
258+ var task = new ScriptTask("scripts\\test.sql", 0, version.Object, this.messageService.Object, this.propertyService.Object);
259+
260+ // Act
261+ task.Execute(this.session.Object, 1, 1);
262+
263+ // Assert
264+ Assert.Null(task.TaskTimeout);
265+ }
266+
267 private Stream GetStream(string contents)
268 {
269 return new MemoryStream(Encoding.Default.GetBytes(contents));
270
271=== modified file 'src/DatabaseVersion/Manifests/ManifestReader.cs'
272--- src/DatabaseVersion/Manifests/ManifestReader.cs 2011-10-10 18:43:53 +0000
273+++ src/DatabaseVersion/Manifests/ManifestReader.cs 2012-08-29 19:06:19 +0000
274@@ -58,7 +58,7 @@
275 IDatabaseTaskFactory factory = this.Factories.FirstOrDefault(f => f.CanCreate(element));
276 if (factory != null)
277 {
278- return factory.Create(element, element.ElementsBeforeSelf().Count(), version, MessageService);
279+ return factory.Create(element, element.ElementsBeforeSelf().Count(), version);
280 }
281 }
282
283
284=== modified file 'src/DatabaseVersion/Property/IPropertyService.cs'
285--- src/DatabaseVersion/Property/IPropertyService.cs 2011-09-02 23:16:14 +0000
286+++ src/DatabaseVersion/Property/IPropertyService.cs 2012-08-29 19:06:19 +0000
287@@ -51,6 +51,17 @@
288 /// The prefix to look for.
289 /// </param>
290 IEnumerable<Property> StartingWith(string prefix);
291+
292+ /// <summary>
293+ /// Gets the specified property as an int.
294+ /// </summary>
295+ /// <param name='key'>
296+ /// The property key.
297+ /// </param>
298+ /// <returns>
299+ /// The int value or null if the property is not defined, or is not an int.
300+ /// </returns>
301+ int? GetInt(string key);
302 }
303 }
304
305
306=== modified file 'src/DatabaseVersion/Property/PropertyService.cs'
307--- src/DatabaseVersion/Property/PropertyService.cs 2011-09-03 23:15:46 +0000
308+++ src/DatabaseVersion/Property/PropertyService.cs 2012-08-29 19:06:19 +0000
309@@ -53,14 +53,7 @@
310 {
311 get
312 {
313- Property propertyValue;
314-
315- if (this.properties.TryGetValue(propertyName, out propertyValue))
316- {
317- return propertyValue;
318- }
319-
320- return null;
321+ return this.Get(propertyName);
322 }
323 }
324
325@@ -88,6 +81,47 @@
326 {
327 return this.properties.Where(p => p.Key.StartsWith(prefix)).Select(p => p.Value);
328 }
329+
330+ /// <summary>
331+ /// Gets the specified property as an int.
332+ /// </summary>
333+ /// <param name='key'>
334+ /// The property key.
335+ /// </param>
336+ /// <returns>
337+ /// The int value or null if the property is not defined, or is not an int.
338+ /// </returns>
339+ public int? GetInt(string key)
340+ {
341+ Validate.NotNull(() => key);
342+
343+ int value;
344+ var property = this.Get(key);
345+
346+ if (property != null && int.TryParse(property.Value, out value))
347+ {
348+ return value;
349+ }
350+
351+ return null;
352+ }
353+
354+ /// <summary>
355+ /// Get the property with the specified name.
356+ /// </summary>
357+ /// <param name='propertyName'>
358+ /// The name of the property.
359+ /// </param>
360+ private Property Get(string propertyName)
361+ {
362+ Property propertyValue;
363+ if (this.properties.TryGetValue(propertyName, out propertyValue))
364+ {
365+ return propertyValue;
366+ }
367+
368+ return null;
369+ }
370 }
371 }
372
373
374=== modified file 'src/DatabaseVersion/Tasks/IDatabaseTaskFactory.cs'
375--- src/DatabaseVersion/Tasks/IDatabaseTaskFactory.cs 2011-10-10 18:43:53 +0000
376+++ src/DatabaseVersion/Tasks/IDatabaseTaskFactory.cs 2012-08-29 19:06:19 +0000
377@@ -19,8 +19,7 @@
378 /// <param name="element">The element containing the definition of the task.</param>
379 /// <param name="executionOrder">The zero-based execution order of the task.</param>
380 /// <param name="version">The database version that the task is contained within.</param>
381- /// <param name="messageService">The Message Service to use for logging</param>
382 /// <returns>The new task.</returns>
383- IDatabaseTask Create(XElement element, int executionOrder, IDatabaseVersion version, IMessageService messageService);
384+ IDatabaseTask Create(XElement element, int executionOrder, IDatabaseVersion version);
385 }
386 }
387
388=== modified file 'src/DatabaseVersion/Tasks/Sql/ScriptTask.cs'
389--- src/DatabaseVersion/Tasks/Sql/ScriptTask.cs 2012-01-24 22:01:24 +0000
390+++ src/DatabaseVersion/Tasks/Sql/ScriptTask.cs 2012-08-29 19:06:19 +0000
391@@ -9,6 +9,7 @@
392 using System.Diagnostics;
393 using System.Text.RegularExpressions;
394
395+ using dbversion.Property;
396 using dbversion.Version;
397
398 using NHibernate;
399@@ -27,6 +28,11 @@
400 "{0}{1}|{0}{1}{0}|{1}{0}";
401
402 /// <summary>
403+ /// The name of the command timeout property.
404+ /// </summary>
405+ public const string CommandTimeoutPropertyName = "dbversion.sql.command_timeout";
406+
407+ /// <summary>
408 /// The regex object created from the regex format.
409 /// </summary>
410 private readonly Regex StringSplitRegex;
411@@ -36,15 +42,30 @@
412 /// </summary>
413 private readonly IDatabaseVersion version;
414
415+ private readonly IPropertyService propertyService;
416+
417 protected override string GetTaskDescription()
418 {
419 return string.Format("Executing script \"{0}\"", this.GetScriptPath());
420 }
421
422- public ScriptTask(string fileName, int executionOrder, IDatabaseVersion version, IMessageService messageService)
423+ /// <summary>
424+ /// The Timeout in seconds for the task
425+ /// </summary>
426+ /// <returns>The Timeout in seconds or if none set null</returns>
427+ public int? TaskTimeout
428+ {
429+ get
430+ {
431+ return this.propertyService.GetInt(CommandTimeoutPropertyName);
432+ }
433+ }
434+
435+ public ScriptTask(string fileName, int executionOrder, IDatabaseVersion version, IMessageService messageService, IPropertyService propertyService)
436 : base(fileName, executionOrder, messageService)
437 {
438 this.version = version;
439+ this.propertyService = propertyService;
440
441 this.StringSplitRegex = GetStringSplitRegex();
442 }
443@@ -119,6 +140,7 @@
444 using (var command = session.Connection.CreateCommand())
445 {
446 session.Transaction.Enlist(command);
447+ if (TaskTimeout.HasValue) command.CommandTimeout = TaskTimeout.Value;
448 command.CommandText = batch;
449 command.ExecuteNonQuery();
450 }
451
452=== modified file 'src/DatabaseVersion/Tasks/Sql/ScriptTaskFactory.cs'
453--- src/DatabaseVersion/Tasks/Sql/ScriptTaskFactory.cs 2011-10-10 09:00:52 +0000
454+++ src/DatabaseVersion/Tasks/Sql/ScriptTaskFactory.cs 2012-08-29 19:06:19 +0000
455@@ -7,19 +7,34 @@
456 using System.Xml.Linq;
457 using System.ComponentModel.Composition;
458
459+ using dbversion.Property;
460 using dbversion.Version;
461
462 [Export(typeof(IDatabaseTaskFactory))]
463 public class ScriptTaskFactory : IDatabaseTaskFactory
464 {
465+ [Import]
466+ public IPropertyService PropertyService
467+ {
468+ get;
469+ set;
470+ }
471+
472+ [Import]
473+ public IMessageService MessageService
474+ {
475+ get;
476+ set;
477+ }
478+
479 public bool CanCreate(XElement element)
480 {
481 return element != null && element.Name == "script";
482 }
483
484- public IDatabaseTask Create(XElement element, int executionOrder, IDatabaseVersion version, IMessageService messageService)
485+ public IDatabaseTask Create(XElement element, int executionOrder, IDatabaseVersion version)
486 {
487- return new ScriptTask(element.Attribute(XName.Get("file")).Value, executionOrder, version, messageService);
488+ return new ScriptTask(element.Attribute(XName.Get("file")).Value, executionOrder, version, this.MessageService, this.PropertyService);
489 }
490 }
491 }

Subscribers

People subscribed via source and target branches

to all changes: