Vector oRow;
HashMap oTransforms;
Object oOriginalValue;
Object oTransformedValue;
ResultSet oRSet;
ResultSetMetaData oRDat;
DataRowSet oDatR;
String sColName;
DataTblDef oMDat = OrMetaData[iTable];
DataTransformation oDatT;
PreparedStatement oStmt = OrStatements[iTable];
PreparedStatement oStmt2;
// Asignar los parametros de la clave primaria para leer valores en origen
oDatR = getRowSet(iTable);
// Comprobar primero si existen parámetros en la cláusula WHERE
if (oDatR.WhereClause!=null) {
if (oDatR.WhereClause.indexOf("?")>0) {
for (int p=0;p<cParams; p++) {
if (DebugFile.trace) DebugFile.writeln ("binding query input parameter " + String.valueOf(p+1));
oStmt.setObject(p+1, OrPK[p]);
} // next (p)
} // fi (oDatR.WhereClause.indexOf("?")>0)
} // fi (oDatR.WhereClause!=null)
if (DebugFile.trace) DebugFile.writeln ("PreparedStatement.executeQuery()");
oRSet = oStmt.executeQuery(); // Ejecutar la query de lectura de registros
/* Not supported under PostgreSQL 7.3.4
if (DebugFile.trace) DebugFile.writeln ("ResultSet.setFetchSize(" + String.valueOf(iFetchBurst) + ")");
oRSet.setFetchSize (iFetchBurst); // Asignar el tamaño de ráfaga de vuelta
*/
oDatR = null;
if (DebugFile.trace) {
if (DataRowSets.get(iTable)!=null)
DebugFile.writeln ("FieldList=" + getRowSet(iTable).FieldList);
else
DebugFile.writeln ("ERROR: getRowSet(" + String.valueOf(iTable) + ") == null");
}
// Si se especificó explícitamente una lista de campos a leer,
// entonces tomar como número de columnas la del Origen,
// en otro caso tomar como número de columnas las del Destino.
if (getRowSet(iTable).FieldList.compareTo("*")!=0)
iCols = oRSet.getMetaData().getColumnCount();
else
iCols = TrMetaData[iTable].ColCount;
if (DebugFile.trace) DebugFile.writeln ("reading " + String.valueOf(iCols) + " columns");
// Guardar los resultados en una matriz bidimensional almacenada como un vector de filas
oResults = new Vector(iFetchBurst, iFetchBurst);
if (DebugFile.trace) DebugFile.writeln ("new Vector(" + String.valueOf(iFetchBurst) + ")");
iRows = 0;
try {
// Obtener una referencia a las transformaciones de datos para el RowSet actual
oTransforms = (HashMap) Transformations.get(iTable);
cTransforms = oTransforms.size();
}
catch (ArrayIndexOutOfBoundsException e) {
if (DebugFile.trace) DebugFile.writeln ("table has no transformation replacements");
oTransforms = null;
cTransforms = 0;
}
if (0 == cTransforms) {
// Si no hay transformaciones para campos, usar un algoritmo más rápido con menos condiciones
while (oRSet.next() && iRows<iFetchBurst) {
iRows++;
if (DebugFile.trace) DebugFile.writeln ("caching row " + String.valueOf(iRows));
oRow = new Vector(iCols);
for (int c=1; c<=iCols; c++)
oRow.add(oRSet.getObject(c));
oResults.add(oRow);
} // wend ()
}
else { // Algoritmo con más condiciones para el caso de reemplazo de transformación de datos
oRDat = oRSet.getMetaData(); // Alias rápido a los metadatos del ResultSet
while (oRSet.next() && iRows<iFetchBurst) {
iRows++;
if (DebugFile.trace) DebugFile.writeln ("caching row " + String.valueOf(iRows));
// Crear un vector para la fila
oRow = new Vector(iCols);
// Recorer cada columna y almacenar su valor en el vector fila
iPK = 0;
for (int c=1; c<=iCols; c++) {
try {
// Obtener una referencia a la transformación para la columna actual
// si no hay transformación saltará una excepción y el valor de la
// columna se asignará en la sección catch()
sColName = oRDat.getColumnName(c);
oDatT = (DataTransformation) oTransforms.get(sColName);
// Asignar el valor transformado del campo
if (null==oDatT)