Kopia bazy danych Firebird

Kopia bazy danych Firebird
JU
  • Rejestracja:ponad 6 lat
  • Ostatnio:5 miesięcy
  • 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 ?.

edytowany 1x, ostatnio: flowCRANE
CL
  • Rejestracja:prawie 16 lat
  • Ostatnio:8 miesięcy
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:ponad 6 lat
  • Ostatnio:5 miesięcy
  • 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:prawie 20 lat
  • Ostatnio:minuta
  • 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


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek
JU
  • Rejestracja:ponad 6 lat
  • Ostatnio:5 miesięcy
  • 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.

CL
To udało się z cudzysłowiem czy nie bo ja z treści tego postu nie wiem czy już działa.
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:30 minut
  • Lokalizacja:Tuchów
  • Postów:12175
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.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 4x, ostatnio: flowCRANE
SK
  • Rejestracja:około 7 lat
  • Ostatnio:4 minuty
  • Postów:99
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:ponad 6 lat
  • Ostatnio:5 miesięcy
  • 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:prawie 16 lat
  • Ostatnio:8 miesięcy
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:ponad 22 lata
  • Ostatnio:5 minut
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);

pozdrawiam
paweld
JU
  • Rejestracja:ponad 6 lat
  • Ostatnio:5 miesięcy
  • 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 !

CL
2 to ERROR_FILE_NOT_FOUND - czyli to co pisał @Paweł Dmitruk, pierwszy parametr to sam plik a u Ciebie odczytywało wszystko jako ścieżkę.
JU
  • Rejestracja:ponad 6 lat
  • Ostatnio:5 miesięcy
  • 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
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:30 minut
  • Lokalizacja:Tuchów
  • Postów:12175
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.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 3x, ostatnio: flowCRANE
PD
  • Rejestracja:ponad 22 lata
  • Ostatnio:5 minut
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


pozdrawiam
paweld
SK
  • Rejestracja:około 7 lat
  • Ostatnio:4 minuty
  • Postów:99
1

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

PD
Taak, tylko że to dla Lazarus-a
JU
  • Rejestracja:ponad 6 lat
  • Ostatnio:5 miesięcy
  • 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:około rok
  • Ostatnio:4 miesiące
  • 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);
edytowany 1x, ostatnio: flowCRANE
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:30 minut
  • Lokalizacja:Tuchów
  • Postów:12175
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ć.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE

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.