Skip to content

Commit 24f037b

Browse files
committed
Attempt to parse the MariaDB version if it can be found.
1 parent a42c809 commit 24f037b

File tree

2 files changed

+41
-8
lines changed

2 files changed

+41
-8
lines changed

src/MySqlConnector/Core/ServerVersion.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,33 @@ public ServerVersion(ReadOnlySpan<byte> versionString)
1919
versionString = versionString.Slice(bytesConsumed + 1);
2020
if (!Utf8Parser.TryParse(versionString, out int build, out bytesConsumed))
2121
throw new InvalidOperationException("Error parsing " + OriginalString);
22+
versionString = versionString.Slice(bytesConsumed);
2223

2324
Version = new Version(major, minor, build);
25+
26+
// check for MariaDB version appended to a fake MySQL version
27+
if (versionString.Length != 0 && versionString[0] == 0x2D && versionString.IndexOf(MariaDb) != -1)
28+
{
29+
versionString = versionString.Slice(1);
30+
if (Utf8Parser.TryParse(versionString, out major, out bytesConsumed) && versionString[bytesConsumed] == 0x2E)
31+
{
32+
versionString = versionString.Slice(bytesConsumed + 1);
33+
if (Utf8Parser.TryParse(versionString, out minor, out bytesConsumed) && versionString[bytesConsumed] == 0x2E)
34+
{
35+
versionString = versionString.Slice(bytesConsumed + 1);
36+
if (Utf8Parser.TryParse(versionString, out build, out bytesConsumed) && versionString[bytesConsumed] == 0x2D)
37+
{
38+
MariaDbVersion = new Version(major, minor, build);
39+
}
40+
}
41+
}
42+
}
2443
}
2544

2645
public string OriginalString { get; }
2746
public Version Version { get; }
47+
public Version MariaDbVersion { get; }
48+
49+
static ReadOnlySpan<byte> MariaDb => new byte[] { 0x2D, 0x4D, 0x61, 0x72, 0x69, 0x61, 0x44, 0x42, 0x2D }; // -MariaDB-
2850
}
2951
}

tests/MySqlConnector.Tests/ServerVersionTests.cs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,27 @@ namespace MySqlConnector.Tests
88
public class ServerVersionTests
99
{
1010
[Theory]
11-
[InlineData("5.5.5-10.1.38-MariaDB-1~bionic", "5.5.5")]
12-
[InlineData("5.5.5-10.2.19-MariaDB-1:10.2.19+maria~bionic", "5.5.5")]
13-
[InlineData("5.5.5-10.3.13-MariaDB-1:10.3.13+maria~bionic", "5.5.5")]
14-
[InlineData("5.7.21-log", "5.7.21")]
15-
[InlineData("8.0.13", "8.0.13")]
16-
[InlineData("5.7.25-28", "5.7.25")]
17-
public void ParseServerVersion(string serverVersion, string expectedString)
11+
[InlineData("5.5.5-10.1.38-MariaDB-1~bionic", "5.5.5", "10.1.38")]
12+
[InlineData("5.5.5-10.2.19-MariaDB-1:10.2.19+maria~bionic", "5.5.5", "10.2.19")]
13+
[InlineData("5.5.5-10.3.13-MariaDB-1:10.3.13+maria~bionic", "5.5.5", "10.3.13")]
14+
[InlineData("5.7.21-log", "5.7.21", null)]
15+
[InlineData("8.0.13", "8.0.13", null)]
16+
[InlineData("5.7.25-28", "5.7.25", null)]
17+
public void ParseServerVersion(string input, string expectedString, string expectedMariaDbString)
1818
{
19+
var serverVersion = new ServerVersion(Encoding.UTF8.GetBytes(input));
1920
var expected = Version.Parse(expectedString);
20-
Assert.Equal(expected, new ServerVersion(Encoding.UTF8.GetBytes(serverVersion)).Version);
21+
Assert.Equal(expected, serverVersion.Version);
22+
23+
if (expectedMariaDbString == null)
24+
{
25+
Assert.Equal(default(Version), serverVersion.MariaDbVersion);
26+
}
27+
else
28+
{
29+
var expectedMariaDb = Version.Parse(expectedMariaDbString);
30+
Assert.Equal(expectedMariaDb, serverVersion.MariaDbVersion);
31+
}
2132
}
2233
}
2334
}

0 commit comments

Comments
 (0)