Własna kontrolka SSIS, część 7 – komunikacja z serwerem SFTP

Jeśli chcesz przez ponad godzinę szukać błędu w kodzie, który po wprowadzeniu ostatnich kosmetycznych zmian niemal się nie różni od poprzedniej wersji, to chyba nie ma nic lepszego od podmiany biblioteki używanej w referencjach. Dzień wcześniej. I zapomnienia o tym.

Przez to poprawnie działający pakiet SSIS nagle krzyczy błędami, a wycofanie zmian nic nie daje. Dopiero olśnienie po odejściu od komputera – skoro ustawiam referencję do nowej biblioteki, to pewnie rejestrowałem ją w GAC! I rzeczywiście – usunięcie poprzedniej wersji oraz dodanie nowej pomogło. Dzięki temu straciłem tylko niewielką część zmian, kiedy robiłem kolejne „Undo” z poziomu gita w poszukiwaniu „tej jednej przeoczonej zmiany”.

Kontrolka WinSCP może już się podłączać do serwera SFTP, to pora żeby zaczęła robić coś więcej. W obecnym rozwiązaniu korzystam z kawałka kodu odczytującego rekurencyjnie pliki w katalogach. Ale przy oglądaniu nowości w dokumentacji WinSCP okazało się, że będzie można użyć do tego tylko jednej instrukcji – Session.EnumerateRemoteFiles – w takim razie wykorzystamy ją do pobrania listy plików.

Klasy pomocnicze

Klasa WinSCPTask będzie zawierać tylko metody wymagane przez silnik SSIS. Pozostałe polecenia będą obsługiwane przez inne klasy z tego samego projektu. I już na początku mam zagwozdkę – jak nazwać klasę, która będzie odpowiadać za komunikację między SSIS a serwerem SFTP.

W ramach tej klasy powstaną metody, które z pomocą przesłanych parametrów (m.in. connection manager, transaction object) nawiążą komunikację z serwerem, po czym odpytają go odpowiednio a na koniec pracy grzecznie się rozłączą. Wszystko polega na wywołaniu metod biblioteki WinSCP, a pojęcia które mi przychodzą w związku z tym na myśl to proxywrapper. Nazwy mogą niechcący sugerować związek z wzorcami projektowymi, ale używałem ich dotąd tak mało i na tyle na czuja, że niekoniecznie musi to być to. W każdym razie na początek przyjmuję nazwę WinSCPWrapper dla klasy wywołującej metody WinSCP.

API – przynajmniej na początku – nie będzie przesadnie rozbudowane:

  • Połącz się z serwerem – wywołanie AcquireConnection z naszego managera połączenia do serwera SFTP
  • Pobierz listę plików – wywołanie metody EnumerateRemoteFiles biblioteki WinSCPNet
  • Pobierz pliki – wywołanie metody GetFiles biblioteki WinSCPNet
  • Odłącz się od serwera – wywołanie metody ReleaseConnection z naszego managera połączenia do serwera SFTP

Prawdopodobnie odrębne wywołanie ReleaseConnection będzie nadmiarowe, ale to wyjdzie przy testowaniu i debugowaniu.

Przy omawianiu pobierania listy plików zapisałem, żeby spróbować pominąć rekurencję przy szukaniu plików – czyli żeby nie sprawdzać podkatalogów. Super sprawa, że da się to zrobić przez ustawianie opcji EnumerationOptions metody EnumerateRemoteFiles – jeśli chcemy rekurencję ustawiamy wartość EnumerationOptions.AllDirectories, a jeśli nie, to EnumerationOptions.None. Szybkie i proste. Ustawiane to będzie przez kolejną opcję kontrolki.

