Skip to content

Commit 6e7f2a9

Browse files
committed
Small enhancement for the ConnectionStringParser to make it more robust.
Additionally made GetDataSource private because its only used inside of the class and #23 added tests for ConnectionStringParser.ExpandDataDirectory.
1 parent 47a8277 commit 6e7f2a9

File tree

3 files changed

+122
-10
lines changed

3 files changed

+122
-10
lines changed

SQLite.CodeFirst.Test/SQLite.CodeFirst.Test.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@
9292
<Compile Include="Statement\CreateTableStatementTest.cs" />
9393
<Compile Include="Statement\CreateIndexStatementCollectionTest.cs" />
9494
<Compile Include="Statement\ColumnStatementTest.cs" />
95+
<Compile Include="Utility\ConnectionStringParserTest.cs" />
9596
<Compile Include="Utility\HashCreatorTest.cs" />
9697
<Compile Include="Utility\HistoryEntityTypeValidator.cs" />
9798
</ItemGroup>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
using Microsoft.VisualStudio.TestTools.UnitTesting;
2+
using SQLite.CodeFirst.Utility;
3+
4+
namespace SQLite.CodeFirst.Test.Utility
5+
{
6+
[TestClass]
7+
public class ConnectionStringParserTest
8+
{
9+
[TestMethod]
10+
public void GetDataSource_ReturnsCorrectDataSource()
11+
{
12+
// Arrange
13+
string connectionString = @"data source=.\db\footballDb\footballDb.sqlite;foreign keys=true";
14+
15+
16+
// Act
17+
string result = ConnectionStringParser.GetDataSource(connectionString);
18+
19+
// Assert
20+
Assert.AreEqual(@".\db\footballDb\footballDb.sqlite", result);
21+
}
22+
23+
[TestMethod]
24+
public void GetDataSource_ReturnsCorrectDataSource_NotLowerCase()
25+
{
26+
// Arrange
27+
string connectionString = @"DatA SOurce=.\db\footballDb\footballDb.sqlite;foreign keys=true";
28+
29+
30+
// Act
31+
string result = ConnectionStringParser.GetDataSource(connectionString);
32+
33+
// Assert
34+
Assert.AreEqual(@".\db\footballDb\footballDb.sqlite", result);
35+
}
36+
37+
[TestMethod]
38+
public void GetDataSource_ReturnsCorrectDataSource_WithSpace()
39+
{
40+
// Arrange
41+
string connectionString = @"DatA SOurce =.\db\footballDb\footballDb.sqlite;foreign keys=true";
42+
43+
44+
// Act
45+
string result = ConnectionStringParser.GetDataSource(connectionString);
46+
47+
// Assert
48+
Assert.AreEqual(@".\db\footballDb\footballDb.sqlite", result);
49+
}
50+
51+
[TestMethod]
52+
public void GetDataSource_ReturnsCorrectDataSource_ReplacesDataDirectory()
53+
{
54+
// Arrange
55+
string connectionString = @"data source=|DataDirectory|\db\footballDb\footballDb.sqlite;foreign keys=true";
56+
57+
58+
// Act
59+
string result = ConnectionStringParser.GetDataSource(connectionString);
60+
61+
// Assert
62+
Assert.IsTrue(!result.StartsWith("|DataDirectory|"));
63+
Assert.IsTrue(result.EndsWith(@"db\footballDb\footballDb.sqlite"));
64+
}
65+
66+
[TestMethod]
67+
public void GetDataSource_ReturnsCorrectDataSource_ReplacesDataDirectoryCaseIsIgnored()
68+
{
69+
// Arrange
70+
string connectionString = @"data source=|dAtadIrectory|\db\footballDb\footballDb.sqlite;foreign keys=true";
71+
72+
73+
// Act
74+
string result = ConnectionStringParser.GetDataSource(connectionString);
75+
76+
// Assert
77+
Assert.IsTrue(!result.StartsWith("|dAtadIrectory|"));
78+
Assert.IsTrue(result.EndsWith(@"\db\footballDb\footballDb.sqlite"));
79+
}
80+
81+
[TestMethod]
82+
public void GetDataSource_ReturnsCorrectDataSource_ReplacesDataDirectoryAddsBackslash()
83+
{
84+
// Arrange
85+
string connectionString = @"data source=|DataDirectory|db\footballDb\footballDb.sqlite;foreign keys=true";
86+
87+
88+
// Act
89+
string result = ConnectionStringParser.GetDataSource(connectionString);
90+
91+
// Assert
92+
Assert.IsTrue(!result.StartsWith("|DataDirectory|"));
93+
Assert.IsTrue(result.EndsWith(@"\db\footballDb\footballDb.sqlite"));
94+
}
95+
96+
[TestMethod]
97+
public void GetDataSource_ReturnsCorrectDataSource_RemovesQuotationMark()
98+
{
99+
// Arrange
100+
string connectionString = @"data source="".\db\footballDb\footballDb.sqlite"";foreign keys=true";
101+
102+
103+
// Act
104+
string result = ConnectionStringParser.GetDataSource(connectionString);
105+
106+
// Assert
107+
Assert.AreEqual(@".\db\footballDb\footballDb.sqlite", result);
108+
}
109+
}
110+
}

SQLite.CodeFirst/Internal/Utility/ConnectionStringParser.cs

+11-10
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,22 @@ namespace SQLite.CodeFirst.Utility
88
internal static class ConnectionStringParser
99
{
1010
private const string DataDirectoryToken = "|datadirectory|";
11+
private const string DataSourceToken = "data source";
1112
private const char KeyValuePairSeperator = ';';
1213
private const char KeyValueSeperator = '=';
1314
private const int KeyPosition = 0;
1415
private const int ValuePosition = 1;
1516

17+
public static string GetDataSource(string connectionString)
18+
{
19+
var path = ExpandDataDirectory(ParseConnectionString(connectionString)[DataSourceToken]);
20+
// remove quotation mark if exists
21+
path = path.Trim('"');
22+
return path;
23+
}
24+
1625
[SuppressMessage("Microsoft.Globalization", "CA1308:NormalizeStringsToUppercase", Justification = "ToUppercase makes no sense.")]
17-
public static IDictionary<string, string> ParseConnectionString(string connectionString)
26+
private static IDictionary<string, string> ParseConnectionString(string connectionString)
1827
{
1928
connectionString = connectionString.Trim();
2029
string[] keyValuePairs = connectionString.Split(KeyValuePairSeperator);
@@ -25,21 +34,13 @@ public static IDictionary<string, string> ParseConnectionString(string connectio
2534
string[] keyValue = keyValuePair.Split(KeyValueSeperator);
2635
if (keyValue.Length >= 2)
2736
{
28-
keyValuePairDictionary.Add(keyValue[KeyPosition].ToLower(CultureInfo.InvariantCulture), keyValue[ValuePosition]);
37+
keyValuePairDictionary.Add(keyValue[KeyPosition].Trim().ToLower(CultureInfo.InvariantCulture), keyValue[ValuePosition]);
2938
}
3039
}
3140

3241
return keyValuePairDictionary;
3342
}
3443

35-
public static string GetDataSource(string connectionString)
36-
{
37-
var path = ExpandDataDirectory(ParseConnectionString(connectionString)["data source"]);
38-
// remove quotation mark if exists
39-
path = path.Trim('"');
40-
return path;
41-
}
42-
4344
private static string ExpandDataDirectory(string path)
4445
{
4546
if (path == null || !path.StartsWith(DataDirectoryToken, StringComparison.OrdinalIgnoreCase))

0 commit comments

Comments
 (0)