From 8890bba5b77407401784cb4cf7946784f2cf1354 Mon Sep 17 00:00:00 2001 From: prabatuty Date: Thu, 26 May 2011 01:01:01 +0000 Subject: [PATCH] code reorg --- src/storage/CatalogTables.cxx | 673 +-------------------------------------- src/storage/CatalogTablesFk.cxx | 276 ++++++++++++++++ src/storage/CatalogTablesIdx.cxx | 443 ++++++++++++++++++++++++++ src/storage/Makefile.am | 3 +- 4 files changed, 723 insertions(+), 672 deletions(-) create mode 100644 src/storage/CatalogTablesFk.cxx create mode 100644 src/storage/CatalogTablesIdx.cxx diff --git a/src/storage/CatalogTables.cxx b/src/storage/CatalogTables.cxx index 820dc5e1..aedab398 100644 --- a/src/storage/CatalogTables.cxx +++ b/src/storage/CatalogTables.cxx @@ -44,6 +44,7 @@ DbRetVal CatalogTableTABLE::insert(const char *name, int id, size_t size, printDebug(DM_SystemDatabase,"One Row inserted into TABLE %x %s",tptr, name); return OK; } + DbRetVal CatalogTableTABLE::renameTable( const char *oldName,const char *newName) { Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(TableTableId); @@ -83,6 +84,7 @@ DbRetVal CatalogTableTABLE::renameTable( const char *oldName,const char *newName } return OK; } + DbRetVal CatalogTableTABLE::renameIndex( const char *oldName,const char *newName) { Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(IndexTableId); @@ -354,424 +356,6 @@ DbRetVal CatalogTableFIELD::getFieldPtrs(FieldNameList &fldList,void *tptr, char return rv; } -DbRetVal CatalogTableINDEX::insert(const char *name, void *tptr, int numFlds, bool isUnique, - void* chunk, int bucketSize, void *hChunk, void *&tupleptr) -{ - Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(IndexTableId); - ChunkIterator iter = tChunk->getIterator(); - - //Checking for index having same name, proceed further only - //if no such indexes are - void *data = NULL; - while ((data = iter.nextElement())!= NULL) - { - if (0 == strcmp(((CINDEX*)data)->indName_, name)) - { - printError(ErrAlready, "Index with name \'%s\' already exists " - "on the table \'%s\'.", name, ((CTABLE *)tptr)->tblName_); - return ErrAlready; - } - - } - - DbRetVal rv =OK; - tupleptr = tChunk->allocate(systemDatabase_, &rv); - if (NULL == tupleptr) - { - printError(rv, - "Could not allocate for INDEX catalog table"); - return rv; - } - CINDEX *indexInfo = (CINDEX*)tupleptr; - strcpy(indexInfo->indName_, name); - indexInfo->tblID_ = -1; //Not used currently - indexInfo->tblPtr_ = tptr; - indexInfo->numFlds_ = numFlds; - if (NULL == hChunk) - indexInfo->indexType_ = treeIndex; - else - indexInfo->indexType_ = hashIndex; - if (0 == bucketSize) indexInfo->indexType_ = trieIndex; - indexInfo->chunkPtr_ = chunk; - indexInfo->hashNodeChunk_ = hChunk; - indexInfo->noOfBuckets_ = bucketSize; - indexInfo->isUnique_ = isUnique; - indexInfo->fstIndFld_=NULL; - printDebug(DM_SystemDatabase,"One Row inserted into INDEX %x %s",tupleptr, name); - return OK; -} - -DbRetVal CatalogTableINDEX::remove(const char *name, void *&chunk, void *&hchunk, void *&iptr) -{ - Chunk *fChunk = systemDatabase_->getSystemDatabaseChunk(IndexTableId); - ChunkIterator iter = fChunk->getIterator(); - - void *data = NULL; - while ((data = iter.nextElement())!= NULL) - { - if (0 == strcmp(((CINDEX*)data)->indName_, name)) - { - //remove this element and store the tuple ptr - //there will be only one row for this table(Primary key) - chunk = (Chunk*) ((CINDEX*)data)->chunkPtr_; - hchunk = (Chunk*) ((CINDEX*)data)->hashNodeChunk_; - iptr = (void*) data; - break; - } - } - if (NULL != iptr) - { - fChunk->free(systemDatabase_, iptr); - printDebug(DM_SystemDatabase,"One Row deleted from INDEX %x %s",iptr, name); - } - else - { - printError(ErrNotExists,"Index %s not exists in INDEX catalog table", name); - return ErrNotExists; - } - return OK; -} -DbRetVal CatalogTableINDEX::get(const char *name, void *&chunk, void *&hchunk, void *&iptr) -{ - Chunk *fChunk = systemDatabase_->getSystemDatabaseChunk(IndexTableId); - ChunkIterator iter = fChunk->getIterator(); - - void *data = NULL; - while ((data = iter.nextElement())!= NULL) - { - if (0 == strcmp(((CINDEX*)data)->indName_, name)) - { - //remove this element and store the tuple ptr - //there will be only one row for this table(Primary key) - chunk = (Chunk*) ((CINDEX*)data)->chunkPtr_; - hchunk = (Chunk*) ((CINDEX*)data)->hashNodeChunk_; - iptr = (void*) data; - break; - } - } - if (NULL == iptr) - { - printError(ErrNotExists,"Index %s not exists in INDEX catalog table", name); - return ErrNotExists; - } - return OK; -} - -DbRetVal CatalogTableINDEX::setChunkPtr(const char *name, ObjectType type, void *bChunk, void *firstPage, void *curPage) -{ - Chunk *fChunk = systemDatabase_->getSystemDatabaseChunk(IndexTableId); - ChunkIterator iter = fChunk->getIterator(); - - void *data = NULL; - while ((data = iter.nextElement())!= NULL) - { - if (0 == strcmp(((CINDEX*)data)->indName_, name)) - { - //remove this element and store the tuple ptr - //there will be only one row for this table(Primary key) - if (type == hIdx) { - ((Chunk*) ((CINDEX*)data)->chunkPtr_)->setFirstPage(bChunk); - ((Chunk*) ((CINDEX*)data)->chunkPtr_)->setCurPage(bChunk); - ((Chunk*)((CINDEX*)data)->hashNodeChunk_)->setFirstPage(firstPage); - ((Chunk*)((CINDEX*)data)->hashNodeChunk_)->setCurPage(curPage); - } else if (type == tIdx) { - ((Chunk*) ((CINDEX*)data)->chunkPtr_)->setFirstPage(firstPage); - ((Chunk*) ((CINDEX*)data)->chunkPtr_)->setCurPage(curPage); - ((CINDEX*)data)->hashNodeChunk_ = bChunk; - } - break; - } - } - return OK; -} - -int CatalogTableINDEX::getNumIndexes(void *tptr) -{ - Chunk *fChunk = systemDatabase_->getSystemDatabaseChunk(IndexTableId); - ChunkIterator iter = fChunk->getIterator(); - void *iptr = NULL; - int numIndex =0; - while (NULL != (iptr = iter.nextElement())) - { - if (((CINDEX*)iptr)->tblPtr_ == tptr) numIndex++; - } - return numIndex; -} - -ListIterator CatalogTableINDEXFIELD::getIndexListIterater(char *name) -{ - List indexList; - Chunk *chunk=systemDatabase_->getSystemDatabaseChunk(IndexFieldTableId); - ChunkIterator ifIter = chunk->getIterator(); - void *data = NULL; - while ((data = ifIter.nextElement())!= NULL) - { - IndexInfoForDriver *idxInfo = new IndexInfoForDriver(); - if(strcmp( name,((CTABLE*)(((CINDEXFIELD*)data)->tablePtr))->tblName_) == 0) - { - strcpy(idxInfo->indexName ,((CINDEX*)(((CINDEXFIELD*)data)->indexPtr))->indName_); - strcpy(idxInfo->tableName ,((CTABLE*)(((CINDEXFIELD*)data)->tablePtr))->tblName_); - strcpy(idxInfo->fieldName ,((CFIELD*)(((CINDEXFIELD*)data)->fieldPtr))->fldName_); - idxInfo->type = ((CINDEX*)(((CINDEXFIELD*)data)->indexPtr))->indexType_ ; - idxInfo->isUnique = ((CINDEX*)(((CINDEXFIELD*)data)->indexPtr))->isUnique_; - idxInfo->isPrimary = ((CFIELD*)(((CINDEXFIELD*)data)->fieldPtr))->isPrimary_; - indexList.append(idxInfo); - } - } - return indexList.getIterator(); -} - -char* CatalogTableINDEX::getIndexName(void *tptr, int position) -{ - if (position == 0) return NULL; - Chunk *fChunk = systemDatabase_->getSystemDatabaseChunk(IndexTableId); - ChunkIterator iter = fChunk->getIterator(); - void *iptr = NULL; - int numIndex =0; - int curPos =0; - while (NULL != (iptr = iter.nextElement())) - { - if (((CINDEX*)iptr)->tblPtr_ == tptr) curPos++; - if ( curPos == position ) return ((CINDEX*)iptr)->indName_; - } - return NULL; - -} - -void CatalogTableINDEX::getIndexPtrs(void *tptr, char **&array) -{ - void *iptr = NULL; - Chunk *fChunk = systemDatabase_->getSystemDatabaseChunk(IndexTableId); - ChunkIterator iter = fChunk->getIterator(); - int i=0; - while (NULL != (iptr = iter.nextElement())) - { - if (((CINDEX*)iptr)->tblPtr_ == tptr) - { - array[i++] = (char*) iptr; - } - } - return; -} - -ChunkIterator CatalogTableINDEX::getIterator(void *iptr) -{ - CINDEX *index = (CINDEX*)iptr; - return ((Chunk*)index->chunkPtr_)->getIterator(); -} - - -int CatalogTableINDEX::getNoOfBuckets(void *iptr) -{ - CINDEX *index = (CINDEX*)iptr; - return index->noOfBuckets_; -} - -int CatalogTableINDEX::getUnique(void *iptr) -{ - CINDEX *index = (CINDEX*)iptr; - return index->isUnique_; -} -IndexType CatalogTableINDEX::getType(void *iptr) -{ - CINDEX *index = (CINDEX*)iptr; - return index->indexType_; -} -char* CatalogTableINDEX::getName(void *iptr) -{ - CINDEX *index = (CINDEX*)iptr; - return index->indName_; -} -int CatalogTableINDEX::getOffsetOfFirstField(void *iptr) -{ - CINDEX *index = (CINDEX*)iptr; - return ((CFIELD*)(((CINDEXFIELD*)(index->fstIndFld_))->fieldPtr))->offset_; -} -DbRetVal CatalogTableINDEXFIELD::insert(FieldNameList &fldList, void *indexPtr, - void *tblPtr, char **&fptr) - -{ - Chunk *tChunk; - tChunk = systemDatabase_->getSystemDatabaseChunk(IndexTableId); - ChunkIterator iter = tChunk->getIterator(); - CINDEXFIELD *fInd=NULL; - char *fName =NULL; - void *data = NULL; - bool isFldInd=false; - while ((data = iter.nextElement())!= NULL) - { - if ((((CINDEX*)data)->tblPtr_==tblPtr) - && (((CINDEX*)indexPtr)->numFlds_ == ((CINDEX*)data)->numFlds_) - && (((CINDEX*)indexPtr)->indexType_==((CINDEX*)data)->indexType_) - && (data != indexPtr) ) - { - fldList.resetIter(); - while (NULL != (fName = fldList.nextFieldName())) - { - isFldInd=false; - fInd=(CINDEXFIELD*)((CINDEX*)data)->fstIndFld_ ; - while (fInd) - { - if (0 == strcmp(((CFIELD *) fInd->fieldPtr)->fldName_, fName)) - { - isFldInd=true; - break; - } - fInd=fInd->next; - } - if(!isFldInd) break; - } - if(isFldInd) - { - printError(ErrAlready, "Index on this field already exists on table \'%s\' by name \'%s\'", ((CTABLE *)tblPtr)->tblName_, ((CINDEX *)data)->indName_); - return ErrAlready; - } - } - - } - - tChunk = systemDatabase_->getSystemDatabaseChunk(IndexFieldTableId); - fldList.resetIter(); - int i =0; - while (NULL != (fName = fldList.nextFieldName())) - { - DbRetVal rv = OK; - fInd=(CINDEXFIELD*)((CINDEX*)indexPtr)->fstIndFld_; - while(fInd) - { - if (0 == strcmp(((CFIELD *) fInd->fieldPtr)->fldName_, fName)) - { - printError(ErrAlready,"Composite Index Can't be created with same Name"); - fInd=(CINDEXFIELD*)((CINDEX*)indexPtr)->fstIndFld_; - CINDEXFIELD *fldI; - while(fInd) - { - fldI=fInd; - fInd=fInd->next; - tChunk->free(systemDatabase_,fldI); - } - return ErrAlready; - } - fInd=fInd->next; - } - void *fieldptr = tChunk->allocate(systemDatabase_, &rv); - if (NULL == fieldptr) - { - printError(rv, "Could not allocate for USER catalog table"); - return rv; - } - CINDEXFIELD *fldInfo = (CINDEXFIELD*)fieldptr; - fldInfo->tablePtr = tblPtr; - fldInfo->fieldPtr = (CFIELD*)fptr[i++]; - fldInfo->indexPtr = indexPtr; - fldInfo->next=(CINDEXFIELD*)((CINDEX*)indexPtr)->fstIndFld_; - ((CINDEX *)indexPtr)->fstIndFld_=fldInfo; - printDebug(DM_SystemDatabase,"One Row inserted into INDEXFIELD %x", fldInfo); - } - return OK; -} - -DbRetVal CatalogTableINDEXFIELD::remove(void *iptr) -{ - Chunk *fChunk; - fChunk = systemDatabase_->getSystemDatabaseChunk(IndexFieldTableId); - ChunkIterator fIter = fChunk->getIterator(); - void *data = NULL; - while ((data = fIter.nextElement())!= NULL) - { - if (((CINDEXFIELD*)data)->indexPtr == iptr) - { - //remove this element - if(((CFIELD *)((CINDEXFIELD*)data)->fieldPtr)->isUnique_) ((CFIELD *)((CINDEXFIELD*)data)->fieldPtr)->isUnique_ = false; - fChunk->free(systemDatabase_, data); - printDebug(DM_SystemDatabase,"One Row deleted from INDEXFIELD %x", data); - } - } - return OK; -} - -DbRetVal CatalogTableINDEXFIELD::getFieldNameAndType(void *index, - char *&name, DataType &type) -{ - Chunk *ifChunk; - ifChunk = systemDatabase_->getSystemDatabaseChunk(IndexFieldTableId); - ChunkIterator ifIter = ifChunk->getIterator(); - void *data = NULL; - while ((data = ifIter.nextElement())!= NULL) - { - if (((CINDEXFIELD*)data)->indexPtr == index) - { - //store the field name - name = ((CFIELD*)(((CINDEXFIELD*)data)->fieldPtr))->fldName_; - type = ((CFIELD*)(((CINDEXFIELD*)data)->fieldPtr))->type_; - return OK; - } - } - printError(ErrNotExists,"Index %x not exists in catalog table", index); - return ErrNotExists; -} - -DbRetVal CatalogTableINDEXFIELD::getFieldInfo(void *index, FieldList &list) -{ - Chunk *ifChunk; - ifChunk = systemDatabase_->getSystemDatabaseChunk(IndexFieldTableId); - ChunkIterator ifIter = ifChunk->getIterator(); - void *data = NULL; - int rowCount =0; - while ((data = ifIter.nextElement())!= NULL) - { - if (((CINDEXFIELD*)data)->indexPtr == index) - { - //add the information to the field list - CFIELD *fTuple = (CFIELD*)(((CINDEXFIELD*)data)->fieldPtr); - FieldDef fldDef; - strcpy(fldDef.fldName_, fTuple->fldName_); - fldDef.fldName_[IDENTIFIER_LENGTH] = '\0'; - fldDef.type_ = fTuple->type_; - fldDef.length_ = fTuple->length_; - fldDef.offset_ = fTuple->offset_; - fldDef.isDefault_ = fTuple->isDefault_; - os::memcpy(fldDef.defaultValueBuf_, fTuple->defaultValueBuf_, - DEFAULT_VALUE_BUF_LENGTH); - fldDef.isNull_ = fTuple->isNull_; - fldDef.isUnique_ = fTuple->isUnique_; - fldDef.isPrimary_ = fTuple->isPrimary_; - list.append(fldDef); - } - rowCount++; - } - if (!rowCount) { - printError(ErrNotExists,"Index %x not exists in catalog table", index); - return ErrNotExists; - } - return OK; -} - -void CatalogTableINDEXFIELD::printAllIndex() -{ - Chunk *chunk=systemDatabase_->getSystemDatabaseChunk(IndexFieldTableId); - ChunkIterator ifIter = chunk->getIterator(); - void *data = NULL; - char indexName[IDENTIFIER_LENGTH] = {'\0'}; - while ((data = ifIter.nextElement())!= NULL) - { - if(strcmp(indexName,((CINDEX*)(((CINDEXFIELD*)data)->indexPtr))->indName_)!=0) - { - printf(" %s \n",((CINDEX*)(((CINDEXFIELD*)data)->indexPtr))->indName_); - if(0==((CINDEX*)(((CINDEXFIELD*)data)->indexPtr))->indexType_) - printf(" Hash Index \n"); - else - printf(" Tree Index \n"); - printf(" %s
\n",((CTABLE*)(((CINDEXFIELD*)data)->tablePtr))->tblName_); - printf(" %s \n",((CFIELD*)(((CINDEXFIELD*)data)->fieldPtr))->fldName_); - } - else - { - printf(" %s \n",((CFIELD*)(((CINDEXFIELD*)data)->fieldPtr))->fldName_); - } - strcpy(indexName,((CINDEX*)(((CINDEXFIELD*)data)->indexPtr))->indName_); - } -} List CatalogTableUSER::getUserList() { @@ -879,256 +463,3 @@ DbRetVal CatalogTableUSER::changePass(const char *name, const char *pass) printError(ErrNotExists,"User %s not exists in catalog table", name); return ErrNotExists; } - -DbRetVal CatalogTableFK::insert(char *name, void *tptr, void *tPkptr) -{ - Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); - ChunkIterator iter = tChunk->getIterator(); - void *data = NULL; - while ((data = iter.nextElement())!= NULL) - { - if (0 == strcmp(((CFK*)data)->fkName_, name)) - { - printError(ErrAlready, "Index with name \'%s\' already exists " - "on the table \'%s\'.", name, ((CTABLE *)tptr)->tblName_); - return ErrAlready; - } - - } - - DbRetVal rv =OK; - void *fkptr = tChunk->allocate(systemDatabase_, &rv); - if (NULL == fkptr) - { - printError(rv, "Could not allocate for FK catalog table"); - return rv; - } - CFK *fkTblInfo = (CFK*)fkptr; - strcpy(fkTblInfo->fkName_, name); - fkTblInfo->fkTblPtr_= tptr; - fkTblInfo->pkTblPtr_= tPkptr; - printDebug(DM_SystemDatabase,"One Row inserted into FK %x %s",fkptr, name); - return OK; -} - -DbRetVal CatalogTableFKFIELD::insert(char *cFKName, char **fkFldPtrs, char **pkFldPtrs,int totalFld) -{ - Chunk *tChunk = NULL; - tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); - ChunkIterator iter = tChunk->getIterator(); - void *data = NULL; - while ((data = iter.nextElement())!= NULL) - { - if (0 == strcmp(((CFK*)data)->fkName_, cFKName)) - { - break; - } - } - tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyFieldTableId); - int i =0; - DbRetVal rv = OK; - while (i < totalFld) - { - void *fieldptr = tChunk->allocate(systemDatabase_, &rv); - if (NULL == fieldptr) - { - printError(rv, "Could not allocate for USER catalog table"); - return rv; - } - CFKFIELD *fldInfo = (CFKFIELD*)fieldptr; - fldInfo->fkPtr_ = data; - fldInfo->pfFldPtr_ = (CFIELD*)pkFldPtrs[i]; - fldInfo->fkFldPtr_ = (CFIELD*)fkFldPtrs[i++]; - //printDebug(DM_TEST,"TYPE %d\n",((CFIELD*)fldInfo->pfFldPtr_)->type_); - //printDebug(DM_TEST,"FK name %s\n",((CFIELD*)fldInfo->fkFldPtr_)->fldName_); - if(!(((CFIELD*)fldInfo->pfFldPtr_)->isUnique_) || !(((CFIELD*)fldInfo->pfFldPtr_)->isNull_)) - { - printError(ErrSysInternal,"Parent Table field should have primary key field "); - tChunk->free(systemDatabase_,fieldptr); - return ErrSysInternal; - } - if(((CFIELD*)fldInfo->pfFldPtr_)->type_!=((CFIELD*)fldInfo->fkFldPtr_)->type_) - { - printError(ErrSysInternal,"Type Missmatch in both PK field and FK field "); - tChunk->free(systemDatabase_,fieldptr); - return ErrSysInternal; - } - printDebug(DM_SystemDatabase,"One Row inserted into FKFIELD %x", fldInfo); - } - return OK; -} -DbRetVal CatalogTableFK::remove(void *ctptr) -{ - Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); - ChunkIterator iter = tChunk->getIterator(); - void *data = NULL; - while ((data = iter.nextElement())!= NULL) - { - if (data == ctptr) - { - tChunk->free(systemDatabase_,data); - printDebug(DM_SystemDatabase,"One Row deleted from FKFIELD %x", data); - } - - } - return OK; -} - -DbRetVal CatalogTableFKFIELD::remove(void *cFKfld) -{ - Chunk *fChunk = NULL; - fChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyFieldTableId); - ChunkIterator iter = fChunk->getIterator(); - void *data = NULL; - while ((data = iter.nextElement())!= NULL) - { - if (((CFKFIELD*)data)->fkPtr_== cFKfld ) - { - fChunk->free(systemDatabase_, data); - printDebug(DM_SystemDatabase,"One Row deleted from CFKFIELD %x", data); - } - } - return OK; -} -void *CatalogTableFK::getFkCTable(void *ctptr) -{ - Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); - ChunkIterator iter = tChunk->getIterator(); - void *data = NULL; - while ((data = iter.nextElement())!= NULL) - { - if (((CFK*)data)->fkTblPtr_== ctptr) - { - return data; - } - - } - return NULL; -} -int CatalogTableFK::getNumFkTable(void *ctptr) -{ - Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); - ChunkIterator iter = tChunk->getIterator(); - void *data = NULL; - int count=0; - while ((data = iter.nextElement())!= NULL) - { - if (((CFK*)data)->pkTblPtr_== ctptr) - { - count++; - } - } - return count; -} - -bool CatalogTableFK::isFkTable(void *ctptr) -{ - Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); - ChunkIterator iter = tChunk->getIterator(); - void *data = NULL; - int count=0; - while ((data = iter.nextElement())!= NULL) - { - if (((CFK*)data)->fkTblPtr_== ctptr) - { - return true; - } - } - return false; -} -int CatalogTableFK::getNoOfFkTable(void *ctptr) -{ - Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); - ChunkIterator iter = tChunk->getIterator(); - void *data = NULL; - int count=0; - while ((data = iter.nextElement())!= NULL) - { - if (((CFK*)data)->pkTblPtr_== ctptr) - { - count++; - } - } - return count; -} - -int CatalogTableFK::getNoOfPkTable(void *ctptr) -{ - Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); - ChunkIterator iter = tChunk->getIterator(); - void *data = NULL; - int count=0; - while ((data = iter.nextElement())!= NULL) - { - if (((CFK*)data)->fkTblPtr_== ctptr) - { - count++; - } - } - return count; -} - -void CatalogTableFK::getPkTableName(void *ctptr,char **&array) -{ - Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); - ChunkIterator iter = tChunk->getIterator(); - void *data = NULL; - int i=0; - while ((data = iter.nextElement())!= NULL) - { - if (((CFK*)data)->fkTblPtr_== ctptr) - { - array[i++] = ((CTABLE*)((CFK*)data)->pkTblPtr_)->tblName_; - } - } -} -void CatalogTableFK::getFkTableName(void *ctptr,char **&array) -{ - Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); - ChunkIterator iter = tChunk->getIterator(); - void *data = NULL; - int i=0; - while ((data = iter.nextElement())!= NULL) - { - if (((CFK*)data)->pkTblPtr_== ctptr) - { - array[i++] = ((CTABLE*)((CFK*)data)->fkTblPtr_)->tblName_; - } - } -} - - -DbRetVal CatalogTableFK::getPkFkFieldInfo(void *cpkptr, void *cfkptr, FieldNameList &pklist,FieldNameList &fklist) -{ - Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); - ChunkIterator iter = tChunk->getIterator(); - void *data = NULL; - while ((data = iter.nextElement())!= NULL) - { - if (((CFK*)data)->pkTblPtr_== cpkptr && ((CFK*)data)->fkTblPtr_ == cfkptr) - { - break; - } - } - if(data == NULL) - { - printError(ErrNotExists,"Foreign Key field CFK not found"); - return ErrNotExists; - } - Chunk *fChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyFieldTableId); - iter = fChunk->getIterator(); - void *fdata=NULL; - while ((fdata = iter.nextElement())!= NULL) - { - if (((CFKFIELD*)fdata)->fkPtr_==data) - { - //printDebug(DM_TEST,"PK Field name %s\n",((CFIELD*)((CFKFIELD*)fdata)->pfFldPtr_)->fldName_); - //printDebug(DM_TEST,"FK Field name %s\n",((CFIELD*)((CFKFIELD*)fdata)->fkFldPtr_)->fldName_); - pklist.append(((CFIELD*)((CFKFIELD*)fdata)->pfFldPtr_)->fldName_); - fklist.append(((CFIELD*)((CFKFIELD*)fdata)->fkFldPtr_)->fldName_); - } - } - return OK; -} - - diff --git a/src/storage/CatalogTablesFk.cxx b/src/storage/CatalogTablesFk.cxx new file mode 100644 index 00000000..7bc6d41f --- /dev/null +++ b/src/storage/CatalogTablesFk.cxx @@ -0,0 +1,276 @@ +/*************************************************************************** + * Copyright (C) 2007 by www.databasecache.com * + * Contact: praba_tuty@databasecache.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + ***************************************************************************/ +#include +#include +#include +#include +#include + +DbRetVal CatalogTableFK::insert(char *name, void *tptr, void *tPkptr) +{ + Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); + ChunkIterator iter = tChunk->getIterator(); + void *data = NULL; + while ((data = iter.nextElement())!= NULL) + { + if (0 == strcmp(((CFK*)data)->fkName_, name)) + { + printError(ErrAlready, "Index with name \'%s\' already exists " + "on the table \'%s\'.", name, ((CTABLE *)tptr)->tblName_); + return ErrAlready; + } + } + + DbRetVal rv =OK; + void *fkptr = tChunk->allocate(systemDatabase_, &rv); + if (NULL == fkptr) + { + printError(rv, "Could not allocate for FK catalog table"); + return rv; + } + CFK *fkTblInfo = (CFK*)fkptr; + strcpy(fkTblInfo->fkName_, name); + fkTblInfo->fkTblPtr_= tptr; + fkTblInfo->pkTblPtr_= tPkptr; + printDebug(DM_SystemDatabase,"One Row inserted into FK %x %s",fkptr, name); + return OK; +} + +DbRetVal CatalogTableFKFIELD::insert(char *cFKName, char **fkFldPtrs, char **pkFldPtrs,int totalFld) +{ + Chunk *tChunk = NULL; + tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); + ChunkIterator iter = tChunk->getIterator(); + void *data = NULL; + while ((data = iter.nextElement())!= NULL) + { + if (0 == strcmp(((CFK*)data)->fkName_, cFKName)) + { + break; + } + } + tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyFieldTableId); + int i =0; + DbRetVal rv = OK; + while (i < totalFld) + { + void *fieldptr = tChunk->allocate(systemDatabase_, &rv); + if (NULL == fieldptr) + { + printError(rv, "Could not allocate for USER catalog table"); + return rv; + } + CFKFIELD *fldInfo = (CFKFIELD*)fieldptr; + fldInfo->fkPtr_ = data; + fldInfo->pfFldPtr_ = (CFIELD*)pkFldPtrs[i]; + fldInfo->fkFldPtr_ = (CFIELD*)fkFldPtrs[i++]; + //printDebug(DM_TEST,"TYPE %d\n",((CFIELD*)fldInfo->pfFldPtr_)->type_); + //printDebug(DM_TEST,"FK name %s\n",((CFIELD*)fldInfo->fkFldPtr_)->fldName_); + if(!(((CFIELD*)fldInfo->pfFldPtr_)->isUnique_) || !(((CFIELD*)fldInfo->pfFldPtr_)->isNull_)) + { + printError(ErrSysInternal,"Parent Table field should have primary key field "); + tChunk->free(systemDatabase_,fieldptr); + return ErrSysInternal; + } + if(((CFIELD*)fldInfo->pfFldPtr_)->type_!=((CFIELD*)fldInfo->fkFldPtr_)->type_) + { + printError(ErrSysInternal,"Type Missmatch in both PK field and FK field "); + tChunk->free(systemDatabase_,fieldptr); + return ErrSysInternal; + } + printDebug(DM_SystemDatabase,"One Row inserted into FKFIELD %x", fldInfo); + } + return OK; +} + +DbRetVal CatalogTableFK::remove(void *ctptr) +{ + Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); + ChunkIterator iter = tChunk->getIterator(); + void *data = NULL; + while ((data = iter.nextElement())!= NULL) + { + if (data == ctptr) + { + tChunk->free(systemDatabase_,data); + printDebug(DM_SystemDatabase,"One Row deleted from FKFIELD %x", data); + } + } + return OK; +} + +DbRetVal CatalogTableFKFIELD::remove(void *cFKfld) +{ + Chunk *fChunk = NULL; + fChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyFieldTableId); + ChunkIterator iter = fChunk->getIterator(); + void *data = NULL; + while ((data = iter.nextElement())!= NULL) + { + if (((CFKFIELD*)data)->fkPtr_== cFKfld ) + { + fChunk->free(systemDatabase_, data); + printDebug(DM_SystemDatabase,"One Row deleted from CFKFIELD %x", data); + } + } + return OK; +} + +void *CatalogTableFK::getFkCTable(void *ctptr) +{ + Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); + ChunkIterator iter = tChunk->getIterator(); + void *data = NULL; + while ((data = iter.nextElement())!= NULL) + { + if (((CFK*)data)->fkTblPtr_== ctptr) + { + return data; + } + + } + return NULL; +} + +int CatalogTableFK::getNumFkTable(void *ctptr) +{ + Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); + ChunkIterator iter = tChunk->getIterator(); + void *data = NULL; + int count=0; + while ((data = iter.nextElement())!= NULL) + { + if (((CFK*)data)->pkTblPtr_== ctptr) + { + count++; + } + } + return count; +} + +bool CatalogTableFK::isFkTable(void *ctptr) +{ + Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); + ChunkIterator iter = tChunk->getIterator(); + void *data = NULL; + int count=0; + while ((data = iter.nextElement())!= NULL) + { + if (((CFK*)data)->fkTblPtr_== ctptr) + { + return true; + } + } + return false; +} + +int CatalogTableFK::getNoOfFkTable(void *ctptr) +{ + Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); + ChunkIterator iter = tChunk->getIterator(); + void *data = NULL; + int count=0; + while ((data = iter.nextElement())!= NULL) + { + if (((CFK*)data)->pkTblPtr_== ctptr) + { + count++; + } + } + return count; +} + +int CatalogTableFK::getNoOfPkTable(void *ctptr) +{ + Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); + ChunkIterator iter = tChunk->getIterator(); + void *data = NULL; + int count=0; + while ((data = iter.nextElement())!= NULL) + { + if (((CFK*)data)->fkTblPtr_== ctptr) + { + count++; + } + } + return count; +} + +void CatalogTableFK::getPkTableName(void *ctptr,char **&array) +{ + Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); + ChunkIterator iter = tChunk->getIterator(); + void *data = NULL; + int i=0; + while ((data = iter.nextElement())!= NULL) + { + if (((CFK*)data)->fkTblPtr_== ctptr) + { + array[i++] = ((CTABLE*)((CFK*)data)->pkTblPtr_)->tblName_; + } + } +} + +void CatalogTableFK::getFkTableName(void *ctptr,char **&array) +{ + Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); + ChunkIterator iter = tChunk->getIterator(); + void *data = NULL; + int i=0; + while ((data = iter.nextElement())!= NULL) + { + if (((CFK*)data)->pkTblPtr_== ctptr) + { + array[i++] = ((CTABLE*)((CFK*)data)->fkTblPtr_)->tblName_; + } + } +} + + +DbRetVal CatalogTableFK::getPkFkFieldInfo(void *cpkptr, void *cfkptr, FieldNameList &pklist,FieldNameList &fklist) +{ + Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId); + ChunkIterator iter = tChunk->getIterator(); + void *data = NULL; + while ((data = iter.nextElement())!= NULL) + { + if (((CFK*)data)->pkTblPtr_== cpkptr && ((CFK*)data)->fkTblPtr_ == cfkptr) + { + break; + } + } + if(data == NULL) + { + printError(ErrNotExists,"Foreign Key field CFK not found"); + return ErrNotExists; + } + Chunk *fChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyFieldTableId); + iter = fChunk->getIterator(); + void *fdata=NULL; + while ((fdata = iter.nextElement())!= NULL) + { + if (((CFKFIELD*)fdata)->fkPtr_==data) + { + //printDebug(DM_TEST,"PK Field name %s\n",((CFIELD*)((CFKFIELD*)fdata)->pfFldPtr_)->fldName_); + //printDebug(DM_TEST,"FK Field name %s\n",((CFIELD*)((CFKFIELD*)fdata)->fkFldPtr_)->fldName_); + pklist.append(((CFIELD*)((CFKFIELD*)fdata)->pfFldPtr_)->fldName_); + fklist.append(((CFIELD*)((CFKFIELD*)fdata)->fkFldPtr_)->fldName_); + } + } + return OK; +} + + diff --git a/src/storage/CatalogTablesIdx.cxx b/src/storage/CatalogTablesIdx.cxx new file mode 100644 index 00000000..02b6302f --- /dev/null +++ b/src/storage/CatalogTablesIdx.cxx @@ -0,0 +1,443 @@ +/*************************************************************************** + * Copyright (C) 2007 by www.databasecache.com * + * Contact: praba_tuty@databasecache.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + ***************************************************************************/ +#include +#include +#include +#include +#include + +DbRetVal CatalogTableINDEX::insert(const char *name, void *tptr, int numFlds, bool isUnique, + void* chunk, int bucketSize, void *hChunk, void *&tupleptr) +{ + Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(IndexTableId); + ChunkIterator iter = tChunk->getIterator(); + + //Checking for index having same name, proceed further only + //if no such indexes exists + void *data = NULL; + while ((data = iter.nextElement())!= NULL) + { + if (0 == strcmp(((CINDEX*)data)->indName_, name)) + { + printError(ErrAlready, "Index with name \'%s\' already exists " + "on the table \'%s\'.", name, ((CTABLE *)tptr)->tblName_); + return ErrAlready; + } + } + + DbRetVal rv =OK; + tupleptr = tChunk->allocate(systemDatabase_, &rv); + if (NULL == tupleptr) + { + printError(rv, + "Could not allocate for INDEX catalog table"); + return rv; + } + CINDEX *indexInfo = (CINDEX*)tupleptr; + strcpy(indexInfo->indName_, name); + indexInfo->tblID_ = -1; //Not used currently + indexInfo->tblPtr_ = tptr; + indexInfo->numFlds_ = numFlds; + if (NULL == hChunk) + indexInfo->indexType_ = treeIndex; + else + indexInfo->indexType_ = hashIndex; + if (0 == bucketSize) indexInfo->indexType_ = trieIndex; + indexInfo->chunkPtr_ = chunk; + indexInfo->hashNodeChunk_ = hChunk; + indexInfo->noOfBuckets_ = bucketSize; + indexInfo->isUnique_ = isUnique; + indexInfo->fstIndFld_=NULL; + printDebug(DM_SystemDatabase,"One Row inserted into INDEX %x %s",tupleptr, name); + return OK; +} + +DbRetVal CatalogTableINDEX::remove(const char *name, void *&chunk, void *&hchunk, void *&iptr) +{ + Chunk *fChunk = systemDatabase_->getSystemDatabaseChunk(IndexTableId); + ChunkIterator iter = fChunk->getIterator(); + + void *data = NULL; + while ((data = iter.nextElement())!= NULL) + { + if (0 == strcmp(((CINDEX*)data)->indName_, name)) + { + //remove this element and store the tuple ptr + //there will be only one row for this table(Primary key) + chunk = (Chunk*) ((CINDEX*)data)->chunkPtr_; + hchunk = (Chunk*) ((CINDEX*)data)->hashNodeChunk_; + iptr = (void*) data; + break; + } + } + if (NULL != iptr) + { + fChunk->free(systemDatabase_, iptr); + printDebug(DM_SystemDatabase,"One Row deleted from INDEX %x %s",iptr, name); + } + else + { + printError(ErrNotExists,"Index %s not exists in INDEX catalog table", name); + return ErrNotExists; + } + return OK; +} + +DbRetVal CatalogTableINDEX::get(const char *name, void *&chunk, void *&hchunk, void *&iptr) +{ + Chunk *fChunk = systemDatabase_->getSystemDatabaseChunk(IndexTableId); + ChunkIterator iter = fChunk->getIterator(); + + void *data = NULL; + while ((data = iter.nextElement())!= NULL) + { + if (0 == strcmp(((CINDEX*)data)->indName_, name)) + { + //remove this element and store the tuple ptr + //there will be only one row for this table(Primary key) + chunk = (Chunk*) ((CINDEX*)data)->chunkPtr_; + hchunk = (Chunk*) ((CINDEX*)data)->hashNodeChunk_; + iptr = (void*) data; + break; + } + } + if (NULL == iptr) + { + printError(ErrNotExists,"Index %s not exists in INDEX catalog table", name); + return ErrNotExists; + } + return OK; +} + +DbRetVal CatalogTableINDEX::setChunkPtr(const char *name, ObjectType type, void *bChunk, void *firstPage, void *curPage) +{ + Chunk *fChunk = systemDatabase_->getSystemDatabaseChunk(IndexTableId); + ChunkIterator iter = fChunk->getIterator(); + + void *data = NULL; + while ((data = iter.nextElement())!= NULL) + { + if (0 == strcmp(((CINDEX*)data)->indName_, name)) + { + //remove this element and store the tuple ptr + //there will be only one row for this table(Primary key) + if (type == hIdx) { + ((Chunk*) ((CINDEX*)data)->chunkPtr_)->setFirstPage(bChunk); + ((Chunk*) ((CINDEX*)data)->chunkPtr_)->setCurPage(bChunk); + ((Chunk*)((CINDEX*)data)->hashNodeChunk_)->setFirstPage(firstPage); + ((Chunk*)((CINDEX*)data)->hashNodeChunk_)->setCurPage(curPage); + } else if (type == tIdx) { + ((Chunk*) ((CINDEX*)data)->chunkPtr_)->setFirstPage(firstPage); + ((Chunk*) ((CINDEX*)data)->chunkPtr_)->setCurPage(curPage); + ((CINDEX*)data)->hashNodeChunk_ = bChunk; + } + break; + } + } + return OK; +} + +int CatalogTableINDEX::getNumIndexes(void *tptr) +{ + Chunk *fChunk = systemDatabase_->getSystemDatabaseChunk(IndexTableId); + ChunkIterator iter = fChunk->getIterator(); + void *iptr = NULL; + int numIndex =0; + while (NULL != (iptr = iter.nextElement())) + { + if (((CINDEX*)iptr)->tblPtr_ == tptr) numIndex++; + } + return numIndex; +} + +ListIterator CatalogTableINDEXFIELD::getIndexListIterater(char *name) +{ + List indexList; + Chunk *chunk=systemDatabase_->getSystemDatabaseChunk(IndexFieldTableId); + ChunkIterator ifIter = chunk->getIterator(); + void *data = NULL; + while ((data = ifIter.nextElement())!= NULL) + { + IndexInfoForDriver *idxInfo = new IndexInfoForDriver(); + if(strcmp( name,((CTABLE*)(((CINDEXFIELD*)data)->tablePtr))->tblName_) == 0) + { + strcpy(idxInfo->indexName ,((CINDEX*)(((CINDEXFIELD*)data)->indexPtr))->indName_); + strcpy(idxInfo->tableName ,((CTABLE*)(((CINDEXFIELD*)data)->tablePtr))->tblName_); + strcpy(idxInfo->fieldName ,((CFIELD*)(((CINDEXFIELD*)data)->fieldPtr))->fldName_); + idxInfo->type = ((CINDEX*)(((CINDEXFIELD*)data)->indexPtr))->indexType_ ; + idxInfo->isUnique = ((CINDEX*)(((CINDEXFIELD*)data)->indexPtr))->isUnique_; + idxInfo->isPrimary = ((CFIELD*)(((CINDEXFIELD*)data)->fieldPtr))->isPrimary_; + indexList.append(idxInfo); + } + } + return indexList.getIterator(); +} + +char* CatalogTableINDEX::getIndexName(void *tptr, int position) +{ + if (position == 0) return NULL; + Chunk *fChunk = systemDatabase_->getSystemDatabaseChunk(IndexTableId); + ChunkIterator iter = fChunk->getIterator(); + void *iptr = NULL; + int numIndex =0; + int curPos =0; + while (NULL != (iptr = iter.nextElement())) + { + if (((CINDEX*)iptr)->tblPtr_ == tptr) curPos++; + if ( curPos == position ) return ((CINDEX*)iptr)->indName_; + } + return NULL; + +} + +void CatalogTableINDEX::getIndexPtrs(void *tptr, char **&array) +{ + void *iptr = NULL; + Chunk *fChunk = systemDatabase_->getSystemDatabaseChunk(IndexTableId); + ChunkIterator iter = fChunk->getIterator(); + int i=0; + while (NULL != (iptr = iter.nextElement())) + { + if (((CINDEX*)iptr)->tblPtr_ == tptr) + { + array[i++] = (char*) iptr; + } + } + return; +} + +ChunkIterator CatalogTableINDEX::getIterator(void *iptr) +{ + CINDEX *index = (CINDEX*)iptr; + return ((Chunk*)index->chunkPtr_)->getIterator(); +} + + +int CatalogTableINDEX::getNoOfBuckets(void *iptr) +{ + CINDEX *index = (CINDEX*)iptr; + return index->noOfBuckets_; +} + +int CatalogTableINDEX::getUnique(void *iptr) +{ + CINDEX *index = (CINDEX*)iptr; + return index->isUnique_; +} + +IndexType CatalogTableINDEX::getType(void *iptr) +{ + CINDEX *index = (CINDEX*)iptr; + return index->indexType_; +} + +char* CatalogTableINDEX::getName(void *iptr) +{ + CINDEX *index = (CINDEX*)iptr; + return index->indName_; +} + +int CatalogTableINDEX::getOffsetOfFirstField(void *iptr) +{ + CINDEX *index = (CINDEX*)iptr; + return ((CFIELD*)(((CINDEXFIELD*)(index->fstIndFld_))->fieldPtr))->offset_; +} + +DbRetVal CatalogTableINDEXFIELD::insert(FieldNameList &fldList, void *indexPtr, + void *tblPtr, char **&fptr) + +{ + Chunk *tChunk; + tChunk = systemDatabase_->getSystemDatabaseChunk(IndexTableId); + ChunkIterator iter = tChunk->getIterator(); + CINDEXFIELD *fInd=NULL; + char *fName =NULL; + void *data = NULL; + bool isFldInd=false; + while ((data = iter.nextElement())!= NULL) + { + if ((((CINDEX*)data)->tblPtr_==tblPtr) + && (((CINDEX*)indexPtr)->numFlds_ == ((CINDEX*)data)->numFlds_) + && (((CINDEX*)indexPtr)->indexType_==((CINDEX*)data)->indexType_) + && (data != indexPtr) ) + { + fldList.resetIter(); + while (NULL != (fName = fldList.nextFieldName())) + { + isFldInd=false; + fInd=(CINDEXFIELD*)((CINDEX*)data)->fstIndFld_ ; + while (fInd) + { + if (0 == strcmp(((CFIELD *) fInd->fieldPtr)->fldName_, fName)) + { + isFldInd=true; + break; + } + fInd=fInd->next; + } + if(!isFldInd) break; + } + if(isFldInd) + { + printError(ErrAlready, "Index on this field already exists on table \'%s\' by name \'%s\'", ((CTABLE *)tblPtr)->tblName_, ((CINDEX *)data)->indName_); + return ErrAlready; + } + } + + } + + tChunk = systemDatabase_->getSystemDatabaseChunk(IndexFieldTableId); + fldList.resetIter(); + int i =0; + while (NULL != (fName = fldList.nextFieldName())) + { + DbRetVal rv = OK; + fInd=(CINDEXFIELD*)((CINDEX*)indexPtr)->fstIndFld_; + while(fInd) + { + if (0 == strcmp(((CFIELD *) fInd->fieldPtr)->fldName_, fName)) + { + printError(ErrAlready,"Composite Index Can't be created with same Name"); + fInd=(CINDEXFIELD*)((CINDEX*)indexPtr)->fstIndFld_; + CINDEXFIELD *fldI; + while(fInd) + { + fldI=fInd; + fInd=fInd->next; + tChunk->free(systemDatabase_,fldI); + } + return ErrAlready; + } + fInd=fInd->next; + } + void *fieldptr = tChunk->allocate(systemDatabase_, &rv); + if (NULL == fieldptr) + { + printError(rv, "Could not allocate for USER catalog table"); + return rv; + } + CINDEXFIELD *fldInfo = (CINDEXFIELD*)fieldptr; + fldInfo->tablePtr = tblPtr; + fldInfo->fieldPtr = (CFIELD*)fptr[i++]; + fldInfo->indexPtr = indexPtr; + fldInfo->next=(CINDEXFIELD*)((CINDEX*)indexPtr)->fstIndFld_; + ((CINDEX *)indexPtr)->fstIndFld_=fldInfo; + printDebug(DM_SystemDatabase,"One Row inserted into INDEXFIELD %x", fldInfo); + } + return OK; +} + +DbRetVal CatalogTableINDEXFIELD::remove(void *iptr) +{ + Chunk *fChunk; + fChunk = systemDatabase_->getSystemDatabaseChunk(IndexFieldTableId); + ChunkIterator fIter = fChunk->getIterator(); + void *data = NULL; + while ((data = fIter.nextElement())!= NULL) + { + if (((CINDEXFIELD*)data)->indexPtr == iptr) + { + //remove this element + if(((CFIELD *)((CINDEXFIELD*)data)->fieldPtr)->isUnique_) ((CFIELD *)((CINDEXFIELD*)data)->fieldPtr)->isUnique_ = false; + fChunk->free(systemDatabase_, data); + printDebug(DM_SystemDatabase,"One Row deleted from INDEXFIELD %x", data); + } + } + return OK; +} + +DbRetVal CatalogTableINDEXFIELD::getFieldNameAndType(void *index, + char *&name, DataType &type) +{ + Chunk *ifChunk; + ifChunk = systemDatabase_->getSystemDatabaseChunk(IndexFieldTableId); + ChunkIterator ifIter = ifChunk->getIterator(); + void *data = NULL; + while ((data = ifIter.nextElement())!= NULL) + { + if (((CINDEXFIELD*)data)->indexPtr == index) + { + //store the field name + name = ((CFIELD*)(((CINDEXFIELD*)data)->fieldPtr))->fldName_; + type = ((CFIELD*)(((CINDEXFIELD*)data)->fieldPtr))->type_; + return OK; + } + } + printError(ErrNotExists,"Index %x not exists in catalog table", index); + return ErrNotExists; +} + +DbRetVal CatalogTableINDEXFIELD::getFieldInfo(void *index, FieldList &list) +{ + Chunk *ifChunk; + ifChunk = systemDatabase_->getSystemDatabaseChunk(IndexFieldTableId); + ChunkIterator ifIter = ifChunk->getIterator(); + void *data = NULL; + int rowCount =0; + while ((data = ifIter.nextElement())!= NULL) + { + if (((CINDEXFIELD*)data)->indexPtr == index) + { + //add the information to the field list + CFIELD *fTuple = (CFIELD*)(((CINDEXFIELD*)data)->fieldPtr); + FieldDef fldDef; + strcpy(fldDef.fldName_, fTuple->fldName_); + fldDef.fldName_[IDENTIFIER_LENGTH] = '\0'; + fldDef.type_ = fTuple->type_; + fldDef.length_ = fTuple->length_; + fldDef.offset_ = fTuple->offset_; + fldDef.isDefault_ = fTuple->isDefault_; + os::memcpy(fldDef.defaultValueBuf_, fTuple->defaultValueBuf_, + DEFAULT_VALUE_BUF_LENGTH); + fldDef.isNull_ = fTuple->isNull_; + fldDef.isUnique_ = fTuple->isUnique_; + fldDef.isPrimary_ = fTuple->isPrimary_; + list.append(fldDef); + } + rowCount++; + } + if (!rowCount) { + printError(ErrNotExists,"Index %x not exists in catalog table", index); + return ErrNotExists; + } + return OK; +} + +void CatalogTableINDEXFIELD::printAllIndex() +{ + Chunk *chunk=systemDatabase_->getSystemDatabaseChunk(IndexFieldTableId); + ChunkIterator ifIter = chunk->getIterator(); + void *data = NULL; + char indexName[IDENTIFIER_LENGTH] = {'\0'}; + while ((data = ifIter.nextElement())!= NULL) + { + if(strcmp(indexName,((CINDEX*)(((CINDEXFIELD*)data)->indexPtr))->indName_)!=0) + { + printf(" %s \n",((CINDEX*)(((CINDEXFIELD*)data)->indexPtr))->indName_); + if(0==((CINDEX*)(((CINDEXFIELD*)data)->indexPtr))->indexType_) + printf(" Hash Index \n"); + else + printf(" Tree Index \n"); + printf(" %s
\n",((CTABLE*)(((CINDEXFIELD*)data)->tablePtr))->tblName_); + printf(" %s \n",((CFIELD*)(((CINDEXFIELD*)data)->fieldPtr))->fldName_); + } + else + { + printf(" %s \n",((CFIELD*)(((CINDEXFIELD*)data)->fieldPtr))->fldName_); + } + strcpy(indexName,((CINDEX*)(((CINDEXFIELD*)data)->indexPtr))->indName_); + } +} diff --git a/src/storage/Makefile.am b/src/storage/Makefile.am index cf6a6f8f..1f750359 100644 --- a/src/storage/Makefile.am +++ b/src/storage/Makefile.am @@ -3,7 +3,8 @@ METASOURCES = AUTO lib_LTLIBRARIES = libcsql.la libcsql_la_LDFLAGS = -avoid-version -module libcsql_la_SOURCES = Util.cxx FixedHeapAllocator.cxx VarHeapAllocator.cxx Config.cxx HashMap.cxx \ - BucketIter.cxx TreeIter.cxx BucketList.cxx CatalogTables.cxx Chunk.cxx TableConfig.cxx\ + BucketIter.cxx TreeIter.cxx BucketList.cxx Chunk.cxx TableConfig.cxx\ + CatalogTables.cxx CatalogTablesIdx.cxx CatalogTablesFk.cxx\ ChunkIterator.cxx Condition.cxx Connection.cxx Database.cxx DatabaseManagerImpl.cxx DataType.cxx \ Debug.cxx FieldList.cxx Index.cxx LockManager.cxx LockTable.cxx Logger.cxx Mutex.cxx os.cxx \ PageInfo.cxx PredicateImpl.cxx SessionImpl.cxx TableDef.cxx TableImpl.cxx Transaction.cxx \ -- 2.11.4.GIT