blob: 245a3942151c1b4187f7e3b6bf449c4e21835d95 [file] [log] [blame]
/**********************************************************************
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
**********************************************************************/
/* -*-C++-*-
****************************************************************************
*
* File: FragDir.cpp
* Description:
*
* Created: 5/6/98
* Language: C++
*
*
*
*
****************************************************************************
*/
// -----------------------------------------------------------------------
#include "FragDir.h"
#include "ComPackDefs.h"
#include "PartInputDataDesc.h"
#include "Ipc.h"
ExFragDir::ExFragDir(Lng32 entries, Space *space,
NABoolean multiFragments, NABoolean fragmentQuotas,
UInt16 multiFragmentVm, UInt8 numMultiFragments)
: NAVersionedObject(-1)
{
numEntries_ = entries;
scratchFileOptions_ = (ExScratchFileOptionsPtr)NULL;
nodeMask_ = 0;
planVersion_ = ComVersion_GetCurrentPlanVersion();
// allocate an array of entries from "space"
fragments_ = (ExFragDirEntryPtr *) space->allocateAlignedSpace(
(size_t) (sizeof(ExFragDirEntryPtr) * numEntries_) );
for (Int32 i = 0; i < numEntries_; i++)
fragments_[i] = new(space) ExFragDirEntry();
flags_ = 0;
if (multiFragments)
flags_ |= MULTI_FRAGMENTS;
if (fragmentQuotas)
flags_ |= FRAGMENT_QUOTAS;
multiFragmentVm_ = multiFragmentVm;
numMultiFragments_ = numMultiFragments;
}
Long ExFragDir::pack(void * space)
{
fragments_.pack(space,numEntries_);
scratchFileOptions_.pack(space);
return NAVersionedObject::pack(space);
}
Lng32 ExFragDir::unpack(void * base, void * reallocator)
{
if(fragments_.unpack(base,numEntries_,reallocator)) return -1;
if(scratchFileOptions_.unpack(base, reallocator)) return -1;
return NAVersionedObject::unpack(base, reallocator);
}
Lng32 ExFragDir::getExplainFragDirEntry(Lng32 &fragOffset, Lng32 &fragLen, Lng32 &topNodeOffset)
{
// Find the EXPLAIN Fragment
CollIndex explainFragIndex = NULL_COLL_INDEX;
// Loop over all the fragments
for (CollIndex i = 0; i < (CollIndex)getNumEntries(); i++)
{
if (getType(i) == ExFragDir::EXPLAIN)
{
explainFragIndex = i;
break;
}
}
// There should always be just one EXPLAIN Fragment
if (explainFragIndex == NULL_COLL_INDEX)
return -1;
fragLen = getFragmentLength(explainFragIndex);
fragOffset = getGlobalOffset(explainFragIndex);
topNodeOffset = getTopNodeOffset(explainFragIndex);
return 0;
}
Long ExFragDirEntry::pack(void *space)
{
partDescriptor_.pack(space);
espNodeMap_.pack(space);
return NAVersionedObject::pack(space);
}
Lng32 ExFragDirEntry::unpack(void * base, void * reallocator)
{
if(partDescriptor_.unpack(base, reallocator)) return -1;
if(espNodeMap_.unpack(base, reallocator)) return -1;
return NAVersionedObject::unpack(base, reallocator);
}
Long ExEspNodeMapEntry::pack(void *space)
{
return clusterName_.pack(space);
}
Lng32 ExEspNodeMapEntry::unpack(void * base, void * reallocator)
{
return clusterName_.unpack(base);
}
ExEspNodeMap::ExEspNodeMap()
: map_(NULL), entries_(0)
{}
Lng32 ExEspNodeMap::getNodeNumber(Lng32 instance) const
{
if ( map_ == (ExEspNodeMapEntryPtr) NULL )
return IPC_CPU_DONT_CARE;
return map_[instance].nodeNumber_;
}
const char * ExEspNodeMap::getClusterName(Lng32 instance) const
{
if ( map_ == (ExEspNodeMapEntryPtr) NULL )
return NULL;
return map_[instance].clusterName_;
}
void ExEspNodeMap::setEntry(Lng32 instance,
const char *clusterName,
Lng32 nodeNumber)
{
if (map_ && entries_ > instance)
{
map_[instance].clusterName_ = clusterName;
map_[instance].nodeNumber_ = nodeNumber;
}
}
Long ExEspNodeMap::pack(void *space)
{
return map_.packArray(space, entries_);
}
Lng32 ExEspNodeMap::unpack(void * base, void * reallocator)
{
return map_.unpackArray(base, entries_, reallocator);
}