Пример #1
0
        /*
        ** Name: allocateRowBuffer
        **
        ** Description:
        **	Allocate the column data array for a row and populate
        **	the array with a SqlData object for each column based
        **	on the column data type.
        **
        ** Input:
        **	rsmd		Row-set Meta-data.
        **
        ** Output:
        **	None.
        **
        ** Returns:
        **	SqlData[]	Column data array.
        **
        ** History:
        **	14-May-99 (gordy)
        **	    Created.
        **	10-May-01 (gordy)
        **	    The character datatypes (CHAR, VARCHAR, LONGVARCHAR) may now
        **	    be sent as UCS2 character arrays in addition to the existing
        **	    Ingres Character Set strings.  The DBMS datatype is used to
        **	    distinguish the transport format.
        **	31-Oct-02 (gordy)
        **	    Adapted for generic GCF driver.
        **	 4-Aug-03 (gordy)
        **	    Extracted from readData() to separate row and column processing.
        **	22-Sep-03 (gordy)
        **	    Changed to use SQL Data objects to hold column values.
        **	 6-Jan-04 (thoda04)
        **	    Added BigInt support.
        **	16-Jun-06 (gordy)
        **	    ANSI Date/Time data type support.
        **	 7-Dec-09 (gordy, ported by thoda04)
        **	    Support BOOLEAN columns.
        */
        private SqlData[] allocateRowBuffer( AdvanRSMD rsmd )
        {
            SqlData[] row = new SqlData[ rsmd.count ];

            for( int col = 0; col < rsmd.count; col++ )
            {
                switch( rsmd.desc[ col ].sql_type )
                {
                    case ProviderType.DBNull :	row[ col ] = new SqlNull();	break;
                    case ProviderType.TinyInt :	row[ col ] = new SqlTinyInt();	break;
                    case ProviderType.SmallInt:	row[ col ] = new SqlSmallInt();	break;
                    case ProviderType.Integer :	row[ col ] = new SqlInt();	break;
                    case ProviderType.BigInt:  	row[ col ] = new SqlBigInt();	break;
                    case ProviderType.Single :	row[ col ] = new SqlReal();	break;
                    case ProviderType.Double :	row[ col ] = new SqlDouble();	break;
                    case ProviderType.Numeric:
                    case ProviderType.Decimal :	row[ col ] = new SqlDecimal();	break;
                    case ProviderType.Boolean :	row[ col ] = new SqlBool();   	break;

                    case ProviderType.Date :	row[col] = new SqlDate(); break;

                    case ProviderType.Time:
                        row[col] = new SqlTime(rsmd.desc[col].dbms_type);
                        break;

                    case ProviderType.Interval:
                    case ProviderType.IntervalDayToSecond:
                    case ProviderType.IntervalYearToMonth:
                        row[col] = new SqlInterval(rsmd.desc[col].dbms_type);
                        break;

                    case ProviderType.DateTime:
                        switch (rsmd.desc[col].dbms_type)
                        {
                            case DBMS_TYPE_IDATE:
                                row[col] = new IngresDate(conn.osql_dates,
                                                 conn.timeValuesInGMT());
                                break;

                            default:
                                row[col] = new SqlTimestamp(rsmd.desc[col].dbms_type);
                                break;
                        }
                        break;

                    case ProviderType.Binary :
                        row[ col ] = new SqlByte( rsmd.desc[ col ].length );
                        break;

                    case ProviderType.VarBinary :
                        row[ col ] = new SqlVarByte( rsmd.desc[ col ].length );
                        break;

                    case ProviderType.Char :
                        if ( rsmd.desc[ col ].dbms_type != DBMS_TYPE_NCHAR )
                            row[ col ] = new SqlChar( msg.getCharSet(),
                                rsmd.desc[ col ].length );
                        else
                            row[ col ] = new SqlNChar(rsmd.desc[col].length / 2 );
                        break;

                    case ProviderType.VarChar :
                        if ( rsmd.desc[ col ].dbms_type != DBMS_TYPE_NVARCHAR )
                            row[col] = new SqlVarChar(msg.getCharSet(),
                                rsmd.desc[col].length );
                        else
                            row[col] = new SqlNVarChar( rsmd.desc[col].length / 2 );
                        break;

                    case ProviderType.LongVarBinary :
                        row[ col ] = new SqlLongByte( (SqlStream.IStreamListener)this );
                        break;

                    case ProviderType.LongVarChar :
                        if ( rsmd.desc[ col ].dbms_type != DBMS_TYPE_LONG_NCHAR )
                            row[ col ] = new SqlLongChar( msg.getCharSet(),
                                (SqlStream.IStreamListener)this );
                        else
                            row[ col ] = new SqlLongNChar(
                                (SqlStream.IStreamListener)this );
                        break;

                    default :
                        if ( trace.enabled( 1 ) )
                            trace.write( tr_id + ": unexpected SQL type " +
                                rsmd.desc[ col ].sql_type );
                        throw SqlEx.get( ERR_GC4002_PROTOCOL_ERR );
                }
            }

            return( row );
        }
