//
using System;
-using System.Globalization;
+using System.Xml;
+using System.Text;
using System.Threading;
+using System.Xml.Schema;
+using System.Globalization;
+using System.Xml.Serialization;
namespace System.Data.SqlTypes
{
/// A variable-length stream of characters
/// to be stored in or retrieved from the database
/// </summary>
+#if NET_2_0
+ [SerializableAttribute]
+ [XmlSchemaProvider ("GetXsdType")]
+#endif
public struct SqlString : INullable, IComparable
+#if NET_2_0
+ , IXmlSerializable
+#endif
{
#region Fields
{
this.value = data;
lcid = CultureInfo.CurrentCulture.LCID;
- notNull = true;
+ if (value != null)
+ notNull = true;
+ else
+ notNull = false;
this.compareOptions = SqlCompareOptions.IgnoreCase |
SqlCompareOptions.IgnoreKanaType |
SqlCompareOptions.IgnoreWidth;
{
this.value = data;
this.lcid = lcid;
- notNull = true;
+ if (value != null)
+ notNull = true;
+ else
+ notNull = false;
this.compareOptions = SqlCompareOptions.IgnoreCase |
SqlCompareOptions.IgnoreKanaType |
SqlCompareOptions.IgnoreWidth;
this.value = data;
this.lcid = lcid;
this.compareOptions = compareOptions;
- notNull = true;
+ if (value != null)
+ notNull = true;
+ else
+ notNull = false;
}
// init with locale id, compare options, array of bytes data,
// and whether unicode is encoded or not
public SqlString (int lcid, SqlCompareOptions compareOptions, byte[] data, bool fUnicode)
{
- char [] chars;
-
- if (fUnicode)
- chars = new char [data.Length/2];
- else
- chars = new char [data.Length];
-
- int j = 0;
- for (int i = 0; i < chars.Length; i++) {
-
- if (fUnicode) {
- chars [i] = (char)(data [j] << 16);
- chars [i] += (char)data [j + 1];
- j += 2;
- } else {
- chars [i] = (char)data[i];
- }
- }
-
- this.value = new String (chars);
+ Encoding encoding = (fUnicode ? Encoding.Unicode : Encoding.ASCII);
+ this.value = encoding.GetString (data);
this.lcid = lcid;
this.compareOptions = compareOptions;
- notNull = true;
+ if (value != null)
+ notNull = true;
+ else
+ notNull = false;
}
// init with locale id, compare options, array of bytes data,
// and whether unicode is encoded or not
public SqlString (int lcid, SqlCompareOptions compareOptions, byte[] data, int index, int count, bool fUnicode)
{
- char [] chars;
-
- if (fUnicode)
- chars = new char [(count - index) / 2];
- else
- chars = new char [count - index];
-
- if (index >= data.Length)
- throw new ArgumentOutOfRangeException ("index");
-
- if ((index + count) > data.Length)
- throw new ArgumentOutOfRangeException ("count");
-
- int j = 0;
- for (int i = index; i < chars.Length; i++) {
-
- if (fUnicode) {
- chars [i] = (char)(data[j] << 16);
- chars [i] += (char)data[j+1];
- j += 2;
- } else {
- chars [i] = (char)data [j];
- j++;
- }
- }
-
- this.value = new String (chars);
+ Encoding encoding = (fUnicode ? Encoding.Unicode : Encoding.ASCII);
+ this.value = encoding.GetString (data, index, count);
this.lcid = lcid;
this.compareOptions = compareOptions;
- notNull = true;
+ if (value != null)
+ notNull = true;
+ else
+ notNull = false;
}
#endregion // Constructors
{
if (!(value is SqlString))
return false;
- if (this.IsNull && ((SqlString)value).IsNull)
- return true;
+ if (this.IsNull)
+ return ((SqlString)value).IsNull;
else if (((SqlString)value).IsNull)
return false;
else
public byte[] GetNonUnicodeBytes()
{
- byte [] bytes = new byte [value.Length];
-
- for (int i = 0; i < bytes.Length; i++)
- bytes [i] = (byte)value [i];
-
- return bytes;
+ return Encoding.ASCII.GetBytes (value);
}
public byte[] GetUnicodeBytes()
{
- byte [] bytes = new byte [value.Length * 2];
-
- int j = 0;
- for (int i = 0; i < value.Length; i++) {
- bytes [j] = (byte)(value [i] & 0x0000FFFF);
- bytes [j + 1] = (byte)((value [i] & 0xFFFF0000) >> 16);
- j += 2;
- }
-
- return bytes;
+ return Encoding.Unicode.GetBytes (value);
}
public static SqlBoolean GreaterThan(SqlString x, SqlString y)
{
if (x.IsNull || y.IsNull)
return SqlString.Null;
-
- if (( x == null) || (y == null))
- return SqlString.Null;
-
- return new SqlString (x.Value + y.Value);
+ else
+ return new SqlString (x.Value + y.Value);
}
// Equality
return new SqlString (x);
}
- #if NET_2_0
+#if NET_2_0
public static SqlString Add (SqlString x, SqlString y)
{
- return ( x + y);
-
+ return (x + y);
}
public int CompareTo (SqlString value)
{
return CompareSqlString (value);
}
- #endif
+#endif
#endregion // Public Methods
+#if NET_2_0
+ public static XmlQualifiedName GetXsdType (XmlSchemaSet schemaSet)
+ {
+ if (schemaSet != null && schemaSet.Count == 0) {
+ XmlSchema xs = new XmlSchema ();
+ XmlSchemaComplexType ct = new XmlSchemaComplexType ();
+ ct.Name = "string";
+ xs.Items.Add (ct);
+ schemaSet.Add (xs);
+ }
+ return new XmlQualifiedName ("string", "http://www.w3.org/2001/XMLSchema");
+ }
+
+ XmlSchema IXmlSerializable.GetSchema ()
+ {
+ return null;
+ }
+
+ void IXmlSerializable.ReadXml (XmlReader reader)
+ {
+ if (reader == null)
+ return;
+
+ switch (reader.ReadState) {
+ case ReadState.EndOfFile:
+ case ReadState.Error:
+ case ReadState.Closed:
+ return;
+ }
+ // Skip XML declaration and prolog
+ // or do I need to validate for the <string> tag?
+ reader.MoveToContent ();
+ if (reader.EOF)
+ return;
+
+ reader.Read ();
+ if (reader.NodeType == XmlNodeType.EndElement)
+ return;
+
+ if (reader.Value.Length > 0) {
+ if (String.Compare ("Null", reader.Value) == 0) {
+ // means a null reference/invalid value
+ notNull = false;
+ return;
+ }
+ // FIXME: Validate the value for expected format
+ this.value = reader.Value;
+ this.notNull = true;
+ this.compareOptions = SqlCompareOptions.IgnoreCase |
+ SqlCompareOptions.IgnoreKanaType |
+ SqlCompareOptions.IgnoreWidth;
+ }
+ }
+
+ void IXmlSerializable.WriteXml (XmlWriter writer)
+ {
+ writer.WriteString (this.ToString ());
+ }
+#endif
}
}