1 /***************************************************************************
2 * Copyright (C) 2007 by www.databasecache.com *
3 * Contact: praba_tuty@databasecache.com *
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. *
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. *
15 ***************************************************************************/
16 #include<CatalogTables.h>
22 DbRetVal
CatalogTableFK::insert(char *name
, void *tptr
, void *tPkptr
)
24 Chunk
*tChunk
= systemDatabase_
->getSystemDatabaseChunk(ForeignKeyTableId
);
25 ChunkIterator iter
= tChunk
->getIterator();
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_
);
38 void *fkptr
= tChunk
->allocate(systemDatabase_
, &rv
);
41 printError(rv
, "Could not allocate for FK catalog table");
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
);
52 DbRetVal
CatalogTableFKFIELD::insert(char *cFKName
, char **fkFldPtrs
, char **pkFldPtrs
,int totalFld
)
55 tChunk
= systemDatabase_
->getSystemDatabaseChunk(ForeignKeyTableId
);
56 ChunkIterator iter
= tChunk
->getIterator();
58 while ((data
= iter
.nextElement())!= NULL
)
60 if (0 == strcmp(((CFK
*)data
)->fkName_
, cFKName
))
65 tChunk
= systemDatabase_
->getSystemDatabaseChunk(ForeignKeyFieldTableId
);
70 void *fieldptr
= tChunk
->allocate(systemDatabase_
, &rv
);
73 printError(rv
, "Could not allocate for USER catalog table");
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
);
99 DbRetVal
CatalogTableFK::remove(void *ctptr
)
101 Chunk
*tChunk
= systemDatabase_
->getSystemDatabaseChunk(ForeignKeyTableId
);
102 ChunkIterator iter
= tChunk
->getIterator();
104 while ((data
= iter
.nextElement())!= NULL
)
108 tChunk
->free(systemDatabase_
,data
);
109 printDebug(DM_SystemDatabase
,"One Row deleted from FKFIELD %x", data
);
115 DbRetVal
CatalogTableFKFIELD::remove(void *cFKfld
)
117 Chunk
*fChunk
= NULL
;
118 fChunk
= systemDatabase_
->getSystemDatabaseChunk(ForeignKeyFieldTableId
);
119 ChunkIterator iter
= fChunk
->getIterator();
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
);
132 void *CatalogTableFK::getFkCTable(void *ctptr
)
134 Chunk
*tChunk
= systemDatabase_
->getSystemDatabaseChunk(ForeignKeyTableId
);
135 ChunkIterator iter
= tChunk
->getIterator();
137 while ((data
= iter
.nextElement())!= NULL
)
139 if (((CFK
*)data
)->fkTblPtr_
== ctptr
)
148 int CatalogTableFK::getNumFkTable(void *ctptr
)
150 Chunk
*tChunk
= systemDatabase_
->getSystemDatabaseChunk(ForeignKeyTableId
);
151 ChunkIterator iter
= tChunk
->getIterator();
154 while ((data
= iter
.nextElement())!= NULL
)
156 if (((CFK
*)data
)->pkTblPtr_
== ctptr
)
164 bool CatalogTableFK::isFkTable(void *ctptr
)
166 Chunk
*tChunk
= systemDatabase_
->getSystemDatabaseChunk(ForeignKeyTableId
);
167 ChunkIterator iter
= tChunk
->getIterator();
170 while ((data
= iter
.nextElement())!= NULL
)
172 if (((CFK
*)data
)->fkTblPtr_
== ctptr
)
180 int CatalogTableFK::getNoOfFkTable(void *ctptr
)
182 Chunk
*tChunk
= systemDatabase_
->getSystemDatabaseChunk(ForeignKeyTableId
);
183 ChunkIterator iter
= tChunk
->getIterator();
186 while ((data
= iter
.nextElement())!= NULL
)
188 if (((CFK
*)data
)->pkTblPtr_
== ctptr
)
196 int CatalogTableFK::getNoOfPkTable(void *ctptr
)
198 Chunk
*tChunk
= systemDatabase_
->getSystemDatabaseChunk(ForeignKeyTableId
);
199 ChunkIterator iter
= tChunk
->getIterator();
202 while ((data
= iter
.nextElement())!= NULL
)
204 if (((CFK
*)data
)->fkTblPtr_
== ctptr
)
212 void CatalogTableFK::getPkTableName(void *ctptr
,char **&array
)
214 Chunk
*tChunk
= systemDatabase_
->getSystemDatabaseChunk(ForeignKeyTableId
);
215 ChunkIterator iter
= tChunk
->getIterator();
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();
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();
248 while ((data
= iter
.nextElement())!= NULL
)
250 if (((CFK
*)data
)->pkTblPtr_
== cpkptr
&& ((CFK
*)data
)->fkTblPtr_
== cfkptr
)
257 printError(ErrNotExists
,"Foreign Key field CFK not found");
260 Chunk
*fChunk
= systemDatabase_
->getSystemDatabaseChunk(ForeignKeyFieldTableId
);
261 iter
= fChunk
->getIterator();
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_
);