Пример #2
0
 /*
 ** Name: readSqlData
 **
 ** Description:
 **	Reads a SqlByte data value from the current input message.
 **	Uses the IByteArray interface to load the SqlByte data value.
 **
 **	A SqlByte data value is composed of a data indicator byte
 **	which, if not NULL, may be followed by a binary byte array
 **	whose length is detemined by the fixed size of the SqlByte
 **	data value (the IByteArray valuelimit()).
 **
 ** Input:
 **	None.
 **
 ** Output:
 **	value	SQL data value.
 **
 ** Returns:
 **	void.
 **
 ** History:
 **	22-Sep-03 (gordy)
 **	    Created.
 */
 public void readSqlData( SqlByte value )
 {
     if ( ! readSqlDataIndicator() )	// Read data indicator byte.
         value.setNull();		// NULL data value.
     else
     {					// Read data value.
         int length = value.valuelimit();	// Fixed length from meta-data.
         value.clear();
         value.ensureCapacity( length );
         readBytes( (IByteArray)value, length );
     }
     return;
 }
Пример #3
0
 /*
 ** Name: set
 **
 ** Description:
 **	Assign a new data value as a copy of an existing
 **	SQL data object.  If the input is NULL, a NULL
 **	data value results.
 **
 ** Input:
 **	data	The SQL data to be copied.
 **
 ** Output:
 **	None.
 **
 ** Returns:
 **	void.
 **
 ** History:
 **	 1-Dec-03 (gordy)
 **	    Created.
 */
 public void set(SqlByte data)
 {
     if (data == null || data.isNull())
         setNull();
     else
     {
         clear();
         put(data.value, 0, data.length);
     }
     return;
 }
Пример #4
0
 /*
 ** Name: write
 **
 ** Description:
 **	Write a SqlByte data value to the current input message.
 **	Uses the ByteArray interface to send the SqlByte data value.
 **
 **	A SqlByte data value is composed of a data indicator byte
 **	which, if not NULL, may be followed by a binary byte array
 **	whose length is detemined by the length of the SqlByte data
 **	value.
 **
 ** Input:
 **	value	SQL data value.
 **
 ** Output:
 **	None.
 **
 ** Returns:
 **	void.
 **
 ** History:
 **	 1-Dec-03 (gordy)
 **	    Created.
 */
 public void write(SqlByte value)
 {
     if (writeSqlDataIndicator(value)) write((IByteArray)value);
     return;
 }
