From: <ale...@us...> - 2011-05-19 16:24:55
|
Revision: 52968 http://firebird.svn.sourceforge.net/firebird/?rev=52968&view=rev Author: alexpeshkoff Date: 2011-05-19 16:24:46 +0000 (Thu, 19 May 2011) Log Message: ----------- Better interfaces hierarchy: all of them are derived from IVersioned Modified Paths: -------------- firebird/trunk/examples/udr/UdrCppExample.cpp firebird/trunk/src/auth/AuthInterface.h firebird/trunk/src/auth/SecurityDatabase/LegacyServer.cpp firebird/trunk/src/common/Auth.cpp firebird/trunk/src/common/Auth.h firebird/trunk/src/common/StatementMetadata.h firebird/trunk/src/common/StatusHolder.h firebird/trunk/src/common/classes/GetPlugins.h firebird/trunk/src/common/classes/ImplementHelper.h firebird/trunk/src/common/config/config.h firebird/trunk/src/common/security.h firebird/trunk/src/gpre/boot/gpre_meta_boot.cpp firebird/trunk/src/include/FirebirdExternalApi.h firebird/trunk/src/include/FirebirdPluginApi.h firebird/trunk/src/include/Interface.h firebird/trunk/src/include/ProviderInterface.h firebird/trunk/src/include/Timer.h firebird/trunk/src/jrd/EngineInterface.h firebird/trunk/src/jrd/ExtEngineManager.h firebird/trunk/src/jrd/UserManagement.cpp firebird/trunk/src/jrd/UserManagement.h firebird/trunk/src/jrd/dyn.epp firebird/trunk/src/jrd/jrd.cpp firebird/trunk/src/jrd/ntrace.h firebird/trunk/src/jrd/trace/TraceConfigStorage.h firebird/trunk/src/jrd/trace/TraceObjects.cpp firebird/trunk/src/jrd/trace/TraceObjects.h firebird/trunk/src/remote/client/interface.cpp firebird/trunk/src/utilities/gsec/gsec.cpp firebird/trunk/src/utilities/ntrace/PluginLogWriter.h firebird/trunk/src/utilities/ntrace/TracePluginImpl.h firebird/trunk/src/yvalve/DistributedTransaction.cpp firebird/trunk/src/yvalve/MasterImplementation.cpp firebird/trunk/src/yvalve/MasterImplementation.h firebird/trunk/src/yvalve/PluginManager.cpp firebird/trunk/src/yvalve/PluginManager.h firebird/trunk/src/yvalve/why.cpp Modified: firebird/trunk/examples/udr/UdrCppExample.cpp =================================================================== --- firebird/trunk/examples/udr/UdrCppExample.cpp 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/examples/udr/UdrCppExample.cpp 2011-05-19 16:24:46 UTC (rev 52968) @@ -350,7 +350,7 @@ "select data_source from replicate_config where name = ?", SQL_DIALECT_CURRENT, NULL), statusVector); - AutoDispose<IMaster> master(funcGetMasterInterface()); + IMaster* master(funcGetMasterInterface()); AutoDispose<IStatus> status(master->getStatus()); const char* table = metadata->getTriggerTable(status); Modified: firebird/trunk/src/auth/AuthInterface.h =================================================================== --- firebird/trunk/src/auth/AuthInterface.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/auth/AuthInterface.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -39,20 +39,22 @@ enum Result {AUTH_SUCCESS, AUTH_CONTINUE, AUTH_FAILED, AUTH_MORE_DATA}; -class IWriter : public Firebird::IDisposable +class IWriter : public Firebird::IVersioned { public: virtual void FB_CARG reset() = 0; virtual void FB_CARG add(const char* user, const char* method, const char* details) = 0; }; +#define FB_AUTH_WRITER_VERSION (FB_VERSIONED_VERSION + 2) -class IDpbReader : public Firebird::IDisposable +class IDpbReader : public Firebird::IVersioned { public: virtual int FB_CARG find(UCHAR tag) = 0; virtual void FB_CARG add(UCHAR tag, const void* bytes, unsigned int count) = 0; virtual void FB_CARG drop() = 0; }; +#define FB_AUTH_DPB_READER_VERSION (FB_VERSIONED_VERSION + 3) class IServer : public Firebird::IPluginBase { @@ -75,13 +77,14 @@ }; #define FB_AUTH_CLIENT_VERSION (FB_PLUGIN_VERSION + 3) -class IUserField : public Firebird::IDisposable +class IUserField : public Firebird::IVersioned { public: virtual int FB_CARG entered() = 0; virtual int FB_CARG specified() = 0; virtual void FB_CARG setEntered(int newValue) = 0; }; +#define FB_AUTH_FIELD_VERSION (FB_VERSIONED_VERSION + 3) class ICharUserField : public IUserField { @@ -89,6 +92,7 @@ virtual const char* FB_CARG get() = 0; virtual void FB_CARG set(const char* newValue) = 0; }; +#define FB_AUTH_CHAR_FIELD_VERSION (FB_AUTH_FIELD_VERSION + 2) class IIntUserField : public IUserField { @@ -96,8 +100,9 @@ virtual int FB_CARG get() = 0; virtual void FB_CARG set(int newValue) = 0; }; +#define FB_AUTH_INT_FIELD_VERSION (FB_AUTH_FIELD_VERSION + 2) -class IUser : public Firebird::IDisposable +class IUser : public Firebird::IVersioned { public: virtual int FB_CARG operation() = 0; @@ -116,14 +121,16 @@ virtual void FB_CARG clear() = 0; }; +#define FB_AUTH_USER_VERSION (FB_VERSIONED_VERSION + 11) -class IListUsers : public Firebird::IDisposable +class IListUsers : public Firebird::IVersioned { public: virtual void FB_CARG list(IUser* user) = 0; }; +#define FB_AUTH_LIST_USERS_VERSION (FB_VERSIONED_VERSION + 1) -class ILogonInfo : public Firebird::IDisposable +class ILogonInfo : public Firebird::IVersioned { public: virtual const char* FB_CARG name() = 0; @@ -132,6 +139,7 @@ virtual const char* FB_CARG networkProtocol() = 0; virtual const char* FB_CARG remoteAddress() = 0; }; +#define FB_AUTH_LOGON_INFO_VERSION (FB_VERSIONED_VERSION + 5) class IManagement : public Firebird::IPluginBase { Modified: firebird/trunk/src/auth/SecurityDatabase/LegacyServer.cpp =================================================================== --- firebird/trunk/src/auth/SecurityDatabase/LegacyServer.cpp 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/auth/SecurityDatabase/LegacyServer.cpp 2011-05-19 16:24:46 UTC (rev 52968) @@ -122,7 +122,7 @@ namespace Auth { -class SecurityDatabase : public Firebird::StdIface<Firebird::ITimer, FB_I_TIMER_VERSION> +class SecurityDatabase : public Firebird::RefCntIface<Firebird::ITimer, FB_TIMER_VERSION> { public: Result verify(IWriter* authBlock, Firebird::ClumpletReader& originalDpb); Modified: firebird/trunk/src/common/Auth.cpp =================================================================== --- firebird/trunk/src/common/Auth.cpp 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/common/Auth.cpp 2011-05-19 16:24:46 UTC (rev 52968) @@ -33,7 +33,8 @@ namespace Auth { WriterImplementation::WriterImplementation(bool svcFlag) - : body(getPool()), sequence(0), tag(svcFlag ? isc_spb_auth_block : isc_dpb_auth_block) + : body(*getDefaultMemoryPool()), + sequence(0), tag(svcFlag ? isc_spb_auth_block : isc_dpb_auth_block) { } void WriterImplementation::store(Firebird::ClumpletWriter& to) Modified: firebird/trunk/src/common/Auth.h =================================================================== --- firebird/trunk/src/common/Auth.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/common/Auth.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -41,7 +41,7 @@ bool legacy(const char* nm); -class WriterImplementation : public Firebird::StackIface<IWriter> +class WriterImplementation : public Firebird::AutoIface<IWriter, FB_AUTH_WRITER_VERSION> { public: WriterImplementation(bool svcFlag); @@ -58,7 +58,7 @@ unsigned char tag; }; -class DpbImplementation : public Firebird::StackIface<IDpbReader> +class DpbImplementation : public Firebird::AutoIface<IDpbReader, FB_AUTH_DPB_READER_VERSION> { public: DpbImplementation(Firebird::ClumpletWriter& base); Modified: firebird/trunk/src/common/StatementMetadata.h =================================================================== --- firebird/trunk/src/common/StatementMetadata.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/common/StatementMetadata.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -30,6 +30,7 @@ #include "../common/classes/array.h" #include "../common/classes/fb_string.h" #include "../common/classes/objects_array.h" +#include "../common/classes/ImplementHelper.h" namespace Firebird { @@ -38,7 +39,8 @@ class StatementMetadata : public PermanentStorage { public: - class Parameters : public IParametersMetadata, public PermanentStorage + class Parameters : public VersionedIface<IParametersMetadata, FB_PARAMETERS_METADATA_VERSION>, + public PermanentStorage { public: struct Item : public PermanentStorage Modified: firebird/trunk/src/common/StatusHolder.h =================================================================== --- firebird/trunk/src/common/StatusHolder.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/common/StatusHolder.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -80,8 +80,11 @@ ISC_STATUS vector[40]; // FixMe - may be a kind of dynamic storage will be better? }; -class LocalStatus : public StackIface<BaseStatus> +class LocalStatus : public AutoIface<BaseStatus, FB_STATUS_VERSION> { +public: + virtual void FB_CARG dispose() + { } }; class StatusHolder Modified: firebird/trunk/src/common/classes/GetPlugins.h =================================================================== --- firebird/trunk/src/common/classes/GetPlugins.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/common/classes/GetPlugins.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -1,7 +1,7 @@ /* * PROGRAM: Firebird interface. * MODULE: ImplementHelper.h - * DESCRIPTION: Tools to help write plugins. + * DESCRIPTION: Tools to help access plugins. * * The contents of this file are subject to the Initial * Developer's Public License Version 1.0 (the "License"); @@ -50,7 +50,7 @@ { public: GetPlugins(unsigned int interfaceType, unsigned int desiredVersion, const char* namesList = NULL) - : masterInterface(fb_get_master_interface()), pluginInterface(masterInterface->getPluginManager()), missing(), + : masterInterface(), pluginInterface(masterInterface), missing(), pluginSet(pluginInterface->getPlugins(interfaceType, namesList ? namesList : Config::getPlugins(interfaceType), desiredVersion, &missing, NULL)), currentPlugin(NULL) @@ -61,7 +61,7 @@ GetPlugins(unsigned int interfaceType, unsigned int desiredVersion, Config* knownConfig, const char* namesList = NULL) - : masterInterface(fb_get_master_interface()), pluginInterface(masterInterface->getPluginManager()), missing(), + : masterInterface(), pluginInterface(masterInterface), missing(), pluginSet(pluginInterface->getPlugins(interfaceType, namesList ? namesList : Config::getPlugins(interfaceType), desiredVersion, &missing, new FirebirdConf(knownConfig))), currentPlugin(NULL) @@ -122,8 +122,8 @@ } private: - AutoPtr<IMaster, AutoDisposable> masterInterface; - AutoPtr<IPluginManager, AutoDisposable> pluginInterface; + MasterInterfacePtr masterInterface; + PluginManagerInterfacePtr pluginInterface; M missing; RefPtr<IPluginSet> pluginSet; P* currentPlugin; Modified: firebird/trunk/src/common/classes/ImplementHelper.h =================================================================== --- firebird/trunk/src/common/classes/ImplementHelper.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/common/classes/ImplementHelper.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -1,7 +1,7 @@ /* * PROGRAM: Firebird interface. * MODULE: ImplementHelper.h - * DESCRIPTION: Tools to help write plugins. + * DESCRIPTION: Tools to help create interfaces. * * The contents of this file are subject to the Initial * Developer's Public License Version 1.0 (the "License"); @@ -59,25 +59,30 @@ // Implement standard interface and plugin functions -// Helps to implement disposable interfaces -template <class C, typename S = GlobalStorage> -class DisposeIface : public C, public S +// Helps to implement generic versioned interfaces +template <class C, int V> +class VersionedIface : public C { public: - DisposeIface() { } + VersionedIface() { } + int FB_CARG getVersion() + { + return V; + } + private: - DisposeIface(const DisposeIface&); - DisposeIface& operator=(const DisposeIface&); + VersionedIface(const VersionedIface&); + VersionedIface& operator=(const VersionedIface&); }; -// Helps to implement disposable interfaces on stack or static -template <class C, typename S = GlobalStorage> -class StackIface : public DisposeIface<C, S> + +// Helps to implement versioned interfaces on stack or static +template <class C, int V> +class AutoIface : public VersionedIface<C, V> { public: - void FB_CARG dispose() - { } + AutoIface() { } void* operator new(size_t, void* memory) throw() { @@ -85,20 +90,23 @@ } }; +// Helps to implement disposable interfaces +template <class C, int V> +class DisposeIface : public VersionedIface<C, V>, public GlobalStorage +{ +public: + DisposeIface() { } +}; + // Helps to implement standard interfaces -template <class C, int V, typename S = GlobalStorage> -class StdIface : public C, public S +template <class C, int V> +class RefCntIface : public VersionedIface<C, V>, public GlobalStorage { public: - StdIface() : refCounter(0) { } + RefCntIface() : refCounter(0) { } - int FB_CARG getVersion() - { - return V; - } - #ifdef DEV_BUILD - ~StdIface() + ~RefCntIface() { fb_assert(refCounter.value() == 0); } @@ -111,30 +119,26 @@ protected: AtomicCounter refCounter; - -private: - StdIface(const StdIface&); - StdIface& operator=(const StdIface&); }; // Helps to implement plugins -template <class C, int V, typename S = GlobalStorage> -class StdPlugin : public StdIface<C, V, S> +template <class C, int V> +class StdPlugin : public RefCntIface<C, V> { private: - IInterface* owner; + IRefCounted* owner; public: StdPlugin() : owner(NULL) { } - IInterface* FB_CARG getOwner() + IRefCounted* FB_CARG getOwner() { return owner; } - void FB_CARG setOwner(IInterface* iface) + void FB_CARG setOwner(IRefCounted* iface) { owner = iface; } @@ -143,7 +147,7 @@ // Trivial factory template <class P> -class SimpleFactoryBase : public StackIface<IPluginFactory> +class SimpleFactoryBase : public AutoIface<IPluginFactory, FB_PLUGIN_FACTORY_VERSION> { public: IPluginBase* FB_CARG createPlugin(IPluginConfig* factoryParameter) @@ -160,40 +164,68 @@ }; +// Base for interface type indpendent accessors +template <typename C> +class AccessAutoInterface +{ +public: + AccessAutoInterface(C* aPtr) + : ptr(aPtr) + { } + + operator C*() + { + return ptr; + } + + C* operator->() + { + return ptr; + } + +private: + C* ptr; +}; + // Master interface access -class MasterInterfacePtr : public AutoPtr<IMaster, AutoDisposable> +class MasterInterfacePtr : public AccessAutoInterface<IMaster> { public: - MasterInterfacePtr() : AutoPtr<IMaster, AutoDisposable>(fb_get_master_interface()) + MasterInterfacePtr() + : AccessAutoInterface<IMaster>(fb_get_master_interface()) { } }; // Generic plugins interface access -class PluginManagerInterfacePtr : public AutoPtr<IPluginManager, AutoDisposable> +class PluginManagerInterfacePtr : public AccessAutoInterface<IPluginManager> { public: - PluginManagerInterfacePtr() : AutoPtr<IPluginManager, AutoDisposable>(fb_get_master_interface()->getPluginManager()) + PluginManagerInterfacePtr() + : AccessAutoInterface<IPluginManager>(MasterInterfacePtr()->getPluginManager()) { } - PluginManagerInterfacePtr(IMaster* master) : AutoPtr<IPluginManager, AutoDisposable>(master->getPluginManager()) + PluginManagerInterfacePtr(IMaster* master) + : AccessAutoInterface<IPluginManager>(master->getPluginManager()) { } }; // Control timer interface access -class TimerInterfacePtr : public AutoPtr<ITimerControl, AutoDisposable> +class TimerInterfacePtr : public AccessAutoInterface<ITimerControl> { public: - TimerInterfacePtr() : AutoPtr<ITimerControl, AutoDisposable>(fb_get_master_interface()->getTimerControl()) + TimerInterfacePtr() + : AccessAutoInterface<ITimerControl>(fb_get_master_interface()->getTimerControl()) { } }; // Distributed transactions coordinator access -class DtcInterfacePtr : public AutoPtr<IDtc, AutoDisposable> +class DtcInterfacePtr : public AccessAutoInterface<IDtc> { public: - DtcInterfacePtr() : AutoPtr<IDtc, AutoDisposable>(fb_get_master_interface()->getDtc()) + DtcInterfacePtr() + : AccessAutoInterface<IDtc>(fb_get_master_interface()->getDtc()) { } }; @@ -203,12 +235,8 @@ // when yvalve is starting fb_shutdown(). This causes almost unavoidable segfault. // To avoid it this class is added - it detects spontaneous (not by PluginManager) // module unload and notifies PluginManager about this said fact. -class DummyStorage +class UnloadDetectorHelper : public VersionedIface<IPluginModule, FB_PLUGIN_MODULE_VERSION> { -}; - -class UnloadDetectorHelper : public DisposeIface<IPluginModule, DummyStorage> -{ public: explicit UnloadDetectorHelper(MemoryPool&) : flagOsUnload(true) @@ -230,11 +258,6 @@ return !flagOsUnload; } - void FB_CARG dispose() - { - // delete this; -don't do that! - } - private: bool flagOsUnload; Modified: firebird/trunk/src/common/config/config.h =================================================================== --- firebird/trunk/src/common/config/config.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/common/config/config.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -351,7 +351,7 @@ }; // Implementation of interface to access master configuration file -class FirebirdConf : public Firebird::StdIface<Firebird::IFirebirdConf, FB_I_FIREBIRD_CONF_VERSION> +class FirebirdConf : public Firebird::RefCntIface<Firebird::IFirebirdConf, FB_FIREBIRD_CONF_VERSION> { public: FirebirdConf(Config* existingConfig) Modified: firebird/trunk/src/common/security.h =================================================================== --- firebird/trunk/src/common/security.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/common/security.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -30,7 +30,7 @@ namespace Auth { -class CharField : public Firebird::StackIface<ICharUserField> +class CharField : public Firebird::AutoIface<ICharUserField, FB_AUTH_CHAR_FIELD_VERSION> { public: CharField() @@ -88,7 +88,7 @@ Firebird::string value; }; -class IntField : public Firebird::StackIface<IIntUserField> +class IntField : public Firebird::AutoIface<IIntUserField, FB_AUTH_INT_FIELD_VERSION> { public: IntField() @@ -207,7 +207,7 @@ CharField database, dba, dbaPassword, role, trustedUser; }; -class StackUserData : public Firebird::StackIface<UserData> +class StackUserData : public Firebird::AutoIface<UserData, FB_AUTH_USER_VERSION> { }; Modified: firebird/trunk/src/gpre/boot/gpre_meta_boot.cpp =================================================================== --- firebird/trunk/src/gpre/boot/gpre_meta_boot.cpp 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/gpre/boot/gpre_meta_boot.cpp 2011-05-19 16:24:46 UTC (rev 52968) @@ -678,8 +678,9 @@ { public: // IMaster implementation (almost dummy, for boot build) - virtual void FB_CARG dispose() + virtual int FB_CARG getVersion() { + return FB_MASTER_VERSION; } virtual IStatus* FB_CARG getStatus() @@ -700,7 +701,7 @@ return NULL; } - virtual int FB_CARG upgradeInterface(IInterface* /*toUpgrade*/, int /*desiredVersion*/, + virtual int FB_CARG upgradeInterface(IVersioned* /*toUpgrade*/, int /*desiredVersion*/, void* /*missingFunctionClass*/) { fb_assert(false); Modified: firebird/trunk/src/include/FirebirdExternalApi.h =================================================================== --- firebird/trunk/src/include/FirebirdExternalApi.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/include/FirebirdExternalApi.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -152,7 +152,7 @@ }; -class IRoutineMetadata // : public IVersioned +class IRoutineMetadata : public IVersioned { public: virtual const char* FB_CARG getPackage(IStatus* status) const = 0; @@ -162,7 +162,7 @@ virtual const char* FB_CARG getTriggerTable(IStatus* status) const = 0; virtual ExternalTrigger::Type FB_CARG getTriggerType(IStatus* status) const = 0; }; -// #define FB_I_ROUTINE_METADATA_VERSION (FB_VERSIONED_VERSION + 6) +#define FB_ROUTINE_METADATA_VERSION (FB_VERSIONED_VERSION + 6) // In SuperServer, shared by all attachments to one database and disposed when last (non-external) Modified: firebird/trunk/src/include/FirebirdPluginApi.h =================================================================== --- firebird/trunk/src/include/FirebirdPluginApi.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/include/FirebirdPluginApi.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -70,7 +70,7 @@ namespace Firebird { // IPluginBase interface - base for master plugin interfaces (factories are registered for them) -class IPluginBase : public IInterface +class IPluginBase : public IRefCounted { public: // Additional (compared with Interface) functions getOwner() and setOwner() @@ -79,13 +79,13 @@ // after plugin itself, and therefore module is unloaded after release of last plugin from it. // Releasing owner from release() of plugin will unload module and after returning control // to missing code segfault is unavoidable. - virtual void FB_CARG setOwner(IInterface*) = 0; - virtual IInterface* FB_CARG getOwner() = 0; + virtual void FB_CARG setOwner(IRefCounted*) = 0; + virtual IRefCounted* FB_CARG getOwner() = 0; }; -#define FB_PLUGIN_VERSION (FB_INTERFACE_VERSION + 2) +#define FB_PLUGIN_VERSION (FB_REFCOUNTED_VERSION + 2) // IPluginSet - low level tool to access plugins according to parameter from firebird.conf -class IPluginSet : public IInterface +class IPluginSet : public IRefCounted { public: virtual const char* FB_CARG getName() const = 0; @@ -94,33 +94,33 @@ virtual void FB_CARG next() = 0; virtual void FB_CARG set(const char*) = 0; }; -#define FB_PLUGIN_SET_VERSION (FB_INTERFACE_VERSION + 5) +#define FB_PLUGIN_SET_VERSION (FB_REFCOUNTED_VERSION + 5) // Interfaces to work with configuration data class IConfig; // Entry in configuration file -class IConfigEntry : public IInterface +class IConfigEntry : public IRefCounted { public: virtual const char* FB_CARG getName() = 0; virtual const char* FB_CARG getValue() = 0; virtual IConfig* FB_CARG getSubConfig() = 0; }; -#define FB_I_CONFIG_PARAMETER_VERSION (FB_INTERFACE_VERSION + 3) +#define FB_CONFIG_PARAMETER_VERSION (FB_REFCOUNTED_VERSION + 3) // Generic form of access to configuration file - find specific entry in it -class IConfig : public IInterface +class IConfig : public IRefCounted { public: virtual IConfigEntry* FB_CARG find(const char* name) = 0; virtual IConfigEntry* FB_CARG findValue(const char* name, const char* value) = 0; virtual IConfigEntry* FB_CARG findPos(const char* name, unsigned int pos) = 0; }; -#define FB_I_CONFIG_VERSION (FB_INTERFACE_VERSION + 3) +#define FB_CONFIG_VERSION (FB_REFCOUNTED_VERSION + 3) // Used to access config values from firebird.conf (may be DB specific) -class IFirebirdConf : public IInterface +class IFirebirdConf : public IRefCounted { public: // Get integer key by it's name @@ -132,37 +132,40 @@ // Use to access string values virtual const char* FB_CARG asString(unsigned int key) = 0; }; -#define FB_I_FIREBIRD_CONF_VERSION (FB_INTERFACE_VERSION + 3) +#define FB_FIREBIRD_CONF_VERSION (FB_REFCOUNTED_VERSION + 3) // This interface is passed to plugin's factory as it's single parameter // and contains methods to access specific plugin's configuration data -class IPluginConfig : public IInterface +class IPluginConfig : public IRefCounted { public: virtual const char* FB_CARG getConfigFileName() = 0; virtual IConfig* FB_CARG getDefaultConfig() = 0; virtual IFirebirdConf* FB_CARG getFirebirdConf() = 0; }; -#define FB_FACTORY_PARAMETER_VERSION (FB_INTERFACE_VERSION + 3) +#define FB_PLUGIN_CONFIG_VERSION (FB_REFCOUNTED_VERSION + 3) // Required to creat instances of given plugin -class IPluginFactory : public IDisposable +class IPluginFactory : public IVersioned { public: virtual IPluginBase* FB_CARG createPlugin(IPluginConfig* factoryParameter) = 0; }; +#define FB_PLUGIN_FACTORY_VERSION (FB_VERSIONED_VERSION + 1) // Required to let plugins manager invoke module's cleanup routine before unloading it. // For some OS/compiler this may be done in dtor of global variable in module itself. // Others (Windows/VC) fail to create some very useful resources (threads) when module is unloading. -class IPluginModule : public IDisposable +class IPluginModule : public IVersioned { public: virtual void FB_CARG doClean() = 0; }; +#define FB_PLUGIN_MODULE_VERSION (FB_VERSIONED_VERSION + 1) + // Interface to deal with plugins here and there, returned by master interface -class IPluginManager : public IDisposable +class IPluginManager : public IVersioned { public: // Main function called by plugin modules in firebird_plugin() @@ -192,7 +195,9 @@ // will cause resources leak virtual void FB_CARG releasePlugin(IPluginBase* plugin) = 0; }; +#define FB_PLUGIN_MANAGER_VERSION (FB_VERSIONED_VERSION + 6) + typedef void PluginEntrypoint(IMaster* masterInterface); namespace PluginType { Modified: firebird/trunk/src/include/Interface.h =================================================================== --- firebird/trunk/src/include/Interface.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/include/Interface.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -39,22 +39,33 @@ namespace Firebird { -// Regular interface - base for refCounted FB interfaces -class IInterface +// Versioned interface - base for all FB interfaces +class IVersioned { public: + virtual int FB_CARG getVersion() = 0; +}; +// If this is changed, types of all interfaces must be changed +#define FB_VERSIONED_VERSION 1 + +// Reference counted interface - base for refCounted FB interfaces +class IRefCounted : public IVersioned +{ +public: virtual void FB_CARG addRef() = 0; virtual int FB_CARG release() = 0; - virtual int FB_CARG getVersion() = 0; }; -#define FB_INTERFACE_VERSION 3 // If this is changed, types of all interfaces must be changed +// If this is changed, types of refCounted interfaces must be changed +#define FB_REFCOUNTED_VERSION (FB_VERSIONED_VERSION + 2) -// Disposable interface - base for static and onStack interfaces, may be used in regular case too +// Disposable interface - base for disposable FB interfaces class IDisposable { public: virtual void FB_CARG dispose() = 0; }; +// If this is changed, types of disposable interfaces must be changed +#define FB_DISPOSABLE_VERSION (FB_VERSIONED_VERSION + 1) // Interface to work with status vector // Created by master interface by request @@ -69,6 +80,7 @@ virtual const ISC_STATUS* FB_CARG get() const = 0; virtual int FB_CARG isSuccess() const = 0; }; +#define FB_STATUS_VERSION (FB_DISPOSABLE_VERSION + 5) class IProvider; class IPluginManager; @@ -78,22 +90,20 @@ class IDtc; // Master interface is used to access almost all other interfaces. -class IMaster : public IDisposable +class IMaster : public IVersioned { public: - // This interface can't be upgraded - therefore another form of version is used - const static unsigned int VERSION = 1; // To be changed each time any interface, passed - // by firebird to plugins is changed virtual IStatus* FB_CARG getStatus() = 0; virtual IProvider* FB_CARG getDispatcher() = 0; virtual IPluginManager* FB_CARG getPluginManager() = 0; - virtual int FB_CARG upgradeInterface(IInterface* toUpgrade, int desiredVersion, void* missingFunctionClass) = 0; + virtual int FB_CARG upgradeInterface(IVersioned* toUpgrade, int desiredVersion, void* missingFunctionClass) = 0; virtual const char* FB_CARG circularAlloc(const char* s, size_t len, intptr_t thr) = 0; virtual ITimerControl* FB_CARG getTimerControl() = 0; virtual IDtc* FB_CARG getDtc() = 0; virtual IAttachment* registerAttachment(IProvider* provider, IAttachment* attachment) = 0; virtual ITransaction* registerTransaction(IAttachment* attachment, ITransaction* transaction) = 0; }; +#define FB_MASTER_VERSION (FB_VERSIONED_VERSION + 6) } // namespace Firebird Modified: firebird/trunk/src/include/ProviderInterface.h =================================================================== --- firebird/trunk/src/include/ProviderInterface.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/include/ProviderInterface.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -46,11 +46,12 @@ unsigned int bufferLength; }; -class IEventCallback +class IEventCallback : public IVersioned { public: virtual void FB_CARG eventCallbackFunction(unsigned int length, const unsigned char* events) = 0; }; +#define FB_EVENT_CALLBACK_VERSION (FB_VERSIONED_VERSION + 1) /* class ShutdownCallback @@ -60,7 +61,7 @@ }; */ -class IBlob : public IInterface +class IBlob : public IRefCounted { public: virtual void FB_CARG getInfo(IStatus* status, @@ -74,9 +75,9 @@ virtual void FB_CARG close(IStatus* status) = 0; virtual int FB_CARG seek(IStatus* status, int mode, int offset) = 0; // returns position }; -#define FB_I_BLOB_VERSION (FB_INTERFACE_VERSION + 6) +#define FB_BLOB_VERSION (FB_REFCOUNTED_VERSION + 6) -class ITransaction : public IInterface +class ITransaction : public IRefCounted { public: virtual void FB_CARG getInfo(IStatus* status, @@ -93,9 +94,9 @@ virtual ITransaction* FB_CARG validate(IStatus* status, IAttachment* attachment) = 0; virtual ITransaction* FB_CARG enterDtc(IStatus* status) = 0; }; -#define FB_I_TRANSACTION_VERSION (FB_INTERFACE_VERSION + 10) +#define FB_TRANSACTION_VERSION (FB_REFCOUNTED_VERSION + 10) -class IParametersMetadata // : public IVersioned +class IParametersMetadata : public IVersioned { public: virtual unsigned FB_CARG getCount(IStatus* status) const = 0; @@ -109,9 +110,9 @@ virtual unsigned FB_CARG getLength(IStatus* status, unsigned index) const = 0; virtual unsigned FB_CARG getScale(IStatus* status, unsigned index) const = 0; }; -// #define FB_I_PARAMETERS_METADATA_VERSION (FB_VERSIONED_VERSION + 10) +#define FB_PARAMETERS_METADATA_VERSION (FB_VERSIONED_VERSION + 10) -class IStatement : public IInterface +class IStatement : public IRefCounted { public: // Prepare flags. @@ -146,9 +147,9 @@ virtual void FB_CARG insert(IStatus* status, const FbMessage* msgBuffer) = 0; virtual void FB_CARG free(IStatus* status, unsigned int option) = 0; }; -#define FB_I_STATEMENT_VERSION (FB_INTERFACE_VERSION + 12) +#define FB_STATEMENT_VERSION (FB_REFCOUNTED_VERSION + 12) -class IRequest : public IInterface +class IRequest : public IRefCounted { public: virtual void FB_CARG receive(IStatus* status, int level, unsigned int msgType, @@ -164,16 +165,16 @@ virtual void FB_CARG unwind(IStatus* status, int level) = 0; virtual void FB_CARG free(IStatus* status) = 0; }; -#define FB_I_REQUEST_VERSION (FB_INTERFACE_VERSION + 7) +#define FB_REQUEST_VERSION (FB_REFCOUNTED_VERSION + 7) -class IEvents : public IInterface +class IEvents : public IRefCounted { public: virtual void FB_CARG cancel(IStatus* status) = 0; }; -#define FB_I_EVENTS_VERSION (FB_INTERFACE_VERSION + 1) +#define FB_EVENTS_VERSION (FB_REFCOUNTED_VERSION + 1) -class IAttachment : public IInterface +class IAttachment : public IRefCounted { public: virtual void FB_CARG getInfo(IStatus* status, @@ -212,9 +213,9 @@ virtual void FB_CARG detach(IStatus* status) = 0; virtual void FB_CARG drop(IStatus* status) = 0; }; -#define FB_I_ATTACHMENT_VERSION (FB_INTERFACE_VERSION + 17) +#define FB_ATTACHMENT_VERSION (FB_REFCOUNTED_VERSION + 17) -class IService : public IInterface +class IService : public IRefCounted { public: virtual void FB_CARG detach(IStatus* status) = 0; @@ -225,7 +226,7 @@ virtual void FB_CARG start(IStatus* status, unsigned int spbLength, const unsigned char* spb) = 0; }; -#define FB_I_SERVICE_VERSION (FB_INTERFACE_VERSION + 3) +#define FB_SERVICE_VERSION (FB_REFCOUNTED_VERSION + 3) class IProvider : public IPluginBase { @@ -238,7 +239,7 @@ unsigned int spbLength, const unsigned char* spb) = 0; virtual void FB_CARG shutdown(IStatus* status, unsigned int timeout, const int reason) = 0; }; -#define FB_I_PROVIDER_VERSION (FB_PLUGIN_VERSION + 4) +#define FB_PROVIDER_VERSION (FB_PLUGIN_VERSION + 4) // DtcStart - structure to start transaction over >1 attachments (former TEB) struct DtcStart @@ -249,12 +250,13 @@ }; // Distributed transactions coordinator -class IDtc : public IDisposable +class IDtc : public IVersioned { public: virtual ITransaction* FB_CARG start(IStatus* status, unsigned int cnt, DtcStart* components) = 0; virtual ITransaction* FB_CARG join(IStatus* status, ITransaction* one, ITransaction* two) = 0; }; +#define FB_DTC_VERSION (FB_VERSIONED_VERSION + 2) } // namespace Firebird Modified: firebird/trunk/src/include/Timer.h =================================================================== --- firebird/trunk/src/include/Timer.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/include/Timer.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -35,17 +35,17 @@ // Identifies particular timer. // Callback function is invoked when timer fires. -class ITimer : public IInterface +class ITimer : public IRefCounted { public: virtual void FB_CARG handler() = 0; }; -#define FB_I_TIMER_VERSION (FB_INTERFACE_VERSION + 1) +#define FB_TIMER_VERSION (FB_REFCOUNTED_VERSION + 1) typedef ISC_INT64 TimerDelay; // Interface to set timer for particular time -class ITimerControl : public IDisposable +class ITimerControl : public IVersioned { public: // Set timer @@ -53,6 +53,7 @@ // Stop timer virtual void FB_CARG stop(ITimer* timer) = 0; }; +#define FB_TIMER_CONTROL_VERSION (FB_VERSIONED_VERSION + 2) } // namespace Firebird Modified: firebird/trunk/src/jrd/EngineInterface.h =================================================================== --- firebird/trunk/src/jrd/EngineInterface.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/jrd/EngineInterface.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -42,7 +42,7 @@ class JAttachment; class JProvider; -class JBlob : public Firebird::StdIface<Firebird::IBlob, FB_I_BLOB_VERSION> +class JBlob : public Firebird::RefCntIface<Firebird::IBlob, FB_BLOB_VERSION> { public: // IBlob implementation @@ -79,7 +79,7 @@ void freeEngineData(Firebird::IStatus* status); }; -class JTransaction : public Firebird::StdIface<Firebird::ITransaction, FB_I_TRANSACTION_VERSION> +class JTransaction : public Firebird::RefCntIface<Firebird::ITransaction, FB_TRANSACTION_VERSION> { public: // ITransaction implementation @@ -137,7 +137,7 @@ void freeEngineData(Firebird::IStatus* status); }; -class JStatement : public Firebird::StdIface<Firebird::IStatement, FB_I_STATEMENT_VERSION> +class JStatement : public Firebird::RefCntIface<Firebird::IStatement, FB_STATEMENT_VERSION> { public: // IStatement implementation @@ -185,7 +185,7 @@ void freeEngineData(Firebird::IStatus* status, unsigned int option); }; -class JRequest : public Firebird::StdIface<Firebird::IRequest, FB_I_REQUEST_VERSION> +class JRequest : public Firebird::RefCntIface<Firebird::IRequest, FB_REQUEST_VERSION> { public: // IRequest implementation @@ -226,7 +226,7 @@ void freeEngineData(Firebird::IStatus* status); }; -class JEvents : public Firebird::StdIface<Firebird::IEvents, FB_I_EVENTS_VERSION> +class JEvents : public Firebird::RefCntIface<Firebird::IEvents, FB_EVENTS_VERSION> { public: // IEvents implementation @@ -256,7 +256,7 @@ void freeEngineData(Firebird::IStatus* status); }; -class JAttachment : public Firebird::StdIface<Firebird::IAttachment, FB_I_ATTACHMENT_VERSION> +class JAttachment : public Firebird::RefCntIface<Firebird::IAttachment, FB_ATTACHMENT_VERSION> { public: // IAttachment implementation @@ -334,7 +334,7 @@ void freeEngineData(Firebird::IStatus* status); }; -class JService : public Firebird::StdIface<Firebird::IService, FB_I_SERVICE_VERSION> +class JService : public Firebird::RefCntIface<Firebird::IService, FB_SERVICE_VERSION> { public: // IService implementation @@ -356,7 +356,7 @@ void freeEngineData(Firebird::IStatus* status); }; -class JProvider : public Firebird::StdPlugin<Firebird::IProvider, FB_I_PROVIDER_VERSION> +class JProvider : public Firebird::StdPlugin<Firebird::IProvider, FB_PROVIDER_VERSION> { public: explicit JProvider(Firebird::IPluginConfig*) Modified: firebird/trunk/src/jrd/ExtEngineManager.h =================================================================== --- firebird/trunk/src/jrd/ExtEngineManager.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/jrd/ExtEngineManager.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -33,6 +33,7 @@ #include "../common/classes/NestConst.h" #include "../common/classes/auto.h" #include "../common/classes/rwlock.h" +#include "../common/classes/ImplementHelper.h" ///#include "../dsql/Nodes.h" struct dsc; @@ -61,7 +62,8 @@ template <typename T> class ContextManager; class TransactionImpl; - class RoutineMetadata : public Firebird::IRoutineMetadata, public Firebird::PermanentStorage + class RoutineMetadata : public Firebird::VersionedIface<Firebird::IRoutineMetadata, FB_ROUTINE_METADATA_VERSION>, + public Firebird::PermanentStorage { public: RoutineMetadata(MemoryPool& pool) Modified: firebird/trunk/src/jrd/UserManagement.cpp =================================================================== --- firebird/trunk/src/jrd/UserManagement.cpp 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/jrd/UserManagement.cpp 2011-05-19 16:24:46 UTC (rev 52968) @@ -71,7 +71,7 @@ fb_assert(manager); manager->addRef(); - class UserIdInfo : public StackIface<Auth::ILogonInfo> + class UserIdInfo : public AutoIface<Auth::ILogonInfo, FB_AUTH_LOGON_INFO_VERSION> { public: explicit UserIdInfo(const Attachment* pAtt) Modified: firebird/trunk/src/jrd/UserManagement.h =================================================================== --- firebird/trunk/src/jrd/UserManagement.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/jrd/UserManagement.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -54,7 +54,7 @@ class UserManagement : public DataDump { public: - class Display : public Firebird::StackIface<Auth::IListUsers> + class Display : public Firebird::AutoIface<Auth::IListUsers, FB_AUTH_LIST_USERS_VERSION> { public: explicit Display(UserManagement* um) Modified: firebird/trunk/src/jrd/dyn.epp =================================================================== --- firebird/trunk/src/jrd/dyn.epp 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/jrd/dyn.epp 2011-05-19 16:24:46 UTC (rev 52968) @@ -1969,16 +1969,24 @@ ISC_STATUS_ARRAY status; try { - class DisposeableUserData : public Firebird::DisposeIface<Auth::UserData, pool_alloc<type_user_data> > + class DynamicUserData : public Firebird::VersionedIface<Auth::UserData, FB_AUTH_USER_VERSION> { public: - void FB_CARG dispose() + +#ifdef DEBUG_GDS_ALLOC + void* operator new(size_t size, Firebird::MemoryPool& pool, const char* fileName, int line) { - delete this; + return pool.allocate(size, fileName, line); } +#else // DEBUG_GDS_ALLOC + void* operator new(size_t size, Firebird::MemoryPool& pool) + { + return pool.allocate(size); + } +#endif // DEBUG_GDS_ALLOC }; - DisposeableUserData* userData = FB_NEW(*tra->tra_pool) DisposeableUserData; + DynamicUserData* userData = FB_NEW(*tra->tra_pool) DynamicUserData; UCHAR verb; while ((verb = *(*ptr)++) != isc_user_end) { Modified: firebird/trunk/src/jrd/jrd.cpp =================================================================== --- firebird/trunk/src/jrd/jrd.cpp 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/jrd/jrd.cpp 2011-05-19 16:24:46 UTC (rev 52968) @@ -315,7 +315,7 @@ static GlobalPtr<ShutdownBeforeUnload, InstanceControl::PRIORITY_DETECT_UNLOAD> shutdownBeforeUnload; -class EngineFactory : public StackIface<IPluginFactory> +class EngineFactory : public AutoIface<IPluginFactory, FB_PLUGIN_FACTORY_VERSION> { public: // IPluginFactory implementation @@ -745,7 +745,7 @@ /// trace manager support -class TraceFailedConnection : public StackIface<TraceConnection> +class TraceFailedConnection : public AutoIface<TraceConnection, FB_TRACE_CONNECTION_VERSION> { public: TraceFailedConnection(const char* filename, const DatabaseOptions* options); Modified: firebird/trunk/src/jrd/ntrace.h =================================================================== --- firebird/trunk/src/jrd/ntrace.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/jrd/ntrace.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -37,7 +37,7 @@ struct PerformanceInfo; -class TraceConnection : public Firebird::IDisposable +class TraceConnection : public Firebird::IVersioned { public: virtual int FB_CARG getConnectionID() = 0; @@ -52,6 +52,7 @@ virtual int FB_CARG getRemoteProcessID() = 0; virtual const char* FB_CARG getRemoteProcessName() = 0; }; +#define FB_TRACE_CONNECTION_VERSION (FB_VERSIONED_VERSION + 10) enum ntrace_tra_isolation_t { @@ -61,7 +62,7 @@ tra_iso_read_committed_norecver }; -class TraceTransaction : public Firebird::IDisposable +class TraceTransaction : public Firebird::IVersioned { public: virtual int FB_CARG getTransactionID() = 0; @@ -70,22 +71,25 @@ virtual ntrace_tra_isolation_t FB_CARG getIsolation() = 0; virtual PerformanceInfo* FB_CARG getPerf() = 0; }; +#define FB_TRACE_TRANSACTION_VERSION (FB_VERSIONED_VERSION + 5) typedef int ntrace_relation_t; -class TraceParams : public Firebird::IDisposable +class TraceParams : public Firebird::IVersioned { public: virtual size_t FB_CARG getCount() = 0; virtual const struct dsc* FB_CARG getParam(size_t idx) = 0; }; +#define FB_TRACE_PARAMS_VERSION (FB_VERSIONED_VERSION + 2) -class TraceStatement : public Firebird::IDisposable +class TraceStatement : public Firebird::IVersioned { public: virtual int FB_CARG getStmtID() = 0; virtual PerformanceInfo* FB_CARG getPerf() = 0; }; +#define FB_TRACE_STATEMENT_VERSION (FB_VERSIONED_VERSION + 2) class TraceSQLStatement : public TraceStatement { @@ -95,6 +99,7 @@ virtual TraceParams* FB_CARG getInputs() = 0; virtual const char* FB_CARG getTextUTF8() = 0; }; +#define FB_TRACE_SQL_STATEMENT_VERSION (FB_TRACE_STATEMENT_VERSION + 4) class TraceBLRStatement : public TraceStatement { @@ -103,32 +108,36 @@ virtual size_t FB_CARG getDataLength() = 0; virtual const char* FB_CARG getText() = 0; }; +#define FB_TRACE_BLR_STATEMENT_VERSION (FB_TRACE_STATEMENT_VERSION + 3) -class TraceDYNRequest : public Firebird::IDisposable +class TraceDYNRequest : public Firebird::IVersioned { public: virtual const unsigned char* FB_CARG getData() = 0; virtual size_t FB_CARG getDataLength() = 0; virtual const char* FB_CARG getText() = 0; }; +#define FB_TRACE_DYN_REQUEST_VERSION (FB_VERSIONED_VERSION + 3) -class TraceContextVariable : public Firebird::IDisposable +class TraceContextVariable : public Firebird::IVersioned { public: virtual const char* FB_CARG getNameSpace() = 0; virtual const char* FB_CARG getVarName() = 0; virtual const char* FB_CARG getVarValue() = 0; }; +#define FB_TRACE_CONTEXT_VARIABLE_VERSION (FB_VERSIONED_VERSION + 3) -class TraceProcedure : public Firebird::IDisposable +class TraceProcedure : public Firebird::IVersioned { public: virtual const char* FB_CARG getProcName() = 0; virtual TraceParams* FB_CARG getInputs() = 0; virtual PerformanceInfo* FB_CARG getPerf() = 0; }; +#define FB_TRACE_PROCEDURE_VERSION (FB_VERSIONED_VERSION + 3) -class TraceTrigger : public Firebird::IDisposable +class TraceTrigger : public Firebird::IVersioned { public: virtual const char* FB_CARG getTriggerName() = 0; @@ -137,10 +146,11 @@ virtual int FB_CARG getWhich() = 0; virtual PerformanceInfo* FB_CARG getPerf() = 0; }; +#define FB_TRACE_TRIGGER_VERSION (FB_VERSIONED_VERSION + 5) typedef void* ntrace_service_t; -class TraceService : public Firebird::IDisposable +class TraceService : public Firebird::IVersioned { public: virtual ntrace_service_t FB_CARG getServiceID() = 0; @@ -155,6 +165,7 @@ virtual int FB_CARG getRemoteProcessID() = 0; virtual const char* FB_CARG getRemoteProcessName() = 0; }; +#define FB_TRACE_SERVICE_VERSION (FB_VERSIONED_VERSION + 10) // Plugin-specific argument. Passed by the engine to each hook @@ -221,14 +232,14 @@ ntrace_counter_t pin_records_fetched; // records fetched from statement/procedure }; -class TraceLogWriter : public Firebird::IInterface +class TraceLogWriter : public Firebird::IRefCounted { public: virtual size_t FB_CARG write(const void* buf, size_t size) = 0; }; -#define FB_TRACE_LOG_WRITER_VERSION (FB_INTERFACE_VERSION + 1) +#define FB_TRACE_LOG_WRITER_VERSION (FB_REFCOUNTED_VERSION + 1) -class TraceInitInfo : public Firebird::IDisposable +class TraceInitInfo : public Firebird::IVersioned { public: virtual const char* FB_CARG getConfigText() = 0; @@ -239,10 +250,11 @@ virtual TraceConnection* FB_CARG getConnection() = 0; virtual TraceLogWriter* FB_CARG getLogWriter() = 0; }; +#define FB_TRACE_INIT_INFO_VERSION (FB_VERSIONED_VERSION + 7) // API of trace plugin. Used to deliver notifications for each database -class TracePlugin : public Firebird::IInterface +class TracePlugin : public Firebird::IRefCounted { public: // Function to return error string for hook failure @@ -295,7 +307,7 @@ const ntrace_byte_t* recv_items, ntrace_result_t query_result) = 0; virtual int FB_CARG trace_service_detach(TraceService* service, ntrace_result_t detach_result) = 0; }; -#define FB_TRACE_PLUGIN_VERSION (FB_INTERFACE_VERSION + 18) +#define FB_TRACE_PLUGIN_VERSION (FB_REFCOUNTED_VERSION + 18) // Trace plugin second level factory (this is what is known to PluginManager as "trace plugin") class TraceFactory : public Firebird::IPluginBase Modified: firebird/trunk/src/jrd/trace/TraceConfigStorage.h =================================================================== --- firebird/trunk/src/jrd/trace/TraceConfigStorage.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/jrd/trace/TraceConfigStorage.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -70,7 +70,7 @@ void checkFile(); void touchFile(); - class TouchFile : public Firebird::StdIface<Firebird::ITimer, FB_I_TIMER_VERSION> + class TouchFile : public Firebird::RefCntIface<Firebird::ITimer, FB_TIMER_VERSION> { public: void FB_CARG handler(); Modified: firebird/trunk/src/jrd/trace/TraceObjects.cpp =================================================================== --- firebird/trunk/src/jrd/trace/TraceObjects.cpp 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/jrd/trace/TraceObjects.cpp 2011-05-19 16:24:46 UTC (rev 52968) @@ -427,7 +427,7 @@ /// TraceLogWriterImpl -class TraceLogWriterImpl : public StdIface<TraceLogWriter, FB_TRACE_LOG_WRITER_VERSION> +class TraceLogWriterImpl : public RefCntIface<TraceLogWriter, FB_TRACE_LOG_WRITER_VERSION> { public: TraceLogWriterImpl(const TraceSession& session) : Modified: firebird/trunk/src/jrd/trace/TraceObjects.h =================================================================== --- firebird/trunk/src/jrd/trace/TraceObjects.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/jrd/trace/TraceObjects.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -49,7 +49,7 @@ class Attachment; class jrd_tra; -class TraceConnectionImpl : public Firebird::StackIface<TraceConnection> +class TraceConnectionImpl : public Firebird::AutoIface<TraceConnection, FB_TRACE_CONNECTION_VERSION> { public: TraceConnectionImpl(const Attachment* att) : @@ -73,7 +73,7 @@ }; -class TraceTransactionImpl : public Firebird::StackIface<TraceTransaction> +class TraceTransactionImpl : public Firebird::AutoIface<TraceTransaction, FB_TRACE_TRANSACTION_VERSION> { public: TraceTransactionImpl(const jrd_tra* tran, PerformanceInfo* perf = NULL) : @@ -94,7 +94,7 @@ }; -class BLRPrinter : public Firebird::StackIface<TraceBLRStatement> +class BLRPrinter : public Firebird::AutoIface<TraceBLRStatement, FB_TRACE_BLR_STATEMENT_VERSION> { public: BLRPrinter(const unsigned char* blr, size_t length) : @@ -147,7 +147,7 @@ }; -class TraceSQLStatementImpl : public Firebird::StackIface<TraceSQLStatement> +class TraceSQLStatementImpl : public Firebird::AutoIface<TraceSQLStatement, FB_TRACE_SQL_STATEMENT_VERSION> { public: TraceSQLStatementImpl(const dsql_req* stmt, PerformanceInfo* perf) : @@ -166,7 +166,7 @@ virtual const char* FB_CARG getTextUTF8(); private: - class DSQLParamsImpl : public Firebird::StackIface<TraceParams> + class DSQLParamsImpl : public Firebird::AutoIface<TraceParams, FB_TRACE_PARAMS_VERSION> { public: DSQLParamsImpl(Firebird::MemoryPool& pool, const Firebird::Array<dsql_par*>* params) : @@ -192,7 +192,7 @@ }; -class TraceFailedSQLStatement : public Firebird::StackIface<TraceSQLStatement> +class TraceFailedSQLStatement : public Firebird::AutoIface<TraceSQLStatement, FB_TRACE_SQL_STATEMENT_VERSION> { public: TraceFailedSQLStatement(Firebird::string& text) : @@ -213,7 +213,7 @@ }; -class TraceContextVarImpl : public Firebird::StackIface<TraceContextVariable> +class TraceContextVarImpl : public Firebird::AutoIface<TraceContextVariable, FB_TRACE_CONTEXT_VARIABLE_VERSION> { public: TraceContextVarImpl(const char* ns, const char* name, const char* value) : @@ -233,7 +233,7 @@ const char* const m_value; }; -class TraceProcedureImpl : public Firebird::StackIface<TraceProcedure> +class TraceProcedureImpl : public Firebird::AutoIface<TraceProcedure, FB_TRACE_PROCEDURE_VERSION> { public: TraceProcedureImpl(jrd_req* request, PerformanceInfo* perf) : @@ -252,7 +252,7 @@ virtual PerformanceInfo* FB_CARG getPerf() { return m_perf; }; private: - class JrdParamsImpl : public Firebird::StackIface<TraceParams> + class JrdParamsImpl : public Firebird::AutoIface<TraceParams, FB_TRACE_PARAMS_VERSION> { public: JrdParamsImpl(Firebird::MemoryPool& pool, jrd_req* request, const ValueListNode* params) : @@ -278,7 +278,7 @@ }; -class TraceTriggerImpl : public Firebird::StackIface<TraceTrigger> +class TraceTriggerImpl : public Firebird::AutoIface<TraceTrigger, FB_TRACE_TRIGGER_VERSION> { public: TraceTriggerImpl(const jrd_req* trig, SSHORT which, PerformanceInfo* perf) : @@ -301,7 +301,7 @@ }; -class TraceServiceImpl : public Firebird::StackIface<TraceService> +class TraceServiceImpl : public Firebird::AutoIface<TraceService, FB_TRACE_SERVICE_VERSION> { public: TraceServiceImpl(const Service* svc) : @@ -340,7 +340,7 @@ }; -class TraceInitInfoImpl : public Firebird::StackIface<TraceInitInfo> +class TraceInitInfoImpl : public Firebird::AutoIface<TraceInitInfo, FB_TRACE_INIT_INFO_VERSION> { public: TraceInitInfoImpl(const Firebird::TraceSession& session, const Attachment* att, Modified: firebird/trunk/src/remote/client/interface.cpp =================================================================== --- firebird/trunk/src/remote/client/interface.cpp 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/remote/client/interface.cpp 2011-05-19 16:24:46 UTC (rev 52968) @@ -132,7 +132,7 @@ class Attachment; -class Blob : public Firebird::StdIface<Firebird::IBlob, FB_I_BLOB_VERSION> +class Blob : public Firebird::RefCntIface<Firebird::IBlob, FB_BLOB_VERSION> { public: // IBlob implementation @@ -173,7 +173,7 @@ return 0; } -class Transaction : public Firebird::StdIface<Firebird::ITransaction, FB_I_TRANSACTION_VERSION> +class Transaction : public Firebird::RefCntIface<Firebird::ITransaction, FB_TRANSACTION_VERSION> { public: // ITransaction implementation @@ -235,7 +235,7 @@ return 0; } -class Statement : public Firebird::StdIface<Firebird::IStatement, FB_I_STATEMENT_VERSION> +class Statement : public Firebird::RefCntIface<Firebird::IStatement, FB_STATEMENT_VERSION> { public: // IStatement implementation @@ -289,7 +289,7 @@ return 0; } -class Request : public Firebird::StdIface<Firebird::IRequest, FB_I_REQUEST_VERSION> +class Request : public Firebird::RefCntIface<Firebird::IRequest, FB_REQUEST_VERSION> { public: // IRequest implementation @@ -333,7 +333,7 @@ return 0; } -class Events : public Firebird::StdIface<Firebird::IEvents, FB_I_EVENTS_VERSION> +class Events : public Firebird::RefCntIface<Firebird::IEvents, FB_EVENTS_VERSION> { public: // IEvents implementation @@ -363,7 +363,7 @@ return 0; } -class Attachment : public Firebird::StdIface<Firebird::IAttachment, FB_I_ATTACHMENT_VERSION> +class Attachment : public Firebird::RefCntIface<Firebird::IAttachment, FB_ATTACHMENT_VERSION> { public: // IAttachment implementation @@ -446,7 +446,7 @@ return 0; } -class Service : public Firebird::StdIface<Firebird::IService, FB_I_SERVICE_VERSION> +class Service : public Firebird::RefCntIface<Firebird::IService, FB_SERVICE_VERSION> { public: // IService implementation @@ -482,7 +482,7 @@ return 0; } -class Provider : public Firebird::StdPlugin<Firebird::IProvider, FB_I_PROVIDER_VERSION> +class Provider : public Firebird::StdPlugin<Firebird::IProvider, FB_PROVIDER_VERSION> { public: explicit Provider(IPluginConfig*) Modified: firebird/trunk/src/utilities/gsec/gsec.cpp =================================================================== --- firebird/trunk/src/utilities/gsec/gsec.cpp 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/utilities/gsec/gsec.cpp 2011-05-19 16:24:46 UTC (rev 52968) @@ -252,7 +252,7 @@ fb_assert(user_data->trustedUser.entered()); if (user_data->trustedUser.entered()) { - class GsecInfo : public Firebird::StackIface<Auth::ILogonInfo> + class GsecInfo : public Firebird::AutoIface<Auth::ILogonInfo, FB_AUTH_LOGON_INFO_VERSION> { public: GsecInfo(const char* pTrustedUser, const char* pRole, int pTrustedRole, @@ -335,7 +335,7 @@ } } - class Display : public Firebird::StackIface<Auth::IListUsers> + class Display : public Firebird::AutoIface<Auth::IListUsers, FB_AUTH_LIST_USERS_VERSION> { public: explicit Display(tsec* t) Modified: firebird/trunk/src/utilities/ntrace/PluginLogWriter.h =================================================================== --- firebird/trunk/src/utilities/ntrace/PluginLogWriter.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/utilities/ntrace/PluginLogWriter.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -47,7 +47,7 @@ #include <sys/stat.h> -class PluginLogWriter : public Firebird::StdIface<TraceLogWriter, FB_TRACE_LOG_WRITER_VERSION> +class PluginLogWriter : public Firebird::RefCntIface<TraceLogWriter, FB_TRACE_LOG_WRITER_VERSION> { public: PluginLogWriter(const char* fileName, size_t maxSize); Modified: firebird/trunk/src/utilities/ntrace/TracePluginImpl.h =================================================================== --- firebird/trunk/src/utilities/ntrace/TracePluginImpl.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/utilities/ntrace/TracePluginImpl.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -44,7 +44,7 @@ // Bring in off_t #include <sys/types.h> -class TracePluginImpl : public Firebird::StdIface<TracePlugin, FB_TRACE_PLUGIN_VERSION> +class TracePluginImpl : public Firebird::RefCntIface<TracePlugin, FB_TRACE_PLUGIN_VERSION> { public: // Serialize exception to TLS buffer to return it to user Modified: firebird/trunk/src/yvalve/DistributedTransaction.cpp =================================================================== --- firebird/trunk/src/yvalve/DistributedTransaction.cpp 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/yvalve/DistributedTransaction.cpp 2011-05-19 16:24:46 UTC (rev 52968) @@ -43,7 +43,7 @@ namespace { -class DTransaction : public StdIface<ITransaction, FB_I_TRANSACTION_VERSION> +class DTransaction : public RefCntIface<ITransaction, FB_TRANSACTION_VERSION> { public: DTransaction() @@ -178,7 +178,7 @@ return true; } -class Dtc : public StackIface<IDtc> +class Dtc : public AutoIface<IDtc, FB_DTC_VERSION> { public: // IDtc implementation Modified: firebird/trunk/src/yvalve/MasterImplementation.cpp =================================================================== --- firebird/trunk/src/yvalve/MasterImplementation.cpp 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/yvalve/MasterImplementation.cpp 2011-05-19 16:24:46 UTC (rev 52968) @@ -51,7 +51,7 @@ // getStatus() // -class UserStatus : public Firebird::DisposeIface<Firebird::BaseStatus> +class UserStatus : public Firebird::DisposeIface<Firebird::BaseStatus, FB_STATUS_VERSION> { private: // IStatus implementation @@ -106,7 +106,7 @@ GlobalPtr<RWLock> mapLock; } -int FB_CARG MasterImplementation::upgradeInterface(IInterface* toUpgrade, +int FB_CARG MasterImplementation::upgradeInterface(IVersioned* toUpgrade, int desiredVersion, void* missingFunctionClass) { @@ -466,7 +466,7 @@ } // namespace -class TimerImplementation : public StackIface<ITimerControl> +class TimerImplementation : public AutoIface<ITimerControl, FB_TIMER_CONTROL_VERSION> { public: // ITimerControl implementation Modified: firebird/trunk/src/yvalve/MasterImplementation.h =================================================================== --- firebird/trunk/src/yvalve/MasterImplementation.h 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/yvalve/MasterImplementation.h 2011-05-19 16:24:46 UTC (rev 52968) @@ -37,14 +37,14 @@ { extern Firebird::IProvider* dispatcherPtr; - class MasterImplementation : public Firebird::StackIface<Firebird::IMaster> + class MasterImplementation : public Firebird::AutoIface<Firebird::IMaster, FB_MASTER_VERSION> { public: // IMaster implementation Firebird::IStatus* FB_CARG getStatus(); Firebird::IProvider* FB_CARG getDispatcher(); Firebird::IPluginManager* FB_CARG getPluginManager(); - int FB_CARG upgradeInterface(Firebird::IInterface* toUpgrade, int desiredVersion, void* missingFunctionClass); + int FB_CARG upgradeInterface(Firebird::IVersioned* toUpgrade, int desiredVersion, void* missingFunctionClass); const char* FB_CARG circularAlloc(const char* s, size_t len, intptr_t thr); Firebird::ITimerControl* FB_CARG getTimerControl(); Firebird::IAttachment* registerAttachment(Firebird::IProvider* provider, Modified: firebird/trunk/src/yvalve/PluginManager.cpp =================================================================== --- firebird/trunk/src/yvalve/PluginManager.cpp 2011-05-19 11:38:38 UTC (rev 52967) +++ firebird/trunk/src/yvalve/PluginManager.cpp 2011-05-19 16:24:46 UTC (rev 52968) @@ -126,10 +126,10 @@ bool flShutdown = false; - class ConfigParameterAccess : public StdIface<IConfigEntry, FB_I_CONFIG_PARAMETER_VERSION> + class ConfigParameterAccess : public RefCntIface<IConfigEntry, FB_CONFIG_PARAMETER_VERSION> { public: - ConfigParameterAccess(IInterface* c, const ConfigFile::Parameter* p) : cf(c), par(p) { } + ConfigParameterAccess(IRefCounted* c, const ConfigFile::Parameter* p) : cf(c), par(p) { } // IConfigEntry implementation const char* FB_CARG getName() @@ -156,11 +156,11 @@ } private: - RefPtr<IInterface> cf; + RefPtr<IRefCounted> cf; const ConfigFile::Parameter* par; }; - class ConfigAccess : public StdIface<IConfig, FB_I_CONFIG_VERSION> + class ConfigAccess : public RefCntIface<IConfig, FB_CONFIG_VERSION> { public: ConfigAccess(RefPtr<ConfigFile> c) : confFile(c) { } @@ -338,11 +338,6 @@ } *prev = next; - for (unsigned int i = 0; i < regPlugins.getCount(); ++i) - { - regPlugins[i].factory->dispose(); - } - if (cleanup) { cleanup->doClean(); @@ -453,7 +448,7 @@ }; // Delays destruction of ConfiguredPlugin instance - class PluginDestroyTimer : public Firebird::StdIface<Firebird::ITimer, FB_I_TIMER_VERSION> + class PluginDestroyTimer : public RefCntIface<ITimer, FB_TIMER_VERSION> { public: PluginDestroyTimer(ConfiguredPlugin* cp) @@ -480,7 +475,7 @@ }; // Provides per-database configuration from aliases.conf. - class FactoryParameter : public StdIface<IPluginConfig, FB_FACTORY_PARAMETER_VERSION> + class FactoryParameter : public RefCntIface<IPluginConfig, FB_PLUGIN_CONFIG_VERSION> { public: FactoryParameter(ConfiguredPlugin* cp, IFirebirdConf* fc) @@ -633,7 +628,7 @@ } // Provides access to plugins of given type / name. - class PluginSet : public StdI... [truncated message content] |