blob: e96d75feba4bcf1ff9f8def4d27c009fbd9a114f [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: LateBindInfo.cpp
* Description:
*
* Created: 5/6/98
* Language: C++
*
*
*
*
****************************************************************************
*/
#include "ComPackDefs.h"
#include "LateBindInfo.h"
#include "NAMemory.h"
#include "str.h"
#include "exp_stdh.h"
#include "exp_tuple_desc.h"
#include "ComQueue.h"
#if !defined(__EID) && !defined(ARKFS_OPEN)
#include "ComResWords.h"
#include "ComDistribution.h"
#endif
//////////////////////////////////////////////////////////////////
// Constructor: UninitializedMvName
// Description:
// Initialize class member variables.
//////////////////////////////////////////////////////////////////
UninitializedMvName::UninitializedMvName()
{
physicalName_[0]=0;
ansiName_[0]=0;
}
//////////////////////////////////////////////////////////////////
// Method: setPhysicalName
// Description:
// This method will copy the given parameter into the
// class member variable physicalName_
//////////////////////////////////////////////////////////////////
void UninitializedMvName::setPhysicalName( const char *physicalName )
{
assert( physicalName );
assert( str_len(physicalName) <= MAX_PHYSICAL_NAME_LENGTH );
strcpy( physicalName_, physicalName );
}
//////////////////////////////////////////////////////////////////
// Method: setAnsiName
// Description:
// This method will copy the given parameter into the
// class member variable ansiName_
//////////////////////////////////////////////////////////////////
void UninitializedMvName::setAnsiName( const char *ansiName )
{
assert( ansiName );
assert( str_len(ansiName) <= MAX_ANSI_NAME_LENGTH );
strcpy( ansiName_, ansiName );
}
// LCOV_EXCL_START
// exclude from code coverage analysis since it is not called from anywhere
NABoolean LateNameInfo::makeSQLIdentifier(char * invalue,
char * outvalue)
{
NABoolean dQuoteSeen = FALSE;
UInt32 invalueLen = str_len(invalue);
UInt32 i = 0;
for (i = 0; i < invalueLen; i++)
{
if (invalue[i] == '"')
dQuoteSeen = NOT dQuoteSeen;
if (dQuoteSeen)
outvalue[i] = invalue[i];
else
#pragma nowarn(1506) // warning elimination
outvalue[i] = TOUPPER(invalue[i]);
#pragma warn(1506) // warning elimination
}
// remove trailing blanks
i = invalueLen - 1;
while (outvalue[i] == ' ')
i--;
outvalue[i + 1] = 0;
return TRUE;
}
// LCOV_EXCL_STOP
// return code: TRUE, if error. FALSE, if all is ok.
// This method assumes that the parts array passed in has
// larger size than the number of parts in 'inName'. If this
// cannot be guaranteed it is best to call this method with
// a parts array of size at least 4, if 'inName' is a pointing
// to output of the convertTableName method, because convertTableName
// will raise INVALID_SQL_ID error if a name has more than 4 parts.
NABoolean LateNameInfo::extractParts
(const char * inName, // IN: inName separated by "."s
char * outBuffer, // IN/OUT: space where parts will be moved.
// Must be allocated by caller
Lng32 &numParts, // OUT: number of parts extracted
char * parts[], // IN/OUT: array entries initialized to parts on return
NABoolean dQuote) // IN: if TRUE, parts are double quoted.
{
Int32 len = str_len(inName);
numParts = 0;
Int32 outPos = 0;
parts[numParts++] = &outBuffer[outPos];
if (dQuote)
outBuffer[outPos++] = '"';
for (Int32 inPos = 0; inPos < len; inPos++)
{
if (inName[inPos] == '.')
{
if (dQuote)
outBuffer[outPos++] = '"';
outBuffer[outPos++] = 0;
parts[numParts++] = &outBuffer[outPos];
if (dQuote)
outBuffer[outPos++] = '"';
}
else
{
outBuffer[outPos++] = inName[inPos];
}
}
if (dQuote)
outBuffer[outPos++] = '"';
outBuffer[outPos++] = 0;
return FALSE;
}
// LCOV_EXCL_START
// exclude from code coverage analysis since it is not called from anywhere
static void extractPartsLocal(char * invalue, char *inVal[], short inValLen[])
{
// apply defaults to invalue
UInt32 invalueLen = str_len(invalue);
#pragma nowarn(1506) // warning elimination
Int32 i = invalueLen-1;
#pragma warn(1506) // warning elimination
Int32 j = 2;
Int32 k = 0;
for (; i >= 0; i--)
{
if (invalue[i] == '.')
{
inVal[j] = &invalue[i+1];
#pragma nowarn(1506) // warning elimination
inValLen[j] = k;
#pragma warn(1506) // warning elimination
k = 0;
j--;
}
else
k++;
}
inVal[j] = &invalue[i+1];
#pragma nowarn(1506) // warning elimination
inValLen[j] = k;
#pragma warn(1506) // warning elimination
}
Long LateNameInfoList::pack(void *space)
{
#pragma nowarn(1506) // warning elimination
lateNameInfo_.pack(space,numEntries_);
#pragma warn(1506) // warning elimination
return NAVersionedObject::pack(space);
}
Lng32 LateNameInfoList::unpack(void * base, void * reallocator)
{
#pragma nowarn(1506) // warning elimination
if(lateNameInfo_.unpack(base,numEntries_,reallocator)) return -1;
#pragma warn(1506) // warning elimination
return NAVersionedObject::unpack(base, reallocator);
}
AnsiOrNskName::AnsiOrNskName(char *inName)
{
Int32 len;
extName_[0] = '\0';
intName_[0] = '\0';
isNskName_ = FALSE;
noOfParts_ = 0;
len = str_len(inName);
if (len < sizeof(extName_))
{
str_cpy_all(extName_, inName, len);
extName_[len] ='\0';
isError_ = FALSE;
}
else
{
str_cpy_all(extName_, inName, sizeof(extName_)-1);
extName_[sizeof(extName_)-1] ='\0';
isError_ = TRUE;
}
isValid_ = FALSE;
}
Int16 AnsiOrNskName::convertAnsiOrNskName(bool doCheck)
{
// If doCheck is false, this function will not uppercase the name and will not check for
// reserved word.
// The "doCheck" is set to FALSE at places wherein executor could
// encounter such names. However, these places will have ansi name set to proper case.
if (isError_)
return -1;
if (isValid_)
return 0;
if (extName_[0] == '\0')
{
isValid_ = TRUE;
noOfParts_ = 0;
return 0;
}
isError_ = TRUE;
char *ptr, *tgtPtr, *partPtr;
short partLen = 0;
short totalLen = 0;
bool inQuotes = FALSE;
bool delimited = FALSE;
bool trailSpace = FALSE;
bool dollarFound = FALSE;
bool partBegin = TRUE;
char c;
short partCheckLen;
ptr = extName_;
tgtPtr = intName_;
noOfParts_ = 0;
partPtr = parts_[noOfParts_];
isNskName_ = FALSE;
// Remove leading spaces
while (*ptr != '\0' && *ptr == ' ')
*ptr++;
if (ptr != '\0')
{
if (*(ptr) != '\"') // Check that the first char is Alpha if not in quotes
{
if (! isAlpha8859_1((unsigned char)(*ptr)))
{
if (*(ptr) != '\\' && *(ptr) != '$')
return -1;
else
{
isNskName_ = TRUE;
if (*(ptr) == '$')
dollarFound = TRUE;
}
}
}
}
else
return -1; // Error when all are spaces
if (isNskName_)
partCheckLen = 8; // NskNameLen
else
partCheckLen = ComAnsiNamePart::MAX_IDENTIFIER_INT_LEN;
while(*ptr != '\0')
{
switch (*ptr)
{
case '\"':
if (trailSpace)
return -1;
if (! inQuotes)
{
if (partBegin)
{
ptr++;
inQuotes = TRUE;
delimited = TRUE;
partBegin = FALSE;
}
else
return -1;
}
else
{
// Check if next is quotes
if (*(ptr+1) != '\0')
{
if (*(ptr+1) == '\"')
{
if (partLen < partCheckLen)
{
*tgtPtr = *ptr;
*partPtr = *ptr;
tgtPtr++;
partPtr++;
ptr++;
ptr++; // Skip one Quote
partLen++;
totalLen++;
}
else
return -1;
}
else
{
if (*(ptr+1) != '.')
return -1;
inQuotes = FALSE; // Skip the ending quote
ptr++;
}
}
else
{
inQuotes = FALSE;
ptr++;
}
}
break;
case '.':
if (trailSpace)
return -1;
if (! inQuotes)
{
if (totalLen < ComAnsiNamePart::MAX_ANSI_NAME_INT_LEN)
{
*tgtPtr = *ptr;
tgtPtr++;
ptr++;
totalLen++;
}
if (isNskName_)
{
if (noOfParts_ >= 3)
return -1;
}
else
{
if (noOfParts_ >= 2)
return -1;
}
partBegin = TRUE;
partLen = 0;
*partPtr = '\0';
if (!delimited)
{
// Check if it is a SQL reserved word
if (doCheck && IsSqlReservedWord(parts_[noOfParts_]))
return -1;
}
delimited = FALSE;
noOfParts_++;
partPtr = parts_[noOfParts_];
if (isNskName_)
{
if (noOfParts_ == 1 && *ptr != '\0')
{
if (! dollarFound)
{
if (*ptr != '$')
return -1;
}
else
{
if (*ptr != '\"')
{
if (! isAlpha8859_1((unsigned char)(*ptr)))
return -1;
}
}
}
else
{
if (*ptr != '\0' && *ptr != '\"')
{
if (! isAlpha8859_1((unsigned char)(*ptr)))
return -1;
}
}
}
else
{
if (*ptr != '\0' && *ptr != '\"') // Check that char is Alpha if not in quotes
{
if (! isAlpha8859_1((unsigned char)(*ptr)))
return -1;
}
}
}
else
{
if (partLen < partCheckLen)
{
*tgtPtr = *ptr;
*partPtr = *ptr;
tgtPtr++;
partPtr++;
ptr++;
totalLen++;
partLen++;
}
else
return -1;
}
break;
case '\t':
if (! inQuotes)
return -1;
partBegin = FALSE;
if (partLen < partCheckLen)
{
*tgtPtr = ' ';
*partPtr = ' ';
tgtPtr++;
partPtr++;
ptr++;
partLen++;
totalLen++;
}
else
return -1;
break;
case '@':
case '#':
partBegin = FALSE;
if (partLen < partCheckLen)
{
*tgtPtr = *ptr;
*partPtr = *ptr;
tgtPtr++;
partPtr++;
ptr++;
partLen++;
totalLen++;
}
else
return -1;
break;
case ' ':
partBegin = FALSE;
if (! inQuotes)
{
trailSpace = TRUE;
ptr++;
}
else
{
if (partLen < partCheckLen)
{
*tgtPtr = *ptr;
*partPtr = *ptr;
tgtPtr++;
partPtr++;
ptr++;
partLen++;
totalLen++;
}
else
return -1;
}
break;
default:
// Copy the character
if (trailSpace)
return -1;
partBegin = FALSE;
if (inQuotes)
c= *ptr;
else
{
if (partLen != 0) // Don't check the first character, it is already checked
{
if (NOT isAlNum8859_1((unsigned char)(*ptr)) && (*ptr != '_'))
return -1;
}
if (doCheck)
{
c = (char)TOUPPER(*ptr);
}
else
c = *ptr;
}
if (partLen < partCheckLen)
{
*tgtPtr = c;
*partPtr = c;
tgtPtr++;
partPtr++;
ptr++;
partLen++;
totalLen++;
}
else
return -1;
break;
}
}
if (inQuotes)
return -1;
*tgtPtr = '\0';
*partPtr = '\0';
if (!delimited)
{
// Check if it is a SQL reserved word
if (doCheck && IsSqlReservedWord(parts_[noOfParts_]))
return -1;
}
noOfParts_++;
isValid_ = TRUE;
isError_ = FALSE;
return 0;
}
Int16 AnsiOrNskName::extractParts(Lng32 &numParts,
char *parts[])
{
Int16 ret;
Int16 i;
if (! isValid_)
{
if ((ret = convertAnsiOrNskName(FALSE)) == -1)
return ret;
}
numParts = noOfParts_;
for (i = 0 ; i < noOfParts_ ; i++)
parts[i] = parts_[i];
return 0;
}
Int16 AnsiOrNskName::equals(AnsiOrNskName *inName)
{
// Check if the external name are equal
if (str_cmp_ne(inName->extName_, extName_) == 0)
return 1;
else
{
if (! isValid_)
{
if (convertAnsiOrNskName(FALSE) != 0)
return -1;
}
if (! inName->isValid_)
{
if (inName->convertAnsiOrNskName() != 0)
return -1;
}
if (str_cmp_ne(inName->intName_, intName_) == 0)
return 1;
else
return 0;
}
}
char *AnsiOrNskName::getInternalName()
{
if (! isValid_)
{
if (convertAnsiOrNskName() != 0)
return NULL;
}
return intName_;
}
char *AnsiOrNskName::getExternalName()
{
if (isValid_ && !isNskName_)
// Build the ANSI name from the individual parts
ComBuildANSIName (parts_[0], parts_[1], parts_[2], extName_, sizeof(extName_));
return extName_;
}
AnsiOrNskName *LateNameInfo::getLastUsedName(NAMemory *heap)
{
AnsiOrNskName *ansiName;
NABasicPtr nameStr;
void * addr;
if (! isLastUsedNameEmbedded())
{
addr = *((void **)lastUsedAnsiName_);
return (AnsiOrNskName *)addr;
}
else
{
if (heap == NULL)
return NULL;
if (isLastUsedNameCompEmbedded())
ansiName = new (heap) AnsiOrNskName(lastUsedAnsiName_);
else
{
memcpy((void *)&nameStr, lastUsedAnsiName_, sizeof(nameStr));
ansiName = new (heap) AnsiOrNskName(nameStr.getPointer());
}
*(void **)lastUsedAnsiName_ = (void *)ansiName;
setLastUsedNameMode(TRUE);
return ansiName;
}
}
Int16 AnsiOrNskName::fillInMissingParts(char *schemaName)
{
char *ptr;
char *tgt;
char tempName[sizeof(extName_)+16]; // plus a few extra bytes to avoid boundary condition
Int16 partsToFill;
Int16 partsFilled = 0;
short totalLen = 0;
bool inQuotes = FALSE;
Int16 retCode;
if (! isValid_)
{
if (convertAnsiOrNskName() != 0)
return -1;
}
partsToFill = (Int16)(3 - noOfParts_);
if (isNskName_ || partsToFill == 0)
return 1;
// Remove leading blanks in the schemaName
ptr = schemaName;
tgt = tempName;
*tgt = '\0';
while (*ptr != '\0' && *ptr == ' ')
*ptr++;
while(*ptr != '\0' && partsFilled != partsToFill)
{
switch (*ptr)
{
case '\"':
if (totalLen < sizeof(extName_))
{
*tgt = *ptr;
ptr++;
tgt++;
totalLen++;
}
else
return -1;
if (!inQuotes)
inQuotes = TRUE;
else
inQuotes = FALSE;
break;
case '.':
if (totalLen < sizeof(extName_))
{
*tgt = *ptr;
ptr++;
tgt++;
totalLen++;
}
else
return -1;
if (! inQuotes)
partsFilled++;
break;
default:
if (totalLen < sizeof(extName_))
{
*tgt = *ptr;
ptr++;
tgt++;
totalLen++;
}
else
return -1;
break;
}
}
// Copy '.'
if (*(tgt-1) != '.' && totalLen < sizeof(extName_))
{
*tgt = '.';
tgt++;
totalLen++;
}
//Append the extName
ptr = extName_;
while (*ptr != '\0')
{
if (totalLen < sizeof(extName_))
{
*tgt = *ptr;
ptr++;
tgt++;
totalLen++;
}
else
return -1;
}
*tgt ='\0';
str_cpy_all(extName_, tempName,totalLen);
extName_[totalLen] ='\0';
isValid_ = FALSE;
isError_ = FALSE;
retCode = convertAnsiOrNskName();
if (retCode != -1 && noOfParts_ != 3)
retCode = -1;
return retCode;
}
// This function is used only at the compile time
void LateNameInfo::setLastUsedName(char *name, NAMemory *heap)
{
NABasicPtr ansiName;
Int32 len;
char *ptr;
len = str_len(name);
if (len > ComAnsiNamePart::MAX_OLD_ANSI_IDENTIFIER_LEN)
{
ptr = new (heap) char[len+1];
str_cpy_all(ptr, name, len);
ptr[len]='\0';
ansiName = ptr;
memcpy(lastUsedAnsiName_, (const void *)&ansiName, sizeof(ansiName));
setLastUsedNameCompMode(TRUE);
}
else
{
str_cpy_all(lastUsedAnsiName_, name, len);
lastUsedAnsiName_[len] ='\0';
setLastUsedNameCompMode(FALSE);
}
}
void LateNameInfo::setLastUsedName(AnsiOrNskName *name)
{
AnsiOrNskName *ansiName;
if (! isLastUsedNameEmbedded())
{
ansiName = getLastUsedName(NULL);
delete ansiName;
}
*(void **)lastUsedAnsiName_ = (void *)name;
setLastUsedNameMode(TRUE);
}
void LateNameInfo::setCompileTimeName(char *name, NAMemory *heap)
{
NABasicPtr ansiName;
Int32 len;
char *ptr;
len = str_len(name);
if (len > ComAnsiNamePart::MAX_OLD_ANSI_IDENTIFIER_LEN)
{
ptr = new (heap) char[len+1];
str_cpy_all(ptr, name, len);
ptr[len]='\0';
ansiName = ptr;
memcpy(compileTimeAnsiName_, (const void *)&ansiName, sizeof(ansiName));
setCompileNameCompMode(TRUE);
}
else
{
str_cpy_all(compileTimeAnsiName_, name, len);
compileTimeAnsiName_[len] = '\0';
setCompileNameCompMode(FALSE);
}
}
char *LateNameInfo::lastUsedAnsiName()
{
AnsiOrNskName *name;
NABasicPtr nameStr;
name = getLastUsedName(NULL);
if (name != NULL)
return name->getInternalName();
else
{
if (isLastUsedNameCompEmbedded())
return lastUsedAnsiName_;
else
{
memcpy((void *)&nameStr, lastUsedAnsiName_, sizeof(nameStr));
return (nameStr.getPointer());
}
}
}
char *LateNameInfo::lastUsedExtAnsiName()
{
AnsiOrNskName *name;
NABasicPtr nameStr;
name = getLastUsedName(NULL);
if (name != NULL)
return name->getExternalName();
else
{
if (isLastUsedNameCompEmbedded())
return lastUsedAnsiName_;
else
{
memcpy((void *)&nameStr, lastUsedAnsiName_, sizeof(nameStr));
return (nameStr.getPointer());
}
}
}
void LateNameInfo::zeroLastUsedAnsiName()
{
AnsiOrNskName *ansiName;
if (! isLastUsedNameEmbedded())
{
ansiName = getLastUsedName(NULL);
delete ansiName;
}
setLastUsedNameMode(FALSE);
setLastUsedNameCompMode(FALSE);
memset(lastUsedAnsiName_, 0, sizeof(lastUsedAnsiName_));
}
char *LateNameInfo::compileTimeAnsiName()
{
NABasicPtr nameStr;
if (isCompileNameCompEmbedded())
return compileTimeAnsiName_;
else
{
memcpy((void *)&nameStr, compileTimeAnsiName_, sizeof(nameStr));
return (nameStr.getPointer());
}
}
Long LateNameInfo::pack(void *space)
{
NABasicPtr name;
if (! isCompileNameCompEmbedded())
{
memcpy((void *)&name, compileTimeAnsiName_, sizeof(name));
name.pack(space);
memcpy((void *)compileTimeAnsiName_, (void *)&name, sizeof(name));
}
if (! isLastUsedNameCompEmbedded())
{
memcpy((void *)&name, lastUsedAnsiName_, sizeof(name));
name.pack(space);
memcpy((void *)lastUsedAnsiName_, (void *)&name, sizeof(name));
}
return NAVersionedObject::pack(space);
}
Lng32 LateNameInfo::unpack(void * base, void * reallocator)
{
NABasicPtr name;
if (! isCompileNameCompEmbedded())
{
memcpy((void *)&name, compileTimeAnsiName_, sizeof(name));
name.unpack(base);
memcpy(compileTimeAnsiName_, (void *)&name, sizeof(name));
}
if (! isLastUsedNameCompEmbedded())
{
memcpy((void *)&name, lastUsedAnsiName_, sizeof(name));
name.unpack(base);
memcpy(lastUsedAnsiName_, (void *)&name, sizeof(name));
}
return NAVersionedObject::unpack(base, reallocator);;
}
void LateNameInfo::resetRuntimeFlags()
{
if (! isLastUsedNameEmbedded())
runtimeFlags_ = LASTUSED_NAME_CLASS_PTR;
else
if (! isLastUsedNameCompEmbedded())
runtimeFlags_ = LASTUSED_NAME_STR_PTR ;
else
runtimeFlags_ = 0;
}
bool AnsiOrNskName::isNskName()
{
if (! isValid_)
{
if (convertAnsiOrNskName() != 0)
return FALSE;
}
return isNskName_;
}
Int16 AnsiOrNskName::updateNSKInternalName(char *inName)
{
if (isError_ || (! isValid_))
return -1;
if (noOfParts_ == 4)
return -1;
char *ptr, *tgt, *partPtr;
Int32 len;
Int16 partsToFill, partsFilled;
char temp[ComAnsiNamePart::MAX_ANSI_NAME_EXT_LEN+1];
len = str_len(extName_);
str_cpy_all(temp, extName_, len);
temp[len] = '\0';
partsToFill = (Int16)(4 - noOfParts_);
partsFilled = 0;
// Move down the parts
Int32 i, j;
for (i = 3, j = noOfParts_-1 ; j >= 0 ; i--, j--)
memcpy(parts_[i], parts_[j], ComAnsiNamePart::MAX_IDENTIFIER_INT_LEN+1);
ptr = inName;
partPtr = parts_[0];
tgt = extName_;
// Copy the system name and volume name if needed
while (*ptr != '\0')
{
*tgt = *ptr;
tgt++;
if (*ptr == '.')
{
*partPtr = '\0';
partsFilled++;
partPtr = parts_[partsFilled];
if (partsFilled == partsToFill || partsFilled == 2)
{
ptr++;
break;
}
}
else
{
*partPtr = *ptr;
partPtr++;
}
ptr++;
}
*tgt = '\0';
// Copy the subvolume and quote if reserved name in extName
if (partsFilled < partsToFill)
{
while (*ptr != '\0' && *ptr != '.')
{
*partPtr = *ptr;
ptr++;
partPtr++;
}
// zero-terminate
*partPtr = '\0';
if (*ptr == '\0')
return -1;
if (IsSqlReservedWord(parts_[2]))
{
*tgt = '\"';
tgt++;
*tgt = '\0';
str_cat(extName_, parts_[2], extName_);
str_cat(extName_, "\".", extName_);
}
else
{
str_cat(extName_, parts_[2], extName_);
str_cat(extName_, ".", extName_);
}
partsFilled++;
}
str_cat(extName_, temp, extName_);
// copy the internal name
len = str_len(inName);
str_cpy_all(intName_, inName, len);
intName_[len] = '\0';
noOfParts_ = 4;
isNskName_ = TRUE;
return 0;
}
Int16 AnsiOrNskName::quoteNSKExtName()
{
Int32 len;
if (isError_ || (! isValid_))
return -1;
if (noOfParts_ != 4)
return -1;
if (IsSqlReservedWord(parts_[3]))
{
// copy just the table name with quotes
extName_[0] = '\"';
len = str_len(parts_[3]);
str_cpy_all(extName_+1, parts_[3], len);
extName_[len+1] = '\"';
extName_[len+2] = '\0';
noOfParts_ = 1;
return updateNSKInternalName(intName_);
}
else
if (IsSqlReservedWord(parts_[2]))
{
// copy just the table name
len = str_len(parts_[3]);
str_cpy_all(extName_, parts_[3], len);
extName_[len] = '\0';
noOfParts_ = 1;
return updateNSKInternalName(intName_);
}
else
return 0;
}
///////////////////////////////////////////////////////////////////
// class TrafSimilarityTableInfo
///////////////////////////////////////////////////////////////////
TrafSimilarityTableInfo::TrafSimilarityTableInfo(char * tableName,
NABoolean isHive,
char * hdfsRootDir,
Int64 modTS, Int32 numPartnLevels,
Queue * hdfsDirsToCheck,
char * hdfsHostName,
Int32 hdfsPort)
: NAVersionedObject(-1),
tableName_(tableName),
hdfsRootDir_(hdfsRootDir),
modTS_(modTS), numPartnLevels_(numPartnLevels),
hdfsDirsToCheck_(hdfsDirsToCheck),
hdfsHostName_(hdfsHostName), hdfsPort_(hdfsPort),
flags_(0)
{
if (isHive)
setIsHive(TRUE);
}
TrafSimilarityTableInfo::TrafSimilarityTableInfo()
: NAVersionedObject(-1),
tableName_(NULL),
hdfsRootDir_(NULL),
modTS_(-1), numPartnLevels_(-1),
hdfsDirsToCheck_(NULL),
hdfsHostName_(NULL), hdfsPort_(NULL),
flags_(0)
{
}
TrafSimilarityTableInfo::~TrafSimilarityTableInfo()
{
}
NABoolean TrafSimilarityTableInfo::operator==(TrafSimilarityTableInfo &o)
{
return ((isHive() == o.isHive()) &&
(strcmp(tableName(), ((TrafSimilarityTableInfo&)o).tableName()) == 0));
}
Long TrafSimilarityTableInfo::pack(void * space)
{
tableName_.pack(space);
hdfsRootDir_.pack(space);
hdfsHostName_.pack(space);
hdfsDirsToCheck_.pack(space);
return NAVersionedObject::pack(space);
}
Lng32 TrafSimilarityTableInfo::unpack(void * base, void * reallocator)
{
if(tableName_.unpack(base)) return -1;
if(hdfsRootDir_.unpack(base)) return -1;
if(hdfsHostName_.unpack(base)) return -1;
if(hdfsDirsToCheck_.unpack(base, reallocator)) return -1;
return NAVersionedObject::unpack(base, reallocator);
}
///////////////////////////////////////////////////////////////////
// class TrafQuerySimilarityInfo
///////////////////////////////////////////////////////////////////
TrafQuerySimilarityInfo::TrafQuerySimilarityInfo(Queue * siList)
: NAVersionedObject(-1),
siList_(siList)
{
}
TrafQuerySimilarityInfo::TrafQuerySimilarityInfo()
: NAVersionedObject(-1),
siList_(NULL)
{
}
TrafQuerySimilarityInfo::~TrafQuerySimilarityInfo()
{
}
Long TrafQuerySimilarityInfo::pack(void * space)
{
PackQueueOfNAVersionedObjects(siList_,space,TrafSimilarityTableInfo);
return NAVersionedObject::pack(space);
}
Lng32 TrafQuerySimilarityInfo::unpack(void * base, void * reallocator)
{
UnpackQueueOfNAVersionedObjects(siList_,base,TrafSimilarityTableInfo,reallocator);
return NAVersionedObject::unpack(base, reallocator);
}
// End