Пример #5
0
        /*
        ** Name: getStorage
        **
        ** Description:
        **	Allocates storage for SQL data values base on the SQL type
        **	and optional alternate storage format.  The class of the
        **	object returned is defined in the class description.
        **
        ** Input:
        **	sqlType		SQL type.
        **	alt		True for alternate storage format.
        **
        ** Output:
        **	None.
        **
        ** Returns:
        **	SqlData		SQL data value.
        **
        ** History:
        **	 1-Dec-03 (gordy)
        **	    Created.
        **	19-Jun-06 (gordy)
        **	    ANSI Date/Time data type support.  IngresDate is now
        **	    the alternate storage for DATE/TIME/TIMESTAMP and
        **	    SqlDate/SqlTime/SqlTimestamp are the primary storage.
        **	 3-Mar-10 (thoda04)  SIR 123368
        **	    Added support for IngresType.IngresDate parameter data type.
        */
        /// <summary>
        /// Allocates storage for SQL data values base on the SQL type
        /// and optional alternate storage format.  The class of the
        /// object returned is defined in the class description.
        /// </summary>
        /// <param name="sqlType">SQL type.</param>
        /// <param name="alt">True for alternate storage format.</param>
        /// <returns>SQL data value.</returns>
        private SqlData getStorage(ProviderType sqlType, bool alt)
        {
            SqlData sqlData;

            switch (sqlType)
            {
                case ProviderType.DBNull: sqlData = new SqlNull(); break;
                case ProviderType.TinyInt: sqlData = new SqlTinyInt(); break;
                case ProviderType.SmallInt: sqlData = new SqlSmallInt(); break;
                case ProviderType.Integer: sqlData = new SqlInt(); break;
                case ProviderType.Real: sqlData = new SqlReal(); break;
                case ProviderType.Double: sqlData = new SqlDouble(); break;
                case ProviderType.Binary: sqlData = new SqlByte(); break;
                case ProviderType.VarBinary: sqlData = new SqlVarByte(); break;
                case ProviderType.LongVarBinary: sqlData = new SqlLongByte(); break;

                case ProviderType.Boolean:
                    sqlData = alt ? (SqlData)(new SqlTinyInt())
                              : (SqlData)(new SqlBool());
                    break;

                case ProviderType.BigInt:
                    sqlData = alt ? (SqlData)(new SqlDouble())
                              : (SqlData)(new SqlBigInt());
                    break;

                case ProviderType.Decimal:
                    sqlData = alt ? (SqlData)(new SqlDouble())
                              : (SqlData)(new SqlDecimal());
                    break;

                case ProviderType.Char:
                    sqlData = alt ? (SqlData)(new SqlChar(msg.getCharSet()))
                              : (SqlData)(new SqlNChar());
                    break;

                case ProviderType.VarChar:
                    sqlData = alt ? (SqlData)(new SqlVarChar(msg.getCharSet()))
                              : (SqlData)(new SqlNVarChar());
                    break;

                case ProviderType.LongVarChar:
                    sqlData = alt ? (SqlData)(new SqlLongChar(msg.getCharSet()))
                              : (SqlData)(new SqlLongNChar());
                    break;

                case ProviderType.Date:
                    sqlData = alt ? (SqlData)(new IngresDate(conn.osql_dates,
                                          conn.timeValuesInGMT()))
                              : (SqlData)(new SqlDate());
                    break;

                case ProviderType.Time:
                    sqlData = alt ? (SqlData)(new IngresDate(conn.osql_dates,
                                          conn.timeValuesInGMT()))
                              : (SqlData)(new SqlTime(
                            conn.osql_dates ? DBMS_TYPE_TMWO : DBMS_TYPE_TMTZ));
                    break;

                case ProviderType.DateTime:
                case ProviderType.IngresDate:
                    sqlData = alt ? (SqlData)(new IngresDate(conn.osql_dates,
                                          conn.timeValuesInGMT()))
                              : (SqlData)(new SqlTimestamp(
                            conn.osql_dates ? DBMS_TYPE_TSWO : DBMS_TYPE_TSTZ));
                    break;

                default:
                    throw SqlEx.get(ERR_GC401A_CONVERSION_ERR);
            }

            return (sqlData);
        }
