Updates referencesource to .NET 4.7
[mono-project.git] / mcs / class / referencesource / System.Data.Entity / System / Data / Objects / ObjectStateEntryDbDataRecord.cs
blob5b763db4a0667121479f7100321232adc865001e
1 //---------------------------------------------------------------------
2 // <copyright file="ObjectStateEntryDbDataRecord.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
4 // </copyright>
5 //
6 // @owner Microsoft
7 // @backupOwner Microsoft
8 //---------------------------------------------------------------------
10 using System;
11 using System.Data;
12 using System.Data.Common;
13 using System.ComponentModel;
14 using System.Data.Metadata.Edm;
15 using System.Diagnostics;
17 namespace System.Data.Objects
20 internal sealed class ObjectStateEntryDbDataRecord : DbDataRecord, IExtendedDataRecord
22 private readonly StateManagerTypeMetadata _metadata;
23 private readonly ObjectStateEntry _cacheEntry;
24 private readonly object _userObject;
25 private DataRecordInfo _recordInfo;
27 internal ObjectStateEntryDbDataRecord(EntityEntry cacheEntry, StateManagerTypeMetadata metadata, object userObject)
29 EntityUtil.CheckArgumentNull(cacheEntry, "cacheEntry");
30 EntityUtil.CheckArgumentNull(userObject, "userObject");
31 EntityUtil.CheckArgumentNull(metadata, "metadata");
32 Debug.Assert(!cacheEntry.IsKeyEntry, "Cannot create an ObjectStateEntryDbDataRecord for a key entry");
33 switch (cacheEntry.State)
35 case EntityState.Unchanged:
36 case EntityState.Modified:
37 case EntityState.Deleted:
38 _cacheEntry = cacheEntry;
39 _userObject = userObject;
40 _metadata = metadata;
41 break;
42 default:
43 Debug.Assert(false, "A DbDataRecord cannot be created for an entity object that is in an added or detached state.");
44 break;
47 internal ObjectStateEntryDbDataRecord(RelationshipEntry cacheEntry)
49 EntityUtil.CheckArgumentNull(cacheEntry, "cacheEntry");
50 Debug.Assert(!cacheEntry.IsKeyEntry, "Cannot create an ObjectStateEntryDbDataRecord for a key entry");
51 switch (cacheEntry.State)
53 case EntityState.Unchanged:
54 case EntityState.Modified:
55 case EntityState.Deleted:
56 _cacheEntry = cacheEntry;
57 break;
58 default:
59 Debug.Assert(false, "A DbDataRecord cannot be created for an entity object that is in an added or detached state.");
60 break;
63 override public int FieldCount
65 get
67 Debug.Assert(_cacheEntry != null, "CacheEntry is required.");
68 return _cacheEntry.GetFieldCount(_metadata);
71 override public object this[int ordinal]
73 get
75 return GetValue(ordinal);
78 override public object this[string name]
80 get
82 return GetValue(GetOrdinal(name));
85 override public bool GetBoolean(int ordinal)
87 return (bool)GetValue(ordinal);
89 override public byte GetByte(int ordinal)
91 return (byte)GetValue(ordinal);
93 override public long GetBytes(int ordinal, long dataIndex, byte[] buffer, int bufferIndex, int length)
95 byte[] tempBuffer;
96 tempBuffer = (byte[])GetValue(ordinal);
98 if (buffer == null)
100 return tempBuffer.Length;
102 int srcIndex = (int)dataIndex;
103 int byteCount = Math.Min(tempBuffer.Length - srcIndex, length);
104 if (srcIndex < 0)
106 throw EntityUtil.InvalidSourceBufferIndex(tempBuffer.Length, srcIndex, "dataIndex");
108 else if ((bufferIndex < 0) || (bufferIndex > 0 && bufferIndex >= buffer.Length))
110 throw EntityUtil.InvalidDestinationBufferIndex(buffer.Length, bufferIndex, "bufferIndex");
113 if (0 < byteCount)
115 Array.Copy(tempBuffer, dataIndex, buffer, bufferIndex, byteCount);
117 else if (length < 0)
119 throw EntityUtil.InvalidDataLength(length);
121 else
123 byteCount = 0;
125 return byteCount;
127 override public char GetChar(int ordinal)
129 return (char)GetValue(ordinal);
131 override public long GetChars(int ordinal, long dataIndex, char[] buffer, int bufferIndex, int length)
133 char[] tempBuffer;
134 tempBuffer = (char[])GetValue(ordinal);
136 if (buffer == null)
138 return tempBuffer.Length;
141 int srcIndex = (int)dataIndex;
142 int charCount = Math.Min(tempBuffer.Length - srcIndex, length);
143 if (srcIndex < 0)
145 throw EntityUtil.InvalidSourceBufferIndex(buffer.Length, bufferIndex, "bufferIndex");
147 else if ((bufferIndex < 0) || (bufferIndex > 0 && bufferIndex >= buffer.Length))
149 throw EntityUtil.InvalidDestinationBufferIndex(buffer.Length, bufferIndex, "bufferIndex");
152 if (0 < charCount)
154 Array.Copy(tempBuffer, dataIndex, buffer, bufferIndex, charCount);
156 else if (length < 0)
158 throw EntityUtil.InvalidDataLength(length);
160 else
162 charCount = 0;
164 return charCount;
166 override protected DbDataReader GetDbDataReader(int ordinal)
168 throw EntityUtil.NotSupported();
170 override public string GetDataTypeName(int ordinal)
172 return (GetFieldType(ordinal)).Name;
174 override public DateTime GetDateTime(int ordinal)
176 return (DateTime)GetValue(ordinal);
178 override public Decimal GetDecimal(int ordinal)
180 return (Decimal)GetValue(ordinal);
182 override public double GetDouble(int ordinal)
184 return (Double)GetValue(ordinal);
186 public override Type GetFieldType(int ordinal)
188 return _cacheEntry.GetFieldType(ordinal, _metadata);
190 override public float GetFloat(int ordinal)
192 return (float)GetValue(ordinal);
194 override public Guid GetGuid(int ordinal)
196 return (Guid)GetValue(ordinal);
198 override public Int16 GetInt16(int ordinal)
200 return (Int16)GetValue(ordinal);
202 override public Int32 GetInt32(int ordinal)
204 return (Int32)GetValue(ordinal);
206 override public Int64 GetInt64(int ordinal)
208 return (Int64)GetValue(ordinal);
210 override public string GetName(int ordinal)
212 return _cacheEntry.GetCLayerName(ordinal, _metadata);
214 override public int GetOrdinal(string name)
216 int ordinal = _cacheEntry.GetOrdinalforCLayerName(name, _metadata);
217 if (ordinal == -1)
219 throw EntityUtil.ArgumentOutOfRange("name");
221 return ordinal;
223 override public string GetString(int ordinal)
225 return (string)GetValue(ordinal);
227 override public object GetValue(int ordinal)
229 if (_cacheEntry.IsRelationship)
231 return (_cacheEntry as RelationshipEntry).GetOriginalRelationValue(ordinal);
233 else
235 return (_cacheEntry as EntityEntry).GetOriginalEntityValue(_metadata, ordinal, _userObject, ObjectStateValueRecord.OriginalReadonly);
238 override public int GetValues(object[] values)
240 if (values == null)
242 throw EntityUtil.ArgumentNull("values");
244 int minValue = Math.Min(values.Length, FieldCount);
245 for (int i = 0; i < minValue; i++)
247 values[i] = GetValue(i);
249 return minValue;
251 override public bool IsDBNull(int ordinal)
253 return (GetValue(ordinal) == DBNull.Value);
256 public DataRecordInfo DataRecordInfo
260 if (null == _recordInfo)
262 Debug.Assert(_cacheEntry != null, "CacheEntry is required.");
263 _recordInfo = _cacheEntry.GetDataRecordInfo(_metadata, _userObject);
265 return _recordInfo;
268 public DbDataRecord GetDataRecord(int ordinal)
270 return (DbDataRecord)GetValue(ordinal);
272 public DbDataReader GetDataReader(int i)
274 return this.GetDbDataReader(i);