Własna kontrolka SSIS, część 1

Skoro znamy już wymagania i z grubsza zakres pomyślmy jak podejść do tematu własnej kontrolki. Opcji mamy mnóstwo, ale weźmy pod uwagę dwie:

  • albo patrzymy co mamy i bierzemy pod uwagę, że da się to usprawnić
  • albo wymyślamy koło na nowo

Wybieram bramkę numer jeden. Przyjrzę się co mam teraz i przy dalszej analizie może wyciągnę wnioski co poprawić, co wyciąć, co dodać i może będzie tak, że z początkowego pomysłu zostanie nic. Albo i nic nie zostanie.

Co mamy?

Obecne rozwiązanie przypomina czasem coś co się trzyma na ślinę, sznurek i kawałek taśmy klejącej. Ale działa. Do tego działa dobrze (rzecz jasna o ile nie wystąpią błędy) i nawet da się popatrzeć co się działo po kolei. W końcu prowizorki są najtrwalsze.

Choć tutaj nie tyle prowizorka, co może prototyp, który wyewoluował w rozwiązanie docelowe z powodu takich, a nie innych ram czasowych. Gdzieś czytałem, że prototypy najlepiej robić w innej technologii niż planujemy użyć (a czasem najlepiej nawet na kartkach papieru), bo biznes widząc nasz prototyp stwierdzi, że mamy działające rozwiązanie i już, teraz, natychmiast, od razu je wdrażajmy. Może to i dobra rada z tymi kartkami?

Wracając do stanu zastanego. Rdzeniem rozwiązania jest kontener zawierający „podkontener” oraz serię komponentów SQL Task, Data Flow i Execute Process Task, a do tego managery połączeń do dwóch plików tekstowych (z parametryzowaną lokalizacją). Dlaczego Execute Process Task, a nie np. kawałek kodu w C#, skoro można oprogramować WinSCP w .NET? W momencie pisania zasilania biblioteka winscp.dll nie była zarejestrowana w GAC, nie wiadomo było czy będzie wolno to zrobić a do tego prototypy pobierające pliki chodziły na skryptach napisanych w Powershellu – to czemu by ich nie wykorzystać?

Co do tego? Jedna tabelka metadanych o przetworzonych plikach, jedna tabelka na listę katalogów do przeszukiwania i cztery tabelki na listy plików:

  • lista wszystkich plików na serwerze (w katalogach, które przeszukujemy)
  • lista plików, które chcemy pobrać
  • lista plików dodatkowych
  • lista plików ignorowanych

Dwie ostatnie pozycje służą do ponownego pobierania plików (np. z powodu błędnego pliku na serwerze, który został podmieniony, a w metadanych mamy go odznaczonego jako przetworzony) oraz ignorowania części plików (np. wiemy, że jakiś plik jest błędny, ale nie możemy go skasować – a nie ma sensu go za każdym razem pobierać).

Co w kontenerze obsługującym pobieranie się po kolei dzieje:

  1. SQL Lista katalogów z plikami do pobrania pobiera listę katalogów do przeszukania na serwerze docelowym i umieszcza wynik w zmiennej typu System.Object
  2. SQL Wyczyść tabele pomocnicze list plików czyści obecne tabelki pomocnicze (lista plików na serwerze i lista plików do pobrania)
  3. Kontener (For Eeach) FELC Pobierz pliki dla każdego katalogu wywoływany jest w pętli po zmiennej ustawianej w kroku na początku; idziemy po kolei po wybranej wcześniej liście katalogów na serwerze, które nas interesują
    1. Za pomocą EPR Pobierz listę plików z FTP wywołujemy przez Execute Process Task skrypt Powershell, który pobiera z serwera listę wszystkich plików na serwerze (w katalogu przekazanym jako parametr kontenera), a potem zapisuje tą listę do pliku
    2. DFT Lista plików na serwerze wczytuje do bazy plik z listą plików na serwerze
    3. W DFT Przygotowanie listy plików do pobrania z serwera ta lista jest porównywana z tabelką metadanych pobranych wcześniej plików oraz tabelkami plików dodatkowych i ignorowanych, na tej podstawie generowany jest plik z nazwami plików do pobrania z serwera
    4. Pliki z listy są pobierane z serwera za pomocą kolejnego skryptu Powershell w EPR Pobierz pliki z FTP

Tak prezentuje się na obrazku (bez podłączenia do serwerów, stąd czerwone kółka)
SSIS_PobieraniePlikowFTP_StanPoczatkowy

Widać, że kombinowane. Skopiowanie rozwiązania do innego pakietu pociąga za sobą przygotowanie minimum dwóch skryptów Powershell, czterech tabelek pomocniczych do obsługi list plików, tabelki z listą katalogów, plików z listami plików (bez tego nie ruszy dobrze manager połączeń do pliku) i przeklikanie się przez pakiety, żeby dobrze ustawić metadane do odpowiednich plików i tabelek. Upierdliwe, ale do zrobienia.

Dużym minusem jest też trzymanie haseł w skryptach Powershell, ale też dzięki temu możemy przetestować łączenie do serwera niezależnie od pakietu SSIS. Takie rozbicie, że część mamy w pakiecie SSIS, część w plikach gdzieś w katalogach na serwerze, część zapisuje pliki lokalne wczytywane potem do bazy – no można to zrobić lepiej. To zrobię.

Co do możliwości przetestowania z poziomu Powershella – może niech kontrolka pozwoli sprawdzić połączenie czy jest OK? Bez szaleństw i wbudowywania klienta FTP, może wystarczy fakt „połączyłem się (i widzę katalog (ze zmiennej)?)”.

Na obrazku widać też, że Execute Process Task są sparametryzowane (znaczek fx). Przekazywane są nazwy katalogów do pobrania nazw plików oraz parametr ilości plików, które można pobrać na raz – okazuje się, że czasem serwer aktywnie odmawia połączenia, jeśli pobieramy z niego za dużo plików na raz.

Co chcemy?

Celem kontrolki jest po pierwsze wyeliminowanie uciążliwej konfiguracji – niech pakiet samodzielnie się zatroszczy o wszystkie elementy pomocnicze (albo o tyle ile się da – ale nie mniej), a po drugie danie jakiegoś prostego interfejsu, gdyby użytkownik chciał mieć wolną rękę i poustawiać sobie niektóre parametry samodzielnie. Oczywiście jeśli ustawiane parametry kontrolki będą mogły pochodzić z parametrów pakietu, projektu czy zmiennej to już w ogóle bajer.

Kiedy to chcemy?

Na maj? Masz trzy miesiące, Numernabisie. Inaczej oddam Cię krokodylom.

W następnej części pojawi się wreszcie kod, w tym analiza skryptów Powershell, które będą do przerobienia na kawałki kodu C#.

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s