code reorg and doxygen documentation
[csql.git] / src / storage / CatalogTablesFk.cxx
blob7bc6d41f30c3866135611fecc2050a71e4ed0931
1 /***************************************************************************
2 * Copyright (C) 2007 by www.databasecache.com *
3 * Contact: praba_tuty@databasecache.com *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 ***************************************************************************/
16 #include<CatalogTables.h>
17 #include<Database.h>
18 #include<Allocator.h>
19 #include<Field.h>
20 #include<Debug.h>
22 DbRetVal CatalogTableFK::insert(char *name, void *tptr, void *tPkptr)
24 Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId);
25 ChunkIterator iter = tChunk->getIterator();
26 void *data = NULL;
27 while ((data = iter.nextElement())!= NULL)
29 if (0 == strcmp(((CFK*)data)->fkName_, name))
31 printError(ErrAlready, "Index with name \'%s\' already exists "
32 "on the table \'%s\'.", name, ((CTABLE *)tptr)->tblName_);
33 return ErrAlready;
37 DbRetVal rv =OK;
38 void *fkptr = tChunk->allocate(systemDatabase_, &rv);
39 if (NULL == fkptr)
41 printError(rv, "Could not allocate for FK catalog table");
42 return rv;
44 CFK *fkTblInfo = (CFK*)fkptr;
45 strcpy(fkTblInfo->fkName_, name);
46 fkTblInfo->fkTblPtr_= tptr;
47 fkTblInfo->pkTblPtr_= tPkptr;
48 printDebug(DM_SystemDatabase,"One Row inserted into FK %x %s",fkptr, name);
49 return OK;
52 DbRetVal CatalogTableFKFIELD::insert(char *cFKName, char **fkFldPtrs, char **pkFldPtrs,int totalFld)
54 Chunk *tChunk = NULL;
55 tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId);
56 ChunkIterator iter = tChunk->getIterator();
57 void *data = NULL;
58 while ((data = iter.nextElement())!= NULL)
60 if (0 == strcmp(((CFK*)data)->fkName_, cFKName))
62 break;
65 tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyFieldTableId);
66 int i =0;
67 DbRetVal rv = OK;
68 while (i < totalFld)
70 void *fieldptr = tChunk->allocate(systemDatabase_, &rv);
71 if (NULL == fieldptr)
73 printError(rv, "Could not allocate for USER catalog table");
74 return rv;
76 CFKFIELD *fldInfo = (CFKFIELD*)fieldptr;
77 fldInfo->fkPtr_ = data;
78 fldInfo->pfFldPtr_ = (CFIELD*)pkFldPtrs[i];
79 fldInfo->fkFldPtr_ = (CFIELD*)fkFldPtrs[i++];
80 //printDebug(DM_TEST,"TYPE %d\n",((CFIELD*)fldInfo->pfFldPtr_)->type_);
81 //printDebug(DM_TEST,"FK name %s\n",((CFIELD*)fldInfo->fkFldPtr_)->fldName_);
82 if(!(((CFIELD*)fldInfo->pfFldPtr_)->isUnique_) || !(((CFIELD*)fldInfo->pfFldPtr_)->isNull_))
84 printError(ErrSysInternal,"Parent Table field should have primary key field ");
85 tChunk->free(systemDatabase_,fieldptr);
86 return ErrSysInternal;
88 if(((CFIELD*)fldInfo->pfFldPtr_)->type_!=((CFIELD*)fldInfo->fkFldPtr_)->type_)
90 printError(ErrSysInternal,"Type Missmatch in both PK field and FK field ");
91 tChunk->free(systemDatabase_,fieldptr);
92 return ErrSysInternal;
94 printDebug(DM_SystemDatabase,"One Row inserted into FKFIELD %x", fldInfo);
96 return OK;
99 DbRetVal CatalogTableFK::remove(void *ctptr)
101 Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId);
102 ChunkIterator iter = tChunk->getIterator();
103 void *data = NULL;
104 while ((data = iter.nextElement())!= NULL)
106 if (data == ctptr)
108 tChunk->free(systemDatabase_,data);
109 printDebug(DM_SystemDatabase,"One Row deleted from FKFIELD %x", data);
112 return OK;
115 DbRetVal CatalogTableFKFIELD::remove(void *cFKfld)
117 Chunk *fChunk = NULL;
118 fChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyFieldTableId);
119 ChunkIterator iter = fChunk->getIterator();
120 void *data = NULL;
121 while ((data = iter.nextElement())!= NULL)
123 if (((CFKFIELD*)data)->fkPtr_== cFKfld )
125 fChunk->free(systemDatabase_, data);
126 printDebug(DM_SystemDatabase,"One Row deleted from CFKFIELD %x", data);
129 return OK;
132 void *CatalogTableFK::getFkCTable(void *ctptr)
134 Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId);
135 ChunkIterator iter = tChunk->getIterator();
136 void *data = NULL;
137 while ((data = iter.nextElement())!= NULL)
139 if (((CFK*)data)->fkTblPtr_== ctptr)
141 return data;
145 return NULL;
148 int CatalogTableFK::getNumFkTable(void *ctptr)
150 Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId);
151 ChunkIterator iter = tChunk->getIterator();
152 void *data = NULL;
153 int count=0;
154 while ((data = iter.nextElement())!= NULL)
156 if (((CFK*)data)->pkTblPtr_== ctptr)
158 count++;
161 return count;
164 bool CatalogTableFK::isFkTable(void *ctptr)
166 Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId);
167 ChunkIterator iter = tChunk->getIterator();
168 void *data = NULL;
169 int count=0;
170 while ((data = iter.nextElement())!= NULL)
172 if (((CFK*)data)->fkTblPtr_== ctptr)
174 return true;
177 return false;
180 int CatalogTableFK::getNoOfFkTable(void *ctptr)
182 Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId);
183 ChunkIterator iter = tChunk->getIterator();
184 void *data = NULL;
185 int count=0;
186 while ((data = iter.nextElement())!= NULL)
188 if (((CFK*)data)->pkTblPtr_== ctptr)
190 count++;
193 return count;
196 int CatalogTableFK::getNoOfPkTable(void *ctptr)
198 Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId);
199 ChunkIterator iter = tChunk->getIterator();
200 void *data = NULL;
201 int count=0;
202 while ((data = iter.nextElement())!= NULL)
204 if (((CFK*)data)->fkTblPtr_== ctptr)
206 count++;
209 return count;
212 void CatalogTableFK::getPkTableName(void *ctptr,char **&array)
214 Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId);
215 ChunkIterator iter = tChunk->getIterator();
216 void *data = NULL;
217 int i=0;
218 while ((data = iter.nextElement())!= NULL)
220 if (((CFK*)data)->fkTblPtr_== ctptr)
222 array[i++] = ((CTABLE*)((CFK*)data)->pkTblPtr_)->tblName_;
227 void CatalogTableFK::getFkTableName(void *ctptr,char **&array)
229 Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId);
230 ChunkIterator iter = tChunk->getIterator();
231 void *data = NULL;
232 int i=0;
233 while ((data = iter.nextElement())!= NULL)
235 if (((CFK*)data)->pkTblPtr_== ctptr)
237 array[i++] = ((CTABLE*)((CFK*)data)->fkTblPtr_)->tblName_;
243 DbRetVal CatalogTableFK::getPkFkFieldInfo(void *cpkptr, void *cfkptr, FieldNameList &pklist,FieldNameList &fklist)
245 Chunk *tChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyTableId);
246 ChunkIterator iter = tChunk->getIterator();
247 void *data = NULL;
248 while ((data = iter.nextElement())!= NULL)
250 if (((CFK*)data)->pkTblPtr_== cpkptr && ((CFK*)data)->fkTblPtr_ == cfkptr)
252 break;
255 if(data == NULL)
257 printError(ErrNotExists,"Foreign Key field CFK not found");
258 return ErrNotExists;
260 Chunk *fChunk = systemDatabase_->getSystemDatabaseChunk(ForeignKeyFieldTableId);
261 iter = fChunk->getIterator();
262 void *fdata=NULL;
263 while ((fdata = iter.nextElement())!= NULL)
265 if (((CFKFIELD*)fdata)->fkPtr_==data)
267 //printDebug(DM_TEST,"PK Field name %s\n",((CFIELD*)((CFKFIELD*)fdata)->pfFldPtr_)->fldName_);
268 //printDebug(DM_TEST,"FK Field name %s\n",((CFIELD*)((CFKFIELD*)fdata)->fkFldPtr_)->fldName_);
269 pklist.append(((CFIELD*)((CFKFIELD*)fdata)->pfFldPtr_)->fldName_);
270 fklist.append(((CFIELD*)((CFKFIELD*)fdata)->fkFldPtr_)->fldName_);
273 return OK;