/*
* Copyright 2001-2008 Geert Bevin <gbevin[remove] at uwyn dot com>
* Licensed under the Apache License, Version 2.0 (the "License")
* $Id: org_apache_derby_jdbc_EmbeddedDriver.java 3918 2008-04-14 17:35:35Z gbevin $
*/
package com.uwyn.rife.scheduler.taskmanagers.databasedrivers;
import com.uwyn.rife.config.RifeConfig;
import com.uwyn.rife.database.Datasource;
import com.uwyn.rife.database.DbConnection;
import com.uwyn.rife.database.DbPreparedStatement;
import com.uwyn.rife.database.DbPreparedStatementHandler;
import com.uwyn.rife.database.exceptions.DatabaseException;
import com.uwyn.rife.database.queries.CreateTable;
import com.uwyn.rife.database.queries.Insert;
import com.uwyn.rife.database.queries.Query;
import com.uwyn.rife.scheduler.Task;
import com.uwyn.rife.scheduler.exceptions.TaskManagerException;
import com.uwyn.rife.scheduler.taskmanagers.exceptions.AddTaskErrorException;
import com.uwyn.rife.scheduler.taskmanagers.exceptions.GetTaskIdErrorException;
import com.uwyn.rife.scheduler.taskmanagers.exceptions.InstallTasksErrorException;
import com.uwyn.rife.scheduler.taskmanagers.exceptions.RemoveTasksErrorException;
import java.sql.Statement;
public class org_apache_derby_jdbc_EmbeddedDriver extends generic
{
public org_apache_derby_jdbc_EmbeddedDriver(Datasource datasource)
{
super(datasource);
mCreateTableTask = new CreateTable(getDatasource())
.table(RifeConfig.Scheduler.getTableTask())
.column("id", int.class)
.column("type", String.class, RifeConfig.Scheduler.getTaskTypeMaximumLength(), CreateTable.NOTNULL)
.column("planned", long.class, CreateTable.NOTNULL)
.column("frequency", String.class, RifeConfig.Scheduler.getTaskFrequencyMaximumLength(), CreateTable.NULL)
.column("busy", boolean.class)
.customAttribute("id", "GENERATED ALWAYS AS IDENTITY")
.defaultValue("busy", false)
.primaryKey(RifeConfig.Scheduler.getTableTask().toUpperCase()+"_PK", "id");
mAddTask = new Insert(getDatasource())
.into(mCreateTableTask.getTable())
.fieldParameter("type")
.fieldParameter("planned")
.fieldParameter("frequency")
.fieldParameter("busy");
}
public boolean install()
throws TaskManagerException
{
try
{
executeUpdate(mCreateTableTask);
}
catch (DatabaseException e)
{
throw new InstallTasksErrorException(e);
}
return true;
}
public boolean remove()
throws TaskManagerException
{
try
{
executeUpdate(mDropTableTask);
}
catch (DatabaseException e)
{
throw new RemoveTasksErrorException(e);
}
return true;
}
public int addTask(final Task task)
throws TaskManagerException
{
if (null == task) throw new IllegalArgumentException("task can't be null.");
final int[] result = new int[] {-1};
try
{
if (0 == executeUpdate(mAddTask, new DbPreparedStatementHandler() {
public DbPreparedStatement getPreparedStatement(Query query, DbConnection connection)
{
return connection.getPreparedStatement(query, Statement.RETURN_GENERATED_KEYS);
}
public void setParameters(DbPreparedStatement statement)
{
statement
.setBean(task);
}
public int performUpdate(DbPreparedStatement statement)
{
setParameters(statement);
int query_result = statement.executeUpdate();
try
{
result[0] = statement.getFirstGeneratedIntKey();
}
catch (DatabaseException e)
{
throw new RuntimeException(new GetTaskIdErrorException(e));
}
return query_result;
}
}))
{
throw new AddTaskErrorException(task);
}
}
catch (DatabaseException e)
{
throw new AddTaskErrorException(task, e);
}
assert result[0] >= 0;
return result[0];
}
}