mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-31 06:43:02 +01:00
302e0d2cd9
1. Mach semaphores on Darwin. 2. No more local SysV semaphores. 3. Fixed bugs in conditional var based semaphore. 4. Moved big methods from .h to .cpp file.
218 lines
5.9 KiB
C++
218 lines
5.9 KiB
C++
/*
|
|
* PROGRAM: Firebird exceptions classes
|
|
* MODULE: StatusArg.h
|
|
* DESCRIPTION: Build status vector with variable number of elements
|
|
*
|
|
* The contents of this file are subject to the Initial
|
|
* Developer's Public License Version 1.0 (the "License");
|
|
* you may not use this file except in compliance with the
|
|
* License. You may obtain a copy of the License at
|
|
* http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
|
|
*
|
|
* Software distributed under the License is distributed AS IS,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing rights
|
|
* and limitations under the License.
|
|
*
|
|
* The Original Code was created by Alex Peshkov
|
|
* for the Firebird Open Source RDBMS project.
|
|
*
|
|
* Copyright (c) 2008 Alex Peshkov <peshkoff at mail.ru>
|
|
* and all contributors signed below.
|
|
*
|
|
* All Rights Reserved.
|
|
* Contributor(s): ______________________________________.
|
|
*
|
|
*
|
|
*/
|
|
|
|
#ifndef FB_STATUS_ARG
|
|
#define FB_STATUS_ARG
|
|
|
|
namespace Firebird {
|
|
|
|
class AbstractString;
|
|
class MetaName;
|
|
|
|
namespace Arg {
|
|
|
|
// forward
|
|
class Warning;
|
|
class StatusVector;
|
|
|
|
class Base
|
|
{
|
|
protected:
|
|
class ImplBase
|
|
{
|
|
private:
|
|
ISC_STATUS kind, code;
|
|
|
|
public:
|
|
ISC_STATUS getKind() const throw() { return kind; }
|
|
ISC_STATUS getCode() const throw() { return code; }
|
|
|
|
virtual const ISC_STATUS* value() const throw() { return NULL; }
|
|
virtual int length() const throw() { return 0; }
|
|
virtual int firstWarning() const throw() { return 0; }
|
|
virtual bool hasData() const throw() { return false; }
|
|
virtual void clear() throw() { }
|
|
virtual void append(const StatusVector&) throw() { }
|
|
virtual ISC_STATUS copyTo(ISC_STATUS*) const throw() { return 0; }
|
|
|
|
virtual void shiftLeft(const Base&) throw() { }
|
|
virtual void shiftLeft(const Warning&) throw() { }
|
|
virtual void shiftLeft(const char*) throw() { }
|
|
virtual void shiftLeft(const AbstractString&) throw() { }
|
|
virtual void shiftLeft(const MetaName&) throw() { }
|
|
|
|
ImplBase(ISC_STATUS k, ISC_STATUS c) throw() : kind(k), code(c) { }
|
|
virtual ~ImplBase() { }
|
|
};
|
|
|
|
Base(ISC_STATUS k, ISC_STATUS c);// : implementation(new ImplBase(k, c)) { }
|
|
explicit Base(ImplBase* i) throw() : implementation(i) { }
|
|
~Base() { delete implementation; }
|
|
|
|
ImplBase* const implementation;
|
|
|
|
public:
|
|
ISC_STATUS getKind() const throw() { return implementation->getKind(); }
|
|
ISC_STATUS getCode() const throw() { return implementation->getCode(); }
|
|
};
|
|
|
|
class StatusVector : public Base
|
|
{
|
|
protected:
|
|
class ImplStatusVector : public ImplBase
|
|
{
|
|
private:
|
|
ISC_STATUS_ARRAY m_status_vector;
|
|
int m_length, m_warning;
|
|
|
|
bool appendErrors(const ImplBase* const v) throw();
|
|
bool appendWarnings(const ImplBase* const v) throw();
|
|
bool append(const ISC_STATUS* const from, const int count) throw();
|
|
|
|
public:
|
|
virtual const ISC_STATUS* value() const throw() { return m_status_vector; }
|
|
virtual int length() const throw() { return m_length; }
|
|
virtual int firstWarning() const throw() { return m_warning; }
|
|
virtual bool hasData() const throw() { return m_length > 0; }
|
|
virtual void clear() throw();
|
|
virtual void append(const StatusVector& v) throw();
|
|
virtual ISC_STATUS copyTo(ISC_STATUS* dest) const throw();
|
|
virtual void shiftLeft(const Base& arg) throw();
|
|
virtual void shiftLeft(const Warning& arg) throw();
|
|
virtual void shiftLeft(const char* text) throw();
|
|
virtual void shiftLeft(const AbstractString& text) throw();
|
|
virtual void shiftLeft(const MetaName& text) throw();
|
|
|
|
ImplStatusVector(ISC_STATUS k, ISC_STATUS c) throw() : ImplBase(k, c)
|
|
{
|
|
clear();
|
|
}
|
|
|
|
explicit ImplStatusVector(const ISC_STATUS* s) throw();
|
|
};
|
|
|
|
StatusVector(ISC_STATUS k, ISC_STATUS v);
|
|
|
|
public:
|
|
explicit StatusVector(const ISC_STATUS* s);
|
|
StatusVector();
|
|
~StatusVector() { }
|
|
|
|
const ISC_STATUS* value() const throw() { return implementation->value(); }
|
|
int length() const throw() { return implementation->length(); }
|
|
bool hasData() const throw() { return implementation->hasData(); }
|
|
|
|
void clear() throw() { implementation->clear(); }
|
|
void append(const StatusVector& v) throw() { implementation->append(v); }
|
|
void raise() const;
|
|
ISC_STATUS copyTo(ISC_STATUS* dest) const throw() { return implementation->copyTo(dest); }
|
|
|
|
// generic argument insert
|
|
StatusVector& operator<<(const Base& arg) throw() { implementation->shiftLeft(arg); return *this; }
|
|
// warning special case - to setup first warning location
|
|
StatusVector& operator<<(const Warning& arg) throw() { implementation->shiftLeft(arg); return *this; }
|
|
// Str special case - make the code simpler & better readable
|
|
StatusVector& operator<<(const char* text) throw() { implementation->shiftLeft(text); return *this; }
|
|
StatusVector& operator<<(const AbstractString& text) throw() { implementation->shiftLeft(text); return *this; }
|
|
StatusVector& operator<<(const MetaName& text) throw() { implementation->shiftLeft(text); return *this; }
|
|
|
|
private:
|
|
};
|
|
|
|
|
|
class Gds : public StatusVector
|
|
{
|
|
public:
|
|
explicit Gds(ISC_STATUS s) throw();
|
|
};
|
|
|
|
class Str : public Base
|
|
{
|
|
public:
|
|
explicit Str(const char* text) throw();
|
|
explicit Str(const AbstractString& text) throw();
|
|
explicit Str(const MetaName& text) throw();
|
|
};
|
|
|
|
class Num : public Base
|
|
{
|
|
public:
|
|
explicit Num(ISC_STATUS s) throw();
|
|
};
|
|
|
|
class Interpreted : public StatusVector
|
|
{
|
|
public:
|
|
explicit Interpreted(const char* text) throw();
|
|
explicit Interpreted(const AbstractString& text) throw();
|
|
};
|
|
|
|
class Unix : public Base
|
|
{
|
|
public:
|
|
explicit Unix(ISC_STATUS s) throw();
|
|
};
|
|
|
|
class Mach : public Base
|
|
{
|
|
public:
|
|
explicit Mach(ISC_STATUS s) throw();
|
|
};
|
|
|
|
class Windows : public Base
|
|
{
|
|
public:
|
|
explicit Windows(ISC_STATUS s) throw();
|
|
};
|
|
|
|
class Warning : public StatusVector
|
|
{
|
|
public:
|
|
explicit Warning(ISC_STATUS s) throw();
|
|
};
|
|
|
|
class SqlState : public Base
|
|
{
|
|
public:
|
|
explicit SqlState(const char* text) throw();
|
|
explicit SqlState(const AbstractString& text) throw();
|
|
};
|
|
|
|
class OsError : public Base
|
|
{
|
|
public:
|
|
OsError() throw();
|
|
};
|
|
|
|
} // namespace Arg
|
|
|
|
} // namespace Firebird
|
|
|
|
|
|
#endif // FB_STATUS_ARG
|