Kopia bazy danych Firebird

Kopia bazy danych Firebird
JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 35
0

Delphi 10.4 + Firebird 5.
Usiłuję wykonać kopię bazy danych w następujący sposób :

Kopiuj
ShellExecute(Handle, 'open', 'c:\Program Files\Firebird\Firebird_5_0\gbak.exe -B -USER SYSDBA -PAS masterkey C:\AppName\data.fdb c:\AppName\data.fbk', nil, nil, SW_NORMAL)

Niestety powyższa konstrukcja nie działa i nie mam pojęcia dlaczego. Może ktoś bieglejszy w temacie pomoże ?.

CL
  • Rejestracja: dni
  • Ostatnio: dni
3

Spróbuj dać ścieżki (głównie tą pierwszą) w podwójnym cudzysłowie. Jak jest spacja w ścieżce to dalszą część interpretowana jest jako kolejny parametr.

JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 35
0

Utworzyłem tymczasowy katalog c:xxx (aby pozbyć się ewentualnych spacji) , przekopiowałem do niego gabak.exe oraz data.fdb i niestety nic to nie dało.

KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Gorlice
0

Wpisywałeś tą komendę normalnie w wierszu poleceń? Jeżeli coś jest nie tak to może będzie jakieś sensowne info. Poza tym nie wiem czy to ma znaczenie ale
https://www.firebirdsql.org/file/documentation/html/en/firebirddocs/gbak/firebird-gbak.html
Masz gbak -b <db set> <backup set> [backup options] [general options]
a więc zgodnie z tym raczej powinno być gbak.exe -b C:\AppName\data.fdb c:\AppName\data.fbk -USER SYSDBA -PAS masterkey

JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 35
0
jurkowojc napisał(a):

Utworzyłem tymczasowy katalog c:xxx (aby pozbyć się ewentualnych spacji) , przekopiowałem do niego gabak.exe oraz data.fdb i niestety nic to nie dało.

W wierszu poleceń zadanie wykonuje się bez problemu !
W przypadku c:\program files ... należy użyć pdwójny cudzysłów (sugestia kolegi Clark), Co ciekawe , format zapisu jak u mnie czy u kolegi (kAzek) nie ma znaczenia.

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
2

Bez względu na to jaki program się odpala, jeśli przyjmuje ścieżkę w parametrze, to taką ścieżkę zawsze należy objąć cudzysłowami. Te nie przeszkadzają w przypadku ścieżek pozbawionych białych znaków, natomiast jeśli ścieżka zawiera białe znaki, to brak cudzysłowów spowoduje, że fragmenty ścieżki zostaną uznane za osobne parametry — argc będzie miał większą wartość niż się spodziewasz, natomiast kawałki ścieżki zostaną rozrzucone po kilku sąsiadujących komórkach argv.

System nie zna intencji użytkownika, więc nie domyśli się, że ma kilka ciągów zbić w jeden ciąg ścieżki (i nawet zgadywać nie próbuje). Przy poprawnie przekazanych ścieżkach, nie ma powodu, aby tak odpalony program nie zadziałał, bo nieistotne czy uruchomi się go z dysku, czy z konsoli, czy za pomocą ShellExecute, system zrobi dokładnie to samo w każdym z tych przypadków.

SK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 101
1

@jurkowojc a czy przypadkiem problemem nie jest brak uprawnienia do zapisu plików w podanych przez ciebie ścieżkach? Spróbuj uruchomić aplikację z uprawnieniami administratora i sprawdź, czy to nie rozwiąże problemu.

JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 35
0
skrzat napisał(a):

@jurkowojc a czy przypadkiem problemem nie jest brak uprawnienia do zapisu plików w podanych przez ciebie ścieżkach? Spróbuj uruchomić aplikację z uprawnieniami administratora i sprawdź, czy to nie rozwiąże problemu.

Próbowałem również jako administrator. Nie pomogło.

CL
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
var code := ShellExecute(Handle, 'open', PChar('"c:\Program Files\Firebird\Firebird_5_0\gbak.exe" -b C:\AppName\data.fdb c:\AppName\data.fbk -USER SYSDBA -PAS masterkey'), nil, nil, SW_NORMAL);
ShowMessage(code.toString);

Wklej u siebie, uruchom i powiedź co się wyświetliło.

PD
  • Rejestracja: dni
  • Ostatnio: dni
2

SellExecute ma osobny parametr na przekazywanie ciągu z parametrami dla aplikacji - poniższy kod powinien zadziałać:

Kopiuj
ShellExecute(Handle, 'open', 'c:\Program Files\Firebird\Firebird_5_0\gbak.exe',
  '-B -USER SYSDBA -PAS masterkey C:\AppName\data.fdb c:\AppName\data.fbk', nil, SW_NORMAL);
JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 35
0
Paweł Dmitruk napisał(a):

SellExecute ma osobny parametr na przekazywanie ciągu z parametrami dla aplikacji - poniższy kod powinien zadziałać:

