System Katalogowania Książek

Napisano dnia 2.03.2014 r. o godzinie 17:52
Autor: Piotr Sperka

System Katalogowania Książek - okno programu System Katalogowania Książek - dostęp przez www

Wstęp

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ą.

Koncepcja

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:

 System Katalogowania Książek - ogólna koncepcja

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).

Działanie

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:

  • Tabela zawierająca rekordy z informacjami o książkach
  • Tabela zawierająca rekordy z ID oraz znacznikami czasu usuniętych pozycji
  • Tabela zawierająca informacje o ostatniej synchronizacji bazy
  • Tabela zawierająca dane o użytkownikach

Baza lokalna SQLite:

  • Tabela zawierająca rekordy z informacjami o książkach
  • Tabela zawierająca rekordy z wpisami wymagającymi synchronizacji (dodania)
  • Tabela zawierająca rekordy z wpisami wymagającymi synchronizacji (usunięcia)
  • Tabela zawierająca informacje o ostatniej synchronizacji bazy

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:

  • Dodanie nowej pozycji do bazy (informacje o dodawanej pozycji przesyłane są jako JSON).
  • Usunięcie wybranej pozycji z bazy (informacje o usuwanej pozycji przesyłane są jako JSON, jednak obecnie wykorzystywany jest tylko ID).
  • Pobranie pozycji nowszych niż przesłany znacznik czasu.
  • Pobranie informacji o usuniętych pozycjach po czasie określanym przez przesłany znacznik czasu.
  • Pobranie znacznika czasu określającego moment ostatniej modyfikacji bazy.

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:

System Katalogowania Książek - synchronizacja

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.

System Katalogowania Książek - dodawanie i usuwanie

Aplikacja lokalna składa się z kilku klas, z których najważniejsze zostały  krótko opisane poniżej:

  • Database – klasa ta odpowiada za komunikację z lokalną bazą danych SQLite
  • ImportThread – klasa odpowiadająca za importowanie danych z plików zbliżonych do CSV. Została stworzona, aby umożliwić zaimportowanie bazy ze starego programu
  • Synchro – klasa wykorzystuje obiekt klasy Database i odpowiada za synchronizację bazy SQLite z bazą MySQL
  • SyncThread – klasa odpowiada za synchronizację bazy po uruchomieniu aplikacji

Podsumowanie

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:

  • sqlite-jdbc w wersji 3.7.2
  • google-gson w wersji 2.2.4
  • ini4j w wersji 0.5.2
  • niektóre pakiety z Apache HttpComponents Client 4.3.1
  • niektóre pakiety z Apache Commons Lang 3.1

Pobieranie oraz kilka uwag

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

 

Komentarze

  • Dokładnie czegoś takiego szukałam! Ściągnęłam stąd skompilowany program, ale mój komputer twierdzi, że coś jest w tym archiwum uszkodzone. Szkoda, już miałam nadzieję 🙂

  • Mam podobny problem jak przedmówca: archiwum ma niewłasciwy format lub jest uszkodzone”
    Prosze o rozwiazanie bo szukam max prostego programu do katalogowania ksiązek:))

  • Witam,
    po dłuuugich poszukiwaniach trafiłem i tutaj. Program zapowiada się lepiej niż dobrze. Niestety mam chyba identyczną przypadłość jak moi przedmówcy – podczas rozpakowywania pojawia się błąd.

  • Napisz odpowiedź lub komentarz

    Twój adres email nie zostanie upubliczniony.

    Możesz używać następujących tagów HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>