mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-22 16:03:03 +01:00
Used upgradeInterface() in a number of places.
Fixed memory leak when unloading module, related with upgraded interfaces. Fixed timer on posix to be high resolution. Better diagnostic in services.
This commit is contained in:
parent
9d375fccfa
commit
40348295e1
@ -292,7 +292,7 @@ FB_DAEMON = $(BIN)/firebird$(EXEC_EXT)
|
||||
|
||||
# Per-library link rules
|
||||
LINK_UDF = $(LIB_LINK) $(LIB_LINK_OPTIONS) $(call LIB_LINK_SONAME,$(1).$(SHRLIB_EXT)) $(UNDEF_FLAGS)\
|
||||
$(call LIB_LINK_RPATH,lib) -lm
|
||||
$(call LIB_LINK_RPATH,lib) $(SO_LINK_LIBS)
|
||||
LINK_UDF_LIBS = $(THR_LIBS) -L$(LIB) -lib_util
|
||||
|
||||
LINK_IB_UTIL = $(LIB_LINK) $(LINK_IBUTIL_SYMBOLS) $(LIB_LINK_OPTIONS) $(UNDEF_FLAGS)\
|
||||
|
@ -793,6 +793,8 @@ dnl AC_CHECK_FUNCS(AO_compare_and_swap_full)
|
||||
AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM([[#include <atomic_ops.h>]], [[AO_T x; AO_compare_and_swap_full(&x, 0, 0); return 0;]])],
|
||||
AC_DEFINE(HAVE_AO_COMPARE_AND_SWAP_FULL, 1, [Define this if AO_compare_and_swap_full() is defined in atomic_ops.h]))
|
||||
AC_SEARCH_LIBS(clock_gettime, rt)
|
||||
AC_CHECK_FUNCS(clock_gettime)
|
||||
|
||||
dnl Checks for pthread functions
|
||||
AC_CHECK_FUNCS(pthread_mutexattr_setprotocol)
|
||||
|
@ -1460,6 +1460,8 @@ C --
|
||||
PARAMETER (GDS__invalid_boolean_usage = 335545023)
|
||||
INTEGER*4 GDS__sysf_argscant_both_be_zero
|
||||
PARAMETER (GDS__sysf_argscant_both_be_zero = 335545024)
|
||||
INTEGER*4 GDS__spb_no_id
|
||||
PARAMETER (GDS__spb_no_id = 335545025)
|
||||
INTEGER*4 GDS__gfix_db_name
|
||||
PARAMETER (GDS__gfix_db_name = 335740929)
|
||||
INTEGER*4 GDS__gfix_invalid_sw
|
||||
|
@ -737,6 +737,7 @@ const
|
||||
gds_cannot_copy_stmt = 335545022;
|
||||
gds_invalid_boolean_usage = 335545023;
|
||||
gds_sysf_argscant_both_be_zero = 335545024;
|
||||
gds_spb_no_id = 335545025;
|
||||
gds_gfix_db_name = 335740929;
|
||||
gds_gfix_invalid_sw = 335740930;
|
||||
gds_gfix_incmp_sw = 335740932;
|
||||
|
@ -33,6 +33,8 @@
|
||||
|
||||
//#define AUTH_VERBOSE
|
||||
|
||||
static Firebird::MakeUpgradeInfo<> upInfo;
|
||||
|
||||
// register plugin
|
||||
static Firebird::SimpleFactory<Auth::DebugClient> clientFactory;
|
||||
static Firebird::SimpleFactory<Auth::DebugServer> serverFactory;
|
||||
@ -60,6 +62,7 @@ Result FB_CARG DebugServer::startAuthentication(Firebird::IStatus* status, bool
|
||||
{
|
||||
try
|
||||
{
|
||||
Firebird::MasterInterfacePtr()->upgradeInterface(writerInterface, FB_AUTH_WRITER_VERSION, upInfo);
|
||||
str.erase();
|
||||
Firebird::ClumpletReader rdr(isService ?
|
||||
Firebird::ClumpletReader::spbList :
|
||||
@ -88,6 +91,7 @@ Result FB_CARG DebugServer::contAuthentication(Firebird::IStatus* status, IWrite
|
||||
#ifdef AUTH_VERBOSE
|
||||
fprintf(stderr, "DebugServerInstance::contAuthentication: %.*s\n", size, data);
|
||||
#endif
|
||||
Firebird::MasterInterfacePtr()->upgradeInterface(writerInterface, FB_AUTH_WRITER_VERSION, upInfo);
|
||||
writerInterface->add(Firebird::string((const char*) data, size).c_str(), "DEBUG", "");
|
||||
return AUTH_SUCCESS;
|
||||
}
|
||||
@ -126,6 +130,7 @@ Result FB_CARG DebugClient::startAuthentication(Firebird::IStatus* status, bool
|
||||
{
|
||||
try
|
||||
{
|
||||
Firebird::MasterInterfacePtr()->upgradeInterface(dpb, FB_AUTH_DPB_READER_VERSION, upInfo);
|
||||
str = "HAND";
|
||||
if (dpb)
|
||||
{
|
||||
|
@ -42,6 +42,8 @@
|
||||
#include "../common/classes/ClumpletWriter.h"
|
||||
#include "firebird/Plugin.h"
|
||||
|
||||
static Firebird::MakeUpgradeInfo<> upInfo;
|
||||
|
||||
// Here we use version-independent symbolic link (or copy) of actual database
|
||||
DATABASE database = STATIC FILENAME "security.fdb";
|
||||
|
||||
@ -124,6 +126,8 @@ void FB_CARG SecurityDatabaseManagement::start(Firebird::IStatus* st, ILogonInfo
|
||||
{
|
||||
try
|
||||
{
|
||||
Firebird::MasterInterfacePtr()->upgradeInterface(logonInfo, FB_AUTH_LOGON_INFO_VERSION, upInfo);
|
||||
|
||||
st->init();
|
||||
|
||||
if (secDbKey == INIT_KEY)
|
||||
@ -310,6 +314,8 @@ int FB_CARG SecurityDatabaseManagement::execute(Firebird::IStatus* st, IUser* us
|
||||
|
||||
try
|
||||
{
|
||||
Firebird::MasterInterfacePtr()->upgradeInterface(user, FB_AUTH_USER_VERSION, upInfo);
|
||||
|
||||
ISC_STATUS_ARRAY isc_status;
|
||||
fb_utils::init_status(isc_status);
|
||||
st->init();
|
||||
@ -668,12 +674,11 @@ int FB_CARG SecurityDatabaseManagement::execute(Firebird::IStatus* st, IUser* us
|
||||
|
||||
// register plugin
|
||||
static Firebird::SimpleFactory<Auth::SecurityDatabaseManagement> factory;
|
||||
static Firebird::UnloadDetector unloadDetector;
|
||||
|
||||
extern "C" void FB_PLUGIN_ENTRY_POINT(Firebird::IMaster* master)
|
||||
{
|
||||
Firebird::PluginManagerInterfacePtr pi(master);
|
||||
|
||||
pi->registerPluginFactory(Firebird::PluginType::AuthUserManagement, "Legacy_Auth", &factory);
|
||||
pi->registerModule(&unloadDetector);
|
||||
pi->registerModule(&Firebird::myModule);
|
||||
}
|
||||
|
@ -49,6 +49,8 @@ using namespace Firebird;
|
||||
|
||||
namespace {
|
||||
|
||||
MakeUpgradeInfo<> upInfo;
|
||||
|
||||
// BLR to search database for user name record
|
||||
|
||||
const UCHAR PWD_REQUEST[] =
|
||||
@ -367,6 +369,7 @@ Result SecurityDatabase::verify(IWriter* authBlock, ClumpletReader& originalDpb)
|
||||
}
|
||||
}
|
||||
|
||||
MasterInterfacePtr()->upgradeInterface(authBlock, FB_AUTH_WRITER_VERSION, upInfo);
|
||||
authBlock->add(login.c_str(), "SecDB", secureDbName);
|
||||
return AUTH_SUCCESS;
|
||||
}
|
||||
@ -517,7 +520,7 @@ Result SecurityDatabaseServer::startAuthentication(Firebird::IStatus* status,
|
||||
|
||||
ClumpletReader rdr(isService ? ClumpletReader::spbList : ClumpletReader::dpbList, dpb, dpbSize);
|
||||
Result rc = instance->verify(writerInterface, rdr);
|
||||
Firebird::TimerInterfacePtr()->start(instance, 10 * 1000 * 1000);
|
||||
TimerInterfacePtr()->start(instance, 10 * 1000 * 1000);
|
||||
return rc;
|
||||
}
|
||||
catch (const Firebird::Exception& ex)
|
||||
|
@ -69,6 +69,8 @@ namespace
|
||||
*data = name;
|
||||
*dataSize = strlen(name);
|
||||
}
|
||||
|
||||
MakeUpgradeInfo<> upInfo;
|
||||
}
|
||||
|
||||
namespace Auth {
|
||||
@ -380,6 +382,7 @@ Result WinSspiServer::contAuthentication(Firebird::IStatus* status,
|
||||
bool wheel = false;
|
||||
string login;
|
||||
sspi.getLogin(login, wheel);
|
||||
MasterInterfacePtr()->upgradeInterface(writerInterface, FB_AUTH_WRITER_VERSION, upInfo);
|
||||
writerInterface->add(login.c_str(), "WIN_SSPI", "");
|
||||
if (wheel)
|
||||
{
|
||||
@ -417,6 +420,8 @@ Result WinSspiClient::startAuthentication(Firebird::IStatus* status,
|
||||
|
||||
if (dpb)
|
||||
{
|
||||
MasterInterfacePtr()->upgradeInterface(dpb, FB_AUTH_DPB_READER_VERSION, upInfo);
|
||||
|
||||
UCHAR tag = isService ? isc_spb_trusted_role : isc_dpb_trusted_role;
|
||||
while (dpb->find(tag))
|
||||
{
|
||||
|
@ -34,36 +34,27 @@
|
||||
|
||||
namespace Firebird {
|
||||
|
||||
// Default replacement for missing virtual functions
|
||||
class DefaultMissingEntrypoint
|
||||
{
|
||||
public:
|
||||
virtual void FB_CARG noEntrypoint()
|
||||
{
|
||||
Arg::Gds(isc_wish_list).raise();
|
||||
}
|
||||
};
|
||||
|
||||
// Template to help with loop in the set of plugins
|
||||
template <typename P, typename M = DefaultMissingEntrypoint>
|
||||
template <typename P>
|
||||
class GetPlugins
|
||||
{
|
||||
public:
|
||||
GetPlugins(unsigned int interfaceType, unsigned int desiredVersion, const char* namesList = NULL)
|
||||
: masterInterface(), pluginInterface(masterInterface), missing(),
|
||||
GetPlugins(unsigned int interfaceType, unsigned int desiredVersion,
|
||||
UpgradeInfo* ui, const char* namesList = NULL)
|
||||
: masterInterface(), pluginInterface(masterInterface),
|
||||
pluginSet(pluginInterface->getPlugins(interfaceType, namesList ? namesList : Config::getPlugins(interfaceType),
|
||||
desiredVersion, &missing, NULL)),
|
||||
desiredVersion, ui, NULL)),
|
||||
currentPlugin(NULL)
|
||||
{
|
||||
pluginSet->release();
|
||||
getPlugin();
|
||||
}
|
||||
|
||||
GetPlugins(unsigned int interfaceType, unsigned int desiredVersion,
|
||||
GetPlugins(unsigned int interfaceType, unsigned int desiredVersion, UpgradeInfo* ui,
|
||||
Config* knownConfig, const char* namesList = NULL)
|
||||
: masterInterface(), pluginInterface(masterInterface), missing(),
|
||||
: masterInterface(), pluginInterface(masterInterface),
|
||||
pluginSet(pluginInterface->getPlugins(interfaceType, namesList ? namesList : Config::getPlugins(interfaceType),
|
||||
desiredVersion, &missing, new FirebirdConf(knownConfig))),
|
||||
desiredVersion, ui, new FirebirdConf(knownConfig))),
|
||||
currentPlugin(NULL)
|
||||
{
|
||||
pluginSet->release();
|
||||
@ -124,7 +115,6 @@ public:
|
||||
private:
|
||||
MasterInterfacePtr masterInterface;
|
||||
PluginManagerInterfacePtr pluginInterface;
|
||||
M missing;
|
||||
RefPtr<IPluginSet> pluginSet;
|
||||
P* currentPlugin;
|
||||
|
||||
|
34
src/common/classes/ImplementHelper.cpp
Normal file
34
src/common/classes/ImplementHelper.cpp
Normal file
@ -0,0 +1,34 @@
|
||||
/*
|
||||
* PROGRAM: Firebird interface.
|
||||
* MODULE: ImplementHelper.cpp
|
||||
* 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");
|
||||
* you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
* http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
|
||||
*
|
||||
* Software distributed under the License is distributed AS IS,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing rights
|
||||
* and limitations under the License.
|
||||
*
|
||||
* The Original Code was created by Alex Peshkov
|
||||
* for the Firebird Open Source RDBMS project.
|
||||
*
|
||||
* Copyright (c) 2010 Alex Peshkov <peshkoff at mail.ru>
|
||||
* and all contributors signed below.
|
||||
*
|
||||
* All Rights Reserved.
|
||||
* Contributor(s): ______________________________________.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#include "../common/classes/ImplementHelper.h"
|
||||
|
||||
namespace Firebird
|
||||
{
|
||||
UnloadDetector myModule;
|
||||
}
|
@ -71,6 +71,8 @@ public:
|
||||
return V;
|
||||
}
|
||||
|
||||
IPluginModule* getModule();
|
||||
|
||||
private:
|
||||
VersionedIface(const VersionedIface&);
|
||||
VersionedIface& operator=(const VersionedIface&);
|
||||
@ -249,7 +251,10 @@ public:
|
||||
if (flagOsUnload)
|
||||
{
|
||||
PluginManagerInterfacePtr pi;
|
||||
pi->unregisterModule(this);
|
||||
if (pi)
|
||||
{
|
||||
pi->unregisterModule(this);
|
||||
}
|
||||
|
||||
doClean();
|
||||
}
|
||||
@ -282,6 +287,44 @@ private:
|
||||
};
|
||||
|
||||
typedef GlobalPtr<UnloadDetectorHelper, InstanceControl::PRIORITY_DETECT_UNLOAD> UnloadDetector;
|
||||
extern UnloadDetector myModule;
|
||||
|
||||
template <class C, int V> IPluginModule* VersionedIface<C, V>::getModule()
|
||||
{
|
||||
return &myModule;
|
||||
}
|
||||
|
||||
|
||||
// Default replacement for missing virtual functions
|
||||
class DefaultMissingEntrypoint
|
||||
{
|
||||
public:
|
||||
virtual void FB_CARG noEntrypoint()
|
||||
{
|
||||
Arg::Gds(isc_wish_list).raise();
|
||||
}
|
||||
};
|
||||
|
||||
// Helps to create update information
|
||||
template <typename M = DefaultMissingEntrypoint>
|
||||
class MakeUpgradeInfo
|
||||
{
|
||||
public:
|
||||
MakeUpgradeInfo()
|
||||
{
|
||||
ui.missingFunctionClass = &missing;
|
||||
ui.clientModule = &myModule;
|
||||
}
|
||||
|
||||
operator UpgradeInfo*()
|
||||
{
|
||||
return &ui;
|
||||
}
|
||||
|
||||
private:
|
||||
M missing;
|
||||
struct UpgradeInfo ui;
|
||||
};
|
||||
|
||||
|
||||
class InternalMessageBuffer : public FbMessage
|
||||
|
@ -36,12 +36,14 @@ void raise()
|
||||
(Arg::Gds(isc_random) << "Missing user management plugin").raise();
|
||||
}
|
||||
|
||||
MakeUpgradeInfo<> ui;
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
namespace Auth {
|
||||
|
||||
Get::Get(Config* firebirdConf)
|
||||
: GetPlugins<Auth::IManagement>(PluginType::AuthUserManagement, FB_AUTH_MANAGE_VERSION, firebirdConf)
|
||||
: GetPlugins<Auth::IManagement>(PluginType::AuthUserManagement, FB_AUTH_MANAGE_VERSION, ui, firebirdConf)
|
||||
{
|
||||
if (!hasData())
|
||||
{
|
||||
|
@ -807,7 +807,7 @@ SINT64 query_performance_counter()
|
||||
return counter.QuadPart;
|
||||
#elif defined(HAVE_CLOCK_GETTIME)
|
||||
|
||||
// Use high-resultion clock
|
||||
// Use high-resolution clock
|
||||
struct timespec tp;
|
||||
if (clock_gettime(CLOCK_REALTIME, &tp) != 0)
|
||||
return 0;
|
||||
|
@ -683,6 +683,11 @@ public:
|
||||
return FB_MASTER_VERSION;
|
||||
}
|
||||
|
||||
virtual IPluginModule* FB_CARG getModule()
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
virtual IStatus* FB_CARG getStatus()
|
||||
{
|
||||
fb_assert(false);
|
||||
@ -697,12 +702,12 @@ public:
|
||||
|
||||
virtual IPluginManager* FB_CARG getPluginManager()
|
||||
{
|
||||
fb_assert(false);
|
||||
//fb_assert(false);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
virtual int FB_CARG upgradeInterface(IVersioned* /*toUpgrade*/, int /*desiredVersion*/,
|
||||
void* /*missingFunctionClass*/)
|
||||
struct UpgradeInfo* /*upInfo*/)
|
||||
{
|
||||
fb_assert(false);
|
||||
return 0;
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include "./Plugin.h"
|
||||
#include "./Provider.h"
|
||||
|
||||
#include "firebird.h" //// FIXME:
|
||||
|
||||
namespace Firebird {
|
||||
|
||||
|
@ -39,14 +39,18 @@
|
||||
|
||||
namespace Firebird {
|
||||
|
||||
// Forward declaration - used to identify client and provider of upgraded interface
|
||||
class IPluginModule;
|
||||
|
||||
// Versioned interface - base for all FB interfaces
|
||||
class IVersioned
|
||||
{
|
||||
public:
|
||||
virtual int FB_CARG getVersion() = 0;
|
||||
virtual IPluginModule* getModule() = 0;
|
||||
};
|
||||
// If this is changed, types of all interfaces must be changed
|
||||
#define FB_VERSIONED_VERSION 1
|
||||
#define FB_VERSIONED_VERSION 2
|
||||
|
||||
// Reference counted interface - base for refCounted FB interfaces
|
||||
class IRefCounted : public IVersioned
|
||||
@ -89,6 +93,12 @@ class IAttachment;
|
||||
class ITransaction;
|
||||
class IDtc;
|
||||
|
||||
struct UpgradeInfo
|
||||
{
|
||||
void* missingFunctionClass;
|
||||
IPluginModule* clientModule;
|
||||
};
|
||||
|
||||
// Master interface is used to access almost all other interfaces.
|
||||
class IMaster : public IVersioned
|
||||
{
|
||||
@ -96,7 +106,8 @@ public:
|
||||
virtual IStatus* FB_CARG getStatus() = 0;
|
||||
virtual IProvider* FB_CARG getDispatcher() = 0;
|
||||
virtual IPluginManager* FB_CARG getPluginManager() = 0;
|
||||
virtual int FB_CARG upgradeInterface(IVersioned* toUpgrade, int desiredVersion, void* missingFunctionClass) = 0;
|
||||
virtual int FB_CARG upgradeInterface(IVersioned* toUpgrade, int desiredVersion,
|
||||
struct UpgradeInfo* upgradeInfo) = 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;
|
||||
|
@ -187,7 +187,7 @@ public:
|
||||
// If caller already has an interface for firebird.conf, it may be passed here
|
||||
// If parameter is missing, plugins will get access to default (non database specific) config
|
||||
virtual IPluginSet* FB_CARG getPlugins(unsigned int interfaceType, const char* namesList,
|
||||
int desiredVersion, void* missingFunctionClass,
|
||||
int desiredVersion, UpgradeInfo* ui,
|
||||
IFirebirdConf* firebirdConf) = 0;
|
||||
// Get generic config interface for given file
|
||||
virtual IConfig* FB_CARG getConfig(const char* filename) = 0;
|
||||
|
@ -29,7 +29,6 @@
|
||||
#ifndef FB_PROVIDER_INTERFACE
|
||||
#define FB_PROVIDER_INTERFACE
|
||||
|
||||
#include "firebird.h" //// FIXME:
|
||||
#include "./Plugin.h"
|
||||
|
||||
namespace Firebird {
|
||||
|
@ -726,6 +726,7 @@ static const struct {
|
||||
{"cannot_copy_stmt", 335545022},
|
||||
{"invalid_boolean_usage", 335545023},
|
||||
{"sysf_argscant_both_be_zero", 335545024},
|
||||
{"spb_no_id", 335545025},
|
||||
{"gfix_db_name", 335740929},
|
||||
{"gfix_invalid_sw", 335740930},
|
||||
{"gfix_incmp_sw", 335740932},
|
||||
|
@ -760,6 +760,7 @@ const ISC_STATUS isc_bad_events_handle = 335545021L;
|
||||
const ISC_STATUS isc_cannot_copy_stmt = 335545022L;
|
||||
const ISC_STATUS isc_invalid_boolean_usage = 335545023L;
|
||||
const ISC_STATUS isc_sysf_argscant_both_be_zero = 335545024L;
|
||||
const ISC_STATUS isc_spb_no_id = 335545025L;
|
||||
const ISC_STATUS isc_gfix_db_name = 335740929L;
|
||||
const ISC_STATUS isc_gfix_invalid_sw = 335740930L;
|
||||
const ISC_STATUS isc_gfix_incmp_sw = 335740932L;
|
||||
@ -1179,7 +1180,7 @@ const ISC_STATUS isc_trace_switch_user_only = 337182757L;
|
||||
const ISC_STATUS isc_trace_switch_param_miss = 337182758L;
|
||||
const ISC_STATUS isc_trace_param_act_notcompat = 337182759L;
|
||||
const ISC_STATUS isc_trace_mandatory_switch_miss = 337182760L;
|
||||
const ISC_STATUS isc_err_max = 1123;
|
||||
const ISC_STATUS isc_err_max = 1124;
|
||||
|
||||
#else /* c definitions */
|
||||
|
||||
@ -1909,6 +1910,7 @@ const ISC_STATUS isc_err_max = 1123;
|
||||
#define isc_cannot_copy_stmt 335545022L
|
||||
#define isc_invalid_boolean_usage 335545023L
|
||||
#define isc_sysf_argscant_both_be_zero 335545024L
|
||||
#define isc_spb_no_id 335545025L
|
||||
#define isc_gfix_db_name 335740929L
|
||||
#define isc_gfix_invalid_sw 335740930L
|
||||
#define isc_gfix_incmp_sw 335740932L
|
||||
@ -2328,7 +2330,7 @@ const ISC_STATUS isc_err_max = 1123;
|
||||
#define isc_trace_switch_param_miss 337182758L
|
||||
#define isc_trace_param_act_notcompat 337182759L
|
||||
#define isc_trace_mandatory_switch_miss 337182760L
|
||||
#define isc_err_max 1123
|
||||
#define isc_err_max 1124
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -729,6 +729,7 @@ Data source : @4"}, /* eds_statement */
|
||||
{335545022, "Cannot copy statement @1"}, /* cannot_copy_stmt */
|
||||
{335545023, "Invalid usage of boolean expression"}, /* invalid_boolean_usage */
|
||||
{335545024, "Arguments for @1 cannot both be zero"}, /* sysf_argscant_both_be_zero */
|
||||
{335545025, "missing service ID in spb"}, /* spb_no_id */
|
||||
{335740929, "data base file name (@1) already given"}, /* gfix_db_name */
|
||||
{335740930, "invalid switch @1"}, /* gfix_invalid_sw */
|
||||
{335740932, "incompatible switch combination"}, /* gfix_incmp_sw */
|
||||
|
@ -725,6 +725,7 @@ static const struct {
|
||||
{335545022, -104}, /* 702 cannot_copy_stmt */
|
||||
{335545023, -104}, /* 703 invalid_boolean_usage */
|
||||
{335545024, -833}, /* 704 sysf_argscant_both_be_zero */
|
||||
{335545025, -901}, /* 705 spb_no_id */
|
||||
{335740929, -901}, /* 1 gfix_db_name */
|
||||
{335740930, -901}, /* 2 gfix_invalid_sw */
|
||||
{335740932, -901}, /* 4 gfix_incmp_sw */
|
||||
|
@ -725,6 +725,7 @@ static const struct {
|
||||
{335545022, "XX000"}, // 702 cannot_copy_stmt
|
||||
{335545023, "22000"}, // 703 invalid_boolean_usage
|
||||
{335545024, "42000"}, // 704 sysf_argscant_both_be_zero
|
||||
{335545025, "HY000"}, // 705 spb_no_id
|
||||
{335740929, "00000"}, // 1 gfix_db_name
|
||||
{335740930, "00000"}, // 2 gfix_invalid_sw
|
||||
{335740932, "00000"}, // 4 gfix_incmp_sw
|
||||
|
@ -58,6 +58,7 @@ using namespace Firebird;
|
||||
|
||||
namespace Jrd {
|
||||
|
||||
MakeUpgradeInfo<> upInfo;
|
||||
|
||||
template <typename T> class ExtEngineManager::ContextManager
|
||||
{
|
||||
@ -826,7 +827,7 @@ ExternalEngine* ExtEngineManager::getEngine(thread_db* tdbb, const MetaName& nam
|
||||
if (!engines.get(name, engine))
|
||||
{
|
||||
GetPlugins<ExternalEngine> engineControl(PluginType::ExternalEngine,
|
||||
FB_EXTERNAL_ENGINE_VERSION, name.c_str());
|
||||
FB_EXTERNAL_ENGINE_VERSION, upInfo, name.c_str());
|
||||
|
||||
if (engineControl.hasData())
|
||||
{
|
||||
|
@ -36,6 +36,7 @@
|
||||
using namespace Jrd;
|
||||
using namespace Firebird;
|
||||
|
||||
static MakeUpgradeInfo<> upInfo;
|
||||
|
||||
const Format* UsersTableScan::getFormat(thread_db* tdbb, jrd_rel* relation) const
|
||||
{
|
||||
@ -212,6 +213,7 @@ void UserManagement::execute(USHORT id)
|
||||
|
||||
void UserManagement::Display::list(Auth::IUser* u)
|
||||
{
|
||||
MasterInterfacePtr()->upgradeInterface(u, FB_AUTH_USER_VERSION, upInfo);
|
||||
userManagement->list(u);
|
||||
}
|
||||
|
||||
|
@ -296,8 +296,6 @@ int JProvider::release()
|
||||
}
|
||||
|
||||
|
||||
static UnloadDetector unloadDetector;
|
||||
|
||||
static void shutdownBeforeUnload()
|
||||
{
|
||||
LocalStatus status;
|
||||
@ -310,7 +308,7 @@ public:
|
||||
// IPluginFactory implementation
|
||||
IPluginBase* FB_CARG createPlugin(IPluginConfig* factoryParameter)
|
||||
{
|
||||
if (unloadDetector->unloadStarted())
|
||||
if (myModule->unloadStarted())
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@ -325,9 +323,9 @@ static Static<EngineFactory> engineFactory;
|
||||
|
||||
void registerEngine(IPluginManager* iPlugin)
|
||||
{
|
||||
unloadDetector->setCleanup(shutdownBeforeUnload);
|
||||
myModule->setCleanup(shutdownBeforeUnload);
|
||||
iPlugin->registerPluginFactory(PluginType::Provider, "Engine12", &engineFactory);
|
||||
iPlugin->registerModule(&unloadDetector);
|
||||
iPlugin->registerModule(&myModule);
|
||||
}
|
||||
|
||||
} // namespace Jrd
|
||||
|
@ -1890,6 +1890,10 @@ void Service::start(USHORT spb_length, const UCHAR* spb_data)
|
||||
ClumpletReader spb(ClumpletReader::SpbStart, spb_data, spb_length);
|
||||
|
||||
// The name of the service is the first element of the buffer
|
||||
if (spb.isEof())
|
||||
{
|
||||
status_exception::raise(Arg::Gds(isc_service_att_err) << Arg::Gds(isc_spb_no_id));
|
||||
}
|
||||
const UCHAR svc_id = spb.getClumpTag();
|
||||
const serv_entry* serv;
|
||||
for (serv = services; serv->serv_action; serv++)
|
||||
|
@ -64,6 +64,9 @@ namespace
|
||||
return 1;
|
||||
}
|
||||
};
|
||||
|
||||
MakeUpgradeInfo<IgnoreMissing> upgradePlugin;
|
||||
MakeUpgradeInfo<> upgradeFactory;
|
||||
}
|
||||
|
||||
namespace Jrd {
|
||||
@ -156,7 +159,7 @@ void TraceManager::load_plugins()
|
||||
init_factories = true;
|
||||
|
||||
factories = FB_NEW(*getDefaultMemoryPool()) TraceManager::Factories(*getDefaultMemoryPool());
|
||||
for (GetPlugins<TraceFactory, IgnoreMissing> traceItr(PluginType::Trace, FB_TRACE_PLUGIN_VERSION);
|
||||
for (GetPlugins<TraceFactory> traceItr(PluginType::Trace, FB_TRACE_FACTORY_VERSION, upgradeFactory);
|
||||
traceItr.hasData(); traceItr.next())
|
||||
{
|
||||
FactoryInfo info;
|
||||
@ -259,6 +262,8 @@ void TraceManager::update_session(const TraceSession& session)
|
||||
}
|
||||
}
|
||||
|
||||
MasterInterfacePtr master;
|
||||
|
||||
for (FactoryInfo* info = factories->begin(); info != factories->end(); ++info)
|
||||
{
|
||||
TraceInitInfoImpl attachInfo(session, attachment, filename);
|
||||
@ -267,6 +272,8 @@ void TraceManager::update_session(const TraceSession& session)
|
||||
|
||||
if (plugin)
|
||||
{
|
||||
master->upgradeInterface(plugin, FB_TRACE_PLUGIN_VERSION, upgradePlugin);
|
||||
|
||||
plugin->addRef();
|
||||
SessionInfo sesInfo;
|
||||
sesInfo.plugin = plugin;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/* MAX_NUMBER is the next number to be used, always one more than the highest message number. */
|
||||
set bulk_insert INSERT INTO FACILITIES (LAST_CHANGE, FACILITY, FAC_CODE, MAX_NUMBER) VALUES (?, ?, ?, ?);
|
||||
--
|
||||
('2011-02-02 12:45:00', 'JRD', 0, 705)
|
||||
('2011-06-10 16:23:31', 'JRD', 0, 706)
|
||||
('2010-03-15 06:59:09', 'QLI', 1, 531)
|
||||
--
|
||||
--('2008-11-28 20:27:04', 'GDEF', 2, 346)
|
||||
|
@ -812,6 +812,7 @@ Data source : @4', NULL, NULL)
|
||||
('cannot_copy_stmt', NULL, NULL, NULL, 0, 702, NULL, 'Cannot copy statement @1', NULL, NULL);
|
||||
('invalid_boolean_usage', NULL, NULL, NULL, 0, 703, NULL, 'Invalid usage of boolean expression', NULL, NULL);
|
||||
('sysf_argscant_both_be_zero', 'evlAtan2', 'SysFunction.cpp', NULL, 0, 704, NULL, 'Arguments for @1 cannot both be zero', NULL, NULL)
|
||||
('spb_no_id', 'Service::start', 'svc.c', NULL, 0, 705, NULL, 'missing service ID in spb', NULL, NULL);
|
||||
-- QLI
|
||||
(NULL, NULL, NULL, NULL, 1, 0, NULL, 'expected type', NULL, NULL);
|
||||
(NULL, NULL, NULL, NULL, 1, 1, NULL, 'bad block type', NULL, NULL);
|
||||
|
@ -710,6 +710,7 @@ set bulk_insert INSERT INTO SYSTEM_ERRORS (SQL_CODE, SQL_CLASS, SQL_SUBCLASS, FA
|
||||
(-104, 'XX', '000', 0, 702, 'cannot_copy_stmt', NULL, NULL)
|
||||
(-104, '22', '000', 0, 703, 'invalid_boolean_usage', NULL, NULL)
|
||||
(-833, '42', '000', 0, 704, 'sysf_argscant_both_be_zero', NULL, NULL)
|
||||
(-901, 'HY', '000', 0, 705, 'spb_no_id', NULL, NULL)
|
||||
-- GFIX
|
||||
(-901, '00', '000', 3, 1, 'gfix_db_name', NULL, NULL)
|
||||
(-901, '00', '000', 3, 2, 'gfix_invalid_sw', NULL, NULL)
|
||||
|
@ -754,13 +754,12 @@ public:
|
||||
class ExternalEngineFactoryImpl : public SimpleFactory<Engine>
|
||||
{
|
||||
} factory;
|
||||
static Firebird::UnloadDetector unloadDetector;
|
||||
|
||||
extern "C" void FB_PLUGIN_ENTRY_POINT(Firebird::IMaster* master)
|
||||
{
|
||||
PluginManagerInterfacePtr pi;
|
||||
pi->registerPluginFactory(PluginType::ExternalEngine, "UDR", &factory);
|
||||
pi->registerModule(&unloadDetector);
|
||||
pi->registerModule(&myModule);
|
||||
|
||||
libraryName->assign("fbclient");
|
||||
ModuleLoader::doctorModuleExtension(libraryName);
|
||||
|
@ -5779,6 +5779,7 @@ static void info(IStatus* status,
|
||||
response->p_resp_data = temp;
|
||||
}
|
||||
|
||||
static MakeUpgradeInfo<> upInfo;
|
||||
|
||||
static void init(IStatus* status,
|
||||
rem_port* port,
|
||||
@ -5808,7 +5809,7 @@ static void init(IStatus* status,
|
||||
// Let plugins try to add data to DPB in order to avoid extra network roundtrip
|
||||
Auth::DpbImplementation di(dpb);
|
||||
LocalStatus s;
|
||||
GetPlugins<Auth::IClient> authItr(PluginType::AuthClient, FB_AUTH_CLIENT_VERSION);
|
||||
GetPlugins<Auth::IClient> authItr(PluginType::AuthClient, FB_AUTH_CLIENT_VERSION, upInfo);
|
||||
|
||||
bool working = true;
|
||||
|
||||
|
@ -217,6 +217,8 @@ public:
|
||||
GlobalPtr<FailedLogins> usernameFailedLogins;
|
||||
GlobalPtr<FailedLogins> remoteFailedLogins;
|
||||
|
||||
MakeUpgradeInfo<> upInfo;
|
||||
|
||||
// delayed authentication block for auth callback
|
||||
class ServerAuth : public GlobalStorage, public ServerAuthBase
|
||||
{
|
||||
@ -231,7 +233,7 @@ public:
|
||||
wrt(getPool(), op == op_service_attach ? ClumpletReader::spbList : ClumpletReader::dpbList,
|
||||
MAX_DPB_SIZE, pb, pbLen),
|
||||
authBlockInterface(op == op_service_attach),
|
||||
authItr(PluginType::AuthServer, FB_AUTH_SERVER_VERSION, config),
|
||||
authItr(PluginType::AuthServer, FB_AUTH_SERVER_VERSION, upInfo, config),
|
||||
remoteId(getPool()), userName(getPool()), authServer(NULL),
|
||||
part2(p2), operation(op)
|
||||
{
|
||||
|
@ -38,12 +38,14 @@
|
||||
#include "../../common/os/path_utils.h"
|
||||
#include "../../jrd/inf_pub.h"
|
||||
#include "../../dsql/sqlda_pub.h"
|
||||
#include "../common/classes/ImplementHelper.h"
|
||||
|
||||
|
||||
using namespace Firebird;
|
||||
using namespace Jrd;
|
||||
|
||||
static const char* const DEFAULT_LOG_NAME = "default_trace.log";
|
||||
static MakeUpgradeInfo<> upInfo;
|
||||
|
||||
#ifdef WIN_NT
|
||||
#define NEWLINE "\r\n"
|
||||
@ -89,6 +91,7 @@ TracePluginImpl::TracePluginImpl(const TracePluginConfig &configuration, TraceIn
|
||||
services(getDefaultMemoryPool()),
|
||||
unicodeCollation(*getDefaultMemoryPool())
|
||||
{
|
||||
MasterInterfacePtr()->upgradeInterface(logWriter, FB_TRACE_LOG_WRITER_VERSION, upInfo);
|
||||
const char* ses_name = initInfo->getTraceSessionName();
|
||||
session_name = ses_name && *ses_name ? ses_name : " ";
|
||||
|
||||
@ -1937,6 +1940,8 @@ ntrace_boolean_t TracePluginImpl::trace_attach(TraceConnection* connection,
|
||||
{
|
||||
try
|
||||
{
|
||||
MasterInterfacePtr()->upgradeInterface(connection, FB_TRACE_CONNECTION_VERSION, upInfo);
|
||||
|
||||
log_event_attach(connection, create_db, att_result);
|
||||
return true;
|
||||
}
|
||||
@ -1951,6 +1956,8 @@ ntrace_boolean_t TracePluginImpl::trace_detach(TraceConnection* connection, ntra
|
||||
{
|
||||
try
|
||||
{
|
||||
MasterInterfacePtr()->upgradeInterface(connection, FB_TRACE_CONNECTION_VERSION, upInfo);
|
||||
|
||||
log_event_detach(connection, drop_db);
|
||||
return true;
|
||||
}
|
||||
@ -1967,6 +1974,10 @@ ntrace_boolean_t TracePluginImpl::trace_transaction_start(TraceConnection* conne
|
||||
{
|
||||
try
|
||||
{
|
||||
MasterInterfacePtr master;
|
||||
master->upgradeInterface(connection, FB_TRACE_CONNECTION_VERSION, upInfo);
|
||||
master->upgradeInterface(transaction, FB_TRACE_TRANSACTION_VERSION, upInfo);
|
||||
|
||||
log_event_transaction_start(connection, transaction, tpb_length, tpb, tra_result);
|
||||
return true;
|
||||
}
|
||||
@ -1982,6 +1993,10 @@ ntrace_boolean_t TracePluginImpl::trace_transaction_end(TraceConnection* connect
|
||||
{
|
||||
try
|
||||
{
|
||||
MasterInterfacePtr master;
|
||||
master->upgradeInterface(connection, FB_TRACE_CONNECTION_VERSION, upInfo);
|
||||
master->upgradeInterface(transaction, FB_TRACE_TRANSACTION_VERSION, upInfo);
|
||||
|
||||
log_event_transaction_end(connection, transaction, commit, retain_context, tra_result);
|
||||
return true;
|
||||
}
|
||||
@ -1998,6 +2013,11 @@ ntrace_boolean_t TracePluginImpl::trace_set_context(TraceConnection* connection,
|
||||
{
|
||||
try
|
||||
{
|
||||
MasterInterfacePtr master;
|
||||
master->upgradeInterface(connection, FB_TRACE_CONNECTION_VERSION, upInfo);
|
||||
master->upgradeInterface(transaction, FB_TRACE_TRANSACTION_VERSION, upInfo);
|
||||
master->upgradeInterface(variable, FB_TRACE_CONTEXT_VARIABLE_VERSION, upInfo);
|
||||
|
||||
log_event_set_context(connection, transaction, variable);
|
||||
return true;
|
||||
}
|
||||
@ -2015,6 +2035,11 @@ ntrace_boolean_t TracePluginImpl::trace_proc_execute(TraceConnection* connection
|
||||
{
|
||||
try
|
||||
{
|
||||
MasterInterfacePtr master;
|
||||
master->upgradeInterface(connection, FB_TRACE_CONNECTION_VERSION, upInfo);
|
||||
master->upgradeInterface(transaction, FB_TRACE_TRANSACTION_VERSION, upInfo);
|
||||
master->upgradeInterface(procedure, FB_TRACE_PROCEDURE_VERSION, upInfo);
|
||||
|
||||
log_event_proc_execute(connection, transaction, procedure, started, proc_result);
|
||||
return true;
|
||||
}
|
||||
@ -2031,6 +2056,11 @@ ntrace_boolean_t TracePluginImpl::trace_trigger_execute(TraceConnection* connect
|
||||
{
|
||||
try
|
||||
{
|
||||
MasterInterfacePtr master;
|
||||
master->upgradeInterface(connection, FB_TRACE_CONNECTION_VERSION, upInfo);
|
||||
master->upgradeInterface(transaction, FB_TRACE_TRANSACTION_VERSION, upInfo);
|
||||
master->upgradeInterface(trigger, FB_TRACE_TRIGGER_VERSION, upInfo);
|
||||
|
||||
log_event_trigger_execute(connection, transaction, trigger, started, trig_result);
|
||||
return true;
|
||||
}
|
||||
@ -2048,6 +2078,11 @@ ntrace_boolean_t TracePluginImpl::trace_dsql_prepare(TraceConnection* connection
|
||||
{
|
||||
try
|
||||
{
|
||||
MasterInterfacePtr master;
|
||||
master->upgradeInterface(connection, FB_TRACE_CONNECTION_VERSION, upInfo);
|
||||
master->upgradeInterface(transaction, FB_TRACE_TRANSACTION_VERSION, upInfo);
|
||||
master->upgradeInterface(statement, FB_TRACE_SQL_STATEMENT_VERSION, upInfo);
|
||||
|
||||
log_event_dsql_prepare(connection, transaction, statement, time_millis, req_result);
|
||||
return true;
|
||||
}
|
||||
@ -2063,6 +2098,10 @@ ntrace_boolean_t TracePluginImpl::trace_dsql_free(TraceConnection* connection,
|
||||
{
|
||||
try
|
||||
{
|
||||
MasterInterfacePtr master;
|
||||
master->upgradeInterface(connection, FB_TRACE_CONNECTION_VERSION, upInfo);
|
||||
master->upgradeInterface(statement, FB_TRACE_SQL_STATEMENT_VERSION, upInfo);
|
||||
|
||||
log_event_dsql_free(connection, statement, option);
|
||||
return true;
|
||||
}
|
||||
@ -2079,6 +2118,11 @@ ntrace_boolean_t TracePluginImpl::trace_dsql_execute(TraceConnection* connection
|
||||
{
|
||||
try
|
||||
{
|
||||
MasterInterfacePtr master;
|
||||
master->upgradeInterface(connection, FB_TRACE_CONNECTION_VERSION, upInfo);
|
||||
master->upgradeInterface(transaction, FB_TRACE_TRANSACTION_VERSION, upInfo);
|
||||
master->upgradeInterface(statement, FB_TRACE_SQL_STATEMENT_VERSION, upInfo);
|
||||
|
||||
log_event_dsql_execute(connection, transaction, statement, started, req_result);
|
||||
return true;
|
||||
}
|
||||
@ -2096,6 +2140,11 @@ ntrace_boolean_t TracePluginImpl::trace_blr_compile(TraceConnection* connection,
|
||||
{
|
||||
try
|
||||
{
|
||||
MasterInterfacePtr master;
|
||||
master->upgradeInterface(connection, FB_TRACE_CONNECTION_VERSION, upInfo);
|
||||
master->upgradeInterface(transaction, FB_TRACE_TRANSACTION_VERSION, upInfo);
|
||||
master->upgradeInterface(statement, FB_TRACE_BLR_STATEMENT_VERSION, upInfo);
|
||||
|
||||
log_event_blr_compile(connection, transaction, statement, time_millis, req_result);
|
||||
return true;
|
||||
}
|
||||
@ -2111,6 +2160,11 @@ ntrace_boolean_t TracePluginImpl::trace_blr_execute(TraceConnection* connection,
|
||||
{
|
||||
try
|
||||
{
|
||||
MasterInterfacePtr master;
|
||||
master->upgradeInterface(connection, FB_TRACE_CONNECTION_VERSION, upInfo);
|
||||
master->upgradeInterface(transaction, FB_TRACE_TRANSACTION_VERSION, upInfo);
|
||||
master->upgradeInterface(statement, FB_TRACE_BLR_STATEMENT_VERSION, upInfo);
|
||||
|
||||
log_event_blr_execute(connection, transaction, statement, req_result);
|
||||
return true;
|
||||
}
|
||||
@ -2127,6 +2181,11 @@ ntrace_boolean_t TracePluginImpl::trace_dyn_execute(TraceConnection* connection,
|
||||
{
|
||||
try
|
||||
{
|
||||
MasterInterfacePtr master;
|
||||
master->upgradeInterface(connection, FB_TRACE_CONNECTION_VERSION, upInfo);
|
||||
master->upgradeInterface(transaction, FB_TRACE_TRANSACTION_VERSION, upInfo);
|
||||
master->upgradeInterface(request, FB_TRACE_DYN_REQUEST_VERSION, upInfo);
|
||||
|
||||
log_event_dyn_execute(connection, transaction, request, time_millis, req_result);
|
||||
return true;
|
||||
}
|
||||
@ -2142,6 +2201,7 @@ ntrace_boolean_t TracePluginImpl::trace_service_attach(TraceService* service, nt
|
||||
{
|
||||
try
|
||||
{
|
||||
MasterInterfacePtr()->upgradeInterface(service, FB_TRACE_SERVICE_VERSION, upInfo);
|
||||
log_event_service_attach(service, att_result);
|
||||
return true;
|
||||
}
|
||||
@ -2157,6 +2217,7 @@ ntrace_boolean_t TracePluginImpl::trace_service_start(TraceService* service, siz
|
||||
{
|
||||
try
|
||||
{
|
||||
MasterInterfacePtr()->upgradeInterface(service, FB_TRACE_SERVICE_VERSION, upInfo);
|
||||
log_event_service_start(service, switches_length, switches, start_result);
|
||||
return true;
|
||||
}
|
||||
@ -2173,6 +2234,7 @@ ntrace_boolean_t TracePluginImpl::trace_service_query(TraceService* service, siz
|
||||
{
|
||||
try
|
||||
{
|
||||
MasterInterfacePtr()->upgradeInterface(service, FB_TRACE_SERVICE_VERSION, upInfo);
|
||||
log_event_service_query(service, send_item_length, send_items,
|
||||
recv_item_length, recv_items, query_result);
|
||||
return true;
|
||||
@ -2189,6 +2251,7 @@ ntrace_boolean_t TracePluginImpl::trace_service_detach(TraceService* service, nt
|
||||
{
|
||||
try
|
||||
{
|
||||
MasterInterfacePtr()->upgradeInterface(service, FB_TRACE_SERVICE_VERSION, upInfo);
|
||||
log_event_service_detach(service, detach_result);
|
||||
return true;
|
||||
}
|
||||
|
@ -26,6 +26,8 @@
|
||||
* 2008 Khorsun Vladyslav
|
||||
*/
|
||||
|
||||
#include "../common/classes/ImplementHelper.h"
|
||||
|
||||
#include "TraceConfiguration.h"
|
||||
#include "TracePluginImpl.h"
|
||||
|
||||
@ -51,6 +53,8 @@ int FB_CARG TraceFactoryImpl::release()
|
||||
return 1;
|
||||
}
|
||||
|
||||
static Firebird::MakeUpgradeInfo<> upInfo;
|
||||
|
||||
ntrace_mask_t FB_CARG TraceFactoryImpl::trace_needs()
|
||||
{
|
||||
return (1 << TRACE_EVENT_MAX) - 1;
|
||||
@ -58,9 +62,12 @@ ntrace_mask_t FB_CARG TraceFactoryImpl::trace_needs()
|
||||
|
||||
TracePlugin* FB_CARG TraceFactoryImpl::trace_create(Firebird::IStatus* status, TraceInitInfo* initInfo)
|
||||
{
|
||||
Firebird::MasterInterfacePtr master;
|
||||
const char* dbname = NULL;
|
||||
try
|
||||
{
|
||||
master->upgradeInterface(initInfo, FB_TRACE_INIT_INFO_VERSION, upInfo);
|
||||
|
||||
dbname = initInfo->getDatabaseName();
|
||||
if (!dbname)
|
||||
dbname = "";
|
||||
@ -69,6 +76,11 @@ TracePlugin* FB_CARG TraceFactoryImpl::trace_create(Firebird::IStatus* status, T
|
||||
TraceCfgReader::readTraceConfiguration(initInfo->getConfigText(), dbname, config);
|
||||
|
||||
TraceConnection* connection = initInfo->getConnection();
|
||||
if (connection)
|
||||
{
|
||||
master->upgradeInterface(connection, FB_TRACE_CONNECTION_VERSION, upInfo);
|
||||
}
|
||||
|
||||
if (!config.enabled ||
|
||||
(config.connection_id && connection &&
|
||||
(connection->getConnectionID() != SLONG(config.connection_id))))
|
||||
@ -90,6 +102,7 @@ TracePlugin* FB_CARG TraceFactoryImpl::trace_create(Firebird::IStatus* status, T
|
||||
TraceLogWriter* logWriter = initInfo->getLogWriter();
|
||||
if (logWriter)
|
||||
{
|
||||
master->upgradeInterface(logWriter, FB_TRACE_LOG_WRITER_VERSION, upInfo);
|
||||
const char* strEx = TracePluginImpl::marshal_exception(ex);
|
||||
Firebird::string err;
|
||||
if (dbname)
|
||||
@ -111,12 +124,11 @@ TracePlugin* FB_CARG TraceFactoryImpl::trace_create(Firebird::IStatus* status, T
|
||||
|
||||
|
||||
static Firebird::SimpleFactory<TraceFactoryImpl> traceFactory;
|
||||
static Firebird::UnloadDetector unloadDetector;
|
||||
|
||||
void registerTrace(Firebird::IPluginManager* iPlugin)
|
||||
{
|
||||
iPlugin->registerPluginFactory(Firebird::PluginType::Trace, "fbtrace", &traceFactory);
|
||||
iPlugin->registerModule(&unloadDetector);
|
||||
iPlugin->registerModule(&Firebird::myModule);
|
||||
}
|
||||
|
||||
|
||||
|
@ -30,6 +30,8 @@
|
||||
#include "firebird/Interface.h"
|
||||
#include "firebird/Timer.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "../yvalve/MasterImplementation.h"
|
||||
#include "../common/classes/init.h"
|
||||
#include "../common/StatusHolder.h"
|
||||
@ -113,14 +115,50 @@ namespace
|
||||
FunctionPtr* vTab;
|
||||
};
|
||||
|
||||
typedef Firebird::Pair<Firebird::NonPooled<U_IPTR, FunctionPtr*> > FunctionPair;
|
||||
class UpgradeKey
|
||||
{
|
||||
public:
|
||||
UpgradeKey(FunctionPtr* aFunc, IPluginModule* aModuleA, IPluginModule* aModuleB)
|
||||
: func(aFunc), moduleA(aModuleA), moduleB(aModuleB)
|
||||
{ }
|
||||
|
||||
UpgradeKey(const UpgradeKey& el)
|
||||
: func(el.func), moduleA(el.moduleA), moduleB(el.moduleB)
|
||||
{ }
|
||||
|
||||
UpgradeKey()
|
||||
: func(NULL), moduleA(NULL), moduleB(NULL)
|
||||
{ }
|
||||
|
||||
bool operator<(const UpgradeKey& el) const
|
||||
{
|
||||
return memcmp(this, &el, sizeof(UpgradeKey)) < 0;
|
||||
}
|
||||
|
||||
bool operator>(const UpgradeKey& el) const
|
||||
{
|
||||
return memcmp(this, &el, sizeof(UpgradeKey)) > 0;
|
||||
}
|
||||
|
||||
bool contains(IPluginModule* module)
|
||||
{
|
||||
return moduleA == module || moduleB == module;
|
||||
}
|
||||
|
||||
private:
|
||||
FunctionPtr* func;
|
||||
IPluginModule* moduleA;
|
||||
IPluginModule* moduleB;
|
||||
};
|
||||
|
||||
typedef Firebird::Pair<Firebird::NonPooled<UpgradeKey, FunctionPtr*> > FunctionPair;
|
||||
GlobalPtr<GenericMap<FunctionPair> > functionMap;
|
||||
GlobalPtr<RWLock> mapLock;
|
||||
}
|
||||
|
||||
int FB_CARG MasterImplementation::upgradeInterface(IVersioned* toUpgrade,
|
||||
int desiredVersion,
|
||||
void* missingFunctionClass)
|
||||
struct UpgradeInfo* upgradeInfo)
|
||||
{
|
||||
int existingVersion = toUpgrade->getVersion();
|
||||
|
||||
@ -132,9 +170,11 @@ int FB_CARG MasterImplementation::upgradeInterface(IVersioned* toUpgrade,
|
||||
{
|
||||
CVirtualClass* target = (CVirtualClass*) toUpgrade;
|
||||
|
||||
UpgradeKey key(target->vTab, toUpgrade->getModule(), upgradeInfo->clientModule);
|
||||
|
||||
{ // sync scope
|
||||
ReadLockGuard sync(mapLock);
|
||||
if (functionMap->get((U_IPTR) target->vTab, newTab))
|
||||
if (functionMap->get(key, newTab))
|
||||
{
|
||||
target->vTab = newTab;
|
||||
return 0;
|
||||
@ -143,9 +183,9 @@ int FB_CARG MasterImplementation::upgradeInterface(IVersioned* toUpgrade,
|
||||
|
||||
WriteLockGuard sync(mapLock);
|
||||
|
||||
if (!functionMap->get((U_IPTR) target->vTab, newTab))
|
||||
if (!functionMap->get(key, newTab))
|
||||
{
|
||||
CVirtualClass* miss = (CVirtualClass*) missingFunctionClass;
|
||||
CVirtualClass* miss = (CVirtualClass*) (upgradeInfo->missingFunctionClass);
|
||||
newTab = FB_NEW(*getDefaultMemoryPool()) FunctionPtr[desiredVersion];
|
||||
|
||||
for (int i = 0; i < desiredVersion; ++i)
|
||||
@ -153,7 +193,7 @@ int FB_CARG MasterImplementation::upgradeInterface(IVersioned* toUpgrade,
|
||||
newTab[i] = i < existingVersion ? target->vTab[i] : miss->vTab[0];
|
||||
}
|
||||
|
||||
functionMap->put((U_IPTR) target->vTab, newTab);
|
||||
functionMap->put(key, newTab);
|
||||
}
|
||||
|
||||
target->vTab = newTab;
|
||||
@ -173,6 +213,29 @@ int FB_CARG MasterImplementation::upgradeInterface(IVersioned* toUpgrade,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void releaseUpgradeTabs(IPluginModule* module)
|
||||
{
|
||||
HalfStaticArray<UpgradeKey, 16> removeList;
|
||||
|
||||
WriteLockGuard sync(mapLock);
|
||||
|
||||
GenericMap<FunctionPair>::Accessor scan(&functionMap);
|
||||
if (scan.getFirst()) do
|
||||
{
|
||||
UpgradeKey& cur(scan.current()->first);
|
||||
if (cur.contains(module))
|
||||
{
|
||||
removeList.add(cur);
|
||||
}
|
||||
}
|
||||
while (scan.getNext());
|
||||
|
||||
for(unsigned int i = 0; i < removeList.getCount(); ++i)
|
||||
{
|
||||
functionMap->remove(removeList[i]);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Why
|
||||
|
||||
//
|
||||
@ -415,7 +478,7 @@ void TimerEntry::cleanup()
|
||||
|
||||
TimerDelay curTime()
|
||||
{
|
||||
return fb_utils::query_performance_counter() / fb_utils::query_performance_frequency();
|
||||
return fb_utils::query_performance_counter() / (fb_utils::query_performance_frequency() / 1000000);
|
||||
}
|
||||
|
||||
TimerEntry* getTimer(ITimer* timer)
|
||||
|
@ -57,7 +57,8 @@ namespace Why
|
||||
Firebird::IStatus* FB_CARG getStatus();
|
||||
Firebird::IProvider* FB_CARG getDispatcher();
|
||||
Firebird::IPluginManager* FB_CARG getPluginManager();
|
||||
int FB_CARG upgradeInterface(Firebird::IVersioned* toUpgrade, int desiredVersion, void* missingFunctionClass);
|
||||
int FB_CARG upgradeInterface(Firebird::IVersioned* toUpgrade, int desiredVersion,
|
||||
Firebird::UpgradeInfo* upgradeInfo);
|
||||
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,
|
||||
@ -68,6 +69,7 @@ namespace Why
|
||||
};
|
||||
|
||||
void shutdownTimers();
|
||||
void releaseUpgradeTabs(Firebird::IPluginModule* module);
|
||||
} // namespace Why
|
||||
|
||||
#endif // YVALVE_MASTER_IMPLEMENTATION_H
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "consts_pub.h"
|
||||
#include "iberror.h"
|
||||
#include "../yvalve/PluginManager.h"
|
||||
#include "../yvalve/MasterImplementation.h"
|
||||
|
||||
#include "../dsql/sqlda_pub.h"
|
||||
#include "../yvalve/why_proto.h"
|
||||
@ -344,6 +345,7 @@ namespace
|
||||
if (cleanup)
|
||||
{
|
||||
cleanup->doClean();
|
||||
Why::releaseUpgradeTabs(cleanup);
|
||||
}
|
||||
}
|
||||
|
||||
@ -442,6 +444,11 @@ namespace
|
||||
|
||||
~ConfiguredPlugin();
|
||||
|
||||
const char* getPlugName()
|
||||
{
|
||||
return plugName.c_str();
|
||||
}
|
||||
|
||||
// ITimer implementation
|
||||
void FB_CARG handler()
|
||||
{ }
|
||||
@ -501,6 +508,9 @@ namespace
|
||||
private:
|
||||
~FactoryParameter()
|
||||
{
|
||||
#ifdef DEBUG_PLUGINS
|
||||
fprintf(stderr, "~FactoryParameter places configuredPlugin %s in unload query\n", configuredPlugin->getPlugName());
|
||||
#endif
|
||||
TimerInterfacePtr()->start(configuredPlugin, 1000000); // 1 sec
|
||||
}
|
||||
|
||||
@ -645,10 +655,10 @@ namespace
|
||||
void FB_CARG next();
|
||||
|
||||
PluginSet(unsigned int pinterfaceType, const char* pnamesList,
|
||||
int pdesiredVersion, void* pmissingFunctionClass,
|
||||
int pdesiredVersion, UpgradeInfo* pui,
|
||||
IFirebirdConf* fbConf)
|
||||
: interfaceType(pinterfaceType), namesList(getPool()),
|
||||
desiredVersion(pdesiredVersion), missingFunctionClass(pmissingFunctionClass),
|
||||
desiredVersion(pdesiredVersion), ui(pui),
|
||||
currentName(getPool()), currentPlugin(NULL),
|
||||
firebirdConf(fbConf)
|
||||
{
|
||||
@ -672,7 +682,7 @@ namespace
|
||||
unsigned int interfaceType;
|
||||
PathName namesList;
|
||||
int desiredVersion;
|
||||
void* missingFunctionClass;
|
||||
UpgradeInfo* ui;
|
||||
|
||||
PathName currentName;
|
||||
RefPtr<ConfiguredPlugin> currentPlugin; // Missing data in this field indicates EOF
|
||||
@ -807,7 +817,7 @@ namespace
|
||||
IPluginBase* p = currentPlugin->factory(firebirdConf);
|
||||
if (p)
|
||||
{
|
||||
if (masterInterface->upgradeInterface(p, desiredVersion, missingFunctionClass) >= 0)
|
||||
if (masterInterface->upgradeInterface(p, desiredVersion, ui) >= 0)
|
||||
{
|
||||
return p;
|
||||
}
|
||||
@ -895,13 +905,13 @@ void FB_CARG PluginManager::unregisterModule(IPluginModule* cleanup)
|
||||
}
|
||||
|
||||
IPluginSet* FB_CARG PluginManager::getPlugins(unsigned int interfaceType, const char* namesList,
|
||||
int desiredVersion, void* missingFunctionClass,
|
||||
int desiredVersion, UpgradeInfo* ui,
|
||||
IFirebirdConf* firebirdConf)
|
||||
{
|
||||
MutexLockGuard g(plugins->mutex);
|
||||
|
||||
IPluginSet* rc = new PluginSet(interfaceType, namesList, desiredVersion,
|
||||
missingFunctionClass, firebirdConf);
|
||||
ui, firebirdConf);
|
||||
rc->addRef();
|
||||
return rc;
|
||||
}
|
||||
|
@ -43,14 +43,14 @@ class PluginManager : public AutoIface<IPluginManager, FB_PLUGIN_MANAGER_VERSION
|
||||
public:
|
||||
// IPluginManager implementation
|
||||
IPluginSet* FB_CARG getPlugins(unsigned int interfaceType, const char* namesList,
|
||||
int desiredVersion, void* missingFunctionClass,
|
||||
int desiredVersion, UpgradeInfo* ui,
|
||||
IFirebirdConf* firebirdConf);
|
||||
void FB_CARG registerPluginFactory(unsigned int interfaceType, const char* defaultName,
|
||||
IPluginFactory* factory);
|
||||
IConfig* FB_CARG getConfig(const char* filename);
|
||||
void FB_CARG releasePlugin(IPluginBase* plugin);
|
||||
void FB_CARG registerModule(IPluginModule* cleanup);
|
||||
void FB_CARG unregisterModule(IPluginModule* cleanup);
|
||||
void FB_CARG registerModule(IPluginModule* module);
|
||||
void FB_CARG unregisterModule(IPluginModule* module);
|
||||
|
||||
PluginManager();
|
||||
|
||||
|
@ -117,10 +117,7 @@ template <typename Impl, typename Intf, int Vers>
|
||||
class YHelper : public Firebird::StdPlugin<Intf, Vers>, public YObject
|
||||
{
|
||||
public:
|
||||
YHelper(Intf* aNext) : next(aNext)
|
||||
{
|
||||
this->addRef();
|
||||
}
|
||||
YHelper(Intf* aNext);
|
||||
|
||||
int FB_CARG release()
|
||||
{
|
||||
@ -426,7 +423,7 @@ public:
|
||||
{
|
||||
if (--refCounter == 0)
|
||||
{
|
||||
delete this;
|
||||
//delete this;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -557,10 +557,12 @@ namespace Why
|
||||
public:
|
||||
virtual void FB_CARG noEntrypoint(IStatus* s)
|
||||
{
|
||||
s->set(Arg::Gds(isc_unavailable).value());
|
||||
s->set(Arg::Gds(isc_wish_list).value());
|
||||
}
|
||||
};
|
||||
|
||||
MakeUpgradeInfo<NoEntrypoint> upInfo;
|
||||
|
||||
template <typename T, typename CleanupRoutine> // T = YAttachment or YTransaction
|
||||
class CleanupCallbackImpl : public CleanupCallback
|
||||
{
|
||||
@ -3269,6 +3271,13 @@ ITransaction* MasterImplementation::registerTransaction(IAttachment* attachment,
|
||||
return new YTransaction(static_cast<YAttachment*>(attachment), transaction);
|
||||
}
|
||||
|
||||
template <typename Impl, typename Intf, int Vers>
|
||||
YHelper<Impl, Intf, Vers>::YHelper(Intf* aNext)
|
||||
{
|
||||
MasterInterfacePtr()->upgradeInterface(aNext, Vers, upInfo);
|
||||
next = aNext;
|
||||
this->addRef();
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
|
||||
@ -4640,8 +4649,8 @@ YAttachment* Dispatcher::attachDatabase(IStatus* status, const char* filename,
|
||||
RefPtr<Config> config;
|
||||
ResolveDatabaseAlias(expandedFilename, dummy, &config);
|
||||
|
||||
for (GetPlugins<IProvider, NoEntrypoint> providerIterator(PluginType::Provider,
|
||||
FB_PROVIDER_VERSION, config);
|
||||
for (GetPlugins<IProvider> providerIterator(PluginType::Provider,
|
||||
FB_PROVIDER_VERSION, upInfo, config);
|
||||
providerIterator.hasData();
|
||||
providerIterator.next())
|
||||
{
|
||||
@ -4763,8 +4772,8 @@ YAttachment* Dispatcher::createDatabase(IStatus* status, const char* filename,
|
||||
ResolveDatabaseAlias(expandedFilename, dummy, &config);
|
||||
***/
|
||||
|
||||
for (GetPlugins<IProvider, NoEntrypoint> providerIterator(PluginType::Provider,
|
||||
FB_PROVIDER_VERSION/***, config***/);
|
||||
for (GetPlugins<IProvider> providerIterator(PluginType::Provider,
|
||||
FB_PROVIDER_VERSION, upInfo/***, config***/);
|
||||
providerIterator.hasData();
|
||||
providerIterator.next())
|
||||
{
|
||||
@ -4827,8 +4836,8 @@ YService* Dispatcher::attachServiceManager(IStatus* status, const char* serviceN
|
||||
|
||||
try
|
||||
{
|
||||
for (GetPlugins<IProvider, NoEntrypoint> providerIterator(PluginType::Provider,
|
||||
FB_PROVIDER_VERSION);
|
||||
for (GetPlugins<IProvider> providerIterator(PluginType::Provider,
|
||||
FB_PROVIDER_VERSION, upInfo);
|
||||
providerIterator.hasData();
|
||||
providerIterator.next())
|
||||
{
|
||||
@ -4916,8 +4925,8 @@ void Dispatcher::shutdown(IStatus* userStatus, unsigned int timeout, const int r
|
||||
shutdownStarted = true;
|
||||
|
||||
// Shutdown providers (if any present).
|
||||
for (GetPlugins<IProvider, NoEntrypoint> providerIterator(
|
||||
PluginType::Provider, FB_PROVIDER_VERSION);
|
||||
for (GetPlugins<IProvider> providerIterator(PluginType::Provider,
|
||||
FB_PROVIDER_VERSION, upInfo);
|
||||
providerIterator.hasData();
|
||||
providerIterator.next())
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user