org.h2.store.LobStorageRemoteInputStream Maven / Gradle / Ivy
The newest version!
/*
* Copyright 2004-2022 H2 Group. Multiple-Licensed under the MPL 2.0, and the
* EPL 1.0 (https://h2database.com/html/license.html). Initial Developer: H2
* Group
*/
package org.h2.store;
import java.io.IOException;
import java.io.InputStream;
import org.h2.engine.SessionRemote;
import org.h2.message.DbException;
import org.h2.mvstore.DataUtils;
/**
* An input stream used by the client side of a tcp connection to fetch LOB data
* on demand from the server.
*/
public class LobStorageRemoteInputStream extends InputStream {
private final SessionRemote sessionRemote;
/**
* The lob id.
*/
private final long lobId;
private final byte[] hmac;
/**
* The position.
*/
private long pos;
public LobStorageRemoteInputStream(SessionRemote handler, long lobId, byte[] hmac) {
this.sessionRemote = handler;
this.lobId = lobId;
this.hmac = hmac;
}
@Override
public int read() throws IOException {
byte[] buff = new byte[1];
int len = read(buff, 0, 1);
return len < 0 ? len : (buff[0] & 255);
}
@Override
public int read(byte[] buff) throws IOException {
return read(buff, 0, buff.length);
}
@Override
public int read(byte[] buff, int off, int length) throws IOException {
assert(length >= 0);
if (length == 0) {
return 0;
}
try {
length = sessionRemote.readLob(lobId, hmac, pos, buff, off, length);
} catch (DbException e) {
throw DataUtils.convertToIOException(e);
}
if (length == 0) {
return -1;
}
pos += length;
return length;
}
}