{"record":{"id":"4bbbe5a2abc832a9","repo":"pentaho/pentaho-kettle","slug":"unable-to-save-job-entry-of-type-ftps-to-the-repository-for","errorCode":null,"errorMessage":"Unable to save job entry of type 'FTPS' to the repository for id_job=","messagePattern":"Unable to save job entry of type 'FTPS' to the repository for id_job=","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/ftps/impl/src/main/java/org/pentaho/di/job/entries/ftpsget/JobEntryFTPSGet.java","lineNumber":356,"sourceCode":"\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"AddDateBeforeExtension\", AddDateBeforeExtension );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"isaddresult\", isaddresult );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"createmovefolder\", createmovefolder );\n\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"proxy_host\", proxyHost );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"proxy_port\", proxyPort );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"proxy_username\", proxyUsername );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"proxy_password\", Encr\n        .encryptPasswordIfNotUsingVariables( proxyPassword ) );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"ifFileExists\", getFileExistsAction( ifFileExists ) );\n\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"nr_limit\", nr_limit );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"success_condition\", success_condition );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"connection_type\", FTPSConnection\n        .getConnectionType( connectionType ) );\n\n    } catch ( KettleDatabaseException dbe ) {\n      throw new KettleException(\n        \"Unable to save job entry of type 'FTPS' to the repository for id_job=\" + id_job, dbe );\n    }\n  }\n\n  public void setLimit( String nr_limitin ) {\n    this.nr_limit = nr_limitin;\n  }\n\n  public String getLimit() {\n    return nr_limit;\n  }\n\n  public void setSuccessCondition( String success_condition ) {\n    this.success_condition = success_condition;\n  }\n\n  public String getSuccessCondition() {\n    return success_condition;","sourceCodeStart":338,"sourceCodeEnd":374,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/ftps/impl/src/main/java/org/pentaho/di/job/entries/ftpsget/JobEntryFTPSGet.java#L338-L374","documentation":"KettleException thrown by JobEntryFTPSGet.saveRep when saving the job entry's attributes to the repository fails with a KettleDatabaseException. Message includes the id_job it attempted to save under.","triggerScenarios":"saveRep when the repository insert/update of attributes (nr_limit, success_condition, connection_type) fails — connection loss, constraint violation, read-only repository, or schema mismatch","commonSituations":"repository database down or locked; user lacks write permission on the repository; PDI version upgrade left the repository schema outdated; duplicate/invalid attribute rows","solutions":["Check repository database connectivity and that it is not read-only","Verify the repository user has INSERT/UPDATE rights on the attribute tables","Run the repository upgrade tool if PDI/plugin versions changed","Retry saving; inspect the wrapped KettleDatabaseException for the SQL-level cause"],"exampleFix":"// before\nrep.saveJobEntryAttribute(id_job, id, \"connection_type\", badCode); // may violate FK\n// after\nString code = FTPSConnection.getConnectionTypeByCode(connectionType); // validate first\nrep.saveJobEntryAttribute(id_job, id, \"connection_type\", code);","handlingStrategy":"try-catch","validationCode":"// ensure repository is writable beforehand\nif (!rep.isConnected() || rep.isReadOnly())\n  throw new KettleException(\"Repository unavailable or read-only\");","typeGuard":null,"tryCatchPattern":"try {\n  jobEntry.saveRep(rep, metaStore, id_job);\n} catch (KettleException dbe) {\n  logError(\"Repository save failed for id_job=\" + id_job + \": \" + dbe.getCause(), dbe);\n  throw dbe;\n}","preventionTips":["Grant repository users INSERT/UPDATE rights","Run repository schema upgrades after PDI version changes","Monitor repository DB health before large job saves"],"tags":["repository","database","persistence"],"backgroundTag":"database-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"}