Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 90e65b9

Browse files
committed
Merge pull request #169 from brainless83/master
Fixed Byte[] issue
2 parents bce850d + 584765e commit 90e65b9

File tree

13 files changed

+544
-367
lines changed

13 files changed

+544
-367
lines changed

src/ServiceStack.OrmLite.MySql.Tests/ServiceStack.OrmLite.MySql.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@
101101
<Compile Include="Properties\AssemblyInfo.cs" />
102102
<Compile Include="ShippersExample.cs" />
103103
<Compile Include="SqlMapperTests.cs" />
104+
<Compile Include="TypeWithByteArrayFieldTests.cs" />
104105
<Compile Include="UseCase\CustomerOrdersUseCase.cs" />
105106
<Compile Include="UseCase\SimpleUseCase.cs" />
106107
<Compile Include="OrmLiteGetScalarTests.cs" />
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using NUnit.Framework;
2+
3+
namespace ServiceStack.OrmLite.MySql.Tests
4+
{
5+
public class TypeWithByteArrayFieldTests : OrmLiteTestBase
6+
{
7+
[Test]
8+
public void CanInsertAndSelectByteArray()
9+
{
10+
var orig = new TypeWithByteArrayField { Id = 1, Content = new byte[] { 0, 17, 0, 17, 0, 7 } };
11+
12+
using (var db = ConnectionString.OpenDbConnection())
13+
{
14+
db.CreateTable<TypeWithByteArrayField>(true);
15+
16+
db.Save(orig);
17+
18+
var target = db.GetById<TypeWithByteArrayField>(orig.Id);
19+
20+
Assert.AreEqual(orig.Id, target.Id);
21+
Assert.AreEqual(orig.Content, target.Content);
22+
}
23+
}
24+
}
25+
26+
class TypeWithByteArrayField
27+
{
28+
public int Id { get; set; }
29+
public byte[] Content { get; set; }
30+
}
31+
}
Lines changed: 109 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,35 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.Data;
3+
using System.Data;
44
using System.Text;
5-
using MySql.Data.MySqlClient;
6-
using ServiceStack.Common.Extensions;
7-
using ServiceStack.OrmLite.MySql.DataAnnotations;
8-
5+
using MySql.Data.MySqlClient;
6+
using ServiceStack.Common.Extensions;
7+
using ServiceStack.OrmLite.MySql.DataAnnotations;
8+
99
namespace ServiceStack.OrmLite.MySql
10-
{
10+
{
1111
public class MySqlDialectProvider : OrmLiteDialectProviderBase<MySqlDialectProvider>
1212
{
13-
public static MySqlDialectProvider Instance = new MySqlDialectProvider();
14-
15-
private const string TextColumnDefinition = "TEXT";
16-
13+
public static MySqlDialectProvider Instance = new MySqlDialectProvider();
14+
15+
private const string TextColumnDefinition = "TEXT";
16+
1717
private MySqlDialectProvider()
1818
{
1919
base.AutoIncrementDefinition = "AUTO_INCREMENT";
2020
base.IntColumnDefinition = "int(11)";
2121
base.BoolColumnDefinition = "tinyint(1)";
2222
base.TimeColumnDefinition = "time";
2323
base.DecimalColumnDefinition = "decimal(38,6)";
24-
base.GuidColumnDefinition = "char(32)";
24+
base.GuidColumnDefinition = "char(32)";
2525
base.DefaultStringLength = 255;
26-
base.InitColumnTypeMap();
27-
base.DefaultValueFormat = " DEFAULT '{0}'";
26+
base.InitColumnTypeMap();
27+
base.DefaultValueFormat = " DEFAULT '{0}'";
2828
}
29-
30-
public override string GetQuotedParam(string paramValue)
31-
{
32-
return "'" + paramValue.Replace("\\", "\\\\").Replace("'", @"\'") + "'";
29+
30+
public override string GetQuotedParam(string paramValue)
31+
{
32+
return "'" + paramValue.Replace("\\", "\\\\").Replace("'", @"\'") + "'";
3333
}
3434

3535
public override IDbConnection CreateConnection(string connectionString, Dictionary<string, string> options)
@@ -43,12 +43,12 @@ public override string GetQuotedValue(object value, Type fieldType)
4343

4444
if (fieldType == typeof(DateTime))
4545
{
46-
var dateValue = (DateTime)value;
46+
var dateValue = (DateTime)value;
4747
/*
4848
* ms not contained in format. MySql ignores ms part anyway
4949
*
5050
* for more details see: http://dev.mysql.com/doc/refman/5.1/en/datetime.html
51-
*/
51+
*/
5252
const string dateTimeFormat = "yyyy-MM-dd HH:mm:ss";
5353

5454
return base.GetQuotedValue(dateValue.ToString(dateTimeFormat), typeof(string));
@@ -59,41 +59,49 @@ public override string GetQuotedValue(object value, Type fieldType)
5959
return base.GetQuotedValue(guidValue.ToString("N"), typeof(string));
6060
}
6161

62+
if (fieldType == typeof(byte[]))
63+
{
64+
return "0x" + BitConverter.ToString((byte[])value).Replace("-", "");
65+
}
66+
6267
return base.GetQuotedValue(value, fieldType);
6368
}
6469

6570
public override object ConvertDbValue(object value, Type type)
6671
{
6772
if (value == null || value is DBNull) return null;
6873

69-
if (type == typeof(bool))
70-
{
71-
return
72-
value is bool
73-
? value
74+
if (type == typeof(bool))
75+
{
76+
return
77+
value is bool
78+
? value
7479
: (int.Parse(value.ToString()) != 0); //backward compatibility (prev version mapped bool as bit(1))
7580
}
7681

82+
if (type == typeof(byte[]))
83+
return value;
84+
7785
return base.ConvertDbValue(value, type);
7886
}
7987

8088
public override string GetQuotedTableName(ModelDefinition modelDef)
8189
{
8290
return string.Format("`{0}`", NamingStrategy.GetTableName(modelDef.ModelName));
83-
}
91+
}
8492

8593
public override string GetQuotedTableName(string tableName)
8694
{
8795
return string.Format("`{0}`", NamingStrategy.GetTableName(tableName));
8896
}
89-
90-
public override string GetQuotedColumnName(string columnName)
91-
{
92-
return string.Format("`{0}`", NamingStrategy.GetColumnName(columnName));
97+
98+
public override string GetQuotedColumnName(string columnName)
99+
{
100+
return string.Format("`{0}`", NamingStrategy.GetColumnName(columnName));
93101
}
94102

95103
public override string GetQuotedName(string name)
96-
{
104+
{
97105
return string.Format("`{0}`", name);
98106
}
99107

@@ -108,78 +116,78 @@ public override long GetLastInsertId(IDbCommand command)
108116
public override SqlExpressionVisitor<T> ExpressionVisitor<T> ()
109117
{
110118
return new MySqlExpressionVisitor<T>();
111-
}
112-
113-
public override bool DoesTableExist(IDbCommand dbCmd, string tableName)
114-
{
115-
//Same as SQL Server apparently?
119+
}
120+
121+
public override bool DoesTableExist(IDbCommand dbCmd, string tableName)
122+
{
123+
//Same as SQL Server apparently?
116124
var sql = ("SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES " +
117125
"WHERE TABLE_NAME = {0} AND " +
118-
"TABLE_SCHEMA = {1}")
119-
.SqlFormat(tableName, dbCmd.Connection.Database);
120-
121-
//if (!string.IsNullOrEmpty(schemaName))
122-
// sql += " AND TABLE_SCHEMA = {0}".SqlFormat(schemaName);
123-
124-
dbCmd.CommandText = sql;
125-
var result = dbCmd.GetLongScalar();
126-
127-
return result > 0;
128-
}
129-
130-
public override string ToCreateTableStatement(Type tableType)
131-
{
132-
var sbColumns = new StringBuilder();
133-
var sbConstraints = new StringBuilder();
134-
135-
var modelDef = GetModel(tableType);
136-
foreach (var fieldDef in modelDef.FieldDefinitions)
137-
{
138-
if (sbColumns.Length != 0) sbColumns.Append(", \n ");
139-
140-
sbColumns.Append(GetColumnDefinition(fieldDef));
141-
142-
if (fieldDef.ForeignKey == null) continue;
143-
144-
var refModelDef = GetModel(fieldDef.ForeignKey.ReferenceType);
145-
sbConstraints.AppendFormat(
146-
", \n\n CONSTRAINT {0} FOREIGN KEY ({1}) REFERENCES {2} ({3})",
147-
GetQuotedName(fieldDef.ForeignKey.GetForeignKeyName(modelDef, refModelDef, NamingStrategy, fieldDef)),
148-
GetQuotedColumnName(fieldDef.FieldName),
149-
GetQuotedTableName(refModelDef),
150-
GetQuotedColumnName(refModelDef.PrimaryKey.FieldName));
151-
152-
if (!string.IsNullOrEmpty(fieldDef.ForeignKey.OnDelete))
153-
sbConstraints.AppendFormat(" ON DELETE {0}", fieldDef.ForeignKey.OnDelete);
154-
155-
if (!string.IsNullOrEmpty(fieldDef.ForeignKey.OnUpdate))
156-
sbConstraints.AppendFormat(" ON UPDATE {0}", fieldDef.ForeignKey.OnUpdate);
157-
}
158-
var sql = new StringBuilder(string.Format(
159-
"CREATE TABLE {0} \n(\n {1}{2} \n); \n", GetQuotedTableName(modelDef), sbColumns, sbConstraints));
160-
161-
return sql.ToString();
162-
}
163-
164-
public string GetColumnDefinition(FieldDefinition fieldDefinition)
165-
{
166-
if (fieldDefinition.PropertyInfo.FirstAttribute<TextAttribute>() != null)
167-
{
168-
var sql = new StringBuilder();
169-
sql.AppendFormat("{0} {1}", GetQuotedColumnName(fieldDefinition.FieldName), TextColumnDefinition);
170-
sql.Append(fieldDefinition.IsNullable ? " NULL" : " NOT NULL");
171-
return sql.ToString();
172-
}
173-
174-
return base.GetColumnDefinition(
175-
fieldDefinition.FieldName,
176-
fieldDefinition.FieldType,
177-
fieldDefinition.IsPrimaryKey,
178-
fieldDefinition.AutoIncrement,
179-
fieldDefinition.IsNullable,
180-
fieldDefinition.FieldLength,
181-
null,
182-
fieldDefinition.DefaultValue);
183-
}
126+
"TABLE_SCHEMA = {1}")
127+
.SqlFormat(tableName, dbCmd.Connection.Database);
128+
129+
//if (!string.IsNullOrEmpty(schemaName))
130+
// sql += " AND TABLE_SCHEMA = {0}".SqlFormat(schemaName);
131+
132+
dbCmd.CommandText = sql;
133+
var result = dbCmd.GetLongScalar();
134+
135+
return result > 0;
136+
}
137+
138+
public override string ToCreateTableStatement(Type tableType)
139+
{
140+
var sbColumns = new StringBuilder();
141+
var sbConstraints = new StringBuilder();
142+
143+
var modelDef = GetModel(tableType);
144+
foreach (var fieldDef in modelDef.FieldDefinitions)
145+
{
146+
if (sbColumns.Length != 0) sbColumns.Append(", \n ");
147+
148+
sbColumns.Append(GetColumnDefinition(fieldDef));
149+
150+
if (fieldDef.ForeignKey == null) continue;
151+
152+
var refModelDef = GetModel(fieldDef.ForeignKey.ReferenceType);
153+
sbConstraints.AppendFormat(
154+
", \n\n CONSTRAINT {0} FOREIGN KEY ({1}) REFERENCES {2} ({3})",
155+
GetQuotedName(fieldDef.ForeignKey.GetForeignKeyName(modelDef, refModelDef, NamingStrategy, fieldDef)),
156+
GetQuotedColumnName(fieldDef.FieldName),
157+
GetQuotedTableName(refModelDef),
158+
GetQuotedColumnName(refModelDef.PrimaryKey.FieldName));
159+
160+
if (!string.IsNullOrEmpty(fieldDef.ForeignKey.OnDelete))
161+
sbConstraints.AppendFormat(" ON DELETE {0}", fieldDef.ForeignKey.OnDelete);
162+
163+
if (!string.IsNullOrEmpty(fieldDef.ForeignKey.OnUpdate))
164+
sbConstraints.AppendFormat(" ON UPDATE {0}", fieldDef.ForeignKey.OnUpdate);
165+
}
166+
var sql = new StringBuilder(string.Format(
167+
"CREATE TABLE {0} \n(\n {1}{2} \n); \n", GetQuotedTableName(modelDef), sbColumns, sbConstraints));
168+
169+
return sql.ToString();
170+
}
171+
172+
public string GetColumnDefinition(FieldDefinition fieldDefinition)
173+
{
174+
if (fieldDefinition.PropertyInfo.FirstAttribute<TextAttribute>() != null)
175+
{
176+
var sql = new StringBuilder();
177+
sql.AppendFormat("{0} {1}", GetQuotedColumnName(fieldDefinition.FieldName), TextColumnDefinition);
178+
sql.Append(fieldDefinition.IsNullable ? " NULL" : " NOT NULL");
179+
return sql.ToString();
180+
}
181+
182+
return base.GetColumnDefinition(
183+
fieldDefinition.FieldName,
184+
fieldDefinition.FieldType,
185+
fieldDefinition.IsPrimaryKey,
186+
fieldDefinition.AutoIncrement,
187+
fieldDefinition.IsNullable,
188+
fieldDefinition.FieldLength,
189+
null,
190+
fieldDefinition.DefaultValue);
191+
}
184192
}
185193
}

src/ServiceStack.OrmLite.PostgreSQL.Tests/ServiceStack.OrmLite.PostgreSQL.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
<Compile Include="OrmLiteTestBase.cs" />
9191
<Compile Include="Properties\AssemblyInfo.cs" />
9292
<Compile Include="OrmLiteGetScalarTests.cs" />
93+
<Compile Include="TypeWithByteArrayFieldTests.cs" />
9394
</ItemGroup>
9495
<ItemGroup>
9596
<None Include="app.config">
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using NUnit.Framework;
2+
using ServiceStack.OrmLite.Tests;
3+
4+
namespace ServiceStack.OrmLite.PostgreSQL.Tests
5+
{
6+
public class TypeWithByteArrayFieldTests : OrmLiteTestBase
7+
{
8+
[Test]
9+
public void CanInsertAndSelectByteArray()
10+
{
11+
var orig = new TypeWithByteArrayField { Id = 1, Content = new byte[] { 0, 17, 0, 17, 0, 7 } };
12+
13+
using (var db = ConnectionString.OpenDbConnection())
14+
{
15+
db.CreateTable<TypeWithByteArrayField>(true);
16+
17+
db.Save(orig);
18+
19+
var target = db.GetById<TypeWithByteArrayField>(orig.Id);
20+
21+
Assert.AreEqual(orig.Id, target.Id);
22+
Assert.AreEqual(orig.Content, target.Content);
23+
}
24+
}
25+
}
26+
27+
class TypeWithByteArrayField
28+
{
29+
public int Id { get; set; }
30+
public byte[] Content { get; set; }
31+
}
32+
}

0 commit comments

Comments
 (0)