Hallo zusammen,
Sorry, sollte ich hier im falschen Unterforum gelandet sein. Es geht um Folgendes:
Ich muss PostgreSQL aus einer Anwendung heraus starten, stoppen und verwalten. Die ersten Tests mit QProcess (Qt und C++ auf Windows 7 Enterprise SP 1. PostgreSQL Versionen: 9.3.5 und 9.5.0) waren auch an sich erfolgreich. Nur ist die Fehler-Ausgabe (StandardError) bei pg_ctl komplett leer, wenn ich sie auslese, obwohl sie es nicht sein sollte (ausgeführt in einer Kommandozeile gibt es Ausgabe). Um Fehler zu erkennen wäre das aber relativ hilfreich.
Ich habe dann mal versucht die Ausgabe von pg_ctl von einer Kommandozeile in eine Datei zu pipen:
pg_ctl status -D ... > D:\temp\log.txt
Funktioniert, für Standard-Meldungen. Aber Fehler pipen:
pg-ctl status 2> D:\temp\log.txt
…funktioniert nicht - die Datei wird angelegt, ist aber leer (pg_ctl sollte hier meckern, dass -D fehlt).
Hätte jemand eine Idee, woran das liegen könnte/wie ich trotzdem an die Fehlernachrichten komme? Wäre es möglich die Ausgabe in eine Log-Datei schreiben zu lassen und auf die dann zuzugreifen? pg_ctl status nimmt scheinbar keinen Parameter “-l”.
Verwirrt habe ich den Source runtergeladen. Prinzipiell kommt mir das hier ein bisschen komisch vor: (ab Z208, pg_ctl.c)
static void write_stderr(const char *fmt,...)
{
// [...]
if (!pgwin32_is_service()) /* Running as a service */
{
char errbuf[2048]; /* Arbitrary size? */
vsnprintf(errbuf, sizeof(errbuf), fmt, ap);
write_eventlog(EVENTLOG_ERROR_TYPE, errbuf);
}
else
/* Not running as service, write to stderr */
vfprintf(stderr, fmt, ap);
// [...]
}
Und (ab Z1756 pg_ctl.c):
/*
* We consider ourselves running as a service if one of the following is
* true:
*
* 1) We are running as Local System (only used by services)
* 2) Our token contains SECURITY_SERVICE_RID (automatically added to the
* process token by the SCM when starting a service)
*
* Return values:
* 0 = Not service
* 1 = Service
* -1 = Error
*
* Note: we can't report errors via write_stderr (because that calls this)
* We are therefore reduced to writing directly on stderr, which sucks, but
* we have few alternatives.
*/
int pgwin32_is_service(void) { /*** [...] ***/ }
Wenn mich nicht alles täuscht macht die If das Gegenteil davon, was in den Kommentaren beschrieben steht? PostgreSQL kompilieren und testen ist auf der Arbeit für mich gerade leider keine Option.
Hat jemand eine Idee?
Kennt ansonsten jemand eine besser Variante aus C++ einen PostgreSQL-Server zu starten/stoppen/…?
Vielen Dank im Voraus schonmal!
Viele Grüße,
DoubleM