/**
* Global Sensor Networks (GSN) Source Code
* Copyright (c) 2006-2014, Ecole Polytechnique Federale de Lausanne (EPFL)
*
* This file is part of GSN.
*
* GSN is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GSN 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GSN. If not, see <http://www.gnu.org/licenses/>.
*
* File: gsn-tiny/src/tinygsn/storage/db/H2StorageManager.java
*
* @author Do Ngoc Hoan
*/
package tinygsn.storage.db;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import tinygsn.beans.DataField;
import tinygsn.beans.DataTypes;
import tinygsn.beans.StreamSource;
import tinygsn.model.vsensor.AbstractVirtualSensor;
import tinygsn.storage.StorageManager;
//import gsn.beans.DataField;
//import gsn.beans.DataTypes;
//import gsn.storage.StorageManager;
//import org.apache.log4j.Logger;
//
//import java.sql.Connection;
//import java.sql.SQLException;
//import java.sql.Statement;
//import java.sql.Types;
public class H2StorageManager extends StorageManager {
// private static final transient Logger logger = Logger.getLogger(H2StorageManager.class);
//
public H2StorageManager() {
super();
this.isH2 = true;
}
@Override
public String getJDBCPrefix() {
return "jdbc:h2:";
}
@Override
public String convertGSNTypeToLocalType(DataField gsnType) {
String convertedType = null;
switch (gsnType.getDataTypeID()) {
case DataTypes.CHAR:
case DataTypes.VARCHAR:
// Because the parameter for the varchar is not
// optional.
if (gsnType.getType().trim().equalsIgnoreCase("string"))
convertedType = "TEXT";
else
convertedType = gsnType.getType();
break;
default:
convertedType = DataTypes.TYPE_NAMES[gsnType.getDataTypeID()];
break;
}
return convertedType;
}
@Override
public byte convertLocalTypeToGSN(int jdbcType, int precision) {
switch (jdbcType) {
case Types.BIGINT:
return DataTypes.BIGINT;
case Types.INTEGER:
return DataTypes.INTEGER;
case Types.SMALLINT:
return DataTypes.SMALLINT;
case Types.TINYINT:
return DataTypes.TINYINT;
case Types.VARCHAR:
return DataTypes.VARCHAR;
case Types.CHAR:
return DataTypes.CHAR;
case Types.DOUBLE:
case Types.DECIMAL: // This is needed for doing aggregates in datadownload servlet.
return DataTypes.DOUBLE;
case Types.BINARY:
case Types.BLOB:
case Types.VARBINARY:
case Types.LONGVARBINARY:
return DataTypes.BINARY;
default:
// logger.error("The type can't be converted to GSN form : " + jdbcType);
break;
}
return -100;
}
@Override
public String getStatementDropIndex() {
return "DROP INDEX #NAME";
}
@Override
public String getStatementDropView() {
return "DROP VIEW #NAME IF EXISTS";
}
@Override
public int getTableNotExistsErrNo() {
return 42102;
}
@Override
public String addLimit(String query, int limit, int offset) {
return query + " LIMIT " + limit + " OFFSET " + offset;
}
@Override
public void initDatabaseAccess(Connection con) throws Exception {
Statement stmt = con.createStatement();
stmt.execute("SET REFERENTIAL_INTEGRITY FALSE");
stmt.execute("CREATE ALIAS IF NOT EXISTS NOW_MILLIS FOR \"java.lang.System.currentTimeMillis\";");
super.initDatabaseAccess(con);
}
@Override
public String getStatementDifferenceTimeInMillis() {
return "call NOW_MILLIS()";
}
@Override
public StringBuilder getStatementDropTable(CharSequence tableName, Connection conn) throws SQLException {
StringBuilder sb = new StringBuilder("Drop table if exists ");
sb.append(tableName);
return sb;
}
@Override
public StringBuilder getStatementCreateTable(String tableName, DataField[] structure) {
StringBuilder result = new StringBuilder("CREATE TABLE ").append(tableName);
result.append(" (PK BIGINT NOT NULL IDENTITY, timed BIGINT NOT NULL, ");
for (DataField field : structure) {
if (field.getName().equalsIgnoreCase("pk") || field.getName().equalsIgnoreCase("timed")) continue;
result.append(field.getName().toUpperCase()).append(' ');
result.append(convertGSNTypeToLocalType(field));
result.append(" ,");
}
result.delete(result.length() - 2, result.length());
result.append(")");
return result;
}
@Override
public StringBuilder getStatementUselessDataRemoval(String virtualSensorName, long storageSize) {
return new StringBuilder()
.append("delete from ")
.append(virtualSensorName)
.append(" where ")
.append(virtualSensorName)
.append(".timed not in ( select ")
.append(virtualSensorName)
.append(".timed from ")
.append(virtualSensorName)
.append(" order by ")
.append(virtualSensorName)
.append(".timed DESC LIMIT ")
.append(storageSize)
.append(" offset 0 )");
}
@Override
public StringBuilder getStatementRemoveUselessDataCountBased(String virtualSensorName, long storageSize) {
return new StringBuilder()
.append("delete from ")
.append(virtualSensorName)
.append(" where ")
.append(virtualSensorName)
.append(".timed not in ( select ")
.append(virtualSensorName)
.append(".timed from ")
.append(virtualSensorName)
.append(" order by ")
.append(virtualSensorName)
.append(".timed DESC LIMIT ")
.append(storageSize).append(" offset 0 )");
}
//
/*
* This method only works with HSQLDB database. If one doesn't close the
* HSQLDB properly with high probability, the DB goes into instable or in
* worst case becomes corrupted.
*/
public void shutdown() throws SQLException {
getConnection().createStatement().execute("SHUTDOWN");
// logger.warn("Closing the database server (for HSqlDB) [done].");
// logger.warn("Closing the connection pool [done].");
}
@Override
public ArrayList<AbstractVirtualSensor> getListofVS() {
// TODO Auto-generated method stub
return null;
}
@Override
public ArrayList<StreamSource> getSourcesOfVS(String name) {
// TODO Auto-generated method stub
return null;
}
@Override
public HashMap<String, String> getSetting(String keyPrefix) {
// TODO Auto-generated method stub
return null;
}
@Override
public void setSetting(String key, String value) {
// TODO Auto-generated method stub
}
}