diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Freeze/.depend | 2 | ||||
-rw-r--r-- | cpp/src/Freeze/DBI.cpp | 197 | ||||
-rw-r--r-- | cpp/src/Freeze/DBI.h | 45 | ||||
-rw-r--r-- | cpp/src/Freeze/Makefile | 2 |
4 files changed, 169 insertions, 77 deletions
diff --git a/cpp/src/Freeze/.depend b/cpp/src/Freeze/.depend index 920e7b4cea3..e79703bfc9b 100644 --- a/cpp/src/Freeze/.depend +++ b/cpp/src/Freeze/.depend @@ -1,2 +1,2 @@ DB.o: DB.cpp ../../include/Freeze/DB.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h ../../include/Ice/ObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Native.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/Stream.h ../../include/Ice/InstanceF.h ../../include/Ice/Buffer.h -DBI.o: DBI.cpp ../../include/Ice/Communicator.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h ../../include/Ice/ObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Native.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/LoggerF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/PicklerF.h ../../include/Ice/PropertiesF.h ../../include/Ice/ValueFactoryF.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LocalException.h ../Freeze/DBI.h ../../include/Freeze/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Freeze/DBF.h ../../include/Freeze/DB.h +DBI.o: DBI.cpp ../../include/Ice/Communicator.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h ../../include/Ice/ObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Native.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/LoggerF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/PicklerF.h ../../include/Ice/PropertiesF.h ../../include/Ice/ValueFactoryF.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LocalException.h ../Freeze/DBI.h ../../include/IceUtil/IceUtil.h ../../include/IceUtil/Functional.h ../../include/Freeze/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Freeze/DBF.h ../../include/Freeze/DB.h diff --git a/cpp/src/Freeze/DBI.cpp b/cpp/src/Freeze/DBI.cpp index 6dda091275a..8cfbcfbd5bc 100644 --- a/cpp/src/Freeze/DBI.cpp +++ b/cpp/src/Freeze/DBI.cpp @@ -19,115 +19,184 @@ using namespace std; using namespace Ice; using namespace Freeze; -DBPtr -Freeze::DBFactoryI::createDB() +Freeze::DBI::DBI(const CommunicatorPtr& communicator, const PropertiesPtr& properties, const DBEnvIPtr& dbenv, + ::DB* db, const string& name) : + _communicator(communicator), + _properties(properties), + _dbenv(dbenv), + _db(db), + _name(name) { - JTCSyncT<JTCMutex> sync(*this); +} - if (_destroy) +Freeze::DBI::~DBI() +{ + if (!_closed) { - throw ObjectNotExistException(__FILE__, __LINE__); + _communicator->getLogger()->warning("database has not been closed"); } - - return 0; } void -Freeze::DBFactoryI::destroy() +Freeze::DBI::close() { JTCSyncT<JTCMutex> sync(*this); - if (_destroy) + if (!_dbenv) + { + return; + } + + int ret = _db->close(_db, 0); + + if(ret != 0) { - throw ObjectNotExistException(__FILE__, __LINE__); + DBException ex; + ex.message = "DB->close: "; + ex.message += db_strerror(ret); + throw ex; } - _destroy = true; + _dbenv->remove(_name); + _dbenv = 0; } -Freeze::DBFactoryI::DBFactoryI(const CommunicatorPtr& communicator, const PropertiesPtr& properties) : +Freeze::DBEnvI::DBEnvI(const CommunicatorPtr& communicator, const PropertiesPtr& properties) : + _closed(false), _communicator(communicator), - _properties(properties), - _destroy(false) + _properties(properties) { - string directory = _properties->getProperty("Freeze.Directory"); + int ret; -// -// TODO: Should we really try to create the directory? Perhaps we -// better leave this task to the administrator, and simply let DB fail -// in case the directory does not exist. -// -/* - if(!directory.empty()) + ret = db_env_create(&_dbenv, 0); + + if (ret != 0) { - // - // Check whether the directory exists. If yes, we don't need - // to create it. Note that we don't further check the type of - // the file, DB will fail appropriately if it's the wrong - // time. - // - struct stat sb; - if (stat(directory.c_str(), &sb) == 0) - { - // - // Directory does not exist, create it. - // - if (mkdir(directory.c_str(), S_IRWXU) != 0) - { - throw SystemException(__FILE__, __LINE__); - } - } + DBException ex; + ex.message = "db_env_create: "; + ex.message += db_strerror(ret); + throw ex; } -*/ - int ret; + _directory = _properties->getProperty("Freeze.Directory"); + + const char* dir = 0; + if (!_directory.empty()) + { + dir = _directory.c_str(); + } - if ((ret = db_env_create(&_dbenv, 0)) != 0) + ret = _dbenv->open(_dbenv, dir, + DB_CREATE | + DB_INIT_LOCK | + DB_INIT_LOG | + DB_INIT_MPOOL | + DB_INIT_TXN | + DB_RECOVER | + DB_THREAD, + S_IRUSR | S_IWUSR); + + if (ret != 0) { DBException ex; - ex.message = db_strerror(ret); + ex.message = "DB_ENV->open: "; + ex.message += db_strerror(ret); throw ex; } +} - const char* dir = 0; - if (!directory.empty()) +Freeze::DBEnvI::~DBEnvI() +{ + if (!_closed) + { + _communicator->getLogger()->warning("database environment object has not been closed"); + } +} + +DBPtr +Freeze::DBEnvI::open(const string& name) +{ + JTCSyncT<JTCMutex> sync(*this); + + map<string, DBPtr>::iterator p = _dbmap.find(name); + if (p != _dbmap.end()) + { + return p->second; + } + + int ret; + + ::DB* db; + ret = db_create(&db, _dbenv, 0); + + if(ret != 0) { - dir = directory.c_str(); + DBException ex; + ex.message = "db_create: "; + ex.message += db_strerror(ret); + throw ex; } - if ((ret = _dbenv->open(_dbenv, dir, - DB_CREATE | - DB_INIT_LOCK | - DB_INIT_LOG | - DB_INIT_MPOOL | - DB_INIT_TXN | - DB_RECOVER | - DB_THREAD, - S_IRUSR | S_IWUSR)) != 0) + ret = db->open(db, name.c_str(), 0, DB_BTREE, DB_CREATE | DB_THREAD, S_IRUSR | S_IWUSR); + + if(ret != 0) { DBException ex; - ex.message = db_strerror(ret); + ex.message = "DB->open: "; + ex.message += db_strerror(ret); throw ex; } + + DBPtr dbp = new DBI(_communicator, _properties, this, db, name); + _dbmap[name] = dbp; + return dbp; } -Freeze::DBFactoryI::~DBFactoryI() +void +Freeze::DBEnvI::close() { - if (!_destroy) + JTCSyncT<JTCMutex> sync(*this); + + if (_closed) + { + return; + } + + for (map<string, DBPtr>::iterator p = _dbmap.begin(); p != _dbmap.end(); ++p) + { + p->second->close(); + } + _dbmap.clear(); + + int ret = _dbenv->close(_dbenv, 0); + + if(ret != 0) { - _communicator->getLogger()->warning("database factory object has not been destroyed"); + DBException ex; + ex.message = "DB_ENV->close: "; + ex.message += db_strerror(ret); + throw ex; } + + _closed = true; +} + +void +Freeze::DBEnvI::remove(const string& name) +{ + JTCSyncT<JTCMutex> sync(*this); + + _dbmap.erase(name); } -DBFactoryPtr +DBEnvPtr Freeze::initialize(const CommunicatorPtr& communicator) { - return new DBFactoryI(communicator, communicator->getProperties()); + return new DBEnvI(communicator, communicator->getProperties()); } -DBFactoryPtr +DBEnvPtr Freeze::initializeWithProperties(const CommunicatorPtr& communicator, const PropertiesPtr& properties) { - return new DBFactoryI(communicator, properties); + return new DBEnvI(communicator, properties); } - diff --git a/cpp/src/Freeze/DBI.h b/cpp/src/Freeze/DBI.h index 60f41a95a3d..877b582ed07 100644 --- a/cpp/src/Freeze/DBI.h +++ b/cpp/src/Freeze/DBI.h @@ -8,9 +8,10 @@ // // ********************************************************************** -#ifndef FREEZE_DB_FACTORY_I_H -#define FREEZE_DB_FACTORY_I_H +#ifndef FREEZE_DB_I_H +#define FREEZE_DB_I_H +#include <IceUtil/IceUtil.h> #include <Freeze/Initialize.h> #include <Freeze/DB.h> #include <db.h> @@ -18,26 +19,48 @@ namespace Freeze { -class DBFactoryI : public DBFactory, public JTCMutex +class DBEnvI; +typedef IceUtil::Handle<DBEnvI> DBEnvIPtr; + +class DBI : public DB, public JTCMutex { public: - virtual DBPtr createDB(); - virtual void destroy(); + DBI(const ::Ice::CommunicatorPtr&, const ::Ice::PropertiesPtr&, const DBEnvIPtr&, ::DB*, const std::string&); + virtual ~DBI(); + + virtual void close(); private: - DBFactoryI(const ::Ice::CommunicatorPtr&, const ::Ice::PropertiesPtr&); - virtual ~DBFactoryI(); + bool _closed; + ::Ice::CommunicatorPtr _communicator; + ::Ice::PropertiesPtr _properties; + DBEnvIPtr _dbenv; + ::DB* _db; + std::string _name; +}; + +class DBEnvI : public DBEnv, public JTCMutex +{ +public: + + DBEnvI(const ::Ice::CommunicatorPtr&, const ::Ice::PropertiesPtr&); + virtual ~DBEnvI(); - friend FREEZE_API DBFactoryPtr initialize(const ::Ice::CommunicatorPtr&); - friend FREEZE_API DBFactoryPtr initializeWithProperties(const ::Ice::CommunicatorPtr&, - const ::Ice::PropertiesPtr&); + virtual DBPtr open(const std::string&); + virtual void close(); + + void remove(const std::string&); + +private: + bool _closed; ::Ice::CommunicatorPtr _communicator; ::Ice::PropertiesPtr _properties; - bool _destroy; DB_ENV* _dbenv; + std::string _directory; + std::map<std::string, DBPtr> _dbmap; }; } diff --git a/cpp/src/Freeze/Makefile b/cpp/src/Freeze/Makefile index a5462526aaf..ab888b45551 100644 --- a/cpp/src/Freeze/Makefile +++ b/cpp/src/Freeze/Makefile @@ -30,7 +30,7 @@ SLICECMD = $(SLICE) --include-dir Freeze --dll-export FREEZE_API -I$(slicedir) include $(top_srcdir)/config/Make.rules CPPFLAGS := -I.. $(CPPFLAGS) -I$(DB)/include -LDLAGS := $(LDFLAGS) -I$(DB)/lib +LDFLAGS := $(LDFLAGS) -L$(DB)/lib $(VERSIONED_NAME): $(OBJS) rm -f $@ |