blob: 3b096799216d41e1575eafa9d4f65b29279726c9 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.XPropertySet;
import com.sun.star.container.XNameAccess;
import com.sun.star.frame.XStorable;
import com.sun.star.frame.XModel;
import com.sun.star.sdb.XOfficeDatabaseDocument;
import com.sun.star.sdbc.SQLException;
import com.sun.star.sdbc.XCloseable;
import com.sun.star.sdbc.XConnection;
import com.sun.star.sdbc.XStatement;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.io.IOException;
import com.sun.star.sdb.XDocumentDataSource;
import com.sun.star.sdbc.XDataSource;
import com.sun.star.uno.XComponentContext;
import java.io.File;
import com.sun.star.util.CloseVetoException;
import java.io.File;
/**
*
* @author fs93730
*/
public class HsqlDatabase
{
XComponentContext m_context;
// the URL of the temporary file used for the database document
String m_databaseDocumentFile;
// the database document
XOfficeDatabaseDocument m_databaseDocument;
// the data source belonging to the database document
// the default connection
XConnection m_connection;
// --------------------------------------------------------------------------------------------------------
public HsqlDatabase( XComponentContext _context ) throws Exception
{
m_context = _context;
createDBDocument();
}
// --------------------------------------------------------------------------------------------------------
public HsqlDatabase( XComponentContext _context, String _existingDocumentURL ) throws Exception
{
m_context = _context;
createDBDocument( _existingDocumentURL );
}
// --------------------------------------------------------------------------------------------------------
private void createDBDocument( String _docURL ) throws Exception
{
m_databaseDocumentFile = _docURL;
XNameAccess dbContext = (XNameAccess)UnoRuntime.queryInterface( XNameAccess.class,
m_context.getServiceManager().createInstanceWithContext( "com.sun.star.sdb.DatabaseContext", m_context ) );
XDocumentDataSource dataSource = (XDocumentDataSource)UnoRuntime.queryInterface( XDocumentDataSource.class,
dbContext.getByName( _docURL ) );
m_databaseDocument = dataSource.getDatabaseDocument();
}
/** creates an empty database document in a temporary location
*/
private void createDBDocument() throws Exception
{
File documentFile = File.createTempFile("testdb",".odb");
documentFile.deleteOnExit();
m_databaseDocumentFile = URLHelper.getFileURLFromSystemPath( documentFile );
m_databaseDocument = (XOfficeDatabaseDocument)UnoRuntime.queryInterface(
XOfficeDatabaseDocument.class, m_context.getServiceManager().createInstanceWithContext(
"com.sun.star.sdb.OfficeDatabaseDocument", m_context ) );
XPropertySet dsProperties = (XPropertySet)UnoRuntime.queryInterface( XPropertySet.class, m_databaseDocument.getDataSource() );
dsProperties.setPropertyValue("URL", "sdbc:embedded:hsqldb");
XStorable storable = (XStorable)UnoRuntime.queryInterface( XStorable.class, m_databaseDocument );
storable.storeAsURL( m_databaseDocumentFile, new PropertyValue[]{} );
}
/** returns a connection to the database
*
* Multiple calls to this method return the same connection. The HsqlDatabase object keeps
* the ownership of the connection, so you don't need to (and should not) dispose/close it.
*
*/
public XConnection defaultConnection() throws SQLException
{
if ( m_connection != null )
return m_connection;
m_connection = m_databaseDocument.getDataSource().getConnection(new String(),new String());
return m_connection;
}
/** executes the given SQL statement via the defaultConnection
*/
public void executeSQL( String statementString ) throws SQLException
{
XStatement statement = defaultConnection().createStatement();
statement.execute( statementString );
}
/** stores the database document
*/
public void store() throws IOException
{
if ( m_databaseDocument != null )
{
XStorable storeDoc = (XStorable)UnoRuntime.queryInterface( XStorable.class,
m_databaseDocument );
storeDoc.store();
}
}
/** closes the database document
*
* Any CloseVetoExceptions fired by third parties are ignored, and any reference to the
* database document is released.
*/
public void close()
{
// close connection
XCloseable closeConn = (XCloseable)UnoRuntime.queryInterface( XCloseable.class,
m_connection );
if ( closeConn != null )
{
try
{
closeConn.close();
}
catch( SQLException e )
{
}
}
m_connection = null;
// close document
com.sun.star.util.XCloseable closeDoc = (com.sun.star.util.XCloseable)UnoRuntime.queryInterface(
com.sun.star.util.XCloseable.class, m_databaseDocument );
if ( closeDoc != null )
{
try
{
closeDoc.close( true );
}
catch( CloseVetoException e )
{
}
}
m_databaseDocument = null;
}
/** closes the document, and deletes the underlying file
*/
public void closeAndDelete()
{
close();
if ( m_databaseDocumentFile != null )
{
try
{
File file = new File(m_databaseDocumentFile);
file.delete();
}
catch(Exception e)
{
}
m_databaseDocumentFile = null;
}
}
/** returns the underlying database document
*/
public XOfficeDatabaseDocument getDatabaseDocument()
{
return m_databaseDocument;
}
/** returns the associated data source
*/
public XDataSource getDataSource()
{
return m_databaseDocument.getDataSource();
}
/** returns the model interface of the underlying database document
*/
XModel getModel()
{
return (XModel)UnoRuntime.queryInterface( XModel.class, m_databaseDocument );
}
/** drops the table with a given name
@param _name
the name of the table to drop
@param _ifExists
TRUE if it should be dropped only when it exists.
*/
public void dropTable( String _name, boolean _ifExists ) throws SQLException
{
String dropStatement = "DROP TABLE \"" + _name;
if ( _ifExists )
dropStatement += "\" IF EXISTS";
executeSQL( dropStatement );
}
/** returns the URL of the ODB document represented by this instance
*/
public String getDocumentURL()
{
return m_databaseDocumentFile;
}
/** creates a row set operating the database, with a given command/type
*/
public RowSet createRowSet( int _commandType, String _command )
{
return new RowSet( m_context, getDocumentURL(), _commandType, _command );
}
protected void finalize() throws Throwable
{
closeAndDelete();
super.finalize();
}
}