Baza danych dla laika Lazarus

0

Cześć Wam.

Potrzebuję porady, proszę podpowiedzcie mi jak postąpić.
Chciałbym dla swoich programików postawić serwer baz danych, jednak taki abym mógł łatwo klientów- programy klienckie tworzyć multiplatformowo.
Obsługuję łatwo za pomocą synapse komunikację TCP/IP. Postawiłem firebirda na komputerze domowym o stałym ip itd itd - działa. sprawdzone telnetem itd...
Jednak komponentów dostępnych multiplatformowo zwłaszcza na os x i windows jednocześnie nie znalazłem- jestem hobbystą, czasem jakaś apka wyjdzie mi bardzo fajnie czasem są zbyt toporne, dlatego potrzebuję nakierowania w którą stronę zmierzać. Zbyt duże skomplikowanie natury technicznej pisania (a nie samego pomysłu aplikacji) powoduje zniechęcenie :/.
Która opcja wydaje się Wam właściwa?
1)Czy spróbować napisać własny serwer bazodanowy z wbudowaną bazą sqllite z lazarusa? Bazę obsługiwałby program, który nasłuchiwałby portu łączyłby się z klientami za pomocą TCP/IP i komponentów synapse, a następnie odebrane polecenia przesyłałby kolejkując problemy do bazy sqllite przy użyciu komponentów lazarusa.

2)Znaleźć sposób komunikacji firebirda na porcie 3050 i też za pomocą synapse wysyłać i odbierać informacje - komendy sql. Wtedy każdy klient miałby unit z obsługą tego i działałby poprzez komunikację tcp/ip? czyli de facto napisać komponent do obsługi multiplatformowej firebirda.

3)Szukać multiplatformogwych komponentów do komunikacji z firebirdem (Nic prostego nie mogę znaleźć zwłaszcza dla procesorów M1 Mac.., choć żadnych w sumie jednocześnie łatwych do użycia w os x i windows).?

4)Napisać prosty serwer samodzielnie - z prostymi komendami - trochę podobnymi do sql żeby łączył się przez tcp/ip z klientami i wykonywał na bazie - (szyfrowane tabele w formie binarnej) ich polecenia i wysyłał wyniki lub zapisywał przesłane dane. Program i kolejkował by zapytania i polecenia.. ?
I To już w zasadzie mam, ale to jest też wyważanie pewnie otwartych drzwi i kto wie jakie problemy wynikną przy dużej ilości użytkowników albo z powodu spowolnienia przy rozbudowanych bazach.

Pozdrawiam i proszę o sugestie.

Krzysiek

0

@Windowbee nie do konca rozumiem co potrzebujesz, jeżeli chcesz użyć konkretnej bazy danych to musisz użyć np. ZEOS-a albo czegoś podobnego do polaczenia sie z baza danych

0
Marius.Maximus napisał(a):

@Windowbee nie do konca rozumiem co potrzebujesz, jeżeli chcesz użyć konkretnej bazy danych to musisz użyć np. ZEOS-a albo czegoś podobnego do polaczenia sie z baza danych

Chciałbym mieć możliwość komunikacji czyli użycia bazy danych tak, aby moje programy(klienci) mogły łączyć się z nią, pobierać dane tworzyć tabele itd. poprzez internet z użyciem komend sql.
Nie jestem super programistą dlatego szukałem gotowych komponentów. Piszę programiki ułatwiające nam pracę na oddziale IT w szpitalu gdzie pracuję, część moich kolegów ma MacBooki część kompy z windowsem w domu, albo laptopy takie i takie. Potrafię obsłużyć połączenia tcp/ip za pomocą synapse. Nie znalazłem, może nieumiejętnie szukam, komponentów ,które potrafią taką komunikację obsłużyć( na windowsa owszem są łatwe do dołączenia .dll natomiast na maca z procesorami M1 , nie znalazłem odpowiedników dla Lazarusa).
4 pomysły jak rozwiązać tą sytuację przedstawiłem w przydługim może pytaniu na początku wątku. Ale nie wiem , który sposób wybrać(może zupełnie inny) aby nie robić sobie dodatkowej pracy tworząc narzędzia (czyli obsługę komunikacji między klientem a bazą w formie serwera). Boję się ,że tak mój napęd do tworzenia apki wyboru antybiotyków zje rozwiązywanie tego problemu i pisanie serwera ,że nie napiszę tego właściwego programu.
Użytkowników będzie kilkunastu-może kilkudziesięciu więc mogą zdarzyć się sytuacje jednoczesnego zapisu itd. Mój prosty serwer pseudo sql sobie z tym radzi kolejkując i zapisując pojedyncze komórki bazy a nie nadpisując całość po zmianie. Ale jest to toporne rozwiązanie. Nie chcę go rozwijać skoro są porządne sprawdzone sposoby zapewne.

