001: /*
002:
003: Derby - Class org.apache.derby.impl.load.ExportAbstract
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to You under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021:
022: package org.apache.derby.impl.load;
023:
024: import java.sql.Connection;
025: import java.sql.ResultSet;
026: import java.sql.ResultSetMetaData;
027: import java.sql.Types;
028: import java.util.Date;
029:
030: /**
031: *
032: * <P>
033: */
034: abstract class ExportAbstract {
035:
036: protected ControlInfo controlFileReader;
037: protected ExportResultSetForObject exportResultSetForObject;
038: protected ExportWriteDataAbstract exportWriteData;
039: protected Connection con;
040: protected String entityName; //this can be a plain table name or qualified with schema also
041: protected String schemaName;
042: protected String selectStatement;
043:
044: //following makes the resultset using select * from entityName
045: protected ResultSet resultSetForEntity() throws Exception {
046: exportResultSetForObject = new ExportResultSetForObject(con,
047: schemaName, entityName, selectStatement);
048:
049: ResultSet rs = exportResultSetForObject.getResultSet();
050: return rs;
051: }
052:
053: //convert resultset data to string array
054: public String[] getOneRowAtATime(ResultSet rs) throws Exception {
055: int columnCount = exportResultSetForObject.getColumnCount();
056:
057: ResultSetMetaData rsm = rs.getMetaData();
058: if (rs.next()) {
059: String[] rowObjects = new String[columnCount];
060: for (int colNum = 0; colNum < columnCount; colNum++) {
061: rowObjects[colNum] = rs.getString(colNum + 1);
062: }
063: return rowObjects;
064: }
065: rs.close();
066: exportResultSetForObject.close();
067: return null;
068: }
069:
070: //returns the control file reader corresponding to the control file passed
071: protected ControlInfo getControlFileReader() {
072: return controlFileReader;
073: }
074:
075: protected abstract ExportWriteDataAbstract getExportWriteData()
076: throws Exception;
077:
078: protected void doAllTheWork() throws Exception {
079:
080: ResultSet rs = null;
081: try {
082: rs = resultSetForEntity();
083: if (rs != null) {
084: ResultSetMetaData rsmeta = rs.getMetaData();
085: int ncols = rsmeta.getColumnCount();
086: boolean[] isNumeric = new boolean[ncols];
087: for (int i = 0; i < ncols; i++) {
088: int ctype = rsmeta.getColumnType(i + 1);
089: if (ctype == Types.BIGINT || ctype == Types.DECIMAL
090: || ctype == Types.DOUBLE
091: || ctype == Types.FLOAT
092: || ctype == Types.INTEGER
093: || ctype == Types.NUMERIC
094: || ctype == Types.REAL
095: || ctype == Types.SMALLINT
096: || ctype == Types.TINYINT)
097: isNumeric[i] = true;
098: else
099: isNumeric[i] = false;
100: }
101: exportWriteData = getExportWriteData();
102: exportWriteData.writeColumnDefinitionOptionally(
103: exportResultSetForObject.getColumnDefinition(),
104: exportResultSetForObject.getColumnTypes());
105: exportWriteData.setColumnLengths(controlFileReader
106: .getColumnWidths());
107:
108: //get one row at a time and write it to the output file
109: String[] oneRow = getOneRowAtATime(rs);
110: while (oneRow != null) {
111: exportWriteData.writeData(oneRow, isNumeric);
112: oneRow = getOneRowAtATime(rs);
113: }
114: }
115: } finally {
116: //cleanup work after no more rows
117: if (exportWriteData != null)
118: exportWriteData.noMoreRows();
119: if (rs != null)
120: rs.close();
121: }
122: }
123:
124: }
|