Skryptologia stosowana

https://xpil.eu/Xpy0X

Zdarzyło mi się kiedyś brać udział w migracji hurtowni danych. Migracja była w miarę prosta: przeniesienie wszystkiego na lepiej wyposażone serwery z nowszymi wersjami oprogramowania. Żadnych wielkich zmian. Wszystko w ramach tego samego dostawcy oprogramowania (w tym konkretnym przypadku: Microsoft).

Migracja poszła w miarę bezboleśnie i zajęła raptem około miesiąca. Miesiąc może się wydawać dość długim okresem, ale pamiętajmy, że mówimy tutaj nie o warzywniaku pana Józka, tylko o przeniesieniu wielusetgigabajtowej machiny żonglującej danymi z kilkunastu różnych systemów, z kilkudziesięcioma różnej maści i temperamentu użytkownikami końcowymi, z mnóstwem wewnętrznych i zewnętrznych zależności - i tak dalej.

Zaskakująco, największą bolączką okazała się aktualizacja pakietów SSIS do nowej wersji.

I to wcale nie z powodu niekompatybilności wersji. Co to, to nie. Microsoft doskonale odrobił zadanie domowe i zapewnił bezbolesną migrację projektów SSIS z wersji 2008 do 2012.

Problemem okazała się jedna, malutka, darmowa wtyczka od zewnętrznego dostawcy, która została oryginalnie napisana dla wersji 2005, a następnie zaktualizowana do wersji 2008... I tu się historia owej wtyczki kończy. Programista, który ją napisał, stwierdził, że ma lepsze, ciekawsze rzeczy do roboty w życiu - i przestał wtyczkę rozwijać. Przyszła nowa wersja SSIS - i dupa przenajbledsza, wtyczka niekompatybilna, a prawie sześćset pakietów SSIS po migracji do wyższej wersji po prostu nie działa.

Hmmm.

Cóż to za wtyczka, być może zastanawia się ostatni żyjący Czytelnik bloga?

Wtyczka owa to ni mniej ni więcej jak File Properties Task, maleństwo umożliwiające sprawdzenie właściwości dowolnego pliku lub folderu (a więc: czy plik/folder istnieje, kiedy był ostatnio zaktualizowany, jaki ma rozmiar i tak dalej). Wtyczka jest o tyle wygodna, że daje średniozaawansowanemu użytkownikowi całkiem sporo opcji bez potrzeby uczenia się jakiegokolwiek języka programowania. Kklik, klik, klik, i gotowe. Lenistwo motorem postępu.

Tymczasem jednak doszło do sytuacji, w której mamy niedziałającą wtyczkę w nowej wersji SSIS - i co dalej?

Okazuje się, że przy odrobinie oleju w głowie można sobie samemu napisać to, co robi taka wtyczka, bez potrzeby jej instalacji.

Jak?

Zobaczmy. Jako przykład wezmę pod lupę najprostszą możliwą funkcję, czyli sprawdzenie, czy zadany plik istnieje.

W tym celu tworzymy sobie w pakiecie SSIS zmienną, nazywamy ją vFileName. Zmienna ta zawiera nazwę pliku do sprawdzenia (wpisanie nazwy pliku do naszej zmiennej wychodzi poza ramy tego artykułu - podpowiem tylko, że na ogół robi się to za pomocą zadania typu "ForEach Loop Container").

Tworzymy też dodatkową zmienną tekstową pod tytułem vFileExists - tu zapiszemy wynik naszej operacji sprawdzenia obecności pliku.

Potem dodajemy do pakietu nowe zadanie typu "Script Task", dajemy mu uprawnienia do odczytu zmiennej vFileName oraz do odczytu i zapisu zmiennej vFileExists. Klikamy [Edit Script...] i oczom naszym ukazuje się domyślny skrypt - kod jest mniej więcej taki:

public void Main()
	{
		// TODO: Add your code here

		Dts.TaskResult = (int)ScriptResults.Success;
	}

Powyżej znajdziemy sekcję [+]Namespaces, w której zdefiniowane są biblioteki używane w bieżącym skrypcie. Potrzebujemy zaimportować dodatkową bibliotekę: System.IO. W tym celu w sekcji [+]Namespaces dodajemy jedną linijkę:

using System.IO;

Teraz możemy używać klas, metod i właściwości z biblioteki System.IO - w naszym przypadku potrzebujemy tylko jednej właściwości: Exists. W kodzie głównej funkcji (Main) wpisujemy:

FileInfo fileInfo;
fileInfo = new FileInfo(Dts.Variables["User::vFileName"].Value.ToString());
Dts.Variables["User::vFileExists"].Value = fileInfo.Exists;

Całość będzie więc wyglądać tak:

public void Main()
	{
	    // TODO: Add your code here

            FileInfo fileInfo;
            fileInfo = new FileInfo(Dts.Variables["User::vFileName"].Value.ToString());
            Dts.Variables["User::vFileExists"].Value = fileInfo.Exists;

	    Dts.TaskResult = (int)ScriptResults.Success;
	}

Sprawdzamy, czy całość się kompiluje (a więc klikamy w menu Build => Build...), zamykamy wszystkie okienka - i voila! Gotowe. Mamy sprawdzacza obecności plików bez konieczności instalowania jakichkolwiek zewnętrznych dodatków. Wszystko za pomocą zaledwie czterech linii kodu.

Ha!

https://xpil.eu/Xpy0X

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]

Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.