nizhikov commented on code in PR #11518: URL: https://github.com/apache/ignite/pull/11518#discussion_r1832661096
########## modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcBlob.java: ########## @@ -74,55 +101,56 @@ public JdbcBlob(byte[] arr) { @Override public InputStream getBinaryStream() throws SQLException { ensureNotClosed(); - return new ByteArrayInputStream(arr); + return buf.getInputStream(); } /** {@inheritDoc} */ @Override public InputStream getBinaryStream(long pos, long len) throws SQLException { ensureNotClosed(); - if (pos < 1 || len < 1 || pos > arr.length || len > arr.length - pos + 1) + int blobLen = buf.length(); + + if (pos < 1 || len < 1 || pos > blobLen || len > blobLen - (pos - 1)) { throw new SQLException("Invalid argument. Position can't be less than 1 or " + - "greater than size of underlying byte array. Requested length can't be negative and can't be " + - "greater than available bytes from given position [pos=" + pos + ", len=" + len + ']'); + "greater than Blob length. Requested length can't be negative and can't be " + + "greater than available bytes from given position [pos=" + pos + ", len=" + len + ", blobLen=" + blobLen + "]"); + } - return new ByteArrayInputStream(arr, (int)(pos - 1), (int)len); + return buf.getInputStream((int)pos - 1, (int)len); } /** {@inheritDoc} */ @Override public long position(byte[] ptrn, long start) throws SQLException { ensureNotClosed(); - if (start < 1 || start > arr.length || ptrn.length == 0 || ptrn.length > arr.length) - return -1; - - for (int i = 0, pos = (int)(start - 1); pos < arr.length;) { - if (arr[pos] == ptrn[i]) { - pos++; + int blobLen = buf.length(); - i++; + if (start < 1) + throw new SQLException("Invalid argument. Start position can't be less than 1 [start=" + start + "]"); - if (i == ptrn.length) - return pos - ptrn.length + 1; - } - else { - pos = pos - i + 1; + if (start > blobLen || ptrn.length == 0 || ptrn.length > blobLen) + return -1; - i = 0; - } - } + long idx = position(new ByteArrayInputStream(ptrn), ptrn.length, (int)start - 1); - return -1; + return idx == -1 ? -1 : idx + 1; } /** {@inheritDoc} */ @Override public long position(Blob ptrn, long start) throws SQLException { ensureNotClosed(); - if (start < 1 || start > arr.length || ptrn.length() == 0 || ptrn.length() > arr.length) + int blobLen = buf.length(); + + if (start < 1) + throw new SQLException("Invalid argument. Start position can't be less than 1 [start=" + start + "]"); + + if (start > blobLen || ptrn.length() == 0 || ptrn.length() > blobLen) return -1; - return position(ptrn.getBytes(1, (int)ptrn.length()), start); + long idx = position(ptrn.getBinaryStream(), (int)ptrn.length(), (int)start - 1); Review Comment: let's move all logic inside `position` implementation to reduce code duplication. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: notifications-unsubscr...@ignite.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org