0

Nie rozumiem problemu, który opisujesz. Po prostu stawiasz kontener np. Postgresa z DockerHuba i tyle. Sam serwer SQL zapewnia Ci możliwość komunikacji po TCP/IP. O co więc pytasz? Jak zaszyfrować połączenie klienta z serwerem SQL??? Zasadniczo masz dwie opcje: wykorzystać VPN, albo użyć szyfrowania zapewnionego po stronie serwera SQL. Ty próbujesz wyważyć otwarte drzwi. Jeśli chodzi o szyfrowanie to w przypadku Postgres masz na ten temat pełno tutoriali na sieci (użyj google). Z książek polecam Postgres Administration Coockbook (wydane przez Packt). Po stronie klienta ZEOS oczywiście obsługuje szyfrowanie połączeń SQL (jest w dokumentacji opisane), nie ma żadnego problemu. Domyślam się, że dla Twoich potrzeb lepiej jest jednak po prostu użyć VPN, użytkownicy go pewnie mają. Wtedy nic nie konfigurujesz po stronie serwera (poza hasłem i portem - oba zalecam zmienić) bo szyfrowanie masz po stronie VPN. Możesz też skonfigurować serwer VPN, żeby Ci kierował połączenia do samego kontenera dla poprawy bezpieczeństwa. Jak chcesz możesz użyć obu metod naraz, acz to raczej bez sensu, bo jak Ci ktoś złamie zabezpieczenia VPN to masz delikatnie mówiąc inny problem - o charakterze nazwijmy to globalnym. Dodam jeszcze, że Postgres możesz oczywiście tak skonfigurować, że połączenia lokalne nie będą szyfrowane a zewnętrzne będą. To w przypadku jeśli chcesz jednak szyfrować po stronie serwera SQL.
Po stronie klienta masz po prostu ZEOS oraz biblioteki komunikacyjne dostarczone z Postgresem (najlepiej wyciągnij sobie dll z binariów dla Windows, albo zainstaluj menadżerem pakietów dla Linux). Uwaga! Należy pamiętać, że pliki dll musisz mieć też w katalogu Lazarusa, że by ci działał ZEOS z poziomu IDE.

0

Co do zeos-a to nie wiem czy sie kompiluje na MAC OS , ja bym sprawdzil i ocenil czy to dziala czy nie działa,

Lazarus/Delphi jest genialne do baz danych pod warunkiem że umiesz korzystać z gotowych narzędzi które są w pakiecie,
jak piszesz o 1)Czy spróbować napisać własny serwer bazodanowy to mi sie przypominaja moje szalone pomysły ponad 15 lat do tyłu :D i raczej nie tedy droga

2)Znaleźć sposób komunikacji firebirda na porcie 3050 to mi wyglada też na troche szalony pomysł, wszak każda baza danych udostepnia jakas biblioteke klienta do komunikacji
wiec po co wyważać otwarte drzwi ?

4)Napisać prosty serwer samodzielnie a to widziales https://github.com/synopse/mORMot2 ?

0
KKuba napisał(a):

