2023-02-23 18:19:18 +01:00
/ *
* This file is a part of the SteamWar software .
*
* Copyright ( C ) 2023 SteamWar . de - Serverteam
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < https : //www.gnu.org/licenses/>.
* /
2023-02-21 13:24:32 +01:00
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 < NodeData > table = new Table < > ( NodeData . class ) ;
2023-02-24 09:19:28 +01:00
private static final Statement updateDatabase = new Statement ( " INSERT INTO NodeData(NodeId, NodeFormat, SchemData) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE NodeFormat = VALUES(NodeFormat), SchemData = VALUES(SchemData) " ) ;
2023-02-21 13:24:32 +01:00
private static final Statement selSchemData = new Statement ( " SELECT SchemData FROM NodeData WHERE NodeId = ? " ) ;
private static final SelectStatement < NodeData > get = table . select ( Table . PRIMARY ) ;
public static NodeData get ( SchematicNode node ) {
if ( node . isDir ( ) )
throw new IllegalArgumentException ( " Node is a directory " ) ;
2023-02-24 09:21:50 +01:00
return get . select ( rs - > {
if ( rs . next ( ) ) {
return new NodeData ( node . getId ( ) , rs . getBoolean ( " NodeFormat " ) ) ;
} else {
return new NodeData ( node . getId ( ) , false ) ;
}
} , node ) ;
2023-02-21 13:24:32 +01:00
}
@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 ;
}
}