SqlXmlTextReader.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. //
  2. // System.Data.SqlClient.SqlXmlTextReader.cs
  3. //
  4. // Author:
  5. // Rodrigo Moya ([email protected])
  6. // Daniel Morgan ([email protected])
  7. // Tim Coleman ([email protected])
  8. //
  9. // (C) Ximian, Inc 2002
  10. // (C) Daniel Morgan 2002
  11. // Copyright (C) Tim Coleman, 2002
  12. //
  13. using Mono.Data.TdsClient.Internal;
  14. using System;
  15. using System.IO;
  16. using System.Text;
  17. namespace System.Data.SqlClient {
  18. internal sealed class SqlXmlTextReader : TextReader, IDisposable
  19. {
  20. #region Fields
  21. bool eof = false;
  22. SqlDataReader reader;
  23. string localBuffer = "<results>";
  24. int position;
  25. #endregion // Fields
  26. #region Constructors
  27. internal SqlXmlTextReader (SqlDataReader reader)
  28. : base ()
  29. {
  30. this.reader = reader;
  31. }
  32. #endregion
  33. #region Methods
  34. public override void Close()
  35. {
  36. reader.Close ();
  37. }
  38. protected override void Dispose (bool disposing)
  39. {
  40. reader.Close ();
  41. }
  42. void IDisposable.Dispose ()
  43. {
  44. Dispose (true);
  45. }
  46. private bool GetNextBuffer ()
  47. {
  48. if (eof) {
  49. localBuffer = null;
  50. return false;
  51. }
  52. position = 0;
  53. if (reader.Read ())
  54. localBuffer = reader.GetString (0);
  55. else if (reader.NextResult () && reader.Read ())
  56. localBuffer = reader.GetString (0);
  57. else {
  58. eof = true;
  59. localBuffer = "</results>";
  60. return false;
  61. }
  62. return true;
  63. }
  64. public override int Peek ()
  65. {
  66. bool moreResults;
  67. if (localBuffer == null || localBuffer.Length == 0) {
  68. moreResults = GetNextBuffer ();
  69. if (!moreResults)
  70. return -1;
  71. }
  72. return (int) localBuffer[position];
  73. }
  74. public override int Read ()
  75. {
  76. int result = Peek ();
  77. position += 1;
  78. return result;
  79. }
  80. public override int Read (char[] buffer, int index, int count)
  81. {
  82. bool moreResults = true;
  83. int countRead = 0;
  84. if (localBuffer == null)
  85. moreResults = GetNextBuffer ();
  86. while (moreResults && count - countRead > localBuffer.Length - position) {
  87. localBuffer.CopyTo (position, buffer, index + countRead, localBuffer.Length);
  88. countRead += localBuffer.Length;
  89. moreResults = GetNextBuffer ();
  90. }
  91. if (moreResults && countRead < count) {
  92. localBuffer.CopyTo (position, buffer, index + countRead, count - countRead);
  93. position += count - countRead;
  94. }
  95. return countRead;
  96. }
  97. public override int ReadBlock (char[] buffer, int index, int count)
  98. {
  99. return Read (buffer, index, count);
  100. }
  101. public override string ReadLine ()
  102. {
  103. bool moreResults = true;
  104. string outBuffer;
  105. if (localBuffer == null)
  106. moreResults = GetNextBuffer ();
  107. if (!moreResults)
  108. return null;
  109. outBuffer = localBuffer;
  110. GetNextBuffer ();
  111. return outBuffer;
  112. }
  113. public override string ReadToEnd ()
  114. {
  115. string outBuffer = String.Empty;
  116. bool moreResults = true;
  117. if (localBuffer == null)
  118. moreResults = GetNextBuffer ();
  119. while (moreResults) {
  120. outBuffer += localBuffer;
  121. moreResults = GetNextBuffer ();
  122. }
  123. return outBuffer;
  124. }
  125. #endregion // Methods
  126. }
  127. }