Nie rozumiem problemu, który opisujesz. Po prostu stawiasz kontener np. Postgresa z DockerHuba i tyle. Sam serwer SQL zapewnia Ci możliwość komunikacji po TCP/IP. O co więc pytasz? Jak zaszyfrować połączenie klienta z serwerem SQL??? Zasadniczo masz dwie opcje: wykorzystać VPN, albo użyć szyfrowania zapewnionego po stronie serwera SQL. Ty próbujesz wyważyć otwarte drzwi. Jeśli chodzi o szyfrowanie to w przypadku Postgres masz na ten temat pełno tutoriali na sieci (użyj google). Z książek polecam Postgres Administration Coockbook (wydane przez Packt). Po stronie klienta ZEOS oczywiście obsługuje szyfrowanie połączeń SQL (jest w dokumentacji opisane), nie ma żadnego problemu. Domyślam się, że dla Twoich potrzeb lepiej jest jednak po prostu użyć VPN, użytkownicy go pewnie mają. Wtedy nic nie konfigurujesz po stronie serwera (poza hasłem i portem - oba zalecam zmienić) bo szyfrowanie masz po stronie VPN. Możesz też skonfigurować serwer VPN, żeby Ci kierował połączenia do samego kontenera dla poprawy bezpieczeństwa. Jak chcesz możesz użyć obu metod naraz, acz to raczej bez sensu, bo jak Ci ktoś złamie zabezpieczenia VPN to masz delikatnie mówiąc inny problem - o charakterze nazwijmy to globalnym. Dodam jeszcze, że Postgres możesz oczywiście

Dziękuję. Nie o to chodzi, ale dziękuję za czas. (Zapewne trudno mi jest opisać Waszym konkretnym językiem czego potrzebuję).
Powiedz proszę czy mogę wysyłać do portu nasłuchiwania firebirda stringi w formacie zapytań / poleceń sql? Czy muszę to jakoś formatować ? Wiesz gdzie znaleźć opis jak powinien wyglądać sposób komunikacji przez port albo formatowanie zapytań i jak wygląda odpowiedź? Chyba nie mogę wysłać stringa (user= password=. ;) czyli w formacie zapytania sql?

0

Nie używam Firebird, wiec odpowiem dla Postgresa, ale chyba jest dokładnie tak samo. Wadliwe pytanie. To o co pytasz realizuje się na poziome ZEOS. Masz tam klasę ZQuery, a w niej właściwość SQL. To tu umieszczasz zapytanie i następnie wywołujesz metodę Active. Resztę tego o czym piszesz robi sama biblioteka. Przeczytaj sobie dokumentację ZEOSA lub jakieś przykłady użycia tej biblioteki w sieci. Wszystko Ci się rozjaśni... Dobry opis co prawda na przykładzie biblioteki SQLDB (a nie ZEOS), masz w Lazarus Handbook (w rozdziale 13). Tam możesz zajrzeć jeśli nie rozumiesz samej idei działania biblioteki ZEOS.

6

Najprościej i zgodnie z aktualnymi trendami
Serwer (PC) -> baza danych (dowolna, ale sugeruję postgresa) + serwer REST (jako osobna aplikacja, którą trzeba napisać, język dowolny)
Klient (PC/Mac/Android/Linux) -> klient REST w aplikacji
Do implementacji REST proponuję użyć https://github.com/synopse/mORMot2 - odpadnie Ci NAPRAWDĘ DUŻO kodu, który będziesz musiał napisać.
Mam aplikację na androida, która pracuje w takiej konfiguracji i daje radę

1

Do Firebird-a istnieją komponenty IBX, które są multiplatformowe: https://mwasoftware.co.uk/ibx
Dostępne są również w OPM (Menu > Package > Online Package Manager).

Natomiast jeżeli chcesz stawiać serwer web-owy to polecam użycie Indy lub standardowych komponentów fpc, ponieważ mają wbudowana obsługę wątków (w synapse trzeba samemu to obsłużyć). Lub mORMot-a jak napisał @abrakadaber

0

Zakończę ten wątek i podsumuję rozwiązanie jakiego się dopuściłem….:
Jako ,żem laik a serwer z bazą danych obsługuje może 100 klientów maksymalnie, nie chcę mieć problemu instalacji plików dll oraz problemu nauki od podstaw obsługi baz danych. Dlatego też postanowiłem jednak nie używać dedykowanych komponentów poza synapse i nie używać standardowych serwerów baz danych.

