protected  String[]  parseRow( ) throws SQLException
    {
        String[]    newRow = new String[ COLUMN_NAMES.length ];

        String      headerLine = readNextLine();

        if ( headerLine == null ) { return null; }
        if ( !isRecordHeader( headerLine ) )
        {
            throw new SQLException( "Badly formatted record header: " + headerLine );
        }

        // the next line has all of the columns except for DESCRIPTION

        String      mainline = readNextLine();

        if ( mainline == null ) { return null; }
        
        int         oldIdx[] = new int[ 1 ];

        oldIdx[ 0 ] = 0;

        for ( int i = 0; i < DESCRIPTION; i++ ) { newRow[ i ] = readField( mainline, oldIdx ); }

        // get the number of lines in the DESCRIPTION
        int     descriptionLineCount = 0;

        try {
            String  lineCountField = newRow[ LINE_COUNT ];

            if ( lineCountField != null )
            {
                lineCountField = lineCountField.trim();
                String  numberString = lineCountField.substring( 0, lineCountField.indexOf( ' ' ) );

                descriptionLineCount = Integer.parseInt( numberString );
            }
        }
        catch ( Throwable t )
        {
            throw wrap( "Error parsing description line count at line " + getLineNumber() + ": " + mainline, t );
        }

        // account for extra blank line
        descriptionLineCount++;

        // the rest of the record is the DESCRIPTION

        StringBuffer buffer = new StringBuffer();

        for ( int i = 0; i < descriptionLineCount; i++ )
        {
            String  nextLine = readNextLine();
            
            buffer.append( nextLine );
        }

        newRow[ DESCRIPTION ] = buffer.toString();

        return newRow;
    }