/** * Request a lock for all arrays that will be accessed by this operator. * Calls requestLock with the write lock over the target array (array inserted into) * @param query the query context */ void inferArrayAccess(std::shared_ptr<Query>& query) { LogicalOperator::inferArrayAccess(query); SCIDB_ASSERT(_parameters.size() > 0); SCIDB_ASSERT(_parameters[0]->getParamType() == PARAM_ARRAY_REF); const string& arrayNameOrg = ((std::shared_ptr<OperatorParamReference>&)_parameters[0])->getObjectName(); SCIDB_ASSERT(ArrayDesc::isNameUnversioned(arrayNameOrg)); std::string arrayName; std::string namespaceName; query->getNamespaceArrayNames(arrayNameOrg, namespaceName, arrayName); ArrayDesc srcDesc; SCIDB_ASSERT(!srcDesc.isTransient()); scidb::namespaces::Communicator::getArrayDesc( namespaceName, arrayName, SystemCatalog::ANY_VERSION, srcDesc); const SystemCatalog::LockDesc::LockMode lockMode = srcDesc.isTransient() ? SystemCatalog::LockDesc::XCL : SystemCatalog::LockDesc::WR; std::shared_ptr<SystemCatalog::LockDesc> lock( make_shared<SystemCatalog::LockDesc>( namespaceName, arrayName, query->getQueryID(), Cluster::getInstance()->getLocalInstanceId(), SystemCatalog::LockDesc::COORD, lockMode)); std::shared_ptr<SystemCatalog::LockDesc> resLock = query->requestLock(lock); SCIDB_ASSERT(resLock); SCIDB_ASSERT(resLock->getLockMode() >= SystemCatalog::LockDesc::WR); }