summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Freeze/.depend23
-rw-r--r--cpp/src/Freeze/ConnectionI.cpp150
-rw-r--r--cpp/src/Freeze/ConnectionI.h139
-rw-r--r--cpp/src/Freeze/EvictorI.cpp2
-rw-r--r--cpp/src/Freeze/Makefile15
-rw-r--r--cpp/src/Freeze/MapI.cpp391
-rw-r--r--cpp/src/Freeze/MapI.h47
-rw-r--r--cpp/src/Freeze/SharedDb.cpp170
-rw-r--r--cpp/src/Freeze/SharedDb.h83
-rw-r--r--cpp/src/Freeze/SharedDbEnv.h4
-rw-r--r--cpp/src/Freeze/TransactionHolder.cpp76
-rw-r--r--cpp/src/Freeze/TransactionI.cpp103
-rw-r--r--cpp/src/Freeze/TransactionI.h59
-rw-r--r--cpp/src/Freeze/freeze.dsp181
-rw-r--r--cpp/src/IcePack/AdapterRegistryI.cpp43
-rw-r--r--cpp/src/IcePack/AdapterRegistryI.h7
-rw-r--r--cpp/src/IcePack/NodeRegistryI.cpp44
-rw-r--r--cpp/src/IcePack/NodeRegistryI.h6
-rw-r--r--cpp/src/IcePack/ObjectRegistryI.cpp6
-rw-r--r--cpp/src/IcePack/ObjectRegistryI.h2
-rw-r--r--cpp/src/IcePack/ServerRegistryI.cpp43
-rw-r--r--cpp/src/IcePack/ServerRegistryI.h6
-rw-r--r--cpp/src/IceStorm/Service.cpp2
-rw-r--r--cpp/src/IceStorm/TopicI.cpp5
-rw-r--r--cpp/src/IceStorm/TopicI.h1
-rw-r--r--cpp/src/IceStorm/TopicManagerI.cpp11
-rw-r--r--cpp/src/IceStorm/TopicManagerI.h3
-rw-r--r--cpp/src/slice2freezej/Main.cpp11
28 files changed, 1369 insertions, 264 deletions
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 <Freeze/ConnectionI.h>
+#include <Freeze/MapI.h>
+#include <Freeze/Initialize.h>
+
+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<DBMapHelperI*>::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 <Freeze/Connection.h>
+#include <Freeze/Initialize.h>
+#include <Freeze/TransactionI.h>
+#include <Freeze/SharedDbEnv.h>
+#include <list>
+
+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<DBMapHelperI*> _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 <Freeze/MapI.h>
#include <Freeze/DBException.h>
-#include <sys/stat.h>
+#include <Freeze/SharedDb.h>
#include <stdlib.h>
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<Ice::Byte>& 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<DBIteratorHelperI*>::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 <Freeze/Map.h>
-#include <Freeze/SharedDbEnv.h>
+#include <Freeze/SharedDb.h>
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<Tx> 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> _db;
+ const ConnectionIPtr _connection;
+ mutable std::list<DBIteratorHelperI*> _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 <Freeze/SharedDb.h>
+#include <IceUtil/StaticMutex.h>
+#include <Freeze/DBException.h>
+#include <sys/stat.h>
+
+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<SharedDb> result(new SharedDb(key, connection, createDb));
+
+ //
+ // Insert it into the map
+ //
+ pair<Map::iterator, bool> 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 <Freeze/ConnectionI.h>
+#include <IceUtil/Handle.h>
+#include <db_cxx.h>
+#include <map>
+
+namespace Freeze
+{
+
+class SharedDb;
+typedef IceUtil::Handle<SharedDb> 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<MapKey, Freeze::SharedDb*> 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 <Ice/Config.h>
#include <Ice/Ice.h>
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 <Freeze/TransactionHolder.h>
+
+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 <Freeze/TransactionI.h>
+#include <Freeze/ConnectionI.h>
+#include <Freeze/DBException.h>
+
+
+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 <Freeze/Transaction.h>
+#include <db_cxx.h>
+
+namespace Freeze
+{
+
+class ConnectionI;
+typedef IceUtil::Handle<ConnectionI> 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<TransactionI> 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 <IcePack/AdapterRegistryI.h>
#include <IcePack/TraceLevels.h>
+#include <Freeze/Initialize.h>
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<const string, const Ice::ObjectPrx>(id, adapter));
+ dict.put(pair<const string, const Ice::ObjectPrx>(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 <IcePack/NodeRegistryI.h>
#include <IcePack/AdapterFactory.h>
#include <IcePack/TraceLevels.h>
+#include <Freeze/Initialize.h>
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<const string, const Ice::ObjectPrx>(name, node));
+ dict.put(pair<const string, const Ice::ObjectPrx>(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 <IcePack/ObjectRegistryI.h>
#include <IcePack/TraceLevels.h>
+#include <Freeze/Initialize.h>
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 <IcePack/Internal.h>
#include <IcePack/IdentityObjectDescDict.h>
#include <IcePack/StringObjectProxySeqDict.h>
+#include <Freeze/ConnectionF.h>
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 <IcePack/ServerRegistryI.h>
#include <IcePack/TraceLevels.h>
+#include <Freeze/Initialize.h>
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<const string, const Ice::ObjectPrx>(name, server));
+ dict.put(pair<const string, const Ice::ObjectPrx>(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 <IceStorm/SubscriberFactory.h>
#include <IceStorm/Subscriber.h>
#include <IceStorm/TraceLevels.h>
+#include <Freeze/Initialize.h>
#include <algorithm>
+
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 <IceStorm/TopicI.h>
#include <IceStorm/Flusher.h>
#include <IceStorm/TraceLevels.h>
+#include <Freeze/Initialize.h>
#include <functional>
#include <ctype.h>
@@ -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);
@@ -195,6 +197,13 @@ TopicManagerI::reap()
}
void
+TopicManagerI::shutdown()
+{
+ IceUtil::Mutex::Lock sync(*this);
+ reap();
+}
+
+void
TopicManagerI::installTopic(const string& message, const string& name, bool create)
{
if(_traceLevels->topicMgr > 0)
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;
//