All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.vertexium.sql.SqlStreamingPropertyValue Maven / Gradle / Ivy

The newest version!
package org.vertexium.sql;

import org.skife.jdbi.v2.DBI;
import org.skife.jdbi.v2.Handle;
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.tweak.ResultSetMapper;
import org.vertexium.VertexiumException;
import org.vertexium.Visibility;
import org.vertexium.property.DefaultStreamingPropertyValue;
import org.vertexium.util.AutoDeleteFileInputStream;
import org.vertexium.util.IOUtils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.ResultSet;
import java.sql.SQLException;

import static org.vertexium.sql.SqlStreamingPropertyTable.*;

public class SqlStreamingPropertyValue extends DefaultStreamingPropertyValue {
    private static final int IN_MEMORY_STREAM_MAX_BYTES = 1024 * 1024;
    private static final long serialVersionUID = 3515084569014897749L;

    private final DBI dbi;
    private final String tableName;
    private final String elementId;
    private final String key;
    private final String name;
    private final Visibility visibility;
    private final long timestamp;

    public SqlStreamingPropertyValue(
            Class valueType, long length, DBI dbi, String tableName, String elementId,
            String key, String name, Visibility visibility, long timestamp
    ) {
        super(null, valueType, length);
        this.dbi = dbi;
        this.tableName = tableName;
        this.elementId = elementId;
        this.key = key;
        this.name = name;
        this.visibility = visibility;
        this.timestamp = timestamp;
    }

    @Override
    public InputStream getInputStream() {
        try (Handle handle = dbi.open()) {
            Row row = handle
                    .createQuery(String.format(
                            "select %s from %s where %s = ?",
                            VALUE_COLUMN_NAME, tableName, KEY_COLUMN_NAME
                    ))
                    .bind(0, makeId(elementId, key, name, visibility, timestamp))
                    .map(new RowResultSetMapper()).first();

            return copyInputStream(row.inputStream);
        }
    }

    private InputStream copyInputStream(InputStream inputStream) {
        try {
            Long length = getLength();
            if (length == null || length < 0 || length > IN_MEMORY_STREAM_MAX_BYTES) {
                return new AutoDeleteFileInputStream(inputStream);
            } else {
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream((int) (long) length);
                IOUtils.copy(inputStream, outputStream);
                return new ByteArrayInputStream(outputStream.toByteArray());
            }
        } catch (IOException ex) {
            throw new VertexiumException(ex);
        }
    }

    private static class RowResultSetMapper implements ResultSetMapper {
        public Row map(int index, ResultSet rs, StatementContext ctx) throws SQLException {
            Row row = new Row();
            row.inputStream = rs.getBinaryStream(VALUE_COLUMN_NAME);
            return row;
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy