Beispiel #1
0
        internal static SqlBytes GetSqlBytes( SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, SmiContext context ) {
            SqlBytes result;
            if ( CanAccessGetterDirectly( metaData, ExtendedClrTypeCode.SqlBytes ) ) {
                if ( IsDBNull_Unchecked( sink, getters, ordinal ) ) {
                    result = SqlBytes.Null;
                }
                else {
                    long length = GetBytesLength_Unchecked( sink, getters, ordinal );
                    if ( 0 <= length && length < __maxByteChunkSize ) {
                        byte[] byteBuffer = GetByteArray_Unchecked( sink, getters, ordinal );
                        result = new SqlBytes( byteBuffer );
                    }
                    else {
                        Stream s = new SmiGettersStream( sink, getters, ordinal, metaData );
                        s = CopyIntoNewSmiScratchStream( s, sink, context );
                        result = new SqlBytes( s );
                    }
                }
            }
            else {
                object obj = GetSqlValue( sink, getters, ordinal, metaData, null  );
                if (null == obj) {
                    throw ADP.InvalidCast();
                }
                SqlBinary binaryVal = (SqlBinary) obj;
                if ( binaryVal.IsNull ) {
                    result = SqlBytes.Null;
                }
                else {
                    result = new SqlBytes( binaryVal.Value );
                }
            }

            return result;
        }
Beispiel #2
0
        internal static SqlChars GetSqlChars( SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, SmiContext context ) {
            SqlChars result;
            if ( CanAccessGetterDirectly( metaData, ExtendedClrTypeCode.SqlChars ) ) {
                if ( IsDBNull_Unchecked( sink, getters, ordinal ) ) {
                    result = SqlChars.Null;
                }
                else {
                    long length = GetCharsLength_Unchecked( sink, getters, ordinal );
                    if ( length < __maxCharChunkSize || !InOutOfProcHelper.InProc) {
                        char[] charBuffer = GetCharArray_Unchecked( sink, getters, ordinal );
                        result = new SqlChars( charBuffer );
                    }
                    else {    // InProc only
                        Stream s = new SmiGettersStream( sink, getters, ordinal, metaData );
                        SqlStreamChars sc = CopyIntoNewSmiScratchStreamChars( s, sink, context );
                        result = new SqlChars( sc );
                    }
                }
            }
            else {
                SqlString stringValue;
                if (SqlDbType.Xml == metaData.SqlDbType) {
                    SqlXml xmlValue = GetSqlXml_Unchecked( sink, getters, ordinal, null );

                    if (xmlValue.IsNull) {
                        result = SqlChars.Null;
                    }
                    else {
                        result = new SqlChars( xmlValue.Value.ToCharArray() );
                    }
                }
                else {
                    object obj = GetSqlValue( sink, getters, ordinal, metaData, null  );
                    if (null == obj) {
                        throw ADP.InvalidCast();
                    }
                    stringValue = (SqlString) obj;

                    if ( stringValue.IsNull ) {
                        result = SqlChars.Null;
                    }
                    else {
                        result = new SqlChars( stringValue.Value.ToCharArray() );
                    }
                }
            }

            return result;
        }
Beispiel #3
0
 //
 //  Common utility code to get lengths correct for trimming
 //
     private static object GetUdt_LengthChecked( SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData ) {
         object result;
         if (IsDBNull_Unchecked(sink, getters, ordinal)) {
             Type t = metaData.Type;
             Debug.Assert(t != null, "Unexpected null of udtType on GetUdt_LengthChecked!");
             result = t.InvokeMember("Null", BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Static, null, null, new Object[]{}, CultureInfo.InvariantCulture);
             Debug.Assert(result != null);
         }
         else {
             // Note: do not need to copy getter stream, since it will not be used beyond
             //  deserialization (valid lifetime of getters is limited).
             Stream s = new SmiGettersStream( sink, getters, ordinal, metaData );
             result = SerializationHelperSql9.Deserialize( s, metaData.Type );
         }
         return result;
     }
