Skip to content

Commit

Permalink
** Various ODBC fixes from trunk
Browse files Browse the repository at this point in the history
svn path=/branches/mono-1-9/mcs/; revision=97238
  • Loading branch information
vvaradhan committed Mar 3, 2008
1 parent 2cc0acb commit 54df38d
Show file tree
Hide file tree
Showing 7 changed files with 96 additions and 16 deletions.
53 changes: 53 additions & 0 deletions mcs/class/System.Data/System.Data.Odbc/ChangeLog
@@ -1,3 +1,56 @@
2008-03-03 Veerapuram Varadhan <vvaradhan@novell.com>

** Fixes Bug#324025
* OdbcDataReader (GetString): Use Convert.ToString() to return
appropriate typed values.
(GetValue): Fixes a regression.

2008-03-03 Veerapuram Varadhan <vvaradhan@novell.com>

* OdbcCommandBuilder.cs: Clean up.

2008-03-03 Veerapuram Varadhan <vvaradhan@novell.com>

** Fixes Bug#340451 - patch provided by Ernesto Carrea
<equistango@gmail.com>
* OdbcConnection.cs (GetInfo): Trim the value to actual length
returned by libodbc.

2008-03-03 Veerapuram Varadhan <vvaradhan@novell.com>

** Fixes from BNC#332809 - patch provided by Ernesto Carrea
<equistango@gmail.com>
* OdbcParameter.cs (Bind): Do not allocate buffer if value is
DBNull.
* OdbcTypeConverter.cs (InferFromValue): Incase of DBNull, do not
throw exception, instead return NVarChar to match MS.NET
implementation.

2008-02-26 Veerapuram Varadhan <vvaradhan@novell.com>

** Fixes BNC#364432.
* OdbcParameter.cs: (Bind): Set StrLen parameter of
SQLBindParameter to reflect NullData in case of DBNull.
(CopyValue): If Value is DBNull.Value, just don't try any
heroics.

2008-02-25 Veerapuram Varadhan <vvaradhan@novell.com>

** Fixes BNC#364426.
* OdbcDataReader.cs: (GetValue): Map OdbcType.Time to
System.TimeSpan.

* OdbcTypeConverter.cs: (GetTypeMap): Map OdbcType.Time and
SqlType.TIME to corresponding types.

* OdbcColumn.cs: -- ditto --

2008-02-20 Veerapuram Varadhan <vvaradhan@novell.com>

* OdbcDataReader.cs: (GetValue): Handle cases when certain
ODBC drivers return unexpected results. Fixes #326740. Patch
provided by Mark Junker <mjscod@gmx.de>.

2008-01-16 Veerapuram Varadhan <vvaradhan@novell.com>

* OdbcCommandBuilder.cs: Implemented 2.0 APIs and code
Expand Down
1 change: 1 addition & 0 deletions mcs/class/System.Data/System.Data.Odbc/OdbcColumn.cs
Expand Up @@ -81,6 +81,7 @@ internal Type DataType
case OdbcType.Char:
return typeof (string);
case OdbcType.Time:
return typeof (TimeSpan);
case OdbcType.Timestamp:
case OdbcType.DateTime:
case OdbcType.Date:
Expand Down
Expand Up @@ -630,7 +630,6 @@ private void OnRowUpdating (object sender, OdbcRowUpdatingEventArgs args)
{
if (args.Command != null)
return;
Console.WriteLine (Environment.StackTrace);
try {
switch (args.StatementType) {
case StatementType.Insert:
Expand Down
2 changes: 1 addition & 1 deletion mcs/class/System.Data/System.Data.Odbc/OdbcConnection.cs
Expand Up @@ -470,7 +470,7 @@ internal string GetInfo (OdbcInfo info)
OdbcHandleType.Dbc,
hdbc));

return System.Text.Encoding.Default.GetString (buffer);
return System.Text.Encoding.Default.GetString (buffer).Substring (0, actualLength);
}

private void RaiseStateChange (ConnectionState from, ConnectionState to)
Expand Down
32 changes: 24 additions & 8 deletions mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs
Expand Up @@ -598,7 +598,12 @@ DataTable GetSchemaTable()
#endif // NET_2_0
string GetString (int ordinal)
{
return (string) GetValue (ordinal);
object ret = GetValue (ordinal);

if (ret != null && ret.GetType () != typeof (string))
return (string) Convert.ToString (ret);
else
return (string) GetValue (ordinal);
}

