blob: b076d6fe0413fadfd69c27a72ddb2be35c63bed5 [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.
*
*************************************************************/
package com.sun.star.wizards.db;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.container.XNameAccess;
import com.sun.star.lang.XComponent;
import com.sun.star.sdbc.DataType;
import com.sun.star.sdbcx.XColumnsSupplier;
import com.sun.star.uno.Any;
import com.sun.star.uno.AnyConverter;
import com.sun.star.uno.Exception;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XInterface;
import com.sun.star.wizards.common.Helper;
import com.sun.star.sdb.XCompletedExecution;
import com.sun.star.lang.Locale;
import com.sun.star.wizards.common.InvalidQueryException;
import com.sun.star.wizards.common.JavaTools;
import com.sun.star.wizards.common.NumberFormatter;
import com.sun.star.sdbc.XResultSet;
import com.sun.star.task.XInteractionHandler;
import com.sun.star.wizards.common.PropertyNames;
public class RecordParser extends QueryMetaData
{
XNameAccess xColumns;
com.sun.star.sdbc.XRow xRow;
com.sun.star.sdbc.XRow xResultSetRow;
public XResultSet ResultSet;
XInterface xRowSet;
XCompletedExecution xExecute;
XColumnsSupplier xRowSetColumnsSupplier;
XComponent xRowSetComponent;
XInteractionHandler xInteraction;
public FieldColumn[] GroupFieldColumns;
public FieldColumn[] RecordFieldColumns;
public RecordParser(XMultiServiceFactory _xMSF, Locale _aLocale, NumberFormatter _oNumberFormatter)
{
super(_xMSF, _aLocale, _oNumberFormatter);
getInterfaces();
}
/** Creates a new instance of RecordParser */
public RecordParser(XMultiServiceFactory _xMSF)
{
super(_xMSF);
getInterfaces();
}
private void getInterfaces()
{
try
{
xRowSet = (XInterface) xMSF.createInstance("com.sun.star.sdb.RowSet");
xRowSetColumnsSupplier = UnoRuntime.queryInterface(XColumnsSupplier.class, xRowSet);
xRowSetComponent = UnoRuntime.queryInterface(XComponent.class, xRowSet);
xExecute = UnoRuntime.queryInterface(XCompletedExecution.class, xRowSet);
XInterface oInteraction = (XInterface) xMSF.createInstance("com.sun.star.task.InteractionHandler");
xInteraction = UnoRuntime.queryInterface(XInteractionHandler.class, oInteraction);
}
catch (Exception exception)
{
exception.printStackTrace(System.out);
}
}
private Object getColumnStringValue(int ColIndex)
{
try
{
com.sun.star.uno.Type CurType;
Object oAny;
String sValue = xResultSetRow.getString(ColIndex); //???
CurType = new com.sun.star.uno.Type(String.class);
oAny = AnyConverter.toObject(CurType, sValue);
return oAny;
}
catch (Exception exception)
{
exception.printStackTrace(System.out);
return null;
}
}
private Object getColumnDoubleValue(int ColIndex, boolean bisDate)
{
try
{
Double DblValue;
if (bisDate)
{
DblValue = new Double(xResultSetRow.getDouble(ColIndex) + (double) super.getNullDateCorrection());
}
else
{
DblValue = new Double(xResultSetRow.getDouble(ColIndex));
}
if (!xResultSetRow.wasNull())
{
return DblValue;
}
}
catch (Exception exception)
{
exception.printStackTrace(System.out);
}
return Any.VOID;
}
public Object getColumnValue(int ColIndex, int iType)
{
boolean bResult;
Object oAny = Any.VOID;
switch (iType)
{
case DataType.BIT: // == -7;
case DataType.BOOLEAN:
oAny = getColumnDoubleValue(ColIndex, false);
break;
case DataType.TINYINT: // == -6;
oAny = getColumnDoubleValue(ColIndex, false);
break;
case DataType.BIGINT: // == -5;
oAny = getColumnDoubleValue(ColIndex, false);
break;
case DataType.CHAR: // == 1;
oAny = getColumnStringValue(ColIndex);
break;
case DataType.VARCHAR: // == 12;
oAny = getColumnStringValue(ColIndex);
// double sResult = xResultSetRow.getClob(ColIndex); //???
break;
case DataType.LONGVARCHAR: // == -1;
oAny = getColumnStringValue(ColIndex);
// double sResult = xResultSetRow.getCharacterStream(ColIndex);
break;
case DataType.NUMERIC: // == 2;
oAny = getColumnDoubleValue(ColIndex, false);
break;
case DataType.INTEGER: // == 4;
oAny = getColumnDoubleValue(ColIndex, false);
break;
case DataType.SMALLINT: // == 5;
oAny = getColumnDoubleValue(ColIndex, false);
break;
case DataType.DECIMAL: // == 3; [mit Nachkommastellen]
oAny = getColumnDoubleValue(ColIndex, false);
break;
case DataType.FLOAT: // == 6;
oAny = getColumnDoubleValue(ColIndex, false);
break;
case DataType.REAL: // == 7;
oAny = getColumnDoubleValue(ColIndex, false);
break;
case DataType.DOUBLE: // == 8;
oAny = getColumnDoubleValue(ColIndex, false);
break;
case DataType.DATE: // == 91;
oAny = getColumnDoubleValue(ColIndex, true);
break;
case DataType.TIME: // == 92;
oAny = getColumnDoubleValue(ColIndex, false);
break;
case DataType.TIMESTAMP: // == 93;
oAny = getColumnDoubleValue(ColIndex, true);
break;
}
// Is the index OK; increment?
// String sValue = xResultSetRow.getString(ColIndex);
return oAny;
}
public boolean executeCommand(int _nCommandType) throws InvalidQueryException
{
try
{
Helper.setUnoPropertyValue(xRowSet, "DataSourceName", DataSourceName);
Helper.setUnoPropertyValue(xRowSet, PropertyNames.ACTIVE_CONNECTION, DBConnection);
Helper.setUnoPropertyValue(xRowSet, PropertyNames.COMMAND, Command);
Helper.setUnoPropertyValue(xRowSet, PropertyNames.COMMAND_TYPE, new Integer(_nCommandType)); // CommandType
xExecute.executeWithCompletion(xInteraction);
com.sun.star.sdb.XResultSetAccess xResultAccess = UnoRuntime.queryInterface(com.sun.star.sdb.XResultSetAccess.class, xRowSet);
ResultSet = xResultAccess.createResultSet();
xResultSetRow = UnoRuntime.queryInterface(com.sun.star.sdbc.XRow.class, ResultSet);
XColumnsSupplier xDBCols = UnoRuntime.queryInterface(XColumnsSupplier.class, ResultSet);
xColumns = xDBCols.getColumns();
setCommandType(_nCommandType);
return true;
}
catch (Exception exception)
{
exception.printStackTrace(System.out);
throw new InvalidQueryException(xMSF, Command);
}
}
public boolean getFields(String[] _sFieldNames, boolean binitializeDBColumns)
{
try
{
if (binitializeDBColumns)
{
initializeFieldColumns(_sFieldNames, xColumns);
}
String[] AllQueryFieldNames = xColumns.getElementNames();
String[] sFieldNames = getFieldNames();
for (int i = 0; i < FieldColumns.length; i++)
{
String sFieldName = FieldColumns[i].getFieldName();
int nColIndex = JavaTools.FieldInList(AllQueryFieldNames, sFieldName) + 1;
FieldColumns[i].ColIndex = nColIndex;
if (nColIndex == -1)
{
throw new InvalidQueryException(xMSF, Command);
}
}
GroupFieldColumns = getFieldColumnList(GroupFieldNames);
RecordFieldColumns = getFieldColumnList(getRecordFieldNames());
return true;
}
catch (InvalidQueryException queryexception)
{
queryexception.printStackTrace(System.out);
return false;
}
}
private FieldColumn[] getFieldColumnList(String[] _FieldNames)
{
FieldColumn[] LocFieldColumns = new FieldColumn[_FieldNames.length];
for (int i = 0; i < _FieldNames.length; i++)
{
LocFieldColumns[i] = super.getFieldColumnByFieldName(_FieldNames[i]);
}
return LocFieldColumns;
}
public Object getGroupColumnValue(int ColIndex)
{
FieldColumn CurDBFieldColumn = this.GroupFieldColumns[ColIndex];
return getColumnValue(CurDBFieldColumn.ColIndex, CurDBFieldColumn.getFieldType());
}
public boolean getcurrentRecordData(java.util.Vector DataVector)
{
Object[] RecordValueArray = new Object[RecordFieldColumns.length];
for (int i = 0; i < RecordFieldColumns.length; i++)
{
FieldColumn CurDBFieldColumn = this.RecordFieldColumns[i];
RecordValueArray[i] = getColumnValue(CurDBFieldColumn.ColIndex, CurDBFieldColumn.getFieldType()); //FinalColIndex
}
DataVector.addElement(RecordValueArray);
return true;
}
public void dispose()
{
if (xRowSetComponent != null)
{
xRowSetComponent.dispose();
}
super.dispose();
}
}