Skip to content

Commit 623ba7b

Browse files
committed
NH-3807 - Handle DbDataReader not having a Close and GetSchemaTable override in CoreCli.
Instead of Close on DbDataReader, enclose in using() blocks.
1 parent d67ce41 commit 623ba7b

File tree

14 files changed

+116
-128
lines changed

14 files changed

+116
-128
lines changed

src/NHibernate.Test/TypeParameters/TypeParameterTest.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -64,18 +64,18 @@ public void Save()
6464
statement.Connection = connection;
6565
t.Enlist(statement);
6666
((DbParameter) statement.Parameters[0]).Value = id;
67-
DbDataReader reader = statement.ExecuteReader();
68-
69-
Assert.IsTrue(reader.Read(), "A row should have been returned");
70-
Assert.IsTrue(reader.GetValue(reader.GetOrdinal("VALUE_ONE")) == DBNull.Value,
71-
"Default value should have been mapped to null");
72-
Assert.IsTrue(reader.GetValue(reader.GetOrdinal("VALUE_TWO")) == DBNull.Value,
73-
"Default value should have been mapped to null");
74-
Assert.AreEqual(Convert.ToInt32(reader.GetValue(reader.GetOrdinal("VALUE_THREE"))), 5,
75-
"Non-Default value should not be changed");
76-
Assert.IsTrue(reader.GetValue(reader.GetOrdinal("VALUE_FOUR")) == DBNull.Value,
77-
"Default value should have been mapped to null");
78-
reader.Close();
67+
using (DbDataReader reader = statement.ExecuteReader())
68+
{
69+
Assert.IsTrue(reader.Read(), "A row should have been returned");
70+
Assert.IsTrue(reader.GetValue(reader.GetOrdinal("VALUE_ONE")) == DBNull.Value,
71+
"Default value should have been mapped to null");
72+
Assert.IsTrue(reader.GetValue(reader.GetOrdinal("VALUE_TWO")) == DBNull.Value,
73+
"Default value should have been mapped to null");
74+
Assert.AreEqual(Convert.ToInt32(reader.GetValue(reader.GetOrdinal("VALUE_THREE"))), 5,
75+
"Non-Default value should not be changed");
76+
Assert.IsTrue(reader.GetValue(reader.GetOrdinal("VALUE_FOUR")) == DBNull.Value,
77+
"Default value should have been mapped to null");
78+
}
7979

8080
t.Commit();
8181
s.Close();
@@ -145,4 +145,4 @@ private void DeleteData()
145145
s.Close();
146146
}
147147
}
148-
}
148+
}

src/NHibernate/AdoNet/ResultSetWrapper.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,19 @@ internal DbDataReader Target
2727
get { return rs; }
2828
}
2929

30+
#if FEATURE_DATA_CLOSE || NET_4_0
3031
public override void Close()
3132
{
3233
rs.Close();
3334
}
35+
#endif
3436

37+
#if FEATURE_DATA_GETSCHEMATABLE || NET_4_0
3538
public override DataTable GetSchemaTable()
3639
{
3740
return rs.GetSchemaTable();
3841
}
42+
#endif
3943

4044
public override bool NextResult()
4145
{
@@ -76,9 +80,9 @@ protected override void Dispose(bool disposing)
7680

7781
if (disposing && rs != null)
7882
{
79-
rs.Dispose();
83+
rs.Dispose();
8084
rs = null;
81-
}
85+
}
8286

8387
disposed = true;
8488
}

src/NHibernate/Dialect/Lock/SelectLockingStrategy.cs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,7 @@ public void Lock(object id, object version, object obj, ISessionImplementor sess
6767
lockable.VersionType.NullSafeSet(st, version, lockable.IdentifierType.GetColumnSpan(factory), session);
6868
}
6969

70-
rs = session.Batcher.ExecuteReader(st);
71-
try
70+
using (rs = session.Batcher.ExecuteReader(st))
7271
{
7372
if (!rs.Read())
7473
{
@@ -79,10 +78,6 @@ public void Lock(object id, object version, object obj, ISessionImplementor sess
7978
throw new StaleObjectStateException(lockable.EntityName, id);
8079
}
8180
}
82-
finally
83-
{
84-
rs.Close();
85-
}
8681
}
8782
finally
8883
{
@@ -110,4 +105,4 @@ public void Lock(object id, object version, object obj, ISessionImplementor sess
110105

111106
#endregion
112107
}
113-
}
108+
}

