Skip to content

Commit 93feb26

Browse files
authored
Merge pull request #253 from DataObjects-NET/master-new-mysql-drivers
Adds support for MySQL v5.7 and v8.0
2 parents 649ec5b + 65947a7 commit 93feb26

File tree

21 files changed

+693
-64
lines changed

21 files changed

+693
-64
lines changed

Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/DriverFactory.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2011-2021 Xtensive LLC.
1+
// Copyright (C) 2011-2022 Xtensive LLC.
22
// This code is distributed under MIT license terms.
33
// See the License.txt file in the project root for more information.
44
// Created by: Malisa Ncube
@@ -122,7 +122,10 @@ private static SqlDriver CreateDriverInstance(string connectionString, Version v
122122
5 when version.Minor == 1 => new v5_1.Driver(coreServerInfo),
123123
5 when version.Minor == 5 => new v5_5.Driver(coreServerInfo),
124124
5 when version.Minor == 6 => new v5_6.Driver(coreServerInfo),
125-
_ => new v5_6.Driver(coreServerInfo)
125+
5 when version.Minor == 7 => new v5_7.Driver(coreServerInfo),
126+
6 or 7 => throw new NotSupportedException(string.Format(Strings.ExVersionXOfMySQLIsNotSupported, version)),
127+
8 => new v8_0.Driver(coreServerInfo),
128+
_ => new v8_0.Driver(coreServerInfo)
126129
};
127130
}
128131

Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/Resources/Strings.Designer.cs

Lines changed: 10 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/Resources/Strings.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,4 +135,7 @@
135135
<data name="ExUserNameRequired" xml:space="preserve">
136136
<value>MySQL Username is required.</value>
137137
</data>
138+
<data name="ExVersionXOfMySQLIsNotSupported" xml:space="preserve">
139+
<value>Version {0} of MySQL is not supported.</value>
140+
</data>
138141
</root>

Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Extractor.cs

Lines changed: 21 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2011-2020 Xtensive LLC.
1+
// Copyright (C) 2011-2022 Xtensive LLC.
22
// This code is distributed under MIT license terms.
33
// See the License.txt file in the project root for more information.
44
// Created by: Malisa Ncube
@@ -400,7 +400,7 @@ private static void ReadTableData(DbDataReader reader, Catalog catalog)
400400
var schemaName = reader.GetString(0);
401401
var schema = catalog.Schemas[schemaName];
402402
var tableName = reader.GetString(1);
403-
schema.CreateTable(tableName);
403+
_ = schema.CreateTable(tableName);
404404
}
405405

406406
// ---- ReadTableColumnData
@@ -451,8 +451,8 @@ private void ReadTableColumnData(DbDataReader reader, ref ColumnReaderState<Tabl
451451
}
452452

453453
// AutoIncrement
454-
if (ReadAutoIncrement(reader, 13)) {
455-
column.SequenceDescriptor = new SequenceDescriptor(column, ReadInt(reader, 14), 1);
454+
if (ReadIfAutoIncrement(reader, 13)) {
455+
column.SequenceDescriptor = new SequenceDescriptor(column, ReadAutoIncrementValue(reader, 14), 1);
456456
}
457457

458458
//Column number.
@@ -468,12 +468,9 @@ private static void ReadViewData(DbDataReader reader, Catalog catalog)
468468
var schema = catalog.Schemas[reader.GetString(0)];
469469
var view = reader.GetString(1);
470470
var definition = ReadStringOrNull(reader, 2);
471-
if (string.IsNullOrEmpty(definition)) {
472-
schema.CreateView(view);
473-
}
474-
else {
475-
schema.CreateView(view, SqlDml.Native(definition));
476-
}
471+
_ = string.IsNullOrEmpty(definition)
472+
? schema.CreateView(view)
473+
: schema.CreateView(view, SqlDml.Native(definition));
477474
}
478475

479476
//---- ReadViewColumnData
@@ -490,7 +487,7 @@ private static void ReadViewColumnData(DbDataReader reader, ref ColumnReaderStat
490487
state.Owner = schema.Views[reader.GetString(1)];
491488
}
492489

493-
state.Owner.CreateColumn(reader.GetString(2));
490+
_ = state.Owner.CreateColumn(reader.GetString(2));
494491
state.LastColumnIndex = columnIndex;
495492
}
496493

