package de.steamwar.sql; import de.steamwar.sql.internal.*; import lombok.AllArgsConstructor; import lombok.Getter; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.PipedInputStream; import java.sql.PreparedStatement; import java.util.zip.GZIPInputStream; @AllArgsConstructor public class NodeData { static { new SqlTypeMapper<>(PipedInputStream.class, "BLOB", (rs, identifier) -> { throw new SecurityException("PipedInputStream is write only datatype"); }, PreparedStatement::setBinaryStream); new SqlTypeMapper<>(ByteArrayInputStream.class, "BLOB", (rs, identifier) -> { throw new SecurityException("ByteArrayInputStream is write only datatype"); }, PreparedStatement::setBinaryStream); } private static final Table table = new Table<>(NodeData.class); private static final Statement updateDatabase = new Statement("UPDATE NodeData SET SchemData = ?, NodeFormat = ? WHERE NodeId = ?"); private static final Statement selSchemData = new Statement("SELECT SchemData FROM NodeData WHERE NodeId = ?"); private static final SelectStatement get = table.select(Table.PRIMARY); public static NodeData get(SchematicNode node) { if(node.isDir()) throw new IllegalArgumentException("Node is a directory"); return get.select(node); } @Getter @Field(keys = {Table.PRIMARY}) private final int nodeId; @Field private boolean nodeFormat; public InputStream schemData() throws IOException { try { return selSchemData.select(rs -> { rs.next(); InputStream schemData = rs.getBinaryStream("SchemData"); try { if(rs.wasNull() || schemData.available() == 0) { throw new SecurityException("SchemData is null"); } return new GZIPInputStream(schemData); } catch (IOException e) { throw new SecurityException("SchemData is wrong", e); } }, nodeId); } catch (Exception e) { throw new IOException(e); } } public void saveFromStream(InputStream blob, boolean newFormat) { updateDatabase.update(blob, newFormat, nodeId); nodeFormat = newFormat; } public boolean getNodeFormat() { return nodeFormat; } }