src/NHibernate/Driver/BasicResultSetsCommand.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,15 +246,19 @@ public override int GetHashCode()
246246
return reader.GetHashCode();
247247
}
248248

249+
#if FEATURE_DATA_CLOSE || NET_4_0
249250
public override void Close()
250251
{
251252
batcher.CloseCommand(command, reader);
252253
}
254+
#endif
253255

256+
#if FEATURE_DATA_GETSCHEMATABLE || NET_4_0
254257
public override DataTable GetSchemaTable()
255258
{
256259
return reader.GetSchemaTable();
257260
}
261+
#endif
258262

259263
public override bool NextResult()
260264
{
@@ -281,4 +285,4 @@ public override int RecordsAffected
281285
get { return reader.RecordsAffected; }
282286
}
283287
}
284-
}
288+
}

src/NHibernate/Driver/NDataReader.cs

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -47,33 +47,32 @@ public NDataReader(DbDataReader reader, bool isMidstream)
4747
{
4848
var resultList = new List<NResult>(2);
4949

50-
try
50+
using (reader)
5151
{
52-
// if we are in midstream of processing a DataReader then we are already
53-
// positioned on the first row (index=0)
54-
if (isMidstream)
52+
try
5553
{
56-
currentRowIndex = 0;
57-
}
54+
// if we are in midstream of processing a DataReader then we are already
55+
// positioned on the first row (index=0)
56+
if (isMidstream)
57+
{
58+
currentRowIndex = 0;
59+
}
5860

59-
// there will be atleast one result
60-
resultList.Add(new NResult(reader, isMidstream));
61+
// there will be atleast one result
62+
resultList.Add(new NResult(reader, isMidstream));
6163

62-
while (reader.NextResult())
64+
while (reader.NextResult())
65+
{
66+
// the second, third, nth result is not processed midstream
67+
resultList.Add(new NResult(reader, false));
68+
}
69+
70+
results = resultList.ToArray();
71+
}
72+
catch (Exception e)
6373
{
64-
// the second, third, nth result is not processed midstream
65-
resultList.Add(new NResult(reader, false));
74+
throw new ADOException("There was a problem converting an DbDataReader to NDataReader", e);
6675
}
67-
68-
results = resultList.ToArray();
69-
}
70-
catch (Exception e)
71-
{
72-
throw new ADOException("There was a problem converting an DbDataReader to NDataReader", e);
73-
}
74-
finally
75-
{
76-
reader.Close();
7776
}
7877
}
7978

@@ -108,7 +107,7 @@ public override int RecordsAffected
108107

109108
public override bool HasRows
110109
{
111-
get { return results.LongLength > 0; }
110+
get { return results.Length > 0; }
112111
}
113112

114113
/// <summary></summary>
@@ -135,10 +134,12 @@ public override bool NextResult()
135134
}
136135

137136
/// <summary></summary>
137+
#if FEATURE_DATA_CLOSE || NET_4_0
138138
public override void Close()
139139
{
140140
isClosed = true;
141141
}
142+
#endif
142143

143144
/// <summary></summary>
144145
public override bool Read()
@@ -163,11 +164,17 @@ public override int Depth
163164
get { return currentResultIndex; }
164165
}
165166

167+
#if FEATURE_DATA_GETSCHEMATABLE || NET_4_0
166168
/// <summary></summary>
167169
public override DataTable GetSchemaTable()
168170
{
171+
#if FEATURE_DATA_GETSCHEMATABLE
169172
return GetCurrentResult().GetSchemaTable();
173+
#else
174+
throw new NotImplementedException();
175+
#endif
170176
}
177+
#endif
171178

172179
protected override void Dispose(bool disposing)
173180
{
@@ -247,7 +254,7 @@ public override long GetBytes(int i, long fieldOffset, byte[] buffer, int buffer
247254
length = (int) remainingLength;
248255
}
249256

250-
Array.Copy(cachedByteArray, fieldOffset, buffer, bufferOffset, length);
257+
Array.Copy(cachedByteArray, (int)fieldOffset, buffer, bufferOffset, length);
251258

252259
return length;
253260
}
@@ -422,7 +429,7 @@ public override long GetChars(int i, long fieldOffset, char[] buffer, int buffer
422429
length = (int) remainingLength;
423430
}
424431

425-
Array.Copy(cachedCharArray, fieldOffset, buffer, bufferOffset, length);
432+
Array.Copy(cachedCharArray, (int)fieldOffset, buffer, bufferOffset, length);
426433

