From 83cb29a8de333646c9b3e7ac6909accce72e6b5f Mon Sep 17 00:00:00 2001 From: Bernard Normier Date: Tue, 16 Sep 2003 01:41:46 +0000 Subject: Added Freeze Connection and Transaction --- cpp/src/Freeze/.depend | 23 ++- cpp/src/Freeze/ConnectionI.cpp | 150 ++++++++++++++ cpp/src/Freeze/ConnectionI.h | 139 +++++++++++++ cpp/src/Freeze/EvictorI.cpp | 2 +- cpp/src/Freeze/Makefile | 15 +- cpp/src/Freeze/MapI.cpp | 391 +++++++++++++++++++---------------- cpp/src/Freeze/MapI.h | 47 +++-- cpp/src/Freeze/SharedDb.cpp | 170 +++++++++++++++ cpp/src/Freeze/SharedDb.h | 83 ++++++++ cpp/src/Freeze/SharedDbEnv.h | 4 +- cpp/src/Freeze/TransactionHolder.cpp | 76 +++++++ cpp/src/Freeze/TransactionI.cpp | 103 +++++++++ cpp/src/Freeze/TransactionI.h | 59 ++++++ cpp/src/Freeze/freeze.dsp | 181 +++++++++++++++- cpp/src/IcePack/AdapterRegistryI.cpp | 43 ++-- cpp/src/IcePack/AdapterRegistryI.h | 7 +- cpp/src/IcePack/NodeRegistryI.cpp | 44 ++-- cpp/src/IcePack/NodeRegistryI.h | 6 +- cpp/src/IcePack/ObjectRegistryI.cpp | 6 +- cpp/src/IcePack/ObjectRegistryI.h | 2 + cpp/src/IcePack/ServerRegistryI.cpp | 43 ++-- cpp/src/IcePack/ServerRegistryI.h | 6 +- cpp/src/IceStorm/Service.cpp | 2 +- cpp/src/IceStorm/TopicI.cpp | 5 +- cpp/src/IceStorm/TopicI.h | 1 + cpp/src/IceStorm/TopicManagerI.cpp | 11 +- cpp/src/IceStorm/TopicManagerI.h | 3 + cpp/src/slice2freezej/Main.cpp | 11 +- 28 files changed, 1369 insertions(+), 264 deletions(-) create mode 100644 cpp/src/Freeze/ConnectionI.cpp create mode 100644 cpp/src/Freeze/ConnectionI.h create mode 100644 cpp/src/Freeze/SharedDb.cpp create mode 100644 cpp/src/Freeze/SharedDb.h create mode 100644 cpp/src/Freeze/TransactionHolder.cpp create mode 100644 cpp/src/Freeze/TransactionI.cpp create mode 100644 cpp/src/Freeze/TransactionI.h (limited to 'cpp/src') diff --git a/cpp/src/Freeze/.depend b/cpp/src/Freeze/.depend index 4fe4b3ae900..8cf885ce3db 100644 --- a/cpp/src/Freeze/.depend +++ b/cpp/src/Freeze/.depend @@ -1,12 +1,21 @@ -DBException.o: DBException.cpp ../../include/Freeze/DBException.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h -Evictor.o: Evictor.cpp ../../include/Freeze/Evictor.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ServantLocator.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Freeze/DBException.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/IncomingAsyncF.h -EvictorF.o: EvictorF.cpp ../../include/Freeze/EvictorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h -EvictorStorage.o: EvictorStorage.cpp ../../include/Freeze/EvictorStorage.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h -MapI.o: MapI.cpp ../Freeze/MapI.h ../../include/Freeze/Map.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/LoggerF.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/StatsF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocator.h ../../include/Ice/IdentityUtil.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Application.h ../../include/Freeze/DB.h ../../include/Freeze/DBException.h ../Freeze/SharedDbEnv.h -EvictorI.o: EvictorI.cpp ../Freeze/EvictorI.h ../../include/IceUtil/IceUtil.h ../../include/IceUtil/Functional.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Unicode.h ../../include/IceUtil/UUID.h ../../include/IceUtil/AbstractMutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/RWRecMutex.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Base64.h ../../include/IceUtil/InputUtil.h ../../include/IceUtil/OutputUtil.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/LoggerF.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/StatsF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocator.h ../../include/Ice/IdentityUtil.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Application.h ../../include/Freeze/Evictor.h ../../include/Freeze/DBException.h ../Freeze/SharedDbEnv.h ../../include/Freeze/EvictorStorage.h ../../include/Freeze/DB.h ../../include/Freeze/Initialize.h ../../include/Freeze/EvictorF.h -SharedDbEnv.o: SharedDbEnv.cpp ../Freeze/SharedDbEnv.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/LoggerF.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/StatsF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocator.h ../../include/Ice/IdentityUtil.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Application.h ../../include/IceUtil/StaticMutex.h ../../include/IceUtil/Thread.h ../../include/Freeze/DBException.h +DBException.o: DBException.cpp ../../include/Freeze/DBException.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h +Evictor.o: Evictor.cpp ../../include/Freeze/Evictor.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ServantLocator.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Freeze/DBException.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Stream.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h +EvictorF.o: EvictorF.cpp ../../include/Freeze/EvictorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h +EvictorStorage.o: EvictorStorage.cpp ../../include/Freeze/EvictorStorage.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Stream.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h +Connection.o: Connection.cpp ../../include/Freeze/Connection.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Freeze/Transaction.h +ConnectionF.o: ConnectionF.cpp ../../include/Freeze/ConnectionF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h +ConnectionI.o: ConnectionI.cpp ../Freeze/ConnectionI.h ../../include/Freeze/Connection.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Freeze/Transaction.h ../../include/Freeze/Initialize.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/LoggerF.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/StatsF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocator.h ../../include/Ice/IdentityUtil.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Application.h ../../include/Freeze/EvictorF.h ../../include/Freeze/ConnectionF.h ../Freeze/TransactionI.h +Transaction.o: Transaction.cpp ../../include/Freeze/Transaction.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h +TransactionI.o: TransactionI.cpp ../Freeze/TransactionI.h ../../include/Freeze/Transaction.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../Freeze/ConnectionI.h ../../include/Freeze/Connection.h ../../include/Freeze/Initialize.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/LoggerF.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/StatsF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocator.h ../../include/Ice/IdentityUtil.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Application.h ../../include/Freeze/EvictorF.h ../../include/Freeze/ConnectionF.h +SharedDb.o: SharedDb.cpp ../Freeze/SharedDb.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/LoggerF.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/StatsF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocator.h ../../include/Ice/IdentityUtil.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Application.h ../../include/IceUtil/StaticMutex.h ../../include/Freeze/DBException.h +MapI.o: MapI.cpp ../Freeze/MapI.h ../../include/Freeze/Map.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/LoggerF.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/StatsF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocator.h ../../include/Ice/IdentityUtil.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Application.h ../../include/Freeze/DB.h ../../include/Freeze/DBException.h ../Freeze/SharedDbEnv.h ../Freeze/SharedDb.h +EvictorI.o: EvictorI.cpp ../../include/Ice/Object.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/ObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/StreamF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../Freeze/EvictorI.h ../../include/IceUtil/IceUtil.h ../../include/IceUtil/Functional.h ../../include/IceUtil/Unicode.h ../../include/IceUtil/UUID.h ../../include/IceUtil/AbstractMutex.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/RWRecMutex.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Base64.h ../../include/IceUtil/InputUtil.h ../../include/IceUtil/OutputUtil.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/LoggerF.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/StatsF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocator.h ../../include/Ice/IdentityUtil.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Application.h ../../include/Freeze/Evictor.h ../../include/Freeze/DBException.h ../Freeze/SharedDbEnv.h ../../include/Freeze/EvictorStorage.h ../../include/Freeze/DB.h ../../include/Freeze/Initialize.h ../../include/Freeze/EvictorF.h ../../include/Freeze/ConnectionF.h ../../include/Ice/Stream.h +SharedDbEnv.o: SharedDbEnv.cpp ../Freeze/SharedDbEnv.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/LoggerF.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/StatsF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocator.h ../../include/Ice/IdentityUtil.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Application.h ../../include/IceUtil/StaticMutex.h ../../include/IceUtil/Thread.h ../../include/Freeze/DBException.h DB.cpp: ../../slice/Freeze/DB.ice DBException.cpp: ../../slice/Freeze/DBException.ice +Connection.cpp: ../../slice/Freeze/Connection.ice ../../slice/Freeze/Transaction.ice +ConnectionF.cpp: ../../slice/Freeze/ConnectionF.ice +Transaction.cpp: ../../slice/Freeze/Transaction.ice Evictor.cpp: ../../slice/Freeze/Evictor.ice ../../slice/Ice/ObjectAdapterF.ice ../../slice/Ice/ServantLocator.ice ../../slice/Ice/Current.ice ../../slice/Ice/Identity.ice ../../slice/Ice/Facet.ice ../../slice/Freeze/DBException.ice EvictorF.cpp: ../../slice/Freeze/EvictorF.ice EvictorStorage.cpp: ../../slice/Freeze/EvictorStorage.ice ../../slice/Ice/Identity.ice ../../slice/Ice/Facet.ice diff --git a/cpp/src/Freeze/ConnectionI.cpp b/cpp/src/Freeze/ConnectionI.cpp new file mode 100644 index 00000000000..630c49fd3e6 --- /dev/null +++ b/cpp/src/Freeze/ConnectionI.cpp @@ -0,0 +1,150 @@ +// ********************************************************************** +// +// Copyright (c) 2003 +// ZeroC, Inc. +// Billerica, MA, USA +// +// All Rights Reserved. +// +// Ice is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License version 2 as published by +// the Free Software Foundation. +// +// ********************************************************************** + +#include +#include +#include + +using namespace Ice; +using namespace Freeze; +using namespace std; + + +Freeze::TransactionPtr +Freeze::ConnectionI::beginTransaction() +{ + if(_transaction != 0) + { + throw TransactionAlreadyInProgressException(__FILE__, __LINE__); + } + closeAllIterators(); + _transaction = new TransactionI(this); + return _transaction; +} + +Freeze::TransactionPtr +Freeze::ConnectionI::currentTransaction() const +{ + return _transaction; +} + +void +Freeze::ConnectionI::close() +{ + if(_transaction != 0) + { + try + { + _transaction->rollback(); + } + catch(const Freeze::DBException&) + { + // + // Ignored + // + } + } + + while(!_mapList.empty()) + { + (*_mapList.begin())->close(); + } + + if(_dbEnv != 0) + { + _dbEnv = 0; + _dbEnvHolder = 0; + } +} + +Ice::CommunicatorPtr +Freeze::ConnectionI::getCommunicator() const +{ + return _communicator; +} + +string +Freeze::ConnectionI::getName() const +{ + return _envName; +} + + +Freeze::ConnectionI::~ConnectionI() +{ + close(); +} + +Freeze::ConnectionI::ConnectionI(const Ice::CommunicatorPtr& communicator, + const std::string& envName) : + _communicator(communicator), + _dbEnvHolder(SharedDbEnv::get(communicator, envName)), + _envName(envName), + _trace(communicator->getProperties()->getPropertyAsInt("Freeze.Trace.DB")) +{ + _dbEnv = _dbEnvHolder.get(); +} + +Freeze::ConnectionI::ConnectionI(const Ice::CommunicatorPtr& communicator, + DbEnv& dbEnv) : + _communicator(communicator), + _dbEnv(&dbEnv), + _envName("External"), + _trace(communicator->getProperties()->getPropertyAsInt("Freeze.Trace.DB")) +{ +} + +void +Freeze::ConnectionI::closeAllIterators() +{ + for(list::iterator p = _mapList.begin(); p != _mapList.end(); + ++p) + { + (*p)->closeAllIterators(); + } +} + +void +Freeze::ConnectionI::registerMap(DBMapHelperI* map) +{ + _mapList.push_back(map); +} + +void +Freeze::ConnectionI::unregisterMap(DBMapHelperI* map) +{ + _mapList.remove(map); +} + +Freeze::ConnectionPtr +Freeze::createConnection(const CommunicatorPtr& communicator, + const string& envName) +{ + + return new ConnectionI(communicator, envName); +} + +Freeze::ConnectionPtr +Freeze::createConnection(const CommunicatorPtr& communicator, + DbEnv& dbEnv) +{ + return new ConnectionI(communicator, dbEnv); +} + +void +Freeze::TransactionAlreadyInProgressException::ice_print(ostream& out) const +{ + Exception::ice_print(out); + out << ":\ntransaction already in progess"; +} diff --git a/cpp/src/Freeze/ConnectionI.h b/cpp/src/Freeze/ConnectionI.h new file mode 100644 index 00000000000..fddadd33858 --- /dev/null +++ b/cpp/src/Freeze/ConnectionI.h @@ -0,0 +1,139 @@ +// ********************************************************************** +// +// Copyright (c) 2003 +// ZeroC, Inc. +// Billerica, MA, USA +// +// All Rights Reserved. +// +// Ice is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License version 2 as published by +// the Free Software Foundation. +// +// ********************************************************************** + +#ifndef FREEZE_CONNECTIONI_H +#define FREEZE_CONNECTIONI_H + +#include +#include +#include +#include +#include + +namespace Freeze +{ + +class DBMapHelperI; + +class ConnectionI : public Connection +{ +public: + + virtual TransactionPtr + beginTransaction(); + + virtual TransactionPtr + currentTransaction() const; + + virtual void + close(); + + virtual Ice::CommunicatorPtr + getCommunicator() const; + + virtual std::string + getName() const; + + virtual ~ConnectionI(); + + ConnectionI(const Ice::CommunicatorPtr& communicator, + const std::string& envName); + + ConnectionI(const Ice::CommunicatorPtr& communicator, + DbEnv& dbEnv); + + void + closeAllIterators(); + + void + registerMap(DBMapHelperI*); + + void + unregisterMap(DBMapHelperI*); + + void + clearTransaction(); + + DbTxn* + dbTxn() const; + + DbEnv* + dbEnv() const; + + const Ice::CommunicatorPtr& + communicator() const; + + const std::string& + envName() const; + + int + trace() const; + +private: + + Ice::CommunicatorPtr _communicator; + SharedDbEnvPtr _dbEnvHolder; + DbEnv* _dbEnv; + std::string _envName; + TransactionIPtr _transaction; + std::list _mapList; + int _trace; +}; + +inline void +ConnectionI::clearTransaction() +{ + _transaction = 0; +} + +inline DbTxn* +ConnectionI::dbTxn() const +{ + if(_transaction == 0) + { + return 0; + } + else + { + return _transaction->dbTxn(); + } +} + +inline DbEnv* +ConnectionI::dbEnv() const +{ + return _dbEnv; +} + +inline const std::string& +ConnectionI::envName() const +{ + return _envName; +} + +inline const Ice::CommunicatorPtr& +ConnectionI::communicator() const +{ + return _communicator; +} + +inline int +ConnectionI::trace() const +{ + return _trace; +} + +} + +#endif diff --git a/cpp/src/Freeze/EvictorI.cpp b/cpp/src/Freeze/EvictorI.cpp index 715de1f4e0b..3f04b77f788 100644 --- a/cpp/src/Freeze/EvictorI.cpp +++ b/cpp/src/Freeze/EvictorI.cpp @@ -205,7 +205,7 @@ Freeze::EvictorI::EvictorI(const Ice::CommunicatorPtr communicator, _noSyncAllowed(false), _generation(0) { - init("Extern", dbName, createDb); + init("External", dbName, createDb); } void diff --git a/cpp/src/Freeze/Makefile b/cpp/src/Freeze/Makefile index 8b0414c4cbc..70bbe8d04c1 100644 --- a/cpp/src/Freeze/Makefile +++ b/cpp/src/Freeze/Makefile @@ -21,18 +21,29 @@ LIBNAME = $(call mklibname,Freeze) TARGETS = $(libdir)/$(LIBFILENAME) $(libdir)/$(SONAME) $(libdir)/$(LIBNAME) -OBJS = DBException.o \ +OBJS = DB.o \ + DBException.o \ Evictor.o \ EvictorF.o \ EvictorStorage.o \ + Connection.o \ + ConnectionF.o \ + ConnectionI.o \ + Transaction.o \ + TransactionI.o \ + SharedDb.o \ MapI.o \ EvictorI.o \ - SharedDbEnv.o + SharedDbEnv.o \ + TransactionHolder.o SRCS = $(OBJS:.o=.cpp) SLICE_SRCS = $(SDIR)/DB.ice \ $(SDIR)/DBException.ice \ + $(SDIR)/Connection.ice \ + $(SDIR)/ConnectionF.ice \ + $(SDIR)/Transaction.ice \ $(SDIR)/Evictor.ice \ $(SDIR)/EvictorF.ice \ $(SDIR)/EvictorStorage.ice diff --git a/cpp/src/Freeze/MapI.cpp b/cpp/src/Freeze/MapI.cpp index daf9358f493..a473af868bb 100644 --- a/cpp/src/Freeze/MapI.cpp +++ b/cpp/src/Freeze/MapI.cpp @@ -14,20 +14,13 @@ #include #include -#include +#include #include using namespace std; using namespace Ice; using namespace Freeze; -#ifdef _WIN32 -# define FREEZE_DB_MODE 0 -#else -# define FREEZE_DB_MODE (S_IRUSR | S_IWUSR) -#endif - - namespace { @@ -62,27 +55,12 @@ initializeOutDbt(vector& v, Dbt& dbt) // Freeze::DBMapHelper* -Freeze::DBMapHelper::create(const CommunicatorPtr& communicator, - const string& envName, +Freeze::DBMapHelper::create(const Freeze::ConnectionPtr& connection, const string& dbName, bool createDb) { - return new DBMapHelperI(communicator, envName, dbName, createDb); -} - -Freeze::DBMapHelper* -Freeze::DBMapHelper::create(const CommunicatorPtr& communicator, - DbEnv& dbEnv, - const string& dbName, - bool createDb) -{ - return new DBMapHelperI(communicator, dbEnv, dbName, createDb); -} - - -Freeze::DBMapHelper::DBMapHelper(const Ice::CommunicatorPtr& communicator) : - _communicator(communicator) -{ + Freeze::ConnectionIPtr connectionI = Freeze::ConnectionIPtr::dynamicCast(connection); + return new DBMapHelperI(connectionI, dbName, createDb); } Freeze::DBMapHelper::~DBMapHelper() @@ -127,16 +105,15 @@ Freeze::DBIteratorHelperI::DBIteratorHelperI(const DBMapHelperI& m, bool readOnl _dbc(0), _tx(0) { - if(_map._trace >= 3) { - Trace out(_map._communicator->getLogger(), "DB"); - out << "opening iterator on database \"" << _map._dbName.c_str() << "\""; + Trace out(_map._connection->communicator()->getLogger(), "DB"); + out << "opening iterator on database \"" << _map._dbName << "\""; } - DbTxn* txn = 0; + DbTxn* txn = _map._connection->dbTxn(); - if(!readOnly) + if(txn == 0 && !readOnly) { // // Need to start a transaction @@ -147,7 +124,7 @@ Freeze::DBIteratorHelperI::DBIteratorHelperI(const DBMapHelperI& m, bool readOnl try { - m._db.get()->cursor(txn, &_dbc, 0); + _map._db->cursor(txn, &_dbc, 0); } catch(const ::DbException& dx) { @@ -155,6 +132,7 @@ Freeze::DBIteratorHelperI::DBIteratorHelperI(const DBMapHelperI& m, bool readOnl ex.message = dx.what(); throw ex; } + _map._iteratorList.push_back(this); } Freeze::DBIteratorHelperI::DBIteratorHelperI(const DBIteratorHelperI& it) : @@ -164,8 +142,8 @@ Freeze::DBIteratorHelperI::DBIteratorHelperI(const DBIteratorHelperI& it) : { if(_map._trace >= 3) { - Trace out(_map._communicator->getLogger(), "DB"); - out << "duplicating iterator on database \"" << _map._dbName.c_str() << "\""; + Trace out(_map._connection->communicator()->getLogger(), "DB"); + out << "duplicating iterator on database \"" << _map._dbName << "\""; } try @@ -180,33 +158,12 @@ Freeze::DBIteratorHelperI::DBIteratorHelperI(const DBIteratorHelperI& it) : } _tx = it._tx; + _map._iteratorList.push_back(this); } Freeze::DBIteratorHelperI::~DBIteratorHelperI() { - if(_map._trace >= 3) - { - Trace out(_map._communicator->getLogger(), "DB"); - out << "closing iterator on database \"" << _map._dbName.c_str() << "\""; - } - - try - { - _dbc->close(); - } - catch(const ::DbDeadlockException&) - { - // Ignored - } - catch(const ::DbException& dx) - { - DBException ex(__FILE__, __LINE__); - ex.message = dx.what(); - throw ex; - } - _dbc = 0; - - _tx = 0; + close(); } bool @@ -461,6 +418,11 @@ Freeze::DBIteratorHelperI::set(const Value& value) Dbt dbValue; initializeInDbt(value, dbValue); + if(_tx != 0) + { + _map.closeAllIteratorsExcept(_tx); + } + try { int err = _dbc->put(&dbKey, &dbValue, DB_CURRENT); @@ -488,6 +450,11 @@ Freeze::DBIteratorHelperI::set(const Value& value) void Freeze::DBIteratorHelperI::erase() { + if(_tx != 0) + { + _map.closeAllIteratorsExcept(_tx); + } + try { int err = _dbc->del(0); @@ -581,17 +548,56 @@ Freeze::DBIteratorHelperI::equals(const DBIteratorHelper& rhs) const } } -const Ice::CommunicatorPtr& -Freeze::DBIteratorHelperI::getCommunicator() const +void +Freeze::DBIteratorHelperI::close() +{ + if(_dbc != 0) + { + if(_map._trace >= 3) + { + Trace out(_map._connection->communicator()->getLogger(), "DB"); + out << "closing iterator on database \"" << _map._dbName << "\""; + } + + try + { + _dbc->close(); + } + catch(const ::DbDeadlockException& dx) + { + bool raiseException = (_tx == 0); + cleanup(); + if(raiseException) + { + DBDeadlockException ex(__FILE__, __LINE__); + ex.message = dx.what(); + throw ex; + } + } + catch(const ::DbException& dx) + { + cleanup(); + DBException ex(__FILE__, __LINE__); + ex.message = dx.what(); + throw ex; + } + cleanup(); + } +} + +void +Freeze::DBIteratorHelperI::cleanup() { - return _map._communicator; + _dbc = 0; + _map._iteratorList.remove(this); + _tx = 0; } + // // DBIteratorHelperI::Tx // - Freeze::DBIteratorHelperI::Tx::Tx(const DBMapHelperI& m) : _map(m), _txn(0), @@ -599,13 +605,13 @@ Freeze::DBIteratorHelperI::Tx::Tx(const DBMapHelperI& m) : { if(_map._trace >= 3) { - Trace out(_map._communicator->getLogger(), "DB"); - out << "starting transaction for database \"" << _map._dbName.c_str() << "\""; + Trace out(_map._connection->communicator()->getLogger(), "DB"); + out << "starting transaction for database \"" << _map._dbName << "\""; } try { - _map._dbEnv->txn_begin(0, &_txn, 0); + _map._connection->dbEnv()->txn_begin(0, &_txn, 0); } catch(const ::DbException& dx) { @@ -622,8 +628,8 @@ Freeze::DBIteratorHelperI::Tx::~Tx() { if(_map._trace >= 3) { - Trace out(_map._communicator->getLogger(), "DB"); - out << "aborting transaction for database \"" << _map._dbName.c_str() << "\""; + Trace out(_map._connection->communicator()->getLogger(), "DB"); + out << "aborting transaction for database \"" << _map._dbName << "\""; } try @@ -641,7 +647,7 @@ Freeze::DBIteratorHelperI::Tx::~Tx() { if(_map._trace >= 3) { - Trace out(_map._communicator->getLogger(), "DB"); + Trace out(_map._connection->communicator()->getLogger(), "DB"); out << "committing transaction for database \"" << _map._dbName.c_str() << "\""; } @@ -667,11 +673,6 @@ Freeze::DBIteratorHelperI::Tx::~Tx() void Freeze::DBIteratorHelperI::Tx::dead() { - // - // No need for synchronization since DBIteratorHelperI is not - // thread-safe (see Berkeley DB doc) - // - _dead = true; } @@ -682,87 +683,20 @@ Freeze::DBIteratorHelperI::Tx::dead() // -Freeze::DBMapHelperI::DBMapHelperI(const CommunicatorPtr& communicator, - const string& envName, - const string& dbName, +Freeze::DBMapHelperI::DBMapHelperI(const ConnectionIPtr& connection, + const std::string& dbName, bool createDb) : - DBMapHelper(communicator), - _trace(0), - _dbEnv(0), - _dbEnvHolder(SharedDbEnv::get(communicator, envName)), - _dbName(dbName) -{ - _dbEnv = _dbEnvHolder.get(); - openDb(createDb); -} - -Freeze::DBMapHelperI::DBMapHelperI(const CommunicatorPtr& communicator, - DbEnv& dbEnv, - const string& dbName, - bool createDb) : - DBMapHelper(communicator), - _trace(0), - _dbEnv(&dbEnv), - _dbName(dbName) -{ - openDb(createDb); -} - -void -Freeze::DBMapHelperI::openDb(bool createDb) -{ - _trace = _communicator->getProperties()->getPropertyAsInt("Freeze.Trace.DB"); - - try - { - _db.reset(new Db(_dbEnv, 0)); - u_int32_t flags = DB_AUTO_COMMIT | DB_THREAD; - - if(createDb) - { - flags |= DB_CREATE; - } - - if(_trace >= 2) - { - Trace out(_communicator->getLogger(), "DB"); - out << "opening database \"" << _dbName.c_str() << "\""; - } - - _db->open(0, _dbName.c_str(), 0, DB_BTREE, flags, FREEZE_DB_MODE); - } - catch(const ::DbException& dx) - { - DBException ex(__FILE__, __LINE__); - ex.message = dx.what(); - throw ex; - } + _connection(connection), + _db(SharedDb::get(connection, dbName, createDb)), + _dbName(dbName), + _trace(connection->trace()) +{ + _connection->registerMap(this); } - Freeze::DBMapHelperI::~DBMapHelperI() { - if(_db.get() != 0) - { - try - { - if(_trace >= 2) - { - Trace out(_communicator->getLogger(), "DB"); - out << "closing database \"" << _dbName.c_str() << "\""; - } - - _db->close(0); - } - catch(const ::DbException& dx) - { - DBException ex(__FILE__, __LINE__); - ex.message = dx.what(); - throw ex; - } - _db.reset(); - } - _dbEnvHolder = 0; + close(); } Freeze::DBIteratorHelper* @@ -784,9 +718,16 @@ Freeze::DBMapHelperI::find(const Key& k, bool readOnly) const } catch(const DBDeadlockException&) { - // - // Ignored, try again - // + if(_connection->dbTxn() != 0) + { + throw; + } + else + { + // + // Ignored, try again + // + } } } } @@ -799,11 +740,18 @@ Freeze::DBMapHelperI::put(const Key& key, const Value& value) initializeInDbt(key, dbKey); initializeInDbt(value, dbValue); + DbTxn* txn = _connection->dbTxn(); + if(txn == 0) + { + closeAllIterators(); + } + for(;;) { try { - int err = _db->put(0, &dbKey, &dbValue, DB_AUTO_COMMIT); + int err = _db->put(txn, &dbKey, &dbValue, + txn != 0 ? 0 : DB_AUTO_COMMIT); if(err == 0) { @@ -817,11 +765,20 @@ Freeze::DBMapHelperI::put(const Key& key, const Value& value) throw DBException(__FILE__, __LINE__); } } - catch(const ::DbDeadlockException&) + catch(const ::DbDeadlockException& dx) { - // - // Ignored, try again - // + if(txn != 0) + { + DBDeadlockException ex(__FILE__, __LINE__); + ex.message = dx.what(); + throw ex; + } + else + { + // + // Ignored, try again + // + } } catch(const ::DbException& dx) { @@ -838,11 +795,17 @@ Freeze::DBMapHelperI::erase(const Key& key) Dbt dbKey; initializeInDbt(key, dbKey); + DbTxn* txn = _connection->dbTxn(); + if(txn == 0) + { + closeAllIterators(); + } + for(;;) { try { - int err = _db->del(0, &dbKey, DB_AUTO_COMMIT); + int err = _db->del(txn, &dbKey, txn != 0 ? 0 : DB_AUTO_COMMIT); if(err == 0) { @@ -858,11 +821,20 @@ Freeze::DBMapHelperI::erase(const Key& key) throw DBException(__FILE__, __LINE__); } } - catch(const ::DbDeadlockException&) + catch(const ::DbDeadlockException& dx) { - // - // Ignored, try again - // + if(txn != 0) + { + DBDeadlockException ex(__FILE__, __LINE__); + ex.message = dx.what(); + throw ex; + } + else + { + // + // Ignored, try again + // + } } catch(const ::DbException& dx) { @@ -889,7 +861,7 @@ Freeze::DBMapHelperI::count(const Key& key) const { try { - int err = _db->get(0, &dbKey, &dbValue, 0); + int err = _db->get(_connection->dbTxn(), &dbKey, &dbValue, 0); if(err == 0) { @@ -905,11 +877,20 @@ Freeze::DBMapHelperI::count(const Key& key) const throw DBException(__FILE__, __LINE__); } } - catch(const ::DbDeadlockException&) + catch(const ::DbDeadlockException& dx) { - // - // Ignored, try again - // + if(_connection->dbTxn() != 0) + { + DBDeadlockException ex(__FILE__, __LINE__); + ex.message = dx.what(); + throw ex; + } + else + { + // + // Ignored, try again + // + } } catch(const ::DbException& dx) { @@ -923,20 +904,35 @@ Freeze::DBMapHelperI::count(const Key& key) const void Freeze::DBMapHelperI::clear() { + DbTxn* txn = _connection->dbTxn(); + if(txn == 0) + { + closeAllIterators(); + } + for(;;) { try { u_int32_t count; - int err = _db->truncate(0, &count, DB_AUTO_COMMIT); + int err = _db->truncate(txn, &count, txn != 0 ? 0 : DB_AUTO_COMMIT); assert(err == 0); break; } - catch(const ::DbDeadlockException&) + catch(const ::DbDeadlockException& dx) { - // - // Ignored, try again - // + if(txn != 0) + { + DBDeadlockException ex(__FILE__, __LINE__); + ex.message = dx.what(); + throw ex; + } + else + { + // + // Ignored, try again + // + } } catch(const ::DbException& dx) { @@ -950,13 +946,16 @@ Freeze::DBMapHelperI::clear() void Freeze::DBMapHelperI::destroy() { - try + DbTxn* txn = _connection->dbTxn(); + if(txn == 0) { - _db->close(0); - _db.reset(); + closeAllIterators(); + } - Db db(_dbEnv, 0); - db.remove(_dbName.c_str(), 0, 0); + try + { + close(); + _connection->dbEnv()->dbremove(txn, _dbName.c_str(), 0, txn != 0 ? 0 : DB_AUTO_COMMIT); } catch(const ::DbException& dx) { @@ -967,7 +966,6 @@ Freeze::DBMapHelperI::destroy() } - size_t Freeze::DBMapHelperI::size() const { @@ -983,6 +981,45 @@ Freeze::DBMapHelperI::size() const } +void +Freeze::DBMapHelperI::closeAllIterators() +{ + while(!_iteratorList.empty()) + { + (*_iteratorList.begin())->close(); + } +} + +void +Freeze::DBMapHelperI::close() +{ + if(_db != 0) + { + _connection->unregisterMap(this); + } + _db = 0; +} + +void +Freeze::DBMapHelperI::closeAllIteratorsExcept(const DBIteratorHelperI::TxPtr& tx) const +{ + assert(tx != 0); + + list::iterator q = _iteratorList.begin(); + + while(q != _iteratorList.end()) + { + if((*q)->tx().get() == tx.get()) + { + ++q; + } + else + { + (*q)->close(); + q = _iteratorList.begin(); + } + } +} // // Print for the various exception types. diff --git a/cpp/src/Freeze/MapI.h b/cpp/src/Freeze/MapI.h index 0e3054751e8..2d3898dec0b 100644 --- a/cpp/src/Freeze/MapI.h +++ b/cpp/src/Freeze/MapI.h @@ -16,7 +16,7 @@ #define FREEZE_MAP_I_H #include -#include +#include namespace Freeze { @@ -62,9 +62,8 @@ public: virtual bool equals(const DBIteratorHelper&) const; - virtual const Ice::CommunicatorPtr& - getCommunicator() const; - + void + close(); class Tx : public IceUtil::SimpleShared { @@ -88,8 +87,15 @@ public: typedef IceUtil::Handle TxPtr; + const TxPtr& + tx() const; + private: + void + cleanup(); + + const DBMapHelperI& _map; Dbc* _dbc; TxPtr _tx; @@ -99,17 +105,11 @@ private: }; - class DBMapHelperI : public DBMapHelper { public: - DBMapHelperI(const Ice::CommunicatorPtr& communicator, - const std::string& envName, const std::string& dbName, - bool createDb); - - DBMapHelperI(const Ice::CommunicatorPtr& communicator, - DbEnv& dbEnv, const std::string& dbName, + DBMapHelperI(const ConnectionIPtr& connection, const std::string& dbName, bool createDb); virtual ~DBMapHelperI(); @@ -135,22 +135,33 @@ public: virtual size_t size() const; + virtual void + closeAllIterators(); + + void + close(); + private: - void - openDb(bool); + virtual void + closeAllIteratorsExcept(const DBIteratorHelperI::TxPtr&) const; + friend class DBIteratorHelperI; friend class DBIteratorHelperI::Tx; - int _trace; - DbEnv* _dbEnv; - SharedDbEnvPtr _dbEnvHolder; - std::auto_ptr _db; + const ConnectionIPtr _connection; + mutable std::list _iteratorList; + SharedDbPtr _db; const std::string _dbName; + int _trace; }; - +inline const DBIteratorHelperI::TxPtr& +DBIteratorHelperI::tx() const +{ + return _tx; +} } diff --git a/cpp/src/Freeze/SharedDb.cpp b/cpp/src/Freeze/SharedDb.cpp new file mode 100644 index 00000000000..8185669e2f4 --- /dev/null +++ b/cpp/src/Freeze/SharedDb.cpp @@ -0,0 +1,170 @@ +// ********************************************************************** +// +// Copyright (c) 2003 +// ZeroC, Inc. +// Billerica, MA, USA +// +// All Rights Reserved. +// +// Ice is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License version 2 as published by +// the Free Software Foundation. +// +// ********************************************************************** + +#include +#include +#include +#include + +using namespace std; +using namespace IceUtil; +using namespace Ice; + +#ifdef _WIN32 +# define FREEZE_DB_MODE 0 +#else +# define FREEZE_DB_MODE (S_IRUSR | S_IWUSR) +#endif + +namespace +{ + +StaticMutex _mapMutex = ICE_STATIC_MUTEX_INITIALIZER; +StaticMutex _refCountMutex = ICE_STATIC_MUTEX_INITIALIZER; + +} + +Freeze::SharedDb::Map* Freeze::SharedDb::sharedDbMap = 0; + +Freeze::SharedDbPtr +Freeze::SharedDb::get(const ConnectionIPtr& connection, + const string& dbName, bool createDb) +{ + StaticMutex::Lock lock(_mapMutex); + + if(sharedDbMap == 0) + { + sharedDbMap = new Map; + } + + MapKey key; + key.envName = connection->envName(); + key.communicator = connection->communicator(); + key.dbName = dbName; + + { + Map::iterator p = sharedDbMap->find(key); + if(p != sharedDbMap->end()) + { + return p->second; + } + } + + // + // MapKey not found, let's create and open a new Db + // + auto_ptr result(new SharedDb(key, connection, createDb)); + + // + // Insert it into the map + // + pair insertResult = sharedDbMap->insert(Map::value_type(key, result.get())); + assert(insertResult.second); + + return result.release(); +} + +Freeze::SharedDb::~SharedDb() +{ + if(_trace >= 1) + { + Trace out(_key.communicator->getLogger(), "DB"); + out << "closing database \"" << _key.dbName << "\""; + } + + try + { + close(0); + } + catch(const ::DbException& dx) + { + DBException ex(__FILE__, __LINE__); + ex.message = dx.what(); + throw ex; + } + +} + +void Freeze::SharedDb::__incRef() +{ + IceUtil::StaticMutex::Lock lock(_refCountMutex); + _refCount++; +} + +void Freeze::SharedDb::__decRef() +{ + IceUtil::StaticMutex::Lock lock(_refCountMutex); + if(--_refCount == 0) + { + IceUtil::StaticMutex::TryLock mapLock(_mapMutex); + if(!mapLock.acquired()) + { + // + // Reacquire mutex in proper order and check again + // + lock.release(); + mapLock.acquire(); + lock.acquire(); + if(_refCount > 0) + { + return; + } + } + + // + // Remove from map + // + size_t one = sharedDbMap->erase(_key); + assert(one == 1); + + if(sharedDbMap->size() == 0) + { + delete sharedDbMap; + sharedDbMap = 0; + } + + // + // Keep lock to prevent somebody else to re-open this Db + // before it's closed. + // + delete this; + } +} + + + +Freeze::SharedDb::SharedDb(const MapKey& key, + const ConnectionIPtr& connection, + bool createDb) : + Db(connection->dbEnv(), 0), + _key(key), + _refCount(0), + _trace(connection->trace()) +{ + try + { + u_int32_t flags = DB_AUTO_COMMIT | DB_THREAD; + if(createDb) + { + flags |= DB_CREATE; + } + open(0, key.dbName.c_str(), 0, DB_BTREE, flags, FREEZE_DB_MODE); + } + catch(const ::DbException& dx) + { + DBException ex(__FILE__, __LINE__); + ex.message = dx.what(); + throw ex; + } +} diff --git a/cpp/src/Freeze/SharedDb.h b/cpp/src/Freeze/SharedDb.h new file mode 100644 index 00000000000..52da8e4010c --- /dev/null +++ b/cpp/src/Freeze/SharedDb.h @@ -0,0 +1,83 @@ +// ********************************************************************** +// +// Copyright (c) 2003 +// ZeroC, Inc. +// Billerica, MA, USA +// +// All Rights Reserved. +// +// Ice is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License version 2 as published by +// the Free Software Foundation. +// +// ********************************************************************** + +#ifndef FREEZE_SHARED_DB_H +#define FREEZE_SHARED_DB_H + +#include +#include +#include +#include + +namespace Freeze +{ + +class SharedDb; +typedef IceUtil::Handle SharedDbPtr; + +class SharedDb : public ::Db +{ +public: + + using ::Db::get; + + static SharedDbPtr get(const ConnectionIPtr&, const std::string&, bool); + + ~SharedDb(); + + void __incRef(); + void __decRef(); + + const std::string& + dbName() const; + +private: + + struct MapKey + { + std::string envName; + Ice::CommunicatorPtr communicator; + std::string dbName; + + inline bool + operator<(const MapKey& rhs) const; + }; + + typedef std::map Map; + + SharedDb(const MapKey&, const ConnectionIPtr&, bool); + + MapKey _key; + int _refCount; + int _trace; + + static Map* sharedDbMap; +}; + +inline const std::string& +SharedDb::dbName() const +{ + return _key.dbName; +} + +inline bool +SharedDb::MapKey::operator<(const MapKey& rhs) const +{ + return (communicator < rhs.communicator) || + ((communicator == rhs.communicator) && (dbName < rhs.dbName)) || + ((communicator == rhs.communicator) && (dbName == rhs.dbName) && (envName < rhs.envName)); +} + +} +#endif diff --git a/cpp/src/Freeze/SharedDbEnv.h b/cpp/src/Freeze/SharedDbEnv.h index 152985c7a7e..20874777d71 100644 --- a/cpp/src/Freeze/SharedDbEnv.h +++ b/cpp/src/Freeze/SharedDbEnv.h @@ -12,8 +12,8 @@ // // ********************************************************************** -#ifndef FREEZE_DB_ENV_MAP_H -#define FREEZE_DB_ENV_MAP_H +#ifndef FREEZE_SHARED_DB_ENV_H +#define FREEZE_SHARED_DB_ENV_H #include #include diff --git a/cpp/src/Freeze/TransactionHolder.cpp b/cpp/src/Freeze/TransactionHolder.cpp new file mode 100644 index 00000000000..8b758624467 --- /dev/null +++ b/cpp/src/Freeze/TransactionHolder.cpp @@ -0,0 +1,76 @@ +// ********************************************************************** +// +// Copyright (c) 2003 +// ZeroC, Inc. +// Billerica, MA, USA +// +// All Rights Reserved. +// +// Ice is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License version 2 as published by +// the Free Software Foundation. +// +// ********************************************************************** + +#include + +using namespace Freeze; + +Freeze::TransactionHolder::TransactionHolder(const ConnectionPtr& connection) + : _transaction(0) +{ + if(connection->currentTransaction() == 0) + { + _transaction = connection->beginTransaction(); + } +} + +Freeze::TransactionHolder::~TransactionHolder() +{ + try + { + rollback(); + } + catch(...) + { + // + // Ignored to avoid crash during stack unwinding + // + } +} + +void +Freeze::TransactionHolder::commit() +{ + if(_transaction != 0) + { + try + { + _transaction->commit(); + _transaction = 0; + } + catch(...) + { + _transaction = 0; + throw; + } + } +} + +void +Freeze::TransactionHolder::rollback() +{ + if(_transaction != 0) + { + try + { + _transaction->rollback(); + _transaction = 0; + } + catch(...) + { + _transaction = 0; + throw; + } + } +} diff --git a/cpp/src/Freeze/TransactionI.cpp b/cpp/src/Freeze/TransactionI.cpp new file mode 100644 index 00000000000..0e28f9c9acf --- /dev/null +++ b/cpp/src/Freeze/TransactionI.cpp @@ -0,0 +1,103 @@ +// ********************************************************************** +// +// Copyright (c) 2003 +// ZeroC, Inc. +// Billerica, MA, USA +// +// All Rights Reserved. +// +// Ice is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License version 2 as published by +// the Free Software Foundation. +// +// ********************************************************************** + +#include +#include +#include + + +void +Freeze::TransactionI::commit() +{ + assert(_txn != 0); + try + { + _connection->closeAllIterators(); + _txn->commit(0); + } + catch(const ::DbDeadlockException& dx) + { + cleanup(); + DBDeadlockException ex(__FILE__, __LINE__); + ex.message = dx.what(); + throw ex; + } + catch(const ::DbException& dx) + { + cleanup(); + DBException ex(__FILE__, __LINE__); + ex.message = dx.what(); + throw ex; + } + cleanup(); +} + +void +Freeze::TransactionI::rollback() +{ + assert(_txn != 0); + + try + { + _connection->closeAllIterators(); + _txn->abort(); + } + catch(const ::DbDeadlockException& dx) + { + cleanup(); + DBDeadlockException ex(__FILE__, __LINE__); + ex.message = dx.what(); + throw ex; + } + catch(const ::DbException& dx) + { + cleanup(); + DBException ex(__FILE__, __LINE__); + ex.message = dx.what(); + throw ex; + } + cleanup(); +} + +Freeze::TransactionI::TransactionI(ConnectionI* connection) : + _connection(connection), + _txn(0) +{ + try + { + _connection->dbEnv()->txn_begin(0, &_txn, 0); + } + catch(const ::DbException& dx) + { + DBException ex(__FILE__, __LINE__); + ex.message = dx.what(); + throw ex; + } +} + +Freeze::TransactionI::~TransactionI() +{ + if(_txn != 0) + { + rollback(); + } +} + +void +Freeze::TransactionI::cleanup() +{ + _connection->clearTransaction(); + _connection = 0; + _txn = 0; +} diff --git a/cpp/src/Freeze/TransactionI.h b/cpp/src/Freeze/TransactionI.h new file mode 100644 index 00000000000..e3e4e73ef9f --- /dev/null +++ b/cpp/src/Freeze/TransactionI.h @@ -0,0 +1,59 @@ +// ********************************************************************** +// +// Copyright (c) 2003 +// ZeroC, Inc. +// Billerica, MA, USA +// +// All Rights Reserved. +// +// Ice is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License version 2 as published by +// the Free Software Foundation. +// +// ********************************************************************** + +#ifndef FREEZE_TRANSACTIONI_H +#define FREEZE_TRANSACTIONI_H + +#include +#include + +namespace Freeze +{ + +class ConnectionI; +typedef IceUtil::Handle ConnectionIPtr; + +class TransactionI : public Transaction +{ +public: + + virtual void + commit(); + + virtual void + rollback(); + + TransactionI(ConnectionI*); + + ~TransactionI(); + + DbTxn* + dbTxn() const + { + return _txn; + } + +private: + + void + cleanup(); + + ConnectionIPtr _connection; + DbTxn* _txn; +}; + +typedef IceUtil::Handle TransactionIPtr; + +} +#endif diff --git a/cpp/src/Freeze/freeze.dsp b/cpp/src/Freeze/freeze.dsp index 63dcbd12a8c..579d5b2d8c7 100644 --- a/cpp/src/Freeze/freeze.dsp +++ b/cpp/src/Freeze/freeze.dsp @@ -114,6 +114,18 @@ SOURCE=.\DBException.cpp # End Source File # Begin Source File +SOURCE=.\Connection.cpp +# End Source File +# Begin Source File + +SOURCE=.\ConnectionF.cpp +# End Source File +# Begin Source File + +SOURCE=.\Transaction.cpp +# End Source File +# Begin Source File + SOURCE=.\Evictor.cpp # End Source File # Begin Source File @@ -126,6 +138,22 @@ SOURCE=.\MapI.cpp # End Source File # Begin Source File +SOURCE=.\ConnectionI.cpp +# End Source File +# Begin Source File + +SOURCE=.\TransactionHolder.cpp +# End Source File +# Begin Source File + +SOURCE=.\TransactionI.cpp +# End Source File +# Begin Source File + +SOURCE=.\SharedDb.cpp +# End Source File +# Begin Source File + SOURCE=.\EvictorStorage.cpp # End Source File # Begin Source File @@ -150,11 +178,31 @@ SOURCE=..\..\include\Freeze\DBException.h # End Source File # Begin Source File -SOURCE=..\..\include\Freeze\DBF.h +SOURCE=..\..\include\Freeze\Connection.h +# End Source File +# Begin Source File + +SOURCE=..\..\include\Freeze\ConnectionF.h +# End Source File +# Begin Source File + +SOURCE=..\..\include\Freeze\Transaction.h +# End Source File +# Begin Source File + +SOURCE=..\..\include\Freeze\TransactionHolder.h +# End Source File +# Begin Source File + +SOURCE=.\TransactionI.h # End Source File # Begin Source File -SOURCE=.\DBI.h +SOURCE=.\ConnectionI.h +# End Source File +# Begin Source File + +SOURCE=.\MapI.h # End Source File # Begin Source File @@ -288,6 +336,135 @@ BuildCmds= \ # End Source File # Begin Source File +SOURCE=..\..\slice\Freeze\Connection.ice + +!IF "$(CFG)" == "Freeze - Win32 Release" + +USERDEP__DBEXC="..\..\bin\slice2cpp.exe" "..\..\lib\slice.lib" +# Begin Custom Build +InputPath=..\..\slice\Freeze\Connection.ice + +BuildCmds= \ + ..\..\bin\slice2cpp.exe --dll-export FREEZE_API --include-dir Freeze -I../../slice ../../slice/Freeze/Connection.ice \ + move Connection.h ..\..\include\Freeze \ + + +"..\..\include\Freeze\Connection.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"Connection.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +# End Custom Build + +!ELSEIF "$(CFG)" == "Freeze - Win32 Debug" + +USERDEP__DBEXC="..\..\bin\slice2cpp.exe" +# Begin Custom Build +InputPath=..\..\slice\Freeze\Connection.ice + +BuildCmds= \ + ..\..\bin\slice2cpp.exe --dll-export FREEZE_API --include-dir Freeze -I../../slice ../../slice/Freeze/Connection.ice \ + move Connection.h ..\..\include\Freeze \ + + +"..\..\include\Freeze\Connection.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"Connection.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\..\slice\Freeze\ConnectionF.ice + +!IF "$(CFG)" == "Freeze - Win32 Release" + +USERDEP__DBEXC="..\..\bin\slice2cpp.exe" "..\..\lib\slice.lib" +# Begin Custom Build +InputPath=..\..\slice\Freeze\ConnectionF.ice + +BuildCmds= \ + ..\..\bin\slice2cpp.exe --dll-export FREEZE_API --include-dir Freeze -I../../slice ../../slice/Freeze/ConnectionF.ice \ + move ConnectionF.h ..\..\include\Freeze \ + + +"..\..\include\Freeze\ConnectionF.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"ConnectionF.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +# End Custom Build + +!ELSEIF "$(CFG)" == "Freeze - Win32 Debug" + +USERDEP__DBEXC="..\..\bin\slice2cpp.exe" +# Begin Custom Build +InputPath=..\..\slice\Freeze\ConnectionF.ice + +BuildCmds= \ + ..\..\bin\slice2cpp.exe --dll-export FREEZE_API --include-dir Freeze -I../../slice ../../slice/Freeze/ConnectionF.ice \ + move ConnectionF.h ..\..\include\Freeze \ + + +"..\..\include\Freeze\ConnectionF.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"ConnectionF.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\..\slice\Freeze\Transaction.ice + +!IF "$(CFG)" == "Freeze - Win32 Release" + +USERDEP__DBEXC="..\..\bin\slice2cpp.exe" "..\..\lib\slice.lib" +# Begin Custom Build +InputPath=..\..\slice\Freeze\Transaction.ice + +BuildCmds= \ + ..\..\bin\slice2cpp.exe --dll-export FREEZE_API --include-dir Freeze -I../../slice ../../slice/Freeze/Transaction.ice \ + move Transaction.h ..\..\include\Freeze \ + + +"..\..\include\Freeze\Transaction.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"Transaction.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +# End Custom Build + +!ELSEIF "$(CFG)" == "Freeze - Win32 Debug" + +USERDEP__DBEXC="..\..\bin\slice2cpp.exe" +# Begin Custom Build +InputPath=..\..\slice\Freeze\Transaction.ice + +BuildCmds= \ + ..\..\bin\slice2cpp.exe --dll-export FREEZE_API --include-dir Freeze -I../../slice ../../slice/Freeze/Transaction.ice \ + move Transaction.h ..\..\include\Freeze \ + + +"..\..\include\Freeze\Transaction.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"Transaction.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + SOURCE=..\..\slice\Freeze\Evictor.ice !IF "$(CFG)" == "Freeze - Win32 Release" diff --git a/cpp/src/IcePack/AdapterRegistryI.cpp b/cpp/src/IcePack/AdapterRegistryI.cpp index abd2b465bcf..26d3dca3da2 100644 --- a/cpp/src/IcePack/AdapterRegistryI.cpp +++ b/cpp/src/IcePack/AdapterRegistryI.cpp @@ -14,6 +14,7 @@ #include #include +#include using namespace std; using namespace IcePack; @@ -21,16 +22,23 @@ using namespace IcePack; IcePack::AdapterRegistryI::AdapterRegistryI(const Ice::CommunicatorPtr& communicator, const string& envName, const string& dbName, const TraceLevelsPtr& traceLevels) : - _dict(communicator, envName, dbName), - _traceLevels(traceLevels) + _connectionCache(Freeze::createConnection(communicator, envName)), + _dictCache(_connectionCache, dbName), + _traceLevels(traceLevels), + _envName(envName), + _communicator(communicator), + _dbName(dbName) { } void IcePack::AdapterRegistryI::add(const string& id, const AdapterPrx& adapter, const Ice::Current&) { - StringObjectProxyDict::iterator p = _dict.find(id); - if(p != _dict.end()) + Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName); + StringObjectProxyDict dict(connection, _dbName); + + StringObjectProxyDict::iterator p = dict.find(id); + if(p != dict.end()) { try { @@ -53,7 +61,7 @@ IcePack::AdapterRegistryI::add(const string& id, const AdapterPrx& adapter, cons } throw AdapterExistsException(); } - _dict.put(pair(id, adapter)); + dict.put(pair(id, adapter)); if(_traceLevels->adapterRegistry > 0) { @@ -65,13 +73,16 @@ IcePack::AdapterRegistryI::add(const string& id, const AdapterPrx& adapter, cons void IcePack::AdapterRegistryI::remove(const string& id, const Ice::Current&) { - StringObjectProxyDict::iterator p = _dict.find(id); - if(p == _dict.end()) + Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName); + StringObjectProxyDict dict(connection, _dbName); + + StringObjectProxyDict::iterator p = dict.find(id); + if(p == dict.end()) { throw AdapterNotExistException(); } - _dict.erase(p); + dict.erase(p); if(_traceLevels->adapterRegistry > 0) { @@ -83,8 +94,11 @@ IcePack::AdapterRegistryI::remove(const string& id, const Ice::Current&) AdapterPrx IcePack::AdapterRegistryI::findById(const string& id, const Ice::Current&) { - StringObjectProxyDict::iterator p = _dict.find(id); - if(p != _dict.end()) + Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName); + StringObjectProxyDict dict(connection, _dbName); + + StringObjectProxyDict::iterator p = dict.find(id); + if(p != dict.end()) { try { @@ -92,7 +106,7 @@ IcePack::AdapterRegistryI::findById(const string& id, const Ice::Current&) } catch(const Ice::ObjectNotExistException&) { - _dict.erase(p); + dict.erase(p); } catch(const Ice::LocalException&) { @@ -105,10 +119,13 @@ IcePack::AdapterRegistryI::findById(const string& id, const Ice::Current&) Ice::StringSeq IcePack::AdapterRegistryI::getAll(const Ice::Current&) const { + Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName); + StringObjectProxyDict dict(connection, _dbName); + Ice::StringSeq ids; - ids.reserve(_dict.size()); + ids.reserve(dict.size()); - for(StringObjectProxyDict::const_iterator p = _dict.begin(); p != _dict.end(); ++p) + for(StringObjectProxyDict::const_iterator p = dict.begin(); p != dict.end(); ++p) { ids.push_back(p->first); } diff --git a/cpp/src/IcePack/AdapterRegistryI.h b/cpp/src/IcePack/AdapterRegistryI.h index 9378b691747..7361c0f8d24 100644 --- a/cpp/src/IcePack/AdapterRegistryI.h +++ b/cpp/src/IcePack/AdapterRegistryI.h @@ -38,8 +38,13 @@ public: private: - StringObjectProxyDict _dict; + Freeze::ConnectionPtr _connectionCache; + StringObjectProxyDict _dictCache; TraceLevelsPtr _traceLevels; + const std::string _envName; + const Ice::CommunicatorPtr _communicator; + const std::string _dbName; + }; } diff --git a/cpp/src/IcePack/NodeRegistryI.cpp b/cpp/src/IcePack/NodeRegistryI.cpp index bc4327f70b9..6b86c16c743 100644 --- a/cpp/src/IcePack/NodeRegistryI.cpp +++ b/cpp/src/IcePack/NodeRegistryI.cpp @@ -15,6 +15,7 @@ #include #include #include +#include using namespace std; using namespace IcePack; @@ -25,12 +26,16 @@ IcePack::NodeRegistryI::NodeRegistryI(const Ice::CommunicatorPtr& communicator, const AdapterRegistryPtr& adapterRegistry, const AdapterFactoryPtr& adapterFactory, const TraceLevelsPtr& traceLevels) : - _dict(communicator, envName, dbName), + _connectionCache(Freeze::createConnection(communicator, envName)), + _dictCache(_connectionCache, dbName), _adapterRegistry(adapterRegistry), _adapterFactory(adapterFactory), - _traceLevels(traceLevels) + _traceLevels(traceLevels), + _envName(envName), + _communicator(communicator), + _dbName(dbName) { - for(StringObjectProxyDict::const_iterator p = _dict.begin(); p != _dict.end(); ++p) + for(StringObjectProxyDict::const_iterator p = _dictCache.begin(); p != _dictCache.end(); ++p) { NodePrx node = NodePrx::uncheckedCast(p->second); try @@ -52,8 +57,11 @@ IcePack::NodeRegistryI::add(const string& name, const NodePrx& node, const Ice:: { IceUtil::Mutex::Lock sync(*this); - StringObjectProxyDict::iterator p = _dict.find(name); - if(p != _dict.end()) + Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName); + StringObjectProxyDict dict(connection, _dbName); + + StringObjectProxyDict::iterator p = dict.find(name); + if(p != dict.end()) { try { @@ -76,7 +84,7 @@ IcePack::NodeRegistryI::add(const string& name, const NodePrx& node, const Ice:: } else { - _dict.put(pair(name, node)); + dict.put(pair(name, node)); if(_traceLevels->nodeRegistry > 0) { @@ -120,13 +128,17 @@ IcePack::NodeRegistryI::remove(const string& name, const Ice::Current&) { IceUtil::Mutex::Lock sync(*this); - StringObjectProxyDict::iterator p = _dict.find(name); - if(p == _dict.end()) + Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName); + StringObjectProxyDict dict(connection, _dbName); + + + StringObjectProxyDict::iterator p = dict.find(name); + if(p == dict.end()) { throw NodeNotExistException(); } - _dict.erase(p); + dict.erase(p); if(_traceLevels->nodeRegistry > 0) { @@ -151,8 +163,11 @@ IcePack::NodeRegistryI::remove(const string& name, const Ice::Current&) NodePrx IcePack::NodeRegistryI::findByName(const string& name, const Ice::Current&) { - StringObjectProxyDict::const_iterator p = _dict.find(name); - if(p != _dict.end()) + Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName); + StringObjectProxyDict dict(connection, _dbName); + + StringObjectProxyDict::const_iterator p = dict.find(name); + if(p != dict.end()) { try { @@ -172,10 +187,13 @@ IcePack::NodeRegistryI::findByName(const string& name, const Ice::Current&) Ice::StringSeq IcePack::NodeRegistryI::getAll(const Ice::Current&) const { + Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName); + StringObjectProxyDict dict(connection, _dbName); + Ice::StringSeq names; - names.reserve(_dict.size()); + names.reserve(dict.size()); - for(StringObjectProxyDict::const_iterator p = _dict.begin(); p != _dict.end(); ++p) + for(StringObjectProxyDict::const_iterator p = dict.begin(); p != dict.end(); ++p) { names.push_back(p->first); } diff --git a/cpp/src/IcePack/NodeRegistryI.h b/cpp/src/IcePack/NodeRegistryI.h index 3da69bb4ed9..d2b4a74767f 100644 --- a/cpp/src/IcePack/NodeRegistryI.h +++ b/cpp/src/IcePack/NodeRegistryI.h @@ -42,10 +42,14 @@ public: private: - StringObjectProxyDict _dict; + Freeze::ConnectionPtr _connectionCache; + StringObjectProxyDict _dictCache; AdapterRegistryPtr _adapterRegistry; AdapterFactoryPtr _adapterFactory; TraceLevelsPtr _traceLevels; + const std::string _envName; + const Ice::CommunicatorPtr _communicator; + const std::string _dbName; }; } diff --git a/cpp/src/IcePack/ObjectRegistryI.cpp b/cpp/src/IcePack/ObjectRegistryI.cpp index 6f636313d3a..4278c96e7e9 100644 --- a/cpp/src/IcePack/ObjectRegistryI.cpp +++ b/cpp/src/IcePack/ObjectRegistryI.cpp @@ -14,6 +14,7 @@ #include #include +#include using namespace std; using namespace IcePack; @@ -23,8 +24,9 @@ IcePack::ObjectRegistryI::ObjectRegistryI(const Ice::CommunicatorPtr& communicat const string& objectsDbName, const string& typesDbName, const TraceLevelsPtr& traceLevels) : - _objects(communicator, envName, objectsDbName, true), - _types(communicator, envName, typesDbName, true), + _connection(Freeze::createConnection(communicator, envName)), + _objects(_connection, objectsDbName, true), + _types(_connection, typesDbName, true), _traceLevels(traceLevels) { } diff --git a/cpp/src/IcePack/ObjectRegistryI.h b/cpp/src/IcePack/ObjectRegistryI.h index 0553073e1a4..fd73eb78818 100644 --- a/cpp/src/IcePack/ObjectRegistryI.h +++ b/cpp/src/IcePack/ObjectRegistryI.h @@ -18,6 +18,7 @@ #include #include #include +#include namespace IcePack { @@ -46,6 +47,7 @@ public: private: + Freeze::ConnectionPtr _connection; IdentityObjectDescDict _objects; StringObjectProxySeqDict _types; TraceLevelsPtr _traceLevels; diff --git a/cpp/src/IcePack/ServerRegistryI.cpp b/cpp/src/IcePack/ServerRegistryI.cpp index 036a63d5d0e..a279de7665d 100644 --- a/cpp/src/IcePack/ServerRegistryI.cpp +++ b/cpp/src/IcePack/ServerRegistryI.cpp @@ -14,6 +14,7 @@ #include #include +#include using namespace std; using namespace IcePack; @@ -21,16 +22,23 @@ using namespace IcePack; IcePack::ServerRegistryI::ServerRegistryI(const Ice::CommunicatorPtr& communicator, const string& envName, const string& dbName, const TraceLevelsPtr& traceLevels) : - _dict(communicator, envName, dbName), - _traceLevels(traceLevels) + _connectionCache(Freeze::createConnection(communicator, envName)), + _dictCache(_connectionCache, dbName), + _traceLevels(traceLevels), + _envName(envName), + _communicator(communicator), + _dbName(dbName) { } void IcePack::ServerRegistryI::add(const string& name, const ServerPrx& server, const Ice::Current&) { - StringObjectProxyDict::iterator p = _dict.find(name); - if(p != _dict.end()) + Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName); + StringObjectProxyDict dict(connection, _dbName); + + StringObjectProxyDict::iterator p = dict.find(name); + if(p != dict.end()) { try { @@ -54,7 +62,7 @@ IcePack::ServerRegistryI::add(const string& name, const ServerPrx& server, const throw ServerExistsException(); } - _dict.put(pair(name, server)); + dict.put(pair(name, server)); if(_traceLevels->serverRegistry > 0) { @@ -66,13 +74,16 @@ IcePack::ServerRegistryI::add(const string& name, const ServerPrx& server, const void IcePack::ServerRegistryI::remove(const string& name, const Ice::Current&) { - StringObjectProxyDict::iterator p = _dict.find(name); - if(p == _dict.end()) + Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName); + StringObjectProxyDict dict(connection, _dbName); + + StringObjectProxyDict::iterator p = dict.find(name); + if(p == dict.end()) { throw ServerNotExistException(); } - _dict.erase(p); + dict.erase(p); if(_traceLevels->serverRegistry > 0) { @@ -84,8 +95,11 @@ IcePack::ServerRegistryI::remove(const string& name, const Ice::Current&) ServerPrx IcePack::ServerRegistryI::findByName(const string& name, const Ice::Current&) { - StringObjectProxyDict::iterator p = _dict.find(name); - if(p != _dict.end()) + Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName); + StringObjectProxyDict dict(connection, _dbName); + + StringObjectProxyDict::iterator p = dict.find(name); + if(p != dict.end()) { try { @@ -93,7 +107,7 @@ IcePack::ServerRegistryI::findByName(const string& name, const Ice::Current&) } catch(const Ice::ObjectNotExistException&) { - _dict.erase(p); + dict.erase(p); } catch(const Ice::LocalException&) { @@ -106,10 +120,13 @@ IcePack::ServerRegistryI::findByName(const string& name, const Ice::Current&) Ice::StringSeq IcePack::ServerRegistryI::getAll(const Ice::Current&) const { + Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName); + StringObjectProxyDict dict(connection, _dbName); + Ice::StringSeq names; - names.reserve(_dict.size()); + names.reserve(dict.size()); - for(StringObjectProxyDict::const_iterator p = _dict.begin(); p != _dict.end(); ++p) + for(StringObjectProxyDict::const_iterator p = dict.begin(); p != dict.end(); ++p) { names.push_back(p->first); } diff --git a/cpp/src/IcePack/ServerRegistryI.h b/cpp/src/IcePack/ServerRegistryI.h index 165b6a7def9..232d9d0d6e2 100644 --- a/cpp/src/IcePack/ServerRegistryI.h +++ b/cpp/src/IcePack/ServerRegistryI.h @@ -38,8 +38,12 @@ public: private: - StringObjectProxyDict _dict; + Freeze::ConnectionPtr _connectionCache; + StringObjectProxyDict _dictCache; TraceLevelsPtr _traceLevels; + const std::string _envName; + const Ice::CommunicatorPtr _communicator; + const std::string _dbName; }; } diff --git a/cpp/src/IceStorm/Service.cpp b/cpp/src/IceStorm/Service.cpp index 2861657f620..e79546a680d 100644 --- a/cpp/src/IceStorm/Service.cpp +++ b/cpp/src/IceStorm/Service.cpp @@ -99,5 +99,5 @@ IceStorm::ServiceI::stop() // // It's necessary to reap all destroyed topics on shutdown. // - _manager->reap(); + _manager->shutdown(); } diff --git a/cpp/src/IceStorm/TopicI.cpp b/cpp/src/IceStorm/TopicI.cpp index c907fdc814a..674cd4c3f4b 100644 --- a/cpp/src/IceStorm/TopicI.cpp +++ b/cpp/src/IceStorm/TopicI.cpp @@ -18,8 +18,10 @@ #include #include #include +#include #include + using namespace IceStorm; using namespace std; @@ -301,7 +303,8 @@ TopicI::TopicI(const Ice::ObjectAdapterPtr& adapter, const TraceLevelsPtr& trace _name(name), _factory(factory), _destroyed(false), - _links(adapter->getCommunicator(), envName, dbName, createDb) + _connection(Freeze::createConnection(adapter->getCommunicator(), envName)), + _links(_connection, dbName, createDb) { _subscribers = new TopicSubscribers(_traceLevels); diff --git a/cpp/src/IceStorm/TopicI.h b/cpp/src/IceStorm/TopicI.h index e69238062be..76e1c7b15c5 100644 --- a/cpp/src/IceStorm/TopicI.h +++ b/cpp/src/IceStorm/TopicI.h @@ -117,6 +117,7 @@ private: TopicSubscribersPtr _subscribers; // Set of Subscribers + Freeze::ConnectionPtr _connection; IdentityLinkDict _links; // The database of Topic links }; diff --git a/cpp/src/IceStorm/TopicManagerI.cpp b/cpp/src/IceStorm/TopicManagerI.cpp index 009574b7706..444d734f153 100644 --- a/cpp/src/IceStorm/TopicManagerI.cpp +++ b/cpp/src/IceStorm/TopicManagerI.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -32,7 +33,8 @@ TopicManagerI::TopicManagerI(const Ice::CommunicatorPtr& communicator, const Ice _publishAdapter(publishAdapter), _traceLevels(traceLevels), _envName(envName), - _topics(_communicator, envName, dbName) + _connection(Freeze::createConnection(_communicator, envName)), + _topics(_connection, dbName) { _flusher = new Flusher(_communicator, _traceLevels); _factory = new SubscriberFactory(_communicator, _traceLevels, _flusher); @@ -194,6 +196,13 @@ TopicManagerI::reap() } } +void +TopicManagerI::shutdown() +{ + IceUtil::Mutex::Lock sync(*this); + reap(); +} + void TopicManagerI::installTopic(const string& message, const string& name, bool create) { diff --git a/cpp/src/IceStorm/TopicManagerI.h b/cpp/src/IceStorm/TopicManagerI.h index 88b32e668ef..a50d3de8310 100644 --- a/cpp/src/IceStorm/TopicManagerI.h +++ b/cpp/src/IceStorm/TopicManagerI.h @@ -58,6 +58,8 @@ public: void reap(); + void shutdown(); + private: void installTopic(const std::string&, const std::string&, bool); @@ -71,6 +73,7 @@ private: FlusherPtr _flusher; SubscriberFactoryPtr _factory; std::string _envName; + Freeze::ConnectionPtr _connection; StringBoolDict _topics; }; diff --git a/cpp/src/slice2freezej/Main.cpp b/cpp/src/slice2freezej/Main.cpp index f449b98d8db..f3f3285363e 100644 --- a/cpp/src/slice2freezej/Main.cpp +++ b/cpp/src/slice2freezej/Main.cpp @@ -100,16 +100,11 @@ FreezeGenerator::generate(UnitPtr& u, const Dict& dict) out << sb; // - // Constructors + // Constructor // - out << sp << nl << "public" << nl << name << "(Ice.Communicator communicator, String envName, String dbName, boolean createDb)"; + out << sp << nl << "public" << nl << name << "(Freeze.Connection connection, String dbName, boolean createDb)"; out << sb; - out << nl << "super(communicator, envName, dbName, createDb);"; - out << eb; - - out << sp << nl << "public" << nl << name << "(Ice.Communicator communicator, com.sleepycat.db.DbEnv dbEnv, String dbName, boolean createDb)"; - out << sb; - out << nl << "super(communicator, dbEnv, dbName, createDb);"; + out << nl << "super(connection, dbName, createDb);"; out << eb; // -- cgit v1.2.3