示例#1
0
  private boolean cacheInputRow() throws KettleException {
    ///////////////////////////////
    // Read from  input channels //
    ///////////////////////////////

    if (data.filenr >= data.file.length) {
      // Switch the mode to reading back from the data cache
      data.caching = false;

      // Start back at filenr = 0
      data.filenr = 0;

      return true;
    }

    // We need to open a new outputstream
    if (data.dataOutputStream[data.filenr] == null) {
      try {
        // Open the temp file
        data.fileOutputStream[data.filenr] = new FileOutputStream(data.file[data.filenr]);

        // Open the data output stream...
        data.dataOutputStream[data.filenr] =
            new DataOutputStream(data.fileOutputStream[data.filenr]);
      } catch (FileNotFoundException fnfe) {
        logError(
            BaseMessages.getString(PKG, "JoinRows.Log.UnableToOpenOutputstream")
                + data.file[data.filenr].toString()
                + "] : "
                + fnfe.toString()); // $NON-NLS-1$ //$NON-NLS-2$
        stopAll();
        setErrors(1);
        return false;
      }
    }

    // Read a line from the appropriate rowset...
    RowSet rowSet = data.rs[data.filenr];
    Object[] rowData = getRowFrom(rowSet);
    if (rowData != null) // We read a row from one of the input streams...
    {
      if (data.fileRowMeta[data.filenr] == null) {
        // The first row is used as meta-data, clone it for safety
        data.fileRowMeta[data.filenr] = rowSet.getRowMeta().clone();
      }

      data.fileRowMeta[data.filenr].writeData(data.dataOutputStream[data.filenr], rowData);
      data.size[data.filenr]++;

      if (log.isRowLevel()) logRowlevel(rowData.toString());

      //
      // Perhaps we want to cache this data??
      //
      if (data.size[data.filenr] <= meta.getCacheSize()) {
        if (data.cache[data.filenr] == null) data.cache[data.filenr] = new ArrayList<Object[]>();

        // Add this row to the cache!
        data.cache[data.filenr].add(rowData);
      } else {
        // we can't cope with this many rows: reset the cache...
        if (log.isDetailed())
          logDetailed(
              BaseMessages.getString(
                  PKG,
                  "JoinRows.Log.RowsFound",
                  meta.getCacheSize() + "",
                  data.rs[data.filenr]
                      .getOriginStepName())); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
        data.cache[data.filenr] = null;
      }

    } else // No more rows found on rowset!!
    {
      // Close outputstream.
      try {
        data.dataOutputStream[data.filenr].close();
        data.fileOutputStream[data.filenr].close();
        data.dataOutputStream[data.filenr] = null;
        data.fileOutputStream[data.filenr] = null;
      } catch (IOException ioe) {
        logError(
            BaseMessages.getString(PKG, "JoinRows.Log.ErrorInClosingOutputStream")
                + data.filenr
                + " : ["
                + data.file[data.filenr].toString()
                + "] : "
                + ioe.toString()); // $NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
      }

      // Advance to the next file/input-stream...
      data.filenr++;
    }

    return true;
  }