Administracja systemem Xpertis
Transkrypt
Administracja systemem Xpertis
Praca zbiorowa Podręcznik administratora Dla systemu Windows—Linux Wydanie piętnaste Macrologic SA, Warszawa, luty 2014 Praca zbiorowa Xpertis: Podręcznik administratora; Dla systemu Windows—Linux Wydanie piętnaste © Copyright by Macrologic SA, luty 2014 Macrologic SA ul. Kłopotowskiego 22 03-717 Warszawa tel. +48 222-566-222 http://www.macrologic.pl Podręcznik administratora jest jednym z najstarszych wydawnictw firmy MacroSoft — Macrologic. Przez dwadzieścia lat życia był wielokrotnie aktualizowany. Dziś trudno jest ustalić, kto i w jakim stopniu przyczynił się do powstania tego dzieła. Redakcja: Krzysztof Zawisławski, Artur Żak , Grzegorz Śliwka Skład: Andrzej Odyniec, Krzysztof Odyniec Druk: Niniejszy podręcznik został przygotowany w wersji elektronicznej i nie jest publikowany przez wydawcę w postaci papierowej a jedynie na nośnikach komputerowych oraz przez Internet. Macrologic oraz Xpertis są znakami handlowymi Macrologic SA. Prawa do wszystkich występujących tutaj znaków handlowych należą do odpowiednich właścicieli. Ze względu na charakter publikacji i niekiedy częste używanie w tekście znaków handlowych, zamiast umieszczania po każdym wystąpieniu takiego znaku — symbolu znaku handlowego (TM ) lub zastrzeżonego znaku handlowego (®) utrudniającego czytanie, wszystkie znaki handlowe wyróżniamy pisząc je z wielkiej litery w trosce o przejrzysty styl wydawniczy i bez intencji jakiegokolwiek ingerowania w znak lub naruszania praw z nim związanych. Informacja o licencjach na wykorzystywane oprogramowanie stron trzecich znajduje się na płycie dystrybucyjnej w folderze: „Xpertis Dokumentacja” podfolder: „Licencje obce”. ISBN: Publikacjom elektronicznym nie przydziela się Spis treści Uwagi wstępne 1 I Wymagania systemowe 1 Opis ogólny systemu MacroBASE . . . . . . . . . . . . . . . . . 2 System Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Systemy Windows NT/2000/2003/2008/XP/Vista/7 . . . . . . . 3 3 4 5 II Instalacja 1 System Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1 Zakładanie konta administratorowi bazy danych . . . . 1.2 Wariant A. Instalowanie systemów użytkowych . . . . . 1.3 Wariant B. Zainstalowanie samych programów . . . . . 1.4 Wariant C. Instalowanie klienta serwera aplikacji jTerm . 2 System Windows . . . . . . . . . . . . . . . . . . . . . . . . . 2.1 Instalacja pakietu Xpertis wielofirmowy z danymi demonstracyjnymi . . . . . . . . . . . . . . . . . . . . . . 2.2 Instalacja pakietu Xpertis z Serwerem Aplikacji . . . . . 2.2.1 Instalacja na serwerze . . . . . . . . . . . . . . . 2.2.2 Instalacja na końcówce użytkownika . . . . . . . 2.3 Środowisko MacroBASE dla Windows . . . . . . . . . . 2.3.1 Xpertis Server . . . . . . . . . . . . . . . . . . . 2.3.2 Instalacja klienta serwera aplikacji — jTerm . . . 2.3.3 Instalacja środowiska MacroBASE . . . . . . . . . . . . . . . . 13 14 15 15 17 17 19 20 III Architektura systemu 1 Elementy systemu . . . . . . . . . . . . . . . . . . . . . . . . . 2 Definicja systemu . . . . . . . . . . . . . . . . . . . . . . . . . 3 Podprogramy zewnętrzne . . . . . . . . . . . . . . . . . . . . . 23 23 26 26 i 7 . 7 . 7 . 8 . 9 . 11 . 12 ii Spis treści 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 3.1 Formuły . . . . . . . . . . . . . . . . . . . . . . 3.2 Wzorce wydruków . . . . . . . . . . . . . . . . Maszyna bazy danych . . . . . . . . . . . . . . . . . . Serwer aplikacji . . . . . . . . . . . . . . . . . . . . . Plik konfiguracyjny cluster.cfg . . . . . . . . . . . . . 6.1 Sekcje aplikacji . . . . . . . . . . . . . . . . . . 6.2 Sekcje specjalne . . . . . . . . . . . . . . . . . . Klient serwera aplikacji jTerm . . . . . . . . . . . . . . Katalog kopii . . . . . . . . . . . . . . . . . . . . . . . Program administratora . . . . . . . . . . . . . . . . . Konsola serwera aplikacji . . . . . . . . . . . . . . . . Administrator serwera aplikacji . . . . . . . . . . . . . Serwer wiadomości . . . . . . . . . . . . . . . . . . . Program komunikacyjny . . . . . . . . . . . . . . . . Poufność dostępu do bazy . . . . . . . . . . . . . . . . Konwersja danych . . . . . . . . . . . . . . . . . . . . 15.1 Konwersja struktury danych . . . . . . . . . . . 15.2 Konwersja formatu danych . . . . . . . . . . . . 15.3 Naprawa danych . . . . . . . . . . . . . . . . . 15.4 Weryfikacja pliku macro.use . . . . . . . . . . . Porównanie definicji systemów . . . . . . . . . . . . . Pisanie do portów zdalnych komputerów . . . . . . . . Praca z systemem z poziomu przeglądarki internetowej 18.1 Plik macrocgi.ini . . . . . . . . . . . . . . . 18.2 Uruchomienie z linii komend . . . . . . . . . . 18.3 Kodowanie polskich znaków . . . . . . . . . . . Biblioteka mbasic.dll . . . . . . . . . . . . . . . . Przeglądarka raportów z Crystal Reports . . . . . . . . Program do testowania sieci . . . . . . . . . . . . . . . Konfigurowanie systemu . . . . . . . . . . . . . . . . Deklaracja ścieżek . . . . . . . . . . . . . . . . . . . . Indeksy z reprezentantem z tabeli maskowalnej . . . . Historia systemu . . . . . . . . . . . . . . . . . . . . . Fizyczna organizacja danych . . . . . . . . . . . . . . Pliki graficzne (*.bmp, *.png) . . . . . . . . . . . . Ustawienia użytkownika . . . . . . . . . . . . . . . . . Zapisywanie warunków dla okienek wertowania . . . . Autoraporty . . . . . . . . . . . . . . . . . . . . . . . Parametry wydruków . . . . . . . . . . . . . . . . . . Dziennik systemu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 26 27 29 33 33 36 39 43 44 46 49 50 52 52 72 73 77 79 80 80 98 100 104 105 107 108 116 118 118 126 133 134 141 141 143 147 147 149 150 iii Spis treści 33 Wykorzystanie bibliotek zewnętrznych . . . . . . . . . . . . . . 33.1 Tworzenie bibliotek dll . . . . . . . . . . . . . . . . . . . 33.2 Tworzenie bibliotek jar . . . . . . . . . . . . . . . . . . . 33.3 Biblioteka MacroLAF.jar . . . . . . . . . . . . . . . . . . 34 Wykorzystanie kontrolek w oknach . . . . . . . . . . . . . . . . 34.1 Przykład kontrolki . . . . . . . . . . . . . . . . . . . . . 34.2 Przykład przesyłania danych . . . . . . . . . . . . . . . . 34.3 Kontrolki dostarczane z systemem . . . . . . . . . . . . . 35 Weryfikacja licencji . . . . . . . . . . . . . . . . . . . . . . . . 36 Sterownik ODBC dla MacroBASE . . . . . . . . . . . . . . . . 36.1 System operacyjny Windows . . . . . . . . . . . . . . . . 36.2 Sterownik ODBC dla MacroBASE w systemie Linux . . . 36.2.1 Instalowanie sterownika (wersja 32-bitowa) . . . . 36.2.2 Definiowanie źródeł danych . . . . . . . . . . . . 36.2.3 Przykład instalacji . . . . . . . . . . . . . . . . . . 36.2.4 Instalowanie sterownika (wersja 64-bitowa) . . . . 36.3 Procedury wbudowane . . . . . . . . . . . . . . . . . . . 36.4 Sterownik JDBC . . . . . . . . . . . . . . . . . . . . . . . 37 Sposoby wymiany danych z innymi systemami . . . . . . . . . 38 Szyfrowanie połączenia z serwerem aplikacji . . . . . . . . . . . 39 Uwierzytelnianie certyfikatem . . . . . . . . . . . . . . . . . . 39.1 Uwierzytelnianie za pomocą SmartCard . . . . . . . . . . 39.2 Uwierzytelnianie certyfikatem z pliku . . . . . . . . . . . 40 Profiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40.1 Uruchamianie profilera . . . . . . . . . . . . . . . . . . . 40.1.1 Włączanie profilera za pomocą wpisu w pliku konfiguracyjnym . . . . . . . . . . . . . . . . . . . . . 40.1.2 Włączanie profilera za pomocą opcji z linii poleceń 40.1.3 Włączanie i wyłączanie profilera za pomocą przycisków na pasku narzędzi . . . . . . . . . . . . . . 40.1.4 Profilowanie pojedynczej formuły . . . . . . . . . 40.2 Analiza wyników profilowania w obiekcie klasy DEBUG . 40.3 Rejestrowanie liczby wywołań procedur, metod, raportów i zapytań SQL . . . . . . . . . . . . . . . . . . . . . . 41 Automatyczne aktualizacje . . . . . . . . . . . . . . . . . . . . 41.1 MacroUPDATE . . . . . . . . . . . . . . . . . . . . . . . 41.2 Automatyczna aktualizacja jTerma . . . . . . . . . . . . . 41.3 Aktualizacja sterownika ODBC . . . . . . . . . . . . . . 42 Pobieranie kluczy licencyjnych z portalu Xpertis 24 . . . . . . . 153 154 156 161 161 162 164 167 170 172 172 179 179 180 182 184 185 188 189 190 193 193 196 196 197 197 198 198 199 199 200 204 204 205 206 206 iv Spis treści IV Obsługa drukarek 1 Język opisu drukarki graficznej 2 Język opisu drukarki tekstowej 2.1 driver . . . . . . . . . . 2.2 bottomline . . . . . . . . 2.3 cr . . . . . . . . . . . . . 2.4 dataseton . . . . . . . . 2.5 ffl . . . . . . . . . . . . . 2.6 ffr . . . . . . . . . . . . 2.7 firstempty . . . . . . . . 2.8 fontstd . . . . . . . . . . 2.9 height . . . . . . . . . . 2.10 init . . . . . . . . . . . . 2.11 lpcmd . . . . . . . . . . 2.12 nl . . . . . . . . . . . . . 2.13 nopanel . . . . . . . . . 2.14 pagel . . . . . . . . . . . 2.15 pager . . . . . . . . . . . 2.16 printon . . . . . . . . . . 2.17 spacestd . . . . . . . . . 2.18 translate . . . . . . . . . 2.19 viewon . . . . . . . . . . 2.20 width . . . . . . . . . . 2.21 font . . . . . . . . . . . 2.22 space . . . . . . . . . . . V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 207 211 213 213 213 213 213 213 213 213 214 214 214 214 214 215 215 215 215 215 215 215 216 216 Kopie bezpieczeństwa 1 Opis ogólny . . . . . . . . . . . . . . . . . . . . . 2 Scenariusz wykonywania . . . . . . . . . . . . . . 3 Wykorzystywane polecenia . . . . . . . . . . . . . 3.1 System operacyjny Windows NT/2000/2003 . 3.2 System operacyjny Linux . . . . . . . . . . . 4 Ograniczenia systemu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 219 219 220 220 221 222 VI Kody błędów . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 Uwagi wstępne W opisie zastosowano poniższe konwencje typograficzne ułatwiające odszukanie i identyfikację materiału. — Na marginesach umieszczono gdzieniegdzie następujące ikony: Ta ikona wskazuje przytoczone w podręczniku przykłady. Ta ikona wskazuje szczególnie istotne wskazówki i ostrzeżenia przed błędami najczęściej popełnianymi przez użytkowników. Ta ikona wskazuje fragmenty podręcznika, które odnoszą się do przepisów prawa oraz praktycznych rozwiązań proponowanych przez autorów oprogramowania. Ta ikona wyróżnia odsyłacze wskazujące podrozdziały, gdzie szerzej zostało opisane wybrane zagadnienie. — Opisy funkcji oraz ich działania w wielu miejscach zostały zilustrowane przykładami. Wykorzystane w nich dane mają na celu zademonstrowanie działania funkcji i algorytmów, nie stanowią żadnego odniesienia do danych rzeczywistych. 1 2 Uwagi wstępne Rozdział I Wymagania systemowe 1 Opis ogólny systemu MacroBASE System MacroBASE przeznaczony jest do pracy wielodostępnej. Składa się z serwera bazy danych, serwera aplikacji oraz programów klienckich. Serwer bazy danych jest odpowiedzialny za dostęp do danych. Może być zainstalowany na komputerach z zainstalowanymi systemami: — Linux, — Windows, Serwer aplikacji wykonuje aplikację, umożliwiając pracę z nią w sieci lokalnej i rozległej. Komunikuje się on z serwerem bazy danych w celu odczytu i zapisu danych do bazy. Może być zainstalowany na komputerach z zainstalowanymi systemami: — Linux (przy założeniu, że serwer bazy danych uruchomiony jest także na tym samym komputerze), — Windows. Końcówka użytkownika jTerm służy do uruchamiania systemów na komputerach zarówno w sieci lokalnej jak i rozległej. Odpowiada za pobranie akcji użytkownika oraz prezentację przetworzonych danych. Może być zainstalowana na komputerach z systemem Windows lub Linux. W systemie jest możliwość dostępu do danych z poziomu przeglądarki internetowej. Idea polega na uruchomieniu skryptu CGI — (programu MacroCGI dla systemu Linux lub mhtmlcgi.exe w wersji dla Windows) — 3 4 Rozdział I. Wymagania systemowe który łączy się bezpośrednio z serwerem bazy danych i wykonuje zadane procedury. Wyniki są zwracane poprzez stronę w formacie HTML. Dla systemów Linux i Windows istnieje również możliwość dostępu do danych systemu MacroBASE z wykorzystaniem sterownika ODBC łączącego się z serwerem bazy danych bezpośrednio lub przez serwer aplikacji. 2 System Linux Xpertis Server działający pod systemem Linux wymaga jądra systemu w wersji 2.4.0 lub nowszej oraz zainstalowania biblioteki glibc w wersji niestarszej niż 2.3.2. W pakiecie MacroBASE dostępny jest sterownik ODBC dla systemów Linux (w wersji 32 oraz 64 bitowej) współpracujący z menadżerem unixODBC. Umożliwia on korzystanie z danych systemów MacroBASE przez programy działające w środowisku Linux. Przed przystąpieniem do instalacji sterownika należy zadbać, aby w systemie był obecny menadżer unixODBC. Jeśli nie jest dostarczony z systemem operacyjnym, to należy pobrać go ze strony http://www.unixodbc.org i zainstalować zgodnie z instrukcją producenta. Do poprawnego działania graficznej końcówki jTerm oprócz zainstalowanego środowiska X-Windows, konieczne jest zainstalowanie oprogramowania Java dystrybuowanej przez ORACLE (dawniej Sun Microsystems) w wersji 32 bitowej oznaczonej co najmniej Version 7. Programu nie można uruchomić wykorzystując Javę w wersji Version 6 ani w wersji 64-bitowej. Aby się dowiedzieć, jaka jest aktualnie zainstalowana wersja, wystarczy wywołać polecenie: java -version Dla wspomnianej wymaganej wersji może to być wynik postaci: java version "1.7.0_13" Jeśli w systemie zostanie zdefiniowana zmienna MACRO_JAVA_HOME, to programy będą uruchamiać Javę ze ścieżki: $MACRO_JAVA_HOME/bin/java W przypadku jTerma, jeśli wersja Javy będzie wcześniejsza niż 7, to również zostanie uruchomiona Java, którą wskazuje zmienna MACRO_JAVA_HOME. I.3. Systemy Windows NT/2000/2003/2008/XP/Vista/7 5 3 Systemy Windows NT/2000/2003/2008/XP/Vista/7 Zarówno serwer bazy danych jak i serwer aplikacji mogą być zainstalowane na serwerze z systemem Windows NT/2000/2003/2008/XP/Vista/7. Do poprawnego działania graficznej końcówki jTerm konieczne jest zainstalowanie oprogramowania Java dystrybuowanej przez ORACLE (dawniej Sun Microsystems) w wersji 32 bitowej oznaczonej co najmniej Version 7, a co za tym idzie, systemu Windows XP/Vista/2000/2003/2008/7. Programu nie można uruchomić wykorzystując Javę w wersji Version 6 ani w wersji 64bitowej. Aby się dowiedzieć, jaka jest aktualnie zainstalowana wersja, wystarczy wywołać polecenie: java -version Dla wspomnianej wymaganej wersji może to być wynik postaci: java version "1.7.0_13" W przypadku braku właściwej wersji istnieje możliwość automatycznego pobrania i zainstalowania odpowiedniej wersji z serwera www.macrologic.pl. Jeśli jTerm będzie uruchomiony nieprawidłową wersją, zostanie wyświetlone pytanie, czy ma być pobrana właściwa wersja Javy. W przypadku odpowiedzi Tak, program instalacyjny będzie pobrany poprzez Internet, a następnie zainstalowany w systemie. Pobrana wersja Javy będzie instalowana obok bieżącej wersji, nie zmieniając domyślnej wersji Javy. Wspomniana funkcjonalność jest dostępna tylko dla końcówek działających w systemie Windows. Jeśli w systemie zostanie zdefiniowana zmienna MACRO_JAVA_HOME, to programy będą uruchamiać Javę ze ścieżki: %MACRO_JAVA_HOME%\bin\java.exe W przypadku jTerma, jeśli wersja Javy będzie wcześniejsza niż 7, to również zostanie uruchomiona Java, którą wskazuje zmienna MACRO_JAVA_HOME. 6 Rozdział I. Wymagania systemowe Rozdział II Instalacja 1 System Linux Instalacja systemu składa się z instalacji programów wykonawczych, systemu użytkowego i wykonania pewnych czynności administracyjnych. Zakłada się, że za działanie systemu użytkowego jest odpowiedzialny jeden użytkownik systemu Linux — administrator bazy danych, który jednak nie jest administratorem systemu operacyjnego (root). Fizycznie wszystkie te funkcje może pełnić jedna osoba bądź grupa osób. Instalację wykonuje się w następujących etapach: 1. założenie konta administratorowi bazy danych, 2. zainstalowanie systemów użytkowych wraz z programami wykonawczymi lub samych programów wykonawczych w zależności od wybranego wariantu. Zbiory konieczne do instalacji są dostarczane dla wszystkich pracowników i klientów poprzez portal Xpertis 24 lub na życzenie na płycie jako archiwa utworzone programem tar. 1.1 Zakładanie konta administratorowi bazy danych Czynności opisane w tym punkcie wykonuje administrator systemu Linux. Jego zadaniem jest utworzenie konta administratorowi bazy danych. Zwyczajowo identyfikatorem jest macroadm, a katalogiem macierzystym /home/macro. 7 8 Rozdział II. Instalacja 1.2 Wariant A. Instalowanie systemów użytkowych wraz z programami wykonawczymi Czynności opisane w tym punkcie wykonuje administrator bazy danych. Instalacja całego pakietu zintegrowanego zawierającego pakiet Xpertis wraz z programami wykonawczymi składa się z następujących czynności: 1. Pobrania pakietów instalacyjnych. Pakiety dostępne są dla wszystkich pracowników i klientów poprzez portal Xpertis 24 (w portalu należy wybrać z menu pozycje: [Dystrybucja|Wersje instalacyjne] – wyświetlona zostanie strona umożliwiająca wskazanie wersji oprogramowania i wybór właściwego pakietu do pobrania wraz ze zaserializowanym plikiem środowiska programistycznego). Jeśli zostanie wybrany pakiet Linux Xpertis Xpertis wielofirmowy z danymi demonstracyjnymi (z numerem seryjnym PRAC000030) lista będzie zawierać dwa pliki do pobrania: — instalator Xpertis wielofirmowy z danymi demonstracyjnymi (plik xpertis_w_demo_1240.tar), — zaserializowany plik środowiska instalacyjnego Xpertis (plik xpertis_1240_prac000030.ser.zip). Pierwszy z nich służy do zainstalowania oprogramowania i zawiera wszystkie elementy instalowanego pakietu, które są niezależnie od numeru seryjnego. Można go zatem pobrać raz i używać na rzecz wszystkich instalacji niezależnie od tego na jaki numer seryjny jest wystawiona licencja. Drugi plik jest unikalny dla danego numeru seryjnego (stąd w nazwie pliku znajduje się numer seryjny oraz rozszerzenie .ser.zip). Obydwa pliki należy pobrać np. do katalogu /home/macroadm/xpertis. 2. Zainstalowania oprogramowania. Aby zainstalować oprogramowanie należy: — rozpakować plik xpertis_w_demo_1240.tar w katalogu, w którym ma być zainstalowane oprogramowanie: $ tar xf /home/macroadm/xpertis/xpertis_w_demo_1240.tar — zadbać, aby plik serializacyjny (w omawianym przykładzie plik xpertis_1240_prac000030.ser.zip) znajdował się w tym samym katalogu co instalowane oprogramowanie, II.1. System Linux — wywołać program instalacyjny poprzez wydanie polecenia: sh config dla wersji 32-bitowej serwera bazy danych, lub sh config -64 dla wersji 64-bitowej. Program instalacyjny utworzy strukturę katalogów oraz nada odpowiednie prawa dostępu do plików. Zainstalowane zostaną również moduły wykonawcze (podkatalog server) wraz ze skryptami do ich obsługi (start, stop). 1.3 Wariant B. Zainstalowanie samych programów wykonawczych Czynności opisane w tym punkcie wykonuje administrator bazy danych. Aby zainstalować programy wykonawcze, należy wykonać następujące kroki: 1. Przeznaczyć jeden pusty katalog na programy wykonawcze. Standardowo jest to /home/macroadm/server. Dopuszcza się umieszczenie w tym katalogu zbiorów ukrytych, z kropką na początku nazwy (np. .profile, .cshrc). 2. Pobrać pakiety instalacyjne. Pakiety dostępne są dla wszystkich pracowników i klientów poprzez portal Xpertis 24 (w portalu należy wybrać z menu pozycje: [Dystrybucja|Wersje instalacyjne] – wyświetlona zostanie strona umożliwiająca wskazanie wersji oprogramowania i wybór właściwego pakietu do pobrania wraz ze zaserializowanym plikiem środowiska programistycznego). Jeśli zostanie wybrany pakiet Linux MacroBASE MacroSERVER (z numerem seryjnym PRAC000030) lista będzie zawierać dwa pliki do pobrania: — instalator Xpertis MacroSERVER (plik xpertis_server_1240.tar), — zaserializowany plik środowiska instalacyjnego Xpertis MacroSERVER (plik xpertis_server_1240_prac00030.ser.zip). 9 10 Rozdział II. Instalacja Pierwszy z nich służy do zainstalowania oprogramowania i zawiera wszystkie elementy instalowanego pakietu, które są niezależnie od numeru seryjnego. Można go zatem pobrać raz i używać na rzecz wszystkich instalacji niezależnie od tego na jaki numer seryjny jest wystawiona licencja. Drugi plik jest unikalny dla danego numeru seryjnego (stąd w nazwie pliku znajduje się numer seryjny oraz rozszerzenie .ser.zip). Obydwa pliki należy pobrać np. do katalogu /home/macroadm/server. 3. Zainstalowć oprogramowanie. W tym celu należy: — rozpakować plik xpertis_server_1240.tar w katalogu, w którym ma być zainstalowane oprogramowanie: $ tar xvf /home/macroadm/server/xpertis_server_1240.tar Podanie opcji v powoduje, że na ekranie będą się pokazywać nazwy kopiowanych zbiorów. — zadbać, aby plik serializacyjny (w omawianym przykładzie plik xpertis_server_1240_prac00030.ser.zip) znajdował się w tym samym katalogu co instalowane oprogramowanie, — wywołać program instalacyjny poprzez wydanie polecenia: sh config dla wersji 32-bitowej serwera bazy danych, lub sh config -64 dla wersji 64-bitowej. Program instalacyjny utworzy strukturę katalogu, nada odpowiednie prawa dostępu do zbiorów oraz utworzy dwa zbiory wykonawcze: server_start polecenie rozpoczęcia serwera bazy danych, server_stop polecenie zakończenia pracy serwera. Zawierają one polecenia uruchamiające serwer bazy danych oraz serwer aplikacji (MacroAppSERVER). W niektórych konfiguracjach uruchamianie wszystkich modułów może być nadmiarowe i należy wtedy odpowiednio zmodyfikować skrypty. II.1. System Linux Powyższe skrypty musi uruchamiać administrator bazy danych. Jeśli chcemy, aby serwer bazy danych był uruchamiany podczas startu systemu operacyjnego, to można wykorzystać polecenie su w skryptach startowych, dzięki czemu podana komenda będzie wywołana z prawami podanego użytkownika. Np. echo "Uruchamianie systemu MacroBASE" su - macroadm -c "/home/macro/server_start" sleep 4 1.4 Wariant C. Instalowanie klienta serwera aplikacji jTerm Czynności opisane poniżej pozwalają na zainstalowanie klienta jTerm działającego w środowisku graficznym systemu Linux. 1. Pobranie pakietów instalacyjnych. Pakiety dostępne są dla wszystkich pracowników i klientów poprzez portal Xpertis 24 (w portalu należy wybrać z menu pozycje: [Dystrybucja|Wersje instalacyjne] – wyświetlona zostanie strona umożliwiająca wskazanie wersji oprogramowania i wybór właściwego pakietu do pobrania). W omawianym przykładzie należy wskazać pakiet Linux MacroBASE - jTerm zawierający plik jterm_1240.tar, który należy pobrać do katalogu przeznaczonego na instalację np. do katalogu /home/macroadm/jTerm. 2. Zainstalowanie oprogramowania. W tym celu należy: — rozpakować plik jterm_1240.tar w katalogu, w którym ma być zainstalowane oprogramowanie: $ tar xvf /home/macroadm/jTerm/jterm_1240.tar Podanie opcji v powoduje, że na ekranie będą się pokazywać nazwy kopiowanych zbiorów. — wywołać program instalacyjny poprzez wydanie polecenia: sh config.sh Pojawi się prośba o podanie numeru IP lub nazwy serwera, na którym działa serwer aplikacji a instalowany klient ma się komunikować. Program instalacyjny utworzy strukturę katalogów oraz skrypty: 11 12 Rozdział II. Instalacja jterm.sh uruchamiający klienta jTerm, jconsole.sh uruchamiający konsolę serwera aplikacji jConsole pass.sh uruchamiający aplikację MacroPASS. Do poprawnego działania graficznej końcówki jTerm konieczne jest zainstalowanie oprogramowania Java dystrybuowanej przez ORACLE (dawniej Sun Microsystems) w wersji 32 bitowej oznaczonej co najmniej Version 7. Programu nie można uruchomić wykorzystując Javę w wersji Version 6 ani w wersji 64-bitowej. Jeśli pakiet był już wcześniej zainstalowany, jego wersję można sprawdzić wywołując polecenie: java -version Dla wspomnianej wymaganej wersji może to być wynik postaci: java version "1.7.0_13" Jeśli w systemie zostanie zdefiniowana zmienna MACRO_JAVA_HOME, to programy będą uruchamiać Javę ze ścieżki $MACRO_JAVA_HOME/bin/java W przypadku jTerma, jeśli wersja Javy będzie wcześniejsza niż 7, to również zostanie uruchomiona Java, którą wskazuje zmienna MACRO_JAVA_HOME. 2 System Windows Proces instalacji oprogramowania na komuterach ze środowiskiem Windows sporowadza się zasadniczo do dwóch czynności: zgrania wymaganego pakietu instalacyjnego oraz uruchomienia instalatora i postępowania zgodnie z jego wskazówkami. Pakiety instalacyjne dostępne są dla wszystkich pracowników i klientów poprzez portal Xpertis 24. W portalu należy wybrać z menu pozycje: [Dystrybucja|Wersje instalacyjne] – wyświetlona zostanie strona umożliwiająca wskazanie wersji oprogramowania i wybór właściwego pakietu do pobrania wraz ze zaserializowanym plikiem środowiska programistycznego (w przypadku gdy instalator takiego pliku wymaga). Przykładowo, jeśli zostanie wybrany pakiet Windows MacroBASE - MacroSERVER (z numerem seryjnym PRAC000030) lista będzie zawierać dwa pliki do pobrania: II.2. System Windows 13 — instalator Xpertis MacroSERVER (plik xpertis_server_1240.exe), — zaserializowany plik środowiska instalacyjnego Xpertis MacroSERVER (plik xpertis_server_1240_prac000030.ser.zip). Pierwszy z nich służy do zainstalowania oprogramowania i zawiera wszystkie elementy instalowanego pakietu, które są niezależnie od numeru seryjnego. Można go zatem pobrać raz i używać na rzecz wszystkich instalacji niezależnie od tego na jaki numer seryjny jest wystawiona licencja. Drugi plik jest unikalny dla danego numeru seryjnego (stąd w nazwie pliku znajduje się numer seryjny oraz rozszerzenie .ser.zip). Aby zainstalować oprogramowanie należy uruchomić instalator (plik xpertis_server_1240.exe) i postępować zgodnie ze wskazówkami programu. W przypadku niektórych pakietów niezbędne są pliki z rozszerzeniem .ser.zip – w przypadku ich braku w bieżącym katalogu, instalator poprosi o wskazanie ścieżek do tych plików. Niektóre pakiety są niezależne od numeru seryjnego i pliki *.ser.zip nie są dla nich wymagane, np. pakiet jTerm oraz ODBC. 2.1 Instalacja pakietu Xpertis wielofirmowy z danymi demonstracyjnymi Pakiet instalacyjny zawiera: — wszystkie systemy użytkowe wchodzące w skład pakietu Xpertis z danymi demonstracyjnymi w wersji wielofirmowej, przystosowane do pracy z serwerem aplikacji, — serwer bazy danych Xpertis Server dla systemu Windows, — serwer aplikacji MacroAppSERVER, — klient serwera aplikacji jTerm, — program MacroPASS służący do kontroli dostępów i uprawnień, — dodatkowe programy systemowe i narzędziowe, zestaw fontów MacroBAR do druku kodów kreskowych w układzie 128, — komponenty MacroCRview do uruchamiania raportów Crystal Reports, — sterownik ODBC — Java(TM) SE Runtime Environment 14 Rozdział II. Instalacja — Graphviz — Graph Visualization Software Zainstalowane zostaną (bez możliwości wyboru wariantów przez użytkownika) wszystkie powyższe komponenty oraz sterownik ODBC. Jeśli sterownik ODBC jest już zainstalowany w innej wersji, zostanie wyświetlone ostrzeżenie z pytaniem, czy zastąpić istniejący sterownik nowym. Zamiana spowoduje utratę zdefiniowanych wcześniej źródeł danych, innych niż źródła plikowe. Po zakończeniu instalacji automatycznie uruchamiany jest serwer bazy danych i serwer aplikacji. Użytkownik może również uruchomić serwery korzystając ze skrótów utworzonych w menu Start systemu Windows: [Start|Macrologic Xpertis|System]. Znajdują się tam również skróty uruchamiające klienta serwera aplikacji [Start|Macrologic Xpertis|Xpertis jTerm]. 2.2 Instalacja pakietu Xpertis z Serwerem Aplikacji Pakiet instalacyjny zawiera: — wszystkie systemy użytkowe wchodzące w skład pakietu Xpertis (opcjonalnie z danymi demonstracyjnym) przystosowane do pracy w architekturze trójwarstwowej z serwerem aplikacji, — serwer baz danych Xpertis Server dla systemu Windows (podczas instalacji możliwy wybór między wersją 32 i 64-bitową), — serwer aplikacji MacroAppSERVER, — klient serwera aplikacji jTerm, — program MacroPASS służący do kontroli dostępów i uprawnień, — dodatkowe programy systemowe i narzędziowe, zestaw fontów MacroBAR do druku kodów kreskowych w układzie 128, — komponenty MacroCRview do uruchamiania raportów Crystal Reports, — sterownik ODBC. — Java(TM) SE Runtime Environment — Graphviz — Graph Visualization Software Pakiet posiada dwa predefiniowane warianty instalacji: — Instalacja oprogramowania na serwerze, — Instalacja oprogramowania na końcówce użytkownika. II.2. System Windows 2.2.1 Instalacja oprogramowania na serwerze W tym wariancie zainstalowany zostanie pełny pakiet Xpertis wraz z serwerem bazy danych, serwerem aplikacji i klientami. Instalację należy przeprowadzać lokalnie na komputerze, na którym ma działać system MacroBASE. Dowolny z komponentów można pominąć usuwając zaznaczenie przy odpowiedniej pozycji. W trakcie instalacji na serwerze użytkownik może wybrać dodatkowo następujące opcje: — utworzenie skrótu do programu jTerm na pulpicie, — utworzenie skrótów do aplikacji w menu Start, — podać parametry połącznia z serwerem: adres, port oraz grupę roboczą, — nadać hasło do konsoli serwera aplikacji. Dla systemów Windows NT/2000/2003/2008/XP/Vista/7 zalecane jest uruchomienie serwera aplikacji i serwera bazy danych jako usługi. Instalacja usług i ich uruchomienie odbywa się automatycznie po zaznaczeniu odpowiednich opcji w instalatorze. Skróty do późniejszego uruchamiania i zatrzymywania tych usług znajdują się w menu [Macrologic Xpertis|System]. Domyślnie usługi uruchamiane są na konto systemu operacyjnego. Nadawanie poszczególnym użytkownikom uprawnień do zainstalowanych aplikacji nie jest dla tej konfiguracji potrzebne. W trybie pracy jako usługa, ewentualne błędy występujące podczas uruchomienia serwerów nie są zgłaszane na ekranie, tylko raportowane do plików server.log (maszyna bazy danych) i error.log (serwer aplikacji). Plik konfiguracyjny cluster.cfg, niezbędny do prawidłowego działania serwera aplikacji, tworzony jest automatycznie w czasie instalacji wybranych systemów użytkowych. Jego standardowa lokalizacja to: <katalog_instalacji>\system\cfg Jeśli chcemy uniemożliwić uruchamianie niektórych aplikacji lub dodać nowe, należy zmodyfikować ten właśnie plik. 2.2.2 Instalacja oprogramowania na końcówce użytkownika W tym wariancie zainstalowane zostaną jedynie komponenty przeznaczone dla komputera klienckiego — klient serwera aplikacji jTerm, komponenty MacroCRview do uruchamiania raportów Crystal Reports, zestaw fontów MacroBAR do druku kodów kreskowych w układzie 128 oraz sterownik ODBC. Jeśli sterownik ODBC jest już zainstalowany w innej wersji, zostanie wyświetlone ostrzeżenie z pytaniem, czy zastąpić istniejący sterownik nowym. Zamiana 15 16 Rozdział II. Instalacja spowoduje utratę zdefiniowanych wcześniej źródeł danych, innych niż źródła plikowe. W trakcie instalacji użytkownik ma możliwość wybrania opcji utworzenia skrótu do aplikacji na pulpicie oraz w menu Start. Dla pakietu instalacyjnego jTerm wprowadzono możliwość zapisu i odtwarzania parametrów instalacji. Oznacza to, że możliwe jest np. przeprowadzenie ”pilotażowej” instalacji jTerma na pierwszej końcówce klienta, a następnie powtórzenie jej automatycznie, bez przechodzenia przez wszystkie okna kreatora instalacji, z identycznymi parametrami i opcjami. Służą do tego różne przełączniki wywołania, np. dla pakietu jTerm.exe wywołanie: jterm.exe /SAVEINF="param.cfg" zapisze w pliku param.cfg parametry i opcje wybrane w trakcie procesu instalacji. Na kolejnym komputerze wystarczy wgrać plik param.cfg obok jterm.exe i uruchomić pakiet z przełącznikiem: jterm.exe /LOADINF="param.cfg" a wybrane opcje, ścieżki itp. podpowiedzą się z pliku. Aby uzyskać efekt bezinterwencyjnej instalacji można użyć dodatkowo przełącznika /SILENT (będzie widoczny tylko pasek postępu instalacji) lub /VERYSILENT (nie będzie nawet paska postępu). Czyli wywołanie na drugim i kolejnych komputerach: jterm.exe /LOADINF="param.cfg" /SILENT powinno dać efekt pełnej automatyzacji instalacji. Dodano również obsługę dodatkowych przełączników modyfikujących niektóre parametry dostępne w oknach instalatora: /ADRES=adres /PORT=port /GRUPA=grupa /CERT=”ścieżka do pliku certyfikatu” Wywołanie całkowicie automatycznej instalacji, ale z drobną modyfikacją w zakresie grupy (przełączniki mają wyższy priorytet niż ustawienia ładowane przez LOADINF) wyglądałoby np. tak: jterm.exe /LOADINF="param.cfg" /SILENT /GRUPA=prezesi a z wprowadzeniem wskazania na plik certyfikatu test.der: II.2. System Windows 17 jterm.exe /LOADINF="param.cfg" /SILENT /GRUPA=prezesi /CERT="c:\tajne\test.der" Parametr ze ścieżką do pliku z certyfikatem można wprowadzać także jawnie w oknie instalatora, pod parametrami na adres, port i grupę. Zmodyfikowane okno z tym nowym polem pojawi się we wszystkich pakietach zawierających klienta MacroBASE (jTerm). Inne dostępne dla pakietów przełączniki to: jterm.exe /DIR="c:\alamakota" zmienia podpowiadany zwykle w pakietach instalacyjnych katalog c:\macrologic na wskazany przełącznikiem, jterm.exe /GROUP="SuperPakiet" zmienia podpowiadaną nazwę folderu w menu Start z domyślnego ”Macrologic” na ”Superpakiet”. 2.3 Środowisko MacroBASE dla Windows 2.3.1 Xpertis Server Pakiet instalacyjny zawiera: — serwer baz danych Xpertis Server dla systemu Windows (podczas instalacji możliwy wybór między wersją 32 i 64-bitową), — serwer aplikacji MacroAppSERVER, — klient serwera aplikacji jTerm, — dodatkowe programy systemowe i narzędziowe, zestaw fontów MacroBAR do druku kodów kreskowych w układzie 128, — komponenty MacroCRview do uruchamiania raportów Crystal Reports, — Java(TM) SE Runtime Environment — sterownik ODBC. Jest to pakiet zawierający się również w opisanych powyżej instalacjach całego pakietu Xpertis. Umożliwia zainstalowanie tylko modułów wykonawczych, czyli maszyny bazy danych, serwera aplikacji oraz klienta serwera aplikacji. Jeśli na liście komponentów do instalacji zaznaczony jest klient serwera aplikacji jTerm, instalator poprosi o podanie parametrów połączenia z serwerem: 18 Rozdział II. Instalacja adres serwera nazwa (domenowa albo zadeklarowana w pliku /etc/hosts) albo wprost adres IP serwera osiągalny z lokalizacji klienta, port TCP/IP numer portu na którym odbywać się będzie komunikacja, grupa robocza nazwa grupy roboczej której aplikacje będą dostępne do wyboru po uruchomieniu programu jTerm bez podania parametru -a. Jeśli pole pozostawimy puste, dostępna będzie lista aplikacji grupy default, ścieżka do pliku z certyfikatem wskazanie katalogu jest konieczne jesli połaczenia z serwerem aplikacji maja byc szyfrowane przy uzyciu protokołu SSL. W trakcie instalacji na serwerze użytkownik może wybrać dodatkowo następujące opcje: — utworzenie skrótu do programu jTerm na pulpicie, — utworzenie skrótu do aplikacji systemowych w menu Start (programu [MacroPASS] służącego do kontroli dostępów i uprawnień) — przypisanie rozszerzenia *.rpc do przeglądarki raportów CR (Crystal Reports) Dla systemów Windows NT/2000/2003/2008/XP/Vista/7 zalecane jest uruchomienie serwera bazy danych jako usługi. Żeby program pracował jako usługa należy ją zainstalować poprzez wywołanie z parametrem -i. Polecenie może mieć więc postać: nserv32.exe -i -wpath dla wersji 32-bitowej, lub nserv64.exe -i -wpath dla wersji 64-bitowej. gdzie: path — ścieżka określająca katalog roboczy serwera bazy danych Powinna zostać utworzona usługa systemowa o nazwie MacroBASE. Można ją uruchomić z linii komend poprzez wywołanie z parametrem -bv czyli: nserv32.exe -bv II.2. System Windows dla wersji 32-bitowej, lub nserv64.exe -bv dla wersji 64-bitowej. Domyślnie usługa uruchamiana jest na konto systemu operacyjnego. W trybie pracy jako usługa, ewentualne błędy występujące podczas uruchomienia serwera nie są zgłaszane na ekranie tylko raportowane do pliku server.log w katalogu roboczym serwera. W przypadku wybrania opcji instalacji sterownika ODBC, dla systemów operacyjnych w wersjach 64bitowych sterownik będzie zainstalowany w wersjach 32 i 64-bitowej. 2.3.2 Instalacja klienta serwera aplikacji — jTerm Pakiet instalacyjny zawiera: — klienta serwera aplikacji — jTerm, — zestaw czcionek MacroBAR do druku kodów kreskowych w układzie 128, — komponenty MacroCRview do uruchamiania raportów Crystal Reports, — sterownik ODBC. — Java(TM) SE Runtime Environment Pakiet instaluje jedynie komponenty przeznaczone dla komputera klienckiego oraz sterownik ODBC. Jeśli sterownik ODBC jest już zainstalowany w innej wersji, zostanie wyświetlone ostrzeżenie z pytaniem, czy zastąpić istniejący sterownik nowym. Podczas instalacji należy podać następujące parametry połączenia z serwerem: adres serwera nazwa (domenowa albo zadeklarowana w pliku /etc/hosts) albo wprost adres IP serwera osiągalny z lokalizacji klienta, port TCP/IP numer portu na którym odbywać się będzie komunikacja, grupa robocza nazwa grupy roboczej której aplikacje będą dostępne do wyboru po uruchomieniu programu jTerm bez podania parametru -a. Jeśli pole pozostawimy puste, dostępna będzie lista aplikacji grupy default, 19 20 Rozdział II. Instalacja ścieżka do pliku z certyfikatem wskazanie katalogu jest konieczne jesli połaczenia z serwerem aplikacji maja byc szyfrowane przy uzyciu protokołu SSL. W trakcie instalacji użytkownik może wybrać dodatkowo następujące opcje: — utworzenie skrótu do programu jTerm na pulpicie, — utworzenie skrótu do programu jTerm w menu Start, — przypisanie rozszerzenia *.rpc do przeglądarki raportów CR (Crystal Reports). 2.3.3 Instalacja środowiska programistycznego MacroBASE Pakiet instalacyjny zawiera zestaw narzędzi służących do tworzenia, modyfikacji i pielęgnowania systemów użytkowych w technologii MacroBASE. W jego skład wchodzą: — MacroBASE Developer, — MacroBUILDER — graficzny generator aplikacji, — MacroEYTOR — edytor wspomagający pisanie aplikacji w technologii MacroBASE, — MacroBASE jTerm — klient serwera aplikacji jTerm (grafczna koncówka), — MacroPASS —- aplikacja służąca do kontroli dostępów i uprawnień, — Zestaw czcionek MacroBAR do druku kodów kreskowych w układzie 128, — Komponenty MacroCRview do uruchamiania raportów Crystal Reports, — Sterownik ODBC. — Java(TM) SE Runtime Environment — Aplikacja demonstracyjna II.2. System Windows Pakiet instalacyjny dostępny jest dla wszystkich pracowników i klientów poprzez portal Xpertis 24 (w portalu należy wybrać z menu pozycje: [ Dystrybucja|Wersje instalacyjne] – wyświetlona zostanie strona umożliwiająca wskazanie wersji oprogramowania i wybór właściwego pakietu do pobrania wraz ze zaserializowanym plikiem środowiska programistycznego – plik ten jest unikalny dla danego numeru seryjnego (stąd w nazwie pliku znajduje się numer seryjny oraz rozszerzenie .ser.zip)). 21 22 Rozdział II. Instalacja Rozdział III Architektura systemu 1 Elementy systemu W skład systemu zarządzania bazą danych MacroBASE wchodzą następujące elementy: — programy i biblioteki: MacroSERVER, MacroSERVER64 (nserv32.exe, nserv64.exe dla Windows) serwer bazy danych w wersjach odpowiednio 32 oraz 64-bitowej, MacroAppSERVER (mblaunch.exe) serwer aplikacji. Jeśli serwer aplikacji pracuje w systemie Linux, do obsługi każdego nowego klienta bazy danych tworzona jest kopia procesu MacroAppSERVER. Dla Windows dla każdego klienta uruchamiany jest program mblogics.exe, jTerm.jar klient serwera aplikacji dla systemów Windows oraz Linux, MacroADMIN (nserv32.exe -v) program administracyjny, MacroCOMM odpowiada za komunikację pomiędzy windowsowym serwerem komunikacyjnym, a serwerem bazy danych działającym pod Linuxem, MacroCGI (mhtmlcgi.exe) możliwość dostępu do danych z poziomu przeglądarki internetowej, 23 24 Rozdział III. Architektura systemu MacroDEVICE (mdevice.exe) umożliwia programom działającym w sieci dostęp do portów komputera, na którym program MacroDEVICE został uruchomiony, MacroPRINTER (printer.exe) kompilator opisu drukarki, MacroREPORT (report.exe) translator języka REPORT, MacroTRANSFER (transfer.exe) umożliwia konwersję istniejącej bazy danych do nowego formatu, MacroIM.jar serwer wiadomości, MacroIMClient.jar klient serwera wiadomości, jConsole.jar konsola serwera aplikacji dla systemów Windows oraz Linux mbasic.dll umożliwia zewnętrznym programom wykonanie formuł w wybranym systemie użytkowym, crview.exe przeglądarką sprawozdań stworzonych programem Crystal Reports w wersji 10 dla systemu Windows, CRView.jar przeglądarką sprawozdań stworzonych programem Crystal Reports w wersji 10 dla systemów Windows oraz Linux, MacroUPDATE (mupdate.exe dla Windows) program do pobierania i nanoszenia poprawek udostępnionych w systemie SPIS, MacroAppLOCKER (mblocker.exe dla Windows) program służący do bezdialogowego wyrejestrowywania użytkowników oraz blokowania dostępu nowym użytkownikom, MacroCliDOWN (mclidown.exe dla Windows) program służący do pobrania aktualniej wersji oprogramowania klienta bez uruchamiania jTerma, MacroCliSYNC (mclisync.exe dla Windows) program służący do naniesiena pobranych aktualizacji klienta pobranych przy pomocy programu MacroCliSYNC na bieżącą wersję, III.1. Elementy systemu — opisy drukarek (zbiory *.prt, źródła drs), — zbiory konfiguracyjne (pliki *.cfg), — formuły, procedury wbudowane oraz skompilowane wzorce sprawozdań i sterowniki drukarek używane przez runtime, pasujące do maski __*.*, wyszukiwane w katalogu sysfml względem katalogu, w którym znajduje się program obsługujący klienta (dla aplikacji uruchomionych poprzez serwer aplikacji będzie to ścieżka do katalogu z uruchomionym serwerem aplikacji), — standardowe biblioteki (zbiory _*.*). System użytkowy zawiera: — deklarację ścieżek (zbiór *.pth), — definicje systemu (zbiór *.def), — ochrony systemu (zbiór *.psw), — podprogramy zewnętrzne (zbiory *.fml), — podprogramy zewnętrzne w wersji standardowej (zbiory *.fml.std), — procedury wbudowane (zbiory *.prc), — procedury wbudowane w wersji standardowej (zbiory *.prc.std), — wzorce sprawozdań (zbiory *.rpt, źródła *.rpm), — wzorce sprawozdań w wersji standardowej (zbiory *.rpt.std, źródła *.rpm.std), — pliki z aktualizacjami podprogramów zewnętrznych, porcedur, wzorców sprawozdań (zbiory *.*.numer_rewizji.spis, — dane (zbiory *.mdb, pliki indeksowe *.ndx i *.del), — historię dostępu (zbiory *.log). — system pomocy do aplikacji, dla użytkownika (zbiory *.chm, *.jhm). 25 26 Rozdział III. Architektura systemu 2 Definicja systemu Definicja systemu użytkowego (inaczej słownik bazy danych) jest tworzona przez projektanta-programistę przy pomocy generatora zastosowań MacroBUILDER. Program ten wchodzi w skład pakietu Środowisko Programistyczne. Jego opis jest zamieszczony w dołączanym do tego pakietu podręczniku. Definicja systemu zawiera w szczególności: — schemat bazy danych, — sposoby prezentacji bazy danych, — przepływ sterowania programu, — podprogramy w języku Formula. Nazwa zbioru zawierającego definicję utworzona jest z nazwy systemu z rozszerzeniem .def, np. demo.def. W systemie Linux plik definicji systemu musi mieć prawa tylko do odczytu oraz ustawiony bit S. Należy zatem nadać uprawnienia 4400, 4440 lub 4444, w zależności, czy plik ma być dostępny do czytania również dla grupy i pozostałych użytkowników systemu. 3 Podprogramy zewnętrzne System zarządzania bazą danych MacroBASE pozwala dołączać zewnętrzne podprogramy w postaci formuł zapisanych w zbiorach *.fml, pod warunkiem, że definicja systemu dopuszcza taką możliwość. 3.1 Formuły Interpreter języka Formula wykonuje procedury zawarte w zbiorach tekstowych z rozszerzeniem .fml. Opis tego języka znajduje się w oddzielnym podręczniku (Język Formula+). 3.2 Wzorce wydruków Wzorce wydruków są przygotowywane w postaci plików tekstowych (.rpm) zgodnie ze składnią języka generowania sprawozdań Report. Wzorce sprawozdań są wstępnie przetwarzane przy pomocy translatora MacroREPORT III.4. Maszyna bazy danych (report.exe dla wersji windowsowej). Skompilowane sprawozdania przechowywane są w zbiorach z rozszerzeniem .rpt. Opis programu MacroREPORT jest zamieszczony w odrębnym podręczniku (Język wydruków Report+). 4 Maszyna bazy danych Serwer bazy danych jest odpowiedzialny za dostęp do danych i kolejkowanie zadań. Wykonuje kolejno elementarne komendy dostępu do bazy danych pełniąc zarazem funkcję arbitra. Uruchomienie tego programu musi być wcześniejsze niż pierwsze wywołanie programu wykonawczego. Zakończenie jego pracy uniemożliwia dalszą pracę systemom użytkowym. Serwer bazy danych może być uruchomiony z poniższymi opcjami: -ppath podanie ścieżki dostępu path do katalogu z plikiem konfiguracyjnym o nazwie macro.cfg. Jeśli w podanym katalogu nie ma pliku konfiguracyjnego, to przyjmowane są wartości domyślne dla parametrów programu. Dodatkowo w wersji linuxowej we wskazanym katalogu będzie zapisywany plik server.log, w którym znajdują się informacje o uruchomieniu, zatrzymaniu, wyrejestrowaniu użytkowników poprzez program MacroADMIN oraz ewentualnych błędach w działaniu. -wpath podanie ścieżki dostępu path do katalogu roboczego maszyny bazy danych. Tu będą również trzymane pliki z opisem przeprowadzanych transakcji (*.bi?), wykorzystywane przy uruchamianiu serwera bazy danych po awarii. Jeśli parametr zostanie pominięty, to pliki robocze będą w zależności od systemu trzymane: — Linux: w katalogu wywołania, — Windows: w katalogu wskazywanym przez wartość klucza rejestru \SOFTWARE\macrosoft\nserv32\workdir w gałęzi HKEY_CURRENT_USER rejestru systemowego. Jeśli klucz nie jest zdefiniowany, to w katalogu wskazywanym zmienną systemową TEMP. -i wywołąnie z opcją pozwala na wprowadzenie klucza. Dodatkowo w wersji windowsowej serwer bazy danych instaluje się jako usługa o nazwie MacroBASE. Podczas instalacji usługi nie jest przyjmowana żadna domyślna lokalizacja katalogu roboczego, więc konieczne jest w tym wypadku, określenie parametru -w, 27 28 Rozdział III. Architektura systemu Dodatkowo dla serwera dla systemu Windows dostępne są opcje wywołania: odinstalowanie usługi MacroBASE, -u -uv odinstalowanie usługi MacroBASE tylko z katalogu instalacji usługi, uruchomienie usługi MacroBASE, -b -bv uruchomienie usługi MacroBASE tylko z katalogu instalacji usługi, zatrzymanie usługi MacroBASE, -e -ev zatrzymanie usługi MacroBASE tylko z katalogu instalacji usługi, zatrzymanie usługi MacroBASE z zarejestrowanymi użytkownikami, -f -fv zatrzymanie usługi MacroBASE z zarejestrowanymi użytkownikami tylko z katalogu instalacji usługi, -n pominięcie dialogów, umożliwia wraz z opcjami -b i -e uruchomienie i zatrzymanie usługi w przetwarzaniu wsadowym, -v uruchomienie programu umożliwiającego administrowanie serwerem działającym jako usługa, -? (lub nieprawidłowe wywołanie) pomoc. Program maszyny bazy danych zawiera między innymi mechanizmy: — blokowania tabel na trzech poziomach wyłączności, — definiowania transakcji z gwarancją zachowania spójności danych zarówno przy jej wycofaniu, jak i awarii systemu, — blokowania zapisu i odczytu rekordów. III.5. Serwer aplikacji 29 Proces serwera bazy danych komunikuje się z procesami serwera aplikacji uruchomionymi na tym samym komputerze poprzez mechanizmy synchronizacyjne systemu operacyjnego. W przypadku, gdy serwer bazy danych działa w systemie Linux, natomiast serwer aplikacji uruchomiony jest na innym komputerze z systemem Windows, komunikacja między nimi odbywa się przez sieć, za pośrednictwem dodatkowego programu o nazwie MacroCOMM po stronie systemu Linux oraz serwera komunikacyjnego po stronie systemu Windows. Program MacroCOMM wykorzystywany jest również do komunikacji z serwerem bazy danych zainstalowanym na komputerze z systemem Linux w przypadku wykonywania programów przez MacroCGI lub wykorzystania biblioteki mbasic.dll na stanowiskach z zainstalowanym systemem Windows. W przypadku łączenia się z serwerem bazy danych przez sieć, wymagane jest wskazanie w pliku z deklaracją ścieżek (plik pth aplikacji) ścieżki do zbiorów z danymi zawierającej pomiędzy znakami | nazwę lub numer IP komputera, na którym znajdują się zbiory z danymi. Dla lokalnego połączenia taki wpis w pliku z deklaracją ścieżek determinuje połączenie sieciowe. Komunikacja odbywać się będzie przez dodatkowy serwer komunikacyjny, w efekcie czego zostanie zużyte dodatkowe stanowisko z puli dostępnych w ramach licencji. 5 Serwer aplikacji MacroAppSERVER (mblaunch.exe dla Windows) umożliwia pracę z systemami w sieci lokalnej i rozległej w środowisku graficznym. Po uruchomieniu, serwer aplikacji w pierwszej kolejności poszukuje pliku konfiguracyjnego o nazwie launcher.cfg. Plik ten będzie szukany: — w katalogu podanym po opcji -p. Ścieżka dostępu do tego katalogu nie może zawierać spacji — w katalogu, w którym znajduje się uruchamiany plik, o ile nie podano opcji -p przy wywołaniu Plik launcher.cfg ma postać: cluster_conf_file = ścieżka_do_cluster.cfg tcp_port = nr_portu net_error_delay = czas_wznawiania_połączenia auto_update = mechanizm_automatycznej_auktualizacji_klienta_jest_wlaczony macroim = serwer_wiadomosci_bezposrednich_uruchamiany_przy_starcie_serwera_aplikacji macroim_port = nr_portu macroim_descr = nazwa_serwera_komunikacyjnego 30 Rozdział III. Architektura systemu gdzie znaczenia parametrów są następujące: cluster_conf_file przypisuje się ścieżkę, do katalogu, w którym ma być poszukiwany plik cluster.cfg. Jeśli linia ta zostanie pominięta, to plik cluster.cfg będzie poszukiwany w tym samym katalogu, w którym był poszukiwany plik launcher.cfg, tcp_port przypisuje się numer portu protokołu TCP/IP, po którym będzie następować komunikacja. Jeśli linia zostanie pominięta, to przyjęty zostanie port 5580, net_error_delay parametr określający czas (w sekundach), w ciągu którego, po stwierdzeniu zerwania komunikacji pomiędzy klientem a serwerem aplikacji, możliwe jest jej wznowienie w ramach tej samej sesji. Po zerwaniu połączenia serwer przechodzi w stan oczekiwania na nowe połączenie, przez czas określony parametrem. Domyślną wartością parametru jest 30 sekund. Wartość zero oznacza wyłączenie mechanizmu powtórnego nawiązywania połączenia. Klient po zerwaniu połączenia próbuje je ponownie nawiązać przez czas określony parametrem powiększonym o jedną minutę. Po zerwaniu połączenia z serwerem aplikacji na końcówce pojawi się w linii statusu ikona o tym informująca. Jeśli połączenie uda się zestawić ponownie, to ikona nie będzie już wyświetlana, auto_update określa czy mechanizm automatycznej auktualizacji klienta jest włączony. Przyjmuje wartosci 0 lub 1, wartością domyślną jest 1, macroim (opcjonalny) określa czy serwer wiadomości bezpośrednich ma być uruchamiany przy starcie serwera aplikacji. Przyjmuje wartosci 0 lub 1, wartością domyślną jest 1, macroim_port (opcjonalny) numer portu serwera wiadomosci bezposrednich, wartością domyślną jest 7777, macroim_descr (opcjonalny) opis serwera wiadomości bezpośrednich, wartością domyślną jest pusty string. III.5. Serwer aplikacji 31 Wszystkie linie, w których pierwszym znakiem różnym od spacji i tabulacji jest hash (#), są ignorowane. Serwer aplikacji przy starcie czyta ten właśnie plik, a następnie obsługuje zgłoszenia od klientów (jTerm). Serwer aplikacji może uruchomić jedynie te programy, które są wyszczególnione w pliku konfiguracyjnym cluster.cfg. Struktura tego pliku jest opisana w odrębnym rozdziale. Po wybraniu przez użytkownika aplikacji opisanej w pliku cluster.cfg, serwer aplikacji weryfikuje nazwę użytkownika i hasło, a następnie uruchamia proces, który będzie wykonywał aplikację. Jeśli serwer aplikacji pracuje w systemie Linux, do obsługi każdego nowego klienta bazy danych tworzona jest kopia procesu MacroAppSERVER. Zatem procesów o nazwie MacroAppSERVER powinno być o jeden więcej, niż pracujących klientów. Dla Windows dla każdego klienta uruchamiany jest program mblogics.exe. Proces wykonujący aplikację, komunikuje się już bezpośrednio z programem klienckim, w celu pobierania akcji użytkownika i przekazywania danych do wyświetlenia, oraz z drugiej strony, z serwerem bazy danych w celu odczytu i zapisu danych do bazy. Dzięki odciążeniu końcówki klienckiej możliwa jest praca z systemem również w sieci rozległej. Do wymiany danych pomiędzy końcówką, a serwerem aplikacji wystarczy łącze modemowe — przesyłane są tylko wprowadzane dane i teksty do wyświetlania. Umieszczenie serwera aplikacji na tym samym komputerze, na którym działa serwer bazy danych pozwala znacząco zmniejszyć liczbę przesyłanych pakietów sieciowych również w sieci lokalnej, ponieważ komunikacja odbywać się będzie jedynie pomiędzy końcówkami a serwerem aplikacji. Dla serwera aplikacji są dostępne następujące opcje wywołania — dla Windows: mblaunch.exe [-ppath] [-wpath] [-cpass] [-kpath] [-i | -u | -uv] [-b | -bv | -e | — dla Linuxa: MacroAppSERVER -ppath [-wpath] [-cpass | -stop] [-kpath] -p path ścieżka do katalogu z plikiem launcher.cfg lub cluster.cfg -w path ścieżka do katalogu, w którym będą zapisywane informacje przez serwer aplikacji, w szczególności plik error.log z informacjami o błędach. 32 Rozdział III. Architektura systemu Pominięcie opcji spowoduje, że wspomniany plik będzie tworzony w katalogu, w którym szukany byłby plik cluster.cfg, -k path ścieżka do katalogu z plikami server.pem z kluczem prywatnym i certificate.der zawierającym certyfikat. Wskazanie katalogu jest konieczne jeśli połączenia z serwerem aplikacji mają być szyfrowane przy użyciu protokołu SSL, -stop zatrzymanie serwera aplikacji -c ustalenie hasła dla konsoli Dodatkowo, dla systemów NT/2000/2003/2008/XP/Vista/7 dostępne są opcje wywołania, umożliwiające zainstalowanie, uruchomienie, zatrzymanie i odinstalowanie serwera aplikacji jako usługi: -i zainstalowanie serwera aplikacji jako usługi -u odinstalowania usługi serwera aplikacji -uv odinstalowania usługi serwera aplikacji tylko z katalogu instalacji usługi -b uruchomienie usługi serwera aplikacji -bv uruchomienie usługi serwera aplikacji tylko z katalogu instalacji usługi -e zatrzymanie usługi serwera aplikacji -ev zatrzymanie usługi serwera aplikacji tylko z katalogu instalacji usługi -n bez komunikatów o ewentualnych błędach i ostrzeżeniach, użycie tej opcji jest konieczne dla skryptów wsadowych -? (lub nieprawidłowe wywołanie) pomoc. III.6. Plik konfiguracyjny cluster.cfg 6 Plik konfiguracyjny cluster.cfg Plik cluster.cfg określa jakie aplikacje mają być dostępne na danym serwerze aplikacji, oraz ustala ewentualne limity liczby uruchomień. Plik ten ma postać tekstową, składa się z sekcji rozpoczynających się od linii, w której w nawiasach kwadratowych podawana jest nazwa. Dalej następują przypisania wartości poszczególnym parametrom. Wyróżniane są dwa rodzaje sekcji. Pierwszy rodzaj opisuje programy, które mogą być uruchamiane przez serwer aplikacji. Nazwa takiej sekcji nie może rozpoczynać się od znaku wykrzyknika i procenta, gdyż znaki te zarezerwowane są dla drugiej grupy, czyli sekcji specjalnych. Wszystkie linie, w których pierwszym znakiem różnym od spacji i tabulacji jest hash (#), są ignorowane. Rejestr liter w całym pliku cluster.cfg jest istotny. Plik konfiguracyjny cluster.cfg jest wyszukiwany w katalogu bieżącym dla MacroAppSERVER (mblaunch.exe dla Windows) lub w katalogu podanym po opcji -p w trakcie uruchomienia. Jego położenie może też być zdefiniowane w pliku launcher.cfg. 6.1 Sekcje aplikacji Dla każdej aplikacji, która ma być uruchamiana na serwerze należy wpisać oddzielną sekcję o następującej postaci: [identyfikator] name = nazwa path = ścieżka caption = opis_w_menu hidden = ukryta cgi_html = źródło_cgi cgi_output = wynik_cgi max_users = wszyscy_użytkownicy max_user_connections = jeden_użytkownik max_fork_users = użytkownicy_fork_hid max_fork_user_connections = użytkownik_fork_hid max_mbasic_users = użytkownicy_mbasic max_mbasic_user_connections = użytkownik_mbasic W powyższym fragmencie wartości poszczególnych parametrów oznaczają: identyfikator nazwa sekcji, dowolny ciąg znaków, poprzez który będzie identyfikowana sekcja. Każda sekcja musi mieć inną nazwę i nie może rozpoczynać się od znaków ! i %. Wystąpienie parametru jest obowiązkowe, 33 34 Rozdział III. Architektura systemu nazwa nazwa aplikacji czyli nazwa definicji systemu bez rozszerzenia. Pominięcie tej linii spowoduje przyjęcie nazwy identycznej z nazwą sekcji. Wartość parametru nie może zawierać wielkich liter, ścieżka ścieżka do katalogu, w którym znajduje się zbiór z deklaracją ścieżek (nazwa.pth). Nie dopuszcza się używania względnych ścieżek. Wystąpienie parametru jest obowiązkowe, opis_w_menu tekst do menu wyboru aplikacji. Pojawia się również w opisie aplikacji przy podawaniu hasła. Pominięcie linii z caption spowoduje przyjęcie jako tekstu do menu nazwy sekcji, ukryta jeśli przyjmie wartość 1, to aplikacja nie będzie dostępna do wyboru z menu. Przypisanie innej wartości lub pominięcie linii z hidden oznacza, że będzie do wyboru z menu, źródło_cgi zaznaczenie, że aplikacja ma być automatycznie uruchamiana przez MacroCGI. Po zakończeniu uruchomionego w ten sposób programu będzie on ponownie uruchamiany. Wartości parametru przypisuje się nazwę pliku, która ma być przypisana do parametru HTML_TEMPLATE_PTH w momencie uruchomienia programu, cgi_output nazwa pliku, do którego ma zostać przekierowane standardowe wyjście MacroCGI uruchomionego gdy zadeklarowany jest parametr zrodlo_cgi. Plik ten będzie wyszukiwany zgodnie z deklaracją ścieżek. Domyślnie: standardowe wyjście będzie zapisywane do pliku appcgi.log w katalogu z programami wykonawczymi, wszyscy_użytkownicy maksymalna liczba dostępów licencyjnych jaka może być zajęta przez dany element klastra (cały serwer, grupa, aplikacja). Przypisanie wartości -1 (lub pominięcie parametru) oznacza brak ograniczeń na łączenie się z aplikacją. Wartość 0 powoduje zablokowanie odpowiednich połączeń, III.6. Plik konfiguracyjny cluster.cfg 35 jeden_użytkownik maksymalna liczba dostępów licencyjnych jaka może być zajęta przez pojedynczego użytkownika dla danego elementu klastra. Przypisanie wartości -1 (lub pominięcie parametru) oznacza brak ograniczeń na łączenie się z aplikacją. Wartość 0 powoduje zablokowanie odpowiednich połączeń, użytkownicy_fork_hid maksymalna liczba interaktywnych dostępów, nie wliczanych do puli licencji, jaka może być zajęta przez dany element klastra (cały serwer, grupa, aplikacja). Przypisanie wartości -1 (lub pominięcie parametru) oznacza brak ograniczeń na łączenie się z aplikacja. Wartość 0 powoduje zablokowanie odpowiednich połączeń, użytkownik_fork_hid maksymalna liczba interaktywnych dostępów, nie wliczanych do puli licencji, jaka może być zajęta przez pojedynczego użytkownika dla danego elementu klastra. Przypisanie wartości -1 (lub pominięcie parametru) oznacza brak ograniczeń na łączenie się z aplikacja. Wartość 0 powoduje zablokowanie odpowiednich połączeń, użytkownicy_mbasic maksymalna liczba jednoczesnych połączeń poprzez bibliotekę mbasic.dll (czyli w szczególności sterownik ODBC). Przypisanie wartości -1 (lub pominięcie parametru) oznacza brak ograniczeń na łączenie się z aplikacja. Wartość 0 powoduje zablokowanie odpowiednich połączeń, użytkownik_mbasic maksymalna liczba jednoczesnych połączeń poprzez bibliotekę mbasic.dll (czyli w szczególności sterownik ODBC) pochodzących od jednego użytkownika. Przypisanie wartości -1 (lub pominięcie parametru) oznacza brak ograniczeń na łączenie się z aplikacja. Wartość 0 powoduje zablokowanie odpowiednich połączeń. Znaki spacji przylegające do znaku równości są ignorowane. Przykładowa definicja sekcji aplikacji może wyglądać: [fiks dw] name = fiks path = c:\dw\fiks caption = Xpertis Finanse i księgowość max_users = 3 36 Rozdział III. Architektura systemu max_user_connections = 1 max_fork_users = 2 max_mbasic_user_connections = 0 Powyższy wpis oznacza, że z aplikacji Xpertis Finanse i księgowość będzie mogło korzystać naraz maksymalnie trzech różnych użytkowników oraz żaden z użytkowników nie będzie mógł się zarejestrować więcej niż jeden raz. Dodatkowo, użytkownicy aplikacji nie będą mogli mieć więcej niż dwóch połączeń poprzez fork_hid naraz (zatem będą mogli zużyć naraz co najwyżej dwa stanowiska z puli fork_users na serwerze). Żaden z użytkowników nie będzie mógł korzystać z połączeń poprzez mbasic.dll, czyli w szczególności pobierać danych poprzez sterownik ODBC. W opisie sekcji aplikacji można zaznaczyć, że ma ona być automatycznie uruchamiana poprzez MacroCGI. Po zakończeniu uruchomionego w ten sposób programu, będzie on ponownie uruchamiany. Uruchamianie programu MarcroCGI będzie miało miejsce wtedy, gdy zdefiniowany będzie parametr cgi_html. Przypisuje się do niego nazwę pliku, która ma być przypisana do parametru HTML_TEMPLATE_PTH w momencie uruchomienia programu. Dodatkowo można zdefiniować parametr cgi_output, do którego przypisana będzie nazwa pliku, do którego będzie zapisywane standardowe wyjście z programu. Plik ten będzie wyszukiwany zgodnie z deklaracją ścieżek. Jeśli parametr nie zostanie zdefiniowanym, to standardowe wyjście będzie zapisywane w pliku appcgi.log w katalogu z programami wykonawczymi. Przykładowo, po zdefiniowaniu aplikacji alert1 będzie ona automatycznie uruchamiana poprzez MacroCGI zaraz po starcie serwera aplikacji: [alert1] name=alert path=c:\alert cgi_output = alert1.log cgi_html = alert1.htm 6.2 Sekcje specjalne Sekcje specjalne mogą wystąpić opcjonalnie i można je podzielić na dwa rodzaje: definicje grup aplikacji i ograniczenia dostępów do grup aplikacji i serwera. Jeśli w pliku cluster.cfg będzie sekcja [!Groups], to podział na grupy nastąpi zgodnie z podanymi definicjami. Umożliwia to tworzenie menu z wyborem aplikacji z grupy przy starcie programu. W przypadku, jeśli nie III.6. Plik konfiguracyjny cluster.cfg zdefiniuje się żadnej grupy, to wszystkie aplikacje zostaną przypisane do grupy o nazwie default. Każdy niepusty wiersz opisuje nową grupę. Musi się zaczynać od nazwy grupy (może składać się z małych liter łacińskich, cyfr oraz znaku podkreślenia). Po znaku równości następuje wyliczenie aplikacji należących do danej grupy. Aplikacje określa się poprzez podanie nazwy sekcji. Kolejne nazwy sekcji oddzielane są średnikami. Spacje dokoła znaku równości są ignorowane, zaś pozostałe są traktowane jako część nazwy grupy. W sekcji [!Groups] można wielokrotnie przypisywać systemy do tej samej grupy. W grupie będą wtedy dostępne systemy ze wszystkich przypisań. Np. w poniższej definicji do grupy personel zostaną przypisane systemy kali, rcp i zzl [!Groups] personel = kali;rcp personel = zzl W grupie mogą występować aplikacje o identycznych nazwach. Jeśli istnieje potrzeba dodania drugiej aplikacji o takiej samej nazwie, to można za nazwą sekcji podać w nawiasach nową nazwę. Nazwa, podobnie do definiowanych w MacroBUILDERZE, może składać się jedynie z małych liter łacińskich, cyfr oraz znaku podkreślenia. Od tej pory, nazwa podana w nawiasach będzie identyfikować aplikację w grupie. Dla przykładu, przypuśćmy, że dana osoba obsługuje dwie kopie systemu Xpertis Kadry i Płace (np. dla dwóch różnych firm). Można wtedy umieścić oba systemy w jednej grupie, jednak przynajmniej jeden z nich musi zostać przenazwany. Zbiór cluster.cfg mógłby zatem wyglądać: [Firma 1] name = kali path = c:\f1\kali [Firma 2] name = kali path = c:\f2\kali [!Groups] default = Firma 1[kali_f1];Firma 2[kali_f2] Korzystając z faktu, iż domyślny alias dla aplikacji w grupie pokrywa się z identyfikatorem sekcji opisującej aplikację, w przypadku kilku aplikacji o tej samej nazwie nie trzeba zawsze definiować aliasów. Zatem powyższy zbiór cluster.cfg mógłby wyglądać również tak: 37 38 Rozdział III. Architektura systemu [kali_f1] name = kali path = c:\f1\kali [kali_f2] name = kali path = c:\f1\kali [!Groups] default =kali_f1;kali_f2 Drugi typ sekcji specjalnych to sekcje definiujące ograniczenia dostępu do poszczególnych grup aplikacji i całego serwera aplikacji. Dla każdej zdefiniowanej grupy można zapisać nową sekcję o nazwie powstającej z dopisania znaku % na początku nazwy grupy. Sekcja taka ma postać: [%nazwa_grupy] caption = menu hidden = ukryta max_users = wszyscy_użytkownicy max_user_connections = jeden_użytkownik max_fork_users = użytkownicy_fork_hid max_fork_user_connections = użytkownik_fork_hid max_mbasic_users = użytkownicy_mbasic max_mbasic_user_connections = użytkownik_mbasic W powyższym fragmencie wartości poszczególnych parametrów oznaczają: menu określa pod jaką nazwą bieżąca grupa ma być dostępna w dialogu do wyboru grupy, ukryta określa, czy bieżąca grupa ma być dostępna w dialogu do wyboru grupy (jeśli przyjmie wartość 1, to grupa nie będzie dostępna). Znaczenie pozostałych ograniczeń jest takie samo jak dla aplikacji. Dla przykładu, po zdefiniowaniu w cluster.cfg: [%finanse] max_users = 3 max_mbasic_user_connections = 1 III.7. Klient serwera aplikacji jTerm w grupie finanse naraz zarejestrowanych będzie mogło być trzech użytkowników. Żaden z użytkowników nie będzie mógł mieć naraz więcej niż jednego połączenia poprzez mbasic.dll, czyli np. nie będzie mógł otworzyć więcej niż jednego sprawozdania Crystal Reports. Nie ma natomiast nakładanych żadnych ograniczeń dla użytkowników systemów w grupie na połączenia poprzez fork_hid. Podobne ograniczenia można wprowadzić również dla serwera aplikacji. Powyższe parametry należy wtedy zdefiniować w sekcji o nazwie !AppSERVER. Np. po zapisaniu: [!AppSERVER] max_mbasic_users = 0 zabroni się jakichkolwiek połączeń poprzez bibliotekę mbasic.dll, niezależnie od ustawień parametru w obrębie grupy. Zatem użytkownicy nie będą mogli poprzez serwer aplikacji korzystać ze sterownika ODBC, a co za tym idzie, nie mogą uruchamiać sprawozdań Crystal Reports. Wszystkie ograniczenia dostępu można również modyfikować przy uruchomionym serwerze aplikacji, jednak wtedy nie można modyfikować pliku wprost, tylko pośrednio, poprzez program MacroCONSOLE. Należy wybrać zasób, do którego dostęp chcemy zmodyfikować (serwer, grupę, aplikację) i wybrać Ograniczenia. Uwaga: po uruchomieniu konsoli wczytywana jest do niej taka zawartość pliku cluster.cfg, jaka obowiązywała w momencie uruchomienia serwera aplikacji. Jeśli po starcie serwera plik cluster.cfg był modyfikowany w inny sposób niż za pośrednictwem konsoli, to zmiany te zostaną utracone po zapisaniu zmian konfiguracji w konsoli. W cluster.cfg polskie znaki diakrytyczne są traktowane tak jakby ich kodowanie było w standardzie windows-1250. 7 Klient serwera aplikacji jTerm Klient serwera aplikacji — cienki klient (jTerm.jar) służy do uruchamiania systemów na komputerach z zainstalowanym systemem operacyjnym Windows lub Linux zarówno w sieci lokalnej jak i rozległej. Po nawiązaniu łączności z serwerem aplikacji, tworzony jest nowy proces obsługujący aplikację po stronie serwera. Właśnie te procesy komunikują się z maszyną bazy danych i wykonują formuły. Pomiędzy klientem a serwerem aplikacji przesyłane są tylko wprowadzane dane i teksty do wyświetlania. Do przesłania takiej ilości danych wystarczy łącze modemowe. Klient jest wspólny dla serwera aplikacji dla Windows i dla Linuxa. 39 40 Rozdział III. Architektura systemu Do poprawnego działania graficznej końcówki jTerm konieczne jest zainstalowanie oprogramowania Java dystrybuowanej przez ORACLE (dawniej Sun Microsystems) w wersji 32 bitowej oznaczonej co najmniej Version 7. Programu nie można uruchomić wykorzystując Javę w wersji Version 6 ani w wersji 64-bitowej. Aby się dowiedzieć, jaka jest aktualnie zainstalowana wersja, wystarczy wywołać polecenie: java -version Dla wspomnianej wymaganej wersji może to być wynik postaci: java version "1.7.0_13" W przypadku braku właściwej wersji istnieje możliwość automatycznego pobrania i zainstalowania odpowiedniej wersji z serwera www.macrologic.pl. Jeśli jTerm będzie uruchomiony nieprawidłową wersją, zostanie wyświetlone pytanie, czy ma być pobrana właściwa wersja Javy. W przypadku odpowiedzi Tak, program instalacyjny będzie pobrany poprzez Internet, a następnie zainstalowany w systemie. Pobrana wersja Javy będzie instalowana obok bieżącej wersji, nie zmieniając domyślnej wersji Javy. Wspomniana funkcjonalność jest dostępna tylko dla końcówek działających w systemie Windows. Jeśli w systemie zostanie zdefiniowana zmienna MACRO_JAVA_HOME, to programy będą uruchamiać Javę ze ścieżki: %MACRO_JAVA_HOME%\bin\java.exe dla systemu Windows, lub $MACRO_JAVA_HOME/bin/java dla systemu linux. W przypadku jTerma, jeśli wersja Javy będzie wcześniejsza niż 7, to również zostanie uruchomiona Java, którą wskazuje zmienna MACRO_JAVA_HOME. W systemie Linux wymagane jest dodatkowo zainstalowanie środowiska X-Windows. Końcówkę jTerm należy uruchamiać poprzez wywołanie w katalogu, w którym jest zainstalowana, poleceniem: java [-Djava.library.path=path] -jar jTerm.jar [adres[:port]] [-g] [-a] [-kpath] [-q |-qcard |-qfile |-qldap] [-d | -v[nazwa] |-v2] [-ud] [-ec czas] [-?] lub javaw.exe [-Djava.library.path=path] -jar jTerm.jar [adres[:port]] [-g] [-a] [-kpath] [-q |-qcard |-qfile |-qldap] [-d |-v[nazwa] |-v2] [-ud] [-ec czas] [-?] III.7. Klient serwera aplikacji jTerm gdzie drugie wywołanie jest dla systemu Windows, bez konsoli Javy. Poszczególne argumenty oznaczają odpowiednio: Djava.library.path= -path ścieżka do katalogu z biblioteką termnet, adres numer IP lub nazwa komputera z serwerem aplikacji, domyślnie adres komputera, na którym uruchamiany jest program, port numer portu protokołu TCP/IP, po którym będzie następować komunikacja, domyślnie 5580, -g group jako group podaje się nazwę grupy, z której ma być uruchomiona aplikacja, domyślnie jest to nazwa default. W wywołaniu jTerma, można przekazać jako parametr opcję -g bez podania nazwy grupy, pojawi się wówczas dialog, w którym będą do wyboru wszystkie nieukryte grupy zdefiniowane w pliku cluster.cfg, -a appl jako -a appl podaje się nazwę aplikacji, która ma być uruchomiona. Jeśli w definicji grupy, aplikacja jest przenazwana (określona została nowa nazwa w grupie), to jako appl podaje się tę właśnie nazwę. Pominięcie opcji oznacza, że zostanie wyświetlone menu wyboru aplikacji dostępnych w grupie. Jeśli w grupie byłaby dostępna tylko jedna aplikacja zdefiniowana bez cechy hidden=1, to zostanie ona automatycznie uruchomiona, bez wyświetlania menu wyboru, -k path ścieżka do pliku z certyfikatem serwera aplikacji, z nazwą pliku włącznie, -q domyślnym sposobem uwierzytelniania będzie karta SmartCard, -qcard domyślnym sposobem uwierzytelniania będzie karta SmartCard, -qfile domyślnym sposobem uwierzytelniania będzie certyfikat z pliku, -qldap domyślnym sposobem uwierzytelniania będzie Active Directory, 41 42 Rozdział III. Architektura systemu -d włączona będzie możliwość użycia debuggera, -v profiler formuli włączony przez czas działania programu, -v nazwa zapis działania profilera do pliku o nazwie składającej się z małych liter alfabetu łacińskiego, cyfr, znaku podkreślenia, -v2 profiler formuli włączany opcjonalnie przez użytkownika, -ud nie pobieraj aktualizacji z serwera aplikacji, -ec czas rejestrowanie liczby wywołań procedur, z wyrażonym liczbowo czasem w minutach, co ile ma nastąpić zapis cząstkowy -? wyświetlone zostanie okno pomocy prezentujące parametry wywołania programu. Ustawienia adresu serwera aplikacji, numeru portu oraz ścieżkę do pliku z certyfikatem można zmienić za pomocą funkcji MacroAppSERVER: Ustawienia dostępnej w menu Plik. W przypadku pracy z kilkoma programami naraz (lub jeśli się pojawi błąd o braku pamięci), należy wywołać program dodatkowo z opcją -Xmx — zwiększającą pamięć dostępną dla programu. Np. wywołanie programu mogłoby wyglądać: javaw.exe -Djava.library.path=. -Xmx512M -jar jTerm.jar serwer -g firma -a fiks Dla ułatwienia rejestrowania w systemie można ustawić domyślną nazwę użytkownika. Jeśli zostanie zdefiniowana zmienna systemowa o nazwie MACROLOGIN, to jej wartość będzie traktowana jako domyślna nazwa użytkownika. Aby dostępny był debugger Formuli+ należy dodać do opcji wywołania klienta parametr -d. Tak uruchomiony system udostępni dodatkową ikonę na pasku pod menu. Pracę z debuggerem rozpoczyna się przez wybór tej właśnie ikony lub naciśnięcie klawiszy Ctrl+D. Uruchomienie debuggera będzie jednak możliwe tylko wtedy, gdy zarejestrowany użytkownik będzie w grupie ochron o nazwie wdrożenia. III.8. Katalog kopii W debuggerze można wykonywać formułę bez kontroli struktur hierarchicznych i unikalności indeksów. Opcja ma wpływ na działanie funkcji put i umożliwia modyfikowanie rekordów bez konieczności zachowania poprawności struktury hierarchicznej dla tabel z polem typu TREE_REF, przez co umożliwia naprawę ewentualnych uszkodzeń tej struktury. Dodatkowo funkcja put sprawdza, czy indeks z atrybutem Drzewo nie jest unikatowy, jeśli tak to zgłasza błąd. Jeśli w tabelach jest podwojony klucz dla indeksu oznaczonego jako unikalny, wykorzystując powyższą opcję można poprawić dane poprzez usunięcie lub modyfikację błędnych rekordów. 8 Katalog kopii W celu poprawy efektywności pracy, klient serwera aplikacji przechowuje kopie niektórych plików pobieranych z serwera na dysku lokalnym. W katalogu: %appdata%\MacroBASE dla wersji działającej pod Windows, ~/.MacroBASE dla wersji działającej pod Linuxem. zakładany jest katalog jMacroBASE dla klienta jTerm lub MacroBASE dla połączeń ODBC, w których tworzone są podkatalogi identyfikujące serwer aplikacji, grupę i nazwę systemu, w których przechowywane będą pliki. W przypadku, gdy po raz kolejny program ściąga ten sam plik i nie zmienił się rozmiar ani data modyfikacji pliku, to zamiast oryginału będzie użyta przechowywana kopia. W katalogu przechowywane są kopiowane mapy bitowe, zbiory z pomocą oraz pliki uruchamiane poprzez polecenie sys_exec. Dodatkowo w katalogu z kopiami tworzony jest plik printer.ini z ustawieniami sprawozdań. Nie jest on jednak przesyłany na serwer aplikacji. Jedyny egzemplarz pliku znajduje się w tym właśnie katalogu. W przeciwieństwie do katalogu roboczego (@!Tmp), zawartość katalogu z kopiami pozostaje po zakończeniu programu i może być użyta przy kolejnym uruchomieniu. Położenie katalogu z kopiami można zmienić poprzez przypisanie ścieżki do parametru dir w sekcji [!Cache] pliku winterm.ini dla połączeń ODBC lub jterm_12.30.ini dla klienta jTerm. Plik powinien się znajdować w katalogu: %appdata%\MacroBASE dla wersji działającej pod Windows, 43 44 Rozdział III. Architektura systemu ~/.MacroBASE dla wersji działającej pod Linuxem. Domyślną wartością parametru dir jest katalog roboczy systemu operacyjnego. Przypisanie parametrowi wartości pustej ma analogiczne znaczenie. Innym sposobem zdefiniowania położenia katalogu z kopiami jest przypisanie zmiennej systemowej MACROCACHE stosownej ścieżki. Jeśli zmienna jest zdefiniowana, to ustawienie ścieżki do katalogu w pliku winterm.ini/jterm_12.30.ini jest ignorowane. W wersji ODBC dla systemu Linux, katalog z kopiami ustawia się wyłącznie poprzez zmienną MACROCACHE. Jeśli zmienna nie jest zdefiniowana przyjmowana będzie wartość /tmp. W katalogu z kopiami, zamiast katalogu MacroBASE (jak to ma miejsce w wersji dla Windows), będą tworzone katalogi macrobase-user, gdzie user będzie zastąpione nazwą użytkownika w systemie operacyjnym. Katalog będzie własnością użytkownika user i tylko on będzie miał dostęp do niego. 9 Program administratora W pakiecie MacroBASE dla systemu Linux dostępny jest program MacroADMIN. Służy on administratorowi do komunikowania się z maszyną bazy danych. Umożliwia zakończenie pracy serwera bazy danych, wyrejestrowanie użytkownika oraz pobieranie informacji o działaniu systemu. Wywołanie programu ma następującą postać: MacroADMIN [-p path] command gdzie path oznacza ścieżkę dostępu do katalogu, w którym będzie poszukiwany zbiór macro.cfg (domyślnie w bieżącym katalogu). Na podstawie parametru synchr_num określony będzie numer zasobów synchronizacyjnych, który musi być identyczny dla serwera bazy danych. Pod command możemy podstawić jedną z poniższych wartości: -stop zakończenie pracy serwera bazy danych, -c wyświetlenie listy zarejestrowanych użytkowników. Wypisywany jest przydzielony numer, nazwa użytkownika z numerem procesu oraz nazwa terminala lub komputera (w przypadku klienta w systemie Windows), na którym pracuje, III.9. Program administratora -c num wyświetlenie dodatkowych informacji o kliencie z numerem num. W pierwszych trzech kolumnach powtórzone są informacje opisane w poprzednim punkcie. Po nich następuje data i czas wykonania ostatniego rozkazu, -f wyświetlenie listy otwartych zbiorów z tabelami. Wypisywany jest przydzielony numer, nazwa zbioru, -f num wyświetlenie dodatkowych informacji o zbiorze z numerem num. W kolejnych wierszach wypisywane jest: — numer zbioru i pełna ścieżka dostępu, — lista użytkowników korzystających ze zbioru. Format jest identyczny jak przy użyciu opcji -c, — lista indeksów tabeli — numer oraz ścieżka dostępu do zbioru, -d num wyrejestrowanie użytkownika z numerem num, -u usunięcie zasobów komunikacyjnych. Jeśli system nie zakończył działania w sposób prawidłowy, to w systemie operacyjnym mogą pozostać zasoby synchronizacyjne, uniemożliwiające ponowny start serwera bazy danych. W takim przypadku przed uruchomieniem systemu należy usunąć pozostałe w systemie zasoby synchronizacyjne. Dla serwera działającego w systemie Windows, po wybraniu odpowiedniego przycisku, można wywołać funkcje odpowiedzialne za: prezentującą listę zalogowanych użytkowników, możliwość wyrejestrowania użytkownika, podgląd ścieżek do plików konfiguracyjnych i parametry pracy. W przypadku serwera bazy danych, uruchomionego jako usługa, okienko z przyciskami dostępne będzie po wywołaniu: nserv32.exe -v dla wersji 32-bitowej serwera bazy danych, lub nserv64.exe -v dla wersji 64-bitowej. 45 46 Rozdział III. Architektura systemu 10 Konsola serwera aplikacji jMacroCONSOLE - konsola serwera aplikacji jest narzędziem dedykowanym dla administratorów bazy danych. Może ona działać zarówno na końcówkach z systemem Windows jak i Linux. Z serwerem aplikacji łączy się przez sieć, przy użyciu protokołu TCP/IP. Konsola umożliwia: — wyrejestrowanie użytkowników z serwera aplikacji, — wysyłanie wiadomości do wybranych użytkowników, — ograniczanie liczby dostępów do poszczególnych aplikacji, grup aplikacji i całego serwera aplikacji, — blokowanie przyjmowania nowych połączeń przez serwer aplikacji Ta sama wersja może pracować z serwerem aplikacji dla Windows i dla Linuxa. Program konsoli uruchamia się poprzez wykonanie polecenia: javaw.exe -Djava.library.path=. -jar jConsole.jar [adres[:port]] [-k cert] adres nazwa komputera (lub numer IP), na którym pracuje serwer aplikacji, domyślnie localhost, port port do komunikacji, domyślnie 5580, cert ścieżka do pliku z certyfikatem serwera aplikacji, z nazwą pliku włącznie. Przed pierwszym uruchomieniem konsoli należy zdefiniować hasło dostępu, w przeciwnym razie praca nie będzie możliwa. Hasło ustala się wywołując MacroAppSERVER (mblaunch.exe dla Windows) z parametrem -c. Zostanie utworzony plik launcher.psw, w którym zostanie zapisane zaszyfrowane hasło. Wywołanie może mieć następującą postać: MacroAppSERVER -ppath [-wpath] -cpass gdzie: -ppath ścieżka do plików konfiguracyjnych, III.10. Konsola serwera aplikacji -wpath ścieżka do katalogu w którym powstanie plik launcher.psw. Jeśli nie jest podana launcher.psw zostanie zapisany w -ppath, W systemie Linux określenie parametru -p jest obowiązkowe. Dla Windows domyślną wartością parametru jest ., czyli katalog bieżący dla programu mblaunch.exe. Jeśli parametr -w jest niezdefiniowany, to przyjmuje taka samą wartość jak parametr -p. Należy pamiętać, żeby parametr -w przy uruchomieniu serwera aplikacji i tworzeniu pliku z hasłem konsoli (launcher.psw) wskazywał ten sam katalog. W przeciwnym wypadku proces uwierzytelnienia użytkownika konsoli nie powiedzie się. Ustalone hasło można zmieniać już w samej konsoli, w menu Administracja. Hasło konsoli może zawierać jedynie znaki o kodach ASCII od 32 do 127. Jeśli hasła z poprzednich wersji zawierają znaki spoza tego przedziału to nie zostaną poprawnie zweryfikowane w jConsole.jar. Główne okno jest podzielone na dwie części — po lewej w strukturze drzewiastej prezentowane są grupy i aplikacje, zaś po prawej właściwości aktualnie wskazanej grupy lub aplikacji (liczba aplikacji w grupie, liczba podłączonych użytkowników z podziałem na używane licencje i połączenia dodatkowe oraz ograniczenia dostępu). Ikonki grup i aplikacji, w których aktualnie nikt nie pracuje są wyszarzane. Tylko dla aktywnych grup i aplikacji dostępne są akcje Wiadomość i Użytkownicy, natomiast zawsze można modyfikować ograniczenia dostępu i blokować przyjmowanie połączeń. Należy w tym celu, po zaznaczeniu serwera aplikacji (MacroAppSERVER) albo wybranej grupy lub aplikacji, wybrać Zmień ograniczenia z menu Akcje (lub przycisk Ograniczenia). Nowe parametry będą uwzględnione w bieżącej sesji serwera aplikacji. Nawiązane wcześniej połączenia, które łamią nowe reguły ograniczania dostępu, nie będą automatycznie zrywane. Żeby ograniczenia działały również po ponownym uruchomieniu serwera aplikacji, należy zapisać ustawienia w pliku cluster.cfg wybierając z menu Administracja funkcję Zapisz ograniczenia lub przycisk o tej samej nazwie w głównym oknie konsoli. Po zapisie zmian do pliku cluster.cfg, kopia poprzedniej wersji pliku będzie dostępna pod nazwą cluster.cfg.bak. Niezależnie od ograniczenia liczby dostępów do serwera, można zablokować przyjmowanie nowych połączeń. W zależności od potrzeb blokadę można ustawiać na poziomie serwera, grup lub poszczególnych aplikacji. Należy w tym celu dla wybranego elementu wybrać Zmień ograniczenia z menu Akcje (lub przycisk Ograniczenia) i zaznaczyć opcję Tymczasowa blokada tworzenia nowych połączeń. Zablokowany zasób zostanie zaznaczony na liście specjalną ikoną. Blokada tymczasowa nie wymaga zapi- 47 48 Rozdział III. Architektura systemu su konfiguracji i obowiązuje od momentu zatwierdzenia zmiany, do momentu odblokowania w konsoli lub zakończenia pracy serwera aplikacji. Przy ponownym połączeniu konsoli stany blokad dla serwera, grup i aplikacji będą ustawione zgodnie z obowiązującym stanem serwera aplikacji. Listę zalogowanych użytkowników w ramach grupy/aplikacji otrzymujemy po wywołaniu z menu Akcje/Pokaż użytkowników. W ramach prezentowanej listy grupowane są połączenia związane z tym samym dostępem licencyjnym. Ponadto może być wyświetlona dodatkowa grupa użytkowników niezalogowanych. Istnieje możliwość ograniczenia widoku do określonego typu połączeń, możliwe wybory to: jTerm (interaktwne) lub MBASIC (np. ODBC). Jeśli są zarejestrowani użytkownicy to dostępne stają się funkcje wysyłania wiadomości (menu Akcje, funkcja Wyślij wiadomość lub przycisk Wiadomość). Wiadomości będą wysyłane do wszystkich aktualnie zarejestrowanych użytkowników jednocześnie. Po wysłaniu komunikatu pojawi się okienko z listą użytkowników, do których był on adresowany. Komunikat powinien pojawić się na monitorach użytkowników po czasie nie przekraczającym minuty. Jeśli użytkownik wykonuje czynności wymagające kontaktu z serwerem aplikacji (np. wertuje okienko) to wiadomość pojawi się niemal natychmiast. Natomiast wyrejestrowywać z serwera aplikacji można tylko pojedynczych użytkowników. Należy najpierw wyświetlić listę zarejestrowanych użytkowników a po wybraniu i zatwierdzeniu funkcji Usuń z listy wskazany użytkownik zostanie wyrejestrowany z serwera aplikacji. W okienku z prezentującym listę użytkowników można też wysyłać komunikaty do wybranych użytkowników (przycisk Wiadomość). Wysyłanie wiadomości do użytkownika powoduje wysłanie jej do pierwszej aplikacji w grupie licencyjnej. Dla zarejestrowanego użytkownika dostępna jest funkcja Szczegóły, prezentująca dodatkowe informacje: — identyfikator aplikacji — grupa — zarejestrowany użytkownik — numer procesu — czas uruchomienia aplikacji — typ klienta/połączenia — adres klienta — nazwa NTEBIOS komputera klienta III.11. Administrator serwera aplikacji 49 — nazwa, pod jaką użytkownik jest zarejestrowany w systemie operacyjnym. 11 Administrator serwera aplikacji Do bezdialogowego wyrejestrowywania użytkowników oraz blokowania dostępu nowym użytkownikom służy program MacroAppLOCKER (lub mblocker.exe dla wersji windowsowej). Można uruchomić go tylko w systemie, w którym pracuje serwer aplikacji i może być wykorzystywany w procedurach backupowych. Wywołanie programu ma postać: MacroAppLOCKER [-l2|-l|-u] [-cs|-cr] [-ims|-imr] [port] [-k certificate_path] gdzie: -l2 nakłada tymczasową blokadę rejestrowania użytkowników i wyrejestrowuje wszystkich użytkowników (nie dotyczy mhtmlcgi.exe i MacroCGI automatycznie uruchamianych przez serwer aplikacji), -l nakłada tymczasową blokadę rejestrowania użytkowników (nie dotyczy mhtmlcgi.exe i MacroCGI automatycznie uruchamianych przez serwer aplikacji), -u zdejmuje tymczasową blokadę rejestrowania użytkowników (nie dotyczy mhtmlcgi.exe i MacroCGI automatycznie uruchamianych przez serwer aplikacji), -cs nakłada tymczasową blokadę na logowanie użytkowników i wyrejestrowuje wszystkich użytkowników (dotyczy wyłącznie procesów mhtmlcgi.exe oraz MacroCGI uruchamianych przez serwer aplikacji), -cr zdejmuje tymczasową blokadę na logowanie użytkowników (dotyczy wyłącznie procesów mhtmlcgi.exe oraz MacroCGI uruchamianych przez serwer aplikacji), -ims zatrzymuje serwer wiadomości MacroIMSERVER 50 Rozdział III. Architektura systemu -imr uruchamia serwer wiadomości MacroIMSERVER (o ile był wcześniej zatrzymany). Powiadomienia będą wysyłane do końcówek, z których nastąpi zarejestrowanie do systemu (do działających po zatrzymaniu serwera wiadomości przysyłanie komunikatów będzie wznowione dopiero po otworzeniu nowej aplikacji), -port port na którym pracuje serwer aplikacji, można pominąć jeśli jest to domyślny port 5580, -k certificate_path ścieżka do certyfikatu serwera aplikacji (jeśli wymagane jest połączenie SSL). Jeśli chcemy wyrejestrować wszystkich użytkowników i zablokować dostęp do serwera aplikacji bez zatrzymywania usługi serwera aplikacji, to należy wywołać program z opcjami: mblocker.exe -l2 -cs wznowienie obsługi klientów nastąpi po wywołaniu: mblocker.exe -u -cr 12 Serwer wiadomości W ramach środowiska MacroBASE istnieje możliwość przesyłania wiadomości pomiędzy użytkownikami systemu oraz powiadomień z systemu. Za przesyłanie komunikatów odpowiedzialny jest serwer wiadomości — MacroIMSERVER. Jest on uruchamiany automatycznie przy starcie serwera aplikacji. Do uruchomienia potrzebne jest oprogramowanie Java w wersji 7. Końcówki jTerm oraz konsola administratora jConsole komunikują się z serwerem wiadomości domyślnie poprzez port 7777. Poprzez wpisy w pliku launcher.cfg można zmienić domyślny numer portu, wymusić aby serwer wiadomości nie był uruchamiany przy starcie serwera aplikacji oraz nadać nazwę serwera komunikacyjnego: macroim = on macroim_port = nr_portu macroim_descr = nazwa III.12. Serwer wiadomości gdzie: on może przyjmować wartości: 0 serwer wiadomości nie będzie uruchamiany, 1 serwer wiadomości będzie uruchamiany podczas startu serwera aplikacji, domyślną wartością jest 1, nr_portu numer portu przez który będzie się odbywać komunikacja między jTermem a serwerem wiadomości. Domyślną wartością jest 7777, nazwa nazwa serwera komunikacyjnego. Będzie ona wyświetlana w tytule okienka komunikatora oraz w dymkach z nim związanych. Domyślna wartość (pusta) oznacza, że serwer nie ma nazwy. Po połączeniu z serwerem wiadomości, użytkownik może wysyłać wiadomości tekstowe, pliki lub zrzuty ekranu do innych użytkowników zarejestrowanych w serwerze wiadomości. Użytkownik jTerma będzie widoczny pod nazwą taką, jaka została zdefiniowana w opisie użytkownika w programie MacroPASS. Użytkownik jConsole będzie widoczny pod nazwą Administrator serwera. Drugim zadaniem serwera wiadomości jest dostarczanie powiadomień wysyłanych z aplikacji poprzez funkcję ntc_send. Wiadomości przechowywane są w tabeli SYSSALRT. Po zarejestrowaniu się pierwszego użytkownika jTerma, do systemu w którym jest zdefiniowana tabela SYSSALRT rejestrowani są dwaj użytkownicy (typu ODBC/MBASIC) o nazwie #macroim, którzy pozostają zalogowany do momentu zamknięcia jTerma. Wszyscy kolejni użytkownicy systemów współdzielących tabelę SYSSALRT będą otrzymywali powiadomienia składowane w tej tabeli. Użytkownicy identyfikowani są przez nazwę użytkownika podawaną przy rejestrowaniu (niezależnie od aplikacji ani grupy do której należy). Należy zatem pamiętać przy uruchamianiu systemów zintegrowanych, aby: — wszystkie systemy wpółdzieliły tabele SYSSALRT oraz SYSMEMO, — nie tworzyć różnych użytkowników o tych samych nazwach we współdzielonych systemach. Użytkownik o danej nazwie powinien być tym samym użytkownikiem we wszystkich zintegrowanych systemach. 51 52 Rozdział III. Architektura systemu Można zabronić wysyłania komunikatów poprzez wpis w pliku *.cfg (aplikacji lub macro.cfg). Mówi o tym parametr ntc_disable. Jeśli będzie miał wartość liczbową różną od 0, to komunikaty z aplikacji wysyłane nie będą. Komunikaty będą dostępne w jTermie, jeśli zostanie otworzona przynajmniej jedna aplikacja, z której można wysyłać komunikaty. Dla pojedynczego użytkownika może być zdefiniowanych maksymalnie 10 000 nieobsłużonych powiadomień. 13 Program komunikacyjny Za komunikację pomiędzy windowsowym serwerem komunikacyjnym, a serwerem bazy danych działającym pod Linuxem odpowiedzialny jest program MacroCOMM. Po uruchomieniu, program czeka na zgłoszenia nowych klientów. Po zarejestrowaniu klienta tworzona jest kopia procesu przeznaczana do obsługi nowego klienta bazy danych. Zatem procesów o nazwie MacroCOMM powinno być o jeden więcej, niż pracujących klientów. Wywołanie programu wygląda następująco: MacroCOMM -ppath [-wpath] [[-stop] | [-stop_f]] Obowiązkowym argumentem jest -ppath, gdzie po -p podajemy ścieżkę dostępu do katalogu z plikiem macro.cfg. Z pliku odczytywany jest parametr tcp_udp_port, mówiący o numerze portu. Dodatkowo po opcji -w można podać ścieżkę dostępu do katalogu roboczego. W celu zakończenia pracy programu komunikacyjnego należy wywołać program z opcją -stop (argument -ppath jest również obowiązkowy, program komunikuje się z działającą kopią też poprzez port, którego numer jest określany w pliku). Jeśli chcemy zatrzymać program komunikacyjny również wtedy, gdy są zarejestrowani klienci, należy użyć opcji -stop_f. 14 Poufność dostępu do bazy Możliwość zapewnienia poufności danych daje system ochrony uprawnień przy pomocy haseł. Ochrona jest realizowana poprzez blokowanie dostępu do poszczególnych elementów aplikacji. Domyślnie więc, wszystkie funkcje programu są dostępne. Do modyfikacji uprawnień przeznaczony jest, dostarczany w pakiecie, system MacroPASS. Jest to aplikacja napisana w MacroBASE. Efektem działania systemu MacroPASS jest plik zawierający powiązania nazw III.14. Poufność dostępu do bazy użytkowników z ich uprawnieniami i sposobami uwierzytelniania. Nazwa tego zbioru jest tworzona z nazwy systemu użytkowego i rozszerzenia .psw, np. demo.psw. Przy pierwszym uruchomieniu MacroPASSA następuje załadowanie domyślnych parametrów pracy aplikacji dotyczących domyślnych okresów ważności haseł oraz ustawień ostrzeżeń o przedawnieniu haseł i certyfikatów. Ustawienia domyślne można zawsze zmodyfikować w trakcie użytkowania aplikacji wybierając pozycję Parametry pracy w menu Administracja. Ustawienia dotyczą: — okresu ważności hasła — częstotliwość z jaką użytkownik będzie musiał zmieniać hasło. Wartością domyślną jest 30. Liczba dni nie może przekraczać 365, — ostrzeżenia o przedawnieniu hasła — parametr, określający liczbę dni do przedawnienia hasła, przy której program wyświetla ostrzeżenie. Wartością domyślną jest 14. Liczba dni nie może przekraczać 365, — ostrzeżenia o przedawnieniu certyfikatu — parametr określający liczbę dni do przedawnienia certyfikatu, przy której program wyświetla ostrzeżenie. Wartością domyślną jest 30. Liczba dni nie może przekraczać 365. Po uruchomieniu programu należy wskazać system, w którym będziemy zmieniać system ochron. Wyboru dokonujemy poprzez wywołanie funkcji Wybierz system dla wskazanej z listy zdefiniowanych aplikacji prezentowanych w oknie Systemy użytkowe. Dla wskazanej aplikacji, po wybraniu akcji wyświetl szCzegóły (lub wciśnięciu klawisza spacji) prezentowane są dla niej szczegółowe informacje: Nazwa definicji, Nazwa aplikacji, Numer seryjny, Plik *.pth (ścieżka do pliku pth), Plik *.psw (scieżka do pliku pws), Plik *.def (scieżka do pliku definicji systemu) oraz Okres ważności hasła (wyrażana w dniach wartość domyślna dla nowych grup). Dodatkowo może się pojawić lista podsystemów w przypadku, gdy takowe zostały zdefiniowane we wskazanym pliku DEF. Lista podsystemów aktualizowana jest podczas aktualizacji definicji (pierwsze załadowanie definicji w programie MacroPASS, akcja System/ Aktualizacja). Dodając nowy system (przez wybór z menu Dołącz/na poDstawie pliku PTH) podajemy ścieżkę do jego pliku deklaracji ścieżek *.pth (jeśli względną, to względem pliku pass.pth). Po naciśnięciu klawisza F3 istnieje możliwość wyboru pliku z listy aplikacji (lista ta wyświetla się także przy drugim sposobie dodawania nowego systemu przez wybór Dołącz/z serwera Aplikacji). Istnienie tego pliku jest obowiązkowe. Wszystkie pozostałe pliki istotne w procesie ustalania ochron są wyszukiwane na jego podstawie. 53 54 Rozdział III. Architektura systemu Przed dodaniem definicji nowej aplikacji, MacroPASS aktualizuje dane (PSW, DEF, numery seryjne) już zdefiniowanych aplikacji, aby były one zgodne z zawartością ich plików PTH. Dodanie nowej aplikacji zostanie uniemożliwione, jeśli wybrany plik PTH jest już zdefiniowany w MacroPASS oraz kiedy lokalizacja pliku PSW nowej aplikacji pokrywa się z jedną z już istniejących (wskazywanych przez jeden ze zdefiniowanych plików PTH). MacroPASS nie pozwoli także na pracę z niekompletną wersją definicji wygenerowanej warunkowo z MacroBUILDERa (gdy nie wszystkie okienka były gotowe podczas generowania). Jeśli wybieramy już istniejący system a od ostatniego uruchomienia zmianie uległa definicja systemu, którego ochrony modyfikujemy, należy wykonać Aktualizację. W przypadku niewykonania tej operacji, nowe elementy programu mogą być niedostępne na liście obiektów, które możemy chronić. Wszystkie poprzednie ustawienia (zapisane w pliku *.psw) zostaną zachowane, poza ochronami pozycji, które zostały usunięte z definicji systemu. Przed wyborem pracy z aplikacją aktualizowane zostaną ścieżki do pliku PSW i nazwa obsługiwanego pliku DEF. Jeśli plik PSW będzie nieunikalny w MacroPASS, użytkownik otrzyma ostrzeżenie, ale będzie mógł kontynuować pracę. W przypadku użycia definicji aplikacji z podsystemami, warunkiem koniecznym, aby dany użytkownik mógł korzystać z określonego podsystemu jest przypisanie go do tego podsystemu. Przypisanie to odbywa się z poziomu aplikacji MacroPASS: — w menu głównym pozycja Podsystemy, która pozwala na przypisywanie użytkowników do poszczególnych podsystemów, — w oknie użytkowników systemu istnieje dostęp do podsystemów pozwalając na przypisywanie podsystemów do poszczególnego użytkownika. Dla aplikacji bez podsystemów akcje dotyczące podsystemów będą niedostępne. Ochrony wybranego systemu może w danej chwili zmieniać lub przeglądać tylko jeden użytkownik. System wybrany wcześniej przez innego użytkownika jest wyróżniony kolorem i jest niedostępny do wybrania. Po wskazaniu systemu użytkownik zostanie poproszony o podanie klucza do pliku definicji (*.def) aplikacji, której ochrony chce modyfikować. Po zatwierdzeniu plik z ochronami zostanie wczytany lub, jeśli jeszcze nie istnieje, utworzony. Jeśli MacroPASS działa na komputerze z systemem operacyjnym Linux, na którym nie jest zainstalowany pakiet OpenSSL, nie będzie możliwe wczytywanie plików *.psw zawierających certyfikaty. Po wyborze systemu można przystąpić do definiowania ochron. Zarządzanie ochronami, czyli przypisywanie do grup poszczególnych elementów III.14. Poufność dostępu do bazy ochron w aplikacji, jest dostępne po wybraniu akcji Grupy. Wyświetlony widok prezentuje w lewej części listę zdefiniowanych grup, natomiast w prawej atrybuty wybranej grupy w zdefiniowanych zakładkach: — Właściwości grupy, — Członkowie grupy, — Grupy składowe, — Ochrony w grupie. W przypadku definiowania nowej grupy oprócz nazwy, należy podać również: — minimalną wymaganą długość hasła, — okres ważności hasła (będzie wartością domyślną dla członków grupy, podanie wartości 0 oznacza hasło bezterminowe), — czy hasło spełniać podwyższone kryteria bezpieczeństwa (ma zawierać wielkie i małe litery oraz znaki specjalne lub cyfry), — liczbę haseł trzymanych w historii, — maksymalną dopuszczalną liczbę nieudannych logowań, — czas blokady logowania użytkownika. Dla każdej grupy można zdefiniować opis tekstowy Opis(do 255 znaków). Opisy poszczególnych grup są dostępne z poziomu FORMULI za pomocą funkcji zwracających listę grup (prot_key(1) i prot_all). Dodatkowo do grupy można przypisać notatkę Notatka, która pozwoli na bardziej szczegółowy opis grupy. Maksymalna liczba haseł przechowywanych w historii dla użytkownika jest określana w MacroPASS w ustawieniach jego grupy podstawowej (podobnie jak jest dla minimalnej liczby znaków w haśle, czy dla poziomu bezpieczeństwa hasła). Maksymalna dopuszczalna wartość to 999. Wartość 0 oznacza brak przechowywania historii haseł użytkownika. Historia haseł będzie brana pod uwagę tylko przy zmianie hasła przez użytkownika, np. po wygaśnięciu hasła lub przy zmianie za pomocą funkcji passwd. W momencie zmiany hasła system pozwoli na zatwierdzenie nowego hasła tylko w przypadku, gdy będzie się ono różniło od ustalonej liczby poprzednich haseł. Historia haseł nie 55 56 Rozdział III. Architektura systemu będzie brana pod uwagę w przypadku zmiany hasła z poziomu MacroPASS oraz przy logowaniu certyfikatem lub przez Active Directory. Maksymalna dopuszczalna liczba nieudanych logowań dla użytkownika jest określana w MacroPASS w ustawieniach jego grupy podstawowej. Maksymalna dopuszczalna wartość to 999. Wartość 0 oznacza brak blokowania użytkownika po nieudanych logowaniach. W przypadku ustawienia tego parametru, system zlicza wszystkie kolejne nieudane próby logowania. Po przekroczeniu ustalonej liczby takich logowań konto użytkownika (możliwość logowania) zostanie zablokowane. Czas blokady użytkownika jest określany także w MacroPASS w ustawieniach jego grupy podstawowej. Czas blokady jest wyrażony w minutach i może być wartością z zakresu <0..1440>. Wartość 0 oznacza blokadę bezterminową, która może być zdjęta tylko przez Administratora przy użyciu modułu MacroPASS. Pozostałe wartości (czyli od 1 minuty do 24 godzin) określają w minutach czas blokady użytkownika. Po upłynięciu określonej liczby minut od ostatniego nieudanego logowania, system zezwoli na podjęcie kolejnej próby logowania. Poprawne logowanie do systemu usuwa informacje o wszystkich poprzednich nieudanych logowaniach użytkownika. Administracyjne odblokowanie konta użytkownika jest konieczne w przypadku blokady bezterminowej (jest także możliwe podczas trwania blokady czasowej). Aby odblokować użytkownika należy w MacroPASS wybrać dla użytkownika akcję uWierzytelnianie/ Hasło/ Administracyjne odblokowanie użytkownika i zapisać plik PSW. W tym momencie system zezwoli użytkownikowi na podjęcie próby logowania niezależnie od aktualnego stanu blokady. Nieudana próba logowania spowoduje jednak ponowne założenie blokady. MacroPASS umożliwia włączanie grup do innych grup, a przez to możliwość zbudowania hierarchii ochron. Wyjątkiem jest grupa wdrożenia, która nie może być składową i sama nie może zawierać innych grup. Ochrony danej grupy wynikają z sumy jej ochron i ochron grup składowych. Jeśli w grupie lub jej składowych są powielone ochrony tych samych elementów to obowiązują te z najwyższego poziomu hierarchii. W przypadku składania ochron z grup na tym samym poziomie, obowiązuje zwykłe sumowanie (z uwzględnieniem ochron i uprawnień). Uznaje się, że użytkownik należy do grupy, jeśli jest do niej przypisany lub do jednej z jej grup składowych. Możliwość zbudowania hierarchii ochron realizowana jest w widoku przentowanym na zakładce Grupy składowe, gdzie akcjami Dołącz grupę składową i Usuń realizujemy omawianą finkcjonalność. Grupy standardowe to grupy zdefiniowane na etapie tworzenia aplikacji, są one dostarczane wraz z pakietem Xpertis. Podczas wdrożenia modyfika- III.14. Poufność dostępu do bazy cja tych grup jest ograniczona, nie jest więc możliwa modyfikacja listy ochron, zmiana nazwy lub opisu grupy. Można określić domyślny okres ważności hasła, minimalną długość hasła oraz jego poziom bezpieczeństwa. Można też przypisywać użytkowników do tych grup i dodawać je do innych jako podgrupy. Nazwy grup standardowych rozpoczynają się od znaku wykrzyknika (!). System uniemożliwi użycie znaku wykrzyknika w nazwach nowych grup. Wczytanie pliku *.psw z poprzednich wersji z wykrzyknikiem w nazwie grupy spowoduje ich zamianę na znak podwójny wykrzyknik (wynik ˆ8252). Aby zapis pliku *.psw był możliwy konieczna jest zmiana nieprawidłowych znaków. Ochrony przypisane do poszczególnych grup wyświetlane są w okienku prezentowanym w zakładce Ochrony w grupie po wybraniu przełącznika ZDEFINIOWANE, w odróżnieniu do widoku prezentowanego po wybraniu przełącznika OBOWIZUJĄCE, gdzie wyświetlana jest lista ochron zdefiniowana dla grupy jak i wynikająca z ochron. Prezentowane listy można ograniczyć do poszczególnych typów poprzez wybór przycisku z nazwą typu chronionego elementu. Oprócz definiowania elementów chronionych możliwe jest również nadawanie uprawnień. Można zatem udostępniać elementy aplikacji, które są chronione w innych grupach. Nie ma więc konieczności tworzenia nowej grupy z prawie identycznym zestawem ochron w celu odblokowania jednego elementu, wystarczy udostępnić ten konkretny element. Zwiększa to również łatwość stosowania grup standardowych. Przy sumowaniu ochron na tym samym poziomie hierarchii, nałożenie ochrony ma niższy priorytet niż udzielenie dostępu. Domyślnie w aplikacji bez żadnych ochron nadal wszystkie elementy są dostępne, a zatem udostępnianie elementów będzie miało znaczenie tylko w przypadku istnienia ochron dla tych samych elementów. System pozwala chronić następujące elementy programów: Menu Ochrony menu przypisujemy poprzez zaznaczenie odpowiednich pozycji, których dana grupa może/nie może wykonywać. Funkcjonalność dostępna po wyborze akcji dołącz chroniony Element/Menu i wskazaniu dla wybranej pozycji menu określonego poziomu ochrony: Domyślnie, Zabroń lub Zezwalaj. Akcje okienek wertowania Ochrony akcji okienek definiuje się podobnie jak ochrony menu, z tym że najpierw wybieramy, którego okienka akcje chcemy chronić. 57 58 Rozdział III. Architektura systemu Pola okienek wertowania Dla wybranej tabeli, wskazać okienko wertowania i włączyć lub wyłączyć ochrony dla poszczególnych pól okienka. Jeśli pole typu prostego jest umieszczone kilkakrotnie w okienku, to w systemie ochron będzie dostępne raz, a ustawiona ochrona będzie obowiązywała dla każdego wystąpienia w okienku. To samo dotyczy pól złączeniowych z tym samym reprezentantem. Dostępne są następujące możliwości ochrony: Domyślnie ustawienie domyślnego poziomu ochrony, Pełny dostęp dostęp do pola okienka bez ograniczeń, Brak zapisu żaden użytkownik danej grupy nie będzie mógł zmienić wartości pola. Pole będzie pomijane przy redagowaniu, tak jakby było zaznaczone w definicji systemu jako nieredagowalne, Dostęp do odczytu żaden użytkownik danej grupy nie będzie mógł zmienić wartości pola. Pole będzie pomijane przy redagowaniu, tak jakby było zaznaczone w definicji systemu jako nieredagowalne, Brak dostępu pole będzie nieredagowalne i dodatkowo wartość pola będzie reprezentowana w okienku poprzez same kropki. Dla użytkownika poziomy ochrony Brak zapisu i Dostęp do odczytu są identyczne: można odczytać wartość pola, ale zawsze będzie ono nieredagowalne. Istotna różnica w tych poziomach występuje w przypadku składania ochron (wyliczania efektywnej ochrony elementu na danym poziomie w hierarchii grup): — dostęp do odczytu + brak dostępu = dostęp do odczytu, — dostęp do odczytu + brak zapisu = dostęp do odczytu, — dostęp do odczytu + pełny dostęp = pełny dostęp. Z powyższych zależności wynika wniosek, że nowy poziom ochrony tylko w złożeniu z pełnym dostępem jest zastępowany. Dzięki temu będzie możliwość wymuszenia dostępu tylko do odczytu także w przypadku, gdy podczas składania ochron trafimy na „brak dostępu” a nie chcemy dawać użytkownikowi dostępu pełnego. III.14. Poufność dostępu do bazy Drag & Drop w okienkach wertowania Funkcja pozwala zdefiniować listę okienek wertowania, dla których możliwość upuszczania elementów (a co za tym idzie, także wykonywania stosownych formuł z tym związanych) będzie zablokowana. W kliencie wykonanie funkcji dnd_sel dla chronionego okienka ma działanie puste. Przyciski w okienkach wertowania Możliwość definiowania ochron dla przycisków w okienkach wertowania. Jeśli przycisk jest chroniony, będzie w okienku wyszarzony. Próba zmiany stanu przycisku z poziomu Formuli+ nie zgłosi błędu, ale stan takiego przycisku nie zmieni się. Ochrony można nakładać tylko dla przycisków zdefiniowanych w MacroBUILDERZE. Pola okienek redagowania Zasady definiowania ochron dla pól okienek redagowania są identyczne jak dla okienek wertowania. Przyciski w okienkach redagowania Zasady definiowania ochron dla przycisków w okienkach redagowania są identyczne jak dla przycisków w okienkac wertowania. Tabele/Zmienne Każda tabela lub zmienna strukturalna i każde pole może mieć przypisany jeden ze stanów: Domyślnie ustawienie domyślnego poziomu ochrony, Brak dostępu zabroniony odczyt i zapisywanie dla wszystkich pól tabeli/zmiennej, Brak zapisu można odczytać wartości wszystkich pól tabeli/zmiennej pola, ale zawsze będą one nieredagowalne, Dostęp do odczytu można odczytać wartości wszystkich pól tabeli/zmiennej pola, ale zawsze będą one nieredagowalne, Dostęp pełny pełny dostęp do wszystkich pól tabeli/zmiennej. Dla użytkownika poziomy ochrony Brak zapisu i Dostęp do odczytu są identyczne: można odczytać wartość pola, ale zawsze będzie ono nieredagowalne. Istotna różnica w tych poziomach występuje w przypadku składania ochron (wyliczania efektywnej ochrony elementu na danym poziomie w hierarchii grup): — dostęp do odczytu + brak dostępu = dostęp do odczytu, 59 60 Rozdział III. Architektura systemu — dostęp do odczytu + brak zapisu = dostęp do odczytu, — dostęp do odczytu + pełny dostęp = pełny dostęp. Z powyższych zależności wynika wniosek, że nowy poziom ochrony tylko w złożeniu z pełnym dostępem jest zastępowany. Dzięki temu będzie możliwość wymuszenia dostępu tylko do odczytu także w przypadku, gdy podczas składania ochron trafimy na „brak dostępu” a nie chcemy dawać użytkownikowi dostępu pełnego. Przypisanie ochrony dla tabeli lub zmiennej strukturalnej powoduje ochronę wszystkich jej pól w co najmniej takim samym trybie. Poziom ochrony pola można jednak zwiększyć przypisując mu wyższy stopień ochrony, Pola tabel/zmiennych Polom tabeli można przypisać takie same poziomy ochrony jak tabelom. Przypisanie niższego poziomu ochrony dla pola niż dla tabeli lub zmiennej, z której pochodzi, nie ma znaczenia. Podobnie, każde chronione pole będzie chronione w co najmniej takim samym trybie w każdym okienku. Poprzez przypisanie ochrony pola w okienku można więc jedynie zwiększyć poziom zabezpieczenia pola w okienku. Należy pamiętać, że przypisanie ochrony dla tabeli, zmiennej strukturalnej lub pola, poza blokadą poprawiania lub wyświetlania w okienku, nie ma wpływu na możliwość odczytu pola z poziomu Formuli+. Na powyższe ochrony wrażliwe są tylko funkcje: psql i psql_exec wersje funkcji sql i sql_exec, jednak wykonujące się tylko wtedy, gdy użytkownik ma dostęp do czytania wszystkich tabel i pól użytych w zapytaniu, tab_mod i fld_mod metody zwracające wartość różną od 0 wtedy, gdy użytkownik nie ma zabronionego odczytu i zapisu do odpowiednio tabeli lub zmiennej strukturalnej albo pola, tab_read i fld_read metody zwracające wartość różną od 0 wtedy, gdy użytkownik nie ma zabronionego dostępu do czytania odpowiednio tabeli lub pola Maska procedur wbudowanych Można zabronić danej grupie użytkowników wywoływania procedur wbudowanych. Mechanizm ochrony działa w oparciu o listę masek pro- III.14. Poufność dostępu do bazy 61 cedur. Dozwolone jest użycie w maskach metaznaków. Maska procedury dotyczy całej jej nazwy, czyli postaci procedura@plik. Przykładowo: ’*@plik1’ maska dotyczy wszystkich procedur z pliku plik1, ’proc1@*’ maska dotyczy procedur o nazwie proc1 we wszystkich plikach, ’proc1@plik1’ maska dotyczy tylko procedury proc1 z pliku plik1. Do danej maski procedur będzie można przypisać rodzaj ochrony: Domyślnie, Zabroń, Zezwalaj. Istnieje możliwość określenia kolejnosci masek niezależnie od typu ochrony. Ustalenie kolejności odbywa się w okienku dodawania masek (Grupy / Ochrony w grupie / Dołącz chroniony element / Maski procedur wbudowanych) lub (Grupy / Ochrony w grupie / Dołącz chroniony element / Maski sprawozdań). Ustalona kolejność masek jest wspólna dla wszystkich grup. W przypadku, gdy taki sam zbiór masek miałby być sprawdzany w różnej kolejności w różnych grupach, tę samą maskę można zdefiniować więcej niż raz. Kolejność masek jest zapisywana do pliku PSW. Maska sprawozdań Mechanizm ochrony raportów działa analogicznie do ochrony procedur wbudowanych. Maska jest dopasowywana do nazwy pliku *.rpt bez rozszerzenia. W przypadku wywołania funkcji rep_exec z metaznakami w argumencie, na liście nie pojawią się chronione raporty. Raport skompilowany z pliku plik1.rpm może być uruchomiony tylko z pliku plik1.rpt. W przypadku wykonania raportu z pliku o zmienionej (po kompilacji) nazwie, system wyświetli błąd. Dostęp poprzez ODBC Można wprowadzić ograniczenia w dostępie poprzez sterownik ODBC. Istnieją trzy poziomy ochron: Brak dostępu użytkownicy z grupy nie będą mieli prawa dostępu do bazy danych poprzez sterownik ODBC, 62 Rozdział III. Architektura systemu Procedury wbudowane dostęp do danych poprzez ODBC będzie możliwy wyłącznie poprzez procedury wbudowane. Próba pobrania danych w inny sposób zakończy się błędem, Bez ograniczeń dopuszczalne są wszystkie sposoby dostępu do danych poprzez ODBC. Ewentualne ograniczenia mogą wynikać z ustawionych niezależnie ochron tabel lub procedur wbudowanych. Usuwanie ochron może się odbywać z poziomu okienka z widokiem ochron zdefiniowanych w grupie. Akcja Usuń dla dla widoku ochron obowiązujących w grupie jest niedostępna. Maksymalna liczba grup w aplikacji wynosi 1024. Do nowych grup można również kopiować ochrony grup już istniejących (funkcja Inne funkcje/Kopiuj grupę). Dodatkowo istnieje mechanizm importu grup lub grup razem z ochronami z plików *.psw (funkcja Inne funkcje/Kopiuj grupę). Po wskazaniu pliku odczytywane są grupy i przypisane do nich ochrony. Pod uwagę brane są tylko ochrony elementów, które są zdefiniowane w bieżącej aplikacji. W przypadku ochron z grup, które są już zdefiniowane w aplikacji, pod uwagę są brane tylko ochrony, które nie są przypisane do danej grupy. W przypadku, gdy istniejąca grupa w aplikacji nie ma żadnej ochrony do zaimportowania (albo jest pusta, albo zawiera już przypisane ochrony), jest ona pomijana. Następnie użytkownik w okienku zawierającym informacje o wczytanym pliku *.psw wybiera, które z grup i ochron chce zaimportować do systemu. Gdy importujemy nową grupę do aplikacji, jest ona dodawana wraz ze wszystkimi odczytanymi parametrami (w przypadku braku niektórych parametrów są one uzupełniane wartościami domyślnymi). System nie pozwoli na dodanie grupy o nieprawidłowej nazwie, ani na dodanie grupy standardowej (z nazwą rozpoczynającą się od znaku wykrzyknika). W takim przypadku akcja dodawania zostanie anulowana. Gdy importujemy grupę już istniejącą w aplikacji, importowane są tylko ochrony, parametry grupy nie są zmieniane. W przypadku prawidłowego zaimportowania ochrony jest ona usuwana z listy, zatem do wyboru pozostaną tylko ochrony, których nie ma jeszcze w aplikacji. Po zdefiniowaniu grup i ochron można przystąpić do dodawania lub modyfikowania opisów użytkowników. Wybieramy w tym celu z menu głównego funkcję Użytkownicy. Każdemu użytkownikowi przypisujemy nazwę, opis, grupę podstawową, do której ma należeć oraz dozwolone sposoby uwierzytelniania. W nazwie użytkownika zabronione jest wykorzystanie znaków: ˜ \ / [ ] ( ) { } * ? : | % $ < > . " ; III.14. Poufność dostępu do bazy Dodatkowo nazwy nowoutworzonych użytkowników muszą składać się wyłącznie z małych liter. Nazwy użytkowników zawierające wielkie litery wcześniejszymi wersjami nadal mogą być używane, jednakże MacroPASS uniemożliwi utworzenie nowego użytkownika z nazwą identyczną z istniejącą bez uwzględnienia wielkości liter (np. jeśli zdefiniowany jest użytkownik o nazwie Szef to nie będzie można zdefiniować użytkownika o nazwie szef). Grupa podstawowa, to grupa określona dla użytkownika w momencie jego definiowania i jest widoczna w okienku użytkowników. Z niej też pochodzą obowiązujące użytkownika parametry hasła jak: minimalna liczba znaków w haśle i poziom bezpieczeństwa hasła. Grupa podstawowa użytkownika może być później zmieniona z poziomu listy grup przypisanych do danego użytkownika. Istnieje możliwość dodawania użytkowników do więcej niż jednej grupy ochron. Ochrony przypisane do poszczególnych grup są sumowane po zalogowaniu użytkownika. Oznacza to, że danego użytkownika obowiązują łącznie wszystkie ochrony, które są zdefiniowane w grupach, do których należy. W przypadku ochron stopniowanych (takich jak dostęp do pól okienek czy dostęp do ODBC) i gdy ten sam element jest chroniony w różnych grupach na różnym poziomie użytkownika obowiązuje najbardziej restrykcyjny poziom ochrony. Grupa wdrożenia jest specjalnie traktowana w przypadku przynależności do wielu grup: Jeśli użytkownik należy do grupy wdrożenia, zawsze będzie ona jego grupą podstawową. Zmiana grupy podstawowej takiego użytkownika będzie skutkować usunięciem go z grupy wdrożenia. Możliwość dodawania i usuwania użytkowników do/z poszczególnych grup dostępna jest z poziomu okienka z grupami (akcja Grupy zakładka Członkowie grupy z głównego menu). Możliwość dodawania i usuwania użytkownika do/z poszczególnych grup, a także określenia grupy podstawowej dostępna jest dla okienka z użytkownikami (akcja Użytkownicy z głównego menu). Dostępne są cztery sposoby uwierzytelniania: — za pomocą hasła, — z użyciem karty SmartCard, — bez podania hasła, — z wykorzystaniem zintegrowanego uwierzytelniania usługi Active Directory. 63 64 Rozdział III. Architektura systemu Można udostępnić dowolną kombinację sposobów uwierzytelniania. Możliwość logowania bez podania hasła jest tożsama z ustawieniem dla użytkownika pustego hasła, bez aktywacji sposobu logowania bez podania hasła. W przypadku wykorzystywania biblioteki mbasic.dll, dla użykowników mających ustawione puste hasło lub ustawiony sposób logowania bez podania hasła, jako parametry dotyczące haseł dla funkcji odpowiedzialnych za logowanie należy przekazać wartości puste. Jeśli użytkownik nie ma wybranego sposobu uwierzytelniania, jego dane zostaną zapisane w pliku *.psw, ale nie będzie mógł zarejestrować się w systemie. Dla wybranego sposobu uwierzytelniania odpowiednio w kolumnach Hasło, Karta, Bez hasła oraz Act.Directory pojawią się litery H, K, B oraz A. Po zaznaczeniu opcji uwierzytelniania hasłem pojawi się okienko w którym należy ustawić hasło i podać okres jego ważności. Podawana liczba (od 0 do 365) określa liczbę dni, po upływie których, użytkownik będzie musiał zmienić hasło. Jeśli podamy zero, hasło będzie ważne bezterminowo. Termin ważności jest wyznaczany automatycznie i mówi którego dnia wpisane hasło ulegnie przeterminowaniu. Hasło musi spełniać kryteria określone dla bieżącej grupy użytkowników odnośnie długości i rodzaju wymaganych znaków, oraz nie może być dłuższe niż 20 znaków i zawierać średnika (;). Jeśli podane hasło nie spełnia wymogów danej grupy, wyświetlane jest ostrzeżenie z możliwością powrotu do edycji lub akceptacji hasła w obecnej postaci. Przy dodawaniu użytkownika uwierzytelnianego hasłem (którego grupa podstawowa ma niezerową wartość w polu Okres ważności hasła) można od razu wybrać opcję dla pierwszego hasła: puste, takie jak login i wymusićjego zmianę przy pierwszym logowaniu. Po zaznaczeniu opcji uwierzytelniania kartą należy przypisać użytkownikowi certyfikat. Certyfikat można wczytać z karty SmartCard (widoczne są tylko te certyfikaty, które z aktualnie używanej karty zostały zarejestrowane w systemie przy pomocy menedżera tej karty i dodatkowo posiadają na karcie powiązany klucz prywatny) lub z pliku w formacie PEM. Wczytywany certyfikat musi być ważny i nie może być przypisany do innego użytkownika systemu (każdy użytkownik musi mieć inny certyfikat). Jeśli do zmiennej systemowej MACROLOGIN będzie przypisana nazwa użytkownika uwierzytelniającego się bez hasła, to użytkownik będzie automatycznie zarejestrowany, bez wyświetlenia dialogu. Możliwość logowania bez podania hasła jest tożsama z ustawieniem dla użytkownika pustego hasła bez aktywacji sposobu logowania B. Oznacza to, że dla użytkownika z pustym hasłem także może wystąpić logowanie automatyczne nawet bez ustawionej opcji logowania B. III.14. Poufność dostępu do bazy Wybór logowania z wykorzystaniem zintegrowanego uwierzytelniania usługi Active Directory do rejestracji w aplikacjach MacroBASE pozwala na wykorzystanie kont użytkowników domeny z dowolnych kontenerów usługi. Dzięki takiemu podejściu zarządzanie hasłami może odbywać się poza systemem MacroBASE. Kontroler domeny będzie pilnował odpowiedniej złożoności hasła, historii zmian, okresów aktualizacji itp. Zmiana hasła do systemu operacyjnego jest jednocześnie zmianą hasła do systemu MacroBASE i użytkownik wykonuje ją tylko raz. Dostęp do usługi odbywa się na poziomie serwera aplikacji a więc użytkownik nie musi być w tej samej sieci co serwer udostępniający usługę Active Directory. Serwer aplikacji może działać zarówno pod Windows jak i pod Linux. Aby użytkownik mógł zarejestrować się w systemie MacroBASE nową metodą, należy przyporządkować mu taki sposób uwierzytelniania w programie MacroPASS. Służą do tego funkcje menu Active Directory w oknie przeglądania użytkowników. Aby odczytać listę kont użytkowników z serwera, należy najpierw skonfigurować parametry połączenia z serwerem. Służy do tego opcja zmień Ustawienia. Należy podać: — adres serwera z usługą Active Directory, — nazwę i hasło użytkownika zdefiniowanego w Active Directory, — opcjonalnie można podać nazwę grupy, z której informacje o użytkownikach mają być pobierane. Powyższe parametry (poza hasłem) ustawia się dla każdej z aplikacji i są zapamiętywane dla niej w zasobach programu MacroPASS. Hasło jest pamiętane dla wybranej aplikacji na czas trwania danej sesji lub do czasu wybrania w programie MacroPASS innej aplikacji. Po połączeniu z serwerem można przypisywać użytkownikom aplikacji konta z Active Directory. Dostępne w Active Directory konta wybieramy z listy. Specjalnym atrybutem wyróżnione są: — konto przypisane do aktualnie wybranego użytkownika systemu MacroBASE (kolor szary), — konta przypisane do innych użytkowników MacroBASE (kolor czerwony), — konta przypisane w innych aplikacjach zarządzanych z tej samej instalacji programu MacroPASS (kolor niebieski). 65 66 Rozdział III. Architektura systemu Jeśli podana została nazwa grupy, to na liście dostępni będą tylko użytkownicy do niej należący. Po wskazaniu konta z Active Directory przypisanie go użytkownikowi MacroBASE odbywa się analogicznie, jak przypisanie certyfikatu do uwierzytelniania kartą. Konto z Active Directory może być przypisane tylko do jednego użytkownika MacroBASE. Użytkownicy z opcją uwierzytelniania Active Directory wyróżnieni są w programie MacroPASS symbolem A w kolumnie Act.Directory. Jeśli wskazane jest również konto z Active Directory, to dodatkowo pole wyróżnione jest kolorem niebieskim. W celu ułatwienia zarządzania kontami użytkowników powiązanymi z Active Directory dodana została funkcja Przypisanie zbiorowe, która służy do przypisania grupy kont Active Directory do określonej grupy (klucza protekcji) zdefiniowanej programem MacroPASS. Funkcja tworzy nowe i aktualizuje istniejące konta użytkowników systemu na podstawie danych z Active Directory, z zachowaniem unikalności nazw użytkowników. Jeśli nazwa z Active Directory powtarza się z już istniejącą, to będzie zmodyfikowana tak, aby zachować unikalność. Jeśli konto z Active Directory zostało już wcześniej założone, to aktualizowane są wtedy dane użytkownika. Aby MacroCLIENT użył uwierzytelniania Active Directory należy w okienku logowania zaznaczyć opcję Uwierzytelnianie Active Directory. Uruchomienie klienta z parametrem -qldap spowoduje, że opcja uwierzytelniania Active Directory będzie domyślnie zaznaczona. Gdy opcja uwierzytelniania Active Directory jest włączona, w pola nazwy użytkownika i hasła można wpisać do 127 znaków. System dopuszcza wprowadzanie nazwy użytkownika w formach: — nazwa domenowa Windows: [email protected] — nazwa domenowa dla systemów starszych niż Windows 2000: NAZWA_DOMENY\nazwa_konta Dla ułatwienia procesu uwierzytelniania, dla pierwszego z formatów, część z nazwą domeny (od znaku @) może zostać pominięta. Użytkownik, który zarejestrował się w programie z wykorzystaniem usługi Active Directory nie będzie mógł zmienić hasła przy użyciu funkcji passwd. Opcja uwierzytelniania Active Directory została także dodana do definiowania źródeł ODBC. W oknie dialogowym przy konfigurowaniu źródła danych III.14. Poufność dostępu do bazy dostępna jest opcja Uwierzytelnianie Active Directory. Dla sterowników ODBC działających pod Linuxem uwierzytelnianie poprzez Active Directory jest niedostępne. Na liście użytkowników kolorem czerwonym oznaczeni są użytkownicy, dla których zdefiniowano przynajmniej jedną metodę logowania, ale z powodu niewystarczającej konfiguracji użytkownik nadal nie będzie miał możliwości zalogowania się do aplikacji. Przyczynami niewystarczającej konfiguracji uwierzytelniania użytkownika mogą być: — użytkownik nie przypisany do żadnego podsystemu, — użytkownik ma dostępną metodę uwierzytelniania kartą, ale nie ma przypisanego certyfikatu, — użytkownik ma dostępną metodę uwierzytelniania przez Active Directory, ale nie ma przypisanego użytkownika Active Directory. Kolorem szarym oznaczano użytkowników bez żadnej metody logowania. Po wybraniu z menu okna użytkowników aplikacji MacroPASS istnieje możliwość importu użytkowników z plików tekstowych. Funkcjonalność ta pozwala na łatwe zaimportowanie użytkowników z innego pliku PSW, a także na import z plików tekstowych o innym formacie. Daje to możliwość szybkiego i wygodnego przygotowania dużej listy użytkowników aplikacji. Zaimportować można: — nazwę użytkownika, — opis użytkownika, — hasło użytkownika. Import użytkowników odbywa się w 3 krokach: Wskazanie pliku do importu i opcji importu Plik do importu wskazujemy wpisując ścieżkę do pliku ręcznie lub dialogowo za pomocą dialogu wyboru pliku. Domyślnie system wskazuje pliki PSW, ale można wskazać dowolny plik tekstowy (PSW, TXT, CSV, ...). Jeśli wskazany plik nie jest plikiem PSW, należy określić dodatkowe parametry: znak separatora oraz stronę kodową pliku źródłowego. Separatorem może być dowolny znak (najczęściej używane separatory są do wyboru jako pole radiowe). Dostępne strony kodowe (do wyboru jako pole radiowe): Mazovia, Windows-1250, ISO-8859-2, UTF-8. Oczekiwany format wiersza w pliku tekstowym (jeśli nie jest to PSW) to: 67 68 Rozdział III. Architektura systemu login<separator>nazwa<separator>hasło Pole login jest obowiązkowe, pole nazwa zostanie zastąpione loginem, gdy nie występuje. Hasło należy podać otwartym tekstem, zastępowane jest loginem w przypadku jego braku. Dodatkowe opcje importu to automatyczne pominięcie użytkowników o nieprawidłowych, z punktu widzenia MacroBASE, nazwach i/lub pominięcie użytkowników o nazwach już zdefiniowanych w aplikacji. Lista zaimportowanych użytkowników Wszyscy zaimportowani użytkownicy trafiają do okienka importu. Tutaj możemy dodać użytkowników z kolejnych plików (powtórzyć poprzedni krok), możemy także poprawić niezbędne dane. W tym okienku użytkownicy już zdefiniowani w aplikacji oznaczeni są na szaro, a użytkownicy o nieprawidłowych nazwach oznaczeni są na czerwono (żadnego z nich nie da się zaimportować do aplikacji, ale można poprawiać te dane). W okienku dostępne są akcje „czyszczące”, takie jak usunięcie wszystkich użytkowników już zdefiniowanych w systemie, usunięcie tych o niepoprawnych nazwach, albo importowanych z określonego źródła. Można też przed importem ustalić hasło użytkownika na takie, jak nazwa użytkownika. Import do listy użytkowników aplikacji Z przygotowanej listy importu możemy importować użytkowników do aplikacji. Import dotyczy zaznaczonych użytkowników z listy importu. Przed importem należy określić do jakiej grupy (podstawowej) będą należeć importowani użytkownicy oraz czy ich hasło ma być unieważnione, aby wymusić jego zmianę przy kolejnym logowaniu. Trzeci krok można powtarzać dla kolejnych zbiorów użytkowników wybierając na przykład inną grupę podstawową. Należy pamiętać, że nowododani użytkownicy są przypisani tylko do jednej grupy - grupy podstawowej i nie są przypisani do żadnego podsystemu. Wybierając z menu okna prezentującego listę użytkowników akcję Inne funkcje/ Kopiuj z innego użytkownika dostępna jest możliwość kopiowania ustawień użytkownika. Funkcjonalność pozwala dla zaznaczonych użytkowników i jednego wskazanego użytkownika na: dla grup: — zastąpienie istniejących grup, grupami kopiowanego użytkownika, III.14. Poufność dostępu do bazy — dodanie do istniejących grup, grup kopiowanego użytkownika, — zmianę grupy podstawowej na grupę podstawową kopiowanego użytkownika, dla podsystemów: — zastąpienie istniejących podsystemów, podsystemami kopiowanego użytkownika, — dodanie do istniejących podsystemów, podsystemów kopiowanego użytkownika. Znaczenie pozostałych niestandardowych funkcji dostępnych po wybraniu menu uWierzytelnianie jest następujące: typ uWierzytelniania służy do grupowej zmiany sposobu uwierzytelniania użytkowników, Hasło zmiana parametrów uwierzytelniania hasłem zmiana Hasła zmienia hasło użytkownika. Do zmiany hasła użytkowników nie jest wymagana znajomość starego hasła, Okres ważności zmiana okresu ważności hasła, może działać jako funkcja grupowa, Termin ważności zmiana terminu ważności hasła, może działać jako funkcja grupowa, karTa(SmartCard) zmiana parametrów uwierzytelniania kartą Zmiana certyfikatu pozwala na przypisanie użytkownikowi certyfikatu z pliku lub z karty, bądź na usunięcie certyfikatu wcześniej przypisanego. Dla programu działającego w systemie Linux certyfikat można wczytać tylko z pliku, Eksport certyfikatu zapisuje certyfikat bieżącego użytkownika do pliku w formacie PEM, 69 70 Rozdział III. Architektura systemu Zestawienia — Hasła i Certyfikaty zestawienie umożliwiające sprawdzenie stanu certyfikatów i haseł na dany, wybrany przez użytkownika, dzień. Do zestawienia możemy wybrać certyfikaty lub hasła ważne, bliskie przedawnienia i nieważne. Wynik jest prezentowany w okienku tymczasowym. Jeśli ustawienia ochron, użytkowników lub grup wybranego systemu uległy zmianie, to w linii tytułu programu, za nazwą systemu, pojawi się gwiazdka sygnalizująca potrzebę zapisania pliku *.psw. Należy wtedy z głównego menu wybrać opcję Systemy i Zapisanie zmian. Wywoływany jest wtedy program do zapisu zmian ochron (MacroPROTECT dla systemu Linux lub protect.exe dla systemu Windows). Żeby zmiany zostały zapisane konieczne jest podanie klucza do definicji systemu, którego ochrony modyfikujemy. Istnieje możliwość wyświetlenia efektywnych ochron danego użytkownika w postaci okienka analogicznego do sposobu wyświetlania ochron dla poszczególnych grup. Funkcjonalność ta jest dostępna z poziomu menu okienka użytkowników (akcja Ochrony/Obowiazujące dla Użytkownika). Oprócz listy elementów dostępna jest dodatkowa informacja, z jakiej grupy (lub grup) pochodzi ochrona danego elementu. Lista elementów chronionych dla użytkownika dostępna jest po wybraniu z menu Ochrony/elementy Chronione natomiast lista elementów dozwolonych po wybraniu Ochrony/elementy Dozwolone. Czasami, na przykład ze względów polityki bezpieczeństwa, konieczne jest udokumentowanie aktualnego stanu ochron w aplikacjach. Z tego powodu w MacroPASS istnieje możliwość przygotowania zestawienia dozwolonych lub chronionych elementów aplikacji dla użytkownika. Zestawienie to jest dostępne z menu Zestawienia / Elementy dozwolone/chronione. Zestawienie to jest parametryzowane, użytkownik określa dialogowo poniższe parametry: Listę użytkowników, którzy mają być uwzględnieni w sprawozdaniu można zrobić zestawienie zarówno dla pojedynczego użytkownika jak i dla wszystkich użytkowników aplikacji. Typ elementów uwzględnionych w sprawozdaniu można wybrać do zestawienia albo elementy dozwolone (nie chronione) albo chronione. Rodzaje elementów ochron, które mają być uwzględnione można wybrać do zestawienia albo elementy dozwolone (nie chronione) albo chronione: III.14. Poufność dostępu do bazy - menu, - akcje okienek wertowania, - pola okienek wertowania, - drag’n’drop w okienkach wertowania, - przyciski w okienkach wertowania, - pola okienek redagowania, - przyciski w okienkach redagowania, - tabele i zmienne, - pola tabel i zmiennych, - maski procedur wbudowanych, - maski sprawozdań, - dostęp przez ODBC. W przypadku zestawienia elementów dozwolonych, w zestawieniu znajdą się te elementy systemu ochron, które nie są chronione w żadnej z grup danego użytkownika. Wydruk elementów dozwolonych dla użytkownika uwzględnia także przypisanie użytkownika do podsystemów. Jeśli w definicji jest zdefiniowane menu, które jest przypisane wyłącznie do podsystemów niedostępnych dla użytkownika, to nie będzie się ono pojawiało na liści elementów dla niego dozwolonych. W przypadku zestawienia elementów chronionych uwzględnione zostaną wszystkie chronione elementy zdefiniowane w każdej z grup użytkownika – jeśli dany element jest chroniony w więcej niż jednej grupie, na liście pojawi się tylko raz. Dodatkowe założenia uwzględnione w zestawieniu: — jeśli nałożona jest ochrona na plik z procedurami wbudowanymi, to zestawienie uwzględnia to także na liście procedur z tego pliku, — jeśli nałożona jest ochrona na tabelę/zmienną, to zestawienie uwzględnia to także na liście pól tabel/zmiennych i na liście pól okienek wertowania i redagowania, — jeśli nałożona jest ochrona na pole tabelo/zmiennej, to zestawienie uwzględnia to także na liście pól okienek wertowania i redagowania. Powyższe warunki nie dotyczą jednak pól reprezentantów pól złączeniowych, ponieważ zbiór *.psw nie przechowuje informacji o relacjach. Korzystając z wyżej opisanego zestawienia, w szczególności w odniesieniu do elementów dozwolonych należy pamiętać, że w przypadku Xpertis liczba takich elementów 71 72 Rozdział III. Architektura systemu jest bardzo duża (m.in. dlatego, że niektóre struktury nie są dostępne z poziomu użytkownika, nie muszą być chronione). Zestawienie elementów dozwolonych dla jednego użytkownika i standardowej konfiguracji Xpertis może mieć ponad 1000 stron!. Dlatego proces przygotowania struktur, analizy i generacji zestawienia może być długi. Najlepiej zatem wykonywać tego typu wydruki wtedy, kiedy praca nad systemem ochron w danym momencie jest zakończona a zmiany obowiązujące. Załóżmy, że firma ma wiele oddziałów, użytkownicy aplikacji łączą się z serwerem aplikacji przez sieć Internet, uwierzytelnianie odbywa się przy pomocy SmartCard. Certyfikaty wystawia zaufany urząd certyfikacji. Systemem ochron zarządza administrator w centrali firmy. Proces uaktualnienia certyfikatu i pliku *.psw mógłby przebiegać następująco: Korzystając z oprogramowania dostarczonego przez producenta karty, użytkownik w oddziale generuje na karcie klucz prywatny i żądanie certyfikacji lub, jeśli certyfikat utracił ważność, tylko żądanie ponownej certyfikacji. Żądanie certyfikacji zostaje wysyłane do urzędu certyfikacji, z którego w odpowiedzi wraca aktualny certyfikat. Użytkownik zapisuje certyfikat na karcie, usuwając uprzednio stary jeśli było to odnowienie certyfikatu. Jeśli otrzymany certyfikat jest w formacie PEM, można go od razu wysłać do centrali, w celu zaimportowania go do MacroPASSA i uaktualnienia pliku *.psw. Jeśli format pliku certyfikatu jest inny, można wyeksportować certyfikat z karty — wszystkie karty obsługiwane w MacroBASE udostępniają taką funkcjonalność. Należy w tym celu otworzyć podgląd certyfikatu i na zakładce Szczegóły wybrać Kopiuj do pliku. Dalej należy postępować według wskazówek kreatora eksportu, wybierając po drodze format X.509 szyfrowany algorytmem Base-64. Uzyskany w ten sposób plik można zaimportować do MacroPASSA, używając funkcji Zmiana certyfikatu z menu karTa w okienku użytkowników. 15 Konwersja danych W związku z ciągłym rozwojem oprogramowania i wynikającymi z niego zmianami struktur bazy jak i programów wykonawczych, nieodzowna staje się możliwość konwersji istniejącej bazy danych do nowego formatu. Można tu wyróżnić następujące rodzaje operacji: konwersja struktury danych związana z modyfikacją definicji systemu konwersja formatu danych związana z nową wersją maszyny bazy danych III.15. Konwersja danych techniczne naprawa danych i czynności pomocnicze 15.1 Konwersja struktury danych Generator zastosowań pozwala na szybkie i skuteczne dostosowanie istniejącej definicji do wymagań końcowego użytkownika. Może się to okazać konieczne podczas adaptacji standardowej wersji oprogramowania, a także wówczas, gdy pojawią się nowe potrzeby po pewnym okresie eksploatacji. Użytkownik ma prawo oczekiwać, że dane wprowadzone poprzednio będą dostępne również przy użyciu zaktualizowanej wersji definicji. Powinno to być możliwe nawet po daleko idących zmianach w schemacie bazy danych. Jest to jedno z zastosowań programu MacroTRANSFER (transfer.exe dla systemu Windows). Można przy jego pomocy dokonać, na podstawie starej i nowej definicji, aktualizacji struktury zbiorów danych łącznie z wykonaniem konwersji związanej ze zmianami typów. Możliwe są następujące zmiany formatu: REAL INTEGER, STRING DATE STRING INTEGER REAL, STRING TIME STRING STRING REAL, DATE, INTEGER, MEMO, TIME, SYS_MEMO MEMO STRING, SYS_MEMO SYS_MEMO STRING, MEMO REFERENCE typ złączeniowy. 73 74 Rozdział III. Architektura systemu Konwersja typu STRING na dowolny inny (z wyjątkiem: MEMO, SYS_MEMO) możliwa jest tylko pod warunkiem, że pole zawiera znaki dopuszczalne dla formatu, na który konwertujemy. W przeciwnym wypadku wartości pól są zerowane. Przy wykonywaniu transferu pola typu REFERENCE na typ złączeniowy, pole nie będzie zerowane, jeśli przynajmniej jedna maska słownika zapisana w nagłówku tabeli będzie zgodna z maską słownika zapisaną w nowej definicji. W przeciwnym przypadku wartości pola będą zerowane (czyli tak, jak przy zmianie typu złączeniowego). Możliwe jest wstępne uzyskanie raportu o zakresie potencjalnych zmian. Wywołanie jest następujące: MacroTRANSFER [-t] nazwa_systemu Umieszczenie opcji -t spowoduje, że nie będą dokonywane żadne zmiany w bazie danych, a na wyjściu pojawi się lista koniecznych zmian w strukturach. Program musi być uruchomiony w katalogu, w którym znajduje się zbiór z deklaracją ścieżek. Zbiory z danymi i definicją systemu będą poszukiwane w katalogach wskazanych w deklaracji ścieżek. Może istnieć konieczność zmiany istniejącego zbioru *.pth na czas transferu. Zbiór ten musi spełniać warunki: — nie może zawierać odwołań do danych poprzez serwer, czyli należy usunąć nazwę serwera wraz ze znakami | ze wszystkich wierszy rozpoczynających się od dwukropka (:), — wszystkie ścieżki do danych muszą być poprawne w systemie plików komputera, na którym jest uruchamiany program. Dodatkowo w katalogu z definicją systemu musi się znajdować nowa definicja z końcówką .new (oprócz starej z końcówką .def). Po zakończonej konwersji danych oryginalne zbiory z danymi i definicją systemu będą zachowane na dysku ze zmienionymi końcówkami na .old. Dane będą konwertowane tylko wtedy, jeśli nie będzie na dysku archiwalnych zbiorów z końcówkami .old. W przypadku błędu w trakcie działania programu MacroTRANSFER (błędny dostęp do zbioru lub brak miejsca na dysku) wszystkie zmiany w bazie są automatycznie wycofywane. Program MacroTRANSFER nie dokonuje żadnych zmian w zbiorach indeksowych. Po starcie systemu wszystkie indeksy modyfikowanych tabel będą odtwarzane. Na czas dokonywania transferu należy zatrzymać serwer bazy danych. Zmiana pliku wykorzystywanego aktualnie przez maszynę bazy danych może doprowadzić do awarii systemu. III.15. Konwersja danych Transfer danego zbioru można wykonywać wielokrotnie (pod warunkiem usuwania tworzonych plików *.old). Jeśli zbiór jest już w formacie wskazywanym przez nową definicję, pomija się transfer pliku. Jeśli w starej i w nowej definicji są tabele o różnych akronimach i jednakowych nazwach lub nazwach zgodnych (mających przynajmniej jedną maskę wspólną) i nie ma więcej tabel o zgodnej nazwie w nowej definicji, to tabele traktowane są, jako te same (zmiana akronimu tabeli). W takim przypadku złączenia do tabeli w nowym systemie będą uznane za te same, co złączenia do tabeli w starym (pola złączeniowe nie będą zerowane). W nowej definicji może występować tabela o takim samym akronimie, jak zmieniany ze starej definicji. Taka tabela będzie traktowana, jako dodana do definicji. Wszystkie zintegrowane systemy, które mają być uwzględnione w transferze, można wyszczególnić w pliku transfer.itg. Każda linia pliku musi zawierać ścieżkę dostępu do zbioru z deklaracją ścieżek zintegrowanego systemu (względnych lub bezwzględnych). Oprócz systemów wskazanych w zbiorze *.pth uwzględnione będą również te, które są wyszczególnione w pliku transfer.itg. Plik jest wyszukiwany zgodnie z deklaracją ścieżek. Przykładowa zawartość pliku transfer.itg może wyglądać nastęująco: ../f000.pth/xpertis.pth ../f001.pth/xpertis.pth ../f002.pth/xpertis.pth ../f003.pth/xpertis.pth Jeśli systemy zintegrowane maja tę samą definicję (zbiór *.def jest wspólny), to wywołanie transferu struktury jednego z nich spowoduje również transfer struktury pozostałych. Program MacroTRANSFER umożliwia również zmianę nazwy pliku z danymi (zbioru *.mdb). Po wywołaniu: MacroTRANSFER -nnazwa nowa_nazwa nazwa_systemu zostaje zmieniona nazwa tabeli oraz wszystkie powiązania w nagłówkach tabel. W czasie transferu w definicji systemu powinna być już zapisana nowa nazwa. W zbiorze z deklaracją ścieżek muszą być wpisane ścieżki do zbiorów *.pth wszystkich zintegrowanych systemów. Wtedy będą odnalezione pliki, które muszą być zmodyfikowane, ze wszystkich zintegrowanych systemów. Jeśli tabela w nowym i starym systemie (z uwzględnieniem ewentualnej zmiany akronimu tabeli) ma inną nazwę, to fakt ten będzie odnotowany w pliku *.trn. Dodatkowo, jeśli przynajmniej jeden plik ma nazwę niepasującą 75 76 Rozdział III. Architektura systemu do nazwy tabeli w nowej definicji, to zostanie wypisana informacja o wymaganym transferze zmieniającym nazwy plików (transfer -n). Po akronimie tabeli z nowej definicji pojawi się lista niedostępnych zbiorów *.mdb. Dla nich konieczne jest wykonanie transferu zmieniającego nazwy tak, aby pasowały do maski tabeli w nowej definicji. Transfer służący do zmiany nazw plików ma możliwość zmiany nazw wielu zbiorów jednocześnie. Można to osiągnąć poprzez podanie masek zbiorów do zamiany lub umieszczeniu listy zbiorów do zmiany w pliku. Skorzystanie z pliku może być przydatne przy jednoczesnej zmianie nazw kilku powiązanych ze sobą tabel (w takim przypadku transfer pojedynczego pliku może się nie udać, jeśli drugi zmieniany plik będzie niedostępny w definicji systemu). Wywołanie może mieć postać: MacroTRANSFER -n maska maska_def system gdzie: maska może zawierać znaki zapytania. Przenazywane będą wszystkie zbiory pasujące do maski, znalezione zgodnie z deklaracją ścieżek, maska_def musi zawierać tyle samo znaków zapytania co maska. Dodatkowo maska_def musi się dopasować do nazwy tabeli w systemie system. Nazwa się dopasowuje, jeśli dla każdego znaku zapytania z maska_def na tej samej pozycji jest znak zapytania w nazwie tabeli oraz dla każdego stałego znaku z nazwy tabeli na tej samej pozycji w maska_def jest ten sam znak. Dla przykładu, jeśli w systemie system jest tabela o nazwie dane????, to wtedy poniższe wywołanie jest prawidłowe: MacroTRANSFER -n d07?? dane08?? system gdyż każdy zbiór pasujący do maski dane08?? pasuje do dane???? oraz d07?? ma tyle samo znaków zapytania co dane08??. Każdy zbiór, który dopasowuje się do maski maska będzie zamieniany na maska_def z zamienionymi kolejnymi znakami zapytania na znaki z nazwy zbioru, które są na kolejnych wystąpieniach znaków zapytania w nazwa. Transfer nie dojdzie do skutku, jeśli już istnieje plik o nazwie na jaką miałby być zapisany jeden ze zbiorów pasujących do maska. Podobnie transfer zostanie przerwany, jeśli jeden ze zbiorów ma inną strukturę niż tabela do której III.15. Konwersja danych nazwy dopasowała się maska_def. Jeśli żaden zbiór nie pasuje do maska, to zostanie wypisane ostrzeżenie o braków zbiorów. Możliwe jest wykonanie kilku zmian nazw naraz. Wtedy wywołanie ma postać: MacroTRANSFER -n plik system gdzie plik o nazwie plik będzie wyszukiwany zgodnie z deklaracją ścieżek (*.pth), zaś kolejne wiersze mają postać: maska maska_def Znaczenie maska i maska_def jest identyczne jak dla wywołania w linii komend. W tym przypadku transfer może nie dojść do skutku jeśli: — dla jednego z wierszy, jeden z plików zmieniałby nazwę na już istniejącą na dysku, — nazwa jednego pliku dopasowuje się do maski maska w różnych liniach, ale miałaby być zmieniana na dwie różne nazwy, — dwa pliki zmieniałyby nazwę na tę samą (możliwe przy dwóch liniach w pliku dotyczących tej samej tabeli). Dla każdej linii w pliku, dla której nie dopasował się żaden plik do maski maska, będzie wypisane ostrzeżenie. W wyniku transferu zmieniającego nazwę pliku, nowy plik powstaje w katalogu wskazanym przez plik z deklaracją ścieżek. Program MacroTRANSFER (transfer.exe) można uruchamiać w trybie wsadowym. Opcja -b powoduje, że na wszystkie pytania pochodzące z programu, będzie automatycznie udzielana odpowiedź umożliwiająca kontynuowanie transferu. 15.2 Konwersja formatu danych Aby możliwe było uruchomienie z bieżącą wersją programów, bazy danych pracującej do tej pory z wersjami 5.xx i 6.xx konieczne jest przekonwertowanie bazy do wymaganego, nowego formatu. Oprócz programu MacroTRANSFER, potrzebny jest do tego celu plik z formułami wykorzystywany w trakcie jego trwania. Dla każdego pola złączeniowego do tabeli maskowanej trzeba napisać formułę o nazwie: \TABELA.POLE 77 78 Rozdział III. Architektura systemu gdzie TABELA zamieniamy na akronim tabeli z której pochodzi, a POLE — na akronim pola. Wynikiem takiej formuły musi być nazwa zbioru maskowanego, do którego odnosi się złączenie. Formuła będzie wykonana dla każdego rekordu zawierającego niezerową wartość w polu. W treści formuły można odwoływać się do wartości pól rekordu (bez prefiksowania nazwą tabeli). Odwołania do innych tabel (w szczególności podczytanie złączeń) są zabronione. Dostępne są dwa argumenty. Pierwszy zawiera proponowaną nazwę maski. Jeśli przetwarzana tabela i tabela do której jest złączenie są maskowane i mają taką samą liczbę znaków zapytania w masce, to zwracana jest maska słownika z zamienionymi znakami zapytania na te same znaki, co w bieżącym zbiorze. W przeciwnym przypadku zwracany jest pusty ciąg znaków. Drugim argumentem jest nazwa przetwarzanej tabeli. Wynikiem zwracanym przez formułę może też być nazwa pliku z końcówką .ref. W takim przypadku nazwa pliku maskowanego będzie pobierana z wskazanego pliku. Plik poszukiwany jest zgodnie z deklaracją ścieżek. Każdy wiersz pliku musi zawierać dwie wartości oddzielone przecinkiem. Pierwsza to numer rekordu, drugi to nazwa zbioru maskowanego, do którego jest złączenie. Fragment takiego pliku może wyglądać: 234,dokum_01 235,dokum_02 237,dokum_01 Wszystkie powyższe formuły należy zapisać w jednym pliku z rozszerzeniem .fml, umieszczonym zgodnie z deklaracją ścieżek. W celu wykonania transferu należy wywołać: MacroTRANSFER -5671form syst gdzie form zastępujemy przez nazwę pliku z formułami (bez wpisywania rozszerzenia .fml), zaś syst — nazwą systemu. Jeśli w danych które transferujemy, wystąpią złączenia do nieistniejących rekordów, pojawi się pytanie o usunięcie wszystkich błędnych złączeń. Odpowiedź twierdząca spowoduje, że w przeniesionym systemie wszystkie odwołania do nieistniejących rekordów będą wyzerowane. Lista wszystkich zmian będzie dostępna w pliku *.trc. Odpowiedź negatywna spowoduje przerwanie działania programu i anulowanie wszystkich zmian. Transfer -5671 można wykonywać wielokrotnie dla tych samych zbiorów — jeśli zbiór jest już w nowym formacie, to pozostanie bez zmian. Modyfikacjom mogą jednak ulec wartości liczników i nagłówek pliku. III.15. Konwersja danych Po zakończeniu transferu danych do nowej wersji, w pliku z rozszerzeniem .tr7 będą zapisane powiązania tabel ze słownikami maskowanymi — wartości zwracane przez formułę wykorzystywaną przy transferze. 15.3 Naprawa danych Jeśli dane uległy uszkodzeniu (np. pojawił się komunikat mówiący o błędnej wartości licznika lub plik z danymi uległ uszkodzeniu), to można próbować naprawić dane wywołując program MacroTRANSFER z opcją -c i nazwą systemu jako argumentem. Powoduje on obliczenie wartości liczników i wyzerowanie wartości pól złączeniowych do nieistniejących rekordów i zbiorów. Jeśli system jest zintegrowany, to w deklaracji ścieżek trzeba uwzględnić dostęp do wszystkich zbiorów *.pth zintegrowanych systemów. Jeśli w trakcie transferu program nie będzie mógł znaleźć zbioru z danymi słownika (o danej nazwie i sygnaturze), to pojawi się pytanie o usunięcie powiązania między zbiorami. Po wybraniu Nie, wszystkie zmiany zostaną anulowane. Należy wtedy sprawdzić, czy w deklaracji ścieżek została umieszczona ścieżka dostępu do zbioru *.pth systemu, z którego pochodzi słownik. Drugą przyczyną powstania powyższego błędu może być usunięcie pliku tabeli słownika lub zastąpienie go zbiorem o takiej samej nazwie, powstałym w innym systemie (z inną sygnaturą). W przypadku, gdy nie możemy odtworzyć właściwego zbioru słownika, można odpowiedzieć podczas transferu Tak. Wtedy straci się powiązania pomiędzy zbiorem, a słownikiem, ale będziemy mogli uruchomić system. Po transferze, w pliku z rozszerzeniem .trc będzie zawarta lista zerowanych złączeń oraz zmienianych wartości liczników. Działanie transferu naprawczego składa się z następujących czynności, wykonywanych dla każdego zbioru: 1. pobranie z nagłówka słownika listy zbiorów *.mdb, które z niego korzystają. Zbiory są wyszukiwane według *.pth. Jeśli nie zostaną znalezione (nie ma takiej nazwy lub jest, ale z inną sygnaturą), to są wyszukiwane według *.pth innych systemów, 2. odtworzenie liczników na podstawie pobranych zbiorów, 3. nadanie nowej sygnatury (zostanie również zapisana we wszystkich powiązanych zbiorach), Dodatkowo dostępna jest opcja -cl oznaczająca zwykły transfer z opcją -c z dodatkową naprawą błędnych danych (zbiory o nieprawidłowych długo- 79 80 Rozdział III. Architektura systemu ściach są powiększane zerowymi wartościami tak, aby miały poprawną długość). Podczas transferu naprawczego usuwane są wszystkie zbiory *.ndx oraz *.del umieszczone w katalogu z danymi (zbiorami *.mdb). Od wersji 11.20 wszystkie zbiory indeksowe przechowywane są w podkatalogu ind. Zwróćmy uwagę, że po transferze naprawczym zbiory zmieniają sygnatury, czyli są niezgodne z żadnymi wcześniej zapisanymi w archiwum. Oznacza to, że po wykonaniu transferu należy stworzyć nową kopię archiwalną. W związku z wprowadzeniem od wersji 12.10 standardu Unicode i zwiazanej z tym zmiany formatu zbiorów z danymi (plików *.mdb), MacroTRANSFER z opcją -c oprócz naprawy danych może posłuzyć do niezbędnej konwersji danych z poprzednich wersji systemu na bieżacą. 15.4 Weryfikacja pliku macro.use Wywołując MacroTRANSFER z opcją -m można zweryfikować, czy wszystkie potrzebne procedury są zdefiniowane w pliku macro.use. Na standardowe wyjście będą wypisane brakujące wpisy. Przykładowe wywołanie: MacroTRANSFER -m system > macro.use 16 Porównanie definicji systemów Pomocny przy wprowadzaniu zmian i aktualizacji systemów może być program compdef.exe służący do porównywania definicji. Jest on dostarczany ze wszystkimi pozostałymi programami wykonawczymi i korzysta z tych samych wspólnych zbiorów *.dll. Można nim porównywać definicje systemów ze wszystkich wersji, które są obsługiwane przez system. Działanie programu polega na wypisaniu zmian pomiędzy dwoma wersjami tego samego systemu. Każda różnica — usunięcie, dodanie lub zmodyfikowanie elementu będzie rejestrowana w pliku wynikowym. W przypadku dodania lub usunięcia, elementy zagnieżdżone nie są uwzględnione w raporcie. Wywołanie programu ma postać: compdef.exe [-l[separator]] [-u] nazwa_systemu W katalogu wywołania muszą znajdować się porównywane definicje systemu – jedna z końcówką .def, druga z końcówką .new. Wynik porównania będzie dostępny jako plik tekstowy, wypisywany na standardowe wyjście programu. Oprócz standardowego wyjścia, program compdef.exe tworzy zgodnie III.16. Porównanie definicji systemów z deklaracją ścieżek (*.pth) plik o nazwie systemu z rozszerzeniem *.mcd z całą zawartością wypisywaną na konsolę. Plik kodowany jest w standardzie UTF-8. Opis każdej z różnic rozpoczyna się w nowym wierszu znakiem # z następującym po nim kodem różnicy. Dalej dostępne będzie wskazanie elementu w systemie. Następnie w przypadku usunięcia i modyfikacji znaki <- i stara wartości elementu. Potem, dla dodania i modyfikacji, znaki -> i nowa wartość. Wszystkie opisane wartości wypisywane są domyślnie w oddzielnych wierszach. Użycie opcji -l powoduje, że będą umieszczone w jednym wierszu, oddzielane znakiem tabulacji. Można ustalić inny znak separujący, podając go przy wywołaniu bezpośrednio po opcji -l. Z kolei parametr -u powoduje, że w wyniku nie pojawiają się informacje o zmianach położenia i rozmiaru okienek, zmianach położenia i kolejności pól w okienku oraz o zmianie kolejności pól w tabeli. Kod składa się z napisu zakończonego znakiem: - (minus) --- usunięcie + (plus) --- dodanie ! (wykrzyknik) --- modyfikacja Pozostałe litery w kodzie określają następujące elementy: S system, SS ochrona systemu, SN nazwisko wpisane w okienku generowania, SI imię wpisane w okienku generowania, SD opis systemu, SF SB formułę startowa, podsystem, SBF formułę startową podsystemu, SBK opis podsystemu, SBM menu przypisane do podsystemu, T tabelę, 81 82 Rozdział III. Architektura systemu TA zmiana akronimu tabeli, TSI nazwę indeksu z przypisania tabeli do systemu, TSW akronim okienka wertowania z przypisania do systemu, TSR akronim okienka redagowania z przypisania do systemu, TSZ akronim okienka wzorca z przypisania do systemu, TSS akronim okienka złączenia z przypisania do systemu, TSC szyfrowanie tabeli, TSL dziennik systemu, TTAB formułę triggera add() przed, TTABK komentarz triggera add() przed, TTAA formułę triggera add() po, TTAAK komentarz triggera add() po, TTPB formułę triggera put() przed, TTPBK komentarz triggera put() przed, TTPA formułę triggera put() po, TTPAK komentarz triggera put() po, TTDB formułę triggera del() przed, III.16. Porównanie definicji systemów TTDBK komentarz triggera del() przed, TTDA formułę triggera del() po, TTDAK komentarz triggera del() po, TTMB formułę triggera memo_put() przed, TTMBK komentarz triggera memo_put() przed, TTMA formułę triggera memo_put() po, TTMAK komentarz triggera memo_put() po, TP pole tabeli, TPN nazwę pola tabeli, TPT typ pola, TPL długość pola, TPK komentarz pola tabeli, TPW formułę Wzorzec dla pola, TPB formułę Wartość początkowa, TPC znacznik Kolumny z przypisania do systemu TPD formułę Przed Wyświetleniem, TPE formułę Przed redagowaniem, 83 84 Rozdział III. Architektura systemu TPF formułę Klawisz F3, TPA formułę Po redagowaniu, TPG formułę Format redagowania, TPH formułę Format wyświetlania, TI indeks tabeli, TIA akronim indeksu tabeli, TIU zaznaczenie jako unikalny, TIH zaznaczenie jako ukryty, TID znacznik Drzewo w opisie indeksu, TIT tekst do menu, TIP pole indeksu, TIPZ złączenie pola indeksu, TIPK kolejność względem pola, TR okienko redagowania tabeli, TRT tytuł okienka redagowania, TRA zaznaczenie jako automatyczne, TRK komentarz okienka redagowania tabeli, TRX współrzędną X położenia okienka, III.16. Porównanie definicji systemów TRY współrzędną Y, TRW szerokość okienka, TRH wysokość okienka, TRM znacznik wyrównania dla okienka redagowania, TRC wyrównanie przycisków, TRM dopasowanie szerokości okna do tytułu, TRP pole w okienku, TRPN wyświetlaną etykietę pola, TRPR pole w złączeniu, TRPI indeks wyszukiwania pola w złączeniu, TRPL szerokość pola, TRPD precyzja (Dł.) TRPE zaznaczenie jako modyfikowalne, TRPW wyrównanie etykiet, TRPP podpowiedź, TRPK rodzaj pola, TRPX współrzędną X etykiety pola, TRPY współrzędną Y etykiety pola, 85 86 Rozdział III. Architektura systemu TRPZ współrzędną X zawartości pola, TRPV współrzędną Y zawartości pola, TRPM wyrównanie wpisane dla okienka redagowania, TRPT nazwa zakładki, TRPC ikona zakładki okna redagowania, TRPB znacznik filtra dla pola okienka redagowania tabeli, TRPS znacznik Dołączanie dla pola okienka redagowania tabeli, TRPO rozszerzone edytowanie pola typu memo tabeli, TRPBB przycisków pola okna redagowania tabeli, TRPBBI ikona, TRPBBN pozycja, TRPBBT tytuł, TRPBBP podpowiedź, TRPBBF formuła, TRBB przycisk okienka redagowania tabeli, TRBS rozmiar sekcji z przyciskami, TRBBT tytuł, TRBBI ikona, III.16. Porównanie definicji systemów TRBBP podpowiedź, TRBBF formuła, TRBBX położenie X, TRBBY położenie Y, TRBBW szerokość, TRBBC wyrównanie, TRBBK wybór klawisza, TRBBD domyślny, TRBBN pozycja, TRB kody związane z panelami przycisków w okienkach redagowania TRBL rozmiar lewego panelu z przyciskami, TRBR rozmiar prawego panelu z przyciskami, TRBT rozmiar górnego panelu z przyciskami, TRBS rozmiar dolnego panelu z przyciskami, TWBBL panel, na którym znajduje się przycisk, TWBBZ dorównanie przycisku w panelu, TW okienko wertowania tabeli, TWT tytuł okienka wertowania, 87 88 Rozdział III. Architektura systemu TWI obsługę indeksów tymczasowych (Ndx.), TWN tekst dla wybierania, TWB znacznik Filtr dla okna wertowania, TWC znacznik Odśw. dla okna wertowania, TWD znacznik Zaznacz war. dla okna wertowania, TWE znacznik Kopiowanie dla okna wertowania, TWK komentarz okienka wertowania, TWM znacznik wyrównania okienka wertowania, TWX współrzędną X położenia okienka, TWY współrzędną Y, TWW szerokość okienka, TWH wysokość okienka, TWS wysokość części wertowania, TWR znacznik Drzewo dla okna wertowania, TWP pole okienka, TWPN wyświetlaną etykietę pola, TWPR pole w złączeniu, III.16. Porównanie definicji systemów TWPB znacznik filtra dla pola okienka wertowania, TWPI indeks wyszukiwania pola w złączeniu, TWPL szerokość pola, TWPD precyzja (Dł.) TWPE zaznaczenie jako modyfikowalne, TWPW wyrównanie etykiet, TWPP podpowiedź, TWPK rodzaj pola, TWPF zaznaczenie jako wolne, TWPX współrzędną X etykiety pola, TWPY współrzędną Y etykiety pola, TWPZ współrzędną X zawartości pola, TWPV współrzędną Y zawartości pola, TWPM wyrównanie wpisane dla okienka wertowania, TWPA szerokość kolumny zależna od etykiety, TWPS sposób dodawania do słownika, TWPO rozszerzone edytowanie pola typu MEMO tabeli, TWA akcję okienka wertowania, TWAC rodzaj akcji, 89 90 Rozdział III. Architektura systemu TWAN nazwę akcji, TWAN nazwę akcji, TWAE ikona akcji niepustej dziedziny, TWAB formułę Przed akcją, TWAA formułę Po akcji, TWAD zaznaczenie jako domyślna, TWAG akcja grupowa, TWAI formuła Przed akcją dla akcji grupowej, TWAJ formuła Po akcji dla akcji grupowej, TWBB przycisk okienka wertowania tabeli, TWBS rozmiar sekcji z przyciskami, TWBBT tytuł, TWBBI ikona, TWBBP podpowiedź, TWBBA akcja, TWBBFB formuła Przed, TWBBFA formuła Po, TWBBFD formuła Grupa przed, III.16. Porównanie definicji systemów TWBBFC formuła Grupa po, TWBBM dziedzina, TWBBW szerokość, TWBBG grupy, TWBBC wyrównanie, TWBBX położenie X, TWBBY położenie Y, TWBBK klawisz, TWBBU wybór z menu (ścieżka do akcji), TWBBD domyślny (znacznik wyróżnienia przycisku), TWBBN pozycja, TWB kody związane z panelami przycisków w okienkach wertowania, TWBL rozmiar lewego panelu z przyciskami, TWBS rozmiar prawego panelu z przyciskami, TWBT rozmiar górnego panelu z przyciskami, TWBX rozmiar dolnego panelu z przyciskami, TWBBL panel, na którym znajduje się przycisk, TWBBZ dorównanie przycisku w panelu, TG okienko grupowe, 91 92 Rozdział III. Architektura systemu TGH wysokość okienka, TGI formułę Wypełnienie, TGK komentarz okienka grupowego, TGT tytuł okienka, TGW szerokość okienka, TGX współrzędną X położenia okienka, TGY współrzędną Y położenia okienka, TGE element okienka grupowego, TGZ formułę Zamykanie, TGR formułę Odświeżanie, TGEO formułę Po odświeżeniu, TGEU formułę przed lub po obsłudze okienka w grupie, TGET zakładkę, na której umieszczony element okienka, TGEI ikona zakładki okna grupowego, TGEX współrzędną X położenia elementu okienka, TGEY współrzędną Y położenia elementu okienka, TGEH wysokość elementu okna grupowego, TGEW szerokość elementu okna grupowego, III.16. Porównanie definicji systemów TGEA aktywowanie okienka po zmianie zakładki, TGEP umieszczenie okienka w części stałej, TGEM tryb wyświetlania okna składowego, TGEN identyfikator dodawanego panelu, TGEZ sposób ułożenia panelu, TGED identyfikator panelu, który ma być dzielony, TK komentarz tabeli, Z zmienną, ZA zmiana akronimu zmiennej, ZSR akronim okienka redagowania z przypisania do systemu, ZP pole zmiennej, ZPN nazwę pola zmiennej, ZPT typ pola, ZPL długość pola, ZPK komentarz pola zmiennej, ZPW formułę Wzorzec dla pola, ZPB formułę Wartość początkowa, ZPD formułę Przed Wyświetleniem, 93 94 Rozdział III. Architektura systemu ZPE formułę Przed redagowaniem, ZPF formułę Klawisz F3, ZPA formułę Po redagowaniu, ZPG formułę Format redagowania zmiennej strukturalnej, ZPH formułę Format wyświetlaniazmiennej strukturalnej, ZR okienko redagowania zmiennej, ZRT tytuł okienka redagowania, ZRK komentarz okienka redagowania zmiennej, ZRA zaznaczenie jako automatyczne, ZRX współrzędną X położenia okienka, ZRY współrzędną Y, ZRW szerokość okienka, ZRH wysokość okienka, ZRM znacznik wyrównania dla okienka redagowania zmiennej, ZRBB przycisk okna redagowania zmiennej, ZRBS rozmiar sekcji z przyciskami, ZRBBT tytuł, ZRBBI ikona, III.16. Porównanie definicji systemów ZRBBP podpowiedź, ZRBBF formuła, ZRBBX położenie X, ZRBBY położenie Y, ZRBBW szerokość, ZRBBC wyrównanie, ZRBBK wybór klawisza, ZRBBD domyślny, ZRBBN pozycja, ZRP pole w okienku, ZRPN wyświetlaną etykietę pola, ZRPR pole w złączeniu, ZRPB znacznik Filtr pola okienka redagowania zmiennej, ZRPI indeks wyszukiwania pola w złączeniu, ZRPL szerokość pola, ZRPD precyzja (Dł.) ZRPE zaznaczenie jako modyfikowalne, ZRPW wyrównanie etykiet, 95 96 Rozdział III. Architektura systemu ZRPP podpowiedź, ZRPK rodzaj pola, ZRPX współrzędną X etykiety pola, ZRPY współrzędną Y etykiety pola, ZRPZ współrzędną X zawartości pola, ZRPV współrzędną Y zawartości pola, ZRPM wyrównanie wpisane dla okienka redagowania, ZRPT nazwa zakładki, ZRPS znacznik Dołączanie dla pola okienka redagowania zmiennej, ZRPO rozszerzone edytowanie pola typu MEMO zmiennej, ZRPBB przycisk pola okna redagowania zmiennej, ZRPBBI ikona, ZRPBBN pozycja, ZRPBBT tytuł, ZRPBBP podpowiedź, ZRPBBF formuła, panele przycisków w okienkach redagowaniach zmiennych, ZRBL rozmiar lewego panelu z przyciskami, III.16. Porównanie definicji systemów ZRBR rozmiar prawego panelu z przyciskami, ZRBT rozmiar górnego panelu z przyciskami, ZRBS rozmiar dolnego panelu z przyciskami, ZWBBL panel, na którym znajduje się przycisk, ZWBBZ dorównanie przycisku w panelu, ZWBBZ dorównanie przycisku w panelu, ZK komentarz zmiennej, M menu, MK komentarz menu, MP pozycję menu, MPI ikona pozycji menu, MPP podpowiedź do pozycji menu, MPF przypisana formułę do pozycji menu, F formułę, FT treść formuły. Przykładowo, jeśli dodamy pole do tabeli z przypisaną formułą Przed redagowaniem i umieścimy je w okienku wertowania, to otrzymamy w wyniku informację o dodaniu pola (bez informacji o przypisanej formule), zmianie szerokości okienka wertowania i dodaniu pola do okienka: # TP+ Tabela: a [A] 97 98 Rozdział III. Architektura systemu Pole: POLE Pozycja -> 2 # TWW! Tabela: a [A] Okienko wertowania: A Szerokość <22 -> 43 # TWP+ Tabela: a [A] Okienko wertowania: A Pole: A.POLE Pozycja -> 2 Wykorzystując opcję -l; otrzymamy te same informacje w bardziej zwięzłej formie. Każda różnica będzie zapisana w jednym wierszu. Powyższy przykład wyglądałby następująco: # TP+;Tabela: a [A];Pole: POLE;Pozycja;->;2 ; # TWW!;Tabela: a [A];Okienko wertowania: A; Szerokość;<-;22 ;->;43 ; # TWP+;Tabela: a [A];Okienko wertowania: A; Pole: A.POLE;Pozycja;->;2 ; 17 Pisanie do portów zdalnych komputerów MacroDEVICE umożliwia wysyłanie i pobieranie znaków z urządzeń przyłączonych do portów komputerów dostępnych w sieci z protokołem TCP/IP, na których program MacroDEVICE (dostarczany z pakietem MacroBASE) został uruchomiony. Pośredniczy on w komunikacji pomiędzy serwerem aplikacji, działającym na odległym komputerze, a urządzeniem podłączonym do portu szeregowego lub równoległego. III.17. Pisanie do portów zdalnych komputerów Przy uruchomieniu programu MacroDEVICE można podać następujące parametry: -p numer numer portu, poprzez który będą odbierane zgłoszenia. Domyślną wartością (w przypadku pominięcia argumentu) jest 5777 -n nazwa nazwa którą trzeba będzie podać przy odwołaniu się do portu komputera w funkcji fopen. W przypadku pominięcia parametru, program sam wygeneruje nazwę (będzie ona wypisana na ekranie w wersji linuxowej i dostępna w okienku w wersji windowsowej). Nazwa nie może przekraczać 31 znaków -t czas maksymalna liczba minut, która może upłynąć od ostatniego dostępu do urządzenia. Po tym czasie, połączenie zostaje zamykane. Domyślną wartością jest 20 -l plik nazwa pliku, w którym będą zapisywane komunikaty o błędach w działaniu MacroDEVICE. Pominięcie argumentu oznacza, że plik nie będzie tworzony. Przykładowe wywołanie w systemie Windows: mdevice.exe -n drukarka oznacza, że dostęp do urządzeń będzie poprzez nazwę drukarka, komunikacja odbywać będzie się poprzez port 5777 i nie będzie tworzony plik z rejestrowanymi błędami. Do tak zdefiniowanego urządzenia odwołujemy się za pomocą funkcji fopen. Jeśli w pierwszym parametrze, bezpośrednio przed nazwą, podamy specjalny adres komputera z uruchomionym programem MacroDEVICE, to wszystkie polecenia pisania i czytania będą się odnosić do urządzenia na tym właśnie komputerze. Adres ma następującą postać: |nazwa@adres_ip:port_nasłuchu| gdzie: — nazwa — nadana nazwa przy uruchomieniu MacroDEVICE (parametr -n) 99 100 Rozdział III. Architektura systemu — adres_ip — adres komputera, na którym działa MacroDEVICE, — port_nasłuchu — numer portu podany przy uruchomieniu MacroDEVICE (parametr -p). Część po dwukropku można pominąć — będzie wtedy przyjęty domyślny port — 5777. Przykładowe wywołanie może mieć postać: fopen(’|[email protected]|com2:’, ’d’) Po przyciśnięciu prawego przycisku myszy na ikonce programu, dostępne będą aktualne ustawienia programu oraz przycisk Zakończ umożliwiający zakończenie udostępniania portów w komputerze. W wersji linuxowej zakończenie działania programu MacroDEVICE nastąpi po ponownym wywołaniu z opcją -s lub -sf. W drugim przypadku program zakończy działanie również przy aktywnych połączeniach. MacroDEVICE może obsługiwać kilku użytkowników jednocześnie pod warunkiem, że nie otwierają tych samych zasobów. 18 Praca z systemem z poziomu przeglądarki internetowej W systemie jest możliwość dostępu do danych z poziomu przeglądarki internetowej. Idea polega na uruchomieniu skryptu CGI — programu MacroCGI (w wersji dla Windows mhtmlcgi.exe) — który uruchamia system i wykonuje zadane procedury. Wyniki są zwracane poprzez stronę w formacie HTML. Uruchomienie programu MacroCGI pod Linuksem wymaga biblioteki libstdc++.so.6. W przypadku, gdy opcja WWW dla serwera nie jest dostępna, wówczas biblioteka nie jest wymagana. Aby umożliwić dostęp do danych przez przeglądarkę internetową należy: 1. przekopiować zbiór mhtmlcgi.exe (lub MacroCGI dla wersji linuxowej) do katalogu, z którego mogą być wykonywane skrypty CGI, 2. utworzyć plik o nazwie macrocgi.ini, definiujący które pliki mogą być wykorzystane jako szablony. Plik macrocgi.ini jest wyszukiwany według deklaracji ścieżek (*.pth). System nie posiadający pliku deklaracji ścieżek (*.pth) nie może być udostępniany przez MacroCGI. 3. uruchomić serwer bazy danych, III.18. Praca z systemem z poziomu przeglądarki internetowej 4. udostępnić stronę, z której uruchamiany będzie program MacroCGI. Do programu MacroCGI powinny być przekazane następujące zmienne: SYSTEM_NAME nazwa systemu, SYSTEM_PATH ścieżka dostępu do katalogu z plikiem *.pth, HTML_TEMPLATE ścieżka do pliku z szablonem strony, HTML_TEMPLATE_PTH nazwa pliku z szablonem strony. Plik będzie wyszukiwany zgodnie z deklaracją ścieżek. Po wywołaniu skryptu interpretowany jest wskazany szablon i na jego podstawie powstaje strona wynikowa. Tekst z szablonu kopiowany jest do strony wynikowej. Dodatkowo interpretowane są następujące konstrukcje: {FSTR: formuła} spowoduje wykonanie formuły w systemie. Jej wynik będzie wpisywany na stronę. Jeśli chcemy w obrębie danej formuły wypisać więcej niż jedną linię, możemy posłużyć się funkcją h_echo. Argumentem funkcji powinien być tekst, który ma być wypisany na stronie wynikowej. Funkcja ta jest szczególnie wygodna, gdy chcemy korzystać z formuł zapisanych w zewnętrznych plikach *.fml. {FREPORT: nazwa} wykona sprawozdanie o nazwie przekazanej poprzez argument nazwa. Konstrukcja będzie zastąpiona wynikiem sprawozdania — samym tekstem, bez uwzględnienia zmiany czcionki, odstępu międzywierszowego i podziału na strony. Ze względu na to, że sprawozdania są przygotowywane zawsze czcionką nieproporcjonalną, to warto powyższą konstrukcję ująć pomiędzy znaczniki wymuszające pismo maszynowe: <PRE> {FREPORT: ’ceny’} </PRE> konstrukcja iteracyjna pozwalająca na wypisanie serii fragmentów strony. Pętla przyjmuje postać: 101 102 Rozdział III. Architektura systemu {FLOOP: war_pocz--war_nast--wyk} ........ {/FLOOP} gdzie — war_pocz — warunek początkowy pętli, — war_nast — warunek kolejnego obrotu, — wyk — czy wykonać (wypisać) ciało pętli dla bieżącego obrotu. Cała konstrukcja jest zamieniana na tekst wypisywany w jej wnętrzu, stosowną liczbę razy. Konstrukcje iteracyjne mogą być zagnieżdżone. Konstrukcja iteracyjna może być stosowana jako konstrukcja warunkowa jeżeli ustali się drugi argument na 0, trzeci na 1: {FLOOP:warunek--0--1} ......... {/FLOOP} Poniżej przedstawiony jest przykład konstrukcji zwracającej tabelkę z wartościami pól tabeli: <TABLE border="1"> {FLOOP: TAB.prefix(SLO.ref); TAB.first--TAB.next--1} <TR> <TD>{FSTR: TAB.POLE1}</TD> <TD>{FSTR: TAB.POLE2}</TD> </TR> {/FLOOP} </TABLE> Jak wcześniej wspomniano, koniecznie trzeba przekazać do skryptu parametry mówiące o systemie i szablonie. Można również zdefiniować dodatkowe wartości. Po zatwierdzeniu strony: <HTML><HEAD> <TITLE>Baza danych</TITLE> </HEAD> III.18. Praca z systemem z poziomu przeglądarki internetowej <BODY> <H1>Szukanie w bazie</H1> <FORM ACTION="/cgi-bin/MHTMLCGI.EXE" METHOD=POST> <INPUT TYPE="text" NAME="Wzorzec"> <INPUT TYPE=SUBMIT NAME="Ok" VALUE="Szukaj"> <INPUT TYPE=HIDDEN NAME="SYSTEM_PATH" VALUE="c:/fiks"> <INPUT TYPE=HIDDEN NAME="SYSTEM_NAME" VALUE="fiks"> <INPUT TYPE=HIDDEN NAME="HTML_TEMPLATE" VALUE="szukaj.html"> </FORM> </BODY> do skryptu będą przekazane wszystkie zdefiniowane w formularzu zmienne. W szczególności będzie dostępna wartość zredagowana przez użytkownika w polu Wzorzec. Przed interpretowaniem szablonu deklarowana jest klasa o nazwie HTML_OBJ. Klasa zawiera pola o nazwach takich jak nazwy zmiennych przekazywanych do skryptu. Nazwy są skracane do 8 znaków, jeśli są dłuższe. Potem wykonywana jest formuła startowa systemu (z pominięciem funkcji zawierających konwersację — np. menu). Po zakończeniu wykonywania formuły startowej interpretowany jest szablon. Do programu MacroCGI można przekazać do 16383 argumentów (klasa HTML_OBJ może mieć maksymalnie tyle pól po zwiększeniu liczby argumentów w funkcji obj_decl). Zmienne, które pokrywają się na pierwszych 8 znakach ze wcześniej zdefiniowanymi, są ignorowane. W pierwszej kolejności rozpatrywane są zmienne: SYSTEM_PATH, SYSTEM_NAME, PARAMS, HTM_TEMPLATE_PTH, HTML_TEMPLATE. Dalsze w kolejności wystąpienia na liście argumentów. Poniżej przedstawiony jest przykład odwołania się do zmiennych w szablonie: <H1>Wynik szukania</H1> <HR> {FSTR: HTML:=obj_new(@.CLASS.HTML_OBJ); ’’} {FSTR: SLO.find_key(-HTML.Wzorzec); {? SLO.SL = HTML.Wzorzec || SLO.SL || ’Nie znaleziono: ’+-HTML.Wzorzec ?} } 103 104 Rozdział III. Architektura systemu Zwróćmy uwagę na drugi sposób uruchomienia skryptu CGI — nie poprzez formularz, tylko bezpośrednie wywołanie z parametrami. Fragment dla pola Szukaj przybierającego wartość fiks może wyglądać: <A HREF= "/cgi-bin/MHTMLCGI.EXE?Wzorzec=fiks& SYSTEM_PATH=c:\fiks& SYSTEM_NAME=fiks&HTML_TEMPLATE=szukaj.htm" >Szukaj fiks</A> Istnieje możliwość włączania fragmentów do szablonu strony poprzez jedną z dwóch konstrukcji: {FINCLUDE: ’plik’} {FINCLUDE_PTH: ’plik’} Argumentem jest wyrażenie zwracające nazwę włączanego pliku. W pierwszym przypadku plik jest wyszukiwany względem katalogu z szablonem, w drugim — względem deklaracji ścieżek. Uruchomienie programu MacroCGI (mhtmlcgi.exe) z opcją --header_html spowoduje, że na standardowe wyjście nie będzie wypisywany nagłówek. Oto przykładowa postać nagłówka: Content-type: text/html; charset=iso-8859-2 Wraz ze standardowymi bibliotekami (katalog _libfml) dołączone są przykładowe pliki sql.htm oraz _ressql.htm, pozwalające na zadawanie z poziomu przeglądarki zapytań SQL w dowolnym wybranym systemie. W efekcie otrzymujemy w przeglądarce prezentację tabeli wynikowej zapytania. 18.1 Plik macrocgi.ini Plik macrocgi.ini definiuje, które pliki mogą być wykorzystane jako szablony. Jest wyszukiwany według deklaracji ścieżek (*.pth) i może zawierać dwie sekcje: [masks] — w kolejnych wierszach sekcji podawane będą kolejne maski plików. Każdy otwierany szablon (wskazany poprzez HTML_TEMPLATE lub HTML_TEMPLATE_PTH) oraz włączany plik konstrukcją FINCLUDE lub FINCLUDE_PTH musi pasować do przynajmniej jednej podanej maski, [paths] — w kolejnych wierszach sekcji podawane będą kolejne ścieżki dostępów do katalogów. Nie dopuszcza się używania względnych ścieżek. Każdy III.18. Praca z systemem z poziomu przeglądarki internetowej szablon wskazany poprzez HTML_TEMPLATE oraz plik włączany konstrukcją FINCLUDE musi znajdować się w jednym z wymienionych katalogów. Dla szablonów otwieranych poprzez HTML_TEMPLATE_PTH oraz włączanych plików poprzez FINCLUDE_PTH sekcja nie ma żadnego znaczenia. Przykładowo, jeśli wszystkie pliki otwieranych szablonów mają końcówkę .cgi lub .htm i są umieszczone w katalogu c:\www\szablony, zaś nazwy wszystkich włączanych plików rozpoczynają się od litery m, mają końcówkę .inc i znajdują się w katalogu c:\www\szablony\include, to plik macrocgi.ini powinien mieć zawartość: [masks] *.cgi *.htm m*.inc [paths] c:\www\szablony c:\www\szablony\include Jeśli w programie wskazuje się szablony wyłącznie poprzez zmienną HTML_TEMPLATE_PTH i włącza pliki wyłącznie konstrukcją FINCLUDE_PTH, to cała sekcja [paths] może być pominięta. W tym przypadku wszystkie katalogi z szablonami będą opisane w deklaracji ścieżek (zbiorze *.pth). Dodatkowo, w nazwach plików wyszukiwanych z wykorzystaniem deklaracji ścieżek, nie można używać metaznaków (czyli znaków / \ * ? : [ ] { } ( )). Dotyczy to zmiennej HTML_TEMPLATE_PTH oraz konstrukcji FINCLUDE_PTH. 18.2 Uruchomienie z linii komend Możliwe jest również wywołanie programu MacroCGI bezpośrednio z linii komend. Zastosowanie może być dwojakie: — można sprawdzić działanie przygotowanego szablonu bez konieczności kopiowania go do katalogu wirtualnego serwera webowego, — MacroCGI może służyć jako narzędzie do eksportu zawartości bazy danych do plików tekstowych. Są dwie metody wywołania. Pierwsza polega na przygotowaniu pliku MacroCGI.cfg. Powinien on zawierać parametry niezbędne do działania 105 106 Rozdział III. Architektura systemu MacroCGI (nazwa systemu, ścieżka, nazwa szablonu) oraz ewentualne parametry przekazywane do szablonu. Plik MacroCGI.cfg należy umieścić w tym samym katalogu co MacroCGI. Następnie należy wywołać MacroCGI z parametrem -d. Wynik jest wypisywany na standardowe wyjście programu. Przykładowy eksport dla systemu bibliotecznego pól ID, TYTUŁ i AUTOR z tabeli KATAL mógłby wyglądać następująco: 1. przygotowanie pliku MacroCGI.cfg o treści: QUERY_STRING=SYSTEM_PATH="/home/macro/demo &SYSTEM_NAME=demo &HTML_TEMPLATE_PTH=export.htm" 2. przygotowanie szablonu export.htm o treści: {FSTR: _res:=KATAL.first; {! |? _res |! h_echo(KATAL.ID+’;’+KATAL.TYTUŁ+’;’+ KATAL.AUTOR+’\n’); _res:=KATAL.next !}; ’’} Plik należy umiejscowić według deklaracji ścieżek (demo.pth), 3. uruchomienie MacroCGI MacroCGI -d > wynik.txt W pliku wynik.txt powinna zostać zapisana zawartość tabeli KATAL. Drugą metodą jest zdefiniowanie dwóch zmiennych systemowych: REQUEST_METHOD na wartość GET oraz QUERY_STRING na wartość taką, jaką zpisywałoby się w pliku MacroCGI.cfg. i wywołaniu MacroCGI bez argumentów. Dla powyższego przykładu, wywołanie miałoby postać: III.18. Praca z systemem z poziomu przeglądarki internetowej REQUEST_METHOD=GET export REQUEST_METHOD QUERY_STRING=SYSTEM_PATH="/home/macro/demo &SYSTEM_NAME=demo &HTML_TEMPLATE_PTH=export.htm" export QUERY_STRING /home/macro/run/MacroCGI (przypisanie wartości do zmiennej musi być w jednej linijce — w przykładzie podzielony jest na trzy wiersze, aby zmieściło się na stronie). Dla systemu Windows proces wygląda bardzo podobnie, z tą różnicą, że odpowiednie pliki mają nazwy mhtmlcgi.exe i mhtmlcgi.cfg. Wywołanie powyższego przykładu z linii komend wyglądałoby zatem: set REQUEST_METHOD=GET set "QUERY_STRING=SYSTEM_PATH=c:\macro\demo &SYSTEM_NAME=demo &HTML_TEMPLATE_PTH=export.htm" c:\macro\xpertis\mhtmlcgi.exe 18.3 Kodowanie polskich znaków Można wpłynąć na sposób kodowania polskich znaków poprzez umieszczenie w pierwszej linii wzorca konstrukcji: {FCHARSET: szablon, html, parametry} Każdy z parametrów może przyjmować jedną z wartości określających stronę kodową: — iso-8859-2 (domyślna w przypadku pominięcia parametru), — UTF-8, — windows-1250, — mazovia. Kolejne parametry oznaczają zaś stronę kodowania: — szablonu, który piszemy, — wyjściowej strony w formacie HTML, 107 108 Rozdział III. Architektura systemu — parametrów przekazywanych do szablonu. Strona kodowa przekazywana jest w nagłówku strony, zbędne jest więc ustawianie strony kodowej konstrukcją META. Zatem, jeśli pierwsza linijka pliku z szablonem będzie miała postać: {FCHARSET: UTF-8} oznacza to, że plik jest kodowany w formacie UTF-8 (na początku może wystąpić znacznik BOM). Jeśli wyjściową stroną kodową nie jest UTF-8, to wszystkie wyprowadzane znaki spoza standardu Mazovii będą zastąpione znakami zapytania. 19 Biblioteka mbasic.dll Biblioteka mbasic.dll umożliwia zewnętrznym programom wykonanie formuły w wybranym systemie użytkowym. Poprzez mbasic.dll mogą być wywołane tylko procedury zapisane w plikach o masce mbasic??.fml. Ma to na celu zabezpieczenie przed wykonaniem dowolnej formuły przez dowolnego użytkownika, który ma konto w systemie. Do uruchamiania formuł służą funkcje ExecString oraz ExecNumber umożliwiające wywołanie poprzez exec wskazanej procedury z pliku. Pierwsza przeznaczona jest dla formuł zwracających napis (przy niezgodności typu wynikiem będzie napis pusty), druga dla formuł zwracających liczby (przy niezgodności typu wynikiem będzie 0). Do funkcji przekazywany jest jeden parametr tekstowy. W wyniku działania ExecString wypełniana jest tablica znaków reprezentująca zwrócony napis, zaś wynikiem jest numer zgłoszonego błędu w wykonywanej formule lub 0, jeśli formuła wykonała się bezbłędnie. Z kolei wynikiem ExecNumber jest liczba zmiennoprzecinkowa zwrócona przez wywołaną procedurę. W wyniku wywołania funkcji może być niejawnie wywołany program mbasic.exe, który powinien znajdować się w tym samym katalogu, co biblioteka mbasic.dll. Poniżej przedstawiona jest deklaracja funkcji udostępnianych przez bibliotekę: void _stdcall Done( void ); int _stdcall LoadSystem( const byte * pPath, const byte * pSystemName); III.19. Biblioteka mbasic.dll int _stdcall LoadSystemWithUser( const byte * pPath, const byte * pSystemName, const byte * pUsrName, const byte * pPswUsr ); int _stdcall LoadSystemCard( const byte * pPath, const byte * pSystemName ); int _stdcall LoadRemoteSystem( const byte * pLanAddr, int pPort, const byte * pGroupName, const byte * pSystemName); int _stdcall LoadRemoteSystemWithUser( const byte * pLanAddr, int pPort, const byte * pGroupName, const byte * pSystemName, const byte * pUsrName, const byte * pPswUsr); int _stdcall LoadRemoteSystemCard( const byte * pLanAddr, int pPort, const byte * pGroupName, const byte * pSystemName); int _stdcall LoadRemoteSystemSSL( const byte * pCertDerFileName, const byte * pLanAddr, int pPort, const byte * pGroupName, const byte * pSystemName); int _stdcall LoadRemoteSystemWithUserSSL( const byte * pCertDerFileName, const byte * pLanAddr, int pPort, const byte * pGroupName, const byte * pSystemName, const byte * pUsrName, const byte * pPswUsr ); int _stdcall LoadRemoteSystemSSLCard( 109 110 Rozdział III. Architektura systemu const byte * pCertDerFileName, const byte * pLanAddr, int pPort, const byte * pGroupName, const byte * pSystemName); int _stdcall ExecString( byte * pOut, unsigned len, const byte * Rule, const byte * Sufix, const byte * Param); double _stdcall ExecNumber( const byte * Rule, const byte * Sufix, const byte * Param); int _stdcall LastError(void); int _stdcall GetMsgLevel(void); int _stdcall SetMsgLevel(int); int _stdcall GetNoOfParam(); int _stdcall GetParamType(int par_no); void _stdcall GetParamString( int par_no, byte * result, unsigned buf_len); double _stdcall GetParamNum(int par_no); Znaczenia funkcji są następujące: Done zamyka system. Po wywołaniu funkcji można otworzyć kolejny, LoadSystem otwiera system z podanej ścieżki. Wynik równy 0, oznacza, że system został prawidłowo uruchomiony, LoadSystemWithUser również otwiera system z dodatkową możliwością przekazania nazwy użytkownika i hasła poprzez parametry, LoadSystemCard identyczne jak funkcji LoadSystem, z tym że domyślnym sposobem uwierzytelniania będzie karta SmartCard, III.19. Biblioteka mbasic.dll LoadRemoteSystem otwiera system poprzez serwer aplikacji. Poprzez parametr pLanAddr przekazuje się nazwę lub numer IP komputera z działającym serwerem aplikacji, pPort to numer portu, po którym odbywa się komunikacja z serwerem aplikacji, pGroupName to nazwa grupy, LoadRemoteSystemWithUser otwiera system poprzez serwer aplikacji, z dodatkową możliwością przekazania nazwy użytkownika i hasła poprzez parametry, LoadRemoteSystemCard identyczne jak funkcji LoadRemoteSystem, z tym że domyślnym sposobem uwierzytelniania będzie karta SmartCard, LoadRemoteSystemSSL otwiera system poprzez serwer aplikacji, połączenie będzie szyfrowane z wykorzystaniem protokołu SSL, LoadRemoteSystemWithUserSSL otwiera system poprzez serwer aplikacji z dodatkową możliwością przekazania nazwy użytkownika i hasła poprzez parametry, połączenie będzie szyfrowane z wykorzystaniem protokołu SSL, LoadRemoteSystemSSLCard tak jak funkcji LoadRemoteSystemSSL, z tym że domyślnym sposobem uwierzytelniania będzie karta SmartCard, ExecString wykonuje procedurę o nazwie przekazanej przez argument Rule z pliku którego końcówka nazwy podana jest w parametrze Sufix. Jeśli parametr Sufix jest pustym napisem, formuły będą wołane z pliku mbasic.fml. Do procedury można przekazać jeden parametr typu STRING argumentem param. Jeśli potrzebujemy przekazać więcej parametrów należy je połączyć w jeden napis oddzielając separatorami a następnie odpowiednio zinterpretować w formule. Wynik typu napisowego wywołanej funkcji exec, będzie umieszczany w tablicy wskazanej w pierwszym argumencie pOut. Jeśli wynik jest innego typu niż STRING, to w tablicy będzie umieszczony napis pusty. Zmienna musi być powołana w programie i mieć rozmiar w bajtach taki, jak podaje drugi argument len, 111 112 Rozdział III. Architektura systemu ExecNumber wykonuje formułę i zwraca jej wynik liczbowy. Z wyjątkiem, zbędnego w tym wypadku, argumentu pOut znaczenie pozostałych jak dla funkcji ExecString LastError zwraca numer ostatniego błędu, który wystąpił przy ostatnim wywołaniu funkcji FormulaString lub FormulaNumber. Jeśli wywołana formuła nie powodowała błędów, to funkcja zwróci wartość 0. Jeśli w formule było wywołanie funkcji errno, to na wynik funkcji mają tylko wpływ błędy, które się pojawiły po ostatnim wywołaniu errno. Jeśli zatem po wywołaniu errno nie było błędów, funkcja zwróci wartość 0, GetMsgLevel zwraca liczbę, będącą poziomem obsługi błędów ustawioną funkcją SetMsgLevel, SetMsgLevel ustawia poziom obsługi komunikatów. Dostępne są trzy wartości argumentu: 0 standardowa obsługa. Pojawiają się wszystkie komunikaty o błędach oraz dialogi pochodzące z funkcji msg, ask oraz popup, 1 zablokowane wyświetlanie komunikatów o błędach. Będą one zapisywane w pliku .log, zaś numer błędu będzie dostępny poprzez wywołanie LastError, 2 zablokowane wyświetlanie komunikatów o błędach oraz wywołania wszystkich funkcji dialogowych. Po ustawieniu tego poziomu obsługi komunikatów nie będą się pojawiały żadne komunikaty podczas wykonywania formuł. Wynikiem SetMsgLevel jest liczba oznaczająca poziom obsługi komunikatów, jaki obowiązywał przed wywołaniem funkcji, GetNoOfParam zwraca liczbę przekazywanych parametrów. Aby program zewnętrzny mógł pobrać parametry należy go wywołać z MacroBASE funkcją sys_exec. Dostęp do listy i wartości argumentów odbywa się poprzez funkcje opisane poniżej, III.19. Biblioteka mbasic.dll GetParamType zwraca typ parametru o numerze par_no. Numery argumentów liczone są od zera, zatem pierwszy argument ma numer 0. Możliwe są dwa wyniki: 1 typ NUMBER, 2 typ STRING, GetParamString pobiera parametr o numerze par_no. Wynik, który musi być typu STRING jest przekazywany poprzez drugi argument funkcji. Maksymalną długość zwracanego napisu (rozmiar zmiennej) określa trzeci argument, GetParamNum zwraca wartość argumentu liczbowego o numerze par_no. Poniżej zamieszczona jest treść modułu w języku Delphi, w którym zadeklarowane są wszystkie dostępne funkcje z biblioteki mbasic.dll: unit mbasic; interface type ChTab = array[0..1024] of char; PChTab = ˆChTab; var SBUF: ChTab; function LoadSystem( Path: PChar; System: PChar): Integer; stdcall; external ’mbasic.dll’; function LoadRemoteSystem( Addr: PChar; Port: Integer; Group: PChar; System: PChar): Integer; stdcall; external ’mbasic.dll’; function LoadSystemWithUser( 113 114 Rozdział III. Architektura systemu Path: PChar; System: PChar; User: PChar; Password: PChar): Integer; stdcall; external ’mbasic.dll’; function LoadSystemCard( Path: PChar; System: PChar): Integer; stdcall; external ’mbasic.dll’; function LoadRemoteSystemWithUser( Addr: PChar; Port: Integer; Group: PChar; System: PChar; User: PChar; Password: PChar): Integer; stdcall; external ’mbasic.dll’; function LoadRemoteSystemCard( Addr: PChar; Port: Integer; Group: PChar; System: PChar): Integer; stdcall; external ’mbasic.dll’; function LoadRemoteSystemSSL( Cert: PChar; Addr: PChar; Port: Integer; Group: PChar; System: PChar): Integer; stdcall; external ’mbasic.dll’; function LoadRemoteSystemWithUserSSL( Cert: PChar; Addr: PChar; Port: Integer; Group: PChar; System: PChar; User: PChar; Password: PChar): Integer; stdcall; external ’mbasic.dll’; function LoadRemoteSystemSSLCard( Cert: PChar; Addr: PChar; Port: Integer; Group: PChar; System: PChar): Integer; stdcall; external ’mbasic.dll’; procedure Done(); stdcall; external ’mbasic.dll’; function ExecString( Res: PChTab; len: Cardinal; Proc: PChar; Sufix: PChar; Params: PChar): Integer; III.19. Biblioteka mbasic.dll stdcall; external ’mbasic.dll’; function ExecNumber( Proc: PChar; Sufix: PChar; Params: PChar): Double; stdcall; external ’mbasic.dll’; function LastError(): Integer; stdcall; external ’mbasic.dll’; function GetMsgLevel(): Integer; stdcall; external ’mbasic.dll’; function SetMsgLevel(Level: Integer): Integer; stdcall; external ’mbasic.dll’; function GetNoOfParam(): Integer; stdcall; external ’mbasic.dll’; function GetParamType(Param: Integer): Integer; stdcall; external ’mbasic.dll’; function GetParamNum(Param: Integer): Double; stdcall; external ’mbasic.dll’; procedure GetParamString(Param: Integer; Res: PChTab; len: Cardinal); stdcall; external ’mbasic.dll’; implementation end. Jeśli zadeklarujemy użycie modułu, wtedy można będzie korzystać z funkcji biblioteki. Dla przykładu wywołanie poniższego fragmentu uruchomi system kali z grupy Xpertis, na komputerze o nazwie macro, komunikując się przez domyślny port, czyli 5580, rejestrując się na użytkownika szef z hasłem szef. Następnie wykonana zostanie procedura proc z pliku mbasic01.fml, zaś wynik, czyli ciąg znaków zakończony znakiem o kodzie zero, będzie zapi- 115 116 Rozdział III. Architektura systemu sany w tablicy znaków SBUF, zadeklarowanej w wykorzystywanym module. Procedura Done wyrejestruje z systemu. LoadRemoteSystemWithUser(’macro’, 5580, ’Xpertis’, ’kali’, ’szef’, ’szef’); ExecString(@SBUF, 1024, ’proc’,’01’,’’); Done; 20 Przeglądarka raportów z Crystal Reports Pakiet MacroBASE zawiera program MacroCRview, będący przeglądarką sprawozdań stworzonych programem Crystal Reports w wersji 10. Dostarczona przeglądarka ma podobne wymagania sprzętowo-systemowe, co sam program Crystal Reports, czyli można ją uruchomić tylko na systemach operacyjnych Windows 2000(z SP4)/XP/2003/Vista/2008/7 z zainstalowanym sterownikiem ODBC systemu MacroBASE dla wersji crview.exe oraz systemach Linux dla wersji CRView.jar. W wersji windowsowej, jeśli w pliku jterm_12.30.ini będzie wpis: [!crview] viewer = java będzie uruchomiona wersja przeglądarki ta sama, jaka działa w wersji linuxowej. Zaletą przeglądarki jest to, że nie wymaga ona instalowania komponentów Crystal Reports. Wpis w pliku jterm_12.30.ini w wersji windowsowej: [!crview] viewer = activex spowoduje uruchamianie przeglądarki dedykowanej dla systemów windows (crview.exe). Podczas tworzenia i przeglądania wydruku w przeglądarce, zużywane jest jedno stanowisko z puli mbasic_users. Użytkownik jest wyrejestrowywany z serwera dopiero po zamknięciu okna przeglądarki. Do uruchamiania i obsługi raportów z poziomu MacroBASEa służy zestaw funkcji: cr_decl, cr_param, cr_call i cr_cancel. Ich składnia i działanie są opisane w podręczniku do Formuli+. Przygotowany raport nie może być zapisany z danymi, w przeciwnym przypadku będzie zgłoszony błąd przy próbie uruchomienia. Plik ze sprawozdaniem jest wyszukiwany zgodnie z deklaracją ścieżek. Nie dopuszcza się sprawozdań umieszczanych lokalnie (tzn. III.20. Przeglądarka raportów z Crystal Reports z nazwą poprzedzoną znakiem @). Do raportu mogą być dołączone pliki wykorzystywane w sprawozdaniu jak np. bitmapa zawierająca logo firmy. Pliki te muszą znajdować się w tym samym katalogu co plik ze sprawozdaniem. Jeśli program jest uruchomiony poprzez serwer aplikacji, to plik ze sprawozdaniem oraz wszystkie dodatkowe pliki są kopiowane do katalogu z kopiami (parametr dir w sekcji [!Cache] pliku winterm.ini lub jterm_12.30.ini). Przeglądarkę sprawozdań w wersji crview.exe można uruchomić również spoza aplikacji, wywołując ją z linii komend i podając nazwę sprawozdania jako argument. Jeśli raport ma zdefiniowane parametry, podczas uruchomienia będą się pojawiać stosowne dialogi, w których można je podać. Aby wykonanie sprawozdania było możliwe muszą być dodatkowo spełnione następujące warunki: — w systemie zdefiniowane musi być źródło danych o identycznej nazwie jak nazwa źródła użytego podczas definiowania sprawozdania, — w ustawieniach źródła danych musi być zapisana nazwa użytkownika i hasło. Jeśli któryś z warunków nie będzie spełniony, to wykonanie sprawozdania, albo odświeżenie jego zawartości nie będzie możliwe. Przeglądarkę w wersji CRView.jar można uruchamiać jedynie z klienta serwera aplikacji jTerm za pośrednictwem funkcji cr_call, nie jest dozwolone uruchamianie spoza systemu MacroBASE jako niezależnej aplikacji. Ponadto dla wersji CRView.jar: — funkcją cr_call nie można wyeksportować raportu do pliku tekstowego ani w formacie XML. Zatem dostępne formaty to PDF, XLS, XL2, DOC, RTF, RPC. — Komponenty JAVA Crystal Reports zawierają błąd rzutowania argumentów, jeśli formuła selekcji w raporcie odwołuje się do pól z bazy danych po prawej stronie operatora porównania. Dotyczy to raportów z ręcznie zdefiniowaną formułą selekcji. Przykład takiej formuły: {ZM.KZ} = "Z" and {N.OD}>= {?DATAOD} and (IsNull({H.DO}) or {N.OD}<={H.DO}) and {H.OD}<={N.OD} Problem można rozwiązać dopisując na początku formuły selekcji linijkę zawierającą rzutowanie pola: 117 118 Rozdział III. Architektura systemu dateVar v :={H.DO}; {ZM.KZ} = "Z" and {N.OD}>= {?DATAOD} and (IsNull({H.DO}) or {N.OD}<={H.DO}) and {H.OD}<={N.OD} — w razie problemów z połączeniem przez ODBC w systemie Linux, warto sprawdzić czy zainstalowane biblioteki ODBC mają odpowiednie (wymagane przez sterownik MacroBASE) nazwy: libodbcinst.so i libodbc.so. Jeśli nie, to należy utworzyć odpowiednie dowiązania symboliczne. Przykładowo dla systemu Ubuntu 6.06 i najnowszego pakietu unixODBC dla tego systemu w wersji 2.2.11 należy z prawami użytkownika root wykonać polecenia: ln -s /usr/lib/libodbcinst.so.1.0.0 /usr/lib/libodbcinst.so ln -s /usr/lib/libodbc.so.1.0.0 /usr/lib/libodbc.so 21 Program do testowania sieci Zadaniem programu nettest.exe (nettest w wersji dla systemu Linux) jest badanie sieci komputerowej. Wynikiem jest czas potrzebny do przesłania pakietów protokołem udp. Wielkość pakietu jest zbliżona do średniej wielkości pakietu przesyłanego pomiędzy klientem i serwerem bazy danych. Na jednym komputerze w sieci uruchamiany jest jako serwer (bez argumentów), na drugim jako klient — z parametrem będącym numerem IP pierwszego komputera. W ramach testu 10000 razy przesyłany jest pakiet 100 bajtowy. Wynik poniżej 10 sekund można uznać za zadowalający. Jeśli w trakcie testu były informacje o zgubionych pakietach (wypisywany komunikat Timeout), to należy się liczyć ze znacznymi spowolnieniami w pracy systemów. Każdy zgubiony pakiet powoduje sekundową przerwę w działaniu programu. Program umożliwia również testowanie przesyłania pakietów protokołem ipx oraz ze zmienionym rozmiarem pakietu. Szczegóły są dostępne po wywołaniu z opcją -h. 22 Konfigurowanie systemu W systemie MacroBASE można konfigurować system poprzez zmianę standardowych wartości parametrów. Po uruchomieniu serwera bazy danych i programu administratora wczytywane są parametry z pliku o nazwie macro.cfg. III.22. Konfigurowanie systemu Poszukiwany jest on w katalogu określonym parametrem wywołania. Dla programu klienckiego odczytywane są wartości parametrów najpierw z pliku macro.cfg, a następnie z pliku o nazwie takiej jak nazwa systemu, z końcówką .cfg. Wartości parametrów ustawionych w drugim z plików przysłaniają ustawienia zarówno standardowe, jak i te z pliku macro.cfg. Pliki są poszukiwane zgodnie z deklaracją ścieżek. Wiersze w pliku konfiguracyjnym mają następującą postać: nazwa_parametru = wartość Część wiersza począwszy od znaku średnika (;) jest traktowana jako komentarz. Puste wiersze, podobnie jak wszystkie nierozpoznane parametry, są ignorowane. Możemy zmienić standardowe wartości poniższych parametrów. Litera A umieszczona w nawiasie za nazwą parametru oznacza, że parametr wykorzystywany jest przez program MacroADMIN, litera C — serwer aplikacji lub grubego klienta, litera S — serwer bazy danych. busy_tmo (C) maksymalny czas oczekiwania na zwolnienie zasobów w trakcie trwania transakcji. Domyślną wartością jest 10 sekund. busy_try_cnt (C) liczba prób dostępu do zablokowanego zasobu przed wyświetleniem okienka oczekiwania. Po wyświetleniu okienka próby dostępu do zasobu są powtarzane co sekundę. Domyślną wartością jest 2, czyli po drugim nieudanym dostępie pojawia się okienko oczekiwania. Parametr musi być większy od 0, class_cnt (C) maksymalna liczba zadeklarowanych klas. Wartością domyślną jest 50. Jeśli przypiszemy parametrowi wartość mniejszą, to zostanie ona powiększona do domyślnej. Wartość maksymalna to 136, cli_mem_size (C) rozmiar pamięci wyrażony w MB, używanej do przechowywania tabel tymczasowych i ich indeksów. Parametr nie może przyjmować wartości mniejszej niż 2. Wartość domyślna to 4. Jeśli rozmiar tabel tymczasowych i ich indeksów przekroczy wartość określoną poprzez parametr cli_mem_size, to wykorzystywany będzie plik macrosrv.swp tworzony w katalogu użytkownika z katalogu server. Oznacza to, że jeśli tymczasowe tabele z indeksami mają mniejszy rozmiar niż rozmiar 119 120 Rozdział III. Architektura systemu pamięci określonej poprzez cli_mem_size, to przy ich obsłudze nie będą wykonywane żadne operacje dyskowe. copy_delay (C) czas (w sekundach), po którym pojawi się okienko z postępem kopiowania pliku pomiędzy serwerem aplikacji i klientem. Wartość maksymalna to 5, cr_max_files (C) określa maksymalną liczbę zainicjowanych jednocześnie sprawozdań przygotowanych w Crystal Reports (domyślnie 10), cr_max_params (C) maksymalna liczba wywołań funkcji cr_param dla pojedynczego sprawozdania. Domyślną wartością jest 1000, debug_time (S) uaktywnia opcję zapisu przez serwer bazy danych czasu wykonania niektórych operacji. Nowe informacje będą zapisywane w plikach *.log, jeśli wartość parametru będzie większa od -1 (wartość -1 oznacza wyłączenie rejestrowania). Rejestrowanie dotyczy wybranych operacji, które trwają więcej milisekund niż wartość przypisana do parametru debug_time Dla 0 będą rejestrowane wszystkie operacje danej klasy. Szczegóły dotyczące rejestrowanych danych znajdują się w rozdziale III.25 def_name (C) nazwa skojarzonego pliku definicji systemu (*.def) i pliku przechowującego ochrony systemu (*.psw) exp_assign_check (C) włącza sprawdzanie błędów wykonania formuły, polegających na: — podstawieniu na wyrażenie, — prefiksowaniu zmiennej lokalnej. Jeśli parametr przyjmie wartość 1, to w powyższych przypadkach zostanie zgłoszony błąd. Dopuszczalny będzie tylko wyjątek podstawienia na wynik formuły, jeśli ostatnią instrukcją w treści formuły jest: — podstawienie na zmienną lub — nazwa zmiennej (czyli formuła zwraca wartość zmiennej), III.22. Konfigurowanie systemu oraz instrukcja ta zostanie wykonana. Wtedy podstawienie dotyczyć będzie użytej zmiennej. Wartość 0 dla parametru oznacza brak kontroli powyższych błędów. Wartość domyślna jest zależna od wersji pliku definicji systemu. Dla wersji starszych od 11.20 (inaczej do wersji 11.11) wartością domyślną jest 0, dla pozostalych wersji jest 1. files (CS) maksymalna liczba plików otwartych przez proces. Wartością domyślną jest 20. Parametr nie może przyjmować wartości mniejszych niż 10, fork_users (S) maksymalna liczba dostępów dodatkowych dla wszystkich użytkowników serwera. Suma wartosci max_mbasic_users, fork_users, max_cgi_users max_builder_users oraz liczby licencji serwera nie może przekroczyc 255 dla wersji 32 bitowej i 1023 dla wersji 64 bitowej serwera. Domyślna wartość wynosi 25, formula_recursion (C) parametr określa maksymalną liczbę zagnieżdżonych wywołań funkcji języka Formula. Przekroczenie liczby wywołań spowoduje przerwanie wykonywanej formuły i wyświetlenie komunikatu o błędzie (przekroczono głębokość rekurencji). Wartością domyślną jest 100, login_try_max (C) maksymalna liczba powtórzeń prób rejestrowania w serwerze bazy danych, w przypadku przekraczania maksymalnej liczby użytkowników. Domyślna wartość to 50. Wartość parametru warto zmienić w przypadku korzystania z bazy danych poprzez przeglądarkę internetową i skrypt MacroCGI. Klient w takim przypadku zarejestrowany jest na krótką chwilę, stąd duże prawdopodobieństwo, że zwolni dostęp do danych przed powtórnym rejestrowaniem. Uniknie się w ten sposób komunikatu o błędzie: zbyt wielu użytkowników, login_try_wait (C) czas, liczony w setnych częściach sekundy, pomiędzy powtórzeniami prób rejestrowania w serwerze bazy danych, w przypadku przekraczania maksymalnej liczby użytkowników. Domyślna wartość wynosi 1, 121 122 Rozdział III. Architektura systemu macro_profiler (C) wartość 1 oznacza, że klient będzie uruchomiony z profilerem, w trybie śledzenia całej aplikacji. Ustawienie jest ważniejsze od przełączników -v i -v2 jTerma. Wartością domyślną jest 0, sys_log_1122 (C) Wartość 1 oznacza, że w tabeli SYSLOG dla rozkazów inlog, outlog nie będzie zapisywany odpowiednio: numer sesji uzytkownika w MacroSERVERRZE w polu RECNO oraz SYSLOG.ses_id w polu DESCR. Wartością domyślną jest 0, exec_count (C) Wartość 1 oznacza, że klient będzie uruchomiony z rejestrowaniem liczby wywolań procedur. Wartością domyślną jest 0, exec_count_timeout (C) Zapis cząstkowy rejestrowananej liczby wywolań procedur co okresloną w minutach wartosc czasu. Domyślna wartość 0 oznacza odpisanie tylko jednego pliku na zakończenie działania programu, ntc_disable (C) Wyłączenie obsługi powiadomień. Jeśli będzie miał wartość liczbową różną od 0, to komunikaty z aplikacji wysyłane nie będą. Komunikaty będą dostępne w jTermie, jeśli zostanie otworzona przynajmniej jedna aplikacja, z której można wysyłać komunikaty, err_mail_enable (C) Włączenie możliwości wysłania zgloszenia błędu pocztą elektroniczną, domyślną wartością jest 0, err_mail_address (C) Dla włączonej możliwości wysyłania zgłoszeń o błędzie pocztą elektroniczną (err_mail_enable = 1) adres, wpisywany do programu pocztowego jako odbiorca wiadomości, dobyślna wartość to [email protected], max_cgi_users (S) maksymalna liczba użytkowników, którzy mogą być jednocześnie zarejestrowani w serwerze bazy danych poprzez wywołanie programu MacroCGI (lub mhtmlcgi.exe dla wersji windowsowej). Liczbę większą od zera można określić tylko dla wersji oprogramowania obsługującą dostęp poprzez skrypt CGI. Parametr mówi zatem o maksymalnej liczbie użytkowników pracujących z poziomu przeglądarki internetowej, III.22. Konfigurowanie systemu którzy w tym samym czasie odwołują się do serwera bazy danych. Wartością domyślną jest 10, max_cntx_psh (C) maksymalna liczba odłożonych (i nie pobranych) kontekstów dla tabeli. Domyślną wartością jest 1000, max_mbasic_users (S) maksymalna liczba użytkowników, którzy mogą być zarejestrowani w serwerze bazy danych poprzez wywołanie biblioteki mbasic.dll. Suma wartosci max_mbasic_users, fork_users, max_cgi_users max_builder_users oraz liczby licencji serwera nie może przekroczyc 255 dla wersji 32 bitowej i 1023 dla wersji 64 bitowej serwera.Domyślna wartość to 25, max_builder_users (S) maksymalna liczba użytkowników, którzy mogą być zarejestrowani w serwerze bazy danych z MacroBUILDERa - nie zużywają wówczas dostępów do serwera z puli dostępów licencjonowanych. Suma wartosci max_mbasic_users, fork_users, max_cgi_users max_builder_users oraz liczby licencji serwera nie może przekroczyc 255 dla wersji 32 bitowej i 1023 dla wersji 64 bitowej serwera. Domyślna wartością jest 2, mem_size32 (S) rozmiar pamięci wyrażony w MB, używanej przez MacroSERVER do buforowania odczytow danych i indeksów dla wersji 32 bitowej serwera bazy danych. Jeśli parametr nie będzie zdefiniowany, to przyjmie wartość 20% pamięci operacyjnej. Parametr ten może przyjmować maksymalnie wartość 1400, podanie większej wartości jest równoważne podaniu maksymalnej, mem_size (S) rozmiar pamięci wyrażony w MB, używanej przez MacroSERVER do buforowania odczytow danych i indeksów dla wersji 64 bitowej serwera bazy danych.Jeśli parametr nie będzie zdefiniowany, to przyjmie wartość 20% pamięci operacyjnej, net_error_delay (CS) parametr określający czas (w sekundach), w ciągu którego, po stwierdzeniu zerwania komunikacji pomiędzy klientem a serwerem, możliwe jest jej wznowienie w ramach tej samej sesji. Dotyczy to połączenia pomiędzy końcówką i serwerem aplikacji oraz serwerem aplikacji a serwerem 123 124 Rozdział III. Architektura systemu bazy danych. Po zerwaniu połączenia serwer przechodzi w stan oczekiwania na nowe połączenie, przez czas określony parametrem. Domyślną wartością parametru jest 30 sekund. Wartość zero oznacza wyłączenie mechanizmu powtórnego nawiązywania połączenia. Po zerwaniu połączenia następuje próba ponownego jego nawiązania przez czas określony parametrem powiększonym o jedną minutę, net_idle_timeout (S) okres (w minutach), w ciągu którego użytkownik musi mieć kontakt z serwerem. Jeśli w ciągu ustalonego czasu użytkownik nie wyśle do serwera żadnego rozkazu, to zostanie automatycznie wyrejestrowany. Domyślnie przyjmowana jest zerowa wartość parametru, czyli brak wyrejestrowywania. Maksymalna wartość parametru wynosi 2000. Parametr jest czytany przez serwer bazy danych w systemie Windows, zaś w systemie Linux przez program MacroCOMM. Zasada dotyczy tylko użytkowników łączących się z serwerem bazy danych przez sieć, czyli dotyczy pracy poprzez cienkiego klienta, o ile serwer aplikacji jest uruchomiony na innej maszynie niż serwer bazy danych. Dla przykładu, jeśli ustawimy wartość parametru na 60 a użytkownik pracujący poprzez serwer aplikacji znajdujący się na innym komputerze niż serwer bazy danych przez godzinę nie będzie odwoływał się do danych na serwerze (np. będzie wertował tabelę tymczasową, przeglądał sprawozdania lub redagował zawartość pola typu MEMO), to zostanie automatycznie wyrejestrowany z serwera bazy danych. W związku z powyższym, należy tak dobierać wartość parametru, aby nie groziło to utratą nie zapisanych danych (np. notatki MEMO), z powodu wcześniejszego zakończenia połączenia przez serwer, net_proto (CS) protokół wykorzystywany do komunikacji pomiędzy klientem a serwerem (dla wersji linuxowej z programem komunikacyjnym MacroCOMM). Można przypisać mu wartość tcp lub domyślną udp. W przypadku protokołu TCP/IP cała komunikacja sieciowa odbywa się poprzez wskazany port. Dla protokołu UDP podany numer portu służy jedynie do nawiązywania połączeń. Komunikacja z klientem odbywa się już po nowym porcie, przydzielanym przez system z puli portów dynamicznych, Aby komunikacja doszła do skutku, serwer musi być uruchomiony z identycznymi parametrami co klient, III.22. Konfigurowanie systemu obj_cnt (C) maksymalna liczba powołanych zmiennych słownikowych. Domyślna wartość to 1000. Jeśli przypiszemy parametrowi wartość mniejszą, to zostanie ona powiększona do domyślnej. Jednocześnie wartość parametru powiększona o wartość parametru obj_cnt+4 nie może przekraczać 65000, obj_meth_par_type (C) wartość 1 oznacza, że argumenty wywolania obj_meth, obj_virt powyzej czwartego są interpretowane, przy wartości 0 parametry są ignorowane. Dodatkowo obj_meth, obj_virt w przypadku użycia trzech argumentów wywołania definiują metodę z niezamkniętą listą argumentów. Wartość domyślna jest zależna od wersji pliku definicji systemu. Dla wersji starszych od 11.20 (inaczej do wersji 11.11) wartością domyślną jest 0, dla pozostałych wersji jest 1, sort_progress_delay (C) czas po którym pojawi się okienko z postępem sortowania. Przypisanie wartości 0 oznacza, że okienko z postępem będzie się pojawiać zawsze. Domyślna wartość to 10 sekund, sql_delay (C) czas (liczba sekund), po którym pojawi się okienko umożliwiające przerwanie wykonania zapytania SQL. Domyślna wartość to 10 sekund, synchr_num (ACS) liczba określająca zasoby synchronizacyjne. Jeśli wystąpi konflikt zasobów synchronizacyjnych z innymi programami w systemie, to zgłoszony zostanie błąd przy tworzeniu tych zasobów podczas uruchamiania serwera bazy danych (plik server.log). W takim przypadku należy zdefiniować tę wartość przypisując jej liczbę naturalną mniejszą od 100. Domyślną wartością jest 0, tab_tmp_cnt (C) gwarantowana liczba tabel tymczasowych w ramach jednej sesji. Po przekroczeniu limitu zgłaszany jest błąd. Domyślna wartość to 50, tcp_udp_port (CS) numer portu, poprzez który komunikuje się program kliencki z serwerem (dla wersji linuxowej z programem komunikacyjnym MacroCOMM). Domyślną wartością jest 5557, 125 126 Rozdział III. Architektura systemu var_cnt (C) maksymalna liczba zmiennych globalnych. Wartością domyślną jest 100. Jeśli przypiszemy parametrowi wartość mniejszą, to zostanie ona powiększona do domyślnej. Jednocześnie wartość parametru powiększona o liczbę funkcji globalnych (np. sin(), log()) nie może przekroczyć 32767. Możliwy jest podgląd zinterpretowanych przez system wartości parametrów. Pierwszy zestaw parametrów odpisywany jest w pliku server.log (macro.log dla systemu Linux) podczas uruchamiania serwera bazy danych. Drugi, odpisywany jest w pliku *.log programu użytkowego po zalogowaniu użytkownika do niego. 23 Deklaracja ścieżek Informacja o rozmieszczeniu zbiorów tworzących system użytkowy w systemie plików systemu operacyjnego jest zapisana w zbiorze z deklaracjami ścieżek. Ma on nazwę taką jak nazwa systemu i rozszerzenie .pth, np. demo.pth. Kolejne wiersze zbioru ścieżek są utworzone z dwóch części oddzielonych ciągiem białych znaków. Pierwsza z nich podaje ścieżkę do katalogu, w którym będą poszukiwane zbiory zgodne z maskami zawartymi w części drugiej. Wyjątkiem od tej reguły jest jedynie sytuacja gdy białe znaki występują w cudzysłowach (na przykład "d:\Moje Dokumenty"). Znaki spacji i tabulacji zawarte między nimi, nie są traktowane jako separatory, tylko jak fragmenty ścieżek lub masek. Nie można umieścić nieparzystej liczby znaków cudzysłowu w wierszu — zostanie wtedy zgłoszony błąd. Znak cudzysłowu nie może zatem wystąpić ani w ścieżce, ani w masce zbioru. Nie można również używać polskich znaków w nazwach katalogów. Maska opisuje zbiory lub klasy zbiorów określane przy pomocy następujących metaznaków: ? dowolny jeden znak, * dowolny ciąg znaków (również zero znaków), [...] dowolny ze znaków zawartych pomiędzy nawiasami [ i ]. Dopuszczalne jest użycie zakresów ze znakiem - (minus) jako łącznik. Dla przykładu [_1-9] może dopasować się do znaku podkreślenia lub dowolnej cyfry. Umieszczenie na początku linii tekstu rem lub znaku ; powoduje potraktowanie jej jako komentarza. Plik z deklaracją ścieżek nie może (poza komentarzami) zawierać znaków o kodach ASCII wyższych niż 127. W deklaracjach III.23. Deklaracja ścieżek 127 ścieżek, można odwoływać się do zmiennych środowiskowych. Zbiór z deklaracjami ścieżek jest poszukiwany w katalogu bieżącym i analizowany przez serwer aplikacji a także program MacroTRANSFER oraz w przypadku podania opcji -P przez MacroREPORT. Pliki których nazwy nie pasują do żadnej maski, będą wyszukiwane w katalogu bieżącym dla pliku deklaracji ścieżek, tak jakby na końcu deklaracji był wpis: . * Jeśli nie ma pliku z deklaracjami ścieżek, to wszystkie zbiory będą poszukiwane i tworzone w bieżącym katalogu. W przypadku pracy z serwerem aplikacji, plik deklaracji ścieżek jest poszukiwany w lokalizacji wskazanej w pliku konfiguracyjnym cluster.cfg. W systemie Linux jest analizowany przez proces serwera aplikacji i jego procesy potomne, zaś w systemie Windows przez program mblaunch.exe i procesy mblogics.exe. Poniżej podana jest lista wszystkich zasobów, które wyszukiwane są z wykorzystaniem deklaracji ścieżek: — definicje systemu (*.def), — zbiory z hasłami (*.psw), — zbiory z historią dostępów do bazy (*.log), — zbiory konfiguracyjne systemu (macro.cfg, *.cfg), — tło programu (zbiory front.bmp, back.bmp, front.png, back.png), — przyciski na listwie narzędziowej, obrazki przed wartościami pól rekordów oraz grafiki użyte w sprawozdaniach (zbiory *.bmp), — dane systemu (*.mdb) — ścieżka dostępu do katalogu z danymi musi być poprzedzona dwukropkiem. Dla wersji sieciowych, po dwukropku musi być jeszcze wpisana pomiędzy znakami | nazwa lub numer IP komputera, na którym znajdują się zbiory. W tym samym katalogu przechowywane będą zbiory indeksowe przypisane do zbioru z danymi — pliki *.ndx oraz *.del. Opcjonalnie po numerze IP można określić na którym porcie nasłuchuje serwer bazy danych. Numer portu można 128 Rozdział III. Architektura systemu podać po dwukropku, bezpośrednio za nazwą (lub numerem IP) serwera, przed kreską zamykającą opis. Dodatkowo można określić protokół komunikacyjny. Dodając po dwukropku umieszczonym bezpośrednio za numerem portu słowo tcp, wybieramy protokół TCP/IP. Pomijając ten fragment, albo umieszczając słowo udp, wskazuje się protokół UDP. Podany numer portu i protokół nie wpływa na parametry serwera komunikacyjnego uruchomionego lokalnie. Umożliwia to pracę z jednej końcówki z serwerami nasłuchującymi na różnych portach i wykorzystujących różne protokoły. W szczególności, można z końcówki windowsowej pracować z dwoma programami obsługiwanymi przez dwa programy serwera bazy danych działające w środowisku Linux. Aby komunikacja doszła do skutku, serwer musi być uruchomiony z identycznymi parametrami. Parametr tcp_udp_port ustawiany w pliku macro.cfg musi określać ten sam numer portu, — pliki użytkownika — pliki, które dla każdego użytkownika będą poszukiwane w oddzielnym katalogu. Wpisy takie rozpoczyna się od znaku > a bezpośrednio po nim następuje ścieżka do katalogu, w którym będą tworzone podkatalogi. Dla każdego użytkownika, będzie założony podkatalog z nazwą taką, jak nazwa użytkownika. W nim będą zapisywane i z niego odczytywane wszystkie zbiory o nazwach pasujących do masek podanych za ścieżką dostępu po katalogu. Można w ten sposób wskazywać wszystkie pliki, oprócz plików bazy danych (*.mdb), — pliki lokalne — pliki na komputerze, na którym działa terminal. Ścieżka dostępu musi rozpoczynać się znakiem @. Każdy wiersz, który będzie poprzedzony znakiem @, będzie wykorzystywany wyłącznie przy wyszukiwaniu plików lokalnych, czyli takich których nazwa będzie również poprzedzona znakiem @. Pliki lokalne mogą być otwierane przez następujące funkcje i metody języka formula: bl_put, bl_get, cr_call, export, ferase, fopen, fcopy, import, sql_log, txt_edit oraz txt_view, — katalog roboczy — domyślnie jest zakładany jest w katalogu roboczym systemu. Dla systemu Linux można zmienić jego położenie poprzez przypisanie do zmiennej systemowej MACRO_TEMP ścieżki do katalogu, w którym mają być zakładane katalogi robocze programu. Po zakończeniu działania programu, katalog razem z zawartością jest usuwany. Dostęp do katalogu odbywa się przez symbol @!Tmp, który musi wystąpić na początku napisu określającego katalog. Jeśli po nim wystąpi znak backslash (\), to w wersji linuxowej zostanie zamieniony na znak III.23. Deklaracja ścieżek slash (/). Symbol może być również użyty na początku wiersza w deklaracji ścieżek. W katalogu roboczym są tworzone pliki tymczasowe podczas przeglądania sprawozdań. Katalog jest również wykorzystywany przy wywołaniu funkcji sys_exec, — katalog server — zawiera zbiory związane z obsługą tabel tymczasowych. Jeśli katalog o takiej nazwie nie istnieje to zostanie utworzony. W nim z kolei, dla poszczególnych użytkowników, powstają podkatalogi o nazwach będących numerem użytkownika w serwerze bazy danych. Zatem wpis: c:\tmp server spowoduje przy tworzeniu pierwszej tabeli tymczasowej utworzenie katalogu c:\tmp\server, a w nim podkatalogu z numerem użytkownika. Należy zatem zadbać, aby katalog server: – mógł być utworzony przez klienta (w przeciwnym przypadku zostanie zgłoszony błąd), – ze względów efektywnościowych znajdował się na dysku lokalnym (nie sieciowym), – nie był współdzielony przez użytkowników pracujacych w konfiguracji z wykorzystaniem serwera komunikacyjnego przy połączeniu sieciowym z serwerem bazy danych. Tabele tymczasowe i ich indeksy przechowywane są w pamięci operacyjnej. Jeśli ich rozmiar przekroczy wartość określoną poprzez parametr cli_mem_size, to wykorzystywany będzie plik macrosrv.swp tworzony w katalogu użytkownika z katalogu server. Oznacza to, że jeśli tymczasowe tabele z indeksami mają mniejszy rozmiar niż rozmiar pamięci określonej poprzez cli_mem_size, to przy ich obsłudze nie będą wykonywane żadne operacje dyskowe. — katalog sysblob — zawiera wszystkie pliki powiązane z polami typu BLOBIMAGE i BLOBRAW. Jeśli katalog o takiej nazwie nie istnieje, to zostanie utworzony. Przykładowa lokalizacja katalogu może być określona w następujący sposób: c:\xpertis\pliki sysblob 129 130 Rozdział III. Architektura systemu Taki zapis oznacza, że w katalogu c:\xpertis\pliki utworzony zostanie katalog sysblob, gdzie zapisywane będą pliki. Każdy z plików będzie zapisany pod nazwą będącą tekstową reprezentacją wyniku funkcji SHA-1 obliczonej dla zawartości pliku. Pliki o identycznej zawartości będą miały zatem identyczne nazwy. W takim przypadku na dysku będzie przechowywana tylko jedna kopia takiego pliku. Jeśli zdarzyłoby się, że pomimo tej samej wartości funkcji sha-1 pliki są różne, to nowy plik będzie miał doklejoną do nazwy końcówkę w postaci numeru porządkowego zapisanego w systemie heksadecymalnym. Nazwy plików będą miały 30 znaków, a w przypadku doklejania znaków, długość nazwy nie będzie przekraczała 38 znaków. Pliki będą umieszczane w podkatalogach katalogu sysblob. Każdy podkatalog stanowi dwa początkowe znaki wartości funkcji SHA-1, znaki te nie zostaną już użyte w nazwie samego pliku, — zbiory z formułami (*.fml), — wzorce sprawozdań (*.rpm), — pliki włączane do wzorców sprawozdań (*.rpi), — skompilowane wersje wzorców sprawozdań (*.rpt), — skompilowane opisy drukarek (*.prt), — kopie utworzonych sprawozdań (*.k??), — deklaracje ścieżek innych systemów (*.pth), — pliki włączane do deklaracji ścieżek (*.pti), — opisem konfiguracji okienek i używanych czcionek (*.ini) (dla wersji Linuxowej odpisywana jest tylko inforamcja o zawijaniu wierszy w edytorze), — warunki zapisane dla okienek (*.cnd), — importowane i eksportowane dane funkcjami import i export, — pliki obsługiwane funkcjami fopen, fcopy, ferase jeśli stosowne argumenty określają działanie tych funkcji z uwzględnieniem deklaracji ścieżek, — pliki wyświetlane i redagowane za pośrednictwem funkcji txt_edit i txt_view, jeśli drugi parametr wywołania jest różny od zera, III.23. Deklaracja ścieżek — definicje wydruków uniwersalnych (*.un?), — pliki związane z tabelą SYSBLOB, jeśli trzeci argument funkcji bl_get i bl_put jest różny od zera, — zapytania SQL (*.sql), — procedury wbudowane (*.prc), — historia wywołań formuł za pośrednictwem biblioteki _debug.fml i zapytań SQL — za pośrednictwem biblioteki _sql.fml, — pliki związane z obsługą MacroCGI — plik macrocgi.ini oraz szablony stron. — plików, dla których uruchamiany jest skojarzony program poprzez wywołanie funkcji sys_exec, — definicji wydruków Crystal Reports (*.rpt), — zapisanych wyników wydruków Crystal Reports powstałych przy pomocy metody cr_call (pliki *.pdf, *.xls, *.doc, *.rtf, *.txt, *.xml, *.rpc, *.x12), — definicji autoraportów (*.aut), — bibliotek ładowanych dynamicznie (*.jar, *.dll), — plików technicznych z informacjami o warstwach i błędach spisowych(*.file, *.revi, *.info). W celu znalezienia konkretnego pliku analizowane są kolejne wiersze deklaracji ścieżek. Plik będzie poszukiwany w pierwszym katalogu, dla którego nazwa pliku pasuje do jednej z podanych masek. Zatem kolejność wierszy może mieć istotne znaczenie. Dla przykładu, przy deklaracji ścieżek lib _*.fml fml *.fml plik o nazwie _string.fml będzie poszukiwany tylko w katalogu lib. Jeśli linie byłyby wpisane w odwrotnej kolejności, to plik byłby poszukiwany tylko w katalogu fml. Jeśli system poszukuje listy plików (np. wzorców sprawozdań), to przeszukiwane są wszystkie katalogi, których maska pasuje do poszukiwanych nazw. 131 132 Rozdział III. Architektura systemu Ścieżki dostępu poprzedzone dwukropkiem (czyli dostęp do danych i indeksów), są przekazywane do maszyny bazy danych. Nie powinny zatem zawierać odwołań względnych, gdyż będą traktowane jako odwołania względem katalogu, w którym została uruchomiona maszyna bazy danych. Do pliku z deklaracją ścieżek można włączać pliki z rozszerzeniem *.pti. Służy do tego konstrukcja #include, po której podaje się nazwę pliku (bez rozszerzenia). Plik będzie wyszukiwany zgodnie z deklaracją ścieżek, na podstawie wierszy poprzedzających konstrukcję #include. Konstrukcja musi być umieszczona w osobnym wierszu i nie może zawierać nic poza #include, nazwą pliku oraz białymi znakami. Nazwa pliku nie może zawierać znaków \ (backslash) i / (slash). W plikach włączanych nie dopuszcza się już konstrukcji #include. Dla przykładu, jeśli w pliku *.pth znajdują się linie: ptidir *.pti #include Xpertis to do deklaracji ścieżek zostanie włączony plik ptidir\Xpertis.pti. W Wersji działającej pod systemem Linux wszystkie katalogi podane w deklaracji ścieżek (poza poprzedzonymi dwukropkiem), muszą być dostępne w systemie plików. Inaczej system zgłosi błąd i zakończy działanie. W deklaracjach ścieżek można użyć zmiennych systemowych. Odwołanie do wartości zmiennej jest takie, jak w systemie operacyjnym (np. ${HOME} dla Linuxa i %TEMP% dla Windows). Oto przykładowa deklaracja ścieżek w systemie Linux: :/home/demo/mdb *.mdb *.ndx /home/macro/cfg macro.cfg /home/macro/prt *.prt /home/macro/term *.tdc /home/macro/libfml _*.fml _*.rpm _*.rpt /home/macro/run Macro* system *.def *.psw *.log *.cfg fml *.fml *.rpm rpt *.rpt ${HOME}/kopie *.k?? imex * III.24. Indeksy z reprezentantem z tabeli maskowalnej W deklaracji ścieżek użyliśmy zmiennej środowiskowej HOME. Zatem pliki z kopiami sprawozdań będą umieszczane w katalogu kopie znajdującym się w katalogu domowym użytkownika. Zgodnie z powyższą deklaracją ścieżek w katalogu bieżącym muszą być podkatalogi system, fml, rpt i imex. Do katalogu imex przypisaliśmy maskę * — czyli pasująca do wszystkich plików (oprócz ukrytych). Linia została umieszczona jako ostatnia, zatem w katalogu imex będą wyszukiwane wszystkie pliki, które nie pasują do masek umieszczonych w poprzednich wierszach. W nim będą poszukiwane zbiory do importu i eksportu, o ile ich nazwa nie będzie pasowała do masek we wcześniejszych liniach. W wersji linuxowej właściciel zbiorów wykonawczych musi mieć prawo odczytu zbioru z deklaracją ścieżek, zaś użytkownicy systemu nie powinni mieć praw dostępu do tego zbioru. W deklaracji ścieżek dla systemu Windows dostęp do katalogu poprzedzamy nazwą dysku. Oto przykład: :|NT:5559:tcp|c:\systemy\demo *.mdb *.ndx >%TEMP% *.ini @c:\imex *.imp *.exp h:\demo *.* Zbiory z danymi będą przechowywane na serwerze NT (tam też będzie uruchomiona maszyna bazy danych). Podana ścieżka dostępu oznacza katalog na dysku c: serwera. Serwer nasłuchuje na porcie 5559 a protokół komunikacyjny to TCP/IP. Pliki wymiany danych (*.imp i *.exp) będą poszukiwane w katalogu c:\imex komputera na którym działa klient, pod warunkiem, że odwołamy się do nich poprzedzając nazwę pliku znakiem @ (w przeciwnym przypadku będą wyszukiwane w katalogu h:\demo). Zbiory z ustawieniami użytkownika (*.ini) umieszczone będą w katalogu wskazywanym przez zmienną systemową TEMP,w podkatalogach o nazwach takich jak nazwy użytkowników. Wszystkie pozostałe zbiory będą trzymane na dysku h: w katalogu demo. 24 Indeksy z reprezentantem z tabeli maskowalnej Jeśli w programie zdefiniowane są indeksy z polami złączeniowymi z reprezentantem ze słownika maskowanego, to konieczne jest istnienie pliku macro.use. Brak takiego pliku (lub odpowiedniego w nim wpisu dla któregoś ze zdefiniowanych indeksów) spowoduje, że program zgłosi błąd i zakończy działanie. Brak stosownych wpisów w pliku macro.use może ogra- 133 134 Rozdział III. Architektura systemu niczyć możliwość definiowania nowych indeksów tego typu. W szczególności, dla wszystkich pól bez poprawnego wpisu funkcja Pokaż/ukryj pola złączenia w oknie definiowania indeksów będzie niedostępna. Plik ma podobną konstrukcję do tworzonego pliku z formułami koniecznymi do transferu systemu z wersji 5.xx i 6.xx do 7.xx. Dla każdego pola złączeniowego do tabeli maskowanej, które występuje w indeksie z reprezentantem, trzeba napisać formułę o nazwie: \TABELA.POLE gdzie TABELA zamieniamy na akronim tabeli z której pochodzi, POLE — na akronim pola. Wynikiem takiej formuły musi być nazwa zbioru maskowanego, do którego odnosi się złączenie. Formuła będzie wykonana dla każdego rekordu zawierającego niezerową wartość w polu. W treści formuły można odwoływać się jedynie do funkcji i operatorów wbudowanych i zmiennych lokalnych procedury. Metody słownika głównego i zmienne globalne programu są niewidoczne. Dostępne są natomiast dwa argumenty. Pierwszy zawiera proponowaną nazwę maski. Jeśli tabela, z której pochodzi pole i tabela do której jest złączenie są maskowane i mają taką samą liczbę znaków zapytania w masce, to zwracana jest maska słownika z zamienionymi znakami zapytania na te same znaki, co w bieżącym zbiorze. W przeciwnym przypadku zwracany jest pusty ciąg znaków. Drugim argumentem jest maska tabeli z polem złączeniowym. Wywołując program MacroTRANSFER (transfer.exe dla Windows) z opcją -m można zweryfikować, czy wszystkie potrzebne procedury są zdefiniowane w pliku macro.use. Na standardowe wyjście będą wypisane brakujące wpisy. 25 Historia systemu Podczas działania systemu MacroBASE zachodzą zdarzenia, których znajomość jest konieczna dla jego prawidłowej obsługi. Istnieje potrzeba tworzenia ich historii wraz z opisem kontekstu wystąpienia. Służy do tego szereg plików z rozszerzeniem .log: plik programu użytkowego plik *.log o nazwie identycznej jak nazwa uruchomionego programu, tworzony przy pierwszym uruchomieniu aplikacji w katalogu wskazanym w deklaracji ścieżek, lub jeśli brak wskazania w deklaracji ścieżek — w katalogu bieżącym dla pliku *.pth. Każdy zapis do pliku *.log posiada następujący zestaw informacji: III.25. Historia systemu — datę i czas zdarzenia, — nazwę użytkownika, — nazwę terminala na którym pracuje użytkownik, — jeśli użytkownik nie pracuje w terminalu tekstowym, adres IP komputera na którym uruchomiony jest klient serwera aplikacji, — rodzaj zdarzenia. W przypadku zarejestrowania użytkownika w systemie pojawiają się również informacje o parametrach (pobranych z plików *.cfg), z jakimi aplikacja została uruchomiona. Najczęściej pojawiające się zapisy dotyczą: — zarejestrowań i wyrejestrowań użytkowników, — błędów w programie, — wybranych poleceń Formuli+ takich jak usuwanie i tworzenie tabel, usuwanie zawartości tabel, sortowanie, — nieudanych prób dostępu do zasobów (tabel, rekordów) zablokowanych przez innych użytkowników. W pliku pojawi się nazwa użytkownika oraz lokalizacja, skąd uruchamia program, oraz informacja o założonej blokadzie na rekord, która uniemożliwiła wykonanie akcji. Poniżej opisane są znaczenia wystąpienia poszczególnych znaków w kodzie określającym blokadę: T F M R L E 0 1 2 blokowanie w wyniku przeczytania lub zapisania rekordu w transakcji, blokowanie funkcją lock lub r_lock, blokowanie tabeli, blokowanie rekordu, blokowanie licznika, blokowanie pola typu MEMO, zasób zablokowany w wyniku lock lub r_lock z parametrem 0 lub zasób odczytany w transakcji, zasób zablokowany w wyniku lock lub r_lock z parametrem 1 lub zasób zapisany w transakcji, zasób zablokowany w wyniku lock lub r_lock z parametrem 2, — wywołań funkcji dialogowych w transakcji, — zapisy związane z ustawieniem parametru debug_time czyli: 135 136 Rozdział III. Architektura systemu – kontekst formuł, z którego została wywołana funkcja put powodująca zniszczenie indeksu z polem w złączeniu, – kontekst wywołania funkcji undo. import.log zawiera wszystkie błędy, które wystąpią podczas importowania danych funkcją import, umieszczony zgodnie z deklaracją ścieżek. Każdy wiersz w pliku zawiera opis jednego błędu. Kolejne informacje są oddzielone znakiem | i zawierają następujące dane: — datę w formacie rrrr/mm/dd, — czas w formacie gg:mm, — akronim tabeli do której importowane są dane, — aktualna maska tabeli (lub nazwa dla tabel niemaskowanych), — nazwa importowanego pliku, — numer wiersza w pliku z danymi, przy którym wystąpił błąd, — akronim pola, które przyczyniło się do błędu (np. nie odnaleziono stosownej wartości w słowniku lub pole miało niepoprawny format zapisu), — opis błędu, — użytkownik, który wywołał funkcję importującą, — terminal (lub nazwa komputera) na którym pracował. error.log zawiera informacje o błędach serwera aplikacji, tworzony w następujących lokalizacjach: — Windows — w katalogu roboczym serwera aplikacji (parametr wpath). Jeśli nie został określony to w katalogu konfiguracyjnym (parametr -ppath). W wypadku braku wyżej wymienionych — w katalogu bieżącym pliku mblaunch.exe, — Linux — w katalogu roboczym serwera aplikacji (parametr wpath). Jeśli nie został określony to w katalogu konfiguracyjnym (parametr -ppath), server.log zawiera historię pracy serwera bazy danych. Każdy wpis zawiera informacje: III.25. Historia systemu — datę i czas zdarzenia, — identyfikator procesu, — rodzaj zdarzenia. Do pliku zapisywane są informacje o uruchomieniach i zatrzymaniach oraz ewentualnych problemach związanych z pracą serwera bazy danych. W przypadku systemu Windows przy starcie zapisywane są dodatkowo informacje o wersji, numerze seryjnym, okresie ważności licencji, liczbie dostępnych stanowisk oraz wartości parametrów, z jakimi serwer został uruchomiony. Dla systemu Linux powyższe dane można znaleźć w pliku macro.log. To rozróżnienie dotyczy również informacji zapisywanych po ustawieniu parametru debug_time w pliku konfiguracyjnym macro.cfg na wartość większą od -1 (wartość -1 oznacza wyłączenie działania). Zapisywane wtedy informacje można podzielić na dwie grupy. Pierwsza z nich to dane o następujących operacjach: — wycofanie transakcji — z podaniem nazwy użytkownika i czasu trwania operacji. W pliku *.log aplikacji zapisywany będzie kontekst wywołania funkcji undo z formuły, — sortowanie — z podaniem: – nazwy dyskowej tabeli, – nazwy indeksu dla indeksów stałych, lub schematu dla indeksu tymczasowego, – ilości sortowanych rekordów, – czasu trwania operacji, — transfery nagłówka tabeli, — usuwanie plików z dysku na skutek rozkazu erase, — opóźnienie zapisu zmodyfikowanych danych, — informacja o wymiatanych stronach z bufora mem_size. Częste odpisy mogą świadczyć o tym, że należy zwiększyć rozmiar bufora mem_size. Rejestrowane będą informacje o operacjach, które trwają więcej milisekund niż wartość przypisana do parametru debug_time. Dla parametru debug_time równego zero, będą rejestrowane wszystkie operacje danej klasy. Druga grupa to operacje put dla słowników, które powodują zniszczenie indeksu z polem w złączeniu. W pliku server.log (macro.log dla Linuxa) zapisywane będą: 137 138 Rozdział III. Architektura systemu — nazwa dyskowa słownika, — akronim pola, którego wartość uległa zmianie, — nazwa dyskowa tabeli, w której indeks został uszkodzony, — nazwa dyskowa indeksu z reprezentantem. W pliku *.log aplikacji zapisywany będzie w takiej sytuacji kontekst formuł, z którego put został wywołany. Przy zamykaniu serwera bazy danych w pliku server.log zapisywane są informacje (o ile przyjmują niezerowe wartości): Transferow naglowka tabeli liczba wykonanych transferów nagłówka dla zbioru *.mdb, Indeksy usuniete przez algorytm uaktualniania liczba indeksów, które nie zostały uaktualnione, tylko usunięte (z przeznaczeniem do sortowania), Maksymalna wartosc licznika wznowien wykonywania rozkazow maksymalna liczba przerywania wykonywania rozkazu w oczekiwaniu na podczytanie danych, Rozkazow wykonanych z przelaczeniem na tryb blokujacy liczba rozkazów, w których podczytywanie danych blokowało wykonywanie rozkazów od innych użytkowników, Maksymalna liczba zablokowanych rekordow przez jednego uzytkownika w ramach jednej maski tabeli maksymalna liczba zablokowanych rekordów w jednej masce tabeli przez jednego użytkownika, Maksymalny czas przebywania uzytkownika w transakcji najdłuższy czas trwania transakcji. Od wykonania do do zerwania lub zakończenia poprzez end. Długi czas trwania transakcji oznaczać może więcej konfliktów w dostępie do danych (przeczytane i zapisane rekordy będą dłużej blokowane), Maksymalny czas trwania operacji wycofania transakcji najdłuższy czas wycofania transakcji. Ponieważ w trakcie wycofywania transakcji nie są wykonywane żadne inne rozkazy przez serwer, więc podana wartość jest również najdłuższym czasem przestoju serwera związanym z wycofaniem pojedynczej transakcji, Liczba opoznien zwiazanych z odpisaniem buforow (mem_size) liczba wstrzymań wykonywania rozkazów użytkowników ze względu na przekroczenie dopuszczalnej liczby nieodpisanych buforów, III.25. Historia systemu Liczba opoznien zwiazanych z odpisaniem buforow (pojedynczy plik) liczba wstrzymań wykonywania rozkazów użytkowników ze względu na przekroczenie dopuszczalnej liczby nieodpisanych buforów dla pojedynczego zbioru, Sortowanych indeksow z powodu bledow w danych liczba sortowań, które zakończyły się niepowodzeniem z powodu błędu w danych (np. podwojenie klucza). Należy usunąć błędy w danych na podstawie wcześniejszych zapisów w pliku *.log (będzie podana nazwa indeksu i numer pierwszego rekordu psującego kolejność), Sortowanych indeksow stalych pod powyższym wpisem umieszczane są kategorie: po zmianie wartosci pola reprezentanta liczba sortowanych indeksów, które nastąpiły w wyniku zmiany pola reprezentanta w słowniku, z powodu braku indeksu po polu zlaczeniowym liczba sortowań po zmianie pola reprezentanta w słowniku na skutek braku indeksu po tym samym polu złączeniowym bez reprezentanta. Dodanie stosownego indeksu (z pierwszym polem złączeniowym) może wpłynąć na zastąpienie sortowania uaktualnianiem indeksu, co powinno poprawić wydajność systemu, z powodu cyklu w indeksach z reprezentantem po zmianie wartości w słowniku, do uaktualnienia indeksu z polem reprezentantem jest wykorzystywany indeks również z polem w złączeniu do tej samej tabeli i również musi być uaktualniony. Jeśli kolejne wykorzystywane indeksy do uaktualnienia tworzą cykl (któryś wymaga pierwszego indeksu), to uaktualnienie indeksu nie będzie możliwe — nastąpi sortowanie. W celu uniknięcia sortowania w takim przypadku należy dodać indeks z pierwszym polem złączeniowym bez reprezentanta i bez pól w złączeniu do tej samej tabeli. Lokalizacja pliku server.log dla poszczególnych systemów jest następująca: — Windows — w katalogu roboczym serwera (parametr -wpath). Jeśli nie jest podany, domyślnie przyjmowany jest katalog roboczy systemu operacyjnego, 139 140 Rozdział III. Architektura systemu — Linux — w katalogu z plikiem konfiguracyjnym macro.cfg (parametr -ppath), macro.log plik tworzony przez programy wykonawcze, zawierający informacje techniczne, na ogół nie przydatne dla użytkownika. Wyjątkiem jest macro.log dla serwera bazy danych na platformie Linux, w którym zapisane są informacje o wersji, numerze seryjnym, okresie ważności licencji i liczbie dostępnych stanowisk oraz informacje zapisywane po ustawieniu parametru debug_time w pliku macro.cfg na wartość większą od -1 (opis w sekcji dla pliku server.log). Jeśli modyfikacja danych powoduje zmianę indeksu stałego niewystępującego w definicji systemu użytkownika (indeks jest zdefiniowany tylko systemach używanych aktualnie przez innych użytkowników), to w pliku macro.log pojawi się wpis postaci: [command] zmienia nieotwarty indeks tabela [table] indeks [index] gdzie command rozkaz add, put lub del, table pełna ścieżka do maski tabeli, index nazwa brakującego indeksu w systemie. W takiej sytuacji dodatkowo pojawi się wpis w pliku *.log aplikacji: Modyfikacja nieotwartego indeksu. od otwarcia do zamknięcia tabeli pojawia się co najwyżej jeden wpis dla każdego z indeksów. Wystąpienie wpisu oznacza błąd w integrowaniu aplikacji. Jeśli nie byłyby uruchomione inne systemy, to wpisu by nie było, zaś używane w innych systemach indeksy uległyby zepsuciu (byłyby odtwarzane przy uruchomieniu). W celu zlikwidowania błędu należałoby dodać brakujący indeks do systemu (w przeciwnym przypadku mogą występować odtwarzania indeksów, co skutkuje spowolnieniem pracy systemu), III.26. Fizyczna organizacja danych log analizy zapytań SQL plik programu użytkowego utworzony poleceniem sql_log rejestrujący przebieg oraz czas wykonania zapytań SQL. Więcej informacji na jego temat dostępnych jest w podręczniku Zapytania SQL w rozdziale dotyczącym optymalizacji. jterm.log plik tworzony przez klienta jTerm, zawierający informacje o błędach komunikowanych przez wirtualną maszynę Javy. Powstaje w katalogu: %appdata%\MacroBASE dla wersji działającej pod Windows, ~/.MacroBASE dla wersji działającej pod Linuxem. 26 Fizyczna organizacja danych Dane użytkownika zapisywane są w zbiorach z rozszerzeniem .mdb, np. katalog.mdb czy też czyteln.mdb. Każdy taki zbiór odpowiada tabeli bazy danych zgodnie ze schematem zapisanym w definicji systemu. Dodatkowe informacje związane z uporządkowaniem zapisów w każdej tabeli przechowywane są w zbiorach indeksowych. Zbiory te mają rozszerzenia .ndx i .del, np. kat_tyt.ndx, kat_num.ndx czy też katalog.del. Dla każdego zbioru z danymi *.mdb, jest tworzony katalog o takiej samej nazwie, ze zmienionym rozszerzeniem na ind, w którym są przechowywane indeksy danej maski tabeli. Katalog ten jest umieszczony w katalogu o nazwie będącej pierwszą literą pliku z danymi. Jednoliterowe katalogi będą tworzone z kolei w katalogu ndx. Katalog ndx zaś w tym samym katalogu co zbiór z danymi. Dotyczy to również tworzonych indeksów tymczasowych. Program wykonawczy potrafi odtworzyć zawartość zbiorów indeksowych na podstawie zawartości danych użytkownika. 27 Pliki graficzne (*.bmp, *.png) Program wykorzystuje pliki graficzne (*.bmp, *.png) w następujących sytuacjach: — do wypełnienia tła okna programu. Zgodnie z deklaracją śceiżek (*.pth) wyszukiwane są dwa pliki: back.bmp oraz front.bmp. W 141 142 Rozdział III. Architektura systemu obu mapach bitowych musi być wykorzystana ta sama paleta kolorów (maksymalnie 256 kolorów). Pierwsza z nich będzie przeskalowana do rozmiarów okna. Druga wyświetlana na pierwszej, bez skalowania, z dosunięciem do prawego dolnego rogu okna. Jeśli nie będzie zbioru back.bmp, tło będzie szare. Brak front.bmp spowoduje, że będzie wyświetlane tylko tło pochodzące z back.bmp. Obsługa tła może zostać zmodyfikowana w oparciu o pliki front.png oraz back.png. Jeżeli: – nie ma przynajmniej jednego z plików front.bmp lub back.bmp lub – jest przynajmniej jeden z plików front.png lub back.png wówczas wyświetlane będzie standardowe tło dostarczane z klientem jTerm, na którym w prawym dolnym rogu nałożona będzie grafika zapisana w pliku front.png (o ile istnieje), zaś na środku nałożona będzie grafika zapisana w pliku back.png (o ile istnieje). Wspomniane pliki będą wyszukiwane zgodnie z deklaracją ścieżek, — do wyświetlania na dołączanych przez użytkownika przyciskach na listwie narzędziowej. Możliwe do wyboru obrazki pobierane są z wszystkich plików z rozszerzeniem *.bmp, *.png odnalezionych zgodnie z deklaracją ścieżek, których wymiar poziomy nie przekracza 50 pikseli i nie jest mniejszy niż 24 piksele, zaś pionowy jest wielokrotnością 24 pikseli. W każdym zbiorze *.bmp może być zapisanych kilka obrazków, każdy o wysokości 24 pikseli. Informacja o zdefiniowanych przyciskach na listwie narzędziowej jest zapisywana w zbiorze *.ini, — w sprawozdaniach, w wyniku konstrukcji {BITMAP:} lub {COLOR:} dla zbiorów *.bmp, — przy wyświetlaniu obrazka przed wartością pola (na skutek formuły Przed ikoną), pozycji menu, w nazwie zakładki oraz na przycisku przed etykietą. Można umieszczać ikony — grafiki o rozmiarze 16x16 pikseli w formacie BMP lub PNG zapisane w plikach lub polach typu BLOBIMAGE lub BLOBRAW (podobnie jak w przypadku ikon dla pól). Dla formatu BMP kolor o współrzędnych RGB równych (192, 192, 192) traktowany jest jako przezroczysty. W przypadku pliku w formacie PNG kolor o współrzędnych RGB (192, 192, 192) jest traktowany jako zwykły kolor, zaś przezroczystość jest obsługiwana na podstawie informacji zapisanych w grafice. III.28. Ustawienia użytkownika Wspomniane zbiory *.bmp są wyszkukiwane zgodnie z deklaracją ścieżek. Na końcówce jTerm błędnie są obsługiwane skompresowane pliki *.bmp. Zarówno na wydrukach, jak i w okienkach mogą pojawić się zniekształcenia — należy używać nieskompresowanych bitmap *.bmp. 28 Ustawienia użytkownika Podczas pracy na końcówce dopuszcza się dowolne przemieszczanie okien przez użytkownika. Po zakończeniu działania informacje o rozmiarach i położeniach okien zapisane są w pliku tekstowym. Dla klienta jTerm nazwa tego pliku to nazwa systemu poprzedzona ciągiem znaków ”ju-” z dodaną końcówką .ini np. ju-kali.ini. Plik będzie umieszczony w katalogu, który wynika z deklaracji ścieżek. W pliku zapisane są informacje o każdym podzbiorze okien, który pojawił się na ekranie. Dla każdej rozdzielczości ekranu prowadzona jest oddzielna ewidencja. Po ponownym uruchomieniu systemu, każde okienko będzie pojawiać się w miejscu, którego współrzędne są zapisane w pliku, zależnym od rozdzielczości i okienek, które są aktualnie na ekranie. Dla klienta jTerm rozdzielczość ekranu może być ustawiana w pliku jterm_12.30.ini (powinien się znajdować w katalogu MacroBASE w katalogu roboczym systemu operacyjnego). Jeśli parametr dpi z sekcji [!Screen] nie ma przypisanej wartości, to rozdzielczość ekranu pobierana jest z systemu. Jeśli jest ona niepoprawna (za małe czcionki), można ją wpisać w pliku. Im większa będzie wartość, tym czcionki będą większe. Przykładowy wpis może wyglądać: [!Screen] dpi = 96 Ponadto w pliku *.ini aplikacji dla użytkownika umieszczana jest również informacja o następujących elementach: — dołączonych przez użytkownika przyciskach na listwie narzędziowej, — rodzaju i wielkości czcionki W omawianym pliku można zmodyfikować parametr z sekcji [!Czcionka], wskazujące czcionkę, która ma być używana przez program. Dla przykładu zmodyfikowanie linii [!Czcionka] Czcionka = Verdana, 10 0, N 143 144 Rozdział III. Architektura systemu spowoduje, że będzie wykorzystywana czcionka o nazwie Verdana i rozmiarze 10. Czcionkę (typ, krój i wielkość) można zmieniać konwersacyjnie z poziomu programu (menu Okno, funkcja Ustawienia użytkownika). Do wyboru dostępne są czcionki niesymboliczne o rozmiarach od 1 do 72. Domyślne wartości przyjmowane są z ustawień systemu operacyjnego (czcionka zdefiniowana dla menu), — ogólnych ustawieniach dla wszystkich okienek – liczbie kolumn, jaką możemy dodać do okienka wertowania – dymkach podpowiedzi — możemy określić czy w programie mają pokazywać się podpowiedzi (dymki) z wartością lub opisem pola. Przypisując parametrowi wartość 0 można wyłączyć tę funkcjonalność, – sposobie kopiowania do schowka zawartości okienek wertowania i redagowania – edycji pól typu data — dla pól typu data, do których nie ma przypisanych formuł Klawisz F3, wyświetlenia okienka z historią wprowadzanych danych, pojawia się kontrolka z kalendarzem, umożliwiająca konwersacyjne wskazanie stosownej daty. Istnieje możliwość wyłączenia tej funkcjonalności, poprzez zmianę wartości parametru z 1 na 0, – kolorach strzałki kolejności i wyróżnienia rekordów — Wskazujemy kolor, w jakim są wyświetlane zaznaczenia kolumny, która ustala kolejność w okienku wertowania i kolor wyróżnienia rekordów. Po znaku # wypisywane są po dwie cyfry szesnastkowe, określające kolejne współrzędne RGB, – sposobie prezentacji okienek — Max = 1 oznacza, że okienka programu będą zmaksymalizowane Powyższe parametry definiujemy w sekcji [!Okno]. Domyślnie ma ona postać: [!Okno] Maksymalna liczba dodawanych kolumn = 10 Dymki dostępne = 1 Kolor wyróżniania rekordów = #00ffff Kolor strzałki kolejności = #00ffff Parametry schowka = 0 1 1 III.28. Ustawienia użytkownika Kalendarz przy redakcji daty = 1 Max = 0 Wszystkie parametry z wyjątkiem dotyczącego maksymalizacji okien, można modyfikować konwersacyjnie z poziomu programu (menu Okno, funkcja Ustawienia użytkownika). — ustawieniach Debuggera Możemy zmienić czcionkę i kolory używane w debuggerze oraz sposób zatrzymywania (przed lub po instrukcji). Użytkownik korzystający z końcówki jTerm ma możliwości modyfikacji ustawień stylu wyglądu okienek aplikacji oraz zakładek aplikacji otwieranych w tej samej sesji klienta. Definiowalne parametry odpisywane są w pliku w sekcji [!Layout] i mogą przyjmują postać: [!Layout] appTabsPermanent = true closeProgWithLastTab = true l&f = Macrologic theme = Macrologic gdzie: appTabsPermanent po przyjęciu wartości true pasek zakładek jest wyświetlany zawsze, również dla jednej otwartej aplikacji, closeProgWithLastTab po przyjęciu wartości true zamknięcie ostatniej zakładki z aplikacją zamyka klienta jTerm, l&f okeśla wyglądu okienek aplikacji, może przyjąć wartości: System (dostępny tylko dla systemu Windows — okienka aplikacji będą miały wygląd dziedziczony z ustawień systemu), Ocean (kolorystyka niebieska), Macrologic (kolorystyka pomarańczowa), theme temat. Zmiana tych ustawień będzie obowiązywać po ponownym uruchomieniu programu jTerm. Podczas wywołania programu skojarzonego z plikiem w wersji jTerm działającej w systemie Linux, przeszukiwany jest plik jterm_12.30.ini. Jeśli 145 146 Rozdział III. Architektura systemu będzie w nim sekcja odpowiadająca rozszerzeniu pliku, to będą w niej wyszukiwane wartości open i edit. Jeśli takich wpisów nie ma, to zostanie zadane pytanie o wybór programu skojarzonego. Oprócz ścieżki do programu należy podać przekazywane argumenty (spacje oddzielają kolejne argumenty, zaś napis %s oznacza ścieżkę dostępu do otwieranego pliku). Wpisany program z argumentami wywołania zostaje zapisany w pliku jterm_12.30.ini do wartości open lub edit w zależności od użytej funkcji: bl_view, sys_exec z trzecim argumentem różnym od 2 (bez zastępowania oryginału) — przypisują wywołanie do wartości open. Przy otwieraniu w pierwszej kolejności poszukują wpisu open, a jeśli go nie ma — wpisu edit, bl_edit, sys_exec z trzecim argumentem równym 2 (z zastępowaniem oryginału), w pierwszej kolejności poszukują wpisu edit, a jeśli go nie ma — wpisu open. [*.jpg] open = /usr/bin/eog %s Po uruchomieniu programu skojarzonego plikiem z oczekiwaniem na zakończenie (zarówno do przeglądania, jak i redagowania) w okienku z informacją o tym, dostępny jest przycisk, umożliwiający przerwanie oczekiwania. W przypadku redagowania, po wybraniu przycisku plik zostanie niezwłocznie odesłany. Dodatkowo można określić minimalny czas działania uruchomionego programu skojarzonego. Jeśli program zakończyłby się w krótszym czasie, to w aplikacji pojawi się informacja o tym. Może to być szczególnie istotne np. dla programu Word — jeśli był już wcześniej uruchomiony, to kolejne wywołanie poprzez sys_exec zakończy się niemal natychmiast, zaś plik będzie można redagować w procesie wcześniej już uruchomionym. Po pojawieniu się ostrzeżenia, można zapisać redagowany plik, zaś po zatwierdzeniu komunikatu, plik zostanie odesłany. Działanie powyższe jest jednak niewskazane dla programów, które się szybko kończą i nie przekazując zadań do innych procesów (np. wywołanie programu skojarzonego z plikiem *.jar). Dlatego można również podać rozszerzenia plików, dla których wspomniany powyżej dialog nie będzie się pojawiał. Oba parametry określa się w pliku jterm_12.30.ini w sekcji [!SystemExec]. Znaczenia ich są następujące: processExecTime przypisana liczba oznacza liczbę sekund jaką musi się wykonywać uruchomiony program, aby nie było komunikatu z ostrzeżeniem. Domyślną wartością jest 2, III.29. Zapisywanie warunków dla okienek wertowania noMsgExtensions w przypisanej wartości umieszcza się listę rozszerzeń (kolejne oddzielone od siebie znakiem średnika). Dla uruchomionych programów dla plików o wskazanych rozszerzeniach nie będzie pojawiało się ostrzeżenie, jeśli program wykona się krócej niż wskazana w parametrze processExecTime liczba sekund. Domyślną wartością argumentu jest jar, czyli domyślnie dla uruchomionych programów napisanych w Javie, nie będzie ostrzeżeń. Pliki *.ini aplikacji jak i jTerma kodowane są w standardzie UTF-8. 29 Zapisywanie warunków dla okienek wertowania Po wybraniu zaznaczania warunkowego w okienku wertowania dostępna jest możliwość zapisania utworzonego warunku i wczytania jednego z wcześniej zapisanych. Zapisanie warunku będzie możliwe po utworzeniu poprawnego warunku, wpisaniu jego nazwy i wybraniu przycisku Zapisz. Podanie zapisanej wcześniej nazwy warunku spowoduje zastąpienie obecnego warunku zapisanym. Zapamiętane warunki będą dostępne w okienku, niezależnie od kontekstu, w jakim się pojawi. Warunki są zapamiętywane pomiędzy sesjami dla okienek stałych oraz tymczasowych nazwanych. Jeśli pole użyte w warunku zmieni swój typ, od czasu zapisania (np. dokonano transferu systemu lub dotyczy innej tabeli tymczasowej), to warunek taki jest automatycznie usuwany. Dla okienek tymczasowych nienazwanych, zapisane warunki są pamiętane tylko w obrębie sesji. Po wywołaniu zaznaczania warunkowego, wstępnie warunek będzie wypełniany tak, jak ostatnio wywołany w danym kontekście okienek. Treść warunków zapamiętywana jest w pliku o nazwie takiej, jak nazwa systemu, z końcówką cnd. Zapisywany jest zgodnie z deklaracją ścieżek w pliku *.pth. Dodatkowo dodano skrót klawiszowy (ctrl-W) do wywołania akcji zaznaczania warunkowego w okienku. Zaleca się używania innej kopii pliku *.cnd przez każdego użytkownika (np. poprzez poprzedzenie znakiem > linii w deklaracji ścieżek). Uniknie się wtedy po zapisie kasowania warunków utworzonych przez innych użytkowników, 30 Autoraporty Autoraporty umożliwiają w szybki sposób przygotowanie zestawienia z danych wyświetlanych w oknie wertowania. W raporcie znajdą się wartości wszystkich zaznaczonych rekordów w kolejności widocznej w okienku. Jeśli nie ma 147 148 Rozdział III. Architektura systemu zaznaczonych rekordów, raport uwzględni tylko bieżący rekord. Kreator raportów można uruchomić funkcją w menu Okno pozycją Konstruktor autoraportów lub przyciskiem na pasku narzędziowym. Pierwsze wywołanie autoraportu dla danego okienka zawsze otwiera okno konstruktora, kolejne wywołania będą rozwijać menu, z którego można uruchomić kreatora bądź zapisane raporty. Konstruktor autoraportów służy do definiowania nowych raportów lub modyfikacji istniejących. W pierwszej kolejności do raportu pobierane są kolumny z części wertowania (również te dodane w oknie), a następnie pola wolne. Kolejność pól w raporcie, podobnie jak szerokość i treść nagłówka można zmieniać a ich domyślne wartości pobierane są z okienka. Dla pól liczbowych można dodatkowo utworzyć podsumowanie (po każdej stronie i na końcu wydruku). Format wyjściowy raportu ustala się na zakładce Ustawienia. Dostępne formaty raportów to: — wydruk na drukarkę lub ekran, — plik CSV (dane oddzielone przecinkiem), — plik tekstowy (dane oddzielone tabulacją), — plik tekstowy (dane oddzielone wybranym separatorem), — plik HTML, — plik XHTML, — plik XML, — plik PDF. Oprócz tego dostępne są opcje: — dwa układy autoraportu: tabelaryczny i kolumnowy, — formatowanie liczb daty i czasu w raporcie: takie jak w oknie lub zgodne z ustawieniami Windows, — krój, styl i rozmiar czcionki, — numerowanie wierszy raportu, — tytuł sprawozdania, — orientacja papieru, III.31. Parametry wydruków — czy wyświetlać w stopce numery stron, — czy wyświetlać w stopce datę i czas wykonania autoraportu, — czy po eksporcie danych do pliku uruchomić aplikację skojarzoną z danym typem pliku. Opcja ta dostępna jest tylko dla końcówek pracujących w środowisku Windows. W zależności od wybranego formatu raportu nie wszystkie opcje mogą być w nim uwzględniane i dostępne (np. nie ma znaczenia wielkość i krój czcionki dla formatu tekstowego). Jeżeli w środowisku serwera aplikacji (Windows, Linux), czcionka wybrana przez użytkownika z listy dostępnych na komputerze klienta nie będzie dostępna, zostanie ona zastąpiona przez czcionkę domyślną (Helvetica). Zdefiniowany raport można zapisać aby był dostępny w przyszłości. Służy do tego funkcja Zapisz jako w konstruktorze. Każdy wykonany raport jest też automatycznie zapisywany jako ostatnio wykonany autoraport. Można go, jak każdy inny zapisany raport, wykonać ponownie lub zmienić w kreatorze. Definicje autoraportów są zapisywane w pliku o nazwie takiej, jak nazwa aplikacji z rozszerzeniem .aut. Jego lokalizacja jest ustalana na podstawie wpisu w pliku deklaracji ścieżek *.pth. Jeśli od momentu zapisu definicji raportu zostaną usunięte kolumny dodane wcześniej przez użytkownika lub zmieni się definicja okienka w ten sposób, że użyte pole w raporcie zmieni typ lub zostanie usunięte z okienka, to raport nie będzie mógł zostać wykonany — zostanie zgłoszony błąd. Raport będzie znów dostępny, jeśli doda się brakujące pola albo uruchomi kreatora. Po wczytaniu raportu, błędne pola będą z niego usunięte. Podobna sytuacja ma miejsce, gdy na pola zostanie nałożona ochrona przed odczytem w systemie MacroPASS. Jeśli pole jest chronione przed odczytem formułą przed wyświetleniem, to na wydruku będą one wykropkowane, podobnie jak podsumowania, w których skład takie pola wchodzą. 31 Parametry wydruków Dla końcówek windowsowych ustawienia parametrów wykonywanych wydruków zapisywane są w pliku printer.ini. Dla wersji pracujących poprzez serwer aplikacji jest tworzony i przechowywany wyłącznie w katalogu z kopiami. Pamiętane są następujące wartości: — nazwa drukarki na którą przesyłany był wydruk, 149 150 Rozdział III. Architektura systemu — nazwa sterownika, — ustawienia marginesów, — ustawienie papieru (orientacja pozioma lub pionowa), — rozmiary okienka do przeglądania wydruku, — domyślne powiększenie — tryb wydruku (tekstowy lub graficzny) Parametry dla każdego sprawozdania są zapisywane po wydruku w sekcji o nazwie [system_sprawozdanie]. Przy kolejnym wykonaniu sprawozdania program odczytuje parametry z odpowiedniej sekcji. Można je zmienić w panelu wydruku, jeśli panel jest dostępny. 32 Dziennik systemu Jeśli zależy nam na kontrolowaniu dostępu do danych oraz zachowaniu historii modyfikacji wybranych danych, możemy posłużyć się mechanizmem dziennika systemowego. Po wywołaniu metody syslog każde dodanie, usunięcie, zapisanie rekordu lub modyfikacja jego licznika będzie powodowało wpis do tabeli o akronimie SYSLOG. Mogą w niej również być zapisywane wszystkie akcje rejestrowania i wyrejestrowania użytkowników systemu. Należy w tym celu, przed wygenerowaniem definicji systemu w programie MacroBUILDER, ustawić pole Dziennik systemu na T (jest to wartość domyślna). Można tam również określić długość pola opisu dziennika systemu. Dopuszczalne wartości to liczby od 50 do 900 (domyślnie 50). W przypadku zmiany tej wartości w istniejącym systemie wymagany będzie transfer. Tabela SYSLOG jest tabelą maskowaną z możliwym do wyboru sposobem nadawania nazw zbiorom: 0log???? pierwsze dwa znaki zapytania są zastępowane numerem miesiąca, zaś ostatnie dwa — dwoma ostatnimi cyframi roku. 1l?????? pierwsze cztery znaki zapytania będą zastępowane przez ostatnie dwie cyfry roku i numer miesiąca. Dodatkowe dwa znaki będą rozwijane na numer maski w obrębie miesiąca (00 dla pierwszej 01 dla drugiej, aż do 99 dla setnej). Nowa maska w obrębie miesiąca będzie otwierana wtedy, III.32. Dziennik systemu gdy zapis do wcześniejszej jest niemożliwy (rozmiar pliku *.mdb osiągnął maksymalny rozmiar lub w masce jest już maksymalna dopuszczalna liczba rekordów). W przypadku zmiany maski tabeli z 0log???? na 1l?????? transfer rozpozna tę operację jako zmiana nazwy tabeli. W celu przeniesienia danych do nowej wersji, należy dla każdego z wypisanych zbiorów wykonać transfer z opcją -n. Innych parametrów struktury tabeli SYSLOG nie można modyfikować, gdyż jest ona niedostępna na liście tabel systemu i dodawana do definicji systemu w trakcie jej generowania. Dostępne są następujące pola: COMMAND (STRING[8]) rodzaj wykonywanej operacji, DBF (STRING[8]) maska tabeli której dotyczyła operacja, DESCR (STRING[nn]) historia zmian wartości wskazanych pól, Długość pola nn podajemy jako parametr generowania definicji systemu, MUTATCOD (STRING[10]) nazwa użytkownika wykonującego operację, MUTATSOR (REAL) znacznik czasowy operacji, sortowanie według tego pola zapewnia chronologiczność zdarzeń, MUTATDAT (DATE) data zdarzenia, MUTATTIM (TIME) czas zdarzenia, RECNO (INTEGER) numer modyfikowanego rekordu. W polu DESCR zapisywane są wartości pól podanych jako argumenty wywołania metody syslog. Wartości poszczególnych pól będą oddzielane od siebie znakiem |. W dzienniku rejestrowane są następujące zdarzenia (wartości z pola COMMAND): 151 152 Rozdział III. Architektura systemu del usunięcie rekordu z tabeli, dodatkowo w polu DESCR zapisywane są wartości wskazanych pól usuniętego rekordu, add dodanie rekordu do tabeli, dodatkowo w polu DESCR zapisywane są wartości wskazanych pól dodanego rekordu, bput modyfikacja rekordu tabeli (również zmiana wartości licznika odwołań do rekordu), dodatkowo w polu DESCR zapisywane są wartości wskazanych pól sprzed modyfikacji, put modyfikacja rekordu tabeli (również zmiana wartości licznika odwołań do rekordu), dodatkowo w polu DESCR zapisywane są nowe wartości wskazanych pól, bmem_put modyfikacja treści notatki (dodanie, usunięcie lub modyfikacja), dodatkowo w polu DESCR zapisywany będzie początek notatki sprzed operacji poprzedzany akronimem modyfikowanego pola notatki memo_put modyfikacja treści notatki, dodatkowo w polu DESCR zapisywany będzie początek nowej wartości notatki, memo_del usunięcie rekordu z niepustą notatką, dodatkowo w polu DESCR zapisywany będzie początek notatki przypisanej do usuwanego rekordu poprzedzany akronimem pola notatki. create wywołanie metody erase dla tabeli inlog zarejestrowanie użytkownika w systemie outlog wyrejestrowanie użytkownika z systemu Historia zmian będzie dostępna po wywołaniu formuły SYSLOG.select. Zakończenie rejestrowania zmian nastąpi po wywołaniu metody syslog bez III.33. Wykorzystanie bibliotek zewnętrznych argumentów. Zmiana rejestrowanych pól — po wywołaniu z inną listą argumentów. Przy pomocy funkcji syslogop istnieje możliwość modyfikacji sposobu rejestrowania zmian w tabeli SYSLOG. Przy rejestrowaniu w tabeli SYSLOG rozkazów inlog oraz outlog pole RECNO będzie wypełniane wynikiem: ses_info(SYSLOG.ses_id, ’log_num’) czyli numerem użytkownika w serwerze bazy danych, zaś pole DESCR wynikiem SYSLOG.ses_id. Wypełnianie pól można wyłączyć (czyli działanie będzie takie jak we wcześniejszej wersji) po przypisaniu parametrowi sys_log_1122 w pliku konfiguracyjnym aplikacji (lub macro.cfg) wartości 1. Domyślną wartością argumentu jest 0. Posługując się obiektem SQL ze standardowych bibliotek, w łatwy sposób możemy na przykład sprawdzić kto w ostatnim czasie rejestrował się w systemie. Zapytanie SQL pokazujące rejestrowania do systemu może mieć następującą postać: select MUTATCOD as Użytkownik, MUTATDAT as Data, MUTATTIM as Czas from SYSLOG where COMMAND=’inlog’ 33 Wykorzystanie bibliotek zewnętrznych Istnieje możliwość wywoływania funkcji zawartych w bibliotekach ładowanych dynamicznie (zbiorach *.dll dla serwera aplikacji pod Windows albo klasy MacroDll zapisanej w pliku *.jar dla końcówki jTerm). Wywoływane funkcje muszą mieć specyficzny zestaw argumentów, dlatego do wywołania funkcji z istniejących bibliotek będzie trzeba stworzyć nowy moduł, pośredniczący przy przekazywaniu parametrów i wyniku pomiędzy klientem serwera aplikacji (ewentualnie serwerem aplikacji oraz grubym klientem) a funkcją biblioteczną. Dla serwera aplikacji uruchomionego pod systemem Linux funkcje do obsługi bibliotek ze zbiorów *.dll nie wykonują żadnych akcji, ich wynikiem jest zawsze liczba 0 (dotyczy wywołań przez sterownik ODBC oraz graficznego klienta serwera aplikacji, gdy biblioteka nie jest poprzedzona znakiem @). Do obsługi biblioteki z poziomu języka Formula+ służą poniższe funkcje: 153 154 Rozdział III. Architektura systemu lib_load włączenie biblioteki dynamicznej lib_decl deklaracja funkcji bibliotecznej lib_call wywołanie funkcji z biblioteki lib_free usunięcie włączonej biblioteki 33.1 Tworzenie bibliotek dll Deklarowana funkcja biblioteczna musi mieć dokładnie dwa argumenty, z których pierwszy jest typu int, zaś drugi jest wskaźnikiem. Przy wywołaniu funkcji, program tworzy strukturę o rozmiarze przekazanym w pierwszym parametrze. Można tę wartość użyć przy uruchamianiu programu, dla sprawdzenia, czy rozmiar zadeklarowanej struktury w języku programowania jest równy rozmiarowi struktury utworzonej przed wywołaniem funkcji. Pierwsze pole struktury odpowiada wynikowi funkcji, zaś kolejnymi polami są pola odpowiadające kolejnym argumentom. Struktura ma zatem takie typy pól, jakie były podane w wywołaniu lib_decl, z przypisanymi wartościami z argumentów wywołania. Wskaźnik do tak utworzonej struktury jest przekazywany do funkcji bibliotecznej poprzez drugi argument. Jeśli w ładowanej bibliotece jest eksportowana funkcja o nazwie LibLoad, to zostanie ona automatycznie wywołana. Do funkcji przekazany będzie jeden parametr, będący uchwytem (wartością typu HWND) okienka programu. Wartość tę można wykorzystać do ustawienia okienka nadrzędnego dla okienek, które pojawiają się w wyniku wywołań funkcji z biblioteki. Jeśli biblioteka ładowana jest na serwerze aplikacji, to do funkcji przekazana będzie wartość 0. W przykładzie umieszczonym poniżej, w funkcji LibLoad jako okienko programu zostaje przypisane okienko aplikacji, z której wywoływana zostaje biblioteka. Dzięki temu, dialog do wyboru czcionki, który pojawia się po wywołaniu GetFont, będzie związany z tym samym okienkiem, co aplikacja. Bez funkcji LibLoad pojawiało by się nowe okienko na listwie zadań. Wywołana funkcja biblioteczna może korzystać z przekazywanych argumentów, nie może jednak ich usuwać. Przed zakończeniem działania funkcja powinna wpisać zwracany wynik do pierwszego pola struktury. Łatwo zauważyć, że do wywołania funkcji z bibliotek dostępnych w systemie Windows, potrzebne będzie napisanie nowej biblioteki, która będzie po- III.33. Wykorzystanie bibliotek zewnętrznych średniczyć przy przekazaniu parametrów i pobraniu wyniku. Dla przykładu, jeśli chcielibyśmy umożliwić w języku Formula+ konwersacyjny wybór czcionki przy pomocy standardowego dialogu windowsowego, to możemy to uczynić pisząc następującą bibliotekę w języku Delphi: library font; uses SysUtils, Dialogs, Classes, Forms, Windows; var FontDialog: TFontDialog; type TCallSS = record Result: PChar; Param1: PChar; end; PCallSS = ˆTCallSS; procedure GetFont( size: Integer; ParRec: PCallSS); stdcall; begin FontDialog.Font.Name:= ParRecˆ.Param1; if FontDialog.Execute then ParRec.Result:= PChar(FontDialog.Font.Name) else ParRec.Result:= #0; end; procedure LibLoad(Handle: HWND); stdcall; begin Application.Handle:= Handle; end; exports GetFont, LibLoad; begin FontDialog:= TFontDialog.create(Nil); end. Typ TCallSS opisuje strukturę dla funkcji zwracającej wartość typu STRING (dla udostępnionej funkcji GetFont będzie to nazwa wskazanej 155 156 Rozdział III. Architektura systemu czcionki) oraz przyjmującej jeden parametr typu STRING (dla GetFont będzie to początkowa nazwa czcionki w dialogu). Utworzoną bibliotekę z powyższego programu możemy wykorzystać na przykład w formule Klawisz F3 dla pola, w którym użytkownik ma podać nazwę czcionki, którą ma być sporządzone sprawozdanie: _lib:=lib_load(’mbutil.dll’,1); {? _lib=0 || return(˜˜) ?}; _fnt:=lib_decl(_lib,,’char *’,’GetFont’,’char *’); _wyn:=lib_call(_fnt, fld()); lib_free(_lib); {? _wyn=’’ || ˜˜ || _wyn ?} 33.2 Tworzenie bibliotek jar Wywołanie funkcji obsługujących biblioteki zewnętrzne (lib_*) ma inne znaczenie w przypadku końcówki jTerm. Biblioteka ładowana lokalnie odnosić się będzie nie do zbioru *.dll, tylko do klasy MacroDll zapisanej w pliku *.jar. Wywołanie funkcji lib_load ma w takim przypadku postać: lib_load(nazwa,1) Jeśli nazwa nie zawiera rozszerzenia, to będzie doklejone .jar. Jeśli ma rozszerzenie .dll, to zostanie zamienione na .jar Plik *.jar będzie wyszukiwany zgodnie z deklaracją ścieżek. Jeśli ładowana klasa wykorzystuje inne, niesystemowe pakiety (pliki *.jar niedostarczane z dystrybucją Javy), to powinny być one umieszczone w katalogu ext, utworzonym w katalogu lib, znajdującym się w katalogu z instalacją jTerma lub skopiowane do katalogu roboczego programu (wynik funkcji tmp_dir). Wywołanie lib_decl ma identyczną postać. Oznacza, że w programie będzie można używać metody o podanej nazwie z klasy MacroDll. Funkcja lib_decl deklaruje użycie funkcji z biblioteki dynamicznej, która może być wywołana z programu. Wskazana funkcja w przypadku biblioteki *.dll musi mieć dokładnie dwa argumenty wywołania: — pierwszy to liczba całkowita, określająca rozmiar struktury przekazanej poprzez drugi parametr, — drugi, to wskaźnik do struktury, w której będą przekazywane argumenty wywołania funkcji z poziomu języka Formula oraz zwracany wynik. III.33. Wykorzystanie bibliotek zewnętrznych 157 W przypadku biblioteki *.jar funkcja musi mieć wynik i argumenty takie, jakie wynikają z argumentów lib_decl (począwszy od trzeciego). Do funkcji lib_decl poprzez pierwszy argument przekazuje się uchwyt do biblioteki zwrócony przez funkcję lib_load. Jako drugi argument (alignment) oznaczający wyrównanie wartości w strukturach, można przekazać jedną z liczb: 1, 2, 4, 8. Dla biblioteku *.jar paramter jest ignorowany. Domyślną wartością jest 4. Należy podać liczbę wykorzystywaną przez kompilator jako wartość wyrównania (alignment). Dla przykładu w języku Delphi może być konieczne podanie wartości 8 oznaczającej, że liczby rzeczywiste są umieszczane w rekordach tylko od adresów podzielnych przez 8. Obecnie, jeśli nie stosuje się argumentów typu rzeczywistego, to domyślna wartość 4 powinna być zawsze dobra. Trzeci argument (res_type) określa typ zwracanego wyniku. Dopuszczalne wartości to: ’void’, ’int’, ’unsigned’, ’double’, ’char *’. Dla bibliotek *.dll odpowiadają typom o takich samych nazwach z języka C. Typ void oznacza brak zwracanej wartości, czyli odpowiada procedurom z języka Pascal. Argument typu char * może zawierać jedynie znaki ze standardu Mazovii — wszystkie pozostałe znaki zostaną zastąpione przez znak zapytania (’?’). W przypadku biblioteki *.jar znaczenie jest następujące: ’char *’ typ String lub byte[] w javie, jednak z ograniczeniem, że wszystkie argumenty funkcji typu char * oraz wynik (o ile jest też typu char *) muszą być jednakowego typu w javie. Jeśli w deklaracji klasy będą dwie metody spełniające ten warunek, to wybrana będzie tak, której wszystkie argumenty i wynik typu char * odpowiadają typowi String. Jeśli funkcja ma argumenty lub wynik typu: String konwersja odbywa się przy założeniu, że argument funkcji lib_call ma polskie znaki zapisane w stronie kodowej windows-1250, zaś wszystkie pozostałe w standardzie mazovii. Znaki spoza standardu mazovii zostaną zastąpione przez znaki zapytania. Podobnie w wyniku funkcji wywołanej w javie będzie konwertowany do standardu windows-1250 dla polskich liter oraz do standardu mazovii dla pozostałych znaków. W przypadku błędu konwersji (np. w wyniku będzie znak, który nie jest polską literą i nie występuje w standardzie mazovii), funkcja dll_call zakończy się błędem, byte [] argument jest zamieniany na tablicę bajtów (kolejne bajty, to kody ascii kolejnych znaków napisu), bez żadnej konwersji. Wynik funk- 158 Rozdział III. Architektura systemu cji również zamieniany jest bez konwersji, zaś kolejne znaki napisu, to kolejne bajty zwracanego wyniku. Jeśli któryś znak w zwracanej tablicy ma wartość 0, to zwracany napis będzie skrócony do pierwszego wystąpienia takiego znaku, ’int’ lub ’unsigned’ typ int w javie, ’double’ typ double w javie. Dodatkowo dostępny jest typ napisowy ’String’. Różni się on od typu ’char *’ inną konwersją argumentu przekazywanego do biblioteki zewnętrznej i zwracanego wyniku oraz innej obsłudze za długich tekstów: — do bibliotek *.jar można przekazać dowolne napisy, argumenty będą przekazane jako kodowane w UTF-8. W wyniku nie mogą znaleźć się ki nieobsługiwane przez program (spoza tablicy zwracanej przez supp_chr) — w przeciwnym przypadku wywołanie zakończy się błędem, — w argumentach przekazywanych do bibiotek *.dll i w zwracanym wyniku wszystkie znaki spoza standardu Mazovii zamieniane są na znak zapytania. Dodatkowo, polskie znaki są konwertowane ze standardu Mazovii do standardu Windows-1250, zaś w wyniku ze standardu Windows-1250 do standardu Mazovii, — jeśli któryś z argumentów lub wynik typu napisowego przekracza 3072 bajty, to po zgłoszeniu błędu przerywane jest wykonywanie formuły. Dla typu char * dłuższy napis w wyniku jest obcinany do 3072 znaków i wykonywanie formuły nie jest przerywane. Domyślną wartością jest ’int’. Wartość wyniku musi być wpisana przez funkcję do pierwszego pola struktury z argumentami (w przypadku *.dll) lub zwracana przez metodę (w przypadku biblioteki *.jar). Czwarty argument (name), to nazwa funkcji (lub metody klasy MacroDll) udostępnionej w bibliotece. Kolejne argumenty określają typy kolejnych argumentów przekazywanych do funkcji (ich wartości będą wpisane do struktury wskazywanej przez drugi argument funkcji bibliotecznej (biblioteka *.dll) lub przekazywane wprost do metody (biblioteka *.jar)). Mogą przyjmować wartości opisane przy zwracanym wyniku, z pominięciem typu ’void’. Jeśli III.33. Wykorzystanie bibliotek zewnętrznych 159 nie zostanie podany żaden typ przekazywanego argumentu, to oznaczać to będzie, że funkcja jest bezargumentowa. Wynikiem funkcji jest uchwyt (liczba) identyfikująca funkcję biblioteczną, do wykorzystania w wywołaniach funkcji lib_call. Zwrócona wartość 0 oznacza, że nie udało się zadeklarować funkcji o podanej nazwie. Dla przykładu, wywołanie: lib:=lib_load(’functions.dll’,1); {? lib=0 || msg(’Błąd załadowania biblioteki functions’) || matchlib:=lib_decl(lib,,’int’,’match’,’String’, ’String’) ?}; wymaga zadeklarowania w klasie MacroDll metody o schemacie: public int match(String text, String patt) Wartość drugiego argumentu lib_decl (wyrównanie w strukturach) nie ma w przypadku metod pisanych w Javie znaczenia. Wywołania i znaczenia lib_call oraz lib_free są identyczne: wynik:= lib_call(matchlib, ’Tekst’, ’wzór’); lib_free(lib) pierwsza wywołuje metodę match z argumentami ’Tekst’ i ’wzór’, druga usuwa bibliotekę. W momencie wywołania lib_load wołany jest konstruktor klasy MacroDll z parametrem typu Frame. Jako argument przekazywany będzie obiekt będący ramką działającego programu jTerm (można ten argument wykorzystywać później do wskazywania elementu nadrzędnego w dialogach). Zatem w deklaracji klasy musi być konstruktor (np. o pustej treści) typu: public MacroDll(Frame pParent) { } Jeśli funkcja lib_load będzie ładowała po raz kolejny tę samą bibliotekę (bez wcześniejszego zwolnienia poprzez wywołanie lib_free), to nowy obiekt nie będzie tworzony. Zwrócony zostanie uchwyt (nowy numer) do utworzonego wcześniej obiektu. Biblioteka zostanie zwolniona dopiero po zwolnieniu wszystkich uchwytów (poprzez wywołania lib_free). Jako przykład utworzymy plik functions.jar zawierający w klasie MacroDll metodę match sprawdzającą, czy wzorzec (wyrażenie regularne 160 Rozdział III. Architektura systemu przekazane jako drugi argument) dopasowuje się do tekstu przekazanego poprzez pierwszy argument. Błąd w wyrażeniu regularnym będzie zasygnalizowany komunikatem ekranowym. Tworzymy plik MacroDll.java o zawartości: import java.awt.*; import javax.swing.*; import java.util.regex.*; public class MacroDll { private Frame jTerm = null; public MacroDll(Frame pParent) { jTerm = pParent; } public int match(String text, String patt) { Boolean m = false; try { m = text.matches(patt); } catch (PatternSyntaxException e) { JOptionPane.showMessageDialog(jTerm, "match: błąd w wyrażeniu regularnym"); } if (m) return(1); else return(0); } } kompilujemy go: javac MacroDll.java i tworzymy plik functions.jar: jar cvf functions.jar *.class Poniższy fragment programu usunie wszystkie rekordy z tabeli S, które w polu tekstowym LICZBA zawierają inne znaki niż cyfry: III.34. Wykorzystanie kontrolek w oknach 161 lib:=lib_load(’functions.dll’,1); {? lib=0 || msg(’Błąd załadowania biblioteki functions.dll’) || matchlib:=lib_decl(lib,,’int’,’match’,’char *’, ’char *’) ?}; match:=" lib_call(matchlib, _a, _b) "; S.for_each(" {? ˜match(S.LICZBA, ’ˆ[0-9]*$’) || S.del ?} ") 33.3 Biblioteka MacroLAF.jar W programach pisanych w Javie i kompilowanych wersją kompilatora co najmniej 1.6, w celu ustawienia tego samego wyglądu (LookAndFeel) jaki jest ustawiony w programie jTerm (na podstawie pliku jterm_12.30.ini) można wykorzystać biblioteki MacroLAF.jar oraz ini4j.jar. Należy wówczas zaimportować bibliotekę: import pl.macrologic.laf.*; i przed powołaniem pierwszego obiektu GUI wywołać: LookAndFeelManager.changeLookAndFeel(); Podczas wywołania programu biblioteki MacroLAF.jar oraz ini4j.jar dostarczane z jTermem muszą się znajdować na ścieżce wyszukiwania. 34 Wykorzystanie kontrolek w oknach Istnieje rodzaj okienka, w którym można umieścić kontrolkę. Kontrolka jest to obiekt specjalnej klasy tworzony w języku Java, zawierającej elementy dialogowe. Zatem w utworzonym okienku mogą znaleźć się np. przyciski, pola redagowania, wykresy (i inne elementy możliwe do oprogramowania w Javie). Z kontrolki można wywołać procedury w Formuli+. Czyli np. po wybraniu przycisku może pojawić się okienko wertowania jakiejś tabeli. Po wywołaniu formuły, kontrolka może dalej wykonywać swoje zadania (np. wyświetlać bieżącą godzinę w okienku). Nie może natomiast, do czasu zakończenia formuły, wywołać kolejnej. Możliwe jest też wywoływanie metod kontrolki umieszczonej 162 Rozdział III. Architektura systemu w okienku wyświetlanym w programie instrukcjami języka Formula+. Oprócz wywołania wprost metody z podanymi argumentami typów prostych, można też przekazać do kontrolki obiekt zawierający dane z tabeli. Możliwe jest również przenoszenie rekordów na aktywne okienko z kontrolką. W wywoływanej formule, oprócz standardowych danych dostępnych w funkcji dnd_info, będą dostępne również dodatkowe, zdefiniowane w kontrolce. Zestaw klas i metod użytecznych przy pisaniu kontrolek w języku Java znajduje się w pomocy javahelp. 34.1 Przykład kontrolki Jako przykład skonstruujemy kontrolkę, w której wyświetlana jest bieżąca godzina. Dodatkowo są dwa przyciski. Metoda NewColor zmienia kolor wyświetlanej godziny. Poniższa formuła tworzy i wyświetla okienko z kontrolką, w którym: — po wybraniu przycisku w kontrolce, wykonywana jest stosowna formuła, wykorzystująca przekazany argument z kontrolki, — po wybraniu pozycji z menu Kolor wywoływana jest metoda kontrolki zmieniająca kolor wyświetlanego tekstu, — po wybraniu pozycji Zamknij, zamykane jest okienko z kontrolką na skutek wywołania funkcji sel_exit. _win_acr:=KATAL.mk_ctr(’Czas’,’ctrl_czas’,1,1,60,6); KATAL.win_ctr(_win_acr); KATAL.win_cctr(_win_acr, ’ctr_id’,’ControlExample:example’); KATAL.win_cfml(_win_acr, ’ctr_id’,’CONTROL_CALLBACK’," {? ctr_info(’param’) = ’syslog’ || SYSLOG.select || msg ?} "); KATAL.win_act(_win_acr,,’Menu’,’Kolor’,,,,,,,,); KATAL.win_act(_win_acr,,’Formuła’,’Czerwony’,’Kolor’,," ctr_call(,’ctr_id’, ’NewColor’, ’RED’) ",,,,,); KATAL.win_act(_win_acr,,’Formuła’,’cZarny’,’Kolor’,," ctr_set(,’ctr_id’, ’NewColor’, ’BLACK’) ",,,,,); KATAL.win_act(_win_acr,,’Formuła’,’Zamknij’,,,"sel_exit",,,,,); KATAL.control() Plik example.desc ma zawartość: [control] files=dll/kontrolki.jar III.34. Wykorzystanie kontrolek w oknach 163 Zaś w pliku kontrolki.jar z klatalogu dll (względem pliku example.desc) znajduje się klasa o nazwie ControlExample, której kod źródłowy jest przytoczony poniżej. import import import import import import import import import import java.awt.BorderLayout; java.awt.Color; java.awt.Component; java.awt.Font; java.awt.Graphics; java.awt.Graphics2D; java.awt.event.ActionEvent; java.awt.event.ActionListener; java.text.SimpleDateFormat; java.util.Calendar; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.Timer; import import import import import import pl.macrologic.jterm.control.WindowControl; pl.macrologic.jterm.control.WindowControlCallback; java.awt.event.KeyAdapter; java.awt.event.KeyEvent; java.awt.event.KeyListener; pl.macrologic.jterm.control.WindowControlFocusTraversalPolicyProvider; public class ControlExample extends WindowControl { class CtrlPanel extends JPanel implements WindowControlFocusTraversalPolicyProvider {}; KeyListener buttonKeyListener = new KeyAdapter() { public void keyPressed(KeyEvent e) { if (KeyEvent.VK_ESCAPE==e.getKeyCode() || KeyEvent.VK_TAB==e.getKeyCode()) { getWindowControlCntx().processKeyPressed(e); } } }; public Component getComponent() { return panel; } public Object getFormulaInterface() { return this; } class FontPanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; Font f = new Font("Serif", Font.BOLD, 36); g2.setFont(f); g2.setColor( act_color ) ; g2.drawString(message, 10, 30); } } private private private private String message = ""; Color act_color = Color.YELLOW; JPanel panel = new CtrlPanel(); JButton button = new JButton("SYSLOG.select"); 164 Rozdział III. Architektura systemu private JButton button2 = new JButton("msg"); private FontPanel panelf = new FontPanel(); public void init() { super.init(); ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent event) { Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("H:mm:ss"); message = sdf.format(cal.getTime()); panel.repaint(); } }; final Timer t = new Timer(300, listener); panel.setLayout(new BorderLayout()); JPanel buttonPanel = new JPanel(); buttonPanel.setFocusable(false); panel.add(buttonPanel, BorderLayout.NORTH); panel.add(panelf, BorderLayout.CENTER); buttonPanel.add(button); buttonPanel.add(button2); panelf.setFocusable(false); panel.setFocusable(false); t.start(); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { WindowControlCallback callback = getWindowControlCallback(); try { callback.resetParamsInfo(); callback.addParamInfoString("param", "syslog"); callback.callFormulaAction(ControlExample.this,true, null); } catch (Exception ex) { } } }); button.addKeyListener(buttonKeyListener); button2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { WindowControlCallback callback = getWindowControlCallback(); try { callback.resetParamsInfo(); callback.addParamInfoString("param", "msg"); callback.callFormulaAction(ControlExample.this,true, null); } catch (Exception ex) { } } }); button2.addKeyListener(buttonKeyListener); } public void NewColor(String s) { if (s.equals("RED")){ act_color = Color.RED; } else if (s.equals("BLACK")) { act_color = Color.BLACK; }; panel.repaint(); }; } III.34. Wykorzystanie kontrolek w oknach 34.2 Przykład przesyłania danych W przykładzie okienko z kontrolką zastanie umieszczone w oknie grupowym. Po wybraniu z menu okienka pozycji Tabela zostanie pobrana tabela z rekordami utworzonymi w kontrolce, zaś wynik wyświetlony w okienku wertowania. Z kolei po przeniesieniu rekordów z okienka wertowania nad okienko kontrolki, zostaną one przesłane do kontrolki i wyświetlone: _win_acr:=SYSLOG.mk_ctr(’’,’dnd_ctrl2’,1,1,100,40); SYSLOG.win_ctr(_win_acr); SYSLOG.win_cctr(_win_acr,’ctrl_tab’,’Table:example’); SYSLOG.win_act(_win_acr,0,’Formuła’,’Tabela’,,’Lista towarów’,""," _tab:=ctr_call(,’ctrl_tab’,’getTableData’ ); _win_acr:=_tab.mk_sel(,,1); _tab.win_sel(_win_acr); _tab.select "); SYSLOG.dnd_ctr(_win_acr,’ctrl_tab’, ’records.SYSLOG’, " _rec:= dnd_info(’dropped_records’); _wyn:= sql(’ select MUTATCOD Użytkownik, COMMAND Operacja from syslog where 1=0 ’); {? _rec.first || {!|? SYSLOG.seek(_rec.REF,); _wyn.UŻYTKOWN:= SYSLOG.MUTATCOD; _wyn.OPERACJA:= SYSLOG.COMMAND; _wyn.add; _rec.next !} ?}; ctr_tab(’SYSLOG_data’,,’ctrl_tab’,’’,_wyn, ’UŻYTKOWN’, ’OPERACJA’); ctr_set(,’ctrl_tab’,’initData’, ’SYSLOG_data’) "); _g:= SYSLOG.grp_make(," ctr_tab(’SYSLOG_init’,’:syslog_dnd’,’ctrl_tab’,’’, sql(’ select MUTATCOD Użytkownik, COMMAND Operacja from syslog where 1=0 ’), ’UŻYTKOWN’, ’OPERACJA’); ctr_set(,’ctrl_tab’,’initData’, ’SYSLOG_init’) "); SYSLOG.win_sel(_g); SYSLOG.grp_sel(_g,,’SYSLOGS’,,,,,15,,,,,’maximized’); SYSLOG.grp_splt(_g,,’horizontal’,’p’,); SYSLOG.grp_ctr(_g,,_win_acr,’syslog_dnd’,,,,,,10,,,,’maximized’); SYSLOG.select Poniżej kod używanej kontrolki: import import import import import import import import import import java.awt.BorderLayout; java.awt.Component; java.awt.dnd.DnDConstants; java.awt.dnd.DropTarget; java.awt.dnd.DropTargetListener; java.awt.event.KeyAdapter; java.awt.event.KeyEvent; java.awt.event.KeyListener; java.awt.event.MouseAdapter; java.awt.event.MouseEvent; 165 166 Rozdział III. Architektura systemu import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import import import import import import pl.macrologic.jterm.comunication.Worker; pl.macrologic.jterm.control.WindowControlFocusTraversalPolicyProvider; pl.macrologic.jterm.control.WindowControl; pl.macrologic.jterm.control.data.MBDataSet; pl.macrologic.jterm.control.data.MacroBaseTable; pl.macrologic.jterm.control.data.MacroBaseTable.ObjToFieldsMap; public class Table extends WindowControl{ class JCtrlPanel extends JPanel implements WindowControlFocusTraversalPolicyProvider {} KeyListener tableKeyListener = new KeyAdapter() { public void keyPressed(KeyEvent e) { if (KeyEvent.VK_ESCAPE==e.getKeyCode() || KeyEvent.VK_TAB==e.getKeyCode()) { getWindowControlCntx().processKeyPressed(e); } } }; JPanel panel = new JCtrlPanel(); JTable table = null; private DropTargetListener dropTargetListener = new DropTargetListener (){ public void dragEnter(java.awt.dnd.DropTargetDragEvent dtde) { getWindowControlCntx().getStdDropTargetListener().dragEnter(dtde); }; public void dragExit(java.awt.dnd.DropTargetEvent dte) { getWindowControlCntx().getStdDropTargetListener().dragExit(dte); }; public void dragOver(java.awt.dnd.DropTargetDragEvent dtde) { getWindowControlCntx().getStdDropTargetListener().dragOver(dtde); }; public void drop(java.awt.dnd.DropTargetDropEvent dtde) { getWindowControlCntx().getStdDropTargetListener().drop(dtde); }; public void dropActionChanged(java.awt.dnd.DropTargetDragEvent dtde) { getWindowControlCntx().getStdDropTargetListener().dropActionChanged(dtde); }; }; public Component getComponent() { return panel; } public void init() { super.init(); panel.setFocusable(false); panel.setLayout(new BorderLayout()); table = new JTable(); table.addKeyListener(tableKeyListener); JScrollPane scrollPane = new JScrollPane(table); table.setFillsViewportHeight(true); panel.add(scrollPane, BorderLayout.CENTER); new DropTarget(table, DnDConstants.ACTION_LINK, dropTargetListener); table.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { final MouseEvent event = e; getWindowControlCntx().processMousePressed(e, new Worker() { @Override III.34. Wykorzystanie kontrolek w oknach public void process() { table.dispatchEvent(event); } }); super.mousePressed(e); } }); } public Object getFormulaInterface() { return this; } public void initData(String sourceName) { MBDataSet model = getWindowControlData().getDataSet(sourceName); table.setModel(model); table.repaint(); } public MacroBaseTable getData(String sourceName) { MBDataSet model = getWindowControlData().getDataSet(sourceName); try { return model.getMacroBaseTable(); } catch (Exception e) { e.printStackTrace(); return null; } } public static class Towar { public Towar(String n, int l) { nazwa = n; liczba = l; } public String getNazwa() { return nazwa; } public int getLiczba() { return liczba; } private String nazwa; private int liczba; } public MacroBaseTable getTableData() throws Exception { MacroBaseTable mbt = new MacroBaseTable(false); mbt.addField("NAZWA", MacroBaseTable.String, 20); mbt.addField("LICZBA", MacroBaseTable.Integer, 0); ObjToFieldsMap mapPoint = mbt.createTypeMaping(Towar.class, null); mapPoint.mapGetter("NAZWA", "getNazwa"); mapPoint.mapGetter("LICZBA", "getLiczba"); mbt.addRow(new Towar("Książki", 10)); mbt.addRow(new Towar("Zeszyty", 5)); mbt.addRow(new Towar("Ołówki", 7)); return mbt; } } 34.3 Kontrolki dostarczane z systemem W katalogu w którym został zainstalowany jTerm znajduje się katalog o nazwie controls, zaś w nim katalogi z kontrolkami dostarczanymi z systemem. 167 168 Rozdział III. Architektura systemu W każdym z katalogów znajduje się plik z rozszerzeniem .desc o takiej samej nazwie, jak nazwa katalogu. Dostarczane kontrolki można dodawać do okienek metodą win_cctr, umieszczając znak @ przed nazwą pliku z opisem. Kontrolka filechooser W każdym systemie dostępna jest kontrolka z metodami umożliwiającymi użytkownikowi wskazywanie plików. Użycie metod nie wymaga tworzenia okienka z kontrolką. W wywoływaniu funkcjami ctr_set lub ctr_call należy podać jako pierwszy argument wartość ’!application’, zaś jako drugi ’filechooser’. Szczegółowe informacje dotyczace użycia kontrolki dostępne są w podręczniku Jezyk FORMULA+. Kontrolka filelistpanel Kontrolka pozwala na wyświetlanie nazw plików w postaci ikon lub listy. Umożliwia wykonywanie akcji dla zaznaczonych elementów oraz upuszczonych poprzez akcję drag and drop. Listę plików można dowolnie modyfikować. Pliki o przekazanych nazwach nie muszą istnieć, zaś ikonka przy nazwie pliku jest wyświetlana na podstawie rozszerzenia. Szczegółowe informacje dotyczace użycia kontrolki dostępne są w podręczniku Jezyk FORMULA+. Kontrolka webbrowser Kontrolka spełnia funkcje przeglądarki internetowej. Można ją umieścić w okienku za pomocą metody win_cctr, podając jako argument trzeci argument wartość ’@webbrowser’. Kontrolka nie może być jednak użyta w okienku grupowym. Próba wstawienia do okna grupowego okienka z kontrolką webbrowser zakończy się błędem. Pod Linuxem do działania przeglądarki konieczna jest biblioteka xulrunner w wersji 1.9.2. Nie można zatem użyć kontrolki w systemie UBUNTU w wersji 11.10 — przeglądarka w programie nie będzie wtedy dostępna. Właściwości przeglądarki można ustawić następującymi metodami kontrolki: navigate przyjmuje jeden argumenty typu napisowego, będący adresem strony do wyświetlenia, setHTMLContent przyjmuje jeden argumenty typu napisowego, będący źródłem strony do wyświetlenia, III.34. Wykorzystanie kontrolek w oknach setButtonBarVisible ustala, czy przyciski w przeglądarce będą dostępne. Przyjmuje jeden argument typu STRING, który może przyjąć jedną z wartości: ’true’ przyciski nawigacyjne będą wyświetlane w przeglądarce, ’false’ przyciski nie będą dostępne (podobnie jak dla innych wartości poza ’true’), setLocationBarVisible ustala, czy pole z adresem w przeglądarce będzie dostępne. Przyjmuje jeden argument typu STRING, który może przyjąć jedną z wartości: ’true’ pole z adresem będzie wyświetlane w przeglądarce, ’false’ pole z adresem nie będą dostępne (podobnie jak dla innych wartości poza ’true’), setStatusBarVisible ustala, czy linia statusu przeglądarce będzie dostępna. Przyjmuje jeden argument typu STRING, który może przyjąć jedną z wartości: ’true’ inia statusu będzie wyświetlana w przeglądarce, ’false’ linia statusu w przeglądarce nie będzie widoczna (podobnie jak dla innych wartości poza ’true’), pageLoadingProgress pobiera procent załadowania strony do wyświetlenia. Wynikiem jest liczba całkowita z przedziału od 0 do 100. Jeśli strona jest w całości odczytana, to wynikiem będzie 100, getCookie pobiera wartość ciasteczka. Do metody należy przekazać dwa argumenty: url adres strony (np. ’http://www.witryna.pl/relacje/spolka.html’), name nazwa ciasteczka (np. user), 169 170 Rozdział III. Architektura systemu Wynikiem będzie zapisana wartość ciasteczka. Jeśli wskazanego ciasteczka nie ma, to wynik będzie pustym napisem, setCookie ustawia wartość ciasteczka. Wymagane są dwa argumenty napisowe: url adres strony (np. ’http://www.witryna.pl/relacje/spolka.html’), value wartość ustawianego ciasteczka. Np. dla ciasteczka odczytywanego w przykładzie powyżej może mieć wartość ’user=MacroBASE; expires=Fri, 24 Sep 2038 08:46:30 GMT’ Przykładowo, po poniższych instrukcjach powinno się ukazać okienko z przeglądarką z otwartą stroną www.macrologic.pl. Powinny być dostępne przyciski i pasek nawigacji oraz linie statusu. Dodatkowo, po wciśnięciu klawisza Esc, okienko powinno zostać zamknięte: _win_acr:=SYSLOG.mk_ctr(’Strona’,’ctrl_webbrowser’); SYSLOG.win_ctr(_win_acr); SYSLOG.win_cctr(_win_acr, ’ctr_id’,’@webbrowser’); SYSLOG.control(,," ctr_set(,’ctr_id’, ’setButtonBarVisible’, ’true’); ctr_set(,’ctr_id’, ’setLocationBarVisible’, ’true’); ctr_set(,’ctr_id’, ’setStatusBarVisible’, ’true’); ctr_set(,’ctr_id’, ’closeAfterEscape’, ’true’); ctr_set(,’ctr_id’, ’navigate’, ’www.macrologic.pl’) ") 35 Weryfikacja licencji Podczas pierwszego uruchomienia programów użytkowych oraz serwera bazy danych użytkownik zostanie poproszony o wpisanie klucza i danych typu nazwa firmy, adres itp. Zestawy kluczy są dostarczane wraz z oprogramowaniem i są unikalne dla każdej kopii oprogramowania. Bez podania poprawnego klucza możliwe jest uruchomienie jedynie wersji demonstracyjnej programu. Funkcjonalnie nie różni się ona od wersji użytkowej ale może zapisać ograniczoną ilość danych. Po przekroczeniu dozwolonego limitu będzie się pojawiał stosowny komunikat informujący o zaprzestaniu zapisu danych do bazy. III.35. Weryfikacja licencji 171 Pierwsze pytanie o klucz pojawi się w trakcie uruchomienia serwera bazy danych jako aplikacji lub, w przypadku systemów Windows NT/2000/2003/2008/XP/Vista/7, instalacji usługi MacroBASE. Po podaniu poprawnego klucza powinien zostać utworzony plik server.nfo. Serwer bazy danych w systemie Linux uruchamia się w trybie demo, jeśli nie ma pliku server.nfo lub wpisany klucz stracił ważność. Wprowadzenie klucza będzie możliwe po uruchomieniu serwera z opcją -i. Należy przy tym użyć dodatkowo te same parametry, co przy standardowym uruchomieniu serwera. Dla wersji linuxowej możliwe jest uruchomienie z opcją -i w trakcie działania serwera. Wprowadzony klucz będzie obowiązywał od ponownego uruchomienia serwera. Po upłynięciu 10 dni od terminu ważności klucza Xpertis SERVERA, serwer startuje w trybie demonstracyjnym (również w wersji windowsowej). W zależności od typu systemu operacyjnego plik server.nfo znajduje się on odpowiednio: — dla systemu Linux w katalogu z plikami konfiguracyjnymi (ścieżka podana po parametrze -p przy uruchamianiu serwera bazy danych), — dla systemu Windows w katalogu roboczym serwera bazy danych (ścieżka podana po parametrze -w w trakcie instalacji usługi MacroBASE), Następnie uruchamiamy program użytkowy. Pojawi się podobny dialog jak poprzednio ale z weryfikacją kluczy klienta a następnie konkretnej aplikacji. Po wpisaniu klucza i zatwierdzeniu powinny się utworzyć dwa pliki z rozszerzeniem nfo. Są to odpowiednio client.nfo i plik o nazwie identycznej jak nazwa aplikacji którą uruchamiamy, czyli np. kali.nfo. Ich położenie można określić w deklaracji ścieżek (plik *. pth) programu. Jeśli nie ma tam zdefiniowanej ścieżki dla typu *.nfo to będzie to katalog bieżący pliku *.pth. Jeżeli przy uruchomieniu kolejnych programów, w katalogu wskazanym w deklaracji ścieżek istnieje już plik client.nfo, od razu pojawi się weryfikacja aplikacji. Wszystkie klucze (serwera, klienta i aplikacji) można wprowadzać również z końcówki, po uruchomieniu aplikacji. Przeznaczone do tego funkcje znajdują się w pozycji O programie z menu Pomoc. Tam też pojawiają się informacje o aktualnych wersjach, numerach seryjnych i datach ważności. Klucz serwera dotyczy serwera bazy danych, który pierwszy otwierał tabelę. Oznacza to, że dla serwera komunikacyjnego nie da się wprowadzić kluczą tą metodą (czyli serwera uruchamianego na tym samym komputerze co serwer aplikacji w przypadku, gdy serwer bazy danych działa na innym komputerze). Nowe klucze będą obowiązywały po ponownym uruchomieniu programu, którego dotyczą. Nie potrzeba kasować istniejących plików *.nfo — po podaniu kluczy zostaną zastąpione nowymi. 172 Rozdział III. Architektura systemu Wśród rodzajów licencji możemy wyróżnić dwa o nieco innej chrakterystyce: bezterminowe data wygaśnięcia licencji nie jest określona, w polu ważny do jest wyświetlana wartość bezterminowo, wersja do użytku służbowego Macrologic SA pracownicy (do użytku wewnętrznego) będą mogli używać produktów o numerach seryjnych PRACnnnnnn. Wystąpienie wersji pracowniczej w którymkolwiek elemencie (serwer, klient, aplikacja) spowoduje wyświetlanie się odpowiedniej informacji na pasku stanu klienta. W zależności od wpisanego klucza przy instalacji serwera bazy danych, w inny sposób mogą być liczone użycia licencji. W pierwszym z warriantów, jeśli operator w ramach tej samej instancji jTerm-a uruchamia jako ten sam użytkownik tę samą aplikację, to zużywany jest tylko jeden dostęp licencyjny, niezależnie czy jest to Otwórz, czy Otwórz ponownie. Pozostałe dostępy wliczane są do puli poza licencją. W drugim wariancie połączenia z wszystkich zakładek uruchomionego jTerm-a będą zużywały licencje na jedno stanowisko. W podawanej przez serwer bazy danych liście użytkowników za numerem procesu klienta doklejany jest w nawiasach kwadratowych numer używanej licencji. Czyli wszystkie połączenia z zakładek jTerm-a przy drugim sposobie liczenia zużycia licencji będą miały ten sam numer licencji. W przypadku pierwszego sposobu liczenia zużycia licencji ten sam numer będzie tylko dla połączeń z tych zakładek, które są do tej samej aplikacji, z podaniem takiej samej nazwy użytkownika. Połączenia poprzez mbasic (czyli w szczególności ODBC), MacroCGI oraz uruchomienie systemu MacroBUILDER za numerem procesu będą miały doklejone [0] — nie zużywają żadnej wykupionej licencji w serwerze bazy danych. W konsoli serwera aplikacji w okienku z aktywnymi użytkownikami prezentowane jest drzewko — w węzłach numer dostępu (zużywanej licencji). Po rozwinięciu dostępna jest lista połączeń korzystających z tego dostępu. III.36. Sterownik ODBC dla MacroBASE 36 Sterownik ODBC dla MacroBASE 36.1 System operacyjny Windows W pakiecie MacroBASE dostępny jest sterownik ODBC w wersji 32 oraz 64bitowej. Zaimplementowano w nim część funkcji dotyczących pobierania danych oraz możliwość uruchamiania procedur wbudowanych. Umożliwia to korzystanie z danych systemów w technologii MacroBASE w trybie ”tylko do odczytu” przez programy działające w środowisku Windows. Poprzez ODBC można pobierać pola typu: STRING, DATE, TIME, TREE_REF, INTEGER, REAL, REFERENCE, BLOBIMAGE, BLOBRAW oraz SYS_MEMO, o ile znajdą się na liście wynikowej zapytania SQL. Nie można jednak pobrać danych typu MEMO. Za pośrednictwem procedur wbudowanych możliwe jest również modyfikowanie danych. W szczególności możliwy jest import danych do programu Microsoft Excel, zadawanie zapytań poprzez program Microsoft Query, tworzenie sprawozdań w programach Microsoft Access i Crystal Reports na podstawie połączonych tabel. Sterownik ODBC łączy się z bazą danych poprzez bibliotekę mbasic.dll. Przy uruchomieniu połączenia ODBC wykonywana jest formuła startowa systemu (z pominięciem funkcji pomijanych przez mbasic.dll). Ewentualne dialogi, pojawią się tylko wtedy, gdy program korzystający ze sterownika jest programem okienkowym. Po zakończeniu formuły startowej wywoływana jest automatycznie formuła lock_tim(20) — maksymalny czas oczekiwania na zablokowany zasób wynosi 20 sekund. Można zmienić podany czas poprzez zdefiniowanie zmiennej obiektowej o nazwie ODBCInfo z polem lock_tim. Jeśli do pola będzie przypisana wartość liczbowa, to zostanie ona użyta przy wywołaniu lock_tim zamiast domyślnej wartości 20. Wszystkie zawracane przez sterownik wartości tekstowe są konwertowane ze standardu Mazovii na standard windows-1250. Dotyczy wartości rekordów, jak również akronimów tabel i pól. Z kolei treści zapytań przekazywanych do sterownika są konwertowane ze standardu windows-1250 na standard Mazovii. Zatem w programach wykorzystujących sterownik ODBC wszystkie teksty powinny być pisane w standardzie windows-1250. Praca z danymi poprzez ODBC jest możliwa na trzech poziomach uprawnień: Brak dostępu użytkownicy nie będą mieli prawa dostępu do bazy danych poprzez sterownik ODBC, 173 174 Rozdział III. Architektura systemu Procedury wbudowane dostęp do danych poprzez ODBC będzie możliwy wyłącznie poprzez procedury wbudowane. Próba pobrania danych w inny sposób zakończy się błędem, Bez ograniczeń dopuszczalne są wszystkie sposoby dostępu do danych poprzez ODBC. Ewentualne ograniczenia mogą wynikać z ustawionych niezależnie ochron tabel lub procedur wbudowanych. W celu zainstalowania sterownika w systemie Windows należy wywołać polecenie: insmodbc.exe -i dla wersji 32-bitowej, lub insmodbc64.exe -i dla wersji 64-bitowej. Należy zwrócić uwagę aby katalogiem bieżącym wywołania powyższego polecenia był katalog zawierający plik modbc.dll. W wersji pod Windows domyślnie instalowane są dwie wersje sterownika ODBC: MacroBASE sterownik w wersji UTF-16, MacroBASE_UTF-8 wersja sterownika dla programów nie pracujących w trybie UTF-16. Dla programów wykorzystujących JODBC w Javie konieczne jest wybranie tego sterownika. Dodatkowo konieczne jest ustawienie strony kodowej na UTF-8. W wersjach 64-bitowych systemów operacyjnych instalowane są sterowniki zarówno w wersji 32 jak i 64-bitowej. W celu zainstalowania tylko sterownika w wersji 32 bitowej można użyć opcji -d. Możliwa jest instalacja sterownika pod Windows z zachowaniem sterownika z poprzedniej wersji. Dzieje się tak po wywołaniu programu instalującego sterownik z opcją -v. Zainstalowane zostaną wtedy dwa sterowniki o nazwach: MacroBASE_{ver} i MacroBASE_{ver}_UTF-8, gdzie {ver} będzie zastąpione numerem wersji. Sterowniki odpowiadają funkcjonalnie wcześniej omówionym. Z kolei, do odinstalowania sterownika służy polecenie: III.36. Sterownik ODBC dla MacroBASE insmodbc.exe -u dla wersji 32-bitowej, lub insmod64.exe -u dla wersji 64-bitowej. Po zainstalowaniu sterownika ODBC można przystąpić do zdefiniowania źródła danych. Przy dodawaniu nowego źródła należy wybrać sterownik o nazwie MacroBASE. W okienku, które się pokaże, należy wpisać nazwę źródła. Podawanie nazwy użytkownika i hasła na tym etapie nie jest konieczne. Dostępne są też trzy opcje o następującym znaczeniu: Zapisz hasło hasło zostanie zapamiętane w źródle, opcji należy używać tylko wtedy, gdy z komputera korzysta tylko jeden użytkownik lub nasze źródło należy do grupy źródeł użytkownika, Bezpieczne uwierzytelnianie zaznaczenie tej opcji powoduje, że wpisanie hasła w okienku z parametrami źródła jest niemożliwe. Dopiero po uruchomieniu aplikacji korzystającej z tego źródła, hasło jest weryfikowane w standardowym dialogu. Dzięki temu możemy zapobiec zapisywaniu hasła jawnym tekstem do plików wynikowych przez niektóre aplikacje korzystające z tego źródła danych (np. Excel). Nie należy tej opcji używać, jeżeli ze źródła danych ma korzystać np. program napisany w PHP, ponieważ w tej sytuacji niemożliwe jest wyświetlanie dialogu i uwierzytelnianie nie powiedzie się, Karta domyślnym sposobem uwierzytelniania będzie karta SmartCard. Opcja jest dostępna po wcześniejszym wyborze bezpiecznego uwierzytelniania. Następnie należy wskazać plik z deklaracją ścieżek systemu, którego dane mają być dostępne przez sterownik. Druga możliwość, to zaznaczenie opcji Serwer aplikacji. W takiej sytuacji sterownik będzie pobierał dane poprzez serwer aplikacji. Należy wtedy wypełnić pola dotyczące nazwy systemu, adresu serwera, grupy, z której pochodzi aplikacja oraz numeru wykorzystywanego portu. W przypadku gdy połączenie ma być szyfrowane, należy zaznaczyć opcję Ścieżka do pliku z certyfikatem dla połączenia SSL a w polu poniżej wskazać wspomnianą ścieżkę. Po zatwierdzeniu, źródło danych będzie dostępne dla programów. 175 176 Rozdział III. Architektura systemu Przypuścmy, że na końcówce Windows XP, na której działa Xpertis z opcją ”cienki klient” chcemy zaimportować dane kontrahentów z Warszawy. Serwer aplikacji działa na komputerze o numerze IP 172.27.172.10 i standardowym porcie 5580. Nie ma też zdefiniowanej żadnej grupy aplikacji i nie jest wymagane szyfrowanie połączenia. Możemy to zrealizować za pomocą sterownika ODBC w następujący sposób: 1. instalujemy sterownik ODBC poprzez wykonanie polecenia: insmodbc.exe -i 2. Nastepnie definiujemy nowe źródło danych: — w Panelu sterowania wybieramy Narzędzia administracyjne i następnie Źródła danych (ODBC), — wybieramy zakładkę Plikowe DSN, a następnie przycisk Dodaj, — wskazujemy MacroBASE i wybieramy przycisk Dalej, — wpisujemy nazwę Fiks i wybieramy przycisk Dalej, a w następnym okienku Zakończ — w kolejnym okienku, które się pokaże (o tytule ODBC MacroBASE), wybieramy opcję Serwer aplikacji, co powinno uaktywnić część okna poniżej. Uzupełniamy pola: – Nazwa systemu — wpisujemy fiks – Adres serwera — wpisujemy 172.27.172.10 W pozostałych polach tej sekcji zostawiamy wartości domyślne. Wypełniamy też oczywiście pola Użytkownik i Hasło. W celu sprawdzenia poprawności zdefiniowanego źródła można skorzystać z dostępnego przycisku Test połączenia. Po jogo wybraniu następuje próba połączenia z systemem. Jeśli zakończy się pomyślnie, to zostanie wyświetlony komunikat Test źródła danych zakończony powodzeniem. W przypadku problemów z połączeniem, zostaną wyświetlone stosowne komunikaty o błędach. 3. uruchamiamy program Excel i wybieramy z menu Dane/Pobierz dane zewnętrzne/Utwórz nową kwerendę III.36. Sterownik ODBC dla MacroBASE 4. po wybraniu źródła danych fiks i podaniu hasła do aplikacji, uruchomi się program MS Query. Teraz korzystając z kreatora można wybrać tabelę KH, wskazać żądane pola i podać stosowny warunek. Wynik zapytania będzie przesłany potem do programu Excel. Przy kolejnych pobieraniach danych do programu Excel wykonuje się dwa ostatnie kroki. A oto przykład użycia sterownika ODBC w skryptach PHP. W wyniku działania poniższego skryptu utworzona zostanie tabela z wynikiem zapytania SQL. W nagłówku tabeli znajdą się akronimy pól. Wartości typów nienapisowych są wyrównywane do prawej strony oczka tabelki. Nazwy kolumn, typ danych oraz kolejne wartości rekordów są pobierane poprzez funkcje udostępniane przez sterownik. W nagłówku zwracana jest strona kodowa windows-1250. W przypadku innej strony kodowej należy zadbać o przekonwertowanie pobieranych wartości. Skrypt wykorzystuje źródło danych nazwane fiks, rejestrując się na użytkownika szef z hasłem szef. <?php header("Content-type: text/html; charset=windows-1250"); $sql=" select miasto, count(naz) liczba from kh group by miasto order by 2 desc, 1"; ?> <body> <H1>Wynik zapytania</H1> <HR> <?php $conn=odbc_connect(’fiks’,’szef’,’szef’); if (!$conn) { exit("Connection Failed: " . $conn); } $rs=odbc_exec($conn,$sql); if (!$rs) { exit("Error in SQL"); } 177 178 Rozdział III. Architektura systemu echo "<table border=\"1\"><tr>"; $tab=1; while ($tab <= odbc_num_fields($rs)){ echo"<th>",odbc_field_name($rs,$tab),"</th>"; $tab++; } while (odbc_fetch_row($rs)) { echo "<tr>"; for ($tab=1;$tab<=odbc_num_fields($rs);$tab++) { $value = odbc_result($rs,$tab); if ($value == "") $value = " "; if (odbc_field_type($rs,$tab) == "STRING") echo "<td>", $value, "</td>"; else echo"<td align=\"right\">",$value,"</td>"; } echo "</tr>"; } odbc_close($conn); echo "</table>"; ?> </body> Dla przykładu poniżej został zamieszczony program w Javie, wykorzystujący źrodło danych syslog ze sterownikiem z końcówką nazwy UTF-8 i ustawiający stronę kodową UTF-8: import java.sql.*; import java.util.*; import javax.swing.*; public class odbc_example { public static void main(String[] args) { try { String url = "jdbc:odbc:syslog"; Properties p = new Properties(); p.put("user", "szef"); p.put("password", "szef"); p.put("charSet", "UTF-8"); III.36. Sterownik ODBC dla MacroBASE 179 Connection connection = DriverManager.getConnection(url, p ); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT count(*) LICZBA FROM SYSLOG"); resultSet.next(); JOptionPane.showMessageDialog( null, resultSet.getObject("LICZBA"), "Rozmiar tabeli SYSLOG", JOptionPane.PLAIN_MESSAGE); statement.close(); connection.close(); } catch ( SQLException sqlException ) { JOptionPane.showMessageDialog( null, sqlException.getMessage(), "Database Error", JOptionPane.ERROR_MESSAGE ); System.exit( 1 ); } } } 36.2 Sterownik ODBC dla MacroBASE w systemie Linux W pakiecie MacroBASE dostępny jest sterownik ODBC dla systemów Linux (w wersji 32 oraz 64 bitowej) współpracujący z menadżerem unixODBC. Umożliwia on korzystanie z danych systemów MacroBASE przez programy działające w środowisku Linux. W szczególności możliwy jest dostęp do danych z poziomu programów dostępnych w pakiecie OpenOffice oraz przez skrypty pisane w języku PHP. Poprzez ODBC można pobierać pola typu: STRING, DATE, TIME, TREE_REF, INTEGER, REAL, REFERENCE, BLOBIMAGE, BLOBRAW oraz SYS_MEMO, o ile znajdą się na liście wynikowej zapytania SQL. Nie można jednak pobrać danych typu MEMO. Sterownik może łączyć się z serwerem aplikacji działającym na innej maszynie (zarówno pod Windows, jak i pod Linux)lub bezpośrednio z serwerem bazy danych — w takim przypadku, musi być uruchomiony na tym samym komputerze. Sposób zapisu polskich znaków określa się na podstawie ustawień językowych (polecenie locale). Interpretowane są dwa standardy kodowania — UTF-8 oraz ISO-8859-2. Dla źródła danych wykorzystującego połączenie z serwerem aplikacji, sterownik wywołuje program MacroAppBASIC (dla wersji bez serwera aplikacji jest to program MacroBASIC). 180 Rozdział III. Architektura systemu 36.2.1 Instalowanie sterownika (wersja 32-bitowa) Przed przystąpieniem do instalacji należy zadbać, aby w systemie był obecny menadżer unixODBC. Jeśli nie jest dostarczony z systemem operacyjnym, to należy pobrać go ze strony http://www.unixodbc.org i zainstalować zgodnie z instrukcją producenta. Zainstalowanie sterownika w systemie Linux polega na uruchomieniu skryptu install_driver.sh (domyślnie znajduje on się w podkatalogu server/run katalogu instalacji) przez administratora systemu (użytkownik root) lub innego użytkownika, mającego prawa do zapisu dla pliku odbcinst.ini (jego położenie można sprawdzić poleceniem odbcinst -j). Wpływ na umiejscowienie pliku ma zmienna środowiskowa ODBCSYSINI, wskazująca katalog, w którym plik jest wyszukiwany. Jeśli domyślny katalog został zmieniony przy instalacji sterownika, to zmienna powinna być tak samo zdefiniowana dla każdego programu, który wykorzystuje sterownik. Program musi mieć wtedy prawa do czytania pliku odbcinst.ini. Wywołanie ma postać: sh install_driver.sh driver_name driver_desc gdzie — driver_name określa nazwę sterownika, — driver_desc, jest komentarzem. Skrypt ten oprócz zainstalowania sterownika, utworzy także dwa pliki dsn.ini i as_dsn.ini — szablony definicji źródła danych. Właścicielem będzie właściciel zbioru libmodbc.so (czyli sterownika). Pliki te będą potrzebne do definiowania źródeł danych. 36.2.2 Definiowanie źródeł danych Do zdefiniowania źródła danych użytkownika nie potrzeba już uprawnień administratora systemu — może je definiować administrator bazy danych. Źródła danych widoczne dla wszystkich musi jednak definiować administrator systemu. W takim przypadku, każdy użytkownik, który korzysta ze źródła, musi mieć dostęp do czytania pliku sterownika (libmodbc.so). Pierwszą czynnością jaką należy wykonać, jest uzupełnienie szablonu (pliku dns.ini dla wersji bez serwera aplikacji i pliku as_dsn.ini dla wersji z serwerem aplikacji). Należy w nich przypisać zmiennym po znaku = wartości parametrów. Należy zwrócić uwagę, że po znaku równości nie może być spacji, a jeśli 181 III.36. Sterownik ODBC dla MacroBASE wartość parametru zawiera znaki specjalne (np. spacje lub znak $), to wartość argumentu należy umieścić pomiędzy znakami apostrofu. Dla pliku dsn.ini należy określić wartości poniższych parametrów. DSN_NAME nazwę źródła danych, np. DSN_NAME=fiks USER_DSN wartość 1, jeśli źródło danych ma być dostępne tylko dla użytkownika, który je instaluje lub 0, jeśli ma być dostępne dla wszystkich jeśli dla wszystkich, np. USER_DSN=1 PTH ścieżka do pliku z deklaracją ścieżek systemu (*.pth), np. PTH=/Xpertis/pth/fiks.pth dodatkowo, można przypisać wartości do zmiennych USER_NAME oraz USER_PWD, oznaczające odpowiednio domyślną nazwę użytkownika i hasło, np. USER_NAME=szef USER_PWD=’s$f54-PL’ Dla pliku as_dsn.ini, nie definiuje się parametru PTH. Definiuje się natomiast parametry: DSN_NAME, USER_DSN oraz: ASNAME nazwa aplikacji, np. ASNAME=fiks ASGROUP grupa, do której należy aplikacja, np. ASGROUP=default, ASADDRESS adres TCP/IP komputera ASADDRESS=Xpertis, z serwerem aplikacji, ASPORT port używany przez serwer aplikacji, np. ASPORT=5580. np. 182 Rozdział III. Architektura systemu Dodatkowo, jeśli serwer aplikacji ma włączoną obsługę połączeń SSL, to należy podać ścieżkę do pliku z certyfikatem, przypisując ją do parametru ASCERTPTH. W celu zainstalowania nowego źródła danych należy po wpisaniu odpowiednich wartości w pliku, wywołać odpowiednio: sh install_dsn.sh dsn.ini lub sh install_dsn.sh as_dsn.ini W celu odinstalowania sterownika lub źródła danych należy posłużyć się programem odbcinst z pakietu unixODBC. 36.2.3 Przykład instalacji Przypuśćmy, że chcemy połączyć się pod Linuxem poprzez sterownik ODBC z systemem fiks, zainstalowanym w domyślnej grupie na komputerze o nazwie Xpertis. Zakładamy, że serwer aplikacji wykorzystuje domyślny port do komunikacji. W tym celu, w katalogu z programami wykonawczymi (tam, gdzie znajduje się plik libmodbc.so), z prawami administratora systemu (użytkownika root) wykonujemy polecenie: sh install_driver.sh MacroBASE "MacroBASE ODBC" Następnie, działając już na konto administratora bazy danych (właściciela libmodbc.so), w pliku as_dsn.ini dokonujemy trzech zmian: — w linii z DSN_NAME dopisujemy nazwę źródła danych (fiks), — w linii z ASNAME dopisujemy nazwę systemu (fiks), — w linii z ASADDRESS zamiast localhost wpisujemy adres komputera z serwerem aplikacji (Xpertis). Poniżej przedstawiona jest zawartość pliku as_dsn.ini po zmianach: #! /bin/sh # Nazwa zrodla danych. Parametr wymagany. DSN_NAME=fiks III.36. Sterownik ODBC dla MacroBASE # Zrodlo danych moze byc zainstalowane tylko # dla biezacego uzytkownika lub moze byc dostepne # dla wszystkich uzytkownikow. # Zmienna USER_DSN okresla # sposob instalacji i moze przyjac wartosci: # 1 - zrodlo instalowane dla biezacego uzytkownika # 0 - zrodlo instalowane dla # wszystkich uzytkownikow USER_DSN=1 # Opcjonalny uzytkownik zapisany w zrodle danych. USER_NAME= # Opcjonalne haslo uzytkownika zapisane # w zrodle danych. USER_PWD= # Nazwa systemu w serwerze aplikacji. # Parametr wymagany. ASNAME=fiks # Nazwa grupy, do ktorej nalezy aplikacja. # Parametr opcjonalny, pominiecie przypisze # do domyslnej grupy "default" ASGROUP=default # Adres TCP/IP serwera aplikacji. # Parametr opcjonalny # pominiecie przypisze wartosc domyslna localhost ASADDRESS=Xpertis # Port TCP/IP serwera aplikacji. # Parametr opcjonalny # pominiecie przypisze wartosc domyslna 5580 ASPORT=5580 # Opcjonalna sciezka do pliku # z certyfikatem serwera aplikacji. # Wymagana jesli serwer ma wlaczona 183 184 Rozdział III. Architektura systemu # obsluge polaczen SSL. ASCERTPTH= # KONIEC KONFIGURACJI # ZMIANA POZOSTALYCH PARAMETROW ZABRONIONA # Nazwa sterownika pod jaka, # zostal zainstalowany w systemie. DRIVER_NAME=MacroBASE # Wersja z cienkim klientem. AS=1 Na koniec instalujemy sterownik (nadal na koncie administratora bazy danych), poprzez wywołanie polecenia: sh install_dsn.sh as_dsn.ini Od tego momentu, źródło danych będzie dostępne np. dla programu OpenOffice lub php. W razie problemów z połączeniem przez ODBC w systemie Linux, warto sprawdzić czy zainstalowane biblioteki ODBC mają odpowiednie (wymagane przez sterownik MacroBASE) nazwy: libodbcinst.so i libodbc.so. Jeśli nie, to należy utworzyć odpowiednie dowiązania symboliczne. Przykładowo dla systemu Ubuntu 6.06 i najnowszego pakietu unixODBC dla tego systemu w wersji 2.2.11 należy z prawami użytkownika root wykonać polecenia: ln -s /usr/lib/libodbcinst.so.1.0.0 /usr/lib/libodbcinst.so ln -s /usr/lib/libodbc.so.1.0.0 /usr/lib/libodbc.so 36.2.4 Instalowanie sterownika (wersja 64-bitowa) Instalacja przebiega analogicznie, jak w wersji 32-bitowej, z uwzględnieniem: — skrypt instalujący sterownik nazywa się install_driver64.sh: sh install_driver64.sh driver_name driver_desc — utworzone szablony mają nazwy as_dsn.ini oraz dsn.ini (parametry do modyfikowania mają takie same nazwy, co w wersji 32-bitowej), — źródła danych instaluje się na podstawie zmodyfikowanych szablonów: III.36. Sterownik ODBC dla MacroBASE sh install_dsn.sh dsn.ini lub sh install_dsn.sh as_dsn.ini Aby wykorzystać tak zdefiniowane źródło danych system musi wspierać uruchamianie programów 32-bitowych (32-bitowe wersje bibliotek), gdyż sterownik wywołuje program MacroAppBASIC (lub MacroBASIC), które są programami 32-bitowymi. Warto zwróćić uwagę na fakti, iż install_driver64.sh instaluje sterownik który pod tą samą może być jednocześnie 32 jak i 64-bitowy. Pakiet linuxowego menagera ODBC (unixODBC-2.2.12) w wersji 64 bitowej może być skompilowany z użyciem lub bez użycia zmiennej sterującej kompilacją BUILD_REAL_64_BIT_MODE. W efekcie powstają dwie wersje menagera ODBC, które nie są ze sobą kompatybilne binarnie. Libmodbc64.so jest kompilowany w trybie ze zdefiniowaną zmienną BUILD_REAL_64_BIT_MODE, co uniemożliwia użycie sterownika w systemach, w których manager ODBC jest skompilowany bez zmiennej — użycie prowadzi do błędów typu naruszenie zakresu pamięci w losowych przypadkach. W takich przypadkach należy wykorzystać libmodbc64_legacy.so — kompilat wersji 64 bitowej bez ustawianej stałej BUILD_REAL_64_BIT_MODE. Skrypt instalujący sterownik w tym trybie nazywa się: install_driver64_legacy.sh, a jego wywołanie może mieć postać: sh install_driver64_legacy.sh driver_name driver_desc W przypadku zainstalowania nieprawidłowej wersji sterowanika ODBC, możliwe jest poprawienie wszystkich zainstalowanych sterowników na odpowiednią wersję wykorzystując skrypty: switch_drivers64.sh którego zadaniem jest poprawienie wszystkich zainstalowanych sterowników na wersję z libmodbc64.so, switch_drivers64_legacy.sh którego zadaniem jest poprawienie wszystkich zainstalowanych sterowników na wersję z libmodbc64_legacy.sh. 185 186 Rozdział III. Architektura systemu 36.3 Procedury wbudowane Procedura wbudowana to podprogram pisany w języku Formula+, który można wywołać funkcją sterownika ODBC. Procedura może utworzyć tabelę tymczasową, której zawartość będzie dostępna do pobrania funkcjami sterownika. Do procedury można przekazywać parametry, wpływając w ten sposób na jej wynik. Procedury wbudowane mogą być wywoływane również w języku Formula+. Wynikiem będzie alias do utworzonej tabeli tymczasowej. Zasady tworzenia procedur wbudowanych opisane są w podręczniku Formuli+. Jeśli procedura jest zapisana w pliku odbc.prc, to przy wywołaniu procedury wystarczy podać jej nazwę. Gdy nazwa pliku jest inna, to nazwę procedury należy rozszerzyć o znak @ i nazwę pliku, z którego pochodzi. Dla przykładu, pierwsza z poniższych instrukcji ODBC wywołuje procedurę suma z pliku odbc.prc, zaś druga wywołuje procedurę suma z pliku demo.prc: {call suma} {call suma@demo} W pliku z procedurami (plik *.prc) każdy wiersz rozpoczynający się od znaku # (hash jest pierwszym znakiem w wierszu różnym od spacji i tabulacji) jest komentarzem i nie ma wpływu na działanie procedury. Przypuśćmy, że chcemy przenieść do Excela informacje ilu jest kontrahentów w każdym mieście wskazanego kraju. Dodatkowo chcemy, aby zamiast pustej nazwy miasta był tekst NIEZNANE. Wykorzystamy do tego celu procedurę wbudowaną. Po pobraniu zapytaniem SQL liczby kontrahentów w poszczególnych miastach, zmienimy (o ile istnieje) pustą nazwę na wyraz NIEZNANE. Poniżej są opisane kolejne kroki rozwiązania: tworzymy zgodnie z deklaracją ścieżek plik odbc.prc, w którym zapisujemy: proc miasta params Kraj:= ’Polska’ String[20], Nazwa kraju end params sql select miasto, count(naz) liczba from kh where Kraj = :Kraj group by miasto III.36. Sterownik ODBC dla MacroBASE order by 2 desc, 1 end sql formula {? :RS.find_tab(1, ’MIASTO’, , ’=’, ’’) || :RS.MIASTO:= ’NIEZNANE’; :RS.put ?} end formula end proc w Excelu wybieramy z menu Dane/Pobierz dane zewnętrzne/Utwórz nową kwerendę, po wybraniu źródła danych i podaniu hasła do aplikacji, uruchomi się program MS Query, w celu uzyskania list miast z Włoch, wybieramy przycisk SQL i wpisujemy polecenie: {call miasta(’Włochy’)} po zamknięciu programu MS Query wynik procedury będzie przesłany do programu Excel. Procedury wbudowane umożliwiają również modyfikowanie danych. Załóżmy, że chcemy umożliwić dodawanie rekordów poprzez przeglądarkę internetową. Użytkownik ma wpisać swoje nazwisko oraz datę. Wykorzystamy do tego język PHP, sterownik ODBC oraz procedurę wbudowaną z parametrami. W zapytaniu SQL zostanie zwrócona pusta tabela z jednym polem typu INTEGER. W formule po zapytaniu będzie dodany rekord do tabeli TAB, z wartościami pól przekazanymi poprzez parametry. Na koniec, do tabeli wynikowej dodany zostanie rekord z wartością pola 1, jeśli operacja zakończyła się sukcesem i 0, jeśli nie udało się dodać rekordu do bazy danych. W ten sposób wynik zostanie przekazany do programu wywołującego procedurę. W pliku odbc.prc możemy umieścić następującą treść: proc dodaj desc Dodanie nowego rekordu do tabeli TAB end desc params 187 188 Rozdział III. Architektura systemu Nazwisko String[25] Data DATE end params sql # tworzymy pustą tabelę z polem typu INT select 1 RES from syslog where 2 = 1 end sql formula TAB.NAZ:= :Nazwisko; TAB.DAT:= :Data; :RS.RES:= TAB.add; :RS.add end formula end proc Fragment strony z formularzem do wprowadzania danych może mieć postać: <FORM METHOD=POST ACTION="dodaj.php"> Nazwisko: <INPUT TYPE="TEXT" NAME="NAZ"><BR> Data (rrrr-mm-dd): <INPUT TYPE="TEXT" NAME="DATA"><BR> <INPUT TYPE="submit" VALUE="Dodaj"> </FORM> Przy założeniu, że użytkownik wpisał datę w formacie rrrr-mm-dd, skrypt PHP powinien wyglądać (d ’2003-03-11’ to przykładowy zapis daty w zapytaniach wywoływanych przez ODBC): <?php header("Content-type: text/html; charset=windows-1250"); $naz = $HTTP_POST_VARS["NAZ"]; $data = $HTTP_POST_VARS["DATA"]; $sql="{call dodaj(’$naz’, {d ’$data’})}"; $conn=odbc_connect(’system’,’szef’,’szef’); if (!$conn) { III.36. Sterownik ODBC dla MacroBASE 189 exit("Błędne połączenie: " . $conn); } $rs=odbc_exec($conn,$sql); if (!$rs) { exit("Błąd w procedurze wbudowanej."); } if (odbc_fetch_row($rs) && odbc_result($rs,1)) echo("Rekord dodany."); else echo("Błąd. Nie dodano rekordu."); odbc_close($conn); ?> 36.4 Sterownik JDBC Wraz z dostarczonym systemem dodawany jest sterownik JDBC do bazy danych MacroBASE. Aby wykorzystać sterownik należy w zmiennej CLASSPATH podać wskazanie do pliku mjdbc.jar instalowanego wraz z systemem. Sterownik JDBC wykorzystuje źródła danych ODBC zdefiniowane dla sterownika ODBC do MacroBASE. W systemie Linux musi być zainstalowany menadżer ODBC — unixODBC. Sterownik JDBC może być wykorzystywany przez programy zarówno 32 bitowe, jak i 64 bitowe, zaś wykorzystywany sterownik może być zarówno w wersji zwykłej, jak i UTF-8. Napis URL przekazywany przy otwieraniu połączenia powinien mieć postać jdbc:mbase:demo, gdzie demo można zastąpić nazwą dowolnego zdefiniowanego źródła danych do bazy MacroBASE. Przykładowe wywołanie może mieć zatem postać: import java.sql.*; public class tjdbc { public static void main(String args[]) { try { Connection con = DriverManager.getConnection("jdbc:mbase:demo", "szef", "szef"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("select count(*) D from katal"); rs.next(); java.lang.Integer d = (java.lang.Integer)rs.getObject("D"); System.out.print("Liczba rekordów: "); System.out.print(d); System.out.print("\n"); } catch( SQLException ex ) { ex.printStackTrace(); } } 190 Rozdział III. Architektura systemu } 37 Sposoby wymiany danych z innymi systemami W niektórych sytuacjach zachodzi potrzeba wymiany danych pomiędzy systemami w technologii MacroBASE a innymi programami. W zależności od potrzeb można obrać jedną z kilku ścieżek postępowania. W przypadku eksportu danych najwygodniejsze narzędzia nie wymagające znajomości Formuli+ to: ODBC umożliwia korzystanie z bazy danych MacroBASE przez działające w środowisku Windows programy potrafiące wykorzystać mechanizm ODBC np. import danych do programu Microsoft Excel. Opis zastosowania sterownika ODBC znajduje się w oddzielnym rozdziale. Ponadto wykorzystując funkcje dostępne w języku Formula+ istnieje możliwość nawiązywania połączeń ODBC z dowolnymi źródłami danych (funkcjonalność klienta ODBC). Łączyć się można jedynie ze sterownikami ODBC w wersji 32-bitowej. Po ustaleniu połączenia, można wywoływać zapytania. Wynik może być w formie tabeli tymczasowej lub kursora. W drugim przypadku, metodą fetch pobiera się kolejne rekordy wyniku, MacroCGI wykorzystując szablony _sql.htm i _ressql.htm ze standardowych bibliotek _libfml można, konstruując odpowiednie zapytanie SQL, w dość prosty sposób otrzymać pożądane dane w przeglądarce, wydruk uniwersalny narzędzie dostępne w zestawie standardowych bibliotek _libfml. Pozwala użytkownikowi na wybór tabel i pól, które chce umieścić w zestawieniu oraz nakładanie warunków ograniczających zakres danych. Wynikiem zestawienia może być standardowy wydruk lub pliki w formacie *.html lub *.xml. Jeśli interesuje nas wynik w formie tekstowej można przygotować standardowy wydruk a następnie w oknie wydruku wybrać z menu Plik funkcję Zapisz jako tekst lub ewentualnie skopiować do schowka (menu Edycja). Uruchomienie wydruku uniwersalnego może przykładowo wyglądać tak: exec(,’_declall’); UNV:=obj_new(@.CLASS.UNIVERS); UNV.univers() III.38. Szyfrowanie połączenia z serwerem aplikacji W większości aplikacji pakietu Xpertis jest on jednak standardowo dostępny z poziomu menu, kopiowanie wprost z okienek wertowania i edycji interesujące nas dane można czasami znaleźć w jednym z okienek aplikacji i wtedy bezpośrednio z tego okienka skopiować do schowka. Kopiować można zarówno zawartość okienek wertowania jak i edycji, w zależności od wybranej opcji. Możliwość zmiany parametrów kopiowania i zestaw funkcji pomocnych w zaznaczaniu rekordów do kopiowania są zawsze dostępne w menu Okno. 38 Szyfrowanie połączenia z serwerem aplikacji W przypadku pracy w sieci rozległej a zwłaszcza przesyłania danych przez sieć Internet, warto skorzystać z możliwości szyfrowania połączenia z serwerem aplikacji z wykorzystaniem protokołu SSL. Protokół SSL (Secure Sockets Layer), to protokół kryptograficzny bezpiecznej transmisji danych, którego zadaniem jest stworzenie wirtualnego, odpornego na próby podsłuchiwania kanału transmisji dla informacji przesyłanych przez aplikacje. Dzięki jego zastosowaniu mamy pewność że nikt postronny nie może czytać przesyłanych danych ani w nie ingerować, oraz że nawiązujemy połączenie z właściwym serwerem. W trakcie połączenia wykorzystywane są dwa rodzaje szyfrowania: symetryczne RC4 (z pojedynczym kluczem) oraz asymetryczne RSA (z kluczem prywatnym i publicznym). Serwer aplikacji posiada klucz prywatny algorytmu RSA, natomiast klient posiada certyfikat serwera aplikacji. Pierwszą operacją po nawiązaniu połączenia jest uzgodnienie symetrycznego klucza sesyjnego do szyfrowania komunikacji. Uzgodnienie polega na wygenerowaniu przez cienkiego klienta 128-bitowego klucza sesyjnego dla algorytmu RC4 i zaszyfrowaniu go algorytmem RSA z wykorzystaniem klucza publicznego certyfikatu serwera aplikacji. Następnie zaszyfrowany klucz sesyjny jest przesyłany do serwera aplikacji. Tylko serwer aplikacji, jako posiadacz klucza prywatnego, jest w stanie odszyfrować klucz sesyjny. Od tego momentu klucz sesji może już służyć do deszyfrowania otrzymywanych danych. Istotną rolę odgrywa długość zaimplementowanych w programie kluczy, czyli liczba składających się nań bitów. Im klucz jest dłuższy, tym trudniej jest go złamać. W MacroBASE używane są klucze sesyjne o długości 128-bitów, długość kluczy publicznych i prywatnych zależy od parametrów ich wygenerowania. Zazwyczaj są długości 1024 bity i ten poziom bezpieczeństwa można uznać za wystarczający. 191 192 Rozdział III. Architektura systemu Serwer aplikacji obsługuje szyfrowanie zarówno w wersji działającej pod systemem Windows, jak i Linux. Klient serwera aplikacji (jTerm) oraz jMacroCONSOLA (jConsole.jar) mogą obsługiwać szyfrowane połączenie w dowolnej wersji systemu, dla kórego są dedykowane. Do ustanowienia szyfrowanego połączenia między klientem a serwerem aplikacji, potrzebny jest plik o nazwie server.pem z kluczem prywatnym, oraz plik o nazwie certificate.der zawierający certyfikat. Oba wspomniane pliki muszą być umieszczone w jednym katalogu i dodatkowo plik server.pem nie może mieć praw do modyfikacji oraz nie może być zabezpieczony hasłem. Serwer aplikacji musi być uruchamiany z opcją -k i następującą po niej ścieżce dostępu do katalogu, w którym znajdują się plik z kluczem i certyfikatem. Kopia pliku certificate.der (może być pod inną nazwą) będzie potrzebna do uruchomienia klienta. W celu nawiązania szyfrowanego połączenia z serwerem aplikacji, w zależności od konfiguracji i stosowanego programu należy użyć jednej z niżej opisanych metod: jTerm.jar należy podać po opcji -k ścieżkę do pliku z certyfikatem (z nazwą pliku włącznie). Plik ten można też wskazać konwersacyjnie, po wybraniu opcji MacroAppSERVER: Ustawienia z menu Plik, wypełniając pole Certyfikat, ODBC w definicji źródła danych należy zaznaczyć opcję Ścieżka do pliku z certyfikatem dla połączenia SSL i wskazać odpowiedni plik, jConsole.jar należy podać po opcji -k ścieżkę do pliku z certyfikatem (z nazwą pliku włącznie), mbasic.dll należy użyć funkcji LoadRemoteSystemSSL lub LoadRemoteSystemWithUserSSL. Ich znaczenie jest identyczne ze znaczeniem funkcji LoadRemoteSystem oraz LoadRemoteSystemWithUser z tą różnicą, że mają dodatkowy pierwszy argument, poprzez który należy przekazać ścieżkę dostępu do pliku z certyfikatem. Przykładowe uruchomienie szyfrowanego połączenia z serwerem aplikacji pracującym na serwerze windowsowym może mieć następujący przebieg: III.38. Szyfrowanie połączenia z serwerem aplikacji 193 1. Wygenerowanie certyfikatu i klucza prywatnego Klucz prywatny i certyfikat można wygenerować darmowym oprogramowaniem OpenSSL. W celu wygenerowania klucza prywatnego o długości 1024 bitów (pliku server.pem) należy wywołać polecenie: openssl genrsa -out server.pem 1024 Przed utworzeniem certyfikatu należy przygotować plik konfiguracyjny np. opcje.cfg o treści zbliżonej do poniższej (ze zmianą danych o właścicielu): [ req ] distinguished_name = MacroAppServer prompt = no [MacroAppServer] C = PL O = Nazwa Firmy CN = Nazwa Serwera teraz po wywołaniu: openssl req -new -x509 -config opcje.cfg -key server.pem -outform DER -out certificate.der -days 365 powstanie plik (certificate.der) z certyfikatem ważnym przez 365 dni. W katalogu bieżącym pliku mblaunch.exe tworzymy podkatalog keys, w którym umieszczamy pliki server.pem oraz certificate.der. Dla pliku server.pem nadajmy atrybut Tylko do odczytu. 2. Instalujemy i uruchamiamy serwer aplikacji jako usługę z opcją -k: mblaunch.exe -k keys -i mblaunch.exe -bv 3. W katalogu, w którym wywoływany jest jTerm.jar umieszczamy kopię pliku certificate.der. W parametrze wywołania dodajemy opcję -k, np. javaw.exe -jar jTerm.jar serwer -k certificate.der 194 Rozdział III. Architektura systemu 39 Uwierzytelnianie certyfikatem 39.1 Uwierzytelnianie za pomocą SmartCard W systemach MacroBASE możliwe jest uwierzytelnianie za pośrednictwem kart SmartCard. Jest to opcja wymagająca posiadania odpowiedniej licencji, w przeciwnym razie nie jest dostępna. Jeśli wpisany klucz serwera bazy danych uprawnia do używania tej opcji w logu serwera (server.log dla Windows i macro.log dla Linuxa) powinien pojawić się zapis: smart card login - on Obsługiwane są karty firm CryptoTech, Unizeto i ActivCard. Obsługa SmartCard jest dostępna na końcówkach działających w systemie Windows XP. Dla końcówek działających w systemach Windows 95/98/ME/2000 oraz Linux uwierzytelnianie za pośrednictwem kart jest niedostępne. Uwierzytelnianie polega na wysłaniu przez serwer aplikacji do klienta danych, które są szyfrowane kluczem prywatnym znajdującym się na karcie. Zaszyfrowane dane są potem odsyłane do serwera aplikacji, gdzie są deszyfrowane kluczem publicznym zapisanym w pliku *.psw aplikacji. Jeśli wynik będzie zgodny z wysłanymi danymi, to proces uwierzytelnienia zakończy się sukcesem. Do prawidłowego uwierzytelnienia niezbędna jest karta zawierająca klucz prywatny i właściwy dla niego certyfikat, czytnik kart i zainstalowane oprogramowanie dostarczone przez producenta kart. Lista dostępnych certyfikatów pobierana nie jest bezpośrednio z karty tylko z systemowego magazynu certyfikatów. Podczas uwierzytelniania widoczne są tylko te certyfikaty, które z aktualnie używanej karty zostały zarejestrowane w systemie przy pomocy menedżera tej karty i dodatkowo posiadają na karcie powiązany klucz prywatny. Powiązanie certyfikatu z karty z użytkownikiem systemu MacroBASE odbywa się w systemie MacroPASS. Po wskazaniu użytkownika zmieniamy dla niego typ uWierzytelniania zaznaczając opcję Karta. Następnie wybieramy kolejno karTa (SmartCard), Zmiana certyfikatu i nowy certyfikat z Karty lub nowy certyfikat z Pliku. Jeśli wczytujemy certyfikat z karty i jest na niej więcej niż jeden ważny certyfikat, pojawi się okienko dialogowe umożliwiające wybór właściwego certyfikatu. Jeśli certyfikat jest tylko jeden, zostanie on automatycznie wybrany. Jeśli certyfikat wczytujemy z pliku, pojawi się dialog umożliwiający wskazanie pliku z certyfikatem w formacie PEM. Jeden certyfikat może być przypi- III.39. Uwierzytelnianie certyfikatem 195 sany tylko do jednego użytkownika. Po zapisaniu zmian system jest gotowy do pracy. Uruchomienie aplikacji przebiega standardowo, z tą różnicą, że w okienku uwierzytelniania po rozwinięciu opcji Rozwiń dostępny będzie przycisk z karty. Po jego wybraniu, jeśli na karcie jest więcej niż jeden ważny certyfikat, pojawi się okienko dialogowe umożliwiające wybór właściwego certyfikatu spośród tych, które z aktualnie używanej karty zostały zarejestrowane w systemie przy pomocy menedżera tej karty i dodatkowo posiadają na karcie powiązany klucz prywatny. Jeśli jest tylko jeden ważny i zarejestrowany certyfikat, to zostanie on automatycznie wybrany. Podanie parametru -q jako jednej z opcji wywołania programu jTerm.jar spowoduje, że domyślnym sposobem uwierzytelniania będzie uwierzytelnianie kartą. Zamiast standardowego dialogu weryfikującego nazwę użytkownika i hasło, pojawi się okienko z wyborem certyfikatu. Jeśli na karcie będzie jeden certyfikat, użytkownik zostanie od razu poproszony o podanie kodu PIN. W przypadku pracy przez ODBC należy w źródle danych zaznaczyć opcję Karta. Należy zwrócić uwagę żeby użytkownik wpisany w okienku ODBC był tym samym dla którego jest wystawiony certyfikat zapisany na karcie, w przeciwnym wypadku uwierzytelnianie zakończy się niepowodzeniem. Nie można korzystać z uwierzytelniania kartą w programach nie pozwalających na wyświetlanie okienek dialogowych np. PHP. Aby zapewnić domyślne uwierzytelnianie kartą w programach korzystających z biblioteki mbasic.dll, należy użyć jednej z funkcji: LoadSystemCard, LoadRemoteSystemCard lub LoadRemoteSystemSSLCard. Dokładny opis funkcji znajduje się w rozdziale tego podręcznika poświęconym bibliotece mbasic.dll. W celu umożliwienia w programie jTerm uwierzytelniania kartą SmartCard należy w pliku jterm_12.30.ini wskazać sterownik obsługujący posiadany typ karty. Należy zdefiniować sekcję [!smartcard] o następującej strukturze: [!smartcard] provider_1 = name=nazwa_dostawcy|library=nazwa_pliku.dll gdzie: nazwa_dostawcy dowolna nazwa dostawcy oprogramowania karty, jeśli w nazwie jest spacja należy ją wpisać w cudzysłowach, 196 Rozdział III. Architektura systemu nazwa_pliku.dll nazwa biblioteki obsługującej daną kartę, dostarczanej przez producenta karty. Można zdefiniować maksymalnie 3 różne typy kart wpisując kolejno klucze provider_1 do provider_3. Jeśli zdefiniowana jest tylko jedna karta, dialog wyboru karty podczas uruchamiania programu jest pomijany. Jeśli katalog z biblioteką nie jest wpisany w zmiennej środowiskowej PATH, należy podać pełną ścieżkę do pliku, przy czym ścieżka może zawierać tylko litery łacińskie, spacje i podkreślenie. Przykładowo dla kart z firm CryptoTech i Unizeto sekcja wyglądałaby następująco: [!smartcard] provider_1 = name=CryptoTech|library=CCPkiP11.dll provider_2 = name=Unizeto|library=aetpkss1.dll 39.2 Uwierzytelnianie certyfikatem z pliku Możliwe jest uwierzytelnianie certyfikatem bez konieczności używania urządzeń kryptograficznych. Certyfikat i klucz prywatny może być zapisany w pliku w formacie PKSC#12. W pliku jterm_12.30.ini należy zdefiniować sekcję: [!UserCertificates] cert_file_1 = e:/skid/cert1.p12 cert_file_2 = e:/skid/cert2.p12 cert_file_3 = cert3.p12 Jeśli podana ścieżka jest względna to, plik jest wyszukiwany względem katalogu bieżącego klienta (pth_dir(’@’)). Aby uwierzytelnianie certyfikatem z pliku było domyślnym należy do wywołania jTerma dodać parametr -qfile. Jeśli zdefiniowany zostanie jeden certyfikat to zostanie automatycznie wybrany do uwierzytelniania. Jeśli certyfikatów jest więcej, pojawi się lista wyboru. Maksymalnie można podać trzy certyfikaty. Uruchomienie aplikacji przebiega standardowo, z tą różnicą, że w okienku uwierzytelniania po rozwinięciu opcji Rozwiń dostępny będzie przycisk z pliku. Dalszy ciąg procesu uwierzytelniania jest analogiczny jak przy użyciu karty kryptograficznej. III.40. Profiler 40 Profiler W systemie dostępny jest profiler — narzędzie umożliwiające zbadanie czasów i liczbę wywołań formuł, funkcji i metod. Analiza takich informacji może pozwolić na optymalizację kodu, znalezienie najbardziej czasochłonnych operacji (np. w celu ich przeprojektowania), znalezienie najczęściej używanych formuł i ich wpływu na czas działania aplikacji, itp. Zbierane informacje zapisywane są w plikach z rozszerzeniem *.mfp. Pliki te zapisywane są w lokalizacjach określonych zgodnie z deklaracją ścieżek. Domyślną nazwą pojedynczego pliku z danymi jest RRRRMMDDhhmmssp[n].mfp, czyli napis zawierający datę i czas rozpoczęcia rejestrowania. W przypadku powtórzenia nazwy pliku w katalogu, do nazwy pliku będą doklejany kolejny numer (n). Niektóre sposoby uruchamiania profilera dają możliwość samodzielnego ustalenia nazwy pliku. W takim przypadku przy powtórzonej nazwie pliku także będą doklejane kolejne numery. Zaleca się, aby w pliku deklaracji ścieżek pliki *.mfp zapisywane były w katalogach użytkownika (wpis ze znacznikiem ’>’ na początku), ułatwi to przypisanie danego pliku do konkretnej sesji konkretnego użytkownika aplikacji. 40.1 Uruchamianie profilera Zbieranie informacji przez profilera może być uruchomione na cztery sposoby: — dla każdej aplikacji i rodzaju połączenia przez cały czas jej działania za pomocą wpisu w pliku konfiguracyjnym aplikacji, — dla każdej aplikacji uruchomionej danym klientem przez cały czas jego działania za pomocą opcji linii poleceń, — umożliwienie włączania i wyłączania rejestrowanie na żądanie użytkownika za pomocą przycisków na pasku narzędzi, — profilowanie pojedynczej formuły za pomocą funkcji profile W danym momencie profilowanie może być włączone tylko jednym sposobem, przy czym priorytet poszczególnych trybów pracy jest zgodny z powyższą listą. Oznacza to przykładowo, że jeśli włączymy profilowanie za pomocą wpisu w pliku konfiguracyjnym, to próba włączenia (czy wyłączenia) profilowania w innym trybie albo będzie niedostępna, albo zignorowana, albo zgłosi błąd. W przeciwieństwie do uruchamiania MacroDEBUGGERA, które jest ograniczone tylko dla użytkowników z grupy „wdrożenia”, nie ma żadnych ograniczeń w uruchamianiu profilera: każdy użytkownik może używać profilera w 197 198 Rozdział III. Architektura systemu swojej aplikacji, niezależnie od sposobu jego włączania. Można także uruchamiać profilera razem z dostępnym MacroDEBUGGEREM (opcja -d). Jako, że w tym trybie system wykonuje więcej operacji (np. każdorazowe ładowanie plików z formułami), wyniki profilera (np. czasy trwania poszczególnych operacji) mogą być obarczone błędem, bo czasy trwania poszczególnych operacji będą miały narzut związany z działaniem debuggera. W takim przypadku system wyświetli stosowną informację. 40.1.1 Włączanie profilera za pomocą wpisu w pliku konfiguracyjnym Aby włączyć zbieranie informacji przez profilera przy każdym uruchomieniu aplikacji, należy umieścić w pliku konfiguracyjnym (macro.cfg lub aplikacja.cfg) poniższy parametr: macro_profiler = 1 W tym przypadku przy każdym uruchomieniu aplikacji tworzony będzie plik o nazwie domyślnej (czyli z datą i czasem rozpoczęcia zbierania danych), w którym będą zapisywane wszystkie informacje do czasu zakończenia aplikacji. W ten sposób można włączyć profilowanie dla wszystkich rodzajów klientów, które uruchamiają aplikację (w szczególności dla wywołań przez ODBC i MacroCGI). Ten tryb włączania profilera jest nadrzędny względem innych (opisanych poniżej) trybów. 40.1.2 Włączanie profilera za pomocą opcji z linii poleceń Aby włączyć zbieranie informacji przez profilera przy każdym uruchomieniu aplikacji z poziomu danego klienta, należy program klienta (jTerm lub MacroCGI) uruchomić z dodatkową opcją -v [plik]. Argument plik oznacza nazwę pliku *.mfp, w którym mają być zapisywane dane z profilera. Kolejne pliki tworzone dla kolejnych aplikacji będą dostawały kolejne numery dopisywane do nazwy pliku. Pominięcie nazwy pliku spowoduje, że tworzone będą pliki o nazwach domyślnych (data, czas rozpoczęcia zbierania danych). Ten parametr nie ma znaczenia dla aplikacji, dla których profiler jest włączony opcją w pliku konfiguracyjnym. 40.1.3 Włączanie i wyłączanie profilera za pomocą przycisków na pasku narzędzi Aby umożliwić użytkownikowi włączanie i wyłączanie zbierania danych przez profilera za pomocą przycisków na pasku narzędzi, należy uruchomić jTerma III.40. Profiler z dodatkową opcja -v2. W programie będą dostępne przyciski umożliwiające włączenie i wyłączenie rejestrowania. Każdorazowe włączenie rejestrowania powoduje utworzenie nowego pliku z danymi profilera. Nazwa tworzonego pliku zależy od wartości pola Prefiks nazw tworzonych plików w oknie ustawień użytkownika (Okno / Ustawienia użytkownika, zakładka Parametry aplikacji). Znaczenie tej wartości jest analogiczne do parametru plik dla opcji -v. Pozostawienie pustej nazwy oznacza, że tworzone będą pliki o nazwach domyślnych. W przypadku włączenia profilowania za pomocą parametru w pliku konfiguracyjnym, możliwość „ręcznego” włączania zbierania danych będzie niedostępna. 40.1.4 Profilowanie pojedynczej formuły MacroBASE umożliwia także profilowanie pojedynczej formuły uruchamianej przez użytkownika. Można to zrobić za pomocą funkcji FORMULI+ o nazwie profile. profile([file], [formula]) file nazwa pliku (bez końcówki .mfp), w którym maja być zapisane informacje profilera z uruchomienia zadanej drugim argumentem formuły. Jeśli parametr zostanie pominięty (lub przyjmie pustą wartość), to zostanie utworzony plik tymczasowy (będzie go można odczytać za pomocą funkcji prof_get). formula profilowana formuła. Formuła zostanie uruchomiona, a informacje z jej uruchomienia zostaną zapisane w pliku określonym pierwszym argumentem funkcji. Wynikiem funkcji jest wynik uruchomionej formuły. Nie można wywołać funkcji profile, gdy aktualnie profiler jest włączony (w dowolny inny sposób) jak również nie można wywołać funkcji profile z formuły wywołanej już funkcją profile. 40.2 Analiza wyników profilowania w obiekcie klasy DEBUG W obiekcie klasy DEBUG istnieje możliwość analizy wyników profilera. Po wybraniu przycisku Analizy można wskazać plik z wynikami (znalezionymi zgodnie z deklaracją ścieżek) i wybrać dla niego stosowną analizę. Z kolei po 199 200 Rozdział III. Architektura systemu wybraniu przycisku Profiluj zostanie wykonana wpisana formuła, a po jej zakończeniu będzie można wybrać jedną z analiz wykonanej formuły. Dostępne są następujące analizy: Zestawienie zbiorcze w głównym oknie, będą dostępne profilowane elementy. W kolejnych kolumnach znajdzie się informacja o sumie czasów wywołań z wliczaniem czasu wykonania elementów potomnych (Suma czasu) lub bez wliczania (Bez wywołań) oraz liczba wszystkich wywołań danego elementu. W górnym okienku po prawej, będą analogiczne informacje, w rozbiciu na miejsce wywołania. W dolnym zaś znajdą się informacje o elementach potomnych, Drzewo wywołań w wyniku będzie prezentowane drzewo, w którym w kolejnych węzłach będą kolejne profilowane elementy. Po rozwinięciu węzła dostępne będą elementy wywołane potomnie. W okienku, oprócz sumy czasów i liczby wywołań, pokazana jest kolumna z minimalnym i maksymalnym czasem wywołania elementu, z Podziałem na odstępy czasowe w wyniku prezentowane będzie drzewo, w którym kolejne węzły będą kolejnymi znacznikami czasowymi (w odstępach co 15 sekund). Po rozwinięciu węzła dostępne będą wywołania, jakie miały miejsce w zadanym odstępie czasowym, pokrycie wywołań Formuł w wyniku będzie lista formuł, wraz ze znacznikiem, czy dana formuła była przynajmniej raz wywołana (pole Użycie będzie miało wtedy wartość 1, zaś w przeciwnym przypadku 0). Jeśli wyniki profilera były tworzone przy dostępnej opcji włączenia debuggera, to w wyniku będą wszystkie dostępne w programie formuły, zaś w przeciwnym przypadku tylko z użytych zbiorów *.fml, 40.3 Rejestrowanie liczby wywołań procedur, metod, raportów i zapytań SQL Istnieje możliwość rejestrowania liczby wywołań procedur poprzez funkcję exec, metod zdefiniowanych klas, raportów wywołanych poprzez funkcję rep_exec oraz zapytań SQL wywołanych poprzez sql_exec lub psql_exe. Wyniki zapisywane są w ustalonych odstępach czasowych oraz na zakończenie programu w plikach tekstowych. Operacja jest zdecydowanie szybsza, III.40. Profiler niż wydobywanie analogicznych danych z użyciem profilera. Pliki mają rozszerzenie .mfc, zaś nazwy składają się z pięciu części połączonych znakiem postaci: system-username-data-początek-koniec gdzie system nazwa uruchomionego systemu, username wynik funkcji username, data data rozpoczęcia działania programu w formacie rrrrmmdd, początek godzina rozpoczęcia rejestrowania kolejnej porcji wywołań zapisana w formacie ggmmss, koniec godzina zakończenia rejestrowania kolejnej porcji wywołań lub godzina zakończenia programu, zapisana w formacie ggmmss. Rejestrowanie wywołań procedur można włączyć na dwa sposoby: — dodając w wywołaniu jTerma opcję -ec min, gdzie min oznacza liczbę minut, po upłynięciu będzie odpisany plik z kolejna porcją wywołań. Podanie 0 jako liczby minut oznacza, że powstanie tylko jeden plik, na zakończenie działania programu, — umieszczając wpis w pliku *.cfg czytanym przez klienta: exec_count = 1 Wartość liczbowa różna od 0 spowoduje włączenie rejestrowania wywołań. Jest to jedyny sposób dla wywołań poprzez ODBC lub MacroCGI. Domyślna wartość 0 oznacza, że pliki *.mfc nie będą tworzone. Dodatkowo można określić liczbę minut, po upływie których będzie odpisywana kolejna porcja: exec_count_timeout = liczba_minut 201 202 Rozdział III. Architektura systemu Wartość przypisana do argumentu oznacza co ile minut mają być odpisywane porcje wywołań. Domyślna wartość 0 oznacza odpisanie tylko jednego pliku na zakończenie działania programu. Po zakończeniu działania programu, zgodnie z deklaracją ścieżek zostanie odpisany plik z liczbą wywołań procedur, metod, raportów i zapytań SQL. Plik ma format CSV (pola oddzielane średnikiem) w kodowaniu Mazovia. W kolejnych wierszach będą zapisane kolejno wartości oddzielone średnikami: 1. rodzaj wywołania, dostępne wartości to: F wywołanie procedury, M wywołanie metody, R wywołanie sprawozdania, S wywołanie zapytania SQL, 2. nazwa formuły (wartość pierwszego argumentu funkcji exec). Jeśli pierwsze pole w wierszu ma wartość różną od F, to pole jest puste, 3. nazwa pliku (wartość drugiego argumentu funkcji exec). Jeśli pierwsze pole w wierszu ma wartość różną od F, to pole jest puste, 4. nazwa pliku sprawozdania (bez rozszerzenia). Jeśli pierwsze pole w wierszu ma wartość różną od R, to pole jest puste, 5. nazwa pliku z zapytaniem SQL (bez rozszerzenia). Jeśli pierwsze pole w wierszu ma wartość różną od S, to pole jest puste, 6. nazwa metody, wraz z listą typów argumentów umieszczoną w nawiasach []. Poszczególne litery oznaczają typ: V typ pusty, N typ NUMBER, S typ STRING, R typ FORMULA, D typ DATE, T typ TIME, Z typ REFERENCE, A typ tablicowy, III.40. Profiler C typ obiektowy, zdefiniowany poprzez wywołanie obj_decl, B typ TABLE, F typ FILE, O typ ODBC, ... opcjonalne parametry dowolnych typów. 203 Jeśli pierwsze pole w wierszu ma wartość różną od M, to pole jest puste, 7. nazwa klasy, do której należy wywołana metoda. Jeśli pierwsze pole w wierszu ma wartość różną od M, to pole jest puste, 8. liczba wywołań, 9. bezwzględna ścieżka do pliku (razem z rozszerzeniem) z wywoływaną formułą, skompilowanym sprawozdaniem lub zapytaniem SQL. Jeśli pierwsze pole w wierszu ma wartość M, to pole jest puste, 10. wartość md5 dla uruchamianego pliku *.fml, *.sql. W przypadku sprawozdania (plik *.rpt) zapisana będzie wartość źródła uruchamianego pliku *.rpt (czyli zbioru *.rpm wraz z włączonymi konstrukcją INCLUDE: plikami). Wartość ta jest od bieżącej wersji zapisywana w pliku *.rpt w czasie kompilacji. W przypadku zmiany wartości md5 w pliku *.sql lub zapisanej w pliku *.rpt od ostatniego wywołania, pojawi się nowy wpis w pliku wynikowym, z nową wartością md5. Dla plików *.fml (co może mieć miejsce tylko po uruchomieniu programu z opcją -d — w przeciwnym przypadku przeczytane pliki są buforowane), odpisany zostanie plik z bieżącą porcją danych, zaś wywołania z nową wartością md5 dla pliku *.fml będą odpisywane w kolejnej porcji. W wyniku nie ma listy wszystkich dostępnych procedur, raportów, metod i zapytań SQL — znajdują się tam tylko te, które były przynajmniej raz wywołane. Przykładowo, poniższa formuła zbiera w tabeli tymczasowej listę procedur, wraz z liczbą wywołań (suma z wszystkich plików *.mfc): _FILE:= files(’*.mfc’); _TABS:=tab_tmp(,’NAZWA’,’STRING[15]’,’Nazwa’, ’PLIK’,’STRING[8]’,’Plik’, ’LICZBA’,’INTEGER’,’Liczba’); {? _FILE.first || {! |? 204 Rozdział III. Architektura systemu _TABS.import(_FILE.FILENAME,1,,,,, ’NAZWA’,,2,,’PLIK’,,3,,’LICZBA’,,8,); _FILE.next !} ?}; _TAB:= sql(’ select NAZWA, PLIK, cast(sum(LICZBA) as integer_type) liczba from :_a where PLIK <> \’\’ group by NAZWA, PLIK order by 3 desc ’, _TABS); _TAB.win_sel(_TAB.mk_sel(,,1)); _TAB.select 41 Automatyczne aktualizacje 41.1 MacroUPDATE Do pobierania i nanoszenia poprawek udostępnionych w systemie SPIS można posłużyć się programem MacroUPDATE (lub mupdate.exe dla wersji windowsowej). Program ten umożliwia pobranie wszystkich dostępnych poprawek z serwera i zapisanie ich do pliku. Plik ten można wykorzystać przy aktualizacji oprogramowania bez dostępu do Internetu. Podczas pobierania poprawek, program łączy się z serwerem mupdate.macrologic.pl poprzez port 7000. Program MacroUPDATE (mupdate.exe) wywołany bez argumentów pobiera wszystkie nie pobrane wcześniej poprawki oraz sprawdza, czy poprawki były już zastosowane. Program musi być uruchomiony w katalogu, w którym znajdują się programy wykonawcze, czyli w tym w którym się znajdzie po instalacji systemu. Pobrane poprawki będą zapisywane również w tym samym katalogu. Dodatkowo tworzony będzie plik mupdate.sta, z listą zastosowanych już poprawek. Po wywołaniu programu z opcją -u, brakujące poprawki będą automatycznie nanoszone. Uruchomienie z tą opcją wymaga, aby poprawiane programy były zatrzymane. Istnieje możliwość pobrania wszystkich poprawek, w celu przeniesienia ich i zainstalowania na innym komputerze. Służy do tego opcja -g. Program nie musi być wtedy uruchomiony w katalogu z programami wykonawczymi. III.41. Automatyczne aktualizacje W wyniku działania powinien zostać utworzony plik mupdate_11_20.src (dla wersji 11.20) z wszystkimi dostępnymi poprawkami (zarówno dla systemu Windows, jak i Linux). Po przeniesieniu go do katalogu z programami wykonawczymi i uruchomieniu programu do aktualizacji z opcją -l sprawdzi, które z poprawek należy zainstalować. Podanie dodatkowo opcji -u spowoduje, że poprawki będą nanoszone (należy przed wywołaniem się upewnić, że poprawiane programy nie są uruchomione). Zatem przed uruchomieniem programu (serwera lub końcówki), można wywołać mupdate.exe -u w celu ściągnięcia i zainstalowania wszystkich nowych poprawek. Jeśli komputer nie ma dostępu do Internetu, wtedy po wywołaniu: mupdate.exe -g na komputerze z dostępem do Internetu i przeniesieniu utworzonego pliku mupdate_11_20.src do katalogu z programami, które mają być zaktualizowane, wystarczy wywołać: mupdate.exe -l -u (oczywiście przy zatrzymaniu poprawianych programów). 41.2 Automatyczna aktualizacja jTerma Programa jTerm posiada właściwość automatycznego nanoszenie poprawek. Wcześniej wszystkie poprawki muszą być ściągnięte na serwer aplikacji poprzez wywołanie MacroUPDATE. Po połączeniu jTerma z serwerem aplikacji, automatycznie pobierane będą pliki z instalacji, które na serwerze mają inną zawartość niż używane przez jTerma. Po pobraniu zmienionych plików jTerm zostanie ponownie uruchomiony, już w zaktualizowanej wersji. W związku z powyższym, katalog oraz zbiory z katalogu z instalacją jTerma muszą mieć prawo do zapisu. Dodatkowo w instalacji serwera aplikacji muszą się znaleźć wszystkie zbiory wykonawcze, zarówno z instalacji linuksowych, jak i windowsowych. Brak któregoś z plików uniemożliwi uruchomienie serwera aplikacji. Informacja o brakującym pliku zostanie odpisana w pliku macro.log. Jeśli serwer aplikacji został uruchomiony z opcją szyfrowania połączeń, to plik certificate.der będzie kopiowany do katalogu cert zakładanego automatycznie (jeśli nie istnieje) w katalogu z runtime. Skopiowany plik 205 206 Rozdział III. Architektura systemu będzie aktualizowany na końcówkach. Jeśli jTerm zostanie uruchomiony z opcją szyfrowania połączenia, to podany przy wywołaniu plik z certyfikatem zmieni zawartość na taką, jaką ma plik certificate.der z katalogu cert umieszczonego w instalacji serwera. Plik certificate.der z katalogu, w którym znajduje się plik server.pem można aktualizować również wtedy, jeśli serwer aplikacji jest uruchomiony. Obowiązywać będzie po ponownym uruchomieniu serwera aplikacji — nowa wersja zostanie wtedy przekopiowana do katalogu cert. Dostępna jest opcja -ud przy uruchomieniu jTerma, która powoduje, że jTerm nie będzie automatycznie aktualizowany. Dzięki temu można nadal mieć instalację jTerma w trybie tylko do odczytu (np. na dysku sieciowym). Wywołanie bez opcji -ud zakończyłoby się błędem. Należy wtedy pamiętać o aktualizacji instalacji w inny sposób (np. poprzez wywołanie MacroUPDATE przez użytkownika posiadającego dostęp do zapisu). 41.3 Aktualizacja sterownika ODBC W celu aktualizacji sterownika ODBC należy wywołać w katalogu ze sterownikiem następujące programy: w wersji windowsowej: mclidown.exe server[:port] mclisync.exe w wersji linuksowej: MacroCliDOWN server[:port] MacroCliSYNC gdzie server adres serwera z działającym serwerem aplikacji, port numer portu (domyślnie w przypadku pominięcia będzie to 5580). W czasie aktualizacji sterownik nie może być wykorzystywany. Aktualizacja dotyczy sterownika ODBC wykorzystującego serwer aplikacji. W przypadku grubego połączenia ODBC aktualizacja nie jest potrzebna, gdyż sterownik powinien znajdować się w tym samym katalogu, co serwer bazy danych. III.42. Pobieranie kluczy licencyjnych z portalu Xpertis 24 207 42 Pobieranie kluczy licencyjnych z portalu Xpertis 24 Istnieje możliwość pobrania kluczy licencyjnych poprzez internet z poziomu jTerma. Z tej możliwości będą mogli skorzystać tylko Ci Klienci, którzy mają wystawiane klucze na portalu Xpertis 24. W oknie wprowadzania kluczy z poziomu jTerma (Pomoc/O programie/Wprowadzenie klucza) dostępny jest przycisk: Pobierz klucz z portalu Xpertis 24. Po jego wybraniu operator zostanie poproszony o podanie nazwy użytkownika i hasła do portalu Xpertis 24. W przypadku, gdy dany użytkownik będzie miał prawo do pobierania kluczy, program automatycznie wypełni wszystkie pola w okienku (pola: klucz, termin ważności i dane licencjobiorcy). 208 Rozdział III. Architektura systemu Rozdział IV Obsługa drukarek Za przesłanie na drukarkę stworzonego w aplikacji wydruku odpowiada klient serwera aplikacji. W wyświetlonym panelu drukowania istniej możliwość zmiany domyślnych dla wybranego raportu parametrów drukowania m.in.: wskazać drukarkę, na którą raport ma zostać skierowany, sterownik, marginesy, tryb wydruku (tekstowy lub graficzny). Parametry te są odpisywane w pliku printer.ini. Wydruk przygotowywany jest przez serwer aplikacji m.in. na podstawie zbiorów prt (zawierających opisy sekwencji sterujących dla drukarki) oraz informacji o rozmiarach strony przesłanych z drivera drukarki na której raport ma być wydrukowany, po czym przesyłany do klienta serwera aplikacji i następnie przez niego interpretowany, dając możliwość podglądu wydruku i wysłania na drukarkę. Opisy drukarek są dostarczane wraz z każdym pakietem oprogramowania MacroBASE. Dodatkowo w skład Środowiska Programistycznego wchodzi narzędzie do tworzenia opisu drukarki — translator MacroPRINTER. 1 Język opisu drukarki graficznej Dla drukarki graficznej informacje o większości cech są pobierane z systemu operacyjnego. Dla końcówki działającej pod systemem Linux wykorzystywany jest system druku CUPS. Niektóre ustawienia drukarki są jednak zamieszczane w opisie. Najpierw tworzymy plik tekstowy (z końcówką .drs), który w wyniku kompilacji programem printer.exe lub MacroPRINTER pod Linuxem tworzy zbiór z końcówką .prt, czytelny dla programu. Przykładowy, skomentowany opis drukarki można uzyskać po wywołaniu printer.exe -g. Tekst będzie wypisywany na standardowe wyjście programu. Format pliku źródłowego jest następujący: 209 210 Rozdział IV. Obsługa drukarek [sekcja] parametr = wartość W danej sekcji może być definiowanych kilka parametrów. Dostępne sekcje to: margin tu możemy określić wartości dla parametrów: left lewy margines, domyślna wartość 0, right prawy margines, domyślna wartość 0, top górny margines, domyślna wartość 0, bottom dolny margines, domyślna wartość 0, physical_margin określa sposób wyliczania marginesów. Pominięcie tego parametru lub przypisanie wartości 0 oznacza, że obszar do drukowania, będzie dodatkowo pomniejszony o obszar nie do drukowania ustawiony dla drukarki w systemie operacyjnym. Dla wartości 1 margines będzie równy większej z liczb — przypisanej wartości marginesu i odpowiadającemu mu wartości obszaru nie do drukowania, i liczony od brzegu kartki, output tu określamy następujące parametry: printon czy przesłać wydruk na drukarkę viewon czy przesłać wydruk na ekran copy czy przesłać wydruk do kopii nopanel czy panel jest niedostępny bottomline czy wysyłany wiersz na drukarkę wyświetlać w linii statusu IV.1. Język opisu drukarki graficznej signatureoff czy wyłączyć drukowanie sygnatury graphic czy dostępne są elementy graficzne Przypisanie wartości 0 oznacza wyłączenie danej cechy, wartość różna od zera oznacza, że dana cecha będzie dostępna, paper możemy określić domyślną orientację strony ustawiając odpowiednio parametr landscape na 0 — pionowa, 1 — pozioma lub -1 — domyślne ustawienie ze sterownika systemowego drukarki, character_set w tej sekcji można ustawić parametr text_only mówiący czy wydruk ma być prezentowany w trybie tylko tekst fonts określamy jeden parametr fonts, przypisując mu tekst składający się z liter, które będą nazwami definiowanych później czcionek. Dla przykładu, poniższy fragment [fonts] fonts = abc określa, że będziemy definiować trzy kroje, o nazwach a, b i c. spaces określamy jeden parametr Spaces, przypisując mu tekst składający się z liter, które będą nazwami definiowanych później odstępów międzywierszowych. Dla przykładu, poniższy fragment [spaces] spaces = ABC określa, że będziemy definiować trzy wysuwy, o nazwach A, B i C. default określamy dwa argumenty fontstd i spacestd. Przypisujemy im jednoliterowe nazwy odpowiednio kroju i wysuwu, które będą używane jako domyślne. Domyślną wartością dla obu parametrów jest A. 211 212 Rozdział IV. Obsługa drukarek font X określamy czcionkę. Zamiast X podajemy dowolną jednoliterową nazwę definiowanego kroju. W sekcji możemy zdefiniować poniższe parametry: name nazwa czcionki zainstalowanej w systemie. Nie można jednak wybrać czcionki proporcjonalnej. Dodatkowo, po przecinku, możemy określić stronę kodowa czcionki ( 238 — Eastern Europe, 0 — Ansi, 255 — OEM, 8 – UTF-8, 1 — default ). Domyślną czcionką jest Courier New, domyślną stroną kodową 238. Przypisywany argumentu nie może mieć więcej niż 30 znaków (dłuższe napisy będą przycinane), bold przypisanie wartości 1 oznacza czcionkę pogrubioną. Domyślną wartością jest 0, czyli brak pogrubienia, underline przypisanie wartości 1 oznacza czcionkę podkreśloną. Domyślną wartością jest 0, czyli brak podkreślenia, italic przypisanie wartości 1 oznacza czcionkę pochyloną. Domyślną wartością jest 0, czyli brak pochylenia, unit określa czy następny parametr wyrażony jest w ilości znaków na stronę (0) czy w ilości znaków na cal (1). Domyślną wartością jest 0, chars_per_inch określa rozmiar czcionki. Przypisujemy liczbę znaków drukowanych na jednym calu lub na jednej stronie, w zależności od ustawienia parametru powyżej. Domyślną wartością jest 10, space X określamy odstęp międzywierszowy. Zamiast X podajemy dowolną jednoliterową nazwę definiowanego wysuwu. W sekcji możemy zdefiniować poniższe parametry: name nazwa wysuwu. Domyślną wartością jest Normal. IV.2. Język opisu drukarki tekstowej unit określa czy następny parametr wyrażony jest w ilości linii na stronę (0) czy w ilości linii na cal (1). Domyślną wartością jest 0, lines_per_inch określa wysokość wysuwu. Przypisujemy liczbę linii drukowanych na jednym calu lub na jednej stronie, w zależności od ustawienia parametru powyżej. Domyślną wartością jest 6, 2 Język opisu drukarki tekstowej Oprócz drukowania w trybie graficznym, można drukować w trybie tekstowym. Opis drukarki należy skompilować programem printer.exe (dla systemu Windows) lub MacroPRINTER (dla systemu Linux) wywołanym z opcją -t i nazwą pliku. W panelu drukarki po wybraniu przycisku Sterownik pojawi się lista wszystkich skompilowanych opisów drukarek, umieszczonych w katalogach wskazywanych przez plik z deklaracją ścieżek. Sterowniki tekstowe będą identyfikowane poprzez napis przypisany do driver. Graficzne wyświetlane są jako Sterownik graficzny: z podaną nazwą pliku (bez rozszerzenia .prt). Tekst źródłowy opisu jest zbiorem tekstowym, w którym w kolejnych wierszach są definiowane cechy urządzenia. Wiersz #include "file" powoduje zastąpienie linii zawartością pliku file. Każde zdanie języka musi być zapisane w jednym wierszu. Znakiem kontynuacji wiersza jest średnik (;). Tekst od średnika aż do końca wiersza jest ignorowany, a następna linia jest traktowana jako dalszy ciąg konstrukcji języka. Linie zawierające tylko białe znaki są ignorowane. Każdy wiersz z opisem cechy rozpoczyna się od słowa kluczowego. W zależności od rodzaju opisywanej właściwości może być wymagany dodatkowy opis. Umieszcza się go w tym samym wierszu po znaku równości (=). Może on być: — napisem (tekstem umieszczonym po znaku =), — liczbą (całkowitą lub rzeczywistą z kropką dziesiętną w zapisie), — sekwencją. Sekwencja jest ciągiem znaków ASCII. Wszystkie znaki odstępu, tabulacji, kontynuacji wiersza (średniki) oraz przecinki użyte przy opisie sekwencji traktowane są jako separatory. W skład sekwencji mogą wchodzić: 213 214 Rozdział IV. Obsługa drukarek — ciągi znaków ujętych w apostrofy (np. ’[7m’). Znaki poprzedzone \ (backslash) są cytowane, zatem ’z\’apostrofem’ oznacza ciąg znaków z’apostrofem. Jedynym wyjątkiem jest cytowanie \E oznaczające znak Escape. — liczby naturalne o wartościach mniejszych niż 256 (traktowane są jako kody ASCII znaków), w zapisie dziesiętnym (rozpoczynające się cyfrą), ósemkowym (rozpoczynające się od znaku o) lub szesnastkowym (rozpoczynające się od znaku x, wykorzystujące dodatkowo cyfry abcdef). — ciągi znaków w apostrofach z zakresu ’@’..’_’ poprzedzone znakiem ^ np. ^’ABC’ (traktowane jako ciąg znaków o kodach ASCII o 64 mniejszych niż podane — w powyższym przykładzie będzie to ciąg trzech znaków o kodach 1, 2, 3), — pojedyncze znaki z zakresu ’@’..’_’, — pojedyncze znaki z zakresu ’@’..’_’ poprzedzone znakiem ^ np. ^[ (traktowane jako znak o kodzie ASCII o 64 mniejszym niż podany — w przykładzie znak o kodzie 27, czyli Esc). Opisy niektórych cech wymagają użycia argumentów. W tym przypadku znak procent (%) zyskuje specjalne znaczenie. Modyfikuje znaczenie następujących po nim znaków: — %p0, %p1,. . . ,%p9 oznaczają kolejne argumenty używane do opisu cechy. Umieszczenie ich w sekwencji powoduje umieszczenie ich wartości na stosie, — %d jest zamieniane w sekwencji na znak o wartości dziesiętnej równej wartości umieszczonej na stosie. W wyniku tej operacji wartość ze stosu jest zdejmowana, — %s jest zamieniane na ciąg znaków o wartości znajdującej się na wierzchołku stosu. W wyniku operacji wartość ze stosu jest zdejmowana, — %i zwiększa o jeden wartość argumentów %p0 i %p1, — %% jest zamieniane w sekwencji na jeden znak %. Poniżej podana jest lista możliwych do opisania cech. IV.2. Język opisu drukarki tekstowej 2.1 driver Napis, będący tekstem pojawiającym się w menu podczas wyboru opisu drukarki przez operatora. 2.2 bottomline Wiersz wysyłany na drukarkę będzie wyświetlany w najniższej linii ekranu. 2.3 cr Sekwencja sterująca drukarki powodująca powrót do początku wiersza (np. ^M). 2.4 dataseton Skierowanie wydruku do kopii dyskowej. 2.5 ffl Sekwencja sterująca drukarki powodująca wysuw do nowej lewej strony (np. ^L). 2.6 ffr Sekwencja sterująca drukarki powodująca wysuw do nowej prawej strony (np. ^L). Umieszczenie tej sekwencji w opisie oznacza druk dwustronny. Powoduje to, wydrukowanie dodatkowej pustej strony (z ewentualną stopką i nagłówkiem), jeśli wydrukowana została nieparzysta liczba stron. 2.7 firstempty Wydruk będzie poprzedzony pustą stroną. 2.8 fontstd Oznaczenie (litera) standardowej odmiany czcionki (jeśli nie wystąpiło zdanie {FONT}, bądź jeżeli wystąpiło {FONT: @} we wzorcu wydruku, to zostanie przyjęta ta odmiana). 215 216 Rozdział IV. Obsługa drukarek 2.9 height Wysokość strony w calach (np. 11.67). Ma znaczenie tylko po wybraniu opcji Rozmiar strony ze sterownika w panelu drukarki. 2.10 init Sekwencja sterująca drukarki wysyłana przed każdym rozpoczęciem wydruku. 2.11 lpcmd Polecenie drukowania dla systemu operacyjnego. Cecha ma znaczenie tylko w wersji z końcówką pod systemem Linux, po zaznaczeniu Po zaznaczeniu opcji Tryb tekstowy, Rozmiar strony ze sterownika oraz Używaj lpcmd. W przypisanej sekwencji należy użyć przekazywanych argumentów: %p0%d będzie zastąpione żądaną liczbą kopii, %p1%s będzie zastąpione nazwą drukarki logicznej lub klasy drukarek, gdzie ma być drukowane sprawozdanie. Jeśli nazwa drukarki ( cecha device z opisu) będzie pusta lub nieokreślona, to %p1%s będzie miało wartość ustawioną w panelu wydruku, %p2%s będzie zastąpione nazwą pliku przeznaczonego do wydruku Jeśli nie zdefiniujemy własnego polecenia drukowania, zostanie domyślnie przyjęte lpcmd = ’lpr -P%p1%s -#%p0%d %p2%s 2>/dev/null 1>/dev/null’ 2.12 nl Sekwencja sterująca drukarki powodująca wysuw wiersza (np. ^J). 2.13 nopanel Wyłączenie dostępu operatora do dialogu określającego parametry drukowania. IV.2. Język opisu drukarki tekstowej 217 2.14 pagel Sekwencja sterująca drukarki: wysyłana na początku lewej strony. 2.15 pager Sekwencja sterująca drukarki wysyłana na początku prawej strony. Umieszczenie tej sekwencji w opisie oznacza druk dwustronny. Powoduje to, wydrukowanie dodatkowej pustej strony (z ewentualną stopką i nagłówkiem), jeśli wydrukowana została nieparzysta liczba stron. 2.16 printon Skierowanie wydruku na drukarkę. 2.17 spacestd Oznaczenie (litera) wysuwu standardowego (jeśli nie wystąpiło zdanie {SPACE} lub wystąpiło {SPACE: @} we wzorcu wydruku, to zostanie przyjęta ta odmiana). 2.18 translate Sekwencja określająca tabelę translacji drukarki. Podana sekwencja powinna zawierać 256 znaków. Pierwszy znak sekwencji określa znak, na jaki będzie zamieniany znak o kodzie ASCII 0, drugi określa zamianę znaku o kodzie ASCII 1 itd. Każdy znak wysyłany na drukarkę będzie zamieniany na przypisany mu znak w tabeli translacji. 2.19 viewon Skierowanie wydruku na ekran. 2.20 width Szerokość strony w calach (np. 13.8). Ma znaczenie tylko po wybraniu opcji Rozmiar strony ze sterownika w panelu drukarki. 218 Rozdział IV. Obsługa drukarek Właściwości pisma drukarki Opis różni się od dotychczas omawianych — zajmuje po dwie linie w źródle opisu. 2.21 font Opis odmiany czcionki. Definicja przyjmuje następującą postać: font letter font_name #cpi +beg_seq -end_seq gdzie: — letter zastępujemy literą alfabetu łacińskiego. Litera ta, podana jako argument konstrukcji {FONT: c}, będzie określać odmianę czcionki, — font_name zastępujemy słownym opisem odmiany czcionki — podany tu tekst będzie dostępny jako pozycja menu podczas określania standardowej odmiany czcionki. Długość tekstu nie może przekraczać 20 znaków (dłuższe będą przycinane), — cpi zastępujemy liczbą rzeczywistą, określającą liczbę drukowanych znaków na cal, — beg_seq zastępujemy sekwencją sterującą drukarki włączającą daną odmianę czcionki, — end_seq zastępujemy sekwencją sterującą drukarki wyłączającą daną odmianę czcionki. 2.22 space Opis odstępu międzywierszowego. Definicja przyjmuje następującą postać: space letter space_name #lpi +beg_seq -end_seq gdzie: — letter zastępujemy literą alfabetu łacińskiego. Litera ta, podana jako argument konstrukcji {SPACE: c}, będzie określać rodzaj odstępu międzywierszowego, IV.2. Język opisu drukarki tekstowej — space_name zastępujemy słownym opisem odstępu międzywierszowego — podany tu tekst będzie dostępny jako pozycja menu podczas określania standardowego wysuwu. Długość tekstu nie może przekraczać 20 znaków (dłuższe będą przycinane), — lpi zastępujemy liczbą rzeczywistą, określającą liczbę drukowanych linii na cal, — beg_seq zastępujemy sekwencją sterującą drukarki włączającą daną odmianę odstępu międzywierszowego. 219 220 Rozdział IV. Obsługa drukarek Rozdział V Kopie bezpieczeństwa 1 Opis ogólny Cel wykonywania kopii bezpieczeństwa danych dla każdego systemu bazodanowego jest oczywisty. Musimy mieć możliwość odtworzenia spójnych danych po awarii systemu. Awaria taka może być spowodowana uszkodzeniem sprzętu, nagłym zanikiem zasilania jak również błędem użytkownika lub samego programu. Kopie bezpieczeństwa danych powinny być wykonywane jak najczęściej i regularnie. Wtedy mamy pewność, że po awarii będziemy potrafili odtworzyć dane z jak najbliższej przeszłości i ilość danych do uzupełnienia będzie mała. 2 Scenariusz wykonywania Aby mieć pewność wykonania spójnej kopii bezpieczeństwa należy zagwarantować zatrzymanie serwera na czas wykonywania kopii bezpieczeństwa. Tak więc prawidłowy scenariusz postępowania przy tworzeniu kopii zapasowej danych powinien mieć następujący przebieg: 1. zatrzymanie serwera aplikacji, o ile jest używany i uruchomiony na tym samym komputerze, co serwer bazy danych. Po zatrzymaniu serwera aplikacji, automatycznie zostaną zamknięte uruchomione aplikacje (procesy mblogics.exe dla Windows i MacroAppSERVER dla systemu Linux), 2. zatrzymanie maszyny bazy danych wraz z automatycznym wylogowaniem aktywnych użytkowników, 221 222 Rozdział V. Kopie bezpieczeństwa 3. wykonujemy kopię bezpieczeństwa danych. Sposób i użyte narzędzie jest dowolnym wyborem administratora, 4. uruchamiany serwer bazy danych i serwer aplikacji. Możemy ponownie rozpocząć pracę. 3 Wykorzystywane polecenia 3.1 System operacyjny Windows NT/2000/2003 — zatrzymanie serwera aplikacji (usługi MacroAppSERVER): mblaunch.exe -ev -n — uruchomienie serwera aplikacji (usługi MacroAppSERVER): mblaunch.exe -bv -n — zatrzymanie maszyny bazy danych (usługi MacroBASE): W tym przypadku może pojawić się komunikat o ewentualnych zarejestrowanych użytkownikach. Aby wymusić zatrzymanie z automatycznym wylogowaniem użytkowników należy użyć opcji -f. nserv32.exe -fv -n dla wersji 32-bitowej, lub nserv64.exe -fv -n dla wersji 64-bitowej — uruchomienie maszyny bazy danych (usługi MacroBASE): nserv32.exe -bv -n dla wersji 32-bitowej, lub nserv32.exe -bv -n dla wersji 64-bitowej We wszystkich powyższych poleceniach opcja -n pozwala uniknąć wyświetlania komunikatów potwierdzających wykonanie zadania. V.3. Wykorzystywane polecenia 3.2 System operacyjny Linux — zatrzymanie maszyny bazy danych MacroADMIN -stop Użytkownicy zostaną automatycznie wyrejestrowani. Gdy pliki konfiguracyjne serwera znajdują się w innym niż MacroADMIN miejscu należy wskazać je używając opcji -p. Polecenie ma wtedy postać: MacroADMIN -ppath -stop Jeśli uruchamiamy także serwer komunikacyjny, to jego także musimy zatrzymać (z automatycznym odłączeniem wszystkich zarejestrowanych użytkowników) za pomocą polecenia: MacroCOMM -ppath -stop_f — uruchomienie maszyny bazy danych Używając opcji -p należy wskazać katalog z plikami konfiguracyjnymi serwera. Bez wskazania tej ścieżki serwer nie zostanie uruchomiony. Gdy katalogiem roboczym serwera ma być inny niż bieżący, należy wskazać go używając opcji -w. Tak więc polecenie uruchomienia serwera bazy danych ma postać: MacroSERVER -ppath -wpath dla wersji 32-bitowej, lub MacroSERVER64 -ppath -wpath dla wersji 64-bitowej. Jeśli uruchamiamy także serwer komunikacyjny to dodatkowo należy wykonać: MacroCOMM -ppath 223 224 Rozdział V. Kopie bezpieczeństwa 4 Ograniczenia systemu Stałe istotne dla pracy systemu MacroBASE: — Liczba użytkowników — 1023 dla wersji 64-bitowej MacroSERVERA oraz 255 dla wersji 32-bitowej. Określa maksymalną liczbę wszystkich użytkowników jacy mogą zarejestrować się w serwerze bazy danych i jest niezależna od ilości stanowisk określonej w licencji. Dotyczy ona użytkowników zarejestrowanych poprzez klientów serwera aplikacji oraz inne rodzaje dostępu jak – mbasic — np. ODBC, przeglądarka Crystal Reports – MacroCGI — praca przez przeglądarkę internetową – sesje uruchomione pleceniem fork_hid Ilości dostępów dla poszczególnych grup określa się w pliku macro.cfg (sekcja: III.22), — Maksymalny rozmiar zbioru z danymi (*.mdb) nie może przekraczać 28GB (zarówno w wersji 32, jak i 64 bitowej), — Długość ścieżki na dysku — 259 Rozdział VI Kody błędów Poniżej przedstawiona została lista błędów, które mogą być zgłoszone podczas pracy systemu: 001 Inny właściciel. 002 Brak takiego pliku lub katalogu. Wystąpił problem z dostępem do pliku lub katalogu. Błąd może wynikać z pomylonej nazwy lub braku uprawnień. 003 Brak takiego procesu. 004 Przerwane wywołanie systemowe. 005 Błąd wejścia-wyjścia. 006 Brak takiego urządzenia lub adresu. 007 Za długa linia polecenia. 008 Błąd w kodzie programu. 009 Błędny numer zbioru lub dostęp niezgodny z trybem otwarcia. 010 Brak procesu potomnego. 011 Zasób czasowo niedostępny (zablokowany). 012 Za mało pamięci. 013 Zabroniony dostęp. 014 Niedozwolony adres. 225 226 Rozdział VI. Kody błędów 015 Wymagane urządzenie blokowe. 016 Urządzenie już zajęte. 017 Plik już istnieje. 018 Skrzyżowane połączenie. 019 Brak takiego urządzenia. 020 Oczekiwana nazwa katalogu. 021 Niewłaściwy zapis do katalogu. 022 Niewłaściwy argument. 023 Brak miejsca na nowy plik. 024 Za dużo otwartych plików. 025 Wymagane urządzenie znakowe. 026 Program w użyciu. 027 Za długi plik. Błąd może się pojawić, jeśli uruchamiany plik z formułami będzie miał za duży rozmiar (ponad 64k bajtów). 028 Brak miejsca na urządzeniu. 029 Wskaźnik pliku użyty dla potoku. 030 System plików tylko do odczytu. 031 Za dużo dowiązań. 032 Przerwany potok. 033 Niedozwolony argument funkcji matematycznej. 034 Utrata dokładności wyniku. 035 Brak oczekiwanego typu komunikatu międzyprocesowego. 036 Identyfikator został usunięty. 037 Numer kanału spoza zakresu. 227 038 Niezsynchronizowany poziom 2. 039 Poziom 3 zatrzymany. 040 Zainicjowany poziom 3. 041 Numer połączenia spoza zakresu. 042 Niedołączony protokół sterownika. 043 Niedostępna struktura CSI. 044 Poziom 2 zatrzymany. 045 Zakleszczenie wykryte i usunięte. Błąd taki może wystąpić również w przypadku, przekroczenia parametru systemu, mówiącego o maksymalnej liczbie zablokowanych plików. W takim przypadku może pomóc zmniejszenie liczby plików otwieranych przez system, poprzez dodanie w pliku konfiguracyjnym (macro.cfg) linii: files = 20. 046 Brak wolnych blokad plików. 047 Zbiór jest zablokowany. 048 Element ścieżki nie jest katalogiem. 049 Błąd 49. 050 Błędny deskryptor wymiany. 051 Błędny deskryptor żądania. 052 Pełna tabela wymiany. 053 Przepełniona tabela węzłów. 054 Błędny kod żądania. 055 Niewłaściwe gniazdo. 056 Zakleszczenie blokady plików. 057 Błędny format pliku fontów. 228 Rozdział VI. Kody błędów 058 Błąd 58. 059 Błąd 59. 060 Urządzenie nie jest typu STREAMS. 061 Brak danych. 062 Przekroczony limit czasu. 063 Brak zasobów typu STREAMS. 064 Maszyna nie jest w sieci (RFS). 065 Pakiet programowy niezainstalowany. 066 Obiekt jest zdalny (RFS). 067 Połączenie uszkodzone (RFS). 068 Błąd rejestracji (RFS). 069 Błąd deinstalacji zasobów (RFS). 070 Błąd przy przesyłaniu komunikatu (RFS). 071 Błąd protokołu. 072 Błąd 72. 073 Błąd 73. 074 Urządzenie zdalne niedostępne (RFS). 075 Błąd 75. 076 Błąd 76. 077 Błąd formatu danych dla urządzenia typu STREAMS. 078 Za długa nazwa pliku. 079 Błąd 79. 080 Nazwa jest nieunikalna w sieci. 081 Deskryptor pliku w złym stanie. 229 082 Zmieniony adres zdalny. 083 Dzielona biblioteka niedostępna. 084 Dzielona biblioteka uszkodzona. 085 Uszkodzona sekcja .lib w programie. 086 Próba łączenia większej niż dozwolona liczby bibliotek dzielonych. 087 Wykonanie dzielonej biblioteki niedostępne. 088 Błąd 88. 089 Funkcja nie jest zaimplementowana. 135 System plików wymaga odbudowania. 136 Błąd 136. 137 Oczekiwana nazwa pliku. 138 Niedostępne. 139 Podano nazwę pliku. 140 Błąd wejścia-wyjścia na urządzeniu zdalnym. 141 Błąd 141. 142 Błąd 142. 143 Błąd 143. 144 Błąd 144. 145 Katalog nie jest pusty. 300 Komenda wykonana bez błędu. 301 Błędne wykonanie funkcji podstawowej. 302 Nie znaleziono pliku. 303 Błąd w nazwie pliku. 304 Za mało dostępnej pamięci. 230 Rozdział VI. Kody błędów 305 Za mało dostępnego miejsca na dysku. 306 Błędna wartość parametru. Błąd może się pojawić przy otwieraniu systemu, jeśli indeks otwieranej tabeli był wcześniej otwarty i nie ma identycznego schematu — jest inaczej zdefiniowany w systemie już działającym i otwieranym. Wystąpienie błędu w funkcji OpenIndex może również oznaczać za długi klucz indeksowy. Nie można definiować kluczy indeksowych o długości większej niż 244. 307 Brak lub niewłaściwa nazwa użytkownika. Błąd pojawia się po podaniu błędnej nazwy użytkownika przy rejestrowaniu się do systemu. Podana nazwa użytkownika musi się rozpoczynać od litery. 308 Niezarejestrowany użytkownik (nieznany uchwyt). 309 Nieotwarta tablica (nieznany uchwyt). Błąd zgłaszany jest w przypadku, gdy nastąpiło odwołanie do nieotwartej tabeli. Może to dotyczyć tabel maskowanych, które nie zostały otwarte w programie funkcją use. 310 Nieotwarty indeks (nieznany uchwyt). 311 Za dużo użytkowników. Błąd pojawia się po próbie zarejestrowania do systemu, jeśli w serwerze bazy danych jest zarejestrowany komplet użytkowników. W przypadku, jeśli liczba użytkowników jest mniejsza od liczby stanowisk w serwerze, należy sprawdzić listę użytkowników serwera i usunąć użytkowników nie korzystających już systemu. Użytkownik może pozostać zarejestrowany w serwerze, jeśli zakończył pracę w sposób nieprawidłowy, np. przez wyłączenie komputera. 312 Za dużo tablic. Przekroczono maksymalną dopuszczalną liczbę akronimów tablic używanych w systemie. 313 Za dużo zbiorów indeksowych. 231 314 Wersja demonstracyjna — za dużo rekordów. Przekroczono maksymalną dopuszczalną liczbę rekordów w jednej tabeli systemu. 315 Brak rekordu. 316 Odwołanie poza bieżący zakres. Błąd taki pojawia się np. przy próbie dodania rekordu, który nie pasuje do aktualnego ograniczenia (prefiksu) nałożonego na dziedzinę tabeli. 317 Rekord o już istniejącym kluczu. Błąd pojawia się po próbie dołączenia rekordu o takim samym kluczu, co w rekordzie już wcześniej dodanym. Jeśli indeks jest oznaczony jako unikalny, to system nie dopuszcza do podwajania klucza. 318 Odwołanie do nieistniejącego rekordu. W programie nastąpiło odwołanie poprzez złączenie do rekordu, który nie istnieje w bazie danych (np. został usunięty lub błędnie zostało wypełnione pole złączeniowe). Jeśli błąd w danych zapisanych na dysku, to należy je naprawić poprzez wywołanie programu MacroTRANSFER z opcją -c. 319 Błędny dostęp. 320 Niedozwolona próba blokady. 321 Zablokowane zapisywanie i blokowanie na wyłączność. Tabela jest zablokowana przez innego użytkownika. 322 Zablokowane zapisywanie i blokowanie. Tabela jest zablokowana przez innego użytkownika. 323 Zablokowane odczytywanie, zapisywanie i blokowanie. Tabela jest zablokowana przez innego użytkownika. 324 Rekord został już poprawiony. Modyfikowany rekord został poprawiony przez innego użytkownika w czasie pomiędzy odczytaniem wartości rekordu, a próbą zapisania po zmodyfikowaniu. W takim przypadku program nie pozwala na wprowadzenie zmian. 232 Rozdział VI. Kody błędów 325 Rekord został usunięty. Modyfikowany rekord został usunięty przez innego użytkownika w czasie pomiędzy odczytaniem wartości rekordu, a próbą zapisania po zmodyfikowaniu. W takim przypadku program nie pozwala na wprowadzenie zmian. 326 Brak integralności zbiorów indeksowych. Program nie może odtworzyć w prawidłowy sposób zbiorów indeksowych. Wersja klient-serwer po zgłoszeniu błędu kończy działanie. Należy w takim przypadku uruchomić wersję jednostanowiskową i usunąć przyczynę błędu. W większości przypadków będzie to powtórzony klucz w indeksie oznaczonym jako unikalny lub odwołanie do nieistniejącego rekordu dla indeksów z polami w złączeniu. W celu uzyskania listy błędnych rekordów można się posłużyć metodami klasy NDXTEST (opis pod hasłem _ndxtest). 327 Błąd wewnętrzny systemu. 328 Trwa tworzenie zbioru indeksowego. 329 Brak łączności z maszyną bazy danych. Błąd pojawia się przy braku komunikacji pomiędzy klientem a serwerem. Przyczyną może być zatrzymanie serwera lub zła konfiguracja sieci. 330 Za dużo zablokowanych rekordów. Przekroczona została maksymalna liczba zablokowanych jednocześnie rekordów. Dla pojedynczej maski liczba blokad założona przez wszystkich użytkowników nie może przekraczać 33 milionów. 331 Brak zablokowanych rekordów. 332 Zablokowane zapisywanie bieżącego rekordu. Rekord lub tabela jest zablokowana przez innego użytkownika. 333 Zablokowane odczytywanie i zapisywanie bieżącego rekordu. Rekord lub tabela jest zablokowana przez innego użytkownika. 334 Rekord nie jest zablokowany. 335 Zablokowany dostęp do pola. 339 Niemożliwe zwiększenie liczby uchwytów plików aplikacji. 233 340 Nieznany błąd. 341 Licencja nie zezwala na uwierzytelnianie kartą SmartCard. 342 Licencja nie zezwala na połączenie z wykorzystaniem protokołu SSL. 344 Transakcja już rozpoczęta. Błąd zgłaszany jest przy próbie rozpoczęcia transakcji przed zakończeniem wcześniej rozpoczętej. 345 Tabele złączeniowe umieszczone na różnych serwerach 348 Indeks i tabela umieszczone na różnych serwerach 349 Nieokreślona pozycja rekordu. 350 Serwer nie może załadować pliku typu ’.dll’. Sprawdź plik server.log 351 Brak miejsca w pamięci stronicowanej. 352 Błąd wewnętrzny systemu (deskryptor pamięci). 353 Błąd wewnętrzny systemu (błędny element pamięci). 354 Błąd wewnętrzny systemu (adresowanie pamięci). 355 Błąd wewnętrzny systemu (nieunikalny zapis). 356 Błąd obsługi pamięci stronicowanej. 357 Za długi bufor lub zbyt duża liczba pól tabeli. 358 Zablokowane zapisywanie i blokowanie bieżącego rekordu. 359 Szyfrowanie zbioru — niezgodność z definicją. 360 Rekord wykorzystywany w innych tabelach nie może być usunięty. 362 Niezgodne wersje plików tabeli i słownika. Sygnatura otwartego pliku słownika jest inna niż sygnatura zapisana w nagłówku tabeli. Oznacza to, że złączenia były przypisywane do innego pliku słownika o takiej samej nazwie. 234 Rozdział VI. Kody błędów 363 Niedozwolona modyfikacja W tabelach z polem typu REFERENCE nie można zmieniać wartości pola REFERENCE, dodawać lub usuwać rekordów z niezerową wartością pola REFERENCE. 364 Błędna wartość licznika. Została wykryta nieprawidłowa wartość licznika. Po pojawianiu się błędu należy koniecznie wywołać transfer naprawczy liczników (opcja -c). 365 Niewłaściwa maska słownika. Przy odczytywaniu wartości pola w złączeniu bieżąca maska słownika musi odpowiadać masce zapisanej w polu złączeniowym. Należy o to zadbać poprzez odpowiednie wywołanie metody use. 366 Powtórzona sygnatura pliku Serwer nie dopuszcza do otwarcia dwóch plików o takiej samej sygnaturze. Sytuacja taka może się pojawić po uruchomieniu drugiej kopii systemu użytkowego. W takiej sytuacji należy wywołać transfer naprawczy liczników (opcja -c) dla jednego z systemów. Po takiej operacji, będą nadane nowe sygnatury dla wszystkich przetwarzanych plików. 368 Użytkownik udzielający licencji bieżącemu został wyrejestrowany z serwera. Błąd może wystąpić w programie uruchomionym poprzez wywołanie funkcji fork_hid(). Ma to miejsce wtedy, gdy zakończy działanie program, z którego został uruchomiany. 369 Tabela otwarta przez inną aplikacje lub niepoprawnie zamknięta. 370 Przekroczona dopuszczalna liczba kontekstów. Przekroczono maksymalną liczbę odłożonych i nie pobranych kontekstów dla tabeli — parametr max_cnt_psh w pliku konfiguracyjnym. 371 Niepusty stos kontekstów. Błąd zgłaszany tylko przy uruchomieniu z opcją -d. Oznacza że pozostały niepobrane konteksty dla danej tabeli. 374 Brak praw odczytu pola. 375 Brak praw odczytu tabeli. 235 376 Niepoprawna długość pola napisowego. 377 Wykryty cykl w polu typu TREE_REF. 378 Wartość w polu typu TREE_REF wskazuje na nieistniejący rekord. 379 Zmiana klucza niedozwolona. Zmiana pola występującego w kluczu indeksowym przed polem typu TREE_REF jest niedozwolona. 380 Naruszenie struktury hierarchicznej. 381 Operacja na drzewie z indeksem unikatowym niemożliwa. 382 Niedozwolona ścieżka sieciowa. Zbiory z danymi (pliki *.mdb) nie mogą być umieszczane na dyskach sieciowych. 383 Błąd obsługi blokowania rekordów. 384 Licznik rekordu osiągnął maksymalną wartość. 400 Nieprawidłowa nazwa użytkownika. 401 Niezarejestrowany użytkownik lub nieprawidłowe hasło. 401 Niezarejestrowany użytkownik AD lub nieprawidłowe hasło. 401 Konto użytkownika zostało zablokowane z powodu przekroczenia dopuszczalnej liczby błędnych logowań. 402 Nieudane uwierzytelnienie za pomocą certyfikatu z karty SmartCard. 403 Nie znaleziono klucza protekcji. 404 Rekord wykorzystywany w innych tabelach. Błąd pojawia się przy próbie usunięcia rekordu, do którego są odwołania z innych tabel. Przed usunięciem rekordu należy usunąć wszystkie odwołania do niego. 405 Nie znaleziono zbioru. 406 Nie znaleziono zasobu. 406 Błędne dane w pliku .ini. 236 Rozdział VI. Kody błędów 407 Niewłaściwy typ udostępniony przez formułę. 408 Metoda niedostępna dla zmiennej strukturalnej. 409 Metoda niedostępna podczas transakcji. 409 Funkcja niedostępna podczas transakcji. 410 Niedopuszczalne znaki w nazwie. 410 Niedopuszczalne znaki w nazwie pliku. 411 Nieprawidłowy format zbioru. Otwierany zbiór ma strukturę niezgodną ze zdefiniowaną. Błąd może pojawić się na skutek integrowania systemów, w których jest inna definicja tej samej tabeli. Przyczyną może być wcześniejsza awaria systemu, w wyniku której system operacyjny nieprawidłowo zapisał zbiory (np. dokleił fragment innego pliku do zbioru z danymi). 412 Nie znaleziono rekordu zgodnego ze wzorcem. 413 Filtr włączony, redagowanie niemożliwe. 414 Brak akcji możliwych do wykonania. 415 Nie wypełnione pole. 416 Nie wypełniony wzorzec. We wzorcu nie wypełniono żadnego pola pochodzącego z bieżącej tabeli. Błąd jest zgłaszany, jeśli wypełnimy jedynie pola zmiennej lub z innej tabeli. 417 Błąd podczas importu danych. Błąd jest zgłaszany podczas importu danych, jeżeli dodanie rekordu nie było możliwe (np. podwojenie unikalnego klucza, brak rekordu w słowniku itp). 418 Błąd podczas eksportu danych. Błąd jest zgłaszany w przypadku, gdy nie udało się zapisać rekordu do pliku tekstowego (np. separator pól występuje w treści pola). 418 Błąd podczas eksportowania danych. Przekroczenie bufora danych. 419 Niedozwolone rekurencyjne wywołanie funkcji. 237 420 Metoda niedostępna przed otwarciem tabeli. 421 Brak kontekstu do odtworzenia. 422 Nazwa zbioru niezgodna z maską. 423 Błędny format importowanych danych. 424 Za długi rekord w importowanych danych. 425 Nieotwarta połączona tabela. 426 Niedozwolone redagowanie pól. 427 Powrót do nieredagowalnego pola. 428 Akcja niedostępna dla zablokowanego rekordu. 429 Zbyt długi klucz sortowania. 430 Błąd wewnętrzny. 430 Wywołanie funkcji dozwolone tylko w oknie redagowania umiesczonym w oknie grupowym. 430 Wywołanie funkcji niedozwolone w trakcie redagowania. 431 Akronim pola nie został znaleziony. 432 Indeks nie został znaleziony. 433 Indeks nie jest tymczasowy. 434 Nie zdefiniowano żadnego użytkownika. 435 Za dużo rekordów w liście. 436 Brak zasobów systemu MacroBASE. 437 Nieprawidłowy akronim. 437 Nieprawidłowy identyfikator okienka. 437 Powtórzony identyfikator okienka w grupie. 438 Akronim jest już zadeklarowany. 238 Rozdział VI. Kody błędów 439 Przekroczona liczba zadeklarowana w macro.cfg. 440 Niewłaściwa nazwa typu pola. 441 Wymagany akronim tabeli tymczasowej. 442 Nieprawidłowa długość pola. 443 Przekroczona maksymalna długość nazwy. 444 Utworzenie indeksu tymczasowego nie jest możliwe. 445 Za dużo indeksów tymczasowych. Błąd jest zgłaszany przy próbie przekroczenia maksymalnej dopuszczalnej liczby rekordów dla tabeli. W celu uniknięcia błędu należy dbać o usuwanie niewykorzystywanych indeksów tymczasowych. 446 Niewłaściwa maska tabeli. Błąd pojawia się przy próbie podczytania wartości w złączeniu w przypadku, gdy złączenie jest do innej maski niż obecnie ustawiona. Należy zadbać o właściwą maskę słownika poprzez wywołanie metody use. 447 Niewłaściwy typ pola. 448 Brak pól w oknie. 449 Brak pola złączeniowego w indeksie. 450 Brak formuły na wartość początkową pola indeksu. 451 Błąd przy tworzeniu menu. 452 Nieistniejąca akcja. 453 Akcja niedostępna dla pustej dziedziny. 454 Akcja o podanym kluczu już istnieje. 455 Niedopuszczalna wartość parametru. 455 Niedopuszczalna wartość argumentu. Błąd przy tworzeniu tymczasowego okienka redagowania. 455 Nieprawidłowe położenie okienka. Błąd przy tworzeniu tymczasowego okienka redagowania. 239 456 Metoda niedostępna dla otwartego okna. 456 Funkcja niedostępna przy wyświetlonym oknie słownika DEFINE. 456 Metoda niedostępna dla otwartego okna. 457 Przekroczony dopuszczalny rozmiar okna. 458 Przekroczony zakres tablicy 459 Błąd w wyrażeniu SQL. 460 Brak formuły w pliku ’macro.use’. Dla każdego pola złączeniowego z reprezentantem wchodzącego do indeksu musi być zdefiniowana formuła w pliku macro.use wskazująca maskę słownika. 461 Nazwa pliku słownika niezgodna z maską. 462 Próba usunięcia ostatniego indeksu. 463 Brak pola w złączeniu. 464 Metoda niedostępna dla okna zdefiniowanego w generatorze aplikacji. 464 Nieprawidłowy identyfikator panelu. 464 Panel o podanym identyfikatorze już istnieje. 464 Przekroczona maksymalna liczba paneli. Okno można podzielić maksymalnie na 6 paneli. 464 Nieprawidłowe położenie linii podziału. Utworzenie panelu niemożliwe. 464 Metoda niedostępna przy pustym panelu. 464 Metoda niedostępna w oknie z podziałem. 464 Niepusty identyfikator panelu w oknie bez paneli. 464 Próba ukrycia wszystkich okienek w oknie grupowym. 464 Metoda niedostępna w panelu bez zakładki. 464 Metoda niedostępna przy pustym panelu w zakładce. 240 Rozdział VI. Kody błędów 464 Dodanie zakładki przy pustym panelu w zakładce niedozwolone. 464 Brak identyfikatora panelu. 464 Nieprawidłowy numer zakładki. 465 Przekroczenie maksymalnej dopuszczalnej liczby. 466 Akcja dostępna tylko w menu pierwszego poziomu. 467 Przekroczona liczba poziomów menu. 468 Za długa etykieta pola. 469 Błędne dowiązanie do funkcji. 470 Niedozwolone znaki w nazwie systemu. Długość nazwy systemu nie może przekraczać 8 znaków. 471 Błąd wykonania zewnętrznego polecenia. 472 Niedozwolone znaki w nazwie pliku (wyszukiwanie zgodne z *.pth). W nazwie pliku szukanego na podstawie deklaracji ścieżek nie mogą wystąpić metaznaki. 472 Niedozwolone znaki w nazwie pliku. 472 Niedozwolone znaki w ścieżce do pliku. 472 Niedozwolone znaki zwracane przez kontrolkę. 472 Zbyt długi text zwracany przez kontrolkę. 473 Zbyt dużo warunków dla jednego pola 474 Export (import) pola podwójnie złączonego jest zabroniony 475 Funkcja zaimplementowana wyłącznie w module MacroCGI. 476 Nieznany typ ikony do wyświetlenia. 477 Błąd przy tworzeniu warunku funkcji ext_tab. 478 Błąd w transakcji. Program zostanie zakończony. 241 479 Niedozwolone odwołanie do katalogu (wyszukiwanie zgodne z *.pth). Nazwa pliku wyszukiwanego zgodnie z deklaracja ścieżek nie może być poprzedzona nazwą katalogu. 480 Za długie polecenie. 481 Okienko zawiera elementy z nieistniejącej tabeli. 482 Pola tabeli użyte w aktywnym okienku. Tabeli nie można usunąć. 483 Długość parametru dla ext_tab przekracza 255 znaków. 484 Błąd przy tworzeniu warunku funkcji find_tab. 484 Błąd przy tworzeniu warunku funkcji find_tab. Przekroczony rozmiar bufora. 485 Długość parametru dla find_tab przekracza 255 znaków. 486 Nieznana wersja pliku definicji systemu. 487 Nieprawidłowy numer zakładki. 488 Błąd procedury wbudowanej. 489 Błąd obsługi grup rekordów. 490 Zabronione redagowanie pola. 491 Brak pola w okienku. 492 Akcja nie może być grupowa 492 Akcja w oknie z kontrolką nie może być grupowa. 492 Akcja w oknie redagowania nie może być grupowa. 493 Akcja nie jest grupowa, a określono formułę dla grupy 494 Za dużo pól w okienku 494 Za dużo przycisków przypisanych do pola okienka. Dla jednego pola można dodać maksymalnie 8 przycisków. 495 Akcja dla pustej dziedziny nie może być grupowa. 242 Rozdział VI. Kody błędów 496 Akcja grupowa niedostępna podczas transakcji. 497 Definicja wygenerowana pośrednią wersją generatora aplikacji. 498 Nieprawidłowe położenie okienka. 498 Okienko z kontrolkami nie może być pierwsze w grupie. 498 Pierwszym oknem w oknie słownika nie jest okienko wertowania tabeli słownika. 498 Pierwszym oknem w okna grupowego w raporcie nie jest okienko wertowania. 499 Okno z nieprawidłowej tabeli. 500 Bez błędu. 501 Oczekiwany dwukropek. 502 Nieprawidłowa liczba. 503 Oczekiwany symbol ’?}’. Błąd składniowy języka FORMULA+. Należy poprawić wskazaną formułę. 504 Oczekiwany symbol ’!}’. Błąd składniowy języka FORMULA+. Należy poprawić wskazaną formułę. 505 Oczekiwany nawias ’)’. Błąd składniowy języka FORMULA+. Należy poprawić wskazaną formułę. 506 Nierozpoznany symbol. Błąd składniowy języka FORMULA+. Należy poprawić wskazaną formułę. 507 Nieoczekiwany symbol. Błąd składniowy języka FORMULA+. Należy poprawić wskazaną formułę. 243 508 Oczekiwany symbol ’——’. Błąd składniowy języka FORMULA+. Należy poprawić wskazaną formułę. 509 Niespodziewany koniec formuły. Błąd składniowy języka FORMULA+. Należy poprawić wskazaną formułę. 510 Niespodziewany znak. Błąd składniowy języka FORMULA+. Należy poprawić wskazaną formułę. 511 Wymagana zmienna. 512 Oczekiwany symbol ’—!’. Błąd składniowy języka FORMULA+. Należy poprawić wskazaną formułę. 513 Oczekiwany symbol ’|}’. Błąd składniowy języka FORMULA+. Należy poprawić wskazaną formułę. 514 Nieprawidłowa nazwa zmiennej. Błąd składniowy języka FORMULA+. Należy poprawić wskazaną formułę. 515 Nieprawidłowa zmienna. 516 Niedozwolone wywołanie. 517 Błąd w procedurze. 518 Niedozwolony dostęp. 519 Niezdefiniowana wartość. 520 Wynik musi być liczbą. 521 Nieprawidłowa data. 522 Niedozwolona zmiana typu. 523 Próba dostępu do pliku niezgodnie z trybem otwarcia. 244 Rozdział VI. Kody błędów 524 Błąd w dostępie do pliku. 526 Zbyt długa stała tekstowa. 527 Brak miejsc na zmienne. Użyto więcej zmiennych niż maksymalna dopuszczalna liczba zmiennych w programie. Dostępnych jest 26 zmiennych lokalnych oraz tyle zmiennych globalnych, na ile wskazuje parametr var_cnt w pliku konfiguracyjnym (opis Konfiguracja). 528 Przekroczono głębokość rekurencji. Przekroczono maksymalną dopuszczalną liczbę rekurencyjnych wywołań funkcji. Jeśli do zakończenia funkcji potrzeba większej liczby wywołań rekurencyjnych należy zwiększyć parametr formula_recursion w pliku konfiguracyjnym (opis III.22). 529 Liczba poza zakresem. 530 Za długi tekst. 534 Operator w niedopuszczalnym kontekście. 535 Operator niezdefiniowany. Błąd taki pojawia się również po próbie podstawienia wartości na zmienną typu słownikowego. W takim przypadku niezdefiniowanym operatorem jest operator podstawienia. W celu podstawienia nowej wartości na zmienną słownikową należy ją najpierw usunąć funkcją obj_del. 539 Wymagana współrzędna numeryczna. 540 Brak współrzędnej. 541 Współrzędna poza zakresem. 542 Błędny typ współrzędnej. 543 Niespodziewana współrzędna. 544 Brak argumentu. 545 Argument poza zakresem. 546 Błędny typ argumentu. 245 547 Niespodziewany argument. 548 Nieprawidłowa lista argumentów. 549 Za dużo otwartych plików. 553 Dzielenie przez zero. 554 Nadmiar arytmetyczny. 555 Niedomiar arytmetyczny. 556 Błąd operacji na liczbie zmiennoprzecinkowej. 557 Argument spoza dziedziny funkcji. 558 Argument spoza dziedziny funkcji. 559 Częściowa utrata dokładności arytmetycznej. 560 Całkowita utrata dokładności arytmetycznej. 562 Niemożliwe otwarcie biblioteki. 563 Błąd w bibliotece. 564 Brak formuły w bibliotece. 565 Nazwa formuły za długa. Maksymalnie 15 znaków. 567 Za dużo zadeklarowanych klas lub klasa o tej nazwie występuje w systemie. Błąd może się pojawić w dwóch różnych przypadkach: 1. Powtórzenie deklaracji o takiej samej nazwie klasy. Program nie dopuszcza ponownej definicji tej samej klasy. 2. Przekroczono maksymalną liczbę deklaracji klas. Można zwiększyć liczbę dostępnych klas poprzez zwiększenie parametru class_cnt w pliku konfiguracyjnym (opis III.22). 568 Za dużo zadeklarowanych słowników. Przekroczono maksymalną liczbę do powołanych obiektów funkcją obj_new. Należy usuwać nieużywane obiekty lub zwiększyć ograniczenie poprzez ustawienie parametru obj_cnt w pliku konfiguracyjnym (opis III.22). 246 Rozdział VI. Kody błędów 569 Błąd wykonania funkcji sys_exec. 570 Formuła przerwana. 571 Nieznany rodzaj konwersji znaków. 572 Za dużo parametrów funkcji (max. 16384) 573 Zabronione wywołanie return. 574 Nieprawidłowy akronim pola. 575 Podany parametr jest zbyt długi. 576 Skończyło się miejsce na stosie. 577 Błędny format danych w standardzie UTF8. 578 Niepoprawny typ zwracany przez formułę konwersji. 579 Znak zakodowany w UTF8 nie posiada odpowiednika w MAZOVI. 580 Powtórzona nazwa pola lub metody. 581 Odwołanie do nieistniejącej metody wirtualnej. 582 Za dużo zadeklarowanych klas. 583 Za dużo parametrów formuły. Maksymalnie 26. 584 Brak praw dostępu. 585 Nieprawidłowa nazwa metody. 586 Nieprawidłowa nazwa pola. 600 Bez błędu. 601 Wynik formuły nie jest liczbą. 602 Za mała szerokość strony. 603 Spodziewane {ENTIRE-}. 604 Za długi fragment ENTIRE. 605 Nierozpoznawalne znaki w nazwie. 247 606 Nieprawidłowy nagłówek {HEADER}. 607 Nieprawidłowa stopka {FOOTER}. Zaleca się zmianę orientacji papieru, zmniejszenie marginesów i/lub czcionki. Wydruk stopki nie mieści się w zarezerwowanej na nią miejscu. Błąd niekiedy można poprawić poprzez zmianę rozmiaru strony (poszerzenie) lub zmniejszenie rozmiaru czcionki. W takim przypadku, można unikną ewentualnego załamywania wierszy, powodującego, że stopka zajmuje więcej wierszy. 608 Nieprawidłowy nagłówek {HEADERRIGHT}. 609 Nieprawidłowy nagłówek {HEADERLEFT}. 610 Nieprawidłowa stopka {FOOTERRIGHT}. Wydruk stopki nie mieści się w zarezerwowanej na nią miejscu. Błąd niekiedy można poprawić poprzez zmianę rozmiaru strony (poszerzenie) lub zmniejszenie rozmiaru czcionki. W takim przypadku, można unikną ewentualnego załamywania wierszy, powodującego, że stopka zajmuje więcej wierszy. 611 Nieprawidłowa stopka {FOOTERLEFT}. Wydruk stopki nie mieści się w zarezerwowanej na nią miejscu. Błąd niekiedy można poprawić poprzez zmianę rozmiaru strony (poszerzenie) lub zmniejszenie rozmiaru czcionki. W takim przypadku, można unikną ewentualnego załamywania wierszy, powodującego, że stopka zajmuje więcej wierszy. 612 Spodziewany {DIRECT}. 613 Spodziewany {DIRECT-}. 614 Fragment DIRECT nie mieści się na stronie. 615 Za dużo zdefiniowanych makrodefinicji. 616 Niezdefiniowana makrodefinicja. 617 Powtórzona nazwa makrodefinicji. 618 Za mało pamięci dynamicznej. 619 Za mały bufor dla DIRECT. 248 Rozdział VI. Kody błędów 620 Blok DIRECT zawarty w bloku ENTIRE. 621 Blok ENTIRE zawarty w bloku DIRECT. 622 Nieprawidłowa wersja kodu pośredniego. Raport wymaga kompilacji. Uruchamiane sprawozdanie zawiera złą skompilowaną wersję (plik .rpt). Może pochodzić z innego systemu operacyjnego lub starszej wersji programu. Należy ponownie skompilować uruchamiane sprawozdanie. 623 Nieznany symbol struktury. 624 Błąd w strukturze TOTAL. 625 Błąd otwarcia pliku. 626 Błąd czytania pliku. 627 Błędna nazwa tablicy. 628 Błędna nazwa indeksu. 629 Sprawozdanie przerwane przez użytkownika. 630 Funkcja line() nie jest dostępna. Funkcja dostępna jest tylko we fragmencie {DIRECT}. 631 Funkcja page() nie jest dostępna. Funkcja dostępna jest tylko we fragmencie {DIRECT}. 632 Wynik formuły nie jest napisem. 633 Błąd podsystemu drukującego. 634 Przekroczono głębokość rekurencji. 635 Nieprawidłowe parametry polecenia {FONT} 636 Nieprawidłowe parametry polecenia {COLOR} 637 Nieprawidłowe parametry polecenia {BITMAP} 638 Nieprawidłowe parametry polecenia {DEFINEFONT} 639 Nieprawidłowe parametry polecenia {DEFINECONST} 249 640 Nieprawidłowe określenie konstruktora R:G:B. 641 Nieprawidłowa liczba argumentów. 642 Zbyt długa nazwa pliku graficznego 643 Brak nazwy pliku graficznego 644 Zbyt długa nazwa identyfikująca ciąg {DEFINECONST} 645 Brak nazwy identyfikującej ciąg {DEFINECONST} 646 Brak określenia ciągu {DEFINECONST} 647 Określenie ciągu {DEFINECONST} zbyt długie 648 Błędna liczba argumentów {DEFINEFONT} 649 Brak nazwy określającej zasób {DEFINEFONT} 650 Jeden z wymiarów obrazka musi być większy od zera. 651 Funkcja rep_ver() nie jest dostępna. 652 Funkcja rep_name() nie jest dostępna. 653 Za długa sygnatura {SIGNATURE}. 654 Zbyt dużo poleceń i znaków w jednej linii 655 Wykonanie sekwencji MAXPAGE nie powiodło się. 656 Funkcja lineleft() nie jest dostępna. Funkcja lineleft jest dostępna jedynie przy opracowywaniu sprawozdania, poza frazą {DIRECT} 657 konstrukcja: {REP} We fragmencie sprawozdania przekazanym w konstrukcji {REP} wystąpił błąd składniowy. 658 Niedozwolone użycie w konstrukcji {REP}. 659 Funkcja charleft() nie jest dostępna. 660 Niedozwolone użycie w konstrukcji {PAGE}. 250 Rozdział VI. Kody błędów 661 Nieprawidłowy format pliku graficznego. 662 Nieprawidłowa sygnatura {SIGNATURE}. 663 Nieprawidłowa wysokość czcionki. 664 Nieprawidłowa nazwa czcionki. 665 Rozmiary bitmapy nie mogą być ujemne. 666 Bitmapa nie mieści się na stronie. 667 MAXPAGE: Liczba stron zawiera więcej cyfr niż przewiduje format. 668 Nieprawidłowy odstęp międzyznakowy. 669 Nieprawidłowa strona kodowa. 670 Fraza SELECT — nieprawidłowe menu dla okienka wertowania. 671 Niezakończona transakcja rozpoczęta w raporcie. 672 Metoda niedostępna dla zmiennej strukturalnej. 673 Wybrana drukarka jest niedostępna. 674 Konstrukcja użyta w złym kontekście 675 Za dużo znaków w wierszu — wydruk nie mieści się na stronie. 676 Wynik formuły nie jest poprawnym złączeniem do tabeli BLOB. Wymagane złączenie do tabeli BLOB lub obiekt FILE. 677 Nieprawidłowe parametry polecenia {IMAGE} 678 Funkcja img_size() jest niedostępna poza sprawozdaniem. 679 Przynajmniej jeden z marginesów jest zbyt duży. 680 Błędny numer obrazka. 681 Spodziewany otwarty obiekt typu FILE. 682 Bład w kodowaniu napisu. 683 Niespodziewany znak w sprawozdaniu. 251 684 Brak uprawnień do wykonania sprawozdania. 685 Nazwa pliku sprawozdania została zmieniona. 686 Fraza SELECT - nieprawidłowy identyfikator przycisku dla okienka wertowania. 687 Wymagana nazwa pliku, złączenie do tabeli BLOB lub obiekt FILE. 688 Brak nazwy czcionki. 689 Nieprawidłowe określenie atrybutów czcionki. 690 Spodziewany GRAPHIC-. 691 Niedozwolone wyprowadzanie tekstu w konstrukcji GRAPHIC. 692 Niedozwolone użycie w konstrukcji GRAPHIC. 693 Niepoprawne określenie rozmiaru papieru. 694 Wymagane określenie rozmiaru papieru w zdaniu PRINTER. 695 Wymagane włączenie trybu graficznego w zdaniu PRINTER. 696 Niepoprawne określenie marginesów w zdaniu PRINTER. 701 Błąd w strukturze zbioru. 701 Błąd w strukturze zbioru. Niepoprawne znaki w kodowaniu UTF-8. 702 Za duży zbiór. 703 Błąd podczas dostępu do katalogu. 703 Błąd podczas dostępu do katalogu tymczasowego (MacroAppSERVER). 704 Błąd podczas pisania do zbioru. 705 Błąd podczas czytania ze zbioru. 706 Nieprawidłowe prawa dostępu do zbioru. 707 Błąd podczas otwierania zbioru. 708 Błędny parametr funkcji obsługi urządzeń zewnętrznych. 252 Rozdział VI. Kody błędów 709 Błąd podczas tworzenia katalogu. 710 Błąd podczas zapisu do zbioru. Nieprawidłowe prawa dostępu. 711 Błąd podczas odczytu zbioru. Nieprawidłowe prawa dostępu. 712 Błąd podczas nadpisywania zbioru. Plik został już otwarty. 713 Błąd podczas zapisu do zbioru. Brak miejsca na dysku. 714 Błąd podczas tworzenia katalogu. Brak miejsca na dysku. 715 Za długa nazwa pliku. 715 Za długa ścieżka do katalogu z runtime. 716 Błąd podczas tworzenia katalogu. Za długa ścieżka. 717 Błąd ustawienia timeout-ów portu. 718 Błędna wersja usługi MacroDEVICE. 719 Przekroczony czas oczekiwania na odpowiedź usługi MacroDEVICE. 720 Niepoprawne kodowanie pliku formuł. 720 Nieznane kodowanie pliku formuł. 720 Niepoprawna nazwa formuły. 720 Za długa nazwa formuły (max. 15 znaków). 721 Błędna nazwa systemu. 722 System niezaładowany. 723 System już załadowany. 724 Wynik nie jest liczbą. 725 Wynik nie jest napisem. 726 Funkcja niedostępna. 727 Brak takiego parametru. 728 Błędny typ parametru.. 253 729 Błąd wewnętrzny. 730 Błąd ładowania biblioteki mbasic.dll lub mbasic_r.dll. 730 Błąd uruchomienia programu MacroBASIC. 730 Błąd uruchomienia programu MacroAppBASIC. 731 Zerwane połączenie z serwerem aplikacji. 732 Zbyt długa formuła. 733 Zbyt długa nazwa systemu. 734 Zbyt długa nazwa użytkownika. 735 Zbyt długie hasło. 736 Zbyt długa ścieżka do systemu. 737 Niepoprawny poziom obsługi komunikatów. 738 Zbyt długa nazwa grupy. 739 Zbyt długi adres serwera aplikacji. 740 Zbyt długie lub niepoprawne znaki dopełnienia nazwy pliku formuł. 741 Niedopuszczalne znaki w nazwie grupy. 742 Niedopuszczalne znaki w nazwie aplikacji. 743 Zwracany napis jest zbyt długi. 744 Podany parametr jest zbyt długi. 745 Zbyt długa lub nieprawidłowa nazwa formuły. 746 Zbyt długa lub nieprawidłowa nazwa pliku z certyfikatem. 747 Strona serwera wymaga użycia przez klienta certyfikatu. 748 Strona serwera nie używa protokołu SSL. 749 Niezgodność certyfikatu z kluczem prywatnym. 750 Błąd w czasie interpretacji wzorca. 254 Rozdział VI. Kody błędów 755 Upłynął czas ważności certyfikatu. 756 Błędny format certyfikatu. 757 Niezgodna wersja serwera aplikacji. 758 Nieznana aplikacja w grupie roboczej. 759 Błędny identyfikator grupy. 760 Błąd odczytu pliku z certyfikatem. 761 Klucz algorytmu RSA za długi. 762 Brak klucza algorytmu RSA. 763 Dostęp został zablokowany. 764 Zakończenie programu przez serwera aplikacji. 765 Brak środowiska Java 7 potrzebnego do uruchomienia serwera wiadomości bezpośrednich. 767 Wymagane środowisko Java w wersji 7. 768 Błędna wersja mbasic.exe. 802 Przekroczona maksymalna liczba aktywnych raportów. 803 Błąd podczas uruchomienia przeglądarki raportów. 804 Parametr może przyjmować wartości z zakresu 0:0:0, 23:59:59. 805 Parametr może przyjmować wartości z zakresu 100/01/01, 9999/12/31. 806 Wymagana wersja systemu operacyjnego Windows 2000 lub nowsza. 807 Nierozpoznany typ eksportu. 808 Eksport przerwany przez użytkownika. 809 Przekroczona maksymalna liczba parametrów dla raportu. 810 Niemożliwe otwarcie lub zablokowanie pliku kopii, sugestia: Sprawdź prawa dostępu do pliku. 255 811 Błąd obsługi zewnętrznej biblioteki. Funkcja nie jest zaimplementowana. 811 Błąd obsługi zewnętrznej biblioteki. Brak nazwy biblioteki. 811 Błąd obsługi zewnętrznej biblioteki. Zbyt długa nazwa biblioteki. 811 Błąd obsługi zewnętrznej biblioteki. Niedozwolone znaki w nazwie biblioteki. 811 Błąd obsługi zewnętrznej biblioteki. Załadowanie biblioteki nie powiodło się. 811 Błąd obsługi zewnętrznej biblioteki. Niepoprawny numer biblioteki. 811 Błąd obsługi zewnętrznej biblioteki. Odłączenie biblioteki nie powiodło się. 811 Błąd obsługi zewnętrznej biblioteki. Niepoprawne wyrównanie (data structure alignment). 811 Błąd obsługi zewnętrznej biblioteki. Niepoprawny typ zwracanej wartožci. 811 Błąd obsługi zewnętrznej biblioteki. Niepoprawny typ funkcji. 811 Błąd obsługi zewnętrznej biblioteki. Obsługa funkcji typu ’pascal’ nie jest zaimplementowana. 811 Błąd obsługi zewnętrznej biblioteki. Brak funkcji w bibliotece. 811 Błąd obsługi zewnętrznej biblioteki. Niepoprawny typ parametru. 811 Błąd obsługi zewnętrznej biblioteki. Tylko pierwszy parametr może być typu VOID. 811 Błąd obsługi zewnętrznej biblioteki. Przepełniony bufor parametrów funkcji. 811 Błąd obsługi zewnętrznej biblioteki. Niepoprawny numer funkcji. 811 Błąd obsługi zewnętrznej biblioteki. Zbyt długa nazwa funkcji. 256 Rozdział VI. Kody błędów 812 Wyjątek w kodzie zewnętrznej biblioteki. Wyjątek w kodzie zewnętrznej biblioteki jest przechwytywany. W trakcie jego obsługi jest zgłaszany błąd o numerze 812 z podaniem kodu wyjątku. Potem następuje standartowa obsługa wyjątku polegająca na zgłoszeniu ”docktor watson”. Jeśli biblioteka zewnętrza uruchamia nowe wątki, to wyjątki z nowych wątków nie muszą być przechwytywane. 813 Brak pliku. 814 Klasa nieznaleziona. 815 Brak dostępu do klasy lub konstruktora. 816 Brak dostępu do metody. 817 Błąd wywołania metody. 818 Błąd wywołania metody/funkcji. Za długi zwracany napis. 819 Błąd wywołania metody. Kod znaku poza zakresem: 820 Nie została określona żadna z form raportu — na ekran, eksport do pliku. 821 Wykonanie eksportu nie jest możliwe bez oczekiwania na wynik. 823 Wymagana ścieżka lokalna. 850 Wyjątek w kodzie metody kontrolki. 851 Błąd wywołania metody kontrolki. Błąd może pojawić się w przypadku podania nieprawidłowej nazwy metody dla funkcji ctr_call lub ctr_set. 851 Błąd wywołania metody kontrolki. Metoda może być wołana tylko za pomocą funkcji ctr_call. 851 Błąd wywołania metody kontrolki. 852 Nieprawidłowy typ argumentu metody kontrolki. 852 Parametr nie ma zdefiniowanej wartości domyślnej. 852 Nieprawidłowy typ argumentu konstruktora kontrolki. 257 852 Argument konstruktora kontrolki nie ma zdefiniowanej wartości domyślnej. 853 Wyjątek w kodzie metody kontrolki. 854 Nie znaleziono kontrolki. 854 Nie znaleziono okna. 854 Niedozwolone białe znaki w nazwie klasy. 854 Nieprawidłowy schemat tabeli. 854 Wyjątek w kodzie metody kontrolki. 854 Błąd wywołania metody kontrolki. 855 Błąd odczytu pliku .desc. 855 Nieprawidłowe rozszerzenie pliku. 855 Błąd odczytu pliku. Błąd może się pojawić w przypadku braku dostępu do pliku z ikonami. 855 W oknie już jest kontrolka. 855 Niewłaściwa nazwa domyślnego widoku w kontrolce @filelistpanel. 856 Niedopuszczalna wartość argumentu. Błąd przy tworzeniu okienka tymczasowego. 856 Nieprawidłowe położenie okienka. Błąd przy tworzeniu okienka tymczasowego. 901 Błąd przy wykonywaniu zapytania SQL. 910 Niedozwolone wywołanie win_disp w formule po odświeżeniu. 911 Niedozwolony wynik formuły okienko po w trakcie wykonania grp_disp. 912 Brak elementów w oknie grupowym. 914 Nie zdefiniowano zakładki dla pierwszego okna w grupie. 915 Za długa nazwa zakładki. 258 Rozdział VI. Kody błędów 916 Błąd obsługi certyfikatu. 917 Ważność certyfikatu użytkownika. 918 Ważność certyfikatu serwera aplikacji. 919 Brak okna wertowania w oknie grupowym. 919 Brak okna redagowania w oknie grupowym. 920 Przekroczona maksymalna liczba zakładek. 921 Zmiana hasła użytkownika niedostępna. Użytkownik zalogowany przy użyciu certyfikatu. 921 Zmiana hasła użytkownika niedostępna. Użytkownik zalogowany przez Active Directory., 921 Zmiana hasła użytkownika niedostępna. Użytkownik zalogowany w trybie wsadowym (bez hasłaa). 922 Funkcja dostępna wyłącznie w formule Grupa przed. 923 Wymagany system Windows XP lub nowszy. 924 Nieprawidłowe użycie funkcji grp_disp. 924 Brak aktywnego okna wertowania. 924 Brak wskazanego okna wertowania. 925 Ten format możliwy jest tylko dla czasu krótszego niż 24h i nieujemnego. 926 Nieprawidłowy identyfikator okienka. 927 Nieprawidłowy prefiks przy redagowaniu pola złączeniowego. Przed redagowaniem pola złaczeniowego formuły na wartość początkową dla pól występujących w kluczu indeksowym przed redagowanym polem w złączeniu muszą zwracać niezerowe wartości. 928 Brak klucza prywatnego. 929 Nieznany atrybut certyfikatu. 930 Nieznany algorytm wyznaczenia skrótu. 259 931 Błędny format podpisu. 932 Błędne format lub nieprawidłowe hasło pliku PEM. 933 Brak certyfikatu. 934 Niedozwolone wywołanie funkcji. 935 Błąd przy tworzeniu menu. Akcja nie może być wyróżniona. 936 Błędna wartość funkcji skrótu. 937 Błędny format danych wejściowych. 938 Nieprawidłowy indeks przy redagowaniu pola złączeniowego. 938 Brak formuły na wartość początkową. 939 Błędny format danych w standardzie UTF8. 940 Niepoprawny typ zwracany przez formułę konwersji. 941 Metoda niedostępna dla okna wertowania użytego w oknie grupowym. 941 Metoda niedostępna dla okna redagowania użytego w oknie grupowym. 942 Przekroczony maksymalny rozmiar menu. 943 Okno tabeli użyte w elemencie innej tabeli. Tabeli nie można usunąć. 944 Przekroczona maksymalna liczba dostępów. 945 Przekroczona maksymalna liczba dostępów dla użytkownika. 946 Przekroczona maksymalna liczba dostępów. 947 Przekroczona maksymalna liczba dostępów dla użytkownika. 948 Przekroczona maksymalna liczba dostępów. 949 Przekroczona maksymalna liczba dostępów dla użytkownika. 950 Przekroczona maksymalna liczba dostępów. 951 Przekroczona maksymalna liczba dostępów dla użytkownika. 952 Przekroczona maksymalna liczba dostępów. 260 Rozdział VI. Kody błędów 953 Przekroczona maksymalna liczba dostępów dla użytkownika. 954 Przekroczona maksymalna liczba dostępów. 955 Przekroczona maksymalna liczba dostępów dla użytkownika. 956 Przekroczona maksymalna liczba dostępów. 957 Przekroczona maksymalna liczba dostępów dla użytkownika. 958 Przekroczona maksymalna liczba dostępów. 959 Przekroczona maksymalna liczba dostępów dla użytkownika. 960 Przekroczona maksymalna liczba dostępów. 961 Przekroczona maksymalna liczba dostępów dla użytkownika. 962 Błąd podczas kontroli limitów dostępów. 963 Metoda dostępna tylko dla okna ze strukturą hierarchiczną. 964 Brak pola w tabeli. 965 Błąd obsługi filtrów tabeli. 966 Nieprawidłowy prefiks w oknie ze strukturą hierarchiczną. 967 Nieprawidłowy indeks w oknie ze strukturą hierarchiczną. 968 Niedozwolona zmiana prefiksu, indeksu lub maski. 969 Podział okna grupowego nie w pierwszym oknie w grupie. 970 Funkcja niedostępna dla trybu tekstowego. 971 Brak pola typu TREE_REF w tabeli. 972 Dołączany BLOB nie może być prezentowany w oknie. 973 BLOB już istnieje. 974 Tabela SYSBLOB niezdefiniowana w systemie. 975 Puste złączenie lub wskazanie na inną tabelę niż SYSBLOB. 976 Niedozwolona wartość argumentu dla trybu tekstowego. 261 977 Akcja niedostępna dla tabeli SYSBLOB. 979 Brak ikony w pliku. 980 Niedozwolone ograniczenie drzewa (tr_root). 981 Zbyt dużo pól typu TREE_REF w tabeli. 982 Brak pola typu TREE_REF w indeksie. 983 Nie można usunąć elementów podrzędnych. 984 Niepoprawny wynik formuły wzorzec dla pola typu BLOB. 984 Niepoprawne określenie formatu pola. 984 Wartość parametru formatu poza zakresem 984 Niedozwolone przypisanie formuły do pola typu HEADER 984 Niedozwolone przypisanie formuły do pola złączeniowego 985 Okno ze strukturą hierarchiczną nie może być oknem słownika. 986 Błędna wartość złączenia do tabeli SYSBLOB. 987 Nieprawidłowy typ zwracanej wartości. 988 Nieprawidłowy numer ikony. 989 Nieprawidłowa wartość określająca ikonę. 990 Niedopuszczalny typ pola. 991 Błąd systemu buforowania plików BLOB. 992 Niedozwolony znak w nazwie pliku lub katalogu. 993 Nie odnaleziono programu skojarzonego z plikiem. 995 Brak pola w definicji okienka. 996 Zmiany w pliku nie zostaną uwzględnione. Obsługa redagowanego pliku została przeniesiona z wywołanego programu skojarzonego do innego procesu. Dokonane zmiany w innym procesie nie będą uwzględniane przez system. 262 Rozdział VI. Kody błędów 997 Brak miejsa na stosie. 998 Niedozwolone wywołanie dla tabeli tymczasowej. 999 Standardowe wejście niedostępne — aplikacja zostanie zakończona. 1000 Błąd funkcji biblioteki libjpeg. 1001 Alias aplikacji nieznaleziony. Alias aplikacji podany jako pierwszy argument funkcji app_dir nie został znaleziony w grupie aplikacji, do której należy wykonywana. 1002 Niedopuszczalna pusta nazwa pliku. Jako drugi argument funkcji app_dir należy podać nazwę pliku, która musi mieć przynajmniej jeden znak, a także nie może zawierać metaznaków oraz separatorów katalogów. 1010 Za mało pamięci dynamicznej. 1012 Niedozwolony znak o kodzie powyżej 127.”, 1020 Brak aktywnego triggera put po lub del po. Funkcja bfld może być użyta wyłącznie w formułach przypisana do wykonania po triggerze z akcją put lub del lub formułach z nich wołanych. 1021 Bieżąca pozycja nieokreślona. 1022 Nie można zmienić triggera przypisanego w definicji. Przypisania formuł dla triggerów można dokonać w formułach, o ile nie zostaną określone wcześniej w definicji systemu. 1023 Nie można przypisać triggera do tabeli. Nie można definiować triggerów dla tabel systemowych MEMO, SYSBLOB oraz SYSLOG. 1024 Metoda bl_put niedostępna w triggerze typu put() przed. Niedozwolone jest użycie metody bl_put w triggerze wywoływanym przed akcją put. 1025 Funkcja dialogowa niedostępna w triggerze. 263 1026 Funkcja dialogowa niedostępna w triggerze. W triggerach nie można używać funkcji end, fork, fork_hid, sys_exec oraz żadnej dialogowej. 1027 Wycofanie transakcji. Wycofanie transakcji w wyniku wywołania funkcji undo z wyjaśnieniem przekazanym poprzez argument. 1028 Wynik musi być liczbą. Wynik formuły przypisanej dla triggera przed akcją musi być liczbą. 1029 Wynik musi być typu VOID. Wynik formuły przypisanej do triggera po akcji musi być typu pustego. 1030 Funkcja niedostępna w wersji demo. 1031 Niepoprawny klucz. 1032 Niedozwolona zmiana maski tabeli. W wyniku działania triggera del przed lub del po została zmieniona i następnie nieprzywrócona bieżąca maska tabeli. 1033 Program przerwany przez operatora. 1034 Nie można aktywować okienka. 1035 Nierozpoznany typ eksportu. Automatyczne zapisanie sprawozdania do pliku przez wywołanie funkcji rep_exec możliwe jest w formatach: pdf (format PDF), txt (format tekstowy, kodowanie w standardzie Windows-1250, z zamianą ramek na znaki plus, minus i pionowej kreski), maz (format tekstowy, kodowanie w standardzie mazovii). 1036 Błąd uruchomienia eksportera raportów, lub javy. 1036 Błąd uruchomienia eksportera raportów. Wymagana java w wersji 7. 1037 Nieprawidłowe położenie pól w okienku. 1038 Niedozwolony znak w identyfikatorze triggera. Identyfikator triggera może być napisem składającym się z małych liter, cyfr i podkreśleń, o długości nie przekraczającej 15 znaków. 264 Rozdział VI. Kody błędów 1039 Identyfikator triggera może mieć maksymalnie 15 znaków. Identyfikator triggera może być napisem składającym się z małych liter, cyfr i podkreśleń, o długości nie przekraczającej 15 znaków. 1040 Za duża notatka. 1041 Funkcja niedostępna w triggerze. W triggerach nie można używać funkcji end, żadnej dialogowej, funkcji fork, fork_hid oraz sys_exec. Dodatkowo niedozwolone jest użycie metody bl_put w triggerze wywoływanym przed akcją put. Dopuszczalne jest natomiast użycie funkcji system z niepustym tekstem polecenia oraz sql_exec, psql_exe i use o ile, nie użyto metaznaku (czyli wykonują się bezdialogowo). 1042 Plik pdf zabezpieczony hasłem. 1044 Niepoprawne określenie wartości parametru. 1044 Niepoprawne określenie listy parametrów. 1044 Niepoprawny identyfikator przycisku. 1044 Niepoprawne określenie koloru. 1044 Nieprawidłowy akronim. 1044 Brak etykiety przycisku. 1044 Brak pól w oknie. 1044 Metoda niedostępna dla okna zdefiniowanego w generatorze aplikacji. 1044 Metoda niedostępna dla pola rodzaju ’Combo-box’. 1044 Parametr dostępny tylko dla pola złączeniowego. 1044 Brak przycisku o podanym identyfikatorze w okienku tabeli. 1044 Metoda niedost‘pna dla pola rodzaju check-box. 1044 Metoda niedostępna dla pola rodzaju radio-buttons. 1044 Brak pól w oknie. 1044 Niepoprawne określenie dziedziny. 265 1044 Metoda niedostępna dla pól typu: BLOBIMAGE, BLOBRAW, HEADER, MEMO, REFERENCE, SYS_MEMO, TREE_REF. 1044 Niepoprawne określenie parametru. 1045 Wynik musi być typu STRING. 1045 Niepoprawny format wyniku. 1045 Niepoprawny format wyniku w trybie wyświetlania. 1046 Błąd funkcji menu_act(). Błąd może być wyświetlony gdy ciąg określający ukrywane akcje menu jest nieprawidłowy. 1046 Błąd funkcji menu_act(). Błąd może być wyświetlony gdy identyfikator menu jest niepoprawny. 1046 Błąd funkcji menu_act().”, Błąd może być wyświetlony gdy brak określonej pozycji w menu. 1047 Brak pozycji menu. 1048 Metoda niedostępna dla bieżącego okna wertowania. 1048 Metoda niedostępna dla bieżącego okna słownika. 1048 Metoda niedostępna dla bieżącego okna redagowania. 1048 Metoda niedostępna dla bieżącego okna wzorca. 1049 Metoda niedostępna dla okna grupowego. 1050 Błędne przypisanie ikony do pozycji menu. Ikona nie może być przypisana do pierwszego poziomu menu. Ikona nie może być przypisana do separatora. Ikona nie może być przypisana do pozycji posiadającej podmenu. 1051 Błąd definiowania akcji przycisku. 1052 Błąd definiowania akcji przycisku. 1052 Przycisk nie może być dorównany do początku, jeśeli wcześniej zdefiniowano przycisk dorównany do końca. 266 Rozdział VI. Kody błędów 1052 Przyciski muszą być dodawane w sposób ciągły do kolejnych paneli. 1053 Otwarcie kopii pliku dostępne tylko jeśli wynikiem jest obiekt plikowy. 1054 Otwarcie kopii pliku nie jest dostępne dla bloba. 1054 Otwarcie kopii pliku nie jest dostępne dla urządzenia. 1055 Otwarcie kopii pliku niedostępne jeśli ma być wyzerowana jego długość. 1056 Niepoprawny ciąg określający ścieżkę menu. 1057 Za mała wysokość okna wertowania. 1057 Za małaa wysokość okna redagowania. 1100 Brak podsystemu. Zbiór definicji systemu *.def nie zawiera podsytemu przekazanego w komunikacie błędu. 1101 Niepoprawnie podpisany plik. 1102 Błąd wewnętrzny. 1103 Niepoprawnie zaszyfrowany plik z kluczem do podpisu pliku DEF. 1104 Za długa nazwa pliku z definicją systemu. 1105 Nieprawidłowa wersja pliku definicji. Błąd zgłaszany przez funkcję exp_def dla zbiorów definicji (*.def) utworzonych MacroGENEM poniżej wersji 11.10. 1107 Niekompletna definicja systemu. Dopuszczalne jest wygenerowanie definicji systemu również w przypadku, gdy nie wszystkie okienka są gotowe. Okienka, które wymagają animacji, nie będą wtedy zapisywane w definicji. Jeśli przynajmniej jedno okienko będzie pominięte przy generowaniu definicji, to informacja o tym zostanie wyświetlona przy starcie systemu. 1108 Niekompletna definicja systemu. Dopuszczalne jest wygenerowanie definicji systemu również w przypadku, gdy nie wszystkie okienka są gotowe. Okienka, które wymagają animacji, nie będą wtedy zapisywane w definicji. Jeśli przynajmniej jedno okienko będzie pominięte przy generowaniu definicji, to informacja o tym zostanie wyświetlona przy starcie systemu. 267 1109 Błędna suma kontrolna definicji systemu. 1110 Brak praw dostępu. 1111 Błąd podczas generowania kodu. 1111 Błąd podczas generowania kodu, przekroczona maksymalna pojemność. 1111 Błąd podczas generowania kodu, wymagany niepusty ciąg znaków do zakodowania. 1112 Błąd otwarcia tabeli. 1113 Błąd wykonania funkcji bl_clean. Informacja o błędzie dostępna jest w pliku bl_clean.log umieszczonym zgodnie z deklaracją ścieżek. 1114 Wyniki profilera przy włączonym debuggerze są obarczone błędem. Wyniki profilera przy dostępnej opcji włączenia debuggera mogą być obarczone błędami (dodatkowe narzuty na obsługę debuggera). 1115 Niezgodna wersja danych profilera. 1117 Profiler jest już włączony. 1118 Wynik profilera przy obj_meth_par_type = 0 nie uwzględnia wszystkich metod. W przypadku uruchomienia z parametrem obj_meth_par_type = 0 w wyniku nie będą uwzględnione wywołania metod zadeklarowanych bez określonych typów argumentów. Wywołując funkcję obj_left z argumentem równym obj_meth_par_type można sprawdzić jaką wartość ma ustawioną wartość parametr obj_meth_par_type. Wynikiem będzie wartość parametru ustawiona w pliku konfiguracyjny (*.cfg) 1119 Brak plików zgodnych z maską. 1120 Brak takiego pliku lub nieprawidłowa ścieżka do pliku. 1120 Brak takiego pliku na komputerze użytkownika lub nieprawidłowa ścieżka do pliku. 1121 Niedozwolone odwołanie do katalogu. 268 Rozdział VI. Kody błędów 1122 Wynik profilera nie został w pełni odpisany do pliku. 1123 Plik nie zawiera obrazka o podanym numerze. 1124 Funkcja nie obsługuje ścieżek sieciowych. 1125 Brak tabeli danych profilera do pobrania. 1126 Brak pliku tymczasowego do odczytu danych. 1127 Próba zapisu znaków o kodach spoza standardu Mazovii na urządzenie lub do pliku binarnego. 1128 Zwracana wartość zmiennej środowiskowej nie jest kodowana w UTF-8. 1129 Zwracana wartość zmiennej środowiskowej jest zbyt długa. 1130 Brak pamięci przy określeniu wartości zmiennej środowiskowej. 1131 Funkcja barcode wymaga do zapisu znaków ze standardu Mazovii. 1132 Błąd przy zapisie danych profilera. 1133 Nazwa pliku może składać się z małych liter alfabetu łacińskiego, cyfr oraz znaku podkreślenia. 1134 Niepoprawna nazwa źródła danych. 1135 Błąd wewnętrzny. 1136 Maksymalna liczba pól tabeli tymczasowej to ... 1137 Konwersja typu ... niemożliwa. 1138 Błąd połączenia ODBC. 1139 Napis obcięty z prawej strony. 1140 Błędna wartość typu DATE. 1141 Błędna wartość typu TIME. 1142 Przekazany bufor wiersza jest niewłaściwego rozmiaru. 1143 Niepoprawne kodowanie UTF-8 napisu. 1144 Kod znaku poza zakresem funkcji konwersji. 269 1145 Długość napisu przekracza zadeklarowaną w typie. 1146 Ostrzeżenie/informacja połączenia ODBC. 1147 Parametry powiązane z plikami nie mogą zwracać wartości. 1148 Rozmiar danych w kolumnie przekracza maksymalny deklarowany przez sterownik. 1149 Sterownik ODBC MacroBASE nie obsługuje wartości NULL w parametrach. 1150 Brak pól w wyniku. 1152 Błąd podczas dekompresji. Niespodziewany koniec pliku. 1151 Błąd podczas dekompresji. Niepoprawny plik archiwum. 1151 Błąd podczas dekompresji. Niepoprawna suma kontrolna (CRC). 1151 Błąd podczas dekompresji. Błąd tworzenia katalogu. 1151 Błąd podczas dekompresji. Błąd tworzenia pliku. 1151 Błąd podczas dekompresji. Błąd zapisu do pliku. 1151 Błąd podczas dekompresji. Błąd otwarcia pliku archiwum. 1152 Funkcja niedostępna dla uchwytu do urządzenia. 1153 Niezdefiniowana wartość. 1154 Wartość niepoprawnego typu. 1155 Wartość poza zakresem. 1156 Tablice przekazane w argumentach 2 i 3 muszą mieć taki sam rozmiar. 1157 Błąd wewnętrzny. Niepoprawnie zbudowany prefix. 1158 Tabela SYS_TMP_MEMO niezdefiniowana w systemie. 1158 Błąd tworzenia tabeli SYS_TMP_MEMO. 1159 Niejednoznaczne odwołanie do pola notatnikowego. 1160 Tabela nie zawiera pola notatnikowego o wskazanym akronimie. 270 Rozdział VI. Kody błędów 1161 Wykryto nieunikalny identyfikator formuły. 1162 Wykryto nieunikalny identyfikator formuły. 1163 Sortowanie po polu notatnikowym nie jest dostępne. 1164 Utworzenie tabeli z pojedynczym polem notatnikowym nie jest dozwolone. 1165 Metoda niedostępna dla tabeli SYSMEMO. 1166 Zabronione umieszczanie kontrolki webbrowser w oknie grupowym. 1167 Błąd ładowania biblioteki libodbc.so,libodbc.so.1 w wersji 32-bitowej. Manager ODBC niepoprawnie zainstalowany. 1168 Błąd ładowania biblioteki libodbc.so,libodbc.so.1 w wersji 64-bitowej. Manager ODBC niepoprawnie zainstalowany. 1169 Błąd ładowania biblioteki odbc32.dll w wersji 32-bitowej. Manager ODBC niepoprawnie zainstalowany. 1170 Błąd ładowania biblioteki odbc32.dll w wersji 64-bitowej. Manager ODBC niepoprawnie zainstalowany. 1171 Brak symbolu dynamicznie linkowanego. Manager ODBC zainstalowany w niepoprawnej wersji. 1172 Brak pamięci. 1173 Brak dostępu do pliku sterownika ODBC dla MacroBASE. 1174 Brak 32-bitowej wersji sterownika ODBC dla MacroBASE. 1175 Brak 32-bitowej, UTF-8 wersji sterownika ODBC dla MacroBASE. 1176 Brak 64-bitowej wersji sterownika ODBC dla MacroBASE. 1181 Niepoprawna tabela konwersji. Tablica określająca sposób konwersji musi mieć dokładnie 128 elementów: funkcja. 1182 Niepoprawna tabela konwersji. Element o pozycji ... nie został zdefiniowany, funkcja: iconv. 271 1183 Niepoprawna tabela konwersji. Element o pozycji ... jest niepoprawnego typu, funkcja: iconv. 1184 Niepoprawna tabela konwersji. Element o pozycji ... z wartości ... jest poza zakresem obsługiwanych znaków, funkcja: iconv. 1185 Niepoprawna tabela konwersji. Elementom o pozycjach ... i ... zostały przypisane te same wartości, funkcja: iconv. 1186 Niepoprawny typ zwracany przez formułę. Obiekt utworzony funkcją: iconv. 1187 Wartość zwrócona przez formułę niezgodna z wybranym kodowaniem. Obiekt utworzony funkcją: iconv. 1188 Niepoprawne kodowanie. Obiekt utworzony funkcją: iconv. 1189 Typ TIME niedostępny przy aktywnej opcji połączenia ”time_as_string”. 1190 Wywołanie funkcji debug. 1191 Błąd wewnętrzy podczas eksportowania raportu. 1192 Błąd przy próbie osadzenia czcionki w pliku pdf. 1193 Błąd wywołania polecenia tworzenia listu z załącznikiem. 1200 System nie zawiera tabeli SYSSALRT. Powiadomienia nie są obsługiwane. Systemu powiadomień można używać jedynie dla systemów wygenerowanych wersją 12.30 MacroBUILDERA 1201 Błąd wewnętrzy obsługi powiadomień. 1202 Liczba powiadomień nieprzetworzonych przez użytkownika osiągneła liczbę 10000. Do danego użytkownika może być naraz maksymalnie 10000 nieobsłużonych powiadomień. Przy próbie wysłania kolejnej wiadomości zostanie zgłoszony błąd. 272 Rozdział VI. Kody błędów 1203 System nie zawiera tabeli SYSSALRT. Powiadomienie nie może być obsłużone. Systemu powiadomień można używać jedynie dla systemów wygenerowanych wersją 12.30 MacroBUILDERA 1204 Nieprawidłowy identyfikator notatki. 1204 Data wygaśnięcia powiadomienia powinna być większa lub równa dacie jego wywołania. 1206 System zawiera tabelę SYSSALRT o nieprawidłowej budowie. 1207 Data odroczenia powiadomienia powinna być większa od daty wysłania.”, 1208 Data wygaśnięcia powiadomienia powinna być większa lub równa dacie bieżącej. 1209 Nieprawidłowa instancja tabeli SYSSALRT lub MacroSERVERa. 1210 Obsługa powiadomień wyłączona przez administratora systemu. Można zabronić wysyłania komunikatów poprzez wpis w pliku *.cfg ( aplikacji lub macro.cfg). Mówi o tym parametr ntc_disable. Jeśli będzie miał wartość liczbową różną od 0, to komunikaty z aplikacji wysyłane nie będą. Komunikaty będą dostępne w jTermie, jeśli zostanie otworzona przynajmniej jedna aplikacja, z której można wysyłać komunikaty. 1220 Brak tabeli SYSLOG w systemie. 1221 Brak zainstalowanego managera odbc w wersji ... -bitowej. 1230 Niepoprawna struktura tabeli SYSSULOG w definicji systemu. Aby korzystać z funkcji historii haseł oraz blokowania użytkownika, należy ponownie wygenerować definicję systemu bieżącą wersją MacroBUILDERa. 1231 Niepoprawna nazwa pliku w katalogu sysblob. Uruchom bl_clean w celu usunięcia pliku. 1232 Błędny zapis adresu zdalnego urządzenia. Niezgodny ze składnią —nazwa@adres_ip:port_nasluchu— 1233 Otwarcie urządzenia lokalnego poprzez MacroDEVICE niedozwolone. Zapis postaci @—nazwa@adres_ip:port_nasluchu— 273 1234 Błąd pobrania ścieżki do katalogu z runtime. 1235 Błąd odczytu kodu źródłowego. 1236 Zbyt długi plik kodu źródłowego. 1237 Wymagane kodowanie UTF-8. 1238 Brak formuły w pliku źródłowym. 1239 Powielenie formuły w pliku źródłowym. 1240 form_chk(): wymagany tryb otwarcia pliku ur lub Ur.