This commit is contained in:
Clebert Suconic 2018-04-17 10:43:28 -04:00
commit 59162653a4
2 changed files with 76 additions and 6 deletions

View File

@ -294,17 +294,27 @@ public class JDBCSequentialFileFactoryDriver extends AbstractJDBCDriver {
if (rs.next()) {
final Blob blob = rs.getBlob(1);
if (blob != null) {
readLength = (int) calculateReadLength(blob.length(), bytes.remaining(), file.position());
byte[] data = blob.getBytes(file.position() + 1, readLength);
bytes.put(data);
final long blobLength = blob.length();
final int bytesRemaining = bytes.remaining();
final long filePosition = file.position();
readLength = (int) calculateReadLength(blobLength, bytesRemaining, filePosition);
if (logger.isDebugEnabled()) {
logger.debugf("trying read %d bytes: blobLength = %d bytesRemaining = %d filePosition = %d",
readLength, blobLength, bytesRemaining, filePosition);
}
if (readLength < 0) {
readLength = -1;
} else if (readLength > 0) {
byte[] data = blob.getBytes(file.position() + 1, readLength);
bytes.put(data);
}
}
}
connection.commit();
return readLength;
} catch (Throwable e) {
throw e;
} finally {
} catch (SQLException e) {
connection.rollback();
throw e;
}
}
}

View File

@ -96,6 +96,66 @@ public class JDBCSequentialFileFactoryTest {
assertTrue(factory.isStarted());
}
@Test
public void testReadZeroBytesOnEmptyFile() throws Exception {
JDBCSequentialFile file = (JDBCSequentialFile) factory.createSequentialFile("test.txt");
file.open();
try {
final ByteBuffer readBuffer = ByteBuffer.allocate(0);
final int bytes = file.read(readBuffer);
assertEquals(0, bytes);
} finally {
file.close();
}
}
@Test
public void testReadZeroBytesOnNotEmptyFile() throws Exception {
final int fileLength = 8;
JDBCSequentialFile file = (JDBCSequentialFile) factory.createSequentialFile("test.txt");
file.open();
try {
file.writeDirect(ByteBuffer.allocate(fileLength), true);
assertEquals(fileLength, file.size());
final ByteBuffer readBuffer = ByteBuffer.allocate(0);
final int bytes = file.read(readBuffer);
assertEquals(0, bytes);
} finally {
file.close();
}
}
@Test
public void testReadOutOfBoundsOnEmptyFile() throws Exception {
JDBCSequentialFile file = (JDBCSequentialFile) factory.createSequentialFile("test.txt");
file.open();
try {
final ByteBuffer readBuffer = ByteBuffer.allocate(1);
file.position(1);
final int bytes = file.read(readBuffer);
assertTrue("bytes read should be < 0", bytes < 0);
} finally {
file.close();
}
}
@Test
public void testReadOutOfBoundsOnNotEmptyFile() throws Exception {
final int fileLength = 8;
JDBCSequentialFile file = (JDBCSequentialFile) factory.createSequentialFile("test.txt");
file.open();
try {
file.writeDirect(ByteBuffer.allocate(fileLength), true);
assertEquals(fileLength, file.size());
file.position(fileLength + 1);
final ByteBuffer readBuffer = ByteBuffer.allocate(fileLength);
final int bytes = file.read(readBuffer);
assertTrue("bytes read should be < 0", bytes < 0);
} finally {
file.close();
}
}
@Test
public void testCreateFiles() throws Exception {
int noFiles = 100;