--- /dev/null
+///////////////////////////////////////////////////////////////////////////////\r
+//\r
+// File : $Id: _ibpp.h,v 1.2 2007/05/17 08:37:05 faust Exp $\r
+// Subject : IBPP internal declarations\r
+//\r
+///////////////////////////////////////////////////////////////////////////////\r
+//\r
+// (C) Copyright 2000-2006 T.I.P. Group S.A. and the IBPP Team (www.ibpp.org)\r
+//\r
+// The contents of this file are subject to the IBPP License (the "License");\r
+// you may not use this file except in compliance with the License. You may\r
+// obtain a copy of the License at http://www.ibpp.org or in the 'license.txt'\r
+// file which must have been distributed along with this file.\r
+//\r
+// This software, distributed under the License, is distributed on an "AS IS"\r
+// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the\r
+// License for the specific language governing rights and limitations\r
+// under the License.\r
+//\r
+///////////////////////////////////////////////////////////////////////////////\r
+//\r
+// COMMENTS\r
+//\r
+// * 'Internal declarations' means everything used to implement ibpp. This\r
+// file and its contents is NOT needed by users of the library. All those\r
+// declarations are wrapped in a namespace : 'ibpp_internals'.\r
+// * Tabulations should be set every four characters when editing this file.\r
+//\r
+///////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef __INTERNAL_IBPP_H__\r
+#define __INTERNAL_IBPP_H__\r
+\r
+#include "stg/ibpp.h"\r
+\r
+#if defined(__BCPLUSPLUS__) || defined(_MSC_VER) || defined(__DMC__)\r
+#define HAS_HDRSTOP\r
+#endif\r
+\r
+#if (defined(__GNUC__) && defined(IBPP_WINDOWS))\r
+// Setting flags for ibase.h -- using GCC/Cygwin/MinGW on Win32\r
+#ifndef _MSC_VER\r
+#define _MSC_VER 1299\r
+#endif\r
+#ifndef _WIN32\r
+#define _WIN32 1\r
+#endif\r
+#endif\r
+\r
+#include "ibase.h" // From Firebird 1.x or InterBase 6.x installation\r
+\r
+#if (defined(__GNUC__) && defined(IBPP_WINDOWS))\r
+// UNSETTING flags used above for ibase.h -- Huge conflicts with libstdc++ !\r
+#undef _MSC_VER\r
+#undef _WIN32\r
+#endif\r
+\r
+#ifdef IBPP_WINDOWS\r
+#include <windows.h>\r
+#endif\r
+\r
+//#include <limits>\r
+#include <string>\r
+#include <vector>\r
+#include <sstream>\r
+#include <cstdarg>\r
+\r
+#ifdef _DEBUG\r
+#define ASSERTION(x) {if (!(x)) {throw LogicExceptionImpl("ASSERTION", \\r
+ "'"#x"' is not verified at %s, line %d", \\r
+ __FILE__, __LINE__);}}\r
+#else\r
+#define ASSERTION(x) /* x */\r
+#endif\r
+\r
+// Fix to famous MSVC 6 variable scope bug\r
+#if defined(_MSC_VER) && (_MSC_VER < 1300) // MSVC 6 should be < 1300\r
+#define for if(true)for\r
+#endif\r
+\r
+namespace ibpp_internals\r
+{\r
+\r
+enum flush_debug_stream_type {fds};\r
+\r
+#ifdef _DEBUG\r
+\r
+struct DebugStream : public std::stringstream\r
+{\r
+ // next two operators fix some g++ and vc++ related problems\r
+ std::ostream& operator<< (const char* p)\r
+ { static_cast<std::stringstream&>(*this)<< p; return *this; }\r
+\r
+ std::ostream& operator<< (const std::string& p)\r
+ { static_cast<std::stringstream&>(*this)<< p; return *this; }\r
+\r
+ DebugStream& operator=(const DebugStream&) {return *this;}\r
+ DebugStream(const DebugStream&) {}\r
+ DebugStream() {}\r
+};\r
+std::ostream& operator<< (std::ostream& a, flush_debug_stream_type);\r
+\r
+#else\r
+\r
+struct DebugStream\r
+{\r
+ template<class T> DebugStream& operator<< (const T&) { return *this; }\r
+ // for manipulators\r
+ DebugStream& operator<< (std::ostream&(*)(std::ostream&)) { return *this; }\r
+};\r
+\r
+#endif // _DEBUG\r
+\r
+class DatabaseImpl;\r
+class TransactionImpl;\r
+class StatementImpl;\r
+class BlobImpl;\r
+class ArrayImpl;\r
+class EventsImpl;\r
+\r
+// Native data types\r
+typedef enum {ivArray, ivBlob, ivDate, ivTime, ivTimestamp, ivString,\r
+ ivInt16, ivInt32, ivInt64, ivFloat, ivDouble,\r
+ ivBool, ivDBKey, ivByte} IITYPE;\r
+\r
+//\r
+// Those are the Interbase C API prototypes that we use\r
+// Taken 'asis' from IBASE.H, prefix 'isc_' replaced with 'proto_',\r
+// and 'typedef' preprended...\r
+//\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_create_database (ISC_STATUS *,\r
+ short,\r
+ char *,\r
+ isc_db_handle *,\r
+ short,\r
+ char *,\r
+ short);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_attach_database (ISC_STATUS *,\r
+ short,\r
+ char *,\r
+ isc_db_handle *,\r
+ short,\r
+ char *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_detach_database (ISC_STATUS *,\r
+ isc_db_handle *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_drop_database (ISC_STATUS *,\r
+ isc_db_handle *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_database_info (ISC_STATUS *,\r
+ isc_db_handle *,\r
+ short,\r
+ char *,\r
+ short,\r
+ char *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_dsql_execute_immediate (ISC_STATUS *,\r
+ isc_db_handle *,\r
+ isc_tr_handle *,\r
+ unsigned short,\r
+ char *,\r
+ unsigned short,\r
+ XSQLDA *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_open_blob2 (ISC_STATUS *,\r
+ isc_db_handle *,\r
+ isc_tr_handle *,\r
+ isc_blob_handle *,\r
+ ISC_QUAD *,\r
+ short,\r
+ char *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_create_blob2 (ISC_STATUS *,\r
+ isc_db_handle *,\r
+ isc_tr_handle *,\r
+ isc_blob_handle *,\r
+ ISC_QUAD *,\r
+ short,\r
+ char *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_close_blob (ISC_STATUS *,\r
+ isc_blob_handle *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_cancel_blob (ISC_STATUS *,\r
+ isc_blob_handle *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_get_segment (ISC_STATUS *,\r
+ isc_blob_handle *,\r
+ unsigned short *,\r
+ unsigned short,\r
+ char *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_put_segment (ISC_STATUS *,\r
+ isc_blob_handle *,\r
+ unsigned short,\r
+ char *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_blob_info (ISC_STATUS *,\r
+ isc_blob_handle *,\r
+ short,\r
+ char *,\r
+ short,\r
+ char *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_array_lookup_bounds (ISC_STATUS *,\r
+ isc_db_handle *,\r
+ isc_tr_handle *,\r
+ char *,\r
+ char *,\r
+ ISC_ARRAY_DESC *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_array_get_slice (ISC_STATUS *,\r
+ isc_db_handle *,\r
+ isc_tr_handle *,\r
+ ISC_QUAD *,\r
+ ISC_ARRAY_DESC *,\r
+ void *,\r
+ ISC_LONG *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_array_put_slice (ISC_STATUS *,\r
+ isc_db_handle *,\r
+ isc_tr_handle *,\r
+ ISC_QUAD *,\r
+ ISC_ARRAY_DESC *,\r
+ void *,\r
+ ISC_LONG *);\r
+\r
+typedef ISC_LONG ISC_EXPORT proto_vax_integer (char *,\r
+ short);\r
+\r
+typedef ISC_LONG ISC_EXPORT proto_sqlcode (ISC_STATUS *);\r
+\r
+typedef void ISC_EXPORT proto_sql_interprete (short,\r
+ char *,\r
+ short);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_interprete (char *,\r
+ ISC_STATUS * *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_que_events (ISC_STATUS *,\r
+ isc_db_handle *,\r
+ ISC_LONG *,\r
+ short,\r
+ char *,\r
+ isc_callback,\r
+ void *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_cancel_events (ISC_STATUS *,\r
+ isc_db_handle *,\r
+ ISC_LONG *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_start_multiple (ISC_STATUS *,\r
+ isc_tr_handle *,\r
+ short,\r
+ void *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_commit_transaction (ISC_STATUS *,\r
+ isc_tr_handle *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_commit_retaining (ISC_STATUS *,\r
+ isc_tr_handle *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_rollback_transaction (ISC_STATUS *,\r
+ isc_tr_handle *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_rollback_retaining (ISC_STATUS *,\r
+ isc_tr_handle *);\r
+\r
+///////////\r
+typedef ISC_STATUS ISC_EXPORT proto_dsql_allocate_statement (ISC_STATUS *,\r
+ isc_db_handle *,\r
+ isc_stmt_handle *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_dsql_describe (ISC_STATUS *,\r
+ isc_stmt_handle *,\r
+ unsigned short,\r
+ XSQLDA *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_dsql_describe_bind (ISC_STATUS *,\r
+ isc_stmt_handle *,\r
+ unsigned short,\r
+ XSQLDA *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_dsql_execute (ISC_STATUS *,\r
+ isc_tr_handle *,\r
+ isc_stmt_handle *,\r
+ unsigned short,\r
+ XSQLDA *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_dsql_execute2 (ISC_STATUS *,\r
+ isc_tr_handle *,\r
+ isc_stmt_handle *,\r
+ unsigned short,\r
+ XSQLDA *,\r
+ XSQLDA *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_dsql_fetch (ISC_STATUS *,\r
+ isc_stmt_handle *,\r
+ unsigned short,\r
+ XSQLDA *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_dsql_free_statement (ISC_STATUS *,\r
+ isc_stmt_handle *,\r
+ unsigned short);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_dsql_prepare (ISC_STATUS *,\r
+ isc_tr_handle *,\r
+ isc_stmt_handle *,\r
+ unsigned short,\r
+ char *,\r
+ unsigned short,\r
+ XSQLDA *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_dsql_set_cursor_name (ISC_STATUS *,\r
+ isc_stmt_handle *,\r
+ char *,\r
+ unsigned short);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_dsql_sql_info (ISC_STATUS *,\r
+ isc_stmt_handle *,\r
+ short,\r
+ char *,\r
+ short,\r
+ char *);\r
+\r
+typedef void ISC_EXPORT proto_decode_date (ISC_QUAD *,\r
+ void *);\r
+\r
+typedef void ISC_EXPORT proto_encode_date (void *,\r
+ ISC_QUAD *);\r
+\r
+typedef int ISC_EXPORT proto_add_user (ISC_STATUS *, USER_SEC_DATA *);\r
+typedef int ISC_EXPORT proto_delete_user (ISC_STATUS *, USER_SEC_DATA *);\r
+typedef int ISC_EXPORT proto_modify_user (ISC_STATUS *, USER_SEC_DATA *);\r
+\r
+//\r
+// Those API are only available in versions 6.x of the GDS32.DLL\r
+//\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_service_attach (ISC_STATUS *,\r
+ unsigned short,\r
+ char *,\r
+ isc_svc_handle *,\r
+ unsigned short,\r
+ char *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_service_detach (ISC_STATUS *,\r
+ isc_svc_handle *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_service_query (ISC_STATUS *,\r
+ isc_svc_handle *,\r
+ isc_resv_handle *,\r
+ unsigned short,\r
+ char *,\r
+ unsigned short,\r
+ char *,\r
+ unsigned short,\r
+ char *);\r
+\r
+typedef ISC_STATUS ISC_EXPORT proto_service_start (ISC_STATUS *,\r
+ isc_svc_handle *,\r
+ isc_resv_handle *,\r
+ unsigned short,\r
+ char*);\r
+\r
+typedef void ISC_EXPORT proto_decode_sql_date (ISC_DATE *,\r
+ void *);\r
+\r
+typedef void ISC_EXPORT proto_decode_sql_time (ISC_TIME *,\r
+ void *);\r
+\r
+typedef void ISC_EXPORT proto_decode_timestamp (ISC_TIMESTAMP *,\r
+ void *);\r
+\r
+typedef void ISC_EXPORT proto_encode_sql_date (void *,\r
+ ISC_DATE *);\r
+\r
+typedef void ISC_EXPORT proto_encode_sql_time (void *,\r
+ ISC_TIME *);\r
+\r
+typedef void ISC_EXPORT proto_encode_timestamp (void *,\r
+ ISC_TIMESTAMP *);\r
+\r
+//\r
+// Internal binding structure to the GDS32 DLL\r
+//\r
+\r
+struct GDS\r
+{\r
+ // Attributes\r
+ bool mReady;\r
+ int mGDSVersion; // Version of the GDS32.DLL (50 for 5.0, 60 for 6.0)\r
+\r
+#ifdef IBPP_WINDOWS\r
+ HMODULE mHandle; // The GDS32.DLL HMODULE\r
+ std::string mSearchPaths; // Optional additional search paths\r
+#endif\r
+\r
+ GDS* Call();\r
+\r
+ // GDS32 Entry Points\r
+ proto_create_database* m_create_database;\r
+ proto_attach_database* m_attach_database;\r
+ proto_detach_database* m_detach_database;\r
+ proto_drop_database* m_drop_database;\r
+ proto_database_info* m_database_info;\r
+ proto_dsql_execute_immediate* m_dsql_execute_immediate;\r
+ proto_open_blob2* m_open_blob2;\r
+ proto_create_blob2* m_create_blob2;\r
+ proto_close_blob* m_close_blob;\r
+ proto_cancel_blob* m_cancel_blob;\r
+ proto_get_segment* m_get_segment;\r
+ proto_put_segment* m_put_segment;\r
+ proto_blob_info* m_blob_info;\r
+ proto_array_lookup_bounds* m_array_lookup_bounds;\r
+ proto_array_get_slice* m_array_get_slice;\r
+ proto_array_put_slice* m_array_put_slice;\r
+\r
+ proto_vax_integer* m_vax_integer;\r
+ proto_sqlcode* m_sqlcode;\r
+ proto_sql_interprete* m_sql_interprete;\r
+ proto_interprete* m_interprete;\r
+ proto_que_events* m_que_events;\r
+ proto_cancel_events* m_cancel_events;\r
+ proto_start_multiple* m_start_multiple;\r
+ proto_commit_transaction* m_commit_transaction;\r
+ proto_commit_retaining* m_commit_retaining;\r
+ proto_rollback_transaction* m_rollback_transaction;\r
+ proto_rollback_retaining* m_rollback_retaining;\r
+ proto_dsql_allocate_statement* m_dsql_allocate_statement;\r
+ proto_dsql_describe* m_dsql_describe;\r
+ proto_dsql_describe_bind* m_dsql_describe_bind;\r
+ proto_dsql_prepare* m_dsql_prepare;\r
+ proto_dsql_execute* m_dsql_execute;\r
+ proto_dsql_execute2* m_dsql_execute2;\r
+ proto_dsql_fetch* m_dsql_fetch;\r
+ proto_dsql_free_statement* m_dsql_free_statement;\r
+ proto_dsql_set_cursor_name* m_dsql_set_cursor_name;\r
+ proto_dsql_sql_info* m_dsql_sql_info;\r
+ //proto_decode_date* m_decode_date;\r
+ //proto_encode_date* m_encode_date;\r
+ //proto_add_user* m_add_user;\r
+ //proto_delete_user* m_delete_user;\r
+ //proto_modify_user* m_modify_user;\r
+\r
+ proto_service_attach* m_service_attach;\r
+ proto_service_detach* m_service_detach;\r
+ proto_service_start* m_service_start;\r
+ proto_service_query* m_service_query;\r
+ //proto_decode_sql_date* m_decode_sql_date;\r
+ //proto_decode_sql_time* m_decode_sql_time;\r
+ //proto_decode_timestamp* m_decode_timestamp;\r
+ //proto_encode_sql_date* m_encode_sql_date;\r
+ //proto_encode_sql_time* m_encode_sql_time;\r
+ //proto_encode_timestamp* m_encode_timestamp;\r
+\r
+ // Constructor (No need for a specific destructor)\r
+ GDS()\r
+ {\r
+ mReady = false;\r
+ mGDSVersion = 0;\r
+#ifdef IBPP_WINDOWS\r
+ mHandle = 0;\r
+#endif\r
+ }\r
+};\r
+\r
+extern GDS gds;\r
+\r
+//\r
+// Service Parameter Block (used to define a service)\r
+//\r
+\r
+class SPB\r
+{\r
+ static const int BUFFERINCR;\r
+\r
+ char* mBuffer; // Dynamically allocated SPB structure\r
+ int mSize; // Its used size in bytes\r
+ int mAlloc; // Its allocated size in bytes\r
+\r
+ void Grow(int needed); // Alloc or grow the mBuffer\r
+\r
+public:\r
+ void Insert(char); // Insert a single byte code\r
+ void InsertString(char, int, const char*); // Insert a string, len can be defined as 1 or 2 bytes\r
+ void InsertByte(char type, char data);\r
+ void InsertQuad(char type, int32_t data);\r
+ void Reset(); // Clears the SPB\r
+ char* Self() { return mBuffer; }\r
+ short Size() { return (short)mSize; }\r
+\r
+ SPB() : mBuffer(0), mSize(0), mAlloc(0) { }\r
+ ~SPB() { Reset(); }\r
+};\r
+\r
+//\r
+// Database Parameter Block (used to define a database)\r
+//\r
+\r
+class DPB\r
+{\r
+ static const int BUFFERINCR;\r
+\r
+ char* mBuffer; // Dynamically allocated DPB structure\r
+ int mSize; // Its used size in bytes\r
+ int mAlloc; // Its allocated size in bytes\r
+\r
+ void Grow(int needed); // Allocate or grow the mBuffer, so that\r
+ // 'needed' bytes can be written (at least)\r
+\r
+public:\r
+ void Insert(char, const char*); // Insert a new char* 'cluster'\r
+ void Insert(char, int16_t); // Insert a new int16_t 'cluster'\r
+ void Insert(char, bool); // Insert a new bool 'cluster'\r
+ void Insert(char, char); // Insert a new byte 'cluster'\r
+ void Reset(); // Clears the DPB\r
+ char* Self() { return mBuffer; }\r
+ short Size() { return (short)mSize; }\r
+\r
+ DPB() : mBuffer(0), mSize(0), mAlloc(0) { }\r
+ ~DPB() { Reset(); }\r
+};\r
+\r
+//\r
+// Transaction Parameter Block (used to define a transaction)\r
+//\r
+\r
+class TPB\r
+{\r
+ static const int BUFFERINCR;\r
+\r
+ char* mBuffer; // Dynamically allocated TPB structure\r
+ int mSize; // Its used size in bytes\r
+ int mAlloc; // Its allocated size\r
+\r
+ void Grow(int needed); // Alloc or re-alloc the mBuffer\r
+\r
+public:\r
+ void Insert(char); // Insert a flag item\r
+ void Insert(const std::string& data); // Insert a string (typically table name)\r
+ void Reset(); // Clears the TPB\r
+ char* Self() { return mBuffer; }\r
+ int Size() { return mSize; }\r
+\r
+ TPB() : mBuffer(0), mSize(0), mAlloc(0) { }\r
+ ~TPB() { Reset(); }\r
+};\r
+\r
+//\r
+// Used to receive (and process) a results buffer in various API calls\r
+//\r
+\r
+class RB\r
+{\r
+ char* mBuffer;\r
+ int mSize;\r
+\r
+ char* FindToken(char token);\r
+ char* FindToken(char token, char subtoken);\r
+\r
+public:\r
+ void Reset();\r
+ int GetValue(char token);\r
+ int GetCountValue(char token);\r
+ int GetValue(char token, char subtoken);\r
+ bool GetBool(char token);\r
+ int GetString(char token, std::string& data);\r
+\r
+ char* Self() { return mBuffer; }\r
+ short Size() { return (short)mSize; }\r
+\r
+ RB();\r
+ RB(int Size);\r
+ ~RB();\r
+};\r
+\r
+//\r
+// Used to receive status info from API calls\r
+//\r
+\r
+class IBS\r
+{\r
+ mutable ISC_STATUS mVector[20];\r
+ mutable std::string mMessage;\r
+\r
+public:\r
+ ISC_STATUS* Self() { return mVector; }\r
+ bool Errors() { return (mVector[0] == 1 && mVector[1] > 0) ? true : false; }\r
+ const char* ErrorMessage() const;\r
+ int SqlCode() const;\r
+ int EngineCode() const { return (mVector[0] == 1) ? (int)mVector[1] : 0; }\r
+ void Reset();\r
+\r
+ IBS();\r
+ IBS(IBS&); // Copy Constructor\r
+ ~IBS();\r
+};\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Implementation of the "hidden" classes associated with their public\r
+// counterparts. Their private data and methods can freely change without\r
+// breaking the compatibility of the DLL. If they receive new public methods,\r
+// and those methods are reflected in the public class, then the compatibility\r
+// is broken.\r
+//\r
+///////////////////////////////////////////////////////////////////////////////\r
+\r
+//\r
+// Hidden implementation of Exception classes.\r
+//\r
+\r
+/*\r
+ std::exception\r
+ |\r
+ IBPP::Exception\r
+ / \\r
+ / \\r
+ IBPP::LogicException ExceptionBase IBPP::SQLException\r
+ | \ / | \ /\r
+ | LogicExceptionImpl | SQLExceptionImpl\r
+ | |\r
+ IBPP::WrongType |\r
+ \ |\r
+ IBPP::WrongTypeImpl\r
+*/\r
+\r
+class ExceptionBase\r
+{\r
+ // (((((((( OBJECT INTERNALS ))))))))\r
+\r
+protected:\r
+ std::string mContext; // Exception context ("IDatabase::Drop")\r
+ std::string mWhat; // Full formatted message\r
+\r
+ void buildErrorMessage(const char* message);\r
+ void raise(const std::string& context, const char* message, va_list argptr);\r
+\r
+public:\r
+ // The following constructors are small and could be inlined, but for object\r
+ // code compacity of the library it is much better to have them non-inlined.\r
+ // The amount of code generated by compilers for a throw is well-enough.\r
+\r
+ ExceptionBase() throw();\r
+ ExceptionBase(const ExceptionBase& copied) throw();\r
+ ExceptionBase& operator=(const ExceptionBase& copied) throw();\r
+ ExceptionBase(const std::string& context, const char* message = 0, ...) throw();\r
+\r
+ virtual ~ExceptionBase() throw();\r
+\r
+ // (((((((( OBJECT INTERFACE ))))))))\r
+\r
+ virtual const char* Origin() const throw();\r
+ virtual const char* ErrorMessage() const throw();\r
+ virtual const char* what() const throw();\r
+};\r
+\r
+class LogicExceptionImpl : public IBPP::LogicException, public ExceptionBase\r
+{\r
+ // (((((((( OBJECT INTERNALS ))))))))\r
+\r
+public:\r
+ // The following constructors are small and could be inlined, but for object\r
+ // code compacity of the library it is much better to have them non-inlined.\r
+ // The amount of code generated by compilers for a throw is well-enough.\r
+\r
+ LogicExceptionImpl() throw();\r
+ LogicExceptionImpl(const LogicExceptionImpl& copied) throw();\r
+ LogicExceptionImpl& operator=(const LogicExceptionImpl& copied) throw();\r
+ LogicExceptionImpl(const std::string& context, const char* message = 0, ...) throw();\r
+\r
+ virtual ~LogicExceptionImpl() throw ();\r
+\r
+ // (((((((( OBJECT INTERFACE ))))))))\r
+ //\r
+ // The object public interface is partly implemented by inheriting from\r
+ // the ExceptionBase class.\r
+\r
+public:\r
+ virtual const char* Origin() const throw();\r
+ virtual const char* ErrorMessage() const throw();\r
+ virtual const char* what() const throw();\r
+};\r
+\r
+class SQLExceptionImpl : public IBPP::SQLException, public ExceptionBase\r
+{\r
+ // (((((((( OBJECT INTERNALS ))))))))\r
+\r
+private:\r
+ int mSqlCode;\r
+ int mEngineCode;\r
+\r
+public:\r
+ // The following constructors are small and could be inlined, but for object\r
+ // code compacity of the library it is much better to have them non-inlined.\r
+ // The amount of code generated by compilers for a throw is well-enough.\r
+\r
+ SQLExceptionImpl() throw();\r
+ SQLExceptionImpl(const SQLExceptionImpl& copied) throw();\r
+ SQLExceptionImpl& operator=(const SQLExceptionImpl& copied) throw();\r
+ SQLExceptionImpl(const IBS& status, const std::string& context,\r
+ const char* message = 0, ...) throw();\r
+\r
+ virtual ~SQLExceptionImpl() throw ();\r
+\r
+ // (((((((( OBJECT INTERFACE ))))))))\r
+ //\r
+ // The object public interface is partly implemented by inheriting from\r
+ // the ExceptionBase class.\r
+\r
+public:\r
+ virtual const char* Origin() const throw();\r
+ virtual const char* ErrorMessage() const throw();\r
+ virtual const char* what() const throw();\r
+ virtual int SqlCode() const throw();\r
+ virtual int EngineCode() const throw();\r
+};\r
+\r
+class WrongTypeImpl : public IBPP::WrongType, public ExceptionBase\r
+{\r
+ // (((((((( OBJECT INTERNALS ))))))))\r
+\r
+public:\r
+ // The following constructors are small and could be inlined, but for object\r
+ // code compacity of the library it is much better to have them non-inlined.\r
+ // The amount of code generated by compilers for a throw is well-enough.\r
+\r
+ WrongTypeImpl() throw();\r
+ WrongTypeImpl(const WrongTypeImpl& copied) throw();\r
+ WrongTypeImpl& operator=(const WrongTypeImpl& copied) throw();\r
+ WrongTypeImpl(const std::string& context, int sqlType, IITYPE varType,\r
+ const char* message = 0, ...) throw();\r
+\r
+ virtual ~WrongTypeImpl() throw ();\r
+\r
+ // (((((((( OBJECT INTERFACE ))))))))\r
+ //\r
+ // The object public interface is partly implemented by inheriting from\r
+ // the ExceptionBase class.\r
+\r
+public:\r
+ virtual const char* Origin() const throw();\r
+ virtual const char* ErrorMessage() const throw();\r
+ virtual const char* what() const throw();\r
+};\r
+\r
+class ServiceImpl : public IBPP::IService\r
+{\r
+ // (((((((( OBJECT INTERNALS ))))))))\r
+\r
+private:\r
+ int mRefCount; // Reference counter\r
+ isc_svc_handle mHandle; // InterBase API Service Handle\r
+ std::string mServerName; // Nom du serveur\r
+ std::string mUserName; // Nom de l'utilisateur\r
+ std::string mUserPassword; // Mot de passe de l'utilisateur\r
+ std::string mWaitMessage; // Progress message returned by WaitMsg()\r
+\r
+ isc_svc_handle* GetHandlePtr() { return &mHandle; }\r
+ void SetServerName(const char*);\r
+ void SetUserName(const char*);\r
+ void SetUserPassword(const char*);\r
+\r
+public:\r
+ isc_svc_handle GetHandle() { return mHandle; }\r
+\r
+ ServiceImpl(const std::string& ServerName, const std::string& UserName,\r
+ const std::string& UserPassword);\r
+ ~ServiceImpl();\r
+\r
+ // (((((((( OBJECT INTERFACE ))))))))\r
+\r
+public:\r
+ void Connect();\r
+ bool Connected() { return mHandle == 0 ? false : true; }\r
+ void Disconnect();\r
+\r
+ void GetVersion(std::string& version);\r
+\r
+ void AddUser(const IBPP::User&);\r
+ void GetUser(IBPP::User&);\r
+ void GetUsers(std::vector<IBPP::User>&);\r
+ void ModifyUser(const IBPP::User&);\r
+ void RemoveUser(const std::string& username);\r
+\r
+ void SetPageBuffers(const std::string& dbfile, int buffers);\r
+ void SetSweepInterval(const std::string& dbfile, int sweep);\r
+ void SetSyncWrite(const std::string& dbfile, bool);\r
+ void SetReadOnly(const std::string& dbfile, bool);\r
+ void SetReserveSpace(const std::string& dbfile, bool);\r
+\r
+ void Shutdown(const std::string& dbfile, IBPP::DSM mode, int sectimeout);\r
+ void Restart(const std::string& dbfile);\r
+ void Sweep(const std::string& dbfile);\r
+ void Repair(const std::string& dbfile, IBPP::RPF flags);\r
+\r
+ void StartBackup(const std::string& dbfile, const std::string& bkfile,\r
+ IBPP::BRF flags = IBPP::BRF(0));\r
+ void StartRestore(const std::string& bkfile, const std::string& dbfile,\r
+ int pagesize, IBPP::BRF flags = IBPP::BRF(0));\r
+\r
+ const char* WaitMsg();\r
+ void Wait();\r
+\r
+ IBPP::IService* AddRef();\r
+ void Release();\r
+};\r
+\r
+class DatabaseImpl : public IBPP::IDatabase\r
+{\r
+ // (((((((( OBJECT INTERNALS ))))))))\r
+\r
+ int mRefCount; // Reference counter\r
+ isc_db_handle mHandle; // InterBase API Session Handle\r
+ std::string mServerName; // Server name\r
+ std::string mDatabaseName; // Database name (path/file)\r
+ std::string mUserName; // User name\r
+ std::string mUserPassword; // User password\r
+ std::string mRoleName; // Role used for the duration of the connection\r
+ std::string mCharSet; // Character Set used for the connection\r
+ std::string mCreateParams; // Other parameters (creation only)\r
+\r
+ int mDialect; // 1 if IB5, 1 or 3 if IB6/FB1\r
+ std::vector<TransactionImpl*> mTransactions;// Table of Transaction*\r
+ std::vector<StatementImpl*> mStatements;// Table of Statement*\r
+ std::vector<BlobImpl*> mBlobs; // Table of Blob*\r
+ std::vector<ArrayImpl*> mArrays; // Table of Array*\r
+ std::vector<EventsImpl*> mEvents; // Table of Events*\r
+\r
+public:\r
+ isc_db_handle* GetHandlePtr() { return &mHandle; }\r
+ isc_db_handle GetHandle() { return mHandle; }\r
+\r
+ void AttachTransactionImpl(TransactionImpl*);\r
+ void DetachTransactionImpl(TransactionImpl*);\r
+ void AttachStatementImpl(StatementImpl*);\r
+ void DetachStatementImpl(StatementImpl*);\r
+ void AttachBlobImpl(BlobImpl*);\r
+ void DetachBlobImpl(BlobImpl*);\r
+ void AttachArrayImpl(ArrayImpl*);\r
+ void DetachArrayImpl(ArrayImpl*);\r
+ void AttachEventsImpl(EventsImpl*);\r
+ void DetachEventsImpl(EventsImpl*);\r
+\r
+ DatabaseImpl(const std::string& ServerName, const std::string& DatabaseName,\r
+ const std::string& UserName, const std::string& UserPassword,\r
+ const std::string& RoleName, const std::string& CharSet,\r
+ const std::string& CreateParams);\r
+ ~DatabaseImpl();\r
+\r
+ // (((((((( OBJECT INTERFACE ))))))))\r
+\r
+public:\r
+ const char* ServerName() const { return mServerName.c_str(); }\r
+ const char* DatabaseName() const { return mDatabaseName.c_str(); }\r
+ const char* Username() const { return mUserName.c_str(); }\r
+ const char* UserPassword() const { return mUserPassword.c_str(); }\r
+ const char* RoleName() const { return mRoleName.c_str(); }\r
+ const char* CharSet() const { return mCharSet.c_str(); }\r
+ const char* CreateParams() const { return mCreateParams.c_str(); }\r
+\r
+ void Info(int* ODSMajor, int* ODSMinor,\r
+ int* PageSize, int* Pages, int* Buffers, int* Sweep,\r
+ bool* SyncWrites, bool* Reserve);\r
+ void Statistics(int* Fetches, int* Marks, int* Reads, int* Writes);\r
+ void Counts(int* Insert, int* Update, int* Delete,\r
+ int* ReadIdx, int* ReadSeq);\r
+ void Users(std::vector<std::string>& users);\r
+ int Dialect() { return mDialect; }\r
+\r
+ void Create(int dialect);\r
+ void Connect();\r
+ bool Connected() { return mHandle == 0 ? false : true; }\r
+ void Inactivate();\r
+ void Disconnect();\r
+ void Drop();\r
+\r
+ IBPP::IDatabase* AddRef();\r
+ void Release();\r
+};\r
+\r
+class TransactionImpl : public IBPP::ITransaction\r
+{\r
+ // (((((((( OBJECT INTERNALS ))))))))\r
+\r
+private:\r
+ int mRefCount; // Reference counter\r
+ isc_tr_handle mHandle; // Transaction InterBase\r
+\r
+ std::vector<DatabaseImpl*> mDatabases; // Tableau de IDatabase*\r
+ std::vector<StatementImpl*> mStatements; // Tableau de IStatement*\r
+ std::vector<BlobImpl*> mBlobs; // Tableau de IBlob*\r
+ std::vector<ArrayImpl*> mArrays; // Tableau de Array*\r
+ std::vector<TPB*> mTPBs; // Tableau de TPB\r
+\r
+ void Init(); // A usage exclusif des constructeurs\r
+\r
+public:\r
+ isc_tr_handle* GetHandlePtr() { return &mHandle; }\r
+ isc_tr_handle GetHandle() { return mHandle; }\r
+\r
+ void AttachStatementImpl(StatementImpl*);\r
+ void DetachStatementImpl(StatementImpl*);\r
+ void AttachBlobImpl(BlobImpl*);\r
+ void DetachBlobImpl(BlobImpl*);\r
+ void AttachArrayImpl(ArrayImpl*);\r
+ void DetachArrayImpl(ArrayImpl*);\r
+ void AttachDatabaseImpl(DatabaseImpl* dbi, IBPP::TAM am = IBPP::amWrite,\r
+ IBPP::TIL il = IBPP::ilConcurrency,\r
+ IBPP::TLR lr = IBPP::lrWait, IBPP::TFF flags = IBPP::TFF(0));\r
+ void DetachDatabaseImpl(DatabaseImpl* dbi);\r
+\r
+ TransactionImpl(DatabaseImpl* db, IBPP::TAM am = IBPP::amWrite,\r
+ IBPP::TIL il = IBPP::ilConcurrency,\r
+ IBPP::TLR lr = IBPP::lrWait, IBPP::TFF flags = IBPP::TFF(0));\r
+ ~TransactionImpl();\r
+\r
+ // (((((((( OBJECT INTERFACE ))))))))\r
+\r
+public:\r
+ void AttachDatabase(IBPP::Database db, IBPP::TAM am = IBPP::amWrite,\r
+ IBPP::TIL il = IBPP::ilConcurrency,\r
+ IBPP::TLR lr = IBPP::lrWait, IBPP::TFF flags = IBPP::TFF(0));\r
+ void DetachDatabase(IBPP::Database db);\r
+ void AddReservation(IBPP::Database db,\r
+ const std::string& table, IBPP::TTR tr);\r
+\r
+ void Start();\r
+ bool Started() { return mHandle == 0 ? false : true; }\r
+ void Commit();\r
+ void Rollback();\r
+ void CommitRetain();\r
+ void RollbackRetain();\r
+\r
+ IBPP::ITransaction* AddRef();\r
+ void Release();\r
+};\r
+\r
+class RowImpl : public IBPP::IRow\r
+{\r
+ // (((((((( OBJECT INTERNALS ))))))))\r
+\r
+private:\r
+ int mRefCount; // Reference counter\r
+\r
+ XSQLDA* mDescrArea; // XSQLDA descriptor itself\r
+ std::vector<double> mNumerics; // Temporary storage for Numerics\r
+ std::vector<float> mFloats; // Temporary storage for Floats\r
+ std::vector<int64_t> mInt64s; // Temporary storage for 64 bits\r
+ std::vector<int32_t> mInt32s; // Temporary storage for 32 bits\r
+ std::vector<int16_t> mInt16s; // Temporary storage for 16 bits\r
+ std::vector<char> mBools; // Temporary storage for Bools\r
+ std::vector<std::string> mStrings; // Temporary storage for Strings\r
+ std::vector<bool> mUpdated; // Which columns where updated (Set()) ?\r
+\r
+ int mDialect; // Related database dialect\r
+ DatabaseImpl* mDatabase; // Related Database (important for Blobs, ...)\r
+ TransactionImpl* mTransaction; // Related Transaction (same remark)\r
+\r
+ void SetValue(int, IITYPE, const void* value, int = 0);\r
+ void* GetValue(int, IITYPE, void* = 0);\r
+\r
+public:\r
+ void Free();\r
+ short AllocatedSize() { return mDescrArea->sqln; }\r
+ void Resize(int n);\r
+ void AllocVariables();\r
+ bool MissingValues(); // Returns wether one of the mMissing[] is true\r
+ XSQLDA* Self() { return mDescrArea; }\r
+\r
+ RowImpl& operator=(const RowImpl& copied);\r
+ RowImpl(const RowImpl& copied);\r
+ RowImpl(int dialect, int size, DatabaseImpl* db, TransactionImpl* tr);\r
+ ~RowImpl();\r
+\r
+ // (((((((( OBJECT INTERFACE ))))))))\r
+\r
+public:\r
+ void SetNull(int);\r
+ void Set(int, bool);\r
+ void Set(int, const char*); // c-strings\r
+ void Set(int, const void*, int); // byte buffers\r
+ void Set(int, const std::string&);\r
+ void Set(int, int16_t);\r
+ void Set(int, int32_t);\r
+ void Set(int, int64_t);\r
+ void Set(int, float);\r
+ void Set(int, double);\r
+ void Set(int, const IBPP::Timestamp&);\r
+ void Set(int, const IBPP::Date&);\r
+ void Set(int, const IBPP::Time&);\r
+ void Set(int, const IBPP::DBKey&);\r
+ void Set(int, const IBPP::Blob&);\r
+ void Set(int, const IBPP::Array&);\r
+\r
+ bool IsNull(int);\r
+ bool Get(int, bool&);\r
+ bool Get(int, char*); // c-strings, len unchecked\r
+ bool Get(int, void*, int&); // byte buffers\r
+ bool Get(int, std::string&);\r
+ bool Get(int, int16_t&);\r
+ bool Get(int, int32_t&);\r
+ bool Get(int, int64_t&);\r
+ bool Get(int, float&);\r
+ bool Get(int, double&);\r
+ bool Get(int, IBPP::Timestamp&);\r
+ bool Get(int, IBPP::Date&);\r
+ bool Get(int, IBPP::Time&);\r
+ bool Get(int, IBPP::DBKey&);\r
+ bool Get(int, IBPP::Blob&);\r
+ bool Get(int, IBPP::Array&);\r
+\r
+ bool IsNull(const std::string&);\r
+ bool Get(const std::string&, bool&);\r
+ bool Get(const std::string&, char*); // c-strings, len unchecked\r
+ bool Get(const std::string&, void*, int&); // byte buffers\r
+ bool Get(const std::string&, std::string&);\r
+ bool Get(const std::string&, int16_t&);\r
+ bool Get(const std::string&, int32_t&);\r
+ bool Get(const std::string&, int64_t&);\r
+ bool Get(const std::string&, float&);\r
+ bool Get(const std::string&, double&);\r
+ bool Get(const std::string&, IBPP::Timestamp&);\r
+ bool Get(const std::string&, IBPP::Date&);\r
+ bool Get(const std::string&, IBPP::Time&);\r
+ bool Get(const std::string&, IBPP::DBKey&);\r
+ bool Get(const std::string&, IBPP::Blob&);\r
+ bool Get(const std::string&, IBPP::Array&);\r
+\r
+ int ColumnNum(const std::string&);\r
+ const char* ColumnName(int);\r
+ const char* ColumnAlias(int);\r
+ const char* ColumnTable(int);\r
+ IBPP::SDT ColumnType(int);\r
+ int ColumnSubtype(int);\r
+ int ColumnSize(int);\r
+ int ColumnScale(int);\r
+ int Columns();\r
+\r
+ bool ColumnUpdated(int);\r
+ bool Updated();\r
+\r
+ IBPP::Database DatabasePtr() const;\r
+ IBPP::Transaction TransactionPtr() const;\r
+\r
+ IBPP::IRow* Clone();\r
+ IBPP::IRow* AddRef();\r
+ void Release();\r
+};\r
+\r
+class StatementImpl : public IBPP::IStatement\r
+{\r
+ // (((((((( OBJECT INTERNALS ))))))))\r
+\r
+private:\r
+ friend class TransactionImpl;\r
+\r
+ int mRefCount; // Reference counter\r
+ isc_stmt_handle mHandle; // Statement Handle\r
+\r
+ DatabaseImpl* mDatabase; // Attached database\r
+ TransactionImpl* mTransaction; // Attached transaction\r
+ RowImpl* mInRow;\r
+ //bool* mInMissing; // Quels paramètres n'ont pas été spécifiés\r
+ RowImpl* mOutRow;\r
+ bool mResultSetAvailable; // Executed and result set is available\r
+ bool mCursorOpened; // dsql_set_cursor_name was called\r
+ IBPP::STT mType; // Type de requète\r
+ std::string mSql; // Last SQL statement prepared or executed\r
+\r
+ // Internal Methods\r
+ void CursorFree();\r
+\r
+public:\r
+ // Properties and Attributes Access Methods\r
+ isc_stmt_handle GetHandle() { return mHandle; }\r
+\r
+ void AttachDatabaseImpl(DatabaseImpl*);\r
+ void DetachDatabaseImpl();\r
+ void AttachTransactionImpl(TransactionImpl*);\r
+ void DetachTransactionImpl();\r
+\r
+ StatementImpl(DatabaseImpl*, TransactionImpl*, const std::string&);\r
+ ~StatementImpl();\r
+\r
+ // (((((((( OBJECT INTERFACE ))))))))\r
+\r
+public:\r
+ void Prepare(const std::string& sql);\r
+ void Execute(const std::string& sql);\r
+ inline void Execute() { Execute(std::string()); }\r
+ void ExecuteImmediate(const std::string&);\r
+ void CursorExecute(const std::string& cursor, const std::string& sql);\r
+ inline void CursorExecute(const std::string& cursor) { CursorExecute(cursor, std::string()); }\r
+ bool Fetch();\r
+ bool Fetch(IBPP::Row&);\r
+ int AffectedRows();\r
+ void Close(); // Free resources, attachments maintained\r
+ std::string& Sql() { return mSql; }\r
+ IBPP::STT Type() { return mType; }\r
+\r
+ void SetNull(int);\r
+ void Set(int, bool);\r
+ void Set(int, const char*); // c-strings\r
+ void Set(int, const void*, int); // byte buffers\r
+ void Set(int, const std::string&);\r
+ void Set(int, int16_t);\r
+ void Set(int, int32_t);\r
+ void Set(int, int64_t);\r
+ void Set(int, float);\r
+ void Set(int, double);\r
+ void Set(int, const IBPP::Timestamp&);\r
+ void Set(int, const IBPP::Date&);\r
+ void Set(int, const IBPP::Time&);\r
+ void Set(int, const IBPP::DBKey&);\r
+ void Set(int, const IBPP::Blob&);\r
+ void Set(int, const IBPP::Array&);\r
+\r
+ bool IsNull(int);\r
+ bool Get(int, bool*);\r
+ bool Get(int, bool&);\r
+ bool Get(int, char*); // c-strings, len unchecked\r
+ bool Get(int, void*, int&); // byte buffers\r
+ bool Get(int, std::string&);\r
+ bool Get(int, int16_t*);\r
+ bool Get(int, int16_t&);\r
+ bool Get(int, int32_t*);\r
+ bool Get(int, int32_t&);\r
+ bool Get(int, int64_t*);\r
+ bool Get(int, int64_t&);\r
+ bool Get(int, float*);\r
+ bool Get(int, float&);\r
+ bool Get(int, double*);\r
+ bool Get(int, double&);\r
+ bool Get(int, IBPP::Timestamp&);\r
+ bool Get(int, IBPP::Date&);\r
+ bool Get(int, IBPP::Time&);\r
+ bool Get(int, IBPP::DBKey&);\r
+ bool Get(int, IBPP::Blob&);\r
+ bool Get(int, IBPP::Array&);\r
+\r
+ bool IsNull(const std::string&);\r
+ bool Get(const std::string&, bool*);\r
+ bool Get(const std::string&, bool&);\r
+ bool Get(const std::string&, char*); // c-strings, len unchecked\r
+ bool Get(const std::string&, void*, int&); // byte buffers\r
+ bool Get(const std::string&, std::string&);\r
+ bool Get(const std::string&, int16_t*);\r
+ bool Get(const std::string&, int16_t&);\r
+ bool Get(const std::string&, int32_t*);\r
+ bool Get(const std::string&, int32_t&);\r
+ bool Get(const std::string&, int64_t*);\r
+ bool Get(const std::string&, int64_t&);\r
+ bool Get(const std::string&, float*);\r
+ bool Get(const std::string&, float&);\r
+ bool Get(const std::string&, double*);\r
+ bool Get(const std::string&, double&);\r
+ bool Get(const std::string&, IBPP::Timestamp&);\r
+ bool Get(const std::string&, IBPP::Date&);\r
+ bool Get(const std::string&, IBPP::Time&);\r
+ bool Get(const std::string&, IBPP::DBKey&);\r
+ bool Get(const std::string&, IBPP::Blob&);\r
+ bool Get(const std::string&, IBPP::Array&);\r
+\r
+ int ColumnNum(const std::string&);\r
+ int ColumnNumAlias(const std::string&);\r
+ const char* ColumnName(int);\r
+ const char* ColumnAlias(int);\r
+ const char* ColumnTable(int);\r
+ IBPP::SDT ColumnType(int);\r
+ int ColumnSubtype(int);\r
+ int ColumnSize(int);\r
+ int ColumnScale(int);\r
+ int Columns();\r
+\r
+ IBPP::SDT ParameterType(int);\r
+ int ParameterSubtype(int);\r
+ int ParameterSize(int);\r
+ int ParameterScale(int);\r
+ int Parameters();\r
+\r
+ void Plan(std::string&);\r
+\r
+ IBPP::Database DatabasePtr() const;\r
+ IBPP::Transaction TransactionPtr() const;\r
+\r
+ IBPP::IStatement* AddRef();\r
+ void Release();\r
+};\r
+\r
+class BlobImpl : public IBPP::IBlob\r
+{\r
+ // (((((((( OBJECT INTERNALS ))))))))\r
+\r
+private:\r
+ friend class RowImpl;\r
+\r
+ int mRefCount;\r
+ bool mIdAssigned;\r
+ ISC_QUAD mId;\r
+ isc_blob_handle mHandle;\r
+ bool mWriteMode;\r
+ DatabaseImpl* mDatabase; // Belongs to this database\r
+ TransactionImpl* mTransaction; // Belongs to this transaction\r
+\r
+ void Init();\r
+ void SetId(ISC_QUAD*);\r
+ void GetId(ISC_QUAD*);\r
+\r
+public:\r
+ void AttachDatabaseImpl(DatabaseImpl*);\r
+ void DetachDatabaseImpl();\r
+ void AttachTransactionImpl(TransactionImpl*);\r
+ void DetachTransactionImpl();\r
+\r
+ BlobImpl(const BlobImpl&);\r
+ BlobImpl(DatabaseImpl*, TransactionImpl* = 0);\r
+ ~BlobImpl();\r
+\r
+ // (((((((( OBJECT INTERFACE ))))))))\r
+\r
+public:\r
+ void Create();\r
+ void Open();\r
+ void Close();\r
+ void Cancel();\r
+ int Read(void*, int size);\r
+ void Write(const void*, int size);\r
+ void Info(int* Size, int* Largest, int* Segments);\r
+\r
+ void Save(const std::string& data);\r
+ void Load(std::string& data);\r
+\r
+ IBPP::Database DatabasePtr() const;\r
+ IBPP::Transaction TransactionPtr() const;\r
+\r
+ IBPP::IBlob* AddRef();\r
+ void Release();\r
+};\r
+\r
+class ArrayImpl : public IBPP::IArray\r
+{\r
+ // (((((((( OBJECT INTERNALS ))))))))\r
+\r
+private:\r
+ friend class RowImpl;\r
+\r
+ int mRefCount; // Reference counter\r
+ bool mIdAssigned;\r
+ ISC_QUAD mId;\r
+ bool mDescribed;\r
+ ISC_ARRAY_DESC mDesc;\r
+ DatabaseImpl* mDatabase; // Database attachée\r
+ TransactionImpl* mTransaction; // Transaction attachée\r
+ void* mBuffer; // Buffer for native data\r
+ int mBufferSize; // Size of this buffer in bytes\r
+ int mElemCount; // Count of elements in this array\r
+ int mElemSize; // Size of an element in the buffer\r
+\r
+ void Init();\r
+ void SetId(ISC_QUAD*);\r
+ void GetId(ISC_QUAD*);\r
+ void ResetId();\r
+ void AllocArrayBuffer();\r
+\r
+public:\r
+ void AttachDatabaseImpl(DatabaseImpl*);\r
+ void DetachDatabaseImpl();\r
+ void AttachTransactionImpl(TransactionImpl*);\r
+ void DetachTransactionImpl();\r
+\r
+ ArrayImpl(const ArrayImpl&);\r
+ ArrayImpl(DatabaseImpl*, TransactionImpl* = 0);\r
+ ~ArrayImpl();\r
+\r
+ // (((((((( OBJECT INTERFACE ))))))))\r
+\r
+public:\r
+ void Describe(const std::string& table, const std::string& column);\r
+ void ReadTo(IBPP::ADT, void*, int);\r
+ void WriteFrom(IBPP::ADT, const void*, int);\r
+ IBPP::SDT ElementType();\r
+ int ElementSize();\r
+ int ElementScale();\r
+ int Dimensions();\r
+ void Bounds(int dim, int* low, int* high);\r
+ void SetBounds(int dim, int low, int high);\r
+\r
+ IBPP::Database DatabasePtr() const;\r
+ IBPP::Transaction TransactionPtr() const;\r
+\r
+ IBPP::IArray* AddRef();\r
+ void Release();\r
+};\r
+\r
+//\r
+// EventBufferIterator: used in EventsImpl implementation.\r
+//\r
+\r
+template<class It>\r
+struct EventBufferIterator\r
+{\r
+ It mIt;\r
+\r
+public:\r
+ EventBufferIterator& operator++()\r
+ { mIt += 1 + static_cast<int>(*mIt) + 4; return *this; }\r
+\r
+ bool operator == (const EventBufferIterator& i) const { return i.mIt == mIt; }\r
+ bool operator != (const EventBufferIterator& i) const { return i.mIt != mIt; }\r
+\r
+#ifdef __BCPLUSPLUS__\r
+#pragma warn -8027\r
+#endif\r
+ std::string get_name() const\r
+ {\r
+ return std::string(mIt + 1, mIt + 1 + static_cast<int32_t>(*mIt));\r
+ }\r
+#ifdef __BCPLUSPLUS__\r
+#pragma warn .8027\r
+#endif\r
+\r
+ uint32_t get_count() const\r
+ {\r
+ return (*gds.Call()->m_vax_integer)\r
+ (const_cast<char*>(&*(mIt + 1 + static_cast<int>(*mIt))), 4);\r
+ }\r
+\r
+ // Those container like begin() and end() allow access to the underlying type\r
+ It begin() { return mIt; }\r
+ It end() { return mIt + 1 + static_cast<int>(*mIt) + 4; }\r
+\r
+ EventBufferIterator() {}\r
+ EventBufferIterator(It it) : mIt(it) {}\r
+};\r
+\r
+class EventsImpl : public IBPP::IEvents\r
+{\r
+ static const size_t MAXEVENTNAMELEN;\r
+ static void EventHandler(const char*, short, const char*);\r
+\r
+ typedef std::vector<IBPP::EventInterface*> ObjRefs;\r
+ ObjRefs mObjectReferences;\r
+\r
+ typedef std::vector<char> Buffer;\r
+ Buffer mEventBuffer;\r
+ Buffer mResultsBuffer;\r
+\r
+ int mRefCount; // Reference counter\r
+\r
+ DatabaseImpl* mDatabase;\r
+ ISC_LONG mId; // Firebird internal Id of these events\r
+ bool mQueued; // Has isc_que_events() been called?\r
+ bool mTrapped; // EventHandled() was called since last que_events()\r
+\r
+ void FireActions();\r
+ void Queue();\r
+ void Cancel();\r
+\r
+ EventsImpl& operator=(const EventsImpl&);\r
+ EventsImpl(const EventsImpl&);\r
+\r
+public:\r
+ void AttachDatabaseImpl(DatabaseImpl*);\r
+ void DetachDatabaseImpl();\r
+ \r
+ EventsImpl(DatabaseImpl* dbi);\r
+ ~EventsImpl();\r
+ \r
+ // (((((((( OBJECT INTERFACE ))))))))\r
+\r
+public:\r
+ void Add(const std::string&, IBPP::EventInterface*);\r
+ void Drop(const std::string&);\r
+ void List(std::vector<std::string>&);\r
+ void Clear(); // Drop all events\r
+ void Dispatch(); // Dispatch NON async events\r
+\r
+ IBPP::Database DatabasePtr() const;\r
+\r
+ IBPP::IEvents* AddRef();\r
+ void Release();\r
+};\r
+\r
+void encodeDate(ISC_DATE& isc_dt, const IBPP::Date& dt);\r
+void decodeDate(IBPP::Date& dt, const ISC_DATE& isc_dt);\r
+\r
+void encodeTime(ISC_TIME& isc_tm, const IBPP::Time& tm);\r
+void decodeTime(IBPP::Time& tm, const ISC_TIME& isc_tm);\r
+\r
+void encodeTimestamp(ISC_TIMESTAMP& isc_ts, const IBPP::Timestamp& ts);\r
+void decodeTimestamp(IBPP::Timestamp& ts, const ISC_TIMESTAMP& isc_ts);\r
+\r
+struct consts // See _ibpp.cpp for initializations of these constants\r
+{\r
+ static const double dscales[19];\r
+ static const int Dec31_1899;\r
+ static const int16_t min16;\r
+ static const int16_t max16;\r
+ static const int32_t min32;\r
+ static const int32_t max32;\r
+};\r
+\r
+} // namespace ibpp_internal\r
+\r
+#endif // __INTERNAL_IBPP_H__\r
+\r
+//\r
+// Eof\r
+//\r