# MARS-1049: ENCODING Implementation in FILE_MANAGER ## Change Description Adding `ENCODING` column to the `A_SOURCE_FILE_CONFIG` table and modifying the `FILE_MANAGER` package to support different character encodings for CSV files. ## Objective Enable configuration of character encoding for individual source files without code modifications. The value from the `ENCODING` column will be passed as a `characterset` parameter in the formatting options of the `CREATE_EXTERNAL_TABLE` procedure. --- ## 1. DATABASE STRUCTURE MODIFICATIONS ### Adding ENCODING column ```sql -- Add column to A_SOURCE_FILE_CONFIG table ALTER TABLE CT_MRDS.A_SOURCE_FILE_CONFIG ADD (ENCODING VARCHAR2(50)); -- Add column comment COMMENT ON COLUMN CT_MRDS.A_SOURCE_FILE_CONFIG.ENCODING IS 'Character encoding for CSV files (e.g. UTF8, WE8MSWIN1252, etc.)'; ``` **Data type**: `VARCHAR2(50)` - sufficient for Oracle encoding names **Nullable**: `YES` - defaults to NULL, database default encoding is used **Default**: `NULL` --- ## 2. FILE_MANAGER PACKAGE MODIFICATIONS ### A. CREATE_EXTERNAL_TABLE procedure signature (main) **BEFORE:** ```sql PROCEDURE CREATE_EXTERNAL_TABLE ( pTableName IN VARCHAR2, pTemplateTableName IN VARCHAR2, pPrefix IN VARCHAR2, pBucketUri IN VARCHAR2 DEFAULT ENV_MANAGER.gvInboxBucketUri, pFileName IN VARCHAR2 DEFAULT NULL, pDelimiter IN VARCHAR2 DEFAULT ',' ) ``` **PO:** ```sql PROCEDURE CREATE_EXTERNAL_TABLE ( pTableName IN VARCHAR2, pTemplateTableName IN VARCHAR2, pPrefix IN VARCHAR2, pBucketUri IN VARCHAR2 DEFAULT ENV_MANAGER.gvInboxBucketUri, pFileName IN VARCHAR2 DEFAULT NULL, pDelimiter IN VARCHAR2 DEFAULT ',', pEncoding IN VARCHAR2 DEFAULT NULL -- NOWY PARAMETR ) ``` ### B. Wywołanie procedury CREATE_EXTERNAL_TABLE (overload) **Lokalizacja**: Linie 499-506 **PRZED:** ```sql CREATE_EXTERNAL_TABLE( pTableName => vSourceFileReceived.EXTERNAL_TABLE_NAME, pTemplateTableName => vSourceFileConfig.TEMPLATE_TABLE_NAME, pPrefix => vSourceFileReceived.SOURCE_FILE_PREFIX_INBOX, pBucketUri => ENV_MANAGER.gvInboxBucketUri, pFileName => vFileName, pDelimiter => ',' ); ``` **PO:** ```sql CREATE_EXTERNAL_TABLE( pTableName => vSourceFileReceived.EXTERNAL_TABLE_NAME, pTemplateTableName => vSourceFileConfig.TEMPLATE_TABLE_NAME, pPrefix => vSourceFileReceived.SOURCE_FILE_PREFIX_INBOX, pBucketUri => ENV_MANAGER.gvInboxBucketUri, pFileName => vFileName, pDelimiter => ',', pEncoding => vSourceFileConfig.ENCODING -- NOWY PARAMETR ); ``` ### C. Logika kodowania w opcjach formatowania **Lokalizacja**: Około linii 455 w sekcji vFormat **PRZED:** ```sql IF pDelimiter = '|' THEN vFormat := json_object('delimiter' VALUE '|', 'skipheaders' VALUE '1'); ELSE vFormat := json_object('type' VALUE 'CSV', 'skipheaders' VALUE '1', 'ignoremissingcolumns' value 'true'); END IF; ``` **PO:** ```sql -- Tworzenie podstawowego formatu IF pDelimiter = '|' THEN vFormat := json_object('delimiter' VALUE '|', 'skipheaders' VALUE '1'); ELSE vFormat := json_object('type' VALUE 'CSV', 'skipheaders' VALUE '1', 'ignoremissingcolumns' value 'true'); END IF; -- Dodanie kodowania jeśli zostało określone IF pEncoding IS NOT NULL AND LENGTH(TRIM(pEncoding)) > 0 THEN vFormat := JSON_MERGEPATCH(vFormat, json_object('characterset' VALUE pEncoding)); END IF; ``` --- ## 3. PRZYKŁADY UŻYCIA ### Test z kodowaniem UTF-8 ```sql -- Konfiguracja dla plików z UTF-8 encoding UPDATE CT_MRDS.A_SOURCE_FILE_CONFIG SET ENCODING = 'UTF8' WHERE A_SOURCE_FILE_CONFIG_KEY = 1; ``` ### Test z kodowaniem Windows-1252 ```sql -- Konfiguracja dla plików z Windows-1252 encoding UPDATE CT_MRDS.A_SOURCE_FILE_CONFIG SET ENCODING = 'WE8MSWIN1252' WHERE A_SOURCE_FILE_CONFIG_KEY = 2; ``` ### Resetowanie do wartości domyślnych ```sql -- Usunięcie kodowania (powrót do domyślnego kodowania bazy) UPDATE CT_MRDS.A_SOURCE_FILE_CONFIG SET ENCODING = NULL WHERE A_SOURCE_FILE_CONFIG_KEY = 1; ``` --- ## 4. MODYFIKACJA ISTNIEJĄCEJ PROCEDURY ADD_SOURCE_FILE_CONFIG ### Rozszerzenie procedury ADD_SOURCE_FILE_CONFIG **PRZED:** ```sql PROCEDURE ADD_SOURCE_FILE_CONFIG( pSourceKey IN VARCHAR2, pSourceFileType IN VARCHAR2, pSourceFileId IN VARCHAR2, pSourceFileDesc IN VARCHAR2, pSourceFileNamePattern IN VARCHAR2, pTableId IN VARCHAR2, pTemplateTableName IN VARCHAR2 ) ``` **PO:** ```sql PROCEDURE ADD_SOURCE_FILE_CONFIG( pSourceKey IN VARCHAR2, pSourceFileType IN VARCHAR2, pSourceFileId IN VARCHAR2, pSourceFileDesc IN VARCHAR2, pSourceFileNamePattern IN VARCHAR2, pTableId IN VARCHAR2, pTemplateTableName IN VARCHAR2, pEncoding IN VARCHAR2 DEFAULT NULL -- NOWY PARAMETR ) ``` ### Modyfikacja INSERT statement w ADD_SOURCE_FILE_CONFIG **PRZED:** ```sql INSERT INTO CT_MRDS.A_SOURCE_FILE_CONFIG ( A_SOURCE_KEY, SOURCE_FILE_TYPE, SOURCE_FILE_ID, SOURCE_FILE_DESC, SOURCE_FILE_NAME_PATTERN, TABLE_ID, TEMPLATE_TABLE_NAME ) VALUES ( pSourceKey, pSourceFileType, pSourceFileId, pSourceFileDesc, pSourceFileNamePattern, pTableId, pTemplateTableName ); ``` **PO:** ```sql INSERT INTO CT_MRDS.A_SOURCE_FILE_CONFIG ( A_SOURCE_KEY, SOURCE_FILE_TYPE, SOURCE_FILE_ID, SOURCE_FILE_DESC, SOURCE_FILE_NAME_PATTERN, TABLE_ID, TEMPLATE_TABLE_NAME, ENCODING ) VALUES ( pSourceKey, pSourceFileType, pSourceFileId, pSourceFileDesc, pSourceFileNamePattern, pTableId, pTemplateTableName, pEncoding ); ``` ### Przykład użycia zmodyfikowanej procedury ```sql -- Dodanie konfiguracji z kodowaniem UTF-8 CALL FILE_MANAGER.ADD_SOURCE_FILE_CONFIG( pSourceKey => 'C2D', pSourceFileType => 'INPUT', pSourceFileId => 'UC_DISSEM', pSourceFileDesc => 'UC DISSEM Metadata with UTF-8 encoding', pSourceFileNamePattern => 'UC_NMA_DISSEM-*.csv', pTableId => 'A_UC_DISSEM_METADATA_LOADS', pTemplateTableName => 'CT_ET_TEMPLATES.C2D_A_UC_DISSEM_METADATA_LOADS', pEncoding => 'UTF8' ); -- Dodanie konfiguracji bez kodowania (jak dotychczas) CALL FILE_MANAGER.ADD_SOURCE_FILE_CONFIG( pSourceKey => 'LM', pSourceFileType => 'INPUT', pSourceFileId => 'STANDING_FACILITIES', pSourceFileDesc => 'Standing Facilities Data', pSourceFileNamePattern => 'SF_*.csv', pTableId => 'STANDING_FACILITIES', pTemplateTableName => 'CT_ET_TEMPLATES.LM_STANDING_FACILITIES' -- pEncoding pomijamy - będzie NULL (domyślne kodowanie) ); ``` --- ## 5. TESTY WALIDACYJNE ### Test 1: Podstawowa funkcjonalność ```sql -- 1. Ustawienie kodowania UTF-8 UPDATE CT_MRDS.A_SOURCE_FILE_CONFIG SET ENCODING = 'UTF8' WHERE A_SOURCE_FILE_CONFIG_KEY = 1; -- 2. Test przetwarzania pliku CALL FILE_MANAGER.PROCESS_SOURCE_FILE('INBOX/TEST/FILE_ID/TABLE_NAME/test_file.csv'); -- 3. Sprawdzenie logów SELECT * FROM CT_MRDS.A_PROCESS_LOG WHERE PROCEDURE_NAME = 'CREATE_EXTERNAL_TABLE' ORDER BY LOG_DATE DESC; ``` ### Test 2: Fallback do wartości domyślnych ```sql -- 1. Ustawienie NULL UPDATE CT_MRDS.A_SOURCE_FILE_CONFIG SET ENCODING = NULL WHERE A_SOURCE_FILE_CONFIG_KEY = 1; -- 2. Test przetwarzania - powinno być używane domyślne kodowanie CALL FILE_MANAGER.PROCESS_SOURCE_FILE('INBOX/TEST/FILE_ID/TABLE_NAME/test_file.csv'); ``` ### Test 3: Różne kodowania ```sql -- 1. Test z Windows-1252 UPDATE CT_MRDS.A_SOURCE_FILE_CONFIG SET ENCODING = 'WE8MSWIN1252' WHERE A_SOURCE_FILE_CONFIG_KEY = 1; -- 2. Test z UTF-8 UPDATE CT_MRDS.A_SOURCE_FILE_CONFIG SET ENCODING = 'UTF8' WHERE A_SOURCE_FILE_CONFIG_KEY = 2; -- 3. Test przetwarzania obu plików CALL FILE_MANAGER.PROCESS_SOURCE_FILE('INBOX/TEST1/FILE_ID/TABLE_NAME/test_file1.csv'); CALL FILE_MANAGER.PROCESS_SOURCE_FILE('INBOX/TEST2/FILE_ID/TABLE_NAME/test_file2.csv'); ``` --- ## 6. HARMONOGRAM WDROŻENIA ### Faza 1: Przygotowanie struktury (KRYTYCZNA) 1. ✅ Dodanie kolumny `ENCODING` do tabeli 2. ✅ Zaktualizowanie definicji tabeli w plikach DDL ### Faza 2: Modyfikacja pakietu (WYSOKA) 1. ⏳ Dodanie parametru do sygnatury `CREATE_EXTERNAL_TABLE` 2. ⏳ Implementacja logiki kodowania w formatowaniu JSON 3. ⏳ Aktualizacja wywołania w procedurze overload 4. ⏳ Aktualizacja parametrów logowania ### Faza 3: Testy i walidacja (ŚREDNIA) 1. ⏳ Testy jednostkowe z różnymi kodowaniami 2. ⏳ Testy integracyjne z różnymi typami plików 3. ⏳ Walidacja fallback do domyślnego kodowania ### Faza 4: Modyfikacja procedur konfiguracyjnych (NISKA) 1. ⏳ Modyfikacja `ADD_SOURCE_FILE_CONFIG` - dodanie parametru `pEncoding` 2. ⏳ Aktualizacja dokumentacji 3. ⏳ Przykłady użycia w confluence --- ## 7. ROLLBACK W przypadku problemów można wykonać rollback: ```sql -- Usunięcie kolumny (OSTROŻNIE - spowoduje utratę danych) ALTER TABLE CT_MRDS.A_SOURCE_FILE_CONFIG DROP COLUMN ENCODING; -- Przywrrócenie oryginalnej wersji pakietu FILE_MANAGER -- (wymagane przywrrócenie z backupu) ``` --- ## 8. UWAGI TECHNICZNE ### Ograniczenia - Maksymalna długość nazwy kodowania: 50 znaków - Obsługiwane kodowania: wszystkie wspierane przez Oracle Database - Przykłady poprawnych nazw: `UTF8`, `WE8MSWIN1252`, `AL32UTF8`, `WE8ISO8859P1` ### Bezpieczeństwo - Brak walidacji nazwy kodowania na poziomie aplikacji - Oracle Database zwaliduje kodowanie podczas tworzenia external table - Fallback do domyślnego kodowania bazy w przypadku NULL ### Wydajność - Minimalne obciążenie - kodowanie dodawane tylko jeśli nie jest NULL - Brak wpływu na istniejące procesy gdy kolumna jest NULL - Używa natywnej funkcji JSON_MERGEPATCH Oracle Database --- ## 9. PRZYGOTOWANIE PACZKI INSTALACYJNEJ ### Struktura paczki MARS-1049 ``` MARS_Packages/REL02/MARS-1049/ ├── 01_MARS_1049_install_CT_MRDS_ADD_ENCODING_COLUMN.sql ├── 02_MARS_1049_install_CT_MRDS_FILE_MANAGER_SPEC.sql ├── 03_MARS_1049_install_CT_MRDS_FILE_MANAGER_BODY.sql ├── 04_MARS_1049_verify_ENCODING_FUNCTIONALITY.sql ├── 05_MARS_1049_track_version.sql ├── 91_MARS_1049_rollback_FILE_MANAGER_BODY.sql ├── 92_MARS_1049_rollback_FILE_MANAGER_SPEC.sql ├── 93_MARS_1049_rollback_ENCODING_COLUMN.sql ├── 94_MARS_1049_track_rollback_version.sql ├── install_mars1049.sql ├── rollback_mars1049.sql └── README_ENCODING.md ``` ### Zawartość skryptów instalacyjnych #### 01_MARS_1049_install_CT_MRDS_ADD_ENCODING_COLUMN.sql ```sql -- MARS-1049: Dodanie kolumny ENCODING do A_SOURCE_FILE_CONFIG -- Autor: System Enhancement -- Data: 2025-11-24 PROMPT Adding ENCODING column to CT_MRDS.A_SOURCE_FILE_CONFIG ALTER TABLE CT_MRDS.A_SOURCE_FILE_CONFIG ADD (ENCODING VARCHAR2(50)); COMMENT ON COLUMN CT_MRDS.A_SOURCE_FILE_CONFIG.ENCODING IS 'Character encoding for CSV files (e.g. UTF8, WE8MSWIN1252, etc.)'; PROMPT ENCODING column added successfully ``` #### 02_MARS_1049_install_CT_MRDS_FILE_MANAGER_SPEC.sql ```sql -- MARS-1049: Aktualizacja specyfikacji FILE_MANAGER - dodanie parametru pEncoding -- Zawiera: Modyfikację sygnatury CREATE_EXTERNAL_TABLE i ADD_SOURCE_FILE_CONFIG ``` #### 04_MARS_1049_verify_ENCODING_FUNCTIONALITY.sql ```sql -- MARS-1049: Weryfikacja funkcjonalności ENCODING PROMPT Testing ENCODING functionality... -- Test 1: Sprawdzenie struktury tabeli SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'A_SOURCE_FILE_CONFIG' AND COLUMN_NAME = 'ENCODING'; -- Test 2: Test podstawowej funkcjonalności INSERT INTO CT_MRDS.A_SOURCE_FILE_CONFIG ( A_SOURCE_KEY, SOURCE_FILE_TYPE, SOURCE_FILE_ID, SOURCE_FILE_DESC, SOURCE_FILE_NAME_PATTERN, TABLE_ID, TEMPLATE_TABLE_NAME, ENCODING ) VALUES ( 'TEST', 'INPUT', 'ENCODING_TEST', 'Test ENCODING functionality', 'test_*.csv', 'TEST_TABLE', 'CT_ET_TEMPLATES.TEST_TABLE', 'UTF8' ); -- Sprawdzenie czy rekord został dodany SELECT A_SOURCE_FILE_CONFIG_KEY, ENCODING FROM CT_MRDS.A_SOURCE_FILE_CONFIG WHERE A_SOURCE_KEY = 'TEST' AND SOURCE_FILE_ID = 'ENCODING_TEST'; -- Cleanup DELETE FROM CT_MRDS.A_SOURCE_FILE_CONFIG WHERE A_SOURCE_KEY = 'TEST' AND SOURCE_FILE_ID = 'ENCODING_TEST'; PROMPT ENCODING functionality verification completed successfully ``` #### install_mars1049.sql (Master Install Script) ```sql -- MARS-1049: Master Installation Script -- CSV Encoding Support Implementation PROMPT ================================================ PROMPT MARS-1049: Installing CSV Encoding Support PROMPT ================================================ SPOOL install_mars1049.log -- Faza 1: Struktura bazy danych PROMPT Phase 1: Database Structure Changes @@01_MARS_1049_install_CT_MRDS_ADD_ENCODING_COLUMN.sql -- Faza 2: Pakiet FILE_MANAGER (Specyfikacja) PROMPT Phase 2: FILE_MANAGER Package Specification @@02_MARS_1049_install_CT_MRDS_FILE_MANAGER_SPEC.sql -- Faza 3: Pakiet FILE_MANAGER (Ciało) PROMPT Phase 3: FILE_MANAGER Package Body @@03_MARS_1049_install_CT_MRDS_FILE_MANAGER_BODY.sql -- Faza 4: Weryfikacja PROMPT Phase 4: Functionality Verification @@04_MARS_1049_verify_ENCODING_FUNCTIONALITY.sql -- Faza 5: Tracking wersji PROMPT Phase 5: Version Tracking @@05_MARS_1049_track_version.sql PROMPT ================================================ PROMPT MARS-1049: Installation completed successfully PROMPT ================================================ SPOOL OFF ``` #### rollback_mars1049.sql (Master Rollback Script) ```sql -- MARS-1049: Master Rollback Script -- WARNING: This will remove ENCODING functionality PROMPT ================================================ PROMPT MARS-1049: Rolling back CSV Encoding Support PROMPT WARNING: This will remove ENCODING column and data! PROMPT ================================================ SPOOL rollback_mars1049.log -- Rollback w odwrotnej kolejności @@94_MARS_1049_track_rollback_version.sql @@93_MARS_1049_rollback_ENCODING_COLUMN.sql @@92_MARS_1049_rollback_FILE_MANAGER_SPEC.sql @@91_MARS_1049_rollback_FILE_MANAGER_BODY.sql PROMPT ================================================ PROMPT MARS-1049: Rollback completed PROMPT ================================================ SPOOL OFF ``` ### Deployment Commands ```powershell # Instalacja paczki MARS-1049 Get-Content "MARS_Packages\REL02\MARS-1049\install_mars1049.sql" | sql "CT_MRDS/Cloudpass#34@ggmichalski_high" # W przypadku problemów - rollback Get-Content "MARS_Packages\REL02\MARS-1049\rollback_mars1049.sql" | sql "CT_MRDS/Cloudpass#34@ggmichalski_high" # Archiwizacja po instalacji 7z a -pMojeSuperHaslo -mhe=on MARS_1049_arch.7z MARS_Packages\REL02\MARS-1049\*.sql ``` --- ## Status: GOTOWE DO IMPLEMENTACJI **Utworzone**: 2025-11-24 **Autor**: System FILE_MANAGER Enhancement **MARS Issue**: MARS-1049 **Priorytet**: WYSOKI