skorotkov commented on code in PR #11518: URL: https://github.com/apache/ignite/pull/11518#discussion_r1810598752
########## modules/core/src/main/java/org/apache/ignite/internal/jdbc2/lob/JdbcBlobBufferPointer.java: ########## @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.jdbc2.lob; + +/** + * Keeps a pointer to some position in a {@link JdbcBlobBuffer}. + */ +class JdbcBlobBufferPointer { + /** Current buffer position. */ + private long pos; + + /** Optional storage-specific context for effective access to data in the current position. */ + private JdbcBlobStorageContext context; + + /** + * Create new pointer to zero position. + */ + JdbcBlobBufferPointer() { + pos = 0; + } + + /** + * Initialize pointer from the another one. + * + * @param pointer Another pointer. + */ + JdbcBlobBufferPointer set(JdbcBlobBufferPointer pointer) { + pos = pointer.pos; + + if (pointer.context != null) + context = pointer.context.deepCopy(); + + return this; + } + + /** + * Set current buffer position. + * + * @param pos New position. + */ + JdbcBlobBufferPointer setPos(long pos) { + this.pos = pos; + + return this; + } + + /** + * Set context. + * + * @param context New context. + */ + JdbcBlobBufferPointer setContext(JdbcBlobStorageContext context) { Review Comment: InMemContext#idx, InMemContext#inBufPos can not be moved inside the JdbcBlobBuffer. The Context is stored in some JdbcBlobBufferPointer. JdbcBlobBufferPointer keeps some particular position in the JdbcBlobBuffer and transparently contains additional storage-specific context for fast access to data. Additional context is needed for RW storage (idx + inBufPos) but is not needed for the RO one. That is why there is a single implementation of context. There may be **many** pointers pointing to **different** positions within the single JdbcBlobBuffer. This is because several independent InputStreams and OutputStreams may be created for Blob each containing the its own JdbcBlobBufferPointer. Keeping in mind the copy-on-write behaviour of JdbcBlobBuffer the underlining storage may be changed from RO to RW after the stream (and therefore the pointer) was created. Streams should remain valid and be transparent to the RO-to-RW switch, so the existing pointers should be able to be "upgraded" to work with the RW storage. The recoverContext() function does that. *** So, the only simplification comes to mind is to move the idx and inBufPos directly to JdbcBlobBufferPointer. That way we remove the JdbcBlobStorageContext interface and InMemContext implementation. But broke a little bit the OOD priciples - now the JdbcBlobBufferPointer will "know" about two specific implementations of storage interface. Doing so we may also replace the JDbcBlobStorage interface with just the abstract base class for two remaining in-memory storage implementations. *** What do you think? -- 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