From: Alexander P. <ale...@us...> - 2010-05-06 13:42:58
|
Update of /cvsroot/firebird/firebird2/src/common In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv19582/common Modified Files: UtilSvc.cpp UtilSvc.h Log Message: Fixed CORE-2984: gbak -v srv:db stdout creates a broken backup Index: UtilSvc.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/common/UtilSvc.cpp,v retrieving revision 1.16 retrieving revision 1.17 diff -b -U3 -r1.16 -r1.17 --- UtilSvc.cpp 18 Dec 2009 12:42:18 -0000 1.16 +++ UtilSvc.cpp 6 May 2010 13:42:14 -0000 1.17 @@ -38,6 +38,26 @@ namespace Firebird { +namespace { + void outputFile(FILE* f, const void* text, size_t len) + { + if (::fwrite(text, 1, len, f) != len) + { + // ASF: If the console is configured to UTF-8 (chcp 65001) with TrueType font, the MSVC + // runtime returns the number of characters (instead of bytes) written and make + // ferror(stdout) return true. So lets not check for errors here. +#ifndef WIN_NT + Firebird::system_call_failed::raise("StandaloneUtilityInterface::output()/fwrite()"); +#endif + } + } + + void outputFile(FILE* std, const char* text) + { + outputFile(std, text, strlen(text)); + } +} + class StandaloneUtilityInterface : public UtilSvc { public: @@ -50,30 +70,32 @@ } } - virtual void output(const char* text) + void outputVerbose(const char* text) { - size_t len = strlen(text); - if (::fwrite(text, 1, len, stdout) != len) + outputFile(usvcDataMode ? stderr : stdout, text); + } + + void outputError(const char* text) { - // ASF: If the console is configured to UTF-8 (chcp 65001) with TrueType font, the MSVC - // runtime returns the number of characters (instead of bytes) written and make - // ferror(stdout) return true. So lets not check for errors here. -#ifndef WIN_NT - system_call_failed::raise("StandaloneUtilityInterface::output()/fwrite()"); -#endif + outputFile(stderr, text); } + + void outputData(const void* data, size_t size) + { + fb_assert(usvcDataMode); + outputFile(stdout, data, size); } - virtual void printf(const SCHAR* format, ...) + virtual void printf(bool err, const SCHAR* format, ...) { va_list arglist; va_start(arglist, format); - int rc = ::vprintf(format, arglist); + int rc = ::vfprintf((usvcDataMode || err) ? stderr : stdout, format, arglist); va_end(arglist); if (rc < 0) { - system_call_failed::raise("StandaloneUtilityInterface::printf()/vprintf()"); + system_call_failed::raise("StandaloneUtilityInterface::printf()/vfprintf()"); } } Index: UtilSvc.h =================================================================== RCS file: /cvsroot/firebird/firebird2/src/common/UtilSvc.h,v retrieving revision 1.15 retrieving revision 1.16 diff -b -U3 -r1.15 -r1.16 --- UtilSvc.h 18 Dec 2009 12:42:18 -0000 1.15 +++ UtilSvc.h 6 May 2010 13:42:14 -0000 1.16 @@ -50,25 +50,31 @@ typedef Firebird::HalfStaticArray<const char*, 20> ArgvType; public: - UtilSvc() : argv(getPool()) { } + UtilSvc() : argv(getPool()), usvcDataMode(false) { } - virtual void output(const char* text) = 0; - virtual void printf(const SCHAR* format, ...) = 0; virtual bool isService() = 0; virtual void started() = 0; virtual void finish() = 0; + virtual void outputVerbose(const char* text) = 0; + virtual void outputError(const char* text) = 0; + virtual void outputData(const void* text, size_t size) = 0; + virtual void printf(bool err, const SCHAR* format, ...) = 0; virtual void putLine(char, const char*) = 0; virtual void putSLong(char, SLONG) = 0; virtual void putChar(char, char) = 0; virtual void putBytes(const UCHAR*, size_t) = 0; virtual void setServiceStatus(const ISC_STATUS*) = 0; virtual void setServiceStatus(const USHORT, const USHORT, const MsgFormat::SafeArg&) = 0; - virtual void hidePasswd(ArgvType&, int) = 0; virtual const ISC_STATUS* getStatus() = 0; virtual void initStatus() = 0; virtual void checkService() = 0; + virtual void hidePasswd(ArgvType&, int) = 0; virtual void getAddressPath(Firebird::ClumpletWriter& dpb) = 0; virtual bool finished() = 0; + void setDataMode(bool value) + { + usvcDataMode = value; + } virtual ~UtilSvc() { } @@ -96,6 +102,7 @@ public: ArgvType argv; + bool usvcDataMode; }; |