/*

   Derby - Class org.apache.derby.impl.load.ExportWriteDataAbstract

   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.io.InputStream;
import java.io.Reader;

abstract class ExportWriteDataAbstract {

  protected ControlInfo controlFileReader;
  protected int[] columnLengths;

  protected String fieldSeparator;
  protected String recordSeparator;
  protected String nullString;
  protected String columnDefinition;
  protected String format;
  protected String fieldStartDelimiter;
  protected String fieldStopDelimiter;
  protected String dataCodeset;
  protected String dataLocale;
  protected boolean hasDelimiterAtEnd;
  protected boolean doubleDelimiter=true;

  //load properties locally for faster reference to them periodically
  protected void loadPropertiesInfo() throws Exception {
    fieldSeparator = controlFileReader.getFieldSeparator();
    recordSeparator = controlFileReader.getRecordSeparator();
    nullString = controlFileReader.getNullString();
    columnDefinition = controlFileReader.getColumnDefinition();
    format = controlFileReader.getFormat();
    fieldStartDelimiter = controlFileReader.getFieldStartDelimiter();
    fieldStopDelimiter = controlFileReader.getFieldEndDelimiter();
    dataCodeset = controlFileReader.getDataCodeset();
    hasDelimiterAtEnd = controlFileReader.getHasDelimiterAtEnd();
  }

  //if control file says true for column definition, write it as first line of the
  //data file
  abstract void writeColumnDefinitionOptionally(String[] columnNames,
  													   String[] columnTypes)
  											throws Exception;

  //used in case of fixed format
  public void setColumnLengths(int[] columnLengths) {
    this.columnLengths = columnLengths;
  }

  //write the passed row into the data file
  public abstract void writeData(String[] oneRow, boolean[] isNumeric) throws Exception;

    /*
     * Writes the binary data in the given input stream to an 
     * external lob export file, and return it's location 
     * information in the file as string. Location information 
     * is written in the main export file. 
     * @param istream   input streams that contains a binary column data.
     * @return Location where the column data written in the external file. 
     * @exception Exception  if any error occurs while writing the data.  
     */
    abstract String writeBinaryColumnToExternalFile(InputStream istream) 
        throws Exception;
    
    /*
     * Writes the clob data in the given input Reader to an 
     * external lob export file, and return it's location 
     * information in the file as string. Location information 
     * is written in the main export file. 
     * @param ir   Reader that contains a clob column data.
     * @return Location where the column data written in the external file. 
     * @exception Exception  if any error occurs while writing the data.   
     */
    abstract String writeCharColumnToExternalFile(Reader ir) 
        throws Exception;

  //if nothing more to write, then close the file and write a message of completion
  //in message file
  public abstract void noMoreRows() throws Exception;
}