Beispiel #4
0
        private static SqlXml GetSqlXml_Unchecked( SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiContext context ) {
            Debug.Assert( !IsDBNull_Unchecked( sink, getters, ordinal ) );

            // allow context to be null so strongly-typed getters can use
            //  this method without having to pass along the almost-never-used context as a parameter
            //  Looking the context up like this will be slightly slower, but still correct behavior
            //  since it's only used to get a scratch stream.
            if (null == context && InOutOfProcHelper.InProc) {
                context = SmiContextFactory.Instance.GetCurrentContext();    // In the future we need to push the context checking to a higher level
            }

            // Note: must make a copy of getter stream, since it will be used beyond
            //  this method (valid lifetime of getters is limited).
            Stream s = new SmiGettersStream( sink, getters, ordinal, SmiMetaData.DefaultXml );
            Stream copy = ValueUtilsSmi.CopyIntoNewSmiScratchStream( s, sink, context );
            SqlXml result = new SqlXml( copy );
            return result;
        }
Beispiel #5
0
        private static SqlXml GetSqlXml_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal)
        {
            Debug.Assert(!IsDBNull_Unchecked(sink, getters, ordinal));


            // Note: must make a copy of getter stream, since it will be used beyond
            //  this method (valid lifetime of getters is limited).
            Stream s = new SmiGettersStream(sink, getters, ordinal, SmiMetaData.DefaultXml);
            Stream copy = ValueUtilsSmi.CopyIntoNewSmiScratchStream(s, sink);
            SqlXml result = new SqlXml(copy);
            return result;
        }
 private static object GetUdt_LengthChecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData)
 {
     if (IsDBNull_Unchecked(sink, getters, ordinal))
     {
         return metaData.Type.InvokeMember("Null", BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Static, null, null, new object[0], CultureInfo.InvariantCulture);
     }
     Stream s = new SmiGettersStream(sink, getters, ordinal, metaData);
     return SerializationHelperSql9.Deserialize(s, metaData.Type);
 }
 private static SqlXml GetSqlXml_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiContext context)
 {
     if ((context == null) && InOutOfProcHelper.InProc)
     {
         context = SmiContextFactory.Instance.GetCurrentContext();
     }
     Stream source = new SmiGettersStream(sink, getters, ordinal, SmiMetaData.DefaultXml);
     return new SqlXml(CopyIntoNewSmiScratchStream(source, sink, context));
 }
 internal static SqlChars GetSqlChars(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, SmiContext context)
 {
     if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlChars))
     {
         if (IsDBNull_Unchecked(sink, getters, ordinal))
         {
             return SqlChars.Null;
         }
         if ((GetCharsLength_Unchecked(sink, getters, ordinal) < 0xfa0L) || !InOutOfProcHelper.InProc)
         {
             return new SqlChars(GetCharArray_Unchecked(sink, getters, ordinal));
         }
         Stream source = new SmiGettersStream(sink, getters, ordinal, metaData);
         return new SqlChars(CopyIntoNewSmiScratchStreamChars(source, sink, context));
     }
     if (SqlDbType.Xml == metaData.SqlDbType)
     {
         SqlXml xml = GetSqlXml_Unchecked(sink, getters, ordinal, null);
         if (xml.IsNull)
         {
             return SqlChars.Null;
         }
         return new SqlChars(xml.Value.ToCharArray());
     }
     object obj2 = GetSqlValue(sink, getters, ordinal, metaData, null);
     if (obj2 == null)
     {
         throw ADP.InvalidCast();
     }
     SqlString str = (SqlString) obj2;
     if (str.IsNull)
     {
         return SqlChars.Null;
     }
     return new SqlChars(str.Value.ToCharArray());
 }
 internal static SqlBytes GetSqlBytes(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, SmiContext context)
 {
     if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlBytes))
     {
         if (IsDBNull_Unchecked(sink, getters, ordinal))
         {
             return SqlBytes.Null;
         }
         long num = GetBytesLength_Unchecked(sink, getters, ordinal);
         if ((0L <= num) && (num < 0x1f40L))
         {
             return new SqlBytes(GetByteArray_Unchecked(sink, getters, ordinal));
         }
         Stream source = new SmiGettersStream(sink, getters, ordinal, metaData);
         return new SqlBytes(CopyIntoNewSmiScratchStream(source, sink, context));
     }
     object obj2 = GetSqlValue(sink, getters, ordinal, metaData, null);
     if (obj2 == null)
     {
         throw ADP.InvalidCast();
     }
     SqlBinary binary = (SqlBinary) obj2;
     if (binary.IsNull)
     {
         return SqlBytes.Null;
     }
     return new SqlBytes(binary.Value);
 }