Re: Novice! How to run pg_dump from within Java?

Поиск
Список
Период
Сортировка
От Michael Swierczek
Тема Re: Novice! How to run pg_dump from within Java?
Дата
Msg-id 68b5b5880607260627p25b543fcref5c189efdadd638@mail.gmail.com
обсуждение исходный текст
Ответ на Novice! How to run pg_dump from within Java?  ("Damian C" <jamianb@gmail.com>)
Ответы Re: Novice! How to run pg_dump from within Java?  ("Damian C" <jamianb@gmail.com>)
Список pgsql-novice
> On 7/25/06, Damian C <jamianb@gmail.com> wrote:
> Hello,
>
> We have a Java project that is developing a small business app and
> using Hibernate & Postgres for persistence.  It all works like a dream
> until we need to know anything about Postgres!!  It is obviously a
> "feather in the cap" of Postgres that "so many (Java developers) can
> do so much while knowing so little".
>
> I need to perform the world's simplest task: Create a pg dump from within Java.
>
> Of course we do this easily using pgAdminIII, but I need to automate
> it for our Users. I notice that pgAdmin uses a command line like this
> ...
> <snip>
> C:\Program Files\PostgreSQL\8.1\bin\pg_dump.exe -i -h localhost -p
> 5432 -U pgsuperuser -F c -b -v -f "D:\PG_26jul06.backup" devdb
> </snip>
>
> We use "ProcessBuilder" to launch the  "pg_dump.exe" program. It takes
> an List of Strings in its constructor (including appropriate escape
> characters) ...
> <snip>
> List<String> cmds = new ArrayList<String>();
> cmds.add("C:\\Program Files\\PostgreSQL\\8.1\\bin\\pg_dump.exe");
> cmds.add("-i");
> cmds.add("-h");
> cmds.add("localhost");
> cmds.add("-p");
> cmds.add("5432");
> cmds.add("-U");
> cmds.add("pgsuperuser");
> cmds.add("-F");
> cmds.add("c");
> cmds.add("-b");
> cmds.add("-v");
> cmds.add("-f");
> cmds.add("\"D:\\PG_26jul06A.backup\"");
> cmds.add("devdb");
> Process process = new ProcessBuilder(cmds).start();
> </snip>
>
> Now this DOES work in that pg_dump.exe is invoked, and a new file is
> created at the correct location. However, the file size is zero
> (instead of the pgAdminIII version that is 47K)
>
> Any suggestions on what I'm doing wrong,
> or any pointers for a better way to do this??
>
> Many thanks,
> -Damian

Damian,
       I'm not sure what the problem is.  But when you execute a
command line application from inside Java, you can capture the
resulting print messages which normally go to STDOUT and STDERR.
      I have a simple in-house application to do this. The code is
ugly, but it's all I need to get the job done.  I've pasted a few
snippets below.   You can use that to capture any messages that
pg_dump would otherwise print to the screen, to see what the problem
is.
     I'm a relative Java newbie myself, someone with some experience
and a need for production-ready code can certainly make something
cleaner.

-Mike

// the command to run
Process proc = Runtime.getRuntime().exec(myCmd);
// the STDOUT results
BufferedReader    bufIn = new BufferedReader(new
InputStreamReader(proc.getInputStream()));
// the STDERR results
BufferedReader bufErr = new BufferedReader(new
InputStreamReader(proc.getErrorStream()));
// the STDIN stream I can use to send additional data.
BufferedWriter    bw = new BufferedWriter(new
OutputStreamWriter(proc.getOutputStream()));
...
int in;
try
{
    Thread.sleep(30);
    StringBuffer sb = new StringBuffer("");
    while (bufIn.ready())
    {
    in = bufIn.read();
    if (in > -1 && in < 65535)
    {
    String c = String.valueOf((char)in);
    sb.append(c);
    }
    Thread.sleep(30);
   }
   while (bufErr.ready())
   {
    in = bufErr.read();
    if (in > -1 && in < 65535)
    {
    String c = String.valueOf((char)in);
    sb.append(c);
    }
        Thread.sleep(30);
   }
   System.out.println(sb.toString());
}
catch (IOException ioe)
{
     System.err.println("IOException from reader, message: " +
ioe.getMessage());
     return null;
}
catch (InterruptedException ie)
{
     System.err.println("InterruptedException from reader, message: "
+ ie.getMessage());
    return null;
}
...

В списке pgsql-novice по дате отправления:

Предыдущее
От: Sean Davis
Дата:
Сообщение: Re: Lurking Wanna Be
Следующее
От: Tom Lane
Дата:
Сообщение: Re: case-insensitive Index