3 using System.Collections;
\r
4 using System.Reflection;
\r
6 using ${glPackageBaseCommon};
\r
7 using ${glPackageBaseCommonCBean};
\r
9 namespace ${glPackageBaseCommonS2Dao} {
\r
11 public class ${glFetchNarrowingResultSetWrapper} : System.Data.IDataReader {
\r
13 // ===============================================================================
\r
16 protected System.Data.IDataReader _dataReader;
\r
17 protected ${glFetchNarrowingBeanInterfaceName} _fetchNarrowingBean;
\r
18 protected long _fetchCounter;
\r
19 protected long _requestCounter;
\r
20 protected bool _offsetByCursorForcedly;
\r
21 protected bool _limitByCursorForcedly;
\r
23 // ===============================================================================
\r
29 * @param dataReader Original data-reader. (NotNull)
\r
30 * @param ${glAttachedCBArgsVariableName} FetchNarrowing-bean. (NotNull)
\r
32 public ${glFetchNarrowingResultSetWrapper}(System.Data.IDataReader dataReader, ${glFetchNarrowingBeanInterfaceName} fetchNarrowingBean
\r
33 , bool offsetByCursorForcedly, bool limitByCursorForcedly) {
\r
34 _dataReader = dataReader;
\r
35 _fetchNarrowingBean = fetchNarrowingBean;
\r
36 _offsetByCursorForcedly = offsetByCursorForcedly;
\r
37 _limitByCursorForcedly = limitByCursorForcedly;
\r
42 // ===============================================================================
\r
45 private void skip() {
\r
46 if (!IsAvailableSkipRecord()) {
\r
49 int skipStartIndex = GetFetchNarrowingSkipStartIndex();
\r
50 if (IsCursorUsed()) {
\r
51 // if (0 == skipStartIndex) {
\r
52 // _dataReader.beforeFirst();
\r
54 // _dataReader.absolute(skipStartIndex);
\r
56 // _fetchCounter = _dataReader.getRow();
\r
57 throw new NotSupportedException("Cursor is unsupported!!!");
\r
59 while (_fetchCounter < skipStartIndex && _dataReader.Read()) {
\r
65 protected bool IsAvailableSkipRecord() {
\r
66 if (!IsFetchNarrowingEffective()) {
\r
69 if (IsOffsetByCursorForcedly) {
\r
72 if (IsFetchNarrowingSkipStartIndexEffective()) {
\r
78 // ===============================================================================
\r
84 * @return Does the result set have next record?
\r
85 * @throws SQLException
\r
87 public bool Read() {
\r
88 bool hasNext = _dataReader.Read();
\r
90 if (!IsAvailableLimitLoopCount()) {
\r
91 CheckSafetyResult(hasNext);
\r
95 if (hasNext && _fetchCounter < GetFetchNarrowingSkipStartIndex() + GetFetchNarrowingLoopCount()) {
\r
97 CheckSafetyResult(true);
\r
104 protected bool IsAvailableLimitLoopCount() {
\r
105 if (!IsFetchNarrowingEffective()) {
\r
108 if (IsLimitByCursorForcedly) {
\r
111 if (IsFetchNarrowingLoopCountEffective()) {
\r
117 protected void CheckSafetyResult(bool hasNext) {
\r
118 if (hasNext && GetSafetyMaxResultSize() > 0 && _requestCounter > (GetSafetyMaxResultSize() + 1)) {
\r
119 String msg = "You have already been in Danger Zone!";
\r
120 msg = msg + " Please confirm your query or data of table: safetyMaxResultSize=" + GetSafetyMaxResultSize();
\r
121 throw new ${glPackageBaseCommonException}.${glDangerousResultSizeException}(msg, GetSafetyMaxResultSize());
\r
125 // ===============================================================================
\r
128 protected bool IsFetchNarrowingEffective() {
\r
129 return _fetchNarrowingBean.IsFetchNarrowingEffective;
\r
132 protected bool IsFetchNarrowingSkipStartIndexEffective() {
\r
133 return _fetchNarrowingBean.IsFetchNarrowingSkipStartIndexEffective;
\r
136 protected bool IsFetchNarrowingLoopCountEffective() {
\r
137 return _fetchNarrowingBean.IsFetchNarrowingLoopCountEffective;
\r
140 protected int GetFetchNarrowingSkipStartIndex() {
\r
141 return _fetchNarrowingBean.FetchNarrowingSkipStartIndex;
\r
144 protected int GetFetchNarrowingLoopCount() {
\r
145 return _fetchNarrowingBean.FetchNarrowingLoopCount;
\r
148 protected int GetSafetyMaxResultSize() {
\r
149 return _fetchNarrowingBean.SafetyMaxResultSize;
\r
152 protected bool IsCursorUsed() {
\r
153 return IsCursorSupported(_dataReader);
\r
156 public static bool IsCursorSupported(System.Data.IDataReader dataReader) {
\r
157 return false;// Is Cursor Unsupported at C#?
\r
160 // ===============================================================================
\r
163 public ${glFetchNarrowingBeanInterfaceName} FetchNarrowingBean {
\r
164 get { return _fetchNarrowingBean; }
\r
167 public bool IsOffsetByCursorForcedly {
\r
168 get { return _offsetByCursorForcedly; }
\r
171 public bool IsLimitByCursorForcedly {
\r
172 get { return _limitByCursorForcedly; }
\r
175 // ===============================================================================
\r
176 // Implementation of IDataReader
\r
177 // =============================
\r
178 #region Implementation of IDataReader
\r
179 void System.Data.IDataReader.Close() {
\r
180 _dataReader.Close();
\r
183 int System.Data.IDataReader.Depth {
\r
184 get { return _dataReader.Depth; }
\r
187 System.Data.DataTable System.Data.IDataReader.GetSchemaTable() {
\r
188 return _dataReader.GetSchemaTable();
\r
191 bool System.Data.IDataReader.IsClosed {
\r
192 get { return _dataReader.IsClosed; }
\r
195 bool System.Data.IDataReader.NextResult() {
\r
196 return _dataReader.NextResult();
\r
199 int System.Data.IDataReader.RecordsAffected {
\r
200 get { return _dataReader.RecordsAffected; }
\r
204 // ===============================================================================
\r
205 // Implementation of IDisposable
\r
206 // =============================
\r
207 #region Implementation of IDisposable
\r
208 void System.IDisposable.Dispose() {
\r
209 _dataReader.Dispose();
\r
213 // ===============================================================================
\r
214 // Implementation of IDataRecord
\r
215 // =============================
\r
216 #region Implementation of IDataRecord
\r
217 int System.Data.IDataRecord.FieldCount {
\r
218 get { return _dataReader.FieldCount; }
\r
221 bool System.Data.IDataRecord.GetBoolean(int i) {
\r
222 return _dataReader.GetBoolean(i);
\r
225 byte System.Data.IDataRecord.GetByte(int i) {
\r
226 return _dataReader.GetByte(i);
\r
229 long System.Data.IDataRecord.GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length) {
\r
230 return _dataReader.GetBytes(i, fieldOffset, buffer, bufferoffset, length);
\r
233 char System.Data.IDataRecord.GetChar(int i) {
\r
234 return _dataReader.GetChar(i);
\r
237 long System.Data.IDataRecord.GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length) {
\r
238 return _dataReader.GetChars(i, fieldoffset, buffer, bufferoffset, length);
\r
241 System.Data.IDataReader System.Data.IDataRecord.GetData(int i) {
\r
242 return _dataReader.GetData(i);
\r
245 string System.Data.IDataRecord.GetDataTypeName(int i) {
\r
246 return _dataReader.GetDataTypeName(i);
\r
249 System.DateTime System.Data.IDataRecord.GetDateTime(int i) {
\r
250 return _dataReader.GetDateTime(i);
\r
253 decimal System.Data.IDataRecord.GetDecimal(int i) {
\r
254 return _dataReader.GetDecimal(i);
\r
257 double System.Data.IDataRecord.GetDouble(int i) {
\r
258 return _dataReader.GetDouble(i);
\r
261 System.Type System.Data.IDataRecord.GetFieldType(int i) {
\r
262 return _dataReader.GetFieldType(i);
\r
265 float System.Data.IDataRecord.GetFloat(int i) {
\r
266 return _dataReader.GetFloat(i);
\r
269 System.Guid System.Data.IDataRecord.GetGuid(int i) {
\r
270 return _dataReader.GetGuid(i);
\r
273 short System.Data.IDataRecord.GetInt16(int i) {
\r
274 return _dataReader.GetInt16(i);
\r
277 int System.Data.IDataRecord.GetInt32(int i) {
\r
278 return _dataReader.GetInt32(i);
\r
281 long System.Data.IDataRecord.GetInt64(int i) {
\r
282 return _dataReader.GetInt64(i);
\r
285 string System.Data.IDataRecord.GetName(int i) {
\r
286 return _dataReader.GetName(i);
\r
289 int System.Data.IDataRecord.GetOrdinal(string name) {
\r
290 return _dataReader.GetOrdinal(name);
\r
293 string System.Data.IDataRecord.GetString(int i) {
\r
294 return _dataReader.GetString(i);
\r
297 object System.Data.IDataRecord.GetValue(int i) {
\r
298 return _dataReader.GetValue(i);
\r
301 int System.Data.IDataRecord.GetValues(object[] values) {
\r
302 return _dataReader.GetValues(values);
\r
305 bool System.Data.IDataRecord.IsDBNull(int i) {
\r
306 return _dataReader.IsDBNull(i);
\r
309 object System.Data.IDataRecord.this[string name] {
\r
310 get { return _dataReader[name]; }
\r
313 object System.Data.IDataRecord.this[int i] {
\r
314 get { return _dataReader[i]; }
\r