Na razie więcej tu szkicu rozwiązania niż samego mięsa. Trochę specjalnie – przy budowaniu komunikacji z serwerem SFTP będzie trzeba sprawdzić, czy to działa dobrze. Na razie obserwując na żywo logi serwera widać, że łączy się i rozłącza prawidłowo, ale to nie do końca to. Do tej pory nie znalazłem jak podejść do tematu testów jednostkowych dla kontrolki SSIS, ale może pojawi się światełko w tunelu – w następnym odcinku sprawdzimy jak wykorzystać debugger, żeby sprawdzać poprawność kodu biblioteki.

Własna kontrolka SSIS, część 6 – podłączamy się do serwera SFTP

Mamy szkielet kontrolki. Umiemy napisać coś, co się poprawnie kompiluje i nawet pojawia się w przyborniku SSIS (SSIS Toolbox). Sukces! To teraz pora sprawić, żeby kontrolka mogła się połączyć z serwerami SFTP i SQL. Do roboty.

Na pierwszy ogień połączymy się z SFTP (dla FTPS będzie podobnie). Jeśli nie mamy jakiegoś serwera pod ręką proponuję ściągnąć darmowy Rebel Tiny SFTP Server, który bardzo dobrze się sprawdza do testowania własnego kodu. Po uruchomieniu automatycznie generują się potrzebne klucze i serwer jest gotowy do działania.
Czytaj dalej

Własna kontrolka SSIS, część 3 – O pobieraniu danych

Wiemy jak w podstawowy sposób odczytać listę plików w katalogu na serwerze. To teraz pobierzmy te pliki. Jeden z kroków kontenera pakietu SSIS generuje plik tekstowy zawierający listę plików do pobrania. Każdy z plików jest podawany w odrębnej linii – potem wczytamy plik, rozbijemy go na linie i w pętli wczytamy każdy z nich po kolei.

Dla przypomnienia – ważne jest, żeby podawać pełne ścieżki do plików względem katalogu głównego. Przeglądając dokumentację WinSCP zauważyłem jeszcze jedną nowość w wersji 5.8 beta: pojawił się parametr string FullName , który zwraca pełną ścieżkę do pliku. Nie trzeba będzie sklejać parametru przesyłanej ścieżki z nazwą pliku odczytaną jako Name. Ponieważ w kontrolce będziemy korzystać z wersji beta biblioteki to warto mieć na uwadze.

Przejdźmy do kodu. Na razie popatrzymy jak to wygląda w Powershell. Podobnie jak poprzednio zaczynamy od parametrów i funkcji, która pobierze plik. Nadal korzystamy z przykładu z dokumentacji.
Czytaj dalej

Własna kontrolka SSIS, część 2

Tym razem popatrzymy na obsługę jednej z dwóch funkcjonalności kontrolki. Sprawdzimy jakie pliki są na serwerze w katalogu, który nas interesuje, a w następnym poście pobierzemy pliki, które nam wyjdą z przepatrywania metadanych i tabel pomocniczych. Obie funkcjonalności będą obsługiwane z wykorzystaniem winscp.dll.

W obecnym rozwiązaniu pobieranie listy plików wykorzystuje trochę zmodyfikowany przykładowy skrypt przeszukiwania plików katalogu. Ten dostępny na stronie jest nieco bardziej zaawansowany – bo wręcz pobiera pliki i sprawdza ich zawartość, a nas interesuje tylko lista plików (ewentualnie z jakąś maską – np. chcemy tylko pliki .csv). Pierwszy zmodyfikowany fragment definiujący funkcję SearchDirectory poniżej. Czytaj dalej

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. Czytaj dalej

Własna kontrolka SSIS, część 0

Zadanie jest stosunkowo proste

Słuchaj, bo to jest tak. Na serwer FTP wpadają pliki. Musimy je pobrać do siebie i zasilić bazę danymi. Z tych plików właśnie. No.” Proszę bardzo. Wykorzystujemy do tego SSIS (dla punktu zaczepienia przyjmijmy wersję 2012). Możemy do tego wykorzystać standardową kontrolkę FTP z SSIS. Przeciągamy co trzeba, konfiguracja, kilka poprawek, test i działa – mamy pliki u siebie. Czas na kawę #2.
Czytaj dalej