fixed tests
[mono.git] / mcs / class / System.Data / System.Data.SqlTypes / SqlBytes.cs
1 //
2 // System.Data.SqlTypes.SqlBytes
3 //
4 // Author:
5 //   Tim Coleman <tim@timcoleman.com>
6 //
7 // Copyright (C) Tim Coleman, 2003
8 //
9
10 //
11 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
12 //
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
20 // 
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
23 // 
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 //
32
33 #if NET_2_0
34
35 using System;
36 using System.Globalization;
37 using System.IO;
38 using System.Xml;
39 using System.Xml.Schema;
40 using System.Xml.Serialization;
41 using System.Runtime.Serialization;
42
43 namespace System.Data.SqlTypes
44 {
45         [SerializableAttribute]
46         [XmlSchemaProvider ("GetSchema")]
47         public sealed class SqlBytes : INullable, IXmlSerializable, ISerializable
48         {
49                 #region Fields
50
51                 bool notNull;
52                 byte [] buffer;
53                 StorageState storage = StorageState.UnmanagedBuffer;
54                 Stream stream = null;
55
56                 #endregion
57
58                 #region Constructors
59
60                 public SqlBytes ()
61                 {
62                         buffer = null;
63                         notNull = false;
64                 }
65
66                 public SqlBytes (byte[] buffer)
67                 {
68                         if (buffer == null) {
69                                 notNull = false;
70                                 buffer = null;
71                         }
72                         else {
73                                 notNull = true;
74                                 this.buffer = buffer;
75                                 storage = StorageState.Buffer;
76                         }
77                 }
78
79                 public SqlBytes (SqlBinary value)
80                 {
81                         if (value == null) {
82                                 notNull = false;
83                                 buffer = null;
84                         }
85                         else {
86                                 notNull = true;
87                                 buffer = value.Value;
88                                 storage = StorageState.Buffer;
89                         }
90                 }
91
92                 public SqlBytes (Stream s)
93                 {
94                         if (s == null) {
95                                 notNull = false;
96                                 buffer = null;
97                         } else {
98                                 notNull = true;
99                                 int len = (int) s.Length;
100                                 buffer = new byte [len];
101                                 s.Read (buffer, 0, len);
102                                 storage = StorageState.Stream;
103                                 stream = s;
104                         }
105                 }
106
107                 #endregion
108
109                 #region Properties
110
111                 public byte [] Buffer {
112                         get { return buffer; }
113                 }
114
115                 public bool IsNull {
116                         get { return !notNull; }
117                 }
118
119                 public byte this [long offset] {
120                         set {
121                                 if (notNull && offset >= 0 && offset < buffer.Length)
122                                         buffer [offset] = value;
123                         }
124                         get {
125                                 if (buffer == null)
126                                         throw new SqlNullValueException ("Data is Null");
127                                 if (offset < 0 || offset >= buffer.Length)
128                                         throw new ArgumentOutOfRangeException ("Parameter name: offset");
129                                 return buffer [offset];
130                         }
131                 }
132
133                 public long Length {
134                         get {
135                                 if (!notNull || buffer == null)
136                                         throw new SqlNullValueException ("Data is Null");
137                                 if (buffer.Length < 0)
138                                         return -1;
139                                 return buffer.Length;
140                         }
141                 }
142
143                 public long MaxLength {
144                         get {
145                                 if (!notNull || buffer == null || storage == StorageState.Stream)
146                                         return -1;
147                                 return buffer.Length;
148                         }
149                 }
150
151                 public static SqlBytes Null {
152                         get {
153                                 return new SqlBytes ();
154                         }
155                 }
156
157                 public StorageState Storage {
158                         get {
159                                 if (storage == StorageState.UnmanagedBuffer)
160                                         throw new SqlNullValueException ("Data is Null");
161                                 return storage;
162                         }
163                 }
164
165                 public Stream Stream {
166                         set {
167                                 stream = value;
168                         }
169                         get {
170                                 return stream;
171                         }
172                 }
173
174                 public byte [] Value {
175                         get {
176                                 if (buffer == null)
177                                         return buffer;
178                                 return (byte []) buffer.Clone ();
179                         }
180                 }
181
182                 #endregion
183
184                 #region Methods
185
186                 public void SetLength (long value)
187                 {
188                         if (buffer == null)
189                                 throw new SqlTypeException ("There is no buffer. Read or write operation failed.");
190                         if (value < 0 || value > buffer.Length)
191                                 throw new ArgumentOutOfRangeException ("Specified argument was out of the range of valid values.");
192                         Array.Resize (ref buffer, (int) value);
193                 }
194                                                                                 
195                 public void SetNull ()
196                 {
197                         buffer = null;
198                         notNull = false;
199                 }
200                                                                                 
201                 public SqlBinary ToSqlBinary ()
202                 {
203                         return new SqlBinary (buffer);
204                 }
205                                                                                 
206                 [MonoTODO]
207                 XmlSchema IXmlSerializable.GetSchema ()
208                 {
209                         throw new NotImplementedException ();
210                 }
211                                                                                 
212                 [MonoTODO]
213                 void IXmlSerializable.ReadXml (XmlReader reader)
214                 {
215                         throw new NotImplementedException ();
216                 }
217                                                                                 
218                 [MonoTODO]
219                 void IXmlSerializable.WriteXml (XmlWriter writer)
220                 {
221                         throw new NotImplementedException ();
222                 }
223
224                 [MonoTODO]
225                 void ISerializable.GetObjectData (SerializationInfo info, StreamingContext context)
226                 {
227                         throw new NotImplementedException ();
228                 }
229                                                                                 
230                 #endregion
231         }
232 }
233
234 #endif