From e75fc365c5310a9a07d73d51617a681c41e44ff6 Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Mon, 3 Aug 2026 09:36:59 +0300 Subject: [PATCH] docs: depanarea actualizarii ROA (PACK_UPDATE) Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01TM9Cxpzrn9wBSkyBNr22Qc --- docs/depanare-pack-update.md | 96 ++++++++++++++++++++++++++++++++++++ docs/reguli_lucru.md | 1 + 2 files changed, 97 insertions(+) create mode 100644 docs/depanare-pack-update.md diff --git a/docs/depanare-pack-update.md b/docs/depanare-pack-update.md new file mode 100644 index 0000000..0b69152 --- /dev/null +++ b/docs/depanare-pack-update.md @@ -0,0 +1,96 @@ +# Depanare actualizare ROA (CONTAFIN_ORACLE.PACK_UPDATE) + +Actualizarea automata a aplicatiilor si a bazei ruleaza din jobul `CONTAFIN_ORACLE.UPDATEROA_ZILNIC` +-> `PACK_UPDATE.UpdateROA`, in 3 etape secventiale: **UpdateApp** (descarca arhivele programelor) -> +**UpdateScripts** (umple `UPD_DATABASE`) -> **UpdateDatabaseSqlPlus** (aplica scripturile pe scheme). +O etapa esuata le opreste pe toate urmatoarele. + +## Unde te uiti, in ordine + +| Ce | Unde | +|---|---| +| pana unde a ajuns fiecare rulare | `UPD_ISTORIC` (`stare`: 0=start, 1=aplicatii, 2=scripturi, 3=aplicare, 4=incheiat; `dataora_end` gol = neincheiata) | +| cauza reala a esecului | `UPD_LOG` (`dataora_start` = rularea, `secventa`+`dataora` = ordinea; `explicatie` e CLOB) | +| ce a raportat jobul | `dba_scheduler_job_run_details` (`log_date`, `status`, `additional_info`) | +| ce versiuni s-au descarcat | `UPD_PROGRAME` | +| scripturi disponibile / aplicate | `UPD_DATABASE.script_date` vs `.VERSIUNE.data_script` | + +Un sir de rulari oprite la aceeasi `stare` da direct etapa vinovata, iar prima zi din sir da data de +la care s-a schimbat ceva. + +## Capcane + +- **`UPD_LOG` se goleste la fiecare rulare.** Nu ai istoric: iei log-ul rularii curente, altfel + relansezi ca sa-l reproduci. +- **Eroarea din `additional_info` a jobului e de obicei falsa.** Pe orice esec se apeleaza `EmailLog`, + iar daca SMTP-ul e picat ridica `ORA-20000` care inlocuieste eroarea originala. Cauza adevarata e + in `UPD_LOG`. +- **`UpdateApp` abandoneaza tot la primul program nedescarcat** (`exit` din bucla, `CT_INSUCCES`) — + deci si programele de dupa el in lista, si ambele etape de baza de date. Un singur fisier + indisponibil blocheaza actualizarile la infinit, tacut. +- **`GetStare` refuza o rulare noua** cat timp precedenta e neincheiata si nu a trecut o ora. + Se deblocheaza cu `exec contafin_oracle.pack_update.IncheiereActualizare`. +- Programele `%USERREPORTS%` merg toate in directorul `UPD_USERREPORTS`, nu in `UPD_`. + +## Descarcarea (UpdateApp) + +Cu `server_info.POWERSHELLDOWNLOAD = '1'`, `PACK_UTILS.DownloadFileOS` scrie un `.ps1` cu `curl` in +`DMPDIR`, il lanseaza cu `sys.ExecuteScriptOS` si asteapta aparitia fisierului in directorul Oracle +`UPD_`. Daca **folderul de pe disc lipseste**, curl esueaza mut si in log apare doar +`Fisierul NU s-a salvat pe disc.` — verifica intai directorul, nu reteaua. + +Verificari rapide (read-only, din `contafin_oracle`): + +```sql +-- calea configurata +select directory_name, directory_path from all_directories where directory_name like 'UPD%'; +-- fisierul chiar exista pe disc? +select dbms_lob.fileexists(bfilename('UPD_ROACONT','ROACONT-2.11.70.zip')) from dual; +``` + +```sql +-- directorul exista si e scriibil? ORA-29283 = cale OS inexistenta sau fara drept de scriere +declare f utl_file.file_type; begin + f := utl_file.fopen('UPD_USERREPORTS','__probe.txt','W'); utl_file.fclose(f); + utl_file.fremove('UPD_USERREPORTS','__probe.txt'); +end; +/ +``` + +URL-ul se testeaza direct cu `curl` de pe orice masina (`optiuni.UPD_URL_APP`, cu `|CUSTOMERID|` +inlocuit din `sys.auth_detalii.detalii`); daca da 200, problema e local pe server. + +## Comenzi OS pe serverul de baze de date + +`sys.ExecuteScriptOS(, )` creeaza un job scheduler `executable` — **asincron**, +deci rezultatul se verifica prin polling, nu imediat. Scriptul se scrie cu +`pack_utils_file.clob2fileX(, 'DMPDIR', '.ps1')`. Utila cand ai doar acces Oracle +(ex. tunel SSH), fara RDP: + +```sql +declare lcPS server_info.value%type; begin + select value into lcPS from server_info where upper(name)='POWERSHELLPATH'; + pack_utils_file.filedelete('DMPDIR','x.ps1'); + pack_utils_file.clob2fileX('New-Item -ItemType Directory -Force -Path ''D:\...'' | Out-Null', + 'DMPDIR','x.ps1'); + sys.ExecuteScriptOS(lcPS, 'C:\DMPDIR\x.ps1'); +end; +/ +``` + +## Configurare (CONTAFIN_ORACLE) + +- `server_info`: `POWERSHELLDOWNLOAD`, `POWERSHELLPATH`, `POWERSHELLTIMEOUT`, `CURLPATH`, + `SQLPLUSPATH`, `EMAIL_METHOD`/`EMAIL_SMTP`/`EMAIL_PORT`/`EMAIL_USERNAME`/`EMAIL_PASSWORD`/ + `EMAIL_FROM`/`EMAIL_TO`. +- `optiuni`: `UPD_URL_APP`, `UPD_URL_DATABASE`, `UPD_URL_BULETININF` (daca lipsesc, pachetul + foloseste URL-uri implicite din cod). + +## Conectare la serverul unui client + +Tunel SSH pe 1521 + alias TNS pe `127.0.0.1` in `D:\ROA\instantclient_19_18\tnsnames.ora` +(ex. `ROA_ROMCONSTRUCT`), utilizator `contafin_oracle`. Vezi `oracle_export.md` pentru client si +capcana de encoding; parolele stau in `docs/local/` al proiectului, neversionat. + +Serverele de client pot fi Oracle 10g: unele coloane din `dba_scheduler_*` lipsesc +(`dba_scheduler_running_jobs.last_start_date`) — foloseste `dba_scheduler_job_run_details`. diff --git a/docs/reguli_lucru.md b/docs/reguli_lucru.md index a8bb8fc..92acf82 100644 --- a/docs/reguli_lucru.md +++ b/docs/reguli_lucru.md @@ -65,6 +65,7 @@ - testare UI / prin MCP -> `testare-ui-vfp.md`, `testare-vfp-mcp.md`; - garzi pe valori NULL din Oracle -> `conventie_null_vfp.md`; - export date din Oracle -> `oracle_export.md`; + - actualizarea ROA nu se finalizeaza (job update, PACK_UPDATE) -> `depanare-pack-update.md`; - modifici schema Oracle (tabele/view-uri/pachete) -> `scripturi-migrare-db.md`. 8. Eroare raportata de utilizator: nu analiza statica indelungata — scrie intai un test care o reproduce pe fluxul real; el da cauza si confirma remedierea. Analiza statica doar cat sa stii