/*
* Copyright 2001-2008 Geert Bevin <gbevin[remove] at uwyn dot com> and
* JR Boyens <gnu-jrb[remove] at gmx dot net>
* 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.database.querymanagers.generic.databasedrivers;
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.DbTransactionUserWithoutResult;
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.database.queries.SequenceValue;
import com.uwyn.rife.database.querymanagers.generic.GenericQueryManager;
import java.sql.Statement;
public class org_apache_derby_jdbc_EmbeddedDriver<BeanType> extends generic<BeanType> implements GenericQueryManager<BeanType>
{
private CreateTable mCreateTableDerby = null;
private Insert mSaveDerby = null;
public org_apache_derby_jdbc_EmbeddedDriver(Datasource datasource, String tableName, String primaryKey, Class<BeanType> beanClass, boolean hasIdentifier)
throws DatabaseException
{
super(datasource, tableName, primaryKey, beanClass, hasIdentifier);
}
protected CreateTable getInternalCreateTableQuery()
{
if (null == mCreateTableDerby)
{
CreateTable query = new CreateTable(getDatasource())
.table(mTableName)
.columns(mBaseClass);
if (!isIdentifierSparse())
{
query
.customAttribute(mPrimaryKey, "GENERATED ALWAYS AS IDENTITY");
}
if (!mHasIdentifier)
{
query
.primaryKey(mPrimaryKey);
}
addCreateTableManyToOneColumns(query);
mCreateTableDerby = query;
}
return mCreateTableDerby;
}
protected Insert getInternalSaveQuery()
{
if (null == mSaveDerby)
{
Insert query = new Insert(getDatasource())
.into(mTableName);
if (!isIdentifierSparse())
{
query
.fieldsParametersExcluded(mBaseClass, new String[]{mPrimaryKey});
}
else
{
query
.fieldsParameters(mBaseClass);
}
addSaveManyToOneFields(query);
mSaveDerby = query;
}
return mSaveDerby;
}
public void install()
throws DatabaseException
{
executeUpdate(getInternalCreateTableQuery());
installManyToMany();
fireInstalled();
}
public void install(CreateTable query)
throws DatabaseException
{
executeUpdate(query);
installManyToMany();
fireInstalled();
}
public void remove()
throws DatabaseException
{
removeManyToMany();
executeUpdate(getInternalDropTableQuery());
fireRemoved();
}
protected int _insertWithoutCallbacks(final SequenceValue nextId, final Insert save, final BeanType bean) throws DatabaseException
{
final int[] result = new int[] {getIdentifierValue(bean)};
inTransaction(new DbTransactionUserWithoutResult() {
public void useTransactionWithoutResult()
{
storeManyToOne(bean);
executeUpdate(save, new DbPreparedStatementHandler() {
public DbPreparedStatement getPreparedStatement(Query query, DbConnection connection)
{
return connection.getPreparedStatement(query, Statement.RETURN_GENERATED_KEYS);
}
public void setParameters(DbPreparedStatement statement)
{
statement
.setBean(bean);
setManyToOneJoinParameters(statement, bean);
}
public int performUpdate(DbPreparedStatement statement)
{
setParameters(statement);
int query_result = statement.executeUpdate();
if (isIdentifierSparse())
{
result[0] = getIdentifierValue(bean);
}
else
{
result[0] = statement.getFirstGeneratedIntKey();
}
return query_result;
}
});
if (result[0] != -1)
{
try
{
mSetPrimaryKeyMethod.invoke(bean, new Object[] {new Integer(result[0])});
}
catch (Throwable e)
{
throw new DatabaseException(e);
}
storeManyToOneAssociations(bean, result[0]);
storeManyToMany(bean, result[0]);
}
}
});
// handle listeners
if (result[0] != -1)
{
fireInserted(bean);
}
return result[0];
}
}