Zlecę napisanie programu w Delphi

0

Witam,

Od pewnego czasu robię dość sporą aktualizację programów napisanych jakiś czas temu w Delphi.
Przy okazji chciałbym zlecić wykonanie dodatkowego programu w Delphi. W dużym skrócie program ten miałby działać dość podobnie jak np. OneDrive, ale jednak z pewnymi udziwnieniami 🙂
Program ma śledzić wszelkie zmiany dokonane w plikach wykorzystywanych przez określone programy obliczeniowe (te programy które aktualizuję). Synchronizacja ma obejmować jeden konkretny katalog na dysku lokalnym użytkownika wskazany jako katalog do synchronizacji (analogia do OneDrive). Działanie programu w skrócie:

  1. Program miałby śledzić cały ruch we wskazanym katalogu. Za śledzenie wszelkich zmian dokonywanych na plikach (tj. stworzenie, zmiana lub usunięcie pliku, zmiana nazwy pliku itp.) będzie odpowiedzialny gotowy komponent – należy więc oprogramować konkretne zdarzenia np. OnFileChange itp.
  2. Wykryte zmiany w plikach lokalnych program ma zapisać w bazie Postgres – tak więc magazynem, w którym przechowywane są dane do synchronizacji są tablice w bazie Postgres (a użytkownik końcowy widzi to w postaci plików).
  3. Przy starcie program przelatuje całą bazę Postgres i sprawdza, które dane są nowsze (dane na dysku lokalnym, czy w Posgres) i w zależności od tego aktualizuje dane w bazie lub plik na dysku lokalnym.

Temat nie jest pilny. Na wszelkie pytania chętnie odpowiem.

Pozdrawiam

0
  1. jak dane w bazie mogą być nowsze od danych na dysku skoro baza jest aktualizowana na podstawie danych na dysku???
  2. będzie odpowiedzialny gotowy komponent znaczy ty go dostarczasz, już taki istnieje czy trzeba go napisać?
  3. co ma się zapisywać w bazie jak np. zostanie dodana linijka tekstu do pliku? za każdym razem cały plik, diff czy coś jeszcze innego? BTW żeby wyciągnąć diffa to trzeba mieć poprzednią wersję pliku
  4. czy program ma działać także na dyskach sieciowych? Windowsowy mechanizm notyfikacji o zmianach na takich dyskach nie zawsze działa poprawnie
  5. jaki jest typ plików - tekstowe czy binarne?
0

@abrakadaber:

  1. Dane w bazie mogą być nowsze od danych na dysku - np. w sytuacji, gdy user pracuje na dwóch komputerach (główny komp to stacjonarny, ale potem na weekend zabiera ze sobą notebooka - i wtedy po włączeniu notebooka program, o którym rozmawiamy musi załadować na dysk lokalny notebooka najnowsze pliki z bazy).
  2. Planowałem wykorzystać gotowy komponent PBDirectoryMonitor. Zakładam, że ten komponent czuwa na wszelkimi zmianami na plikach.
  3. Pliki lokalne to JSONy zawierające w większości wartości liczbowe (są to zarówno pojedyncze zmienne, ale też całe tablice). Nad zmianami w plikach lokalnych będzie czuwał PBDirectoryMonitor - jeśli wykryje zmianę w pliku lokalnym to opala procedurę SaveDataFromJsonToPostgres.
  4. Z założenia katalog do synchronizacji będzie katalogiem lokalnym.
  5. Jak pisałem w pkt 3 będą to JSONy.

Do rozwiązania pozostaje też kwestia trybu "offline" - tzn. jeśli czasowo brak internetu to zamiast procedury SaveDataFromJsonToPostgres program powinien zapisać listę plików do aktualizacji np. w lokalnym JSONie, aby finalnie zaktualizować Postgresa.

