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-2-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

Reply via email to