Napisano dnia 2.03.2014 r. o godzinie 17:52
Autor: Piotr Sperka
Pomysł napisania programu umożliwiającego w prosty sposób skatalogowanie posiadanych książek zrodził się z konieczności około pięciu lat temu. Mój tata, który jest historykiem posiada ich na tyle dużo, że w pewnym momencie trudno było zapanować nad tym, gdzie jest dana książka, lub nawet czy posiada się już konkretną pozycję. Zrodził się pomysł, żeby – podobnie jak w bibliotekach – oznaczyć szafy w tym wypadku literami, a półki w nich się znajdujące cyframi rzymskimi. Na każdej książce została naklejona mała karteczka z „sygnaturą” zawierającą właśnie numer szafy, półki oraz numer książki od lewej strony. Do tego została napisana prosta aplikacja w Delphi umożliwiająca dodawanie i usuwanie nowych pozycji oraz ich wyszukiwanie po autorze, tytule lub sygnaturze. Z czasem okazało się, że choć ogólnie taki system sprawdza się doskonale, to problemem jest prostota aplikacji, a konkretnie brak możliwości synchronizacji bazy pomiędzy komputerami (np. laptopem i stacjonarnym). Zdarzało się, że podczas dodawania nowych pozycji zapominało się wgrać aktualną wersję na drugi komputer i po pewnym czasie baza dostawała „rozdwojenia jaźni” i trzeba było ręczenie łączyć obie bazy w jedną.
Mając ostatnio trochę czasu postanowiłem wreszcie rozwiązać problem. Powstała koncepcja, aby całą bazę składować na serwerze z bazą MySQL. Do tego jednak dodałem warunek, że baza powinna być także dostępna w przypadku braku dostępu do Internetu, a także, aby po ponownym połączeniu z Internetem program automatycznie dokonał synchronizacji z serwerem dodanych lub usuniętych pozycji. Tak powstał ogólny zarys działania Systemu Katalogowania Książek:
Dostęp do bazy może się odbywać poprzez lokalną aplikację oraz opcjonalnie poprzez stronę internetową po zalogowaniu, gdzie jednak bazę można tylko przeglądać (nie można modyfikować bazy).
Opis całego systemu warto zacząć od ogólnego opisu tabel w obu bazach danych. Będzie to pomocne w zrozumieniu działania dosyć prostego programu opisanego dalej.
Baza zewnętrzna MySQL:
Baza lokalna SQLite:
Skrypt PHP tworzy warstwę umożliwiającą prostą komunikację z bazą MySQL przez lokalną aplikację po poprawnym zweryfikowaniu nazwy użytkownika i hasła. Umożliwia on wykonanie kilku elementarnych operacji:
Lokalna aplikacja podczas pracy korzysta tylko z lokalnej bazy danych. Ze skryptem PHP komunikuje się tylko podczas synchronizacji po uruchomieniu oraz podczas ewentualnego dodawania/usuwania/modyfikacji wpisu w bazie. Cała aplikacja lokalna jest w zasadzie prostą aplikacją pracującą z wykorzystaniem bazy SQLite oraz wysyłającą i odbierającą zapytania do/z serwera. Na szczególną uwagę zasługuje opis synchronizacji bazy danych, ponieważ proces ten został tak zaprojektowany, aby uniemożliwić, a przynajmniej mocno utrudnić powstanie niezgodności pomiędzy bazami na różnych komputerach. Poniżej można zobaczyć w pewnym uproszczeniu jak on przebiega:
Powyższy „algorytm” jest oczywiście wykonywany tylko pod warunkiem, że jest połączenie z zewnętrznym skryptem PHP. Algorytm zapewnia także całkowitą zgodność ID konkretnych wpisów w obu bazach danych (dane są wysyłane do bazy MySQL, która przydziela ID, a skrypt PHP odsyła je do programu, który dopiero wtedy dodaje wpis do bazy SQLite), co jest istotne podczas wymiany danych ze skryptem PHP. Można jeszcze dodać istotną uwagę – w pierwszym bloczku jest mowa o usuwaniu niezsynchronizowanych wpisów. Są one oczywiście usuwane tylko z „głównej” tabeli zawierającą informacje o książkach, natomiast są pozostawiane w tabeli wpisów oczekujących na synchronizację. Z tej tabeli są usuwane dopiero, gdy zostaną pomyślnie zsynchronizowane i ponownie dodane do „głównej” tabeli. Na niżej zamieszczonych schematach pokazano także, jak zachowuje się program podczas dodawania lub usuwania wpisu, zależnie od tego, czy jest połączenie z bazą zewnętrzną. Warto zauważyć, że modyfikacja wpisu jest realizowana poprzez usunięcie go, a następnie ponowne dodanie w zmodyfikowanej formie.
Aplikacja lokalna składa się z kilku klas, z których najważniejsze zostały krótko opisane poniżej:
Cały „system” ciągle jest w fazie testów, jednak jak dotąd nie zauważyłem problemów w działaniu całości. Program do obsługi lokalnej bazy został napisany w Javie i, prócz standardowych pakietów, wykorzystuje:
Program jest napisany w języku Java, a więc do działania potrzebuje wirtualnej maszyny Java i działa zarówno pod Windowsem, jak i Linuksem czy Mac OS. Funkcja synchronizacji z serwerem jest opcjonalna, i jeżeli w konfiguracji nie zostanie wpisany poprawny adres serwera (poprzedzony http://) dane będą przechowywane tylko lokalnie. Przed pierwszym uruchomieniem skryptu PHP należy w pliku config.php wpisać poprawne dane swojej bazy. Struktura bazy zostanie utworzona poprzez uruchomienie pliku install.php, który po poprawnej instalacji można usunąć. Po zalogowaniu tymczasowymi danymi należy przynajmniej zmienić hasło. Gdy nie potrzebujemy dostępu do bazy przez www, po instalacji do działania wystarczą pliki sync.php oraz config.php.
Udostępniony kod źródłowy w obecnej formie praktycznie nie zawiera komentarzy i momentami jest nieco niechlujny. Postaram się poprawić to w najbliższym czasie i wrzucić poprawioną wersję.
Skompilowany program oraz pliki PHP znajdują się TUTAJ
Pliki źródłowe programu oraz pliki PHP znajdują się TUTAJ