Kopiuj
ShellExecute(Handle, 'open', 'c:\Program Files\Firebird\Firebird_5_0\gbak.exe',
  '-B -USER SYSDBA -PAS masterkey C:\AppName\data.fdb c:\AppName\data.fbk', nil, SW_NORMAL);

OK! TO ZADZIAŁAŁO !
Muszę teraz na spokojnie przeanalizować kod.

Wykonanie kodu kolegi Clarc zwróciło kod 2;

Wielkie dzięki !

JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 35
0

Ponieważ apetyt rośnie w miarę jedzenia to z czystej ciekawości krótkie pytanko :
jakiego polecenia należy użyć aby móc podejrzeć to co proces aktualnie wykonuje i kiedy się zakończy.
Czytałem o createprocess ale nie wiem czy spełni moje ewentualne oczekiwania.

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
1
jurkowojc napisał(a):

jakiego polecenia należy użyć aby móc podejrzeć to co proces aktualnie wykonuje i kiedy się zakończy.

Zadajesz pytania bardzo nieprecyzyjnie, więc trudno cokolwiek sensownego doradzić. Żeby można było podglądać co proces robi i wiedzieć kiedy skończy, ten proces musiałby się w jakiś sposób komunikować z otoczeniem, np. wypisywać stan postępu na standardowe wyjście, uzupełniać file mapping, rozsyłać komunikaty do pozostałych okien (message broadcasting) itd. Jeśli tego nie robi, to niczego się o postępie nie dowiesz — możesz tylko wykryć moment zakończenia jego działania.

Podglądanie standardowego wyjścia procesu jest dość łatwe w Lazarusie — pozwala na to np. standardowa klasa TProcess. Za jej pomocą można wygodnie odpalić dowolny program z dysku, przekazać mu parametry, podglądać standardowe wyjście, a także czekać (lub nie) na zakończenie jego działania. W dodatku wszystko wieloplatformowe.

Dla Delphi jest port, na razie tylko na Windows. W razie czego, klasa TProcess pod Windows tak czy siak używa funkcji z Win32 API, więc równie dobrze możesz popatrzeć na to jak jest zaimplementowana, wyciągnąć z niego tylko to co cię interesuje i napisać sobie własną, małą klasę, która spełni twoje wymagania. Albo po prostu zaimplementować rozwiązanie w czystym Win32 API, jeśli tak wolisz.

PD
  • Rejestracja: dni
  • Ostatnio: dni
1

Tak jak wspomniał @furious programming jeżeli program przekazuje dane na standardowe wyjście to możesz to przechwycić - tutaj masz przykład dla Delphi: https://stackoverflow.com/questions/9119999/getting-output-from-a-shell-dos-app-into-a-delphi-app

SK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 101
1

Tu jest "ciekawy" unit do tego: https://github.com/t-edson/UnTerminal

JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 35
0

Dziękuję wszystkim za pomoc !
Zainteresowałem się TProcess gdyż przy jego pomocy mogę zrobić wszystko co potrzebuję, a jestem pewien, że również znacznie więcej !
Na razie informacja o zakończeniu procesu wraz z informacją o statusie zakończenia mnie satysfakcjonuje. Przy odrobinie wolnego czasu
zgłębię temat bardziej gdyż na pewno warto.

KO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
0
jurkowojc napisał(a):

Delphi 10.4 + Firebird 5.
Usiłuję wykonać kopię bazy danych w następujący sposób :

Kopiuj
ShellExecute(Handle, 'open', 'c:\Program Files\Firebird\Firebird_5_0\gbak.exe -B -USER SYSDBA -PAS masterkey C:\AppName\data.fdb c:\AppName\data.fbk', nil, nil, SW_NORMAL)

Niestety powyższa konstrukcja nie działa i nie mam pojęcia dlaczego. Może ktoś bieglejszy w temacie pomoże ?.

Zamiast Handle wpisz 0, wszystkie stringi zamień na Pchar('.........') no i rozdziel ścieżkę do programu gbak.exe jako oddzielny parametr, -B......... jako następny, nil, SW_NORMAL
powinno to wyglądać tak:

Kopiuj
ShellExecute(0, 'open', PCahr('c:\Program Files\Firebird\Firebird_5_0\gbak.exe'),PChar(' -B -USER SYSDBA -PAS masterkey C:\AppName\data.fdb c:\AppName\data.fbk'),  nil, SW_NORMAL);
flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
0

Rzutowanie na PChar jest konieczne tylko wtedy, gdy ciąg znaków znajduje się w zmiennej typu String. Ale też niekoniecznie, bo równie dobrze można podać adres pierwszego znaku i wyjdzie na to samo. Literał znakowy podany bezpośrednio w parametrze jest traktowany przez kompilator jako pointer na ciąg znaków, a więc rzutowanie jest nadmiarowe.

Dodałbym jeszcze, że jeśli już podaje się jakiekolwiek ścieżki do ShellExecute, to warto jest je obejmować w cudzysłowy. W przykładach wyżej co prawda wszystkie ścieżki są hardkodowane i żadna z nich nie zawiera białych znaków, ale jeśli mamy ścieżki określane dynamicznie i przechowywane w zmiennych, to lepiej te cudzysłowy dodać.

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.