@@ -512,7 +509,7 @@ private static void ReadIndexColumnData(DbDataReader reader, ref IndexColumnRead
512509
var schema = state.Catalog.Schemas[reader.GetString(0)];
513510
state.Table = schema.Tables[reader.GetString(1)];
514511
if (IsFullTextIndex(reader, 4)) {
515-
state.Table.CreateFullTextIndex(reader.GetString(2));
512+
_ = state.Table.CreateFullTextIndex(reader.GetString(2));
516513
}
517514
else {
518515
state.Index = state.Table.CreateIndex(reader.GetString(2));
@@ -521,7 +518,7 @@ private static void ReadIndexColumnData(DbDataReader reader, ref IndexColumnRead
521518
}
522519

523520
var column = state.Table.TableColumns[reader.GetString(6)];
524-
state.Index.CreateIndexColumn(column);
521+
_ = state.Index.CreateIndexColumn(column);
525522

526523
state.LastColumnIndex = columnIndex;
527524
}
@@ -710,47 +707,21 @@ private static void CreateIndexBasedConstraint(ref IndexBasedConstraintReaderSta
710707
private static bool ReadBool(IDataRecord row, int index)
711708
{
712709
var value = row.GetString(index);
713-
switch (value) {
714-
case "Y":
715-
case "YES":
716-
case "ENABLED":
717-
case "UNIQUE":
718-
return true;
719-
case "N":
720-
case "NO":
721-
case "DISABLED":
722-
case "NONUNIQUE":
723-
return false;
724-
default:
725-
throw new ArgumentOutOfRangeException(string.Format(Strings.ExInvalidBooleanStringX, value));
726-
}
710+
return value switch {
711+
"Y" or "YES" or "ENABLED" or "UNIQUE" => true,
712+
"N" or "NO" or "DISABLED" or "NONUNIQUE" => false,
713+
_ => throw new ArgumentOutOfRangeException(string.Format(Strings.ExInvalidBooleanStringX, value)),
714+
};
727715
}
728716

729-
private static bool IsFullTextIndex(IDataRecord row, int index)
730-
{
731-
var value = ReadStringOrNull(row, index);
732-
if (!string.IsNullOrEmpty(value)) {
733-
value = value.ToUpperInvariant();
734-
return value == "FULLTEXT";
735-
}
736-
return false;
737-
}
717+
private static bool IsFullTextIndex(IDataRecord row, int index) =>
718+
ReadStringOrNull(row, index).Equals("FULLTEXT", StringComparison.OrdinalIgnoreCase);
738719

739-
private static bool ReadAutoIncrement(IDataRecord row, int index)
740-
{
741-
var value = ReadStringOrNull(row, index);
742-
if (!string.IsNullOrEmpty(value)) {
743-
value = value.ToUpperInvariant();
744-
return value == "AUTO_INCREMENT";
745-
}
746-
return false;
747-
}
720+
private static bool ReadIfAutoIncrement(IDataRecord row, int index) =>
721+
ReadStringOrNull(row, index).Equals("AUTO_INCREMENT", StringComparison.OrdinalIgnoreCase);
748722

749-
private static long ReadLong(IDataRecord row, int index)
750-
{
751-
var value = row.GetDecimal(index);
752-
return value > long.MaxValue ? long.MaxValue : (long) value;
753-
}
723+
private static int ReadAutoIncrementValue(IDataRecord row, int index) =>
724+
row.IsDBNull(index) ? 1 : ReadInt(row, index);
754725

755726
private static int ReadInt(IDataRecord row, int index)
756727
{
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// Copyright (C) 2022 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
4+
// Created by: Alexey Kulakov
5+
// Created: 2022.02.03
6+
7+
using Xtensive.Sql.Compiler;
8+
using Xtensive.Sql.Dml;
9+
10+
namespace Xtensive.Sql.Drivers.MySql.v5_7
11+
{
12+
internal class Compiler : v5_6.Compiler
13+
{
14+
/// <inheritdoc/>
15+
public override void Visit(SqlQueryExpression node)
16+
{
17+
using (context.EnterScope(node)) {
18+
var wrapLeft = node.Left is SqlSelect sL
19+
&& (sL.OrderBy.Count > 0 || sL.HasLimit || sL.Lock != SqlLockType.Empty);
20+
var wrapRight = node.Left is SqlSelect sR
21+
&& (sR.OrderBy.Count > 0 || sR.HasLimit || sR.Lock != SqlLockType.Empty);
22+
23+
AppendTranslatedEntry(node);
24+
if (wrapLeft) {
25+
_ = context.Output.Append("(");
26+
node.Left.AcceptVisitor(this);
27+
_ = context.Output.Append(")");
28+
}
29+
else {
30+
node.Left.AcceptVisitor(this);
31+
}
32+
33+
AppendTranslated(node.NodeType);
34+
AppendTranslated(node, QueryExpressionSection.All);
35+
36+
if (wrapRight) {
37+
_ = context.Output.Append("(");
38+
node.Right.AcceptVisitor(this);
39+
_ = context.Output.Append(")");
40+
}
41+
else {
42+
node.Right.AcceptVisitor(this);
43+
}
44+
AppendTranslatedExit(node);
45+
}
46+
}
47+
48+
// Constructors
49+
50+
public Compiler(SqlDriver driver)
51+
: base(driver)
52+
{
53+
}
54+
}
55+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright (C) 2022 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
4+
// Created by: Alexey Kulakov
5+
// Created: 2022.02.03
6+
7+
using Xtensive.Sql.Compiler;
8+
using Xtensive.Sql.Info;
9+
10+
namespace Xtensive.Sql.Drivers.MySql.v5_7
11+
{
12+
internal class Driver : MySql.Driver
13+
{
14+
protected override Sql.TypeMapper CreateTypeMapper()
15+
{
16+
return new TypeMapper(this);
17+
}
18+
19+
protected override SqlCompiler CreateCompiler()
20+
{
21+
return new Compiler(this);
22+
}
23+
24+
protected override SqlTranslator CreateTranslator()
25+
{
26+
return new Translator(this);
27+
}
28+
29+
protected override Model.Extractor CreateExtractor()
30+
{
31+
return new Extractor(this);
32+
}
33+
34+
protected override Info.ServerInfoProvider CreateServerInfoProvider()
35+
{
36+
return new ServerInfoProvider(this);
37+
}
38+
39+
// Constructors
40+
41+
public Driver(CoreServerInfo coreServerInfo)
42+
: base(coreServerInfo)
43+
{
44+
}
45+
}
46+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright (C) 2022 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
4+
// Created by: Alexey Kulakov
5+
// Created: 2022.02.03
6+
7+
namespace Xtensive.Sql.Drivers.MySql.v5_7
8+
{
9+
internal class Extractor : v5_6.Extractor
10+
{
11+
// Constructors
12+
13+
public Extractor(SqlDriver driver)
14+
: base(driver)
15+
{
16+
}
17+
}
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright (C) 2022 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
4+
// Created by: Alexey Kulakov
5+
// Created: 2022.02.03
6+
7+
namespace Xtensive.Sql.Drivers.MySql.v5_7
8+
{
9+
internal class ServerInfoProvider : v5_6.ServerInfoProvider
10+
{
11+
// Constructors
12+
13+
public ServerInfoProvider(SqlDriver driver)
14+
: base(driver)
15+
{
16+
}
17+
}
18+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Copyright (C) 2022 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
4+
// Created by: Alexey Kulakov
5+
// Created: 2022.02.03
6+
7+
using System;
8+
using Xtensive.Sql.Compiler;
9+
using Xtensive.Sql.Dml;
10+
11+
namespace Xtensive.Sql.Drivers.MySql.v5_7
12+
{
13+
internal class Translator : v5_6.Translator
14+
{
15+
/// <inheritdoc/>
16+
public override void Translate(SqlCompilerContext context, SqlCast node, NodeSection section)
17+
{
18+
if (node.Type.Type == SqlType.DateTime) {
19+
var output = context.Output;
20+
_ = section switch {
21+
NodeSection.Entry => output.AppendOpeningPunctuation("CAST("),
22+
NodeSection.Exit => output.Append("AS ")
23+
.Append(Translate(node.Type))
24+
.AppendClosingPunctuation("(6))"),
25+
_ => throw new ArgumentOutOfRangeException(nameof(section)),
26+
};
27+
}
28+
base.Translate(context, node, section);
29+
}
30+
31+
// Constructors
32+
33+
public Translator(SqlDriver driver)
34+
: base(driver)
35+
{
36+
}
37+
}
38+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright (C) 2022 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
4+
// Created by: Alexey Kulakov
5+
// Created: 2022.02.03
6+
7+
namespace Xtensive.Sql.Drivers.MySql.v5_7
8+
{
9+
internal class TypeMapper : v5_6.TypeMapper
10+
{
11+
// Constructors
12+
13+
public TypeMapper(SqlDriver driver)
14+
: base(driver)
15+
{
16+
}
17+
}
18+
}

0 commit comments

Comments
 (0)