Opis rozwiązania:
Serwer działa jako program instalowany w systemach windows i mac os. Konfiguruje się go podając w menu serwera: ip komputera na którym jest zainstalowany, port na którym nasłuchuje, oraz hasło dostępowe podczas połączenia i dowolny katalog w którym program trzyma bazę danych(zespół baz w formie szyfrowanych tabel i folderu na pliki, pliki zapisuje w podfolderze o nazwie danej bazy a w bazie podaje tylko nazwę pliku, która jest Od razu adresem względnym).

Transport danych przez port jest szyfrowany bazy szyfrowane. Aby podejrzeć bazy w celu wykrywania błędów działania klientów napisałem prosty program edytor baz , który potrafi zdalnie się łączyć z tym serwerem i edytować pliki oraz wszystkie komórki wybranych tabel.

Zapytania do serwera są kolejkowane. Ale działają w osobnych wątkach. Działa to stabilnie zarówno w sieci lokalnej jak i internetowej.
Każde zapytanie na port musi mieć odpowiedni format z podaniem hasła serwera i być odpowiednio zaszyfrowane. Inaczej zwracany jest w odpowiedzi odpowiedni błąd lub opis problemu.

Do moich zastosowań nie potrzebuję bardzo bezpiecznego szyfrowania gdyż te programy nie przesyłają przez internet danych wrażliwych itp.
Aczkolwiek zaszyfrowanie danych nie pozwoli na łatwe ich przechwycenie, przesyłane są w formie zaszyfrowanej.

Serwer tworzy też logi wszystkich zapytań i odpowiedzi do 20.000 logów po czym nadpisuje je znów od początku.

Zalety tego rozwiązania:

  1. rozumiem każdy krok tego co robię.
  2. Rozwiązanie takie jest bardzo proste
  3. Jest stabilne i działa tak jak chciałem
  4. Tworzone kopie zapasowe pozwalają na łatwy backup zwłaszcza ,że bazy nie mają dużych rozmiarów.
  5. Nie musiałem uczyć się działania serwerów baz danych co bardzo przyspieszy mi tworzenie aplikacji.
  6. Jestem niezależny od ograniczeń wszystkich innych programów serwerowych - bo mogę w każdej chwili napisać funkcję , która wykona dowolną czynność na bazach i plikach.
  7. Serwer napisany jest z użyciem tylko synapse i standardowej najnowszej wersji Lazarusa działa multiplatformowo bez potrzeby instalacji jakichkolwiek dll.

Wady:

  1. Nie jest to zalecane rozwiązanie i nadal nie potrafię korzystać z typowych serwerów baz danych.
  2. Aplikacje nie powinny mieć danych wrażliwych ( zwłaszcza internetowe, lan mogą).

Przykładowe polecenie
#create_base:baza,100,100 #insert_value:baza,20,20,clostridium
Itp plus około 30 komend na ten moment.
Pola są zawsze tekstowe o nieograniczonej długości. Przy małych bazach powiedzmy grafiku pracowników na dany rok to tylko 12x31 komórek itd. Przy tabeli antybiotyków i bakterii, a w polach antybiotykowrażliwość to około 50x50 komórek. Baza antybiotyk/narząd - podanie szkodliwości, również niewielka baza.
Jako ,że ma to wszystko działać zdalnie dlatego zdecydowałem się na takie rozwiązanie. Żeby nie tracić czasu na uczenie się skomplikowanych rozwiązań lub ich nierozumienie, co może mi w przyszłości uniemożliwić pisanie aplikacji klienckich.

Dzięki za wszelkie sugestie :) bardzo Wam dziękuję i pozdrawiam

2

Jak kolega @abrakadaber zauważył, najlepsze by było rozdzielenie aplikacji na serwer/bakcend i aplikację kliencką. Backend czyli API które korzysta z dowolnej bazy danych, ale klientowi wysyła REST w formacie JSON. Stringi w jsonie możesz mieć zaszyfrowane, choćby dla "oka" przez Base64. Dzięki formatowi REST, klientem może być cokolwiek: program windowsowy, mac os, mobile, czy przeglądarka internetowa;-)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.