From: Carlos Guzm?n ?l. <car...@us...> - 2004-03-01 16:39:42
|
Update of /cvsroot/firebird/NETProvider/NETProvider_16/source/FirebirdSql.Data.Common In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7054 Modified Files: ArrayBase.cs Charset.cs DbField.cs Log Message: 2004-03-01 Carlos Guzman Alvarez <car...@te...> * FirebirdSql.Data.Gds/XdrStream.cs: * FirebirdSql.Data.Gds/GdsArray.cs: * FirebirdSql.Data.Common/ArrayBase.cs: * FirebirdSql.Data.Common/Charset.cs: * FirebirdSql.Data.Common/DbField.cs: * FirebirdSql.Data.Embedded/FesArray.cs: - Mayor rework of the array datatype support. IMPORTANT: Array data type support in the embeeded GDS is pending of rework. Index: ArrayBase.cs =================================================================== RCS file: /cvsroot/firebird/NETProvider/NETProvider_16/source/FirebirdSql.Data.Common/ArrayBase.cs,v retrieving revision 1.11 retrieving revision 1.12 diff -b -U3 -r1.11 -r1.12 --- ArrayBase.cs 19 Feb 2004 11:50:55 -0000 1.11 +++ ArrayBase.cs 1 Mar 2004 16:28:33 -0000 1.12 @@ -18,7 +18,6 @@ using System; using System.Text; -using System.Net; namespace FirebirdSql.Data.Common { @@ -83,18 +82,23 @@ #region Abstract Methods public abstract byte[] GetSlice(int slice_length); - public abstract void PutSlice(System.Array source_array, int slice_length); #endregion + #region Protected Abstract Methods + + protected abstract System.Array DecodeSlice(byte[] slice); + + #endregion + #region Methods public System.Array Read() { byte[] slice = this.GetSlice(this.GetSliceLength(true)); - return this.decodeSlice(slice); + return this.DecodeSlice(slice); } public void Write(System.Array sourceArray) @@ -208,102 +212,17 @@ elements += bound.LowerBound * bound.UpperBound; } - switch (this.descriptor.DataType) - { - case IscCodes.blr_text: - case IscCodes.blr_text2: - case IscCodes.blr_cstring: - case IscCodes.blr_cstring2: - case IscCodes.blr_varying: - case IscCodes.blr_varying2: - // Char & VarChar - length = elements * encoding.GetMaxByteCount(this.descriptor.Length); - length += elements * ((4 - encoding.GetMaxByteCount(this.descriptor.Length)) & 3); - break; - - case IscCodes.blr_short: - length = elements * this.descriptor.Length; - if (read && !this.DB.HasDefaultShortSize) - { - length *= 2; - } - break; - - default: length = elements * this.descriptor.Length; - break; - } - - return length; - } - - protected System.Array GetArrayFromDesc(ref DbDataType type, ref Type systemType, int[] lengths, int[] lowerBounds) - { - systemType = this.GetSystemType(); switch (this.descriptor.DataType) { - case IscCodes.blr_text: - case IscCodes.blr_text2: - case IscCodes.blr_cstring: - case IscCodes.blr_cstring2: - // Char - type = DbDataType.Text; - break; - case IscCodes.blr_varying: case IscCodes.blr_varying2: - // VarChar - type = DbDataType.VarChar; - break; - - case IscCodes.blr_short: - // Short/Smallint - type = DbDataType.SmallInt; - break; - - case IscCodes.blr_long: - // Integer - type = DbDataType.Integer; - break; - - case IscCodes.blr_float: - // Float - type = DbDataType.Float; - break; - - case IscCodes.blr_double: - case IscCodes.blr_d_float: - // Double - type = DbDataType.Double; - break; - - case IscCodes.blr_quad: - case IscCodes.blr_int64: - // Long/Quad - type = DbDataType.BigInt; - break; - - case IscCodes.blr_timestamp: - // Timestamp - type = DbDataType.TimeStamp; - break; - - case IscCodes.blr_sql_time: - // Time - type = DbDataType.Time; - break; - - case IscCodes.blr_sql_date: - // Date - type = DbDataType.Date; + length += elements * 2; break; - - default: - throw new NotSupportedException("Unknown data type"); } - return System.Array.CreateInstance(systemType, lengths, lowerBounds); + return length; } protected Type GetSystemType() @@ -438,269 +357,6 @@ return sql.ToString(); } - private System.Array decodeSlice(byte[] slice) - { - System.Array sliceData = null; - int slicePosition = 0; - DbDataType type = DbDataType.Array; - Type systemType = null; - int temp = 0; - Encoding encoding = DB.Parameters.Charset.Encoding; - int[] lengths = new int[this.descriptor.Dimensions]; - int[] lowerBounds = new int[this.descriptor.Dimensions]; - - // Get upper and lower bounds of each dimension - for (int i = 0; i < this.descriptor.Dimensions; i++) - { - lowerBounds[i] = this.descriptor.Bounds[i].LowerBound; - lengths[i] = this.descriptor.Bounds[i].UpperBound; - } - - sliceData = this.GetArrayFromDesc( - ref type, ref systemType, lengths, lowerBounds); - - System.Array tempData = System.Array.CreateInstance( - systemType, sliceData.Length); - - for (int i = 0; i < tempData.Length; i++) - { - if (slicePosition >= slice.Length) - { - break; - } - int itemLength = this.descriptor.Length; - - switch(type) - { - case DbDataType.Text: - { - // Char - string strValue = encoding.GetString( - slice, slicePosition, itemLength); - - tempData.SetValue(strValue, i); - } - break; - - case DbDataType.VarChar: - { - // VarChar - itemLength = BitConverter.ToInt32(slice, slicePosition); - - if (!this.DB.IsLittleEndian) - { - itemLength = IPAddress.HostToNetworkOrder(itemLength); - } - slicePosition += 4; - - string strValue = encoding.GetString( - slice, slicePosition, itemLength); - - tempData.SetValue(strValue, i); - } - break; - - case DbDataType.SmallInt: - { - // Smallint - int sintValue; - - if (this.DB.HasDefaultShortSize) - { - sintValue = BitConverter.ToInt16(slice, slicePosition); - } - else - { - sintValue = BitConverter.ToInt32(slice, slicePosition); - slicePosition += 2; - } - - if (!this.DB.IsLittleEndian) - { - sintValue = IPAddress.HostToNetworkOrder(sintValue); - } - - if (this.descriptor.Scale < 0) - { - decimal dvalue = TypeDecoder.DecodeDecimal( - sintValue, - this.descriptor.Scale, - IscCodes.SQL_SHORT); - - tempData.SetValue(dvalue, i); - } - else - { - tempData.SetValue(Convert.ToInt16(sintValue), i); - } - } - break; - - case DbDataType.Integer: - { - // Integer - int intValue = BitConverter.ToInt32(slice, slicePosition); - - if (!this.DB.IsLittleEndian) - { - intValue = IPAddress.HostToNetworkOrder(intValue); - } - - if (this.descriptor.Scale < 0) - { - decimal dvalue = TypeDecoder.DecodeDecimal( - intValue, - this.descriptor.Scale, - IscCodes.SQL_LONG); - - tempData.SetValue(dvalue, i); - } - else - { - tempData.SetValue(intValue, i); - } - } - break; - - case DbDataType.BigInt: - { - // BigInt/Long - long bintValue = BitConverter.ToInt64(slice, slicePosition); - - if (!this.DB.IsLittleEndian) - { - bintValue = IPAddress.HostToNetworkOrder(bintValue); - } - - if (this.descriptor.Scale < 0) - { - decimal dvalue = TypeDecoder.DecodeDecimal( - bintValue, - this.descriptor.Scale, - IscCodes.SQL_INT64); - - tempData.SetValue(dvalue, i); - } - else - { - tempData.SetValue(bintValue, i); - } - } - break; - - case DbDataType.Double: - { - // Double - DoubleLayout dlayout = new DoubleLayout(); - - dlayout.d = BitConverter.ToDouble(slice, slicePosition); - if (!this.DB.IsLittleEndian) - { - dlayout.i0 = IPAddress.HostToNetworkOrder(dlayout.i0); - dlayout.i4 = IPAddress.HostToNetworkOrder(dlayout.i4); - - temp = dlayout.i0; - dlayout.i0 = dlayout.i4; - dlayout.i4 = temp; - } - - tempData.SetValue(dlayout.d, i); - } - break; - - case DbDataType.Float: - { - // Float - FloatLayout flayout = new FloatLayout(); - - int intValue = BitConverter.ToInt32(slice, slicePosition); - if (!this.DB.IsLittleEndian) - { - intValue = IPAddress.HostToNetworkOrder(intValue); - } - flayout.i0 = intValue; - - tempData.SetValue(flayout.f, i); - } - break; - - case DbDataType.TimeStamp: - { - // TimeStamp - int idate = BitConverter.ToInt32(slice, slicePosition); - if (!this.DB.IsLittleEndian) - { - idate = IPAddress.HostToNetworkOrder(idate); - } - - int itime = BitConverter.ToInt32(slice, slicePosition + 4); - if (!this.DB.IsLittleEndian) - { - itime = IPAddress.HostToNetworkOrder(itime); - } - - DateTime date = TypeDecoder.DecodeDate(idate); - DateTime time = TypeDecoder.DecodeTime(itime); - - DateTime timestamp = new System.DateTime( - date.Year, date.Month, date.Day, - time.Hour,time.Minute, time.Second, time.Millisecond); - - - tempData.SetValue(timestamp, i); - } - break; - - case DbDataType.Time: - { - // Time - int itime = BitConverter.ToInt32(slice, slicePosition); - - if (!this.DB.IsLittleEndian) - { - itime = IPAddress.HostToNetworkOrder(itime); - } - - DateTime time = TypeDecoder.DecodeTime(itime); - - tempData.SetValue(time, i); - } - break; - - case DbDataType.Date: - { - // Date - int idate = BitConverter.ToInt32(slice, slicePosition); - - if (!this.DB.IsLittleEndian) - { - idate = IPAddress.HostToNetworkOrder(idate); - } - - DateTime date = TypeDecoder.DecodeDate(idate); - - tempData.SetValue(date, i); - } - break; - } - - slicePosition += itemLength; - } - - if (systemType.IsPrimitive) - { - // For primitive types we can use System.Buffer to copy generated data to destination array - System.Buffer.BlockCopy( - tempData, 0, sliceData, 0, System.Buffer.ByteLength(tempData)); - } - else - { - sliceData = tempData; - } - - return sliceData; - } - #endregion } } \ No newline at end of file Index: Charset.cs =================================================================== RCS file: /cvsroot/firebird/NETProvider/NETProvider_16/source/FirebirdSql.Data.Common/Charset.cs,v retrieving revision 1.4 retrieving revision 1.5 diff -b -U3 -r1.4 -r1.5 --- Charset.cs 19 Feb 2004 11:50:56 -0000 1.4 +++ Charset.cs 1 Mar 2004 16:28:33 -0000 1.5 @@ -41,6 +41,11 @@ get { return Charset.supportedCharsets; } } + public static Charset DefaultCharset + { + get { return Charset.SupportedCharsets[0]; } + } + #endregion #region Fields Index: DbField.cs =================================================================== RCS file: /cvsroot/firebird/NETProvider/NETProvider_16/source/FirebirdSql.Data.Common/DbField.cs,v retrieving revision 1.8 retrieving revision 1.9 diff -b -U3 -r1.8 -r1.9 --- DbField.cs 25 Feb 2004 13:30:04 -0000 1.8 +++ DbField.cs 1 Mar 2004 16:28:33 -0000 1.9 @@ -30,6 +30,7 @@ { #region Fields + private DbDataType dbDataType; private short dataType; private short numericScale; private short subType; @@ -48,6 +49,11 @@ #region Properties + public DbDataType DbDataType + { + get { return this.dbDataType; } + } + public int SqlType { get { return this.dataType & ~1; } @@ -56,7 +62,11 @@ public short DataType { get { return this.dataType; } - set { this.dataType = value; } + set + { + this.dataType = value; + this.dbDataType = this.getDbDataType(); + } } public short NumericScale @@ -196,6 +206,59 @@ #region Static Methods + public static int GetFbTypeFromBlr(int blrType) + { + switch (blrType) + { + case IscCodes.blr_varying: + case IscCodes.blr_varying2: + return IscCodes.SQL_VARYING; + + case IscCodes.blr_text: + case IscCodes.blr_text2: + case IscCodes.blr_cstring: + case IscCodes.blr_cstring2: + return IscCodes.SQL_TEXT; + + case IscCodes.blr_short: + return IscCodes.SQL_SHORT; + + case IscCodes.blr_long: + return IscCodes.SQL_LONG; + + case IscCodes.blr_quad: + return IscCodes.SQL_QUAD; + + case IscCodes.blr_int64: + case IscCodes.blr_blob_id: + return IscCodes.SQL_INT64; + + case IscCodes.blr_double: + return IscCodes.SQL_DOUBLE; + + case IscCodes.blr_d_float: + return IscCodes.SQL_D_FLOAT; + + case IscCodes.blr_float: + return IscCodes.SQL_FLOAT; + + case IscCodes.blr_sql_date: + return IscCodes.SQL_TYPE_DATE; + + case IscCodes.blr_sql_time: + return IscCodes.SQL_TYPE_TIME; + + case IscCodes.blr_timestamp: + return IscCodes.SQL_TIMESTAMP; + + case IscCodes.blr_blob: + return IscCodes.SQL_BLOB; + + default: + throw new SystemException("Invalid data type"); + } + } + public static DbDataType GetDbDataTypeFromBlr(int blrType) { switch (blrType) @@ -206,7 +269,7 @@ case IscCodes.blr_text: case IscCodes.blr_text2: - return DbDataType.Text; + return DbDataType.Char; case IscCodes.blr_cstring: case IscCodes.blr_cstring2: @@ -486,7 +549,111 @@ } } - public DbDataType GetDbDataType() + public bool IsNumeric() + { + switch (this.SqlType) + { + case IscCodes.SQL_SHORT: + case IscCodes.SQL_LONG: + case IscCodes.SQL_FLOAT: + case IscCodes.SQL_DOUBLE: + case IscCodes.SQL_D_FLOAT: + case IscCodes.SQL_QUAD: + case IscCodes.SQL_INT64: + return true; + + case IscCodes.SQL_TEXT: + case IscCodes.SQL_VARYING: + case IscCodes.SQL_BLOB: + case IscCodes.SQL_ARRAY: + case IscCodes.SQL_TIMESTAMP: + case IscCodes.SQL_TYPE_TIME: + case IscCodes.SQL_TYPE_DATE: + default: + return false; + } + } + + public bool IsLong() + { + switch (this.SqlType) + { + case IscCodes.SQL_BLOB: + return true; + + case IscCodes.SQL_ARRAY: + case IscCodes.SQL_TEXT: + case IscCodes.SQL_VARYING: + case IscCodes.SQL_TIMESTAMP: + case IscCodes.SQL_TYPE_TIME: + case IscCodes.SQL_TYPE_DATE: + case IscCodes.SQL_SHORT: + case IscCodes.SQL_LONG: + case IscCodes.SQL_FLOAT: + case IscCodes.SQL_DOUBLE: + case IscCodes.SQL_D_FLOAT: + case IscCodes.SQL_QUAD: + case IscCodes.SQL_INT64: + default: + return false; + } + } + + public bool IsCharacter() + { + switch (this.SqlType) + { + case IscCodes.SQL_TEXT: + case IscCodes.SQL_VARYING: + return true; + + case IscCodes.SQL_ARRAY: + case IscCodes.SQL_BLOB: + case IscCodes.SQL_TIMESTAMP: + case IscCodes.SQL_TYPE_TIME: + case IscCodes.SQL_TYPE_DATE: + case IscCodes.SQL_SHORT: + case IscCodes.SQL_LONG: + case IscCodes.SQL_FLOAT: + case IscCodes.SQL_DOUBLE: + case IscCodes.SQL_D_FLOAT: + case IscCodes.SQL_QUAD: + case IscCodes.SQL_INT64: + default: + return false; + } + } + + public bool IsArray() + { + switch (this.SqlType) + { + case IscCodes.SQL_ARRAY: + return true; + + case IscCodes.SQL_TEXT: + case IscCodes.SQL_VARYING: + case IscCodes.SQL_BLOB: + case IscCodes.SQL_TIMESTAMP: + case IscCodes.SQL_TYPE_TIME: + case IscCodes.SQL_TYPE_DATE: + case IscCodes.SQL_SHORT: + case IscCodes.SQL_LONG: + case IscCodes.SQL_FLOAT: + case IscCodes.SQL_DOUBLE: + case IscCodes.SQL_D_FLOAT: + case IscCodes.SQL_QUAD: + case IscCodes.SQL_INT64: + default: + return false; + } + } + + #endregion + + #region Private Methods + + private DbDataType getDbDataType() { switch (this.SqlType) { @@ -558,7 +725,7 @@ } else { - return DbDataType.LongVarBinary; + return DbDataType.Binary; } case IscCodes.SQL_QUAD: @@ -596,106 +763,6 @@ } } - public bool IsNumeric() - { - switch (this.SqlType) - { - case IscCodes.SQL_SHORT: - case IscCodes.SQL_LONG: - case IscCodes.SQL_FLOAT: - case IscCodes.SQL_DOUBLE: - case IscCodes.SQL_D_FLOAT: - case IscCodes.SQL_QUAD: - case IscCodes.SQL_INT64: - return true; - - case IscCodes.SQL_TEXT: - case IscCodes.SQL_VARYING: - case IscCodes.SQL_BLOB: - case IscCodes.SQL_ARRAY: - case IscCodes.SQL_TIMESTAMP: - case IscCodes.SQL_TYPE_TIME: - case IscCodes.SQL_TYPE_DATE: - default: - return false; - } - } - - public bool IsLong() - { - switch (this.SqlType) - { - case IscCodes.SQL_BLOB: - return true; - - case IscCodes.SQL_ARRAY: - case IscCodes.SQL_TEXT: - case IscCodes.SQL_VARYING: - case IscCodes.SQL_TIMESTAMP: - case IscCodes.SQL_TYPE_TIME: - case IscCodes.SQL_TYPE_DATE: - case IscCodes.SQL_SHORT: - case IscCodes.SQL_LONG: - case IscCodes.SQL_FLOAT: - case IscCodes.SQL_DOUBLE: - case IscCodes.SQL_D_FLOAT: - case IscCodes.SQL_QUAD: - case IscCodes.SQL_INT64: - default: - return false; - } - } - - public bool IsCharacter() - { - switch (this.SqlType) - { - case IscCodes.SQL_TEXT: - case IscCodes.SQL_VARYING: - return true; - - case IscCodes.SQL_ARRAY: - case IscCodes.SQL_BLOB: - case IscCodes.SQL_TIMESTAMP: - case IscCodes.SQL_TYPE_TIME: - case IscCodes.SQL_TYPE_DATE: - case IscCodes.SQL_SHORT: - case IscCodes.SQL_LONG: - case IscCodes.SQL_FLOAT: - case IscCodes.SQL_DOUBLE: - case IscCodes.SQL_D_FLOAT: - case IscCodes.SQL_QUAD: - case IscCodes.SQL_INT64: - default: - return false; - } - } - - public bool IsArray() - { - switch (this.SqlType) - { - case IscCodes.SQL_ARRAY: - return true; - - case IscCodes.SQL_TEXT: - case IscCodes.SQL_VARYING: - case IscCodes.SQL_BLOB: - case IscCodes.SQL_TIMESTAMP: - case IscCodes.SQL_TYPE_TIME: - case IscCodes.SQL_TYPE_DATE: - case IscCodes.SQL_SHORT: - case IscCodes.SQL_LONG: - case IscCodes.SQL_FLOAT: - case IscCodes.SQL_DOUBLE: - case IscCodes.SQL_D_FLOAT: - case IscCodes.SQL_QUAD: - case IscCodes.SQL_INT64: - default: - return false; - } - } - #endregion } } \ No newline at end of file |