[ https://issues.apache.org/jira/browse/DERBY-2379?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12483945 ]
Knut Anders Hatlen commented on DERBY-2379: ------------------------------------------- * It seems to me LOBFile implements all the methods of the StorageRandomAccessFile interface, but the class doesn't implement the interface. Would it make sense to let LOBFile implement StorageRandomAccessFile? That would require fewer changes in LOBStreamControl, and one could also leave the non-encrypted read/write methods out of LOBFile. * It would be good to add some comments explaining the purpose of the instance variables and the private methods in LOBFile. * Is the lobFile field in LOBFile necessary? It doesn't seem to be used outside the constructor. * LOBFile.getBlocks: Is it necessary to check whether len is negative and thrown an IndexOutOfBoundsException? I guess the boundaries are checked on a higher level as well, and you'll get a NegativeArraySizeException anyway if len in negative, so I don't see any need to explicitly throw IndexOutOfBoundsException. * LOBFile.getBlocks: Couldn't the calculation of endPos be expressed without the condition, like this: long endPos = (pos + len + blockSize - 1) / blockSize * blockSize; I'm not saying it will improve the readability significantly, though... :) * LOBFile.writeEncrypted(byte): tailSize = (pos > tailSize - 1) ? pos + 1 : tailSize; Perhaps this is clearer when written like this: if (pos >= tailSize) tailSize = pos + 1; * LOBFile.writeEncrypted(byte): + long l = randomAccessFile.length(); + tailSize = 0; + } The variable l is never used. * The read*/write* methods of LOBFile have many calls to RandomAccessFile.length(). Would it be possible to reduce the number of times it is called? I'm not sure, but I suspect length() might involve a system call, so one shouldn't call it too frequently. I was thinking perhaps we could change code that looks like this + if (currentPos >= randomAccessFile.length()) { + //current postion is in memory + int pos = (int) (currentPos - randomAccessFile.length()); into something like this: long fileLength = randomAccessFile.length(); if (currentPos >= fileLength) { int pos = (int) (currentPos - fileLength); * LOBFile.writeEncrypted(byte[],int,int): + if (finalPos < blockSize) { + //updated size won't be enough to perform encryption' + System.arraycopy (b, off, tail, pos, len); + tailSize = pos + len; + currentPos += len; + return; + } Shouldn't tailSize be max(tailSize, pos+len)? and + //copy the bytes from tail which won't be overwritten' + System.arraycopy (tail, 0, clearText, 0, pos); Shouldn't the last argument have been tailLength in case we are not overwriting the end of the tail? * LOBFile.readEncrypted(): It doesn't seem like currentPos is incremented in the case where we need to read from the file. * LOBFile.readEncrypted(byte[],int,int) / writeEncrypted(byte[],int,int): It's probably slightly faster to replace this kind of loops + for (int i = 0; i < cypherText.length / blockSize; i++) { + df.decrypt (cypherText, i * blockSize, blockSize, tmpByte, + i * blockSize); + } with for (int offset = 0; offset < cypherText.length; offset += blockSize) { df.decrypt(cypherText, offset, blockSize, tmpByte, offset); } * LOBFile.readEncrypted(byte[],int,int): currentPos is not incremented when overFlow == 0. * LOBFile.readEncrypted(byte[],int,int): This part doesn't look correct to me: + //find out total number of bytes we can read + int newLen = (len - cypherText.length < tailSize) + ? len - cypherText.length + : tailSize; I think it only works if the read starts on a block boundary, and it should have used overflow instead of (len - cypherText.length). * I don't understand why getFilePointer, seek, read(byte[],off,len) and setLength are synchronized. Could you explain why these methods need synchronization, and why the other methods don't? * LOBFile.setLength() is a no-op if the new length is greater than the old length. Wouldn't it be better to throw an error in this case? It's not supposed to happen since it's only called from LOBStreamControl.truncate(), but since setLength() is already checking that the new size is not greater, I think it's better to throw an IllegalArgumentException or UnsupportedOperationException than to silently return. * I got these warnings when I tried to generate the javadoc: [javadoc] .../LOBFile.java:254: warning - @return tag has no arguments. [javadoc] .../LOBFile.java:346: warning - @return tag has no arguments. [javadoc] .../DataFactory.java:381: warning - @return tag has no arguments. * If my comments have revealed bugs in the patch, I think it would be good to write test cases which exposes them and add them to the JUnit tests. > provide encryption support for temporary files used by lob if the dara base > is encrypted > ---------------------------------------------------------------------------------------- > > Key: DERBY-2379 > URL: https://issues.apache.org/jira/browse/DERBY-2379 > Project: Derby > Issue Type: Sub-task > Affects Versions: 10.3.0.0 > Environment: all > Reporter: Anurag Shekhar > Assigned To: Anurag Shekhar > Attachments: derby-2379.diff > > -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.