blob: 390a61466afc3f05275cd4e2636ad5cba64f08e4 [file] [log] [blame]
/*
Derby - Class org.apache.derby.impl.load.Export
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.
*/
package org.apache.derby.impl.load;
import java.sql.Connection;
import java.io.IOException;
import java.sql.SQLException;
import java.io.File;
import java.security.AccessController;
import java.security.PrivilegedAction;
import org.apache.derby.iapi.error.PublicAPI;
import org.apache.derby.iapi.reference.SQLState;
import org.apache.derby.iapi.error.StandardException;
import org.apache.derby.iapi.services.io.FileUtil;
import org.apache.derby.iapi.security.Securable;
import org.apache.derby.iapi.security.SecurityUtil;
/**
* This class provides ways to export data from
* a table or a view into a file. Export functions provided
* in this class are called through Systement Procedures.
*/
public class Export extends ExportAbstract{
private String outputFileName;
/* Name of the file to which large object data has to be exported */
private String lobsFileName;
private void doExport() throws SQLException
{
try {
if (entityName == null && selectStatement == null)
throw LoadError.entityNameMissing();
if (outputFileName == null)
throw LoadError.dataFileNull();
else
{
if (dataFileExists(outputFileName))
throw LoadError.dataFileExists(outputFileName);
}
if (lobsFileName != null && lobsFileExists(lobsFileName))
throw LoadError.lobsFileExists(lobsFileName);
try {
doAllTheWork();
} catch (IOException iex) {
//in case of ioexception, catch it and throw it as our own exception
throw LoadError.errorWritingData(iex);
}
} catch (Exception ex) {
throw LoadError.unexpectedError(ex);
}
}
private Export(Connection con, String schemaName ,
String tableName, String selectStatement ,
String outputFileName, String characterDelimeter,
String columnDelimeter, String codeset)
throws SQLException{
this.con = con;
this.schemaName = schemaName;
this.entityName = tableName;
this.selectStatement = selectStatement;
this.outputFileName = outputFileName;
try{
controlFileReader = new ControlInfo();
controlFileReader.setControlProperties(characterDelimeter,
columnDelimeter, codeset);
}catch(Exception ex)
{
throw LoadError.unexpectedError(ex);
}
}
/**
* Set the file name to which larg object data has to be exported, and
* also set flag to indicate that large objects are exported to a
* different file.
* @param lobsFileName the file to to which lob data has to be exported.
* @exception SQLException if file name is null.
*/
private void setLobsExtFileName(String lobsFileName) throws SQLException
{
if (lobsFileName == null) {
throw PublicAPI.wrapStandardException(
StandardException.newException(
SQLState.LOB_DATA_FILE_NULL));
}
this.lobsFileName = lobsFileName;
lobsInExtFile = true;
}
/**
* Checks whether the lobs file exists .
* @param fileName the file to to which lob data has to be exported.
* @exception SQLException if file name is null.
*/
private boolean lobsFileExists(String fileName) throws SQLException {
if (fileName == null) {
throw PublicAPI.wrapStandardException(
StandardException.newException(
SQLState.LOB_DATA_FILE_NULL));
}
fileName = FileUtil.stripProtocolFromFileName( fileName );
File file = new File(fileName);
return fileExists(file);
}
/**
* Checks whether the data file exists .
* @param fileName the file to to which lob data has to be exported.
* @exception SQLException if file name is null.
*/
private boolean dataFileExists(String fileName) throws SQLException {
if (fileName == null) {
throw PublicAPI.wrapStandardException(
StandardException.newException(
SQLState.DATA_FILE_NULL));
}
fileName = FileUtil.stripProtocolFromFileName( fileName );
File file = new File(fileName);
return fileExists(file);
}
/**
* Checks if the specified file exists.
*
* @param file the file to check
* @return {@code true} if the file exists, {@code false} if not.
* @throws SecurityException if the required privileges are missing
*/
private final boolean fileExists(final File file) {
return (AccessController.doPrivileged(
new PrivilegedAction<Boolean>() {
public Boolean run() {
return file.exists();
}
})).booleanValue();
}
/**
* SYSCS_EXPORT_TABLE system Procedure from ij or from a Java application
* invokes this method to perform export of a table data to a file.
* @param con The Derby database connection URL for the database containing the table
* @param schemaName schema name of the table data is being exported from
* @param tableName Name of the Table from which data has to be exported.
* @param outputFileName Name of the file to which data has to be exported.
* @param columnDelimeter Delimiter that seperates columns in the output file
* @param characterDelimeter Delimiter that is used to quoate non-numeric types
* @param codeset Codeset that should be used to write the data to the file
* @exception SQLException on errors
*/
public static void exportTable(Connection con, String schemaName,
String tableName, String outputFileName,
String columnDelimeter, String characterDelimeter,
String codeset)
throws SQLException {
/** Make sure that the current user has permission to perform this operation */
try {
SecurityUtil.authorize( Securable.EXPORT_TABLE );
}
catch (StandardException se) { throw PublicAPI.wrapStandardException( se ); }
Export fex = new Export(con, schemaName, tableName, null,
outputFileName, characterDelimeter,
columnDelimeter, codeset);
fex.doExport();
}
/**
* SYSCS_EXPORT_TABLE_LOBS_TO_EXTFILE system procedure from ij
* or from a Java application invokes this method to perform
* export of a table data to a file. Large object data is exported
* to a different file and the reference to it is stored in the
* main output file.
* @param con The Derby database connection URL for the
* database containing the table
* @param schemaName schema name of the table data is being exported from
* @param tableName Name of the Table from which data has to be exported.
* @param outputFileName Name of the file to which data has to be exported.
* @param columnDelimeter Delimiter that seperates columns
* in the output file.
* @param characterDelimeter Delimiter that is used to quote
* non-numeric types.
* @param codeset Codeset that should be used to
* write the data to the file/
* @param lobsFileName Name of the file to which large object
* data has to be exported.
* @exception SQLException on errors
*/
public static void exportTable(Connection con, String schemaName,
String tableName, String outputFileName,
String columnDelimeter, String characterDelimeter,
String codeset, String lobsFileName)
throws SQLException {
Export fex = new Export(con, schemaName, tableName, null,
outputFileName, characterDelimeter,
columnDelimeter, codeset);
fex.setLobsExtFileName(lobsFileName);
fex.doExport();
}
/**
* SYSCS_EXPORT_QUERY system Procedure from ij or from a Java application
* invokes this method to perform export of the data retrieved by select statement to a file.
* @param con The Derby database connection URL for the database containing the table
* @param selectStatement select query that is used to export the data
* @param outputFileName Name of the file to which data has to be exported.
* @param columnDelimeter Delimiter that seperates columns in the output file
* @param characterDelimeter Delimiter that is used to quiote non-numeric types
* @param codeset Codeset that should be used to write the data to the file
* @exception SQLException on errors
*/
public static void exportQuery(Connection con, String selectStatement,
String outputFileName, String columnDelimeter,
String characterDelimeter, String codeset)
throws SQLException {
Export fex = new Export(con, null, null, selectStatement,
outputFileName,characterDelimeter,
columnDelimeter, codeset);
fex.doExport();
}
/**
* SYSCS_EXPORT_QUERY_LOBS_TO_EXTFILE system Procedure from ij
* or from a Java application invokes this method to perform
* export of the data retrieved by select statement to a file.
* Large object data is exported to a different file and the reference
* to it is stored in the main output file.
* @param con The Derby database connection URL for
* the database containing the table
* @param selectStatement select query that is used to export the data
* @param outputFileName Name of the file to which data has to be exported.
* @param columnDelimeter Delimiter that seperates columns in
* the output file
* @param characterDelimeter Delimiter that is used to quote
* non-numeric types
* @param codeset Codeset that should be used to write the data to the file
* @param lobsFileName Name of the file to which
* large object data has to be exported.
* @exception SQLException on errors
*/
public static void exportQuery(Connection con, String selectStatement,
String outputFileName, String columnDelimeter,
String characterDelimeter, String codeset,
String lobsFileName)
throws SQLException {
Export fex = new Export(con, null, null, selectStatement,
outputFileName,characterDelimeter,
columnDelimeter, codeset);
fex.setLobsExtFileName(lobsFileName);
fex.doExport();
}
/**
* For internal use only
* @exception Exception if there is an error
*/
//returns the control file reader corresponding to the control file passed
protected ExportWriteDataAbstract getExportWriteData() throws Exception {
if (lobsInExtFile)
return new ExportWriteData(outputFileName,
lobsFileName,
controlFileReader);
else
return new ExportWriteData(outputFileName,
controlFileReader);
}
}