{"record":{"id":"9ded40877e55a287","repo":"pentaho/pentaho-kettle","slug":"spoon-ripdb-exception-unabletosavetransformationtorepository","errorCode":"Spoon.RipDB.Exception.UnableToSaveTransformationToRepository","errorMessage":"Spoon.RipDB.Exception.UnableToSaveTransformationToRepository","messagePattern":"Spoon\\.RipDB\\.Exception\\.UnableToSaveTransformationToRepository","errorType":"exception","errorClass":"InvocationTargetException","httpStatus":null,"severity":"error","filePath":"ui/src/main/java/org/pentaho/di/ui/spoon/delegates/SpoonJobDelegate.java","lineNumber":707,"sourceCode":"        BaseMessages.getString( PKG, \"Spoon.ErrorDialog.RipDB.ErrorRippingTheDatabase.Message\" ), e );\n      return null;\n    } finally {\n      spoon.refreshGraph();\n      spoon.refreshTree();\n    }\n\n    return jobMeta;\n  }\n\n  private void saveTransformation( TransMeta transMeta ) throws KettleException, InvocationTargetException {\n    boolean ok;\n    if ( spoon.getRepository() != null ) {\n      ok = spoon.saveToRepository( transMeta, false );\n    } else {\n      ok = spoon.saveToFile( transMeta );\n    }\n    if ( !ok ) {\n      throw new InvocationTargetException( new Exception(\n        BaseMessages.getString( PKG, \"Spoon.RipDB.Exception.UnableToSaveTransformationToRepository\" ) ),\n        BaseMessages.getString( PKG, \"Spoon.RipDB.Exception.UnableToSaveTransformationToRepository\" ) );\n    }\n  }\n\n  private String getSQLString( DatabaseMeta sourceDbInfo, TableInputMeta tii, TransMeta transMeta )\n    throws InvocationTargetException {\n    // First set the limit to 1 to speed things up!\n    String tmpSql = tii.getSQL();\n    tii.setSQL( tii.getSQL() + sourceDbInfo.getLimitClause( 1 ) );\n    String sql;\n    try {\n      sql = transMeta.getSQLStatementsString();\n    } catch ( KettleStepException kse ) {\n      throw new InvocationTargetException( kse, BaseMessages.getString(\n        PKG, \"Spoon.RipDB.Exception.ErrorGettingSQLFromTransformation\" )\n        + transMeta + \"] : \" + kse.getMessage() );\n    }","sourceCodeStart":689,"sourceCodeEnd":725,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/ui/src/main/java/org/pentaho/di/ui/spoon/delegates/SpoonJobDelegate.java#L689-L725","documentation":"During the 'Rip database' wizard, SpoonJobDelegate saves the transformation (to repository or file) after creating the target table. If the save fails and returns false, it wraps an InvocationTargetException with localized message Spoon.RipDB.Exception.UnableToSaveTransformationToRepository.","triggerScenarios":"ripping a DB where spoon.saveToRepository(transMeta, false) or spoon.saveToFile(transMeta) returns false: no filename set, repository save rejected or cancelled, or an I/O error writing the .ktr file.","commonSituations":"User cancels the save dialog; repository connection dropped mid-save; transformation has no name/filename so saveToFile aborts; insufficient repository permissions or missing repository directory.","solutions":["Ensure the transformation has a valid name and target filename/repository path before running the rip wizard.","Verify repository connectivity and credentials before starting the rip operation.","Check disk space and write permissions for the target .ktr file location.","Confirm the target repository directory exists, then retry the rip."],"exampleFix":"// before\nok = spoon.saveToFile( transMeta ); // fails when transMeta.getFilename() is null\n// after\nif ( transMeta.getFilename() == null || transMeta.getFilename().length() == 0 ) {\n  // prompt the user for a filename first\n}\nok = spoon.saveToFile( transMeta );","handlingStrategy":"validation","validationCode":"if (transMeta.getName() == null || transMeta.getName().isEmpty()) { /* set a name first */ }\nif (spoon.getRepository() != null && !spoon.getRepository().isConnected()) { /* reconnect first */ }","typeGuard":null,"tryCatchPattern":"try {\n  ripAndSave(transMeta);\n} catch (InvocationTargetException e) {\n  if (e.getMessage() != null && e.getMessage().contains(\"UnableToSaveTransformationToRepository\")) {\n    // prompt user to pick a filename/repository directory and retry\n  }\n}","preventionTips":["Give the transformation a unique name before saving.","Verify repository connectivity before long rip operations.","Ensure the target directory exists and is writable."],"tags":["pdi","repository","file-save","spoon"],"backgroundTag":"file-write-failed","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}