Bom, basicamente tenho três duvidas, vou descrever uma após a outra pra facilitar…
Por que quando eu rodo o pg_dump.exe através de um JButton do meu programa, a tela em questao fica travada e o arquivo de backup é gerado só depois q eu finalizo o programa ?
Pra rodar o pg_dump.exe eu uso o seguinte trecho de código, que se acha em qq fórum por ai (arq == caminho e nome do arquivo escolhido num save dialog):
try {
Runtime.getRuntime().exec("D:\\PROGRAMAS\\PostgreSQL\\8.3\\bin\\pg_dump.exe -i -h localhost -p 5432 -U postgres -F c -b -v -f \"" + arq + "\" jsacteste");
} catch (Exception ex) {
ex.printStackTrace();
}
2) Eu consegui que o programa não fique travado, executando o cmd e passando o comando pra ele ao invés de chamar diretamente o pg_dump, só que eu tentei usar o comando waitFor(); para esperar o cmd ser finalizado e entao obter o exitValue(); verificar se é igual a 0 ou não pra dizer se o backup foi feito com sucesso ou não, (apesar de eu achar q nao vai funcionar, pq o programa executado foi o cmd e nao o pg_dump) mas o comando waitFor(); não funcionou, passou direto por ele, ou seja, o println ali é imprimido antes do pg_dump terminar. Por que será? chamando outros programas, como no notepad por exemplo, ele fica esperando …
try {
Process p = Runtime.getRuntime().exec("cmd.exe /c start D:\\PROGRAMAS\\PostgreSQL\\8.3\\bin\\pg_dump.exe -i -h localhost -p 5432 -U postgres -F c -b -v -f \"" + arq + "\" jsacteste");
p.waitFor();
System.out.println("terminou");
} catch (IOException ex) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
3) A ultima dúvida é a respeito das mensagens geradas pelo pg_dump, por exemplo, se eu executar o cmd e dai rodar o comando pro pg_dump fazer o backup, varias mensagens serão exibidas no console, (reading table … reading nao sei o q…), se eu fizer o backup a partir do pgAdmin, essas mensagens tbem aparecem na telinha lah do pgAdmin, será q tem como eu obter essas mensagens e joga-las num JTextArea por exemplo ??? eu quero verificar o código de saída tbem pra informar o usuário se o backup foi feito com sucesso, mais como dito acima, ou fica travado ou passa direto… Alguem já fez alguma coisa assim ?
Comigo tb acontecia de travar, entao testando vi que tirando o “-v” funcionava certinho.
Nao vi diferença alguma com ou sem este parametro entao deixei assim.
pois é cara, na sexta feira quando comecei a fazer isso, tava travando, mas agora to fazendo o backup com o seguinte código, que é justamente o que travava, o tah com o -v que vc disse q teve q tirar…
try {
Runtime.getRuntime().exec("D:\\PROGRAMAS\\PostgreSQL\\8.3\\bin\\pg_dump.exe -i -h localhost -p 5432 -U postgres -F c -b -v -f \"C:\\Documents and Settings\\Cleiton\\Desktop\\teste.backup\" jsacteste");
} catch (IOException ex) {
ex.printStackTrace();
}
puts, eu queria fazer as mensagens do modo verboso (-v) aparecer num text area pro usuario poder analizar e ver se o backup foi realizado com sucesso, vc implementou algo assim, verificar se o código de saida é igual a zero e tallz, ou só tah chamando o pg_dump mesmo?
sobre as mensagens que o pg_dump exibe, eu tentei obter elas usando o getInputstream(); de Process, mas nao aparece nada, a string impressa não contem nada…
Obs: na primeira linha está sem o -v(modo verboso, que exibe as mensagens) para não travar, mas eu tentei executando o cmd tbem, como postei no primeiro post, com o -v, e tbem nao funcionou…
[code]try {
Process p = Runtime.getRuntime().exec(“D:\PROGRAMAS\PostgreSQL\8.3\bin\pg_dump.exe -i -h localhost -p 5432 -U postgres -F c -b -f “C:\Documents and Settings\Cleiton\Desktop\teste.backup” jsacteste”);
BufferedInputStream buffer = new BufferedInputStream(p.getInputStream());
BufferedReader commandResult = new BufferedReader(new InputStreamReader(buffer));
StringBuffer newData = new StringBuffer(10000);
String s = "";
while (null != ((s = commandResult.readLine()))) {
newData.append(s + "\n");
}
commandResult.close();
String texto = newData.toString();
if (texto.equals("")) {
System.out.println("nada");
} else {
System.out.println(texto);
}
} catch (IOException ex) {
ex.printStackTrace();
}[/code]
Não sei se essa é a maneira correta de se obter as mensagens do pg_dump…
é, a mensagem de erro eu consigo obter, só faltaria mesmo as mensagens do -v(modo verboso) pra ficar mais legalzinho, mas com esse parametro o programa java fica travado…
vlw ai a resposta, acho q vou acabar implementando verificação de SO tbem… Intaum, o pg_dump na verdade eu ja consegui fazer o jeito que eu queria, o problema mesmo é o pg_restore que não consigo obter o código de saída dele, pra informar o usuario se deu certo ou nao…