Files
mars-flaim/sql/src/fdict.h
dsandersoremutah 5b0a6fe8b5 Checked in all ODBC stuff
git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@1014 0109f412-320b-0410-ab79-c3e0c5ffbbe6
2007-02-08 19:48:35 +00:00

524 lines
15 KiB
C++

//------------------------------------------------------------------------------
// Desc: F_Dict class definitions - internal object for database's
// dictionary.
// Tabs: 3
//
// Copyright (c) 2002-2007 Novell, Inc. All Rights Reserved.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; version 2.1
// of the License.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, contact Novell, Inc.
//
// To contact Novell about this file by physical or electronic mail,
// you may find current contact information at www.novell.com.
//
// $Id$
//------------------------------------------------------------------------------
#ifndef FDICT_H
#define FDICT_H
struct ICD;
struct F_INDEX;
class F_Dict;
class F_NameTable;
class F_Database;
class F_CCS;
/****************************************************************************
Desc: Encryption definition
****************************************************************************/
typedef struct F_ENCDEF
{
FLMUINT uiEncDefNum; // Encryption definition number. This is
// also the place in the encryption definition
// table minus one.
FLMUINT64 ui64DefRowId; // Definition row ID.
const char * pszEncDefName; // Encryption definition name.
eEncAlgorithm eEncAlg; // AES or DES3
FLMUINT uiEncKeySize; // Key size
F_CCS * pCcs; // Encryption object
} F_ENCDEF;
/****************************************************************************
Desc: Table column definition.
****************************************************************************/
typedef struct F_COLUMN
{
FLMUINT uiColumnNum; // Column number. This is also the place in
// the table's column table minus one.
FLMUINT64 ui64DefRowId; // Definition row ID.
const char * pszColumnName; // Column name.
FLMUINT uiFlags; // Column flags
#define COL_READ_ONLY 0x0001
#define COL_NULL_ALLOWED 0x0002
eDataType eDataTyp; // Column data type
FLMUINT uiMaxLen; // Maximum length (for strings or binary)
FLMUINT uiEncDefNum; // If column is encrypted, this is the
// encryption definition number. Zero if
// column is not encrypted.
ICD * pFirstIcd; // First index component where this column
// is a key component.
ICD * pFirstDataIcd; // First index component where this column
// is a data component.
} F_COLUMN;
/****************************************************************************
Desc: Logical File
****************************************************************************/
typedef struct LFILE
{
FLMUINT uiLfNum; // Index number or table number.
FLMUINT uiEncDefNum; // If index or table is encrypted, this is
// the table's encryption definition number.
// Zero if the index or table is not encrypted.
eLFileType eLfType; // Type of logical file
FLMUINT uiRootBlk; // Address of root block.
FLMUINT uiBlkAddress; // Block address of LFile entry.
FLMUINT uiOffsetInBlk; // Offset within block of entry.
FLMUINT64 ui64NextRowId; // Next row ID in table, if eLfType is a table
// Not used for indexes.
FLMBOOL bNeedToWriteOut; // If TRUE, this LFILE needs to be written
// to disk. NOTE: This is only used for
// tables - so that we can update ui64NextRowId
// many times in memory, but only write it out
// at commit time.
} LFILE;
/*****************************************************************************
Desc: Table definition
*****************************************************************************/
typedef struct F_TABLE
{
FLMUINT uiTableNum; // Table number. This is also this entry's place
// in the table table, minus one.
FLMUINT64 ui64DefRowId; // Definition row ID.
const char * pszTableName; // Table name.
FLMBOOL bSystemTable; // System table - cannot be dropped or altered by
// an application.
FLMUINT uiNumColumns; // Number of columns in the table.
FLMUINT uiNumReqColumns; // Number of columns that are required to
// have values.
F_COLUMN * pColumns; // Contains all columns for the table.
F_NameTable * pColumnNames; // Contains all column names for the table
LFILE lfInfo; // Logical file information.
FLMUINT uiFirstIndexNum; // Number of first index on this table
} F_TABLE;
#define MAX_INDEX_COLUMNS ((SFLM_MAX_KEY_SIZE - FLM_MAX_NUM_BUF_SIZE) / 2)
#define MAX_ORDER_BY_COLUMNS MAX_INDEX_COLUMNS
#define MAX_SELECT_TABLES 50
/*****************************************************************************
Desc: Index definition
*****************************************************************************/
typedef struct F_INDEX
{
FLMUINT uiIndexNum; // Index number. This also corresponds
// to the position of this entry in
// the index table minus one.
FLMUINT64 ui64DefRowId; // Definition row ID.
FLMUINT uiNextIndexNum; // Next index on this same table.
FLMUINT uiTableNum; // Table this index is on.
const char * pszIndexName; // Index name.
ICD * pKeyIcds; // Array of key components for the index.
FLMUINT uiNumKeyComponents; // Number of key components.
ICD * pDataIcds; // Array of data components for the index.
FLMUINT uiNumDataComponents; // Number of data components.
FLMUINT uiFlags; // Index flags.
#define IXD_ABS_POS 0x00001 // Maintain absolute positioning info.
#define IXD_HAS_SUBSTRING 0x00002 // At least one key component is substring.
#define IXD_OFFLINE 0x00004 // Index is offline - may or may
// not be suspended.
#define IXD_SUSPENDED 0x00008 // IXD_OFFLINE should also be set
#define IXD_SYSTEM 0x00010 // Index is an internal system index
#define IXD_KEYS_UNIQUE 0x00020 // Index keys must be unique
FLMUINT uiLanguage; // Language for the index.
LFILE lfInfo; // Logical file information.
FLMUINT64 ui64LastRowIndexed; // Last row indexed, if indexing in
// the background.
} F_INDEX;
/*****************************************************************************
Desc: Index component
*****************************************************************************/
typedef struct ICD
{
FLMUINT uiIndexNum; // Index this component belongs to
FLMUINT uiColumnNum; // Column in table this component refers to
FLMUINT64 ui64DefRowId; // Definition row ID.
FLMUINT uiFlags; // Flags for component
FLMUINT uiCompareRules; // Comparison rules for this component.
FLMUINT uiLimit; // Limit for this component.
#define ICD_DEFAULT_LIMIT 128
#define ICD_DEFAULT_SUBSTRING_LIMIT 48
ICD * pNextInChain;
ICD * pNextInDataChain;
} ICD;
/**************************************************************************
Desc: Structure kept in name table for sorting names.
**************************************************************************/
typedef struct NAME_INFO
{
const char * pszName;
FLMUINT uiItemNum;
} NAME_INFO;
/**************************************************************************
Desc: This class is the name table class.
**************************************************************************/
class F_NameTable : public F_Object
{
public:
// Constructor and destructor
F_NameTable()
{
m_pNames = NULL;
m_uiTblSize = 0;
m_uiNumNames = 0;
m_bTableSorted = FALSE;
m_bDuplicateNames = FALSE;
}
~F_NameTable()
{
f_free( &m_pNames);
}
NAME_INFO * findName(
const char * pszName,
FLMUINT * puiInsertPos);
RCODE addName(
const char * pszName,
FLMUINT uiItemNum,
FLMBOOL bCheckDuplicates,
RCODE rcDuplicateError,
FLMUINT uiTableGrowSize);
RCODE copyName(
const char * pszName,
FLMUINT uiItemNum,
const char ** ppszDestName,
F_Pool * pPool);
void sortNames( void);
void removeName(
const char * pszName);
private:
NAME_INFO * m_pNames;
FLMUINT m_uiTblSize;
FLMUINT m_uiNumNames;
FLMBOOL m_bTableSorted;
FLMBOOL m_bDuplicateNames;
friend class F_Db;
friend class F_Dict;
};
/**************************************************************************
Desc: This class is the FLAIM dictionary class.
**************************************************************************/
class F_Dict : public F_Object
{
public:
// Constructor and destructor
F_Dict();
~F_Dict();
void resetDict( void);
RCODE getTable(
const char * pszTableName,
F_TABLE ** ppTable,
FLMBOOL bOfflineOk);
RCODE getIndex(
const char * pszIndexName,
F_INDEX ** ppIndex,
FLMBOOL bOfflineOk);
FINLINE F_ENCDEF * getEncDef(
FLMUINT uiEncDefNum)
{
return( (F_ENCDEF *)((uiEncDefNum && uiEncDefNum <= m_uiHighestEncDefNum &&
m_pEncDefTbl [uiEncDefNum - 1].uiEncDefNum)
? &m_pEncDefTbl [uiEncDefNum - 1]
: (F_ENCDEF *)NULL));
}
FINLINE F_TABLE * getTable(
FLMUINT uiTableNum)
{
return( (F_TABLE *)((uiTableNum && uiTableNum <= m_uiHighestTableNum &&
m_pTableTbl [uiTableNum - 1].uiTableNum)
? &m_pTableTbl [uiTableNum - 1]
: (F_TABLE *)NULL));
}
FINLINE F_INDEX * getIndex(
FLMUINT uiIndexNum)
{
return( (F_INDEX *)((uiIndexNum && uiIndexNum <= m_uiHighestIndexNum &&
m_pIndexTbl [uiIndexNum - 1].uiIndexNum)
? &m_pIndexTbl [uiIndexNum - 1]
: (F_INDEX *)NULL));
}
FINLINE F_COLUMN * getColumn(
F_TABLE * pTable,
FLMUINT uiColumnNum)
{
return( (F_COLUMN *)((uiColumnNum && uiColumnNum <= pTable->uiNumColumns)
? &pTable->pColumns [uiColumnNum - 1]
: (F_COLUMN *)NULL));
}
FINLINE F_TABLE * findTable(
const char * pszTableName)
{
NAME_INFO * pNameInfo;
if (m_pTableNames)
{
if ((pNameInfo = m_pTableNames->findName( pszTableName, NULL)) != NULL)
{
return( getTable( pNameInfo->uiItemNum));
}
}
return( NULL);
}
FINLINE F_COLUMN * findColumn(
F_TABLE * pTable,
const char * pszColumnName)
{
NAME_INFO * pNameInfo;
if (pTable->pColumnNames)
{
if ((pNameInfo = pTable->pColumnNames->findName( pszColumnName,
NULL)) != NULL)
{
return( getColumn( pTable, pNameInfo->uiItemNum));
}
}
return( NULL);
}
FINLINE F_INDEX * findIndex(
const char * pszIndexName)
{
NAME_INFO * pNameInfo;
if (m_pIndexNames)
{
if ((pNameInfo = m_pIndexNames->findName( pszIndexName, NULL)) != NULL)
{
return( getIndex( pNameInfo->uiItemNum));
}
}
return( NULL);
}
FINLINE F_ENCDEF * findEncDef(
const char * pszEncDefName)
{
NAME_INFO * pNameInfo;
if (m_pEncDefNames)
{
if ((pNameInfo = m_pEncDefNames->findName( pszEncDefName, NULL)) != NULL)
{
return( getEncDef( pNameInfo->uiItemNum));
}
}
return( NULL);
}
void linkToDatabase(
F_Database * pDatabase);
void unlinkFromDatabase( void);
FINLINE FLMUINT getUseCount( void)
{
return( m_uiUseCount);
}
FINLINE FLMUINT decrUseCount( void)
{
return( --m_uiUseCount);
}
FINLINE void incrUseCount( void)
{
m_uiUseCount++;
}
FINLINE F_Dict * getPrev( void)
{
return( m_pPrev);
}
FINLINE F_Dict * getNext( void)
{
return( m_pNext);
}
FINLINE F_Database * getDatabase( void)
{
return( m_pDatabase);
}
RCODE copyEncDef(
F_ENCDEF * pDestEncDef,
F_ENCDEF * pSrcEncDef);
RCODE copyColumn(
F_NameTable * pDestColumnNameTable,
F_COLUMN * pDestColumn,
F_COLUMN * pSrcColumn);
RCODE copyTable(
F_TABLE * pDestTable,
F_TABLE * pSrcTable);
RCODE copyIndex(
F_INDEX * pDestIndex,
F_INDEX * pSrcIndex);
RCODE cloneDict(
F_Dict * pSrcDict);
RCODE addEncDef(
FLMUINT uiEncDefNum,
FLMUINT64 ui64DefRowId,
const char * pszEncDefName,
eEncAlgorithm eEncAlg,
FLMUINT uiEncKeySize,
FLMBYTE * pucEncKey,
FLMUINT uiEncKeyLen);
RCODE addTable(
FLMUINT uiTableNum,
FLMUINT64 ui64DefRowId,
const char * pszTableName,
FLMBOOL bSystemTable,
FLMUINT uiNumColumns,
FLMUINT uiEncDefNum);
RCODE addColumn(
FLMUINT uiTableNum,
FLMUINT64 ui64DefRowId,
FLMUINT uiColumnNum,
const char * pszColumnName,
FLMUINT uiFlags,
eDataType eDataTyp,
FLMUINT uiMaxLen,
FLMUINT uiEncDefNum);
RCODE addIndex(
FLMUINT uiIndexNum,
FLMUINT64 ui64DefRowId,
const char * pszIndexName,
FLMUINT uiTableNum,
FLMUINT uiEncDefNum,
FLMUINT uiFlags,
FLMUINT uiNumKeyComponents,
FLMUINT uiNumDataComponents,
FLMUINT uiLanguage,
FLMUINT64 ui64LastRowIndexed);
RCODE addIndexComponent(
FLMUINT uiIndexNum,
FLMUINT64 ui64DefRowId,
FLMUINT uiColumnNum,
FLMUINT uiFlags,
FLMUINT uiCompareRules,
FLMUINT uiLimit,
FLMUINT uiKeyComponent,
FLMUINT uiDataComponent);
RCODE setupEncDefTable( void);
RCODE setupTableTable( void);
RCODE setupColumnTable( void);
RCODE setupIndexTable( void);
RCODE setupIndexComponentTable( void);
RCODE setupBlockChainTable( void);
RCODE setupPredefined( void);
RCODE verifyDict( void);
private:
F_Dict * m_pNext; // Pointer to next F_Dict object in the list,
// if any. All versions of a dictionary that
// are currently in use are linked together.
// Usually, there will be only one local
// dictionary in the list.
F_Dict * m_pPrev; // Previous F_Dict object in the list.
F_Database * m_pDatabase; // database this dictionary is associated with.
// A null value means it is not yet linked
// to a database.
FLMUINT m_uiDictSeq; // This is the sequence number of the
// dictionary
F_Pool m_dictPool; // Pool for all allocations except tables.
// Encryption definition table
F_ENCDEF * m_pEncDefTbl;
FLMUINT m_uiEncDefTblSize;
FLMUINT m_uiHighestEncDefNum;
F_NameTable * m_pEncDefNames;
// Table table
F_TABLE * m_pTableTbl;
FLMUINT m_uiTableTblSize;
FLMUINT m_uiHighestTableNum;
F_NameTable * m_pTableNames;
// Index table
F_INDEX * m_pIndexTbl;
FLMUINT m_uiIndexTblSize;
FLMUINT m_uiHighestIndexNum;
F_NameTable * m_pIndexNames;
FLMUINT m_uiUseCount; // Number of F_Db structures currently
// pointing to this dictionary.
friend class F_Database;
friend class F_Db;
friend class F_Query;
friend class F_DbCheck;
friend class F_BTreeInfo;
};
#endif // #ifndef FDICT_H