public String getBlobString()

in entity-store/src/main/java/jetbrains/exodus/entitystore/PersistentEntityStoreImpl.java [1224:1292]


    public String getBlobString(@NotNull final PersistentStoreTransaction txn,
                                @NotNull final PersistentEntity entity,
                                @NotNull final String blobName) throws IOException {
        final int blobId = getPropertyId(txn, blobName, false);
        if (blobId < 0) {
            return null;
        }
        String result = txn.getCachedBlobString(entity, blobId);
        if (result != null) {
            return result;
        }
        final Pair<Long, InputStream> blobStream = getInPlaceBlobStream(txn, entity, blobName);
        if (blobStream == null) {
            return null;
        }
        final long blobHandle = blobStream.getFirst();
        if (blobHandle == EMPTY_BLOB_HANDLE) {
            result = "";
        } else {
            try {
                final InputStream stream = blobStream.getSecond();
                if (stream == null) {
                    var envTxn = txn.getEnvironmentTransaction();
                    var blobLength = getBlobFileLength(blobHandle, envTxn);

                    var blobString = blobVault.getStringContent(blobHandle, envTxn,
                            blobLength);

                    if (blobString != null) {
                        return blobString;
                    }

                    int counter = 0;
                    final int sleepInterval = 50;
                    final int counterMaxValue = config.getBlobMaxReadWaitingInterval() * 1000 / sleepInterval;

                    while (true) {
                        try {
                            Thread.sleep(sleepInterval);
                        } catch (InterruptedException e) {
                            throw new ExodusException("Store : " + getName() +
                                    " . Reading of blob content was interrupted.", e);
                        }
                        counter++;

                        blobString = blobVault.getStringContent(blobHandle, envTxn,
                                blobLength);

                        if (blobString != null) {
                            return blobString;
                        }

                        if (counter >= counterMaxValue) {
                            final String message = generateBlobBrokenMessage(txn,
                                    entity, blobName, blobHandle, blobLength);
                            throw new ExodusException(message);
                        }
                    }
                }
                result = UTFUtil.readUTF(stream);
            } catch (UTFDataFormatException e) {
                result = e.toString();
            }
        }
        if (result != null) {
            txn.cacheBlobString(entity, blobId, result);
        }
        return result;
    }