0
  1. na czym opieramy "nowszość" pliku? Na dacie jego ostatniej modyfikacji (nie musi być poprawna bo data lokalnie może być zła). Idealnie było by, gdyby każdy plik miał wewnątrz zapisaną aktualną wersję zwiększaną przy każdej modyfikacji
  2. płacić 180€ za coś co jest za free ze źródłami https://github.com/aagusti/prnwatch/blob/master/DirWatch.pas
  3. ale on wykrywa, że plik się zmienił a nie co się w nim zmieniło. Generalnie windows nie ma takiego mechanizmu (albo mi o nim nic nie wiadomo), który zwracał by co się zmieniło w pliku. Dalej nie wiem co ma się zapisywać w bazie - SaveDataFromJsonToPostgres jest do napisania czy jest gotowa?
0
abrakadaber napisał(a):
  1. na czym opieramy "nowszość" pliku? Na dacie jego ostatniej modyfikacji (nie musi być poprawna bo data lokalnie może być zła). Idealnie było by, gdyby każdy plik miał wewnątrz zapisaną aktualną wersję zwiększaną przy każdej modyfikacji
  2. płacić 180€ za coś co jest za free ze źródłami https://github.com/aagusti/prnwatch/blob/master/DirWatch.pas
  3. ale on wykrywa, że plik się zmienił a nie co się w nim zmieniło. Generalnie windows nie ma takiego mechanizmu (albo mi o nim nic nie wiadomo), który zwracał by co się zmieniło w pliku. Dalej nie wiem co ma się zapisywać w bazie - SaveDataFromJsonToPostgres jest do napisania czy jest gotowa?
  1. Masz rację - trzeba dołożyć w pliku counter, który będzie zwiększany przez aplikację go edytującą. Tak więc porównywany będzie nie czas edycji ale "wersja" pliku.
  2. Trzeba porównywać jabłko z jabłkiem 🙂 . Darmowy DirWatch powstał 21 lat temu. Może na Windows 11 nadal działa bez zarzutu choć należałoby potestować. Druga sprawa to, że DirWatch obsługuje jeden event OnChangeEvent. Z kolei komercyjny komponent PBDirectoryMonitor ma następujące eventy: OnFileCreate, OnFolderCreate, OnFileRename, OnFolderRename, OnFileChange, OnFolderChange, OnFileDelete, OnFolderDelete. Także nic za darmo 😃 .
  3. "ale on wykrywa, że plik się zmienił a nie co się w nim zmieniło" - tak zgadza się. Informacja, że plik został zmieniony jest w zupełności wystarczająca. Zdarzenie informujące o "jakiejś" zmianie w pliku inicjuje procedurę, która:
    a) porówna, jak słusznie zauważyłeś, wersję pliku na dysku z wersją zapisaną w Postgres
    b) jeśli wersja w Postgres będzie niższa to zaktualizuje Postgresa w oparciu o wartości z pliku

"Dalej nie wiem co ma się zapisywać w bazie":

  • Baza będzie gotowa (przygotuję) tablice z poszczególnymi polami
  • Zapis do Postgresa jest do napisania. Jako gotowca chciałem wykorzystać tylko PBDirectoryMonitor. Całą resztę trzeba zrobić. Odnośnie zapisywania w bazie Postgres. Na najprostszym przykładzie: załóżmy, że plik zawiera kilka zmiennych A, B, C, D - wartości Real, oraz tablicę z np. 20 wierszami - kolumny Col1, Col2, Col3. Po zgłoszeniu eventu OnFileChange jeśli w bazie jest "niższa" wersja pliku to nie szukamy, która wartość się zmieniła (np. A z 2.0 na 2.5) tylko uruchamiany jest zapis do bazy wszystkich wartości z pliku lokalnego do Postgresa (zakładam, że FireDAC).
  • W rzeczywistości w plikach lokalnych w JSONach będzie znacznie więcej par (etykieta - wartość) oraz więcej tablic. W Postgresie będą tablice, w których zapisane będą te pary (etykieta - wartość), a tablice z plików lokalnych będą zapisane do bazy jako pole typu JSON (cała tablica będzie upchnięta w jednym polu typu JSON). Innymi słowy wszystkie wartości z pliku lokalnego będą umieszczane (odwzorowywane) w tablicach Postgres. Jak coś zmieni się w pliku to cały plik należy ponownie zapisać do Postgresa - nadpisać dotychczasowe dane.
0

napisz ile placisz dukatów :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1