package com.ibm.gaiandb.distributed;
import java.io.File;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.ResultSet;
import org.apache.derby.impl.jdbc.EmbedConnection;
import com.ibm.gaiandb.DataSourcesManager;
import com.ibm.gaiandb.GaianDBConfig;
import com.ibm.gaiandb.GaianDBProcedureUtils;
import com.ibm.gaiandb.Logger;
import com.ibm.gaiandb.Util;
public class SampleUDFs extends GaianDBProcedureUtils {
private static final Logger logger = new Logger( "SampleUDFs", 30 );
public final String UDF_FHE_SEARCH = ""
+ "!DROP FUNCTION FHE_SEARCH;!CREATE FUNCTION FHE_SEARCH(BYTES_URI "+Util.XSTR+") RETURNS BLOB(2G)"
+ " PARAMETER STYLE JAVA LANGUAGE JAVA NO SQL EXTERNAL NAME 'com.ibm.gaiandb.distributed.fheSearch'";
public static Blob fheSearch( final String bytesURI ) throws Exception {
// The initial URI scheme targets a file through GaianNode using syntax: "<NodeID> <FilePath>"
// New schemes could be used in future, e.g. to target a db table or a web location.
int idx = bytesURI.indexOf(' ');
if ( 0 > idx ) throw new Exception(
"FHE_SEARCH() argument 'bytesURI' does not conform to syntax: '<NodeID> <FilePath>'");
final String nodeID = bytesURI.substring(0,idx);
final String filePath = bytesURI.substring(idx+1);
idx = filePath.lastIndexOf('/');
final String fileName = 0 > idx ? filePath : filePath.substring( idx+1 );
Connection c = null;
try {
final String connectionDetails = GaianDBConfig.getRDBConnectionDetailsAsString(nodeID);
c = GaianDBConfig.getNewDBConnector( GaianDBConfig.getConnectionTokens(connectionDetails) ).getConnection();
ResultSet rs = c.createStatement().executeQuery("select getFileBZ(''"+filePath+"'') fzbytes from sysibm.sysdummy1");
byte[] bytes = rs.getBytes(1);
File file = new File(fileName);
System.out.println("Received file: " + fileName + ", size: " + file.length());
writeToFileAfterUnzip( file, bytes );
rs.close();
/** Call to FHE code **/
Process process = new ProcessBuilder("sleep", "3").start();
try { process.waitFor(); }
catch (InterruptedException e) { e.printStackTrace(); }
/** Call to FHE code **/
file = new File(fileName);
System.out.println("Resulting FHE bytes file: " + fileName + ", size: " + file.length());
bytes = readAndZipFileBytes( file );
// Cast to EmbedConnection as we know Derby supports createBlob() regardless of Java version
Blob blob = ((EmbedConnection) getDefaultDerbyConnection()).createBlob();
blob.setBytes(1, bytes);
return blob;
}
catch (Exception e) { throw new Exception("Unable to get bytes from node: " + nodeID + ", file: " + filePath + ": " + e); }
finally {
logger.logInfo("Closing connection");
if ( null != nodeID && null != c ) // Return connection to pool (may get closed immediately if not referenced by a data source or sourcelist)
DataSourcesManager.getSourceHandlesPool( GaianDBConfig.getRDBConnectionDetailsAsString(nodeID) ).push(c);
}
}
}