Пример #6
0
        /*
        ** Name: getGeneratedKeys
        **
        ** Description:
        **	Retrieve table and/or object keys
        **
        ** Input:
        **	None.
        **
        ** Output:
        **	None.
        **
        ** Returns:
        **	ResultSet   Result-set containing table/object keys
        **
        ** History:
        **	21-Feb-03 (gordy)
        **	    Created.
        **	 3-Jul-03 (gordy)
        **	    Set DBMS types to LOGKEY/TBLKEY.
        **	26-Sep-03 (gordy)
        **	    Result-set data now stored as SqlByte SqlData objects.
        */
        public AdvanRslt getGeneratedKeys()
        {
            lock(this)
            {
                ResultSet	rs = rsEmpty;
                SqlData[][]	data;
                SqlByte	bytes;

                if ( rslt_tblkey )
                    if ( rslt_objkey )
                    {
                        if ( rsmdKeys == null )
                        {
                            rsmdKeys = new AdvanRSMD( (short)2, trace );
                            rsmdKeys.setColumnInfo( "table_key", 1, (int)Types.BINARY,
                                (short)DBMS_TYPE_TBLKEY,
                                (short)MSG_RPV_TBLKEY_LEN,
                                (byte)0, (byte)0, false );
                            rsmdKeys.setColumnInfo( "object_key", 2, (int)Types.BINARY,
                                (short)DBMS_TYPE_LOGKEY,
                                (short)MSG_RPV_OBJKEY_LEN,
                                (byte)0, (byte)0, false );
                        }

                        data = new SqlData[1][];
                        data[0] = new SqlData[2];

                        bytes = new SqlByte( MSG_RPV_TBLKEY_LEN );
                        bytes.put( rslt_val_tblkey );
                        data[0][0] = bytes;

                        bytes = new SqlByte( MSG_RPV_OBJKEY_LEN );
                        bytes.put( rslt_val_objkey );
                        data[0][1] = bytes;

                        rs = new RsltData( conn, rsmdKeys, data );
                    }
                    else
                    {
                        if ( rsmdTblKey == null )
                        {
                            rsmdTblKey = new AdvanRSMD( (short)1, trace );
                            rsmdTblKey.setColumnInfo( "table_key", 1, (int)Types.BINARY,
                                (short)DBMS_TYPE_TBLKEY,
                                (short)MSG_RPV_TBLKEY_LEN,
                                (byte)0, (byte)0, false );
                        }

                        data = new SqlData[1][];
                        data[0] = new SqlData[1];

                        bytes = new SqlByte( MSG_RPV_TBLKEY_LEN );
                        bytes.put( rslt_val_tblkey );
                        data[0][0] = bytes;

                        rs = new RsltData( conn, rsmdTblKey, data );
                    }
                else  if ( rslt_objkey )
                {
                    if ( rsmdObjKey == null )
                    {
                        rsmdObjKey = new AdvanRSMD( (short)1, trace );
                        rsmdObjKey.setColumnInfo( "object_key", 1, (int)Types.BINARY,
                            (short)DBMS_TYPE_LOGKEY,
                            (short)MSG_RPV_OBJKEY_LEN,
                            (byte)0, (byte)0, false );
                    }

                    data = new SqlData[1][];
                    data[0] = new SqlData[1];

                    bytes = new SqlByte( MSG_RPV_OBJKEY_LEN );
                    bytes.put( rslt_val_objkey );
                    data[0][0] = bytes;

                    rs = new RsltData( conn, rsmdObjKey, data );
                }
                else  if ( rsEmpty == null )
                {
                    if ( rsmdEmpty == null )
                    {
                        rsmdEmpty = new AdvanRSMD( (short)1, trace );
                        rsmdEmpty.setColumnInfo( "no_key", 1, (int)Types.BINARY,
                            (short)DBMS_TYPE_TBLKEY,
                            (short)MSG_RPV_TBLKEY_LEN,
                            (byte)0, (byte)0, false );
                    }

                    rs = rsEmpty = new RsltData( conn, rsmdEmpty, null );
                }

                if ( trace.enabled() )  trace.log( title + ".getGeneratedKeys: " + rs );
                return( rs );
            }
        }
Пример #7
0
 /*
 ** Name: set
 **
 ** Description:
 **	Assign a new data value as a copy of a SqlByte data
 **	value.  The data value will be NULL if the input value
 **	is null, otherwise non-NULL.
 **
 ** Input:
 **	data	SqlByte data value to copy.
 **
 ** Output:
 **	None.
 **
 ** Returns:
 **	void.
 **
 ** History:
 **	 1-Dec-03 (gordy)
 **	    Created.
 */
 public void set(SqlByte data)
 {
     if (data.isNull())
         setNull();
     else
     {
         /*
         ** The binary data is stored in a byte array.  A simple
         ** binary stream will produce the desired output.  Note
         ** that we need to follow the SqlByte convention and
         ** extend the data to the optional limit.
         */
         data.extend();
         setStream(getBinary(data.value, 0, data.length));
     }
     return;
 }