[MonoTODO]
Expand Down Expand Up @@ -682,7 +687,10 @@ object GetValue (int ordinal)
ret = libodbc.SQLGetData (hstmt, ColIndex, col.SqlCType, buffer, bufsize, ref outsize);
if (ret == OdbcReturn.Error)
break;
if (ret != OdbcReturn.NoData && outsize!=-1) {
// Fix for strance ODBC drivers (like psqlODBC)
if (ret == OdbcReturn.Success && outsize==-1)
ret = OdbcReturn.NoData;
if (ret != OdbcReturn.NoData && outsize > 0) {
if (outsize < bufsize)
sb.Append (System.Text.Encoding.Unicode.GetString(buffer,0,outsize));
else
Expand All @@ -700,7 +708,10 @@ object GetValue (int ordinal)
ret = libodbc.SQLGetData (hstmt, ColIndex, col.SqlCType, buffer, bufsize, ref outsize);
if (ret == OdbcReturn.Error)
break;
if (ret != OdbcReturn.NoData && outsize!=-1) {
// Fix for strance ODBC drivers (like psqlODBC)
if (ret == OdbcReturn.Success && outsize==-1)
ret = OdbcReturn.NoData;
if (ret != OdbcReturn.NoData && outsize > 0) {
if (outsize < bufsize)
sb1.Append (System.Text.Encoding.Default.GetString(buffer,0,outsize));
else
Expand All @@ -726,11 +737,16 @@ object GetValue (int ordinal)
OdbcTimestamp ts_data = new OdbcTimestamp();
ret = libodbc.SQLGetData (hstmt, ColIndex, col.SqlCType, ref ts_data, 0, ref outsize);
if (outsize != -1) {// This means SQL_NULL_DATA
DataValue = new DateTime(ts_data.year, ts_data.month,
ts_data.day, ts_data.hour, ts_data.minute,
ts_data.second);
if (ts_data.fraction != 0)
DataValue = ((DateTime) DataValue).AddTicks ((long)ts_data.fraction / 100);
if (col.OdbcType == OdbcType.Time) {
// libodbc returns value in first three fields for OdbcType.Time
DataValue = new System.TimeSpan (ts_data.year, ts_data.month, ts_data.day);
} else {
DataValue = new DateTime(ts_data.year, ts_data.month,
ts_data.day, ts_data.hour, ts_data.minute,
ts_data.second);
if (ts_data.fraction != 0)
DataValue = ((DateTime) DataValue).AddTicks ((long)ts_data.fraction / 100);
}
}
break;
case OdbcType.VarBinary :
Expand Down
17 changes: 14 additions & 3 deletions mcs/class/System.Data/System.Data.Odbc/OdbcParameter.cs
Expand Up @@ -313,15 +313,23 @@ public OdbcParameter (string name, OdbcType odbcType, int size, string srcColumn

internal void Bind(IntPtr hstmt, int ParamNum) {
OdbcReturn ret;
int len;

// Convert System.Data.ParameterDirection into odbc enum
OdbcInputOutputDirection paramdir = libodbc.ConvertParameterDirection(this.Direction);

_cbLengthInd.EnsureAlloc (Marshal.SizeOf (typeof (int)));
Marshal.WriteInt32 (_cbLengthInd, GetNativeSize ());
AllocateBuffer ();
if (Value is DBNull)
len = (int)OdbcLengthIndicator.NullData;
else {
len = GetNativeSize ();
AllocateBuffer ();
}

Marshal.WriteInt32 (_cbLengthInd, len);
ret = libodbc.SQLBindParameter(hstmt, (ushort) ParamNum, (short) paramdir,
_typeMap.NativeType, _typeMap.SqlType, Convert.ToUInt32(Size),
_typeMap.NativeType, _typeMap.SqlType,
Convert.ToUInt32(Size),
0, (IntPtr) _nativeBuffer, 0, _cbLengthInd);

// Check for error condition
Expand Down Expand Up @@ -416,6 +424,9 @@ internal void CopyValue ()
if (_nativeBuffer.Handle == IntPtr.Zero)
return;

if (Value is DBNull)
return;

DateTime dt;
TextInfo ti = CultureInfo.InvariantCulture.TextInfo;
Encoding enc = Encoding.GetEncoding (ti.ANSICodePage);
Expand Down
6 changes: 3 additions & 3 deletions mcs/class/System.Data/System.Data.Odbc/OdbcTypeConverter.cs
Expand Up @@ -60,8 +60,7 @@ public static OdbcTypeMap InferFromValue (object value)
case TypeCode.Empty:
case TypeCode.Object:
case TypeCode.DBNull:
throw new ArgumentException (String.Format ("Infering OdbcType from {0} is not supported",
Type.GetTypeCode (value.GetType ())));
return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.NVarChar]; //Default to NVarChar as in MS.net. OdbcParameter.Bind() will take care.
case TypeCode.Boolean:
return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Bit];
case TypeCode.Char:
Expand Down Expand Up @@ -142,13 +141,14 @@ public static OdbcTypeMap GetTypeMap (SQL_TYPE sqlType)
return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Real];
case SQL_TYPE.SMALLINT:
return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.SmallInt];
case SQL_TYPE.TYPE_TIME:
case SQL_TYPE.TIME:
return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Time];
case SQL_TYPE.TIMESTAMP:
return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.DateTime];
case SQL_TYPE.TINYINT:
return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.TinyInt];
case SQL_TYPE.TYPE_DATE:
case SQL_TYPE.TYPE_TIME:
case SQL_TYPE.TYPE_TIMESTAMP:
return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.DateTime];
case SQL_TYPE.VARBINARY:
Expand Down

0 comments on commit 54df38d

Please sign in to comment.