You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by "Knut Anders Hatlen (JIRA)" <ji...@apache.org> on 2008/10/07 15:11:44 UTC

[jira] Commented: (DERBY-3770) Create a utility class for skipping data in an InputStream

    [ https://issues.apache.org/jira/browse/DERBY-3770?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12637467#action_12637467 ] 

Knut Anders Hatlen commented on DERBY-3770:
-------------------------------------------

Before we close this issue, we should make sure the new utility methods are used these places:

  EmbedBlob.length()
  PositionedStoreStream.reposition() (and remove skipFully() from that class)
  UpdatableBlobStream.updateIfRequired()
  SQLBinary.getLength()

The next methods look buggy. They assume that InputStream.skip() or DataInput.skipBytes() always skip the requested number of bytes, unless EOF is reached. They should use skipFully() instead.

  CompressedNumber.skipInt(DataInput)
  CompressedNumber.skipInt(InputStream)
  CompressedNumber.skipLong(DataInput)
  CompressedNumber.skipLong(InputStream)
  StoredFieldHeader.readFieldDataLength()
  StoredPage.readRecordFromStream()
  StoredPage.skipField()

Same issue exists in the next two methods, but in their case the stream variable is declared as an ArrayInputStream, which is guaranteed to skip as much as requested, as long as EOF is not reached. We should either use skipFully() or comment why we expect skipBytes() to do the right thing.

  StoredPage.readOneColumnFromPage()
  StoredPage.readRecordFromArray()

> Create a utility class for skipping data in an InputStream
> ----------------------------------------------------------
>
>                 Key: DERBY-3770
>                 URL: https://issues.apache.org/jira/browse/DERBY-3770
>             Project: Derby
>          Issue Type: Improvement
>          Components: Miscellaneous
>    Affects Versions: 10.5.0.0
>            Reporter: Kristian Waagan
>            Assignee: Junjie Peng
>            Priority: Minor
>         Attachments: derby-3770-1.patch, derby-3770-1.stat, derby-3770-2.patch, derby-3770-2.stat, derby-3770-3.patch, derby-3770-3.stat, derby-3770-4.patch, derby-3770-4.patch, derby-3770-4.stat, derby-3770-4.stat, derby-3770-5.patch, derby-3770-5.stat, derby-3770-6.patch, derby-3770-6.stat
>
>
> The contract of InputStream.skip is somewhat difficult, some would even say broken.
> See http://java.sun.com/javase/6/docs/api/java/io/InputStream.html#skip(long))
> A utility class should be created to ensure that we use the same skip procedure throughout the Derby code base.
> Suggested functionality:
>  - long skipFully(InputStream) : skips until EOF, returns number of bytes skipped
>  - void skipFully(InputStream,long) : skips requested number of bytes, throws EOFException if there is too few bytes in the stream
> I know of two different approaches, both skipping in a loop:
>  a) Verify EOF with a read call when skip returns zero.
>  b) Throw EOFException if skip returns zero before requested number of bytes have been skipped.
> There's related code in iapi.util.UTF8Util. Maybe this class, say StreamUtil, could be put in the same package?

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.