427434
return length;
428435
}
@@ -466,7 +473,9 @@ private class NResult
466473
private readonly object[][] records;
467474
private int colCount = 0;
468475

476+
#if FEATURE_DATA_GETSCHEMATABLE
469477
private readonly DataTable schemaTable;
478+
#endif
470479

471480
// key = field name
472481
// index = field index
@@ -485,7 +494,9 @@ private class NResult
485494
/// </param>
486495
internal NResult(DbDataReader reader, bool isMidstream)
487496
{
497+
#if FEATURE_DATA_GETSCHEMATABLE
488498
schemaTable = reader.GetSchemaTable();
499+
#endif
489500

490501
List<object[]> recordsList = new List<object[]>();
491502
int rowIndex = 0;
@@ -561,11 +572,13 @@ public string GetName(int colIndex)
561572
return fieldIndexToName[colIndex];
562573
}
563574

575+
#if FEATURE_DATA_GETSCHEMATABLE
564576
/// <summary></summary>
565577
public DataTable GetSchemaTable()
566578
{
567579
return schemaTable;
568580
}
581+
#endif
569582

570583
/// <summary>
571584
///
@@ -635,4 +648,4 @@ public int RowCount
635648
}
636649
}
637650
}
638-
}
651+
}

src/NHibernate/Driver/NHybridDataReader.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public override bool HasRows
9797
/// <summary></summary>
9898
public override bool IsClosed
9999
{
100-
get { return _reader.IsClosed; }
100+
get { return _reader == null || _reader.IsClosed; }
101101
}
102102

103103
/// <summary></summary>
@@ -108,11 +108,13 @@ public override bool NextResult()
108108
return _reader.NextResult();
109109
}
110110

111+
#if FEATURE_DATA_CLOSE || NET_4_0
111112
/// <summary></summary>
112113
public override void Close()
113114
{
114115
_reader.Close();
115116
}
117+
#endif
116118

117119
/// <summary></summary>
118120
public override bool Read()
@@ -127,11 +129,13 @@ public override int Depth
127129
get { return _reader.Depth; }
128130
}
129131

132+
#if FEATURE_DATA_GETSCHEMATABLE || NET_4_0
130133
/// <summary></summary>
131134
public override DataTable GetSchemaTable()
132135
{
133136
return _reader.GetSchemaTable();
134137
}
138+
#endif
135139

136140
/// <summary>
137141
/// A flag to indicate if <c>Disose()</c> has been called.
@@ -163,7 +167,6 @@ protected override void Dispose(bool disposing)
163167
if (disposing && _reader != null)
164168
{
165169
_reader.Dispose();
166-
_reader = null;
167170
}
168171

169172
disposed = true;
@@ -415,4 +418,4 @@ public override short GetInt16(int i)
415418
return _reader.GetInt16(i);
416419
}
417420
}
418-
}
421+
}

src/NHibernate/Id/Enhanced/SequenceStructure.cs

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,7 @@ public virtual long GetNextValue()
102102
DbDataReader rs = null;
103103
try
104104
{
105-
rs = _session.Batcher.ExecuteReader(st);
106-
try
105+
using (rs = _session.Batcher.ExecuteReader(st))
107106
{
108107
rs.Read();
109108
long result = Convert.ToInt64(rs.GetValue(0));
@@ -113,17 +112,6 @@ public virtual long GetNextValue()
113112
}
114113
return result;
115114
}
116-
finally
117-
{
118-
try
119-
{
120-
rs.Close();
121-
}
122-
catch
123-
{
124-
// intentionally empty
125-
}
126-
}
127115
}
128116
finally
129117
{
@@ -141,4 +129,4 @@ public virtual long GetNextValue()
141129

142130
#endregion
143131
}
144-
}
132+
}

src/NHibernate/Id/IncrementGenerator.cs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,7 @@ private void GetNext(ISessionImplementor session)
107107
DbDataReader reader = null;
108108
try
109109
{
110-
reader = session.Batcher.ExecuteReader(cmd);
111-
try
110+
using (reader = session.Batcher.ExecuteReader(cmd))
112111
{
113112
if (reader.Read())
114113
{
@@ -121,10 +120,6 @@ private void GetNext(ISessionImplementor session)
121120
_sql = null;
122121
Logger.Debug("first free id: " + _next);
123122
}
124-
finally
125-
{
126-
reader.Close();
127-
}
128123
}
129124
finally
130125
{

0 commit comments

Comments
 (0)