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

Commit 94ff51b

Browse files
committed
Change to Dispose datareader in a future callback in async API's
1 parent 85558d4 commit 94ff51b

File tree

2 files changed

+70
-42
lines changed

2 files changed

+70
-42
lines changed

src/ServiceStack.OrmLite/Async/OrmLiteUtilExtensionsAsync.cs

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -21,70 +21,70 @@ public static T CreateInstance<T>()
2121
public static Task<T> ConvertToAsync<T>(this IDataReader dataReader, IOrmLiteDialectProvider dialectProvider, CancellationToken token)
2222
{
2323
var fieldDefs = ModelDefinition<T>.Definition.AllFieldDefinitionsArray;
24-
using (dataReader)
24+
return dialectProvider.ReaderRead(dataReader, () =>
2525
{
26-
return dialectProvider.ReaderRead(dataReader, () =>
27-
{
28-
var row = CreateInstance<T>();
29-
var indexCache = dataReader.GetIndexFieldsCache(ModelDefinition<T>.Definition);
30-
row.PopulateWithSqlReader(dialectProvider, dataReader, fieldDefs, indexCache);
31-
return row;
32-
}, token);
33-
}
26+
var row = CreateInstance<T>();
27+
var indexCache = dataReader.GetIndexFieldsCache(ModelDefinition<T>.Definition);
28+
row.PopulateWithSqlReader(dialectProvider, dataReader, fieldDefs, indexCache);
29+
return row;
30+
}, token).Then(t => {
31+
dataReader.Dispose();
32+
return t;
33+
});
3434
}
3535

3636
public static Task<List<T>> ConvertToListAsync<T>(this IDataReader dataReader, IOrmLiteDialectProvider dialectProvider, CancellationToken token)
3737
{
3838
var fieldDefs = ModelDefinition<T>.Definition.AllFieldDefinitionsArray;
39-
using (dataReader)
39+
var indexCache = dataReader.GetIndexFieldsCache(ModelDefinition<T>.Definition);
40+
return dialectProvider.ReaderEach(dataReader, () =>
4041
{
41-
var indexCache = dataReader.GetIndexFieldsCache(ModelDefinition<T>.Definition);
42-
return dialectProvider.ReaderEach(dataReader, () =>
43-
{
44-
var row = CreateInstance<T>();
45-
row.PopulateWithSqlReader(dialectProvider, dataReader, fieldDefs, indexCache);
46-
return row;
47-
}, token);
48-
}
42+
var row = CreateInstance<T>();
43+
row.PopulateWithSqlReader(dialectProvider, dataReader, fieldDefs, indexCache);
44+
return row;
45+
}, token).Then(t => {
46+
dataReader.Dispose();
47+
return t;
48+
});
4949
}
5050

5151
public static Task<object> ConvertToAsync(this IDataReader dataReader, IOrmLiteDialectProvider dialectProvider, Type type, CancellationToken token)
5252
{
5353
var modelDef = type.GetModelDefinition();
5454
var fieldDefs = modelDef.AllFieldDefinitionsArray;
5555

56-
using (dataReader)
56+
return dialectProvider.ReaderRead(dataReader, () =>
57+
{
58+
var row = type.CreateInstance();
59+
var indexCache = dataReader.GetIndexFieldsCache(modelDef);
60+
row.PopulateWithSqlReader(dialectProvider, dataReader, fieldDefs, indexCache);
61+
return row;
62+
}, token).Then(t =>
5763
{
58-
return dialectProvider.ReaderRead(dataReader, () =>
59-
{
60-
var row = type.CreateInstance();
61-
var indexCache = dataReader.GetIndexFieldsCache(modelDef);
62-
row.PopulateWithSqlReader(dialectProvider, dataReader, fieldDefs, indexCache);
63-
return row;
64-
}, token);
65-
}
64+
dataReader.Dispose();
65+
return t;
66+
});
6667
}
6768

6869
public static Task<IList> ConvertToListAsync(this IDataReader dataReader, IOrmLiteDialectProvider dialectProvider, Type type, CancellationToken token)
6970
{
7071
var modelDef = type.GetModelDefinition();
7172
var fieldDefs = modelDef.AllFieldDefinitionsArray;
7273

73-
using (dataReader)
74+
var indexCache = dataReader.GetIndexFieldsCache(modelDef);
75+
return dialectProvider.ReaderEach(dataReader, () =>
7476
{
75-
var indexCache = dataReader.GetIndexFieldsCache(modelDef);
76-
return dialectProvider.ReaderEach(dataReader, () =>
77-
{
78-
var row = type.CreateInstance();
79-
row.PopulateWithSqlReader(dialectProvider, dataReader, fieldDefs, indexCache);
80-
return row;
81-
}, token)
82-
.Then(x => {
83-
var to = (IList)typeof(List<>).MakeGenericType(type).CreateInstance();
84-
x.Each(o => to.Add(o));
85-
return to;
86-
});
87-
}
77+
var row = type.CreateInstance();
78+
row.PopulateWithSqlReader(dialectProvider, dataReader, fieldDefs, indexCache);
79+
return row;
80+
}, token)
81+
.Then(x =>
82+
{
83+
dataReader.Dispose();
84+
var to = (IList)typeof(List<>).MakeGenericType(type).CreateInstance();
85+
x.Each(o => to.Add(o));
86+
return to;
87+
});
8888
}
8989
}
9090
}

tests/ServiceStack.OrmLiteV45.Tests/SelectAsyncTests.cs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,22 @@
1-
using System.Threading.Tasks;
1+
using System;
2+
using System.Threading.Tasks;
23
using AppDb;
34
using NUnit.Framework;
5+
using ServiceStack.DataAnnotations;
6+
using ServiceStack.Model;
47

58
namespace ServiceStack.OrmLite.Tests
69
{
10+
public class PocoWithBytes : IHasGuidId
11+
{
12+
[PrimaryKey]
13+
public Guid Id { get; set; }
14+
15+
public byte[] Image { get; set; }
16+
17+
public string ContentType { get; set; }
18+
}
19+
720
[TestFixture]
821
public class SelectAsyncTests
922
: OrmLiteTestBase
@@ -22,5 +35,20 @@ public async Task Can_SELECT_SingleAsync()
2235
Assert.That(row.Id, Is.EqualTo("foo"));
2336
}
2437
}
38+
39+
[Test]
40+
public async Task Can_SELECT_SingleAsyncForStrangeClass()
41+
{
42+
using (var db = OpenDbConnection())
43+
{
44+
db.DropAndCreateTable<PocoWithBytes>();
45+
46+
var bar = new PocoWithBytes { Id = Guid.NewGuid(), Image = new byte[1024 * 1024], ContentType = "image/jpeg" };
47+
await db.InsertAsync(bar);
48+
49+
var blah = await db.SingleAsync(db.From<PocoWithBytes>().Where(x => x.Id == bar.Id));
50+
Assert.That(blah, Is.Not.Null);
51+
}
52+
}
2553
}
2654
}

0 commit comments

Comments
 (0)