summaryrefslogtreecommitdiff
path: root/cpp/src/Freeze/IndexI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/Freeze/IndexI.cpp')
-rw-r--r--cpp/src/Freeze/IndexI.cpp447
1 files changed, 0 insertions, 447 deletions
diff --git a/cpp/src/Freeze/IndexI.cpp b/cpp/src/Freeze/IndexI.cpp
deleted file mode 100644
index 3b9688251d3..00000000000
--- a/cpp/src/Freeze/IndexI.cpp
+++ /dev/null
@@ -1,447 +0,0 @@
-// **********************************************************************
-//
-// Copyright (c) 2003-2015 ZeroC, Inc. All rights reserved.
-//
-// This copy of Ice is licensed to you under the terms described in the
-// ICE_LICENSE file included in this distribution.
-//
-// **********************************************************************
-
-#include <Freeze/IndexI.h>
-#include <Freeze/Util.h>
-#include <Freeze/ObjectStore.h>
-#include <Freeze/EvictorI.h>
-
-#include <IceUtil/StringConverter.h>
-
-using namespace Freeze;
-using namespace Ice;
-using namespace std;
-
-
-static int
-callback(Db* secondary, const Dbt* key, const Dbt* value, Dbt* result)
-{
- void* indexObj = secondary->get_app_private();
- IndexI* index = static_cast<IndexI*>(indexObj);
- assert(index != 0);
- return index->secondaryKeyCreate(secondary, key, value, result);
-}
-
-
-Freeze::IndexI::IndexI(Index& index) :
- _index(index),
- _store(0)
-{
-}
-
-vector<Identity>
-Freeze::IndexI::untypedFindFirst(const Key& bytes, Int firstN) const
-{
- DeactivateController::Guard
- deactivateGuard(_store->evictor()->deactivateController());
-
- Dbt dbKey;
- initializeInDbt(bytes, dbKey);
-#if (DB_VERSION_MAJOR <= 4) || (DB_VERSION_MAJOR == 5 && DB_VERSION_MINOR <= 1)
- //
- // When we have a custom-comparison function, Berkeley DB returns
- // the key on-disk (when it finds one). We disable this behavior:
- // (ref Oracle SR 5925672.992)
- //
- dbKey.set_flags(DB_DBT_USERMEM | DB_DBT_PARTIAL);
-#else
- //
- // In DB > 5.1 we can not set DB_DBT_PARTIAL in the key Dbt,
- // when using DB_SET, we must resize the Dbt key param to hold enought
- // space or Dbc::get fails with DB_BUFFER_SMALL.
- //
- dbKey.set_flags(DB_DBT_USERMEM);
- dbKey.set_ulen(static_cast<u_int32_t>(bytes.size()));
-#endif
-
- Key pkey(1024);
- Dbt pdbKey;
- initializeOutDbt(pkey, pdbKey);
-
- Dbt dbValue;
- dbValue.set_flags(DB_DBT_USERMEM | DB_DBT_PARTIAL);
-
- const Ice::CommunicatorPtr& communicator = _store->communicator();
- const Ice::EncodingVersion& encoding = _store->encoding();
-
- TransactionIPtr transaction = _store->evictor()->beforeQuery();
- DbTxn* tx = transaction == 0 ? 0 : transaction->dbTxn();
-
- vector<Identity> identities;
-
- try
- {
- for(;;)
- {
- Dbc* dbc = 0;
- identities.clear();
-
- try
- {
- //
- // Move to the first record
- //
- _db->cursor(tx, &dbc, 0);
- u_int32_t flags = DB_SET;
-
- bool found;
-
- do
- {
- for(;;)
- {
- try
- {
- //
- // It is critical to set key size to key capacity before the
- // get, as a resize that increases the size inserts 0
- //
- pkey.resize(pkey.capacity());
-
- found = (dbc->pget(&dbKey, &pdbKey, &dbValue, flags) == 0);
- if(found)
- {
- pkey.resize(pdbKey.get_size());
-
- Ice::Identity ident;
- ObjectStoreBase::unmarshal(ident, pkey, communicator, encoding);
- identities.push_back(ident);
- flags = DB_NEXT_DUP;
- }
- break; // for(;;)
- }
- catch(const DbDeadlockException&)
- {
- throw;
- }
- catch(const DbException& dx)
- {
- handleDbException(dx, pkey, pdbKey, __FILE__, __LINE__);
- }
- }
- }
- while((firstN <= 0 || identities.size() < static_cast<size_t>(firstN)) && found);
-
- Dbc* toClose = dbc;
- dbc = 0;
- toClose->close();
- break; // for (;;)
- }
- catch(const DbDeadlockException&)
- {
- if(dbc != 0)
- {
- try
- {
- dbc->close();
- }
- catch(const DbDeadlockException&)
- {
- if(tx != 0)
- {
- throw;
- }
- // Else ignored
- }
- }
-
- if(_store->evictor()->deadlockWarning())
- {
- Warning out(_store->communicator()->getLogger());
- out << "Deadlock in Freeze::IndexI::untypedFindFirst while searching \""
- << _store->evictor()->filename() + "/" + _dbName << "\"; retrying ...";
- }
-
- if(tx != 0)
- {
- throw;
- }
- // Else retry
- }
- catch(...)
- {
- if(dbc != 0)
- {
- try
- {
- dbc->close();
- }
- catch(const DbDeadlockException&)
- {
- if(tx != 0)
- {
- throw;
- }
- // Else ignored
- }
- }
- throw;
- }
- }
- }
- catch(const DbDeadlockException& dx)
- {
- throw DeadlockException(__FILE__, __LINE__, dx.what(), transaction);
- }
- catch(const DbException& dx)
- {
- handleDbException(dx, __FILE__, __LINE__);
- }
-
- return identities;
-}
-
-vector<Identity>
-Freeze::IndexI::untypedFind(const Key& bytes) const
-{
- return untypedFindFirst(bytes, 0);
-}
-
-Int
-Freeze::IndexI::untypedCount(const Key& bytes) const
-{
- DeactivateController::Guard
- deactivateGuard(_store->evictor()->deactivateController());
-
- Dbt dbKey;
- initializeInDbt(bytes, dbKey);
-#if (DB_VERSION_MAJOR <= 4) || (DB_VERSION_MAJOR == 5 && DB_VERSION_MINOR <= 1)
- //
- // When we have a custom-comparison function, Berkeley DB returns
- // the key on-disk (when it finds one). We disable this behavior:
- // (ref Oracle SR 5925672.992)
- //
- dbKey.set_flags(DB_DBT_USERMEM | DB_DBT_PARTIAL);
-#else
- //
- // In DB > 5.1 we can not set DB_DBT_PARTIAL in the key Dbt,
- // when using DB_SET, we must resize the Dbt key param to hold enought
- // space or Dbc::get fails with DB_BUFFER_SMALL.
- //
- dbKey.set_flags(DB_DBT_USERMEM);
- dbKey.set_ulen(static_cast<u_int32_t>(bytes.size()));
-#endif
-
- Dbt dbValue;
- dbValue.set_flags(DB_DBT_USERMEM | DB_DBT_PARTIAL);
-
- TransactionIPtr transaction = _store->evictor()->beforeQuery();
- DbTxn* tx = transaction == 0 ? 0 : transaction->dbTxn();
-
- Int result = 0;
-
- try
- {
- for(;;)
- {
- Dbc* dbc = 0;
-
- try
- {
- //
- // Move to the first record
- //
- _db->cursor(tx, &dbc, 0);
- bool found = (dbc->get(&dbKey, &dbValue, DB_SET) == 0);
-
- if(found)
- {
- db_recno_t count = 0;
- dbc->count(&count, 0);
- result = static_cast<Int>(count);
- }
-
- Dbc* toClose = dbc;
- dbc = 0;
- toClose->close();
- break; // for (;;)
- }
- catch(const DbDeadlockException&)
- {
- if(dbc != 0)
- {
- try
- {
- dbc->close();
- }
- catch(const DbDeadlockException&)
- {
- if(tx != 0)
- {
- throw;
- }
- // Else ignored
- }
- }
-
- if(_store->evictor()->deadlockWarning())
- {
- Warning out(_store->communicator()->getLogger());
- out << "Deadlock in Freeze::IndexI::untypedCount while searching \""
- << _store->evictor()->filename() + "/" + _dbName << "\"; retrying ...";
- }
-
- if(tx != 0)
- {
- throw;
- }
- // Else retry
-
- }
- catch(...)
- {
- if(dbc != 0)
- {
- try
- {
- dbc->close();
- }
- catch(const DbDeadlockException&)
- {
- if(tx != 0)
- {
- throw;
- }
- // Else ignored
- }
- }
- throw;
- }
- }
- }
- catch(const DbDeadlockException& dx)
- {
- throw DeadlockException(__FILE__, __LINE__, dx.what(), transaction);
- }
- catch(const DbException& dx)
- {
- DatabaseException ex(__FILE__, __LINE__);
- ex.message = dx.what();
- throw ex;
- }
-
- return result;
-}
-
-void
-Freeze::IndexI::associate(ObjectStoreBase* store, DbTxn* txn,
- bool createDb, bool populateIndex)
-{
- assert(txn != 0);
- _store = store;
- _index._communicator = store->communicator();
- _index._encoding = store->encoding();
-
- _db.reset(new Db(store->evictor()->dbEnv()->getEnv(), 0));
- _db->set_flags(DB_DUP | DB_DUPSORT);
- _db->set_app_private(this);
-
- _dbName = EvictorIBase::indexPrefix + store->dbName() + "." + _index.name();
-
- Ice::PropertiesPtr properties = store->communicator()->getProperties();
- string propPrefix = "Freeze.Evictor." + store->evictor()->filename() + ".";
-
- int btreeMinKey = properties->getPropertyAsInt(propPrefix + _dbName + ".BtreeMinKey");
- if(btreeMinKey > 2)
- {
- if(store->evictor()->trace() >= 1)
- {
- Trace out(store->evictor()->communicator()->getLogger(), "Freeze.Evictor");
- out << "Setting \"" << store->evictor()->filename() + "." + _dbName << "\"'s btree minkey to " << btreeMinKey;
- }
- _db->set_bt_minkey(btreeMinKey);
- }
-
- bool checksum = properties->getPropertyAsInt(propPrefix + "Checksum") > 0;
- if(checksum)
- {
- //
- // No tracing on purpose
- //
-
- _db->set_flags(DB_CHKSUM);
- }
-
- //
- // pagesize can't change
- //
-
- u_int32_t flags = 0;
- if(createDb)
- {
- flags = DB_CREATE;
- }
-
- //
- //
- // Berkeley DB expects file paths to be UTF8 encoded. We keep
- // _dbName as a native string here, while it might have
- // been better to convert it to UTF-8, changing this isn't
- // possible without potentially breaking backward compatibility
- // with deployed databases.
- //
- _db->open(txn,
- IceUtil::nativeToUTF8(store->evictor()->filename(), IceUtil::getProcessStringConverter()).c_str(),
- _dbName.c_str(), DB_BTREE, flags, FREEZE_DB_MODE);
-
- flags = 0;
- if(populateIndex)
- {
- flags = DB_CREATE;
- }
- store->db()->associate(txn, _db.get(), callback, flags);
-}
-
-int
-Freeze::IndexI::secondaryKeyCreate(Db* /*secondary*/, const Dbt* /*dbKey*/,
- const Dbt* dbValue, Dbt* result)
-{
- const Ice::CommunicatorPtr& communicator = _store->communicator();
- const Ice::EncodingVersion& encoding = _store->encoding();
-
- ObjectRecord rec;
- Byte* first = static_cast<Byte*>(dbValue->get_data());
- Value value(first, first + dbValue->get_size());
- ObjectStoreBase::unmarshal(rec, value, communicator, encoding, _store->keepStats());
-
- Key bytes;
- if(_index.marshalKey(rec.servant, bytes))
- {
- result->set_flags(DB_DBT_APPMALLOC);
- void* data = malloc(bytes.size());
- memcpy(data, &bytes[0], bytes.size());
- result->set_data(data);
- result->set_size(static_cast<u_int32_t>(bytes.size()));
- return 0;
- }
- else
- {
- //
- // Don't want to index this one
- //
- return DB_DONOTINDEX;
- }
-}
-
-void
-Freeze::IndexI::close()
-{
- if(_db.get() != 0)
- {
- try
- {
- _db->close(0);
- }
- catch(const DbException& dx)
- {
- throw DatabaseException(__FILE__, __LINE__, dx.what());
- }
- _db.reset(0);
- }
-}