summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Freeze/.depend2
-rw-r--r--cpp/src/Freeze/DBI.cpp197
-rw-r--r--cpp/src/Freeze/DBI.h45
-rw-r--r--cpp/src/Freeze/Makefile2
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 $@