1 /***************************************************************************
2 * Copyright (C) 2007 by Prabakaran Thirumalai *
3 * praba_tuty@yahoo.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 ***************************************************************************/
17 #include <Statement.h>
18 #include <TableImpl.h>
19 #include <OrderTableImpl.h>
22 ListIterator
MetadataStatement::getExportKeyIterator()
25 TableImpl
*tbl
= (TableImpl
*)table
;
28 return datalist
.getIterator();
31 TableImpl
*fkTbl
=NULL
;
32 ListIterator tblIter
=tbl
->tblFkList
.getIterator();
37 void *vcchunkPk
= NULL
;
38 char *pkFldName
= NULL
;
39 char *fkFldName
= NULL
;
40 ForeignKeyMetadata
*fkMeta
= NULL
;
41 while (tblIter
.hasElement()){
42 fkTbl
= (TableImpl
*) tblIter
.nextElement();
43 FieldNameList pkFieldList
,fkFieldList
;
44 CatalogTableTABLE
cTable(tbl
->sysDB_
);
45 cTable
.getChunkAndTblPtr(tbl
->getName(), chunkPk
, tPkptr
, vcchunkPk
);
46 cTable
.getChunkAndTblPtr(fkTbl
->getName(), chunkPk
, tFkptr
, vcchunkPk
);
47 CatalogTableFK
cFk(tbl
->sysDB_
);
48 cFk
.getPkFkFieldInfo(tPkptr
,tFkptr
,pkFieldList
,fkFieldList
);
49 pkFieldList
.resetIter();
50 fkFieldList
.resetIter();
52 while((fkFldName
= fkFieldList
.nextFieldName())!= NULL
)
55 fkMeta
= new ForeignKeyMetadata();
56 pkFldName
= pkFieldList
.nextFieldName();
57 strcpy(fkMeta
->pkTableName
,tbl
->getName());
58 strcpy(fkMeta
->pkColName
,pkFldName
);
59 strcpy(fkMeta
->fkTableName
,fkTbl
->getName());
60 strcpy(fkMeta
->fkColName
,fkFldName
);
61 fkMeta
->keySeq
= count
;
62 fkMeta
->updateRule
= 3;
63 fkMeta
->deleteRule
= 3;
64 datalist
.append(fkMeta
);
69 return datalist
.getIterator();
72 ListIterator
MetadataStatement::getImportKeyIterator()
75 TableImpl
*tbl
= (TableImpl
*)table
;
78 return datalist
.getIterator();
81 TableImpl
*fkTbl
=NULL
;
82 ListIterator tblIter
= tbl
->tblList
.getIterator();
87 void *vcchunkPk
= NULL
;
88 char *pkFldName
= NULL
;
89 char *fkFldName
= NULL
;
90 ForeignKeyMetadata
*fkMeta
= NULL
;
91 while (tblIter
.hasElement()){
92 fkTbl
= (TableImpl
*) tblIter
.nextElement();
93 FieldNameList pkFieldList
,fkFieldList
;
94 CatalogTableTABLE
cTable(tbl
->sysDB_
);
95 cTable
.getChunkAndTblPtr(tbl
->getName(), chunkPk
, tPkptr
, vcchunkPk
);
96 cTable
.getChunkAndTblPtr(fkTbl
->getName(), chunkPk
, tFkptr
, vcchunkPk
);
97 CatalogTableFK
cFk(tbl
->sysDB_
);
98 cFk
.getPkFkFieldInfo(tFkptr
,tPkptr
,fkFieldList
,pkFieldList
);
99 pkFieldList
.resetIter();
100 fkFieldList
.resetIter();
102 while((pkFldName
= pkFieldList
.nextFieldName())!= NULL
)
105 fkMeta
= new ForeignKeyMetadata();
106 fkFldName
= fkFieldList
.nextFieldName();
107 strcpy(fkMeta
->pkTableName
,fkTbl
->getName());
108 strcpy(fkMeta
->pkColName
,fkFldName
);
109 strcpy(fkMeta
->fkTableName
,tbl
->getName());
110 strcpy(fkMeta
->fkColName
,pkFldName
);
111 fkMeta
->keySeq
= count
;
112 fkMeta
->updateRule
= 3;
113 fkMeta
->deleteRule
= 3;
114 datalist
.append(fkMeta
);
119 return datalist
.getIterator();
123 MetadataStatement::MetadataStatement()
132 bindFieldValues
= NULL
;
140 MetadataStatement::~MetadataStatement()
143 if (table
) { table
->close(); table
= NULL
; }
154 free(bindFieldValues
);
155 bindFieldValues
= NULL
;
159 DbRetVal
MetadataStatement::getParamFldInfo(int paramNo
, FieldInfo
*&info
)
161 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
162 ConditionValue
*cValue
= (ConditionValue
*) params
[paramNo
-1];
165 printError(ErrSysFatal
, "condition value is null. Should never happen");
168 table
->getFieldNameAlone(cValue
->fName
,info
->fldName
);
169 info
->type
= cValue
->type
;
170 info
->length
= cValue
->length
;
171 info
->isNull
= cValue
->isNullable
;
174 DbRetVal
MetadataStatement::execute(int &rowsAffected
)
181 dataListIter
= dbMgr
->getAllTableNames().getIterator();
187 List fNameList
= table
->getFieldNameList();
188 ListIterator fNameIter
= fNameList
.getIterator();
189 for (int i
= 0; i
< fNameList
.size() ; i
++)
191 FieldInfo
*fInfo
= new FieldInfo();
192 Identifier
*elem
= (Identifier
*)fNameIter
.nextElement();
193 char *fName
= elem
->name
;
194 rv
= table
->getFieldInfo(fName
, fInfo
);
195 if (ErrNotFound
== rv
|| ErrNotExists
== rv
)
199 printError(ErrSysFatal
, "Should never happen.");
203 colList
.append(fInfo
);
207 dataListIter
= colList
.getIterator();
213 CatalogTableINDEXFIELD
cIndexField(((DatabaseManagerImpl
*)dbMgr
)->sysDb());
214 dataListIter
= cIndexField
.getIndexListIterater(table
->getName());
220 CatalogTableINDEXFIELD
cIndexField(((DatabaseManagerImpl
*)dbMgr
)->sysDb());
221 dataListIter
= cIndexField
.getIndexListIterater(table
->getName());
226 dataListIter
= getImportKeyIterator();
231 dataListIter
= getExportKeyIterator();
236 dataListIter
= getDataTypeInfoIterator();
245 DbRetVal
MetadataStatement::openTables()
247 //TODO : need to remove unnecessery code
248 if (dbMgr
== NULL
) return ErrNoConnection
;
249 JoinTableImpl
*jHdl
= NULL
;
250 Table
*tHdl
= NULL
, *prevHdl
= NULL
;
251 bool joinInvolved
= false;
252 //check whether all the table exists
253 ListIterator titer
= parsedData
->getTableNameList().getIterator();
254 ListIterator jiter
= parsedData
->getJoinTypeList().getIterator();
255 while (titer
.hasElement())
257 TableName
*t
= (TableName
*)titer
.nextElement();
258 parsedData
->setTableName(t
->tblName
);
259 tHdl
= dbMgr
->openTable(t
->tblName
);
262 printError(ErrNotExists
,
263 "Unable to open the table:Table not exists");
264 if (prevHdl
) delete prevHdl
;
267 TableImpl
*tImpl
= (TableImpl
*) tHdl
;
271 jHdl
= new JoinTableImpl();
272 jHdl
->setTable(prevHdl
, tHdl
);
273 JoinTypeNode
*node
= (JoinTypeNode
*) jiter
.nextElement();
275 printError(ErrSyntaxError
,
276 "Join Type and number of tables do not match");
278 return ErrSyntaxError
;
280 jHdl
->setJoinType(node
->jType
);
287 if (joinInvolved
) table
= jHdl
; else table
= tHdl
;
290 DbRetVal
MetadataStatement::resolve()
293 plan
= parsedData
->getResultSetPlan();
298 bindFields
= (FieldValue
**) malloc (5 * sizeof(FieldValue
*));
299 bindFieldValues
= (char**) malloc (5 * sizeof(char*));
300 for(int i
=0;i
<5;i
++){
301 FieldValue
*newVal
= new FieldValue();
302 if(i
==0) strcpy(newVal
->fldName
,"TABLE_CAT");
303 if(i
==1) strcpy(newVal
->fldName
,"TABLE_SCHEM");
304 if(i
==2) strcpy(newVal
->fldName
,"TABLE_NAME");
305 if(i
==3) strcpy(newVal
->fldName
,"TABLE_TYPE");
306 newVal
->parsedString
= NULL
;
308 newVal
->type
= typeString
;
310 newVal
->value
= AllDataType::alloc(newVal
->type
, 64);
311 if(i
==0) strcpy((char*)newVal
->value
,(char*)"CSQL");
312 if(i
==1) strcpy((char*)newVal
->value
,(char*)"CSQL");
313 if(i
==3) strcpy((char*)newVal
->value
,(char*)"TABLE");
314 if(i
==4) strcpy((char*)newVal
->value
,(char*)"TABLE Catalog");
315 newVal
->isAllocVal
=true;
317 bindFields
[i
] = newVal
;
324 if (rv
!= OK
) break; //return rv;
325 bindFields
= (FieldValue
**) malloc (23 * sizeof(FieldValue
*));
326 bindFieldValues
= (char**) malloc (23 * sizeof(char*));
327 for(int i
=0;i
<23;i
++){
328 FieldValue
*newVal
= new FieldValue();
331 strcpy(newVal
->fldName
,"TABLE_CAT");
332 newVal
->type
= typeString
;
335 newVal
->type
= typeString
;
336 strcpy(newVal
->fldName
,"TABLE_SCHEM");
339 newVal
->type
= typeString
;
340 strcpy(newVal
->fldName
,"TABLE_NAME");
343 newVal
->type
= typeString
;
344 strcpy(newVal
->fldName
,"COLUMN_NAME");
347 newVal
->type
= typeInt
;
348 strcpy(newVal
->fldName
,"DATA_TYPE");
351 newVal
->type
= typeString
;
352 strcpy(newVal
->fldName
,"TYPE_NAME");
355 newVal
->type
= typeInt
;
356 strcpy(newVal
->fldName
,"COLUMN_SIZE");
359 newVal
->type
= typeInt
;
360 strcpy(newVal
->fldName
,"BUFFER_LENGTH");
363 newVal
->type
= typeShort
;
364 strcpy(newVal
->fldName
,"DECIMAL_DIGITS");
367 newVal
->type
= typeShort
;
368 strcpy(newVal
->fldName
,"NUM_PREC_RADIX");
371 newVal
->type
= typeShort
;
372 strcpy(newVal
->fldName
,"NULLABLE");
375 newVal
->type
= typeString
;
376 strcpy(newVal
->fldName
,"REMARKS");
379 newVal
->type
= typeString
;
380 strcpy(newVal
->fldName
,"COLUMN_DEF");
383 newVal
->type
= typeShort
;
384 strcpy(newVal
->fldName
,"SQL_DATA_TYPE");
387 newVal
->type
= typeInt
;
388 strcpy(newVal
->fldName
,"SQL_DATETIME_SUB");
391 newVal
->type
= typeInt
;
392 strcpy(newVal
->fldName
,"CHAR_OCTET_LENGTH");
395 newVal
->type
= typeInt
;
396 strcpy(newVal
->fldName
,"ORDINAL_POSITION");
399 newVal
->type
= typeString
;
400 strcpy(newVal
->fldName
,"IS_NULLABLE");
403 newVal
->type
= typeString
;
404 strcpy(newVal
->fldName
,"SCOPE_CATLOG");
407 newVal
->type
= typeString
;
408 strcpy(newVal
->fldName
,"SCOPE_SCHEMA");
411 newVal
->type
= typeString
;
412 strcpy(newVal
->fldName
,"SCOPE_TABLE");
415 newVal
->type
= typeShort
;
416 strcpy(newVal
->fldName
,"SOURCE_DATA_TYPE");
419 newVal
->type
= typeString
;
420 strcpy(newVal
->fldName
,"IS_AUTOINCREMENT");
423 newVal
->type
= typeString
;
426 newVal
->parsedString
= NULL
;
428 newVal
->length
= AllDataType::size(newVal
->type
, 64);
429 if(i
==12) newVal
->length
= DEFAULT_VALUE_BUF_LENGTH
;
430 newVal
->value
= AllDataType::alloc(newVal
->type
,newVal
->length
);
431 if(newVal
->type
== typeInt
) (*(int*)newVal
->value
) = 0;
432 if(newVal
->type
== typeShort
) (*(short*)newVal
->value
) = 0;
433 if(newVal
->type
== typeString
) strcpy((char*)newVal
->value
,(char*)"");
434 if(i
==0) strcpy((char*)newVal
->value
,(char*)"CSQL");
435 if(i
==1) strcpy((char*)newVal
->value
,(char*)"CSQL");
436 if(i
==2) strcpy((char*)newVal
->value
,(char*)table
->getName());
437 if(i
==11) strcpy((char*)newVal
->value
,(char*)"Columns Catalog");
438 // if(i==16) (*(int *)newVal->value) = 0;
439 newVal
->isAllocVal
=true;
441 bindFields
[i
] = newVal
;
448 if (rv
!= OK
) break; //return rv;
449 bindFields
= (FieldValue
**) malloc (13 * sizeof(FieldValue
*));
450 bindFieldValues
= (char**) malloc (13 * sizeof(char*));
451 for(int i
=0;i
<13;i
++){
452 FieldValue
*newVal
= new FieldValue();
456 strcpy(newVal
->fldName
,"TABLE_CAT");
457 newVal
->type
= typeString
;
460 newVal
->type
= typeString
;
461 strcpy(newVal
->fldName
,"TABLE_SCHEM");
464 newVal
->type
= typeString
;
465 strcpy(newVal
->fldName
,"TABLE_NAME");
468 newVal
->type
= typeInt
;
469 strcpy(newVal
->fldName
,"NON_UNIQUE");
472 newVal
->type
= typeString
;
473 strcpy(newVal
->fldName
,"INDEX_QUALIFIER");
476 newVal
->type
= typeString
;
477 strcpy(newVal
->fldName
,"INDEX_NAME");
480 newVal
->type
= typeShort
;
481 strcpy(newVal
->fldName
,"TYPE");
484 newVal
->type
= typeShort
;
485 strcpy(newVal
->fldName
,"ORDINAL_POSITION");
488 newVal
->type
= typeString
;
489 strcpy(newVal
->fldName
,"COLUMN_NAME");
492 newVal
->type
= typeString
;
493 strcpy(newVal
->fldName
,"ASC_OR_DESC");
496 newVal
->type
= typeInt
;
497 strcpy(newVal
->fldName
,"CARDINALITY");
500 newVal
->type
= typeInt
;
501 strcpy(newVal
->fldName
,"PAGES");
504 newVal
->type
= typeString
;
505 strcpy(newVal
->fldName
,"FILTER_CONDITION");
508 newVal
->type
= typeString
;
511 newVal
->parsedString
= NULL
;
513 newVal
->length
= AllDataType::size(newVal
->type
, 64);
514 newVal
->value
= AllDataType::alloc(newVal
->type
,newVal
->length
);
515 if(newVal
->type
== typeString
) strcpy((char*)newVal
->value
,(char*)"");
516 if(i
==0) strcpy((char*)newVal
->value
,(char*)"CSQL");
517 if(i
==1) strcpy((char*)newVal
->value
,(char*)"CSQL");
518 newVal
->isAllocVal
=true;
520 bindFields
[i
] = newVal
;
527 if (rv
!= OK
) break; //return rv;
528 bindFields
= (FieldValue
**) malloc (6 * sizeof(FieldValue
*));
529 bindFieldValues
= (char**) malloc (6 * sizeof(char*));
530 for(int i
=0;i
<6;i
++){
531 FieldValue
*newVal
= new FieldValue();
535 strcpy(newVal
->fldName
,"TABLE_CAT");
536 newVal
->type
= typeString
;
539 newVal
->type
= typeString
;
540 strcpy(newVal
->fldName
,"TABLE_SCHEM");
543 newVal
->type
= typeString
;
544 strcpy(newVal
->fldName
,"TABLE_NAME");
547 newVal
->type
= typeString
;
548 strcpy(newVal
->fldName
,"COLUMN_NAME");
551 newVal
->type
= typeShort
;
552 strcpy(newVal
->fldName
,"KEY_SEQ");
555 newVal
->type
= typeString
;
556 strcpy(newVal
->fldName
,"PK_NAME");
561 newVal
->parsedString
= NULL
;
563 newVal
->length
= AllDataType::size(newVal
->type
, 64);
564 newVal
->value
= AllDataType::alloc(newVal
->type
, newVal
->length
);
565 if(i
==0) strcpy((char*)newVal
->value
,(char*)"CSQL");
566 if(i
==1) strcpy((char*)newVal
->value
,(char*)"CSQL");
567 newVal
->isAllocVal
=true;
569 bindFields
[i
] = newVal
;
575 bindFields
= (FieldValue
**) malloc (1 * sizeof(FieldValue
*));
576 bindFieldValues
= (char**) malloc (1 * sizeof(char*));
577 FieldValue
*newVal
= new FieldValue();
578 strcpy(newVal
->fldName
,"TABLE_CAT");
579 newVal
->type
= typeString
;
580 newVal
->parsedString
= NULL
;
582 newVal
->length
= AllDataType::size(newVal
->type
, 64);
583 newVal
->value
= AllDataType::alloc(newVal
->type
, newVal
->length
);
584 newVal
->isAllocVal
=true;
586 bindFields
[0] = newVal
;
591 bindFields
= (FieldValue
**) malloc (1 * sizeof(FieldValue
*));
592 bindFieldValues
= (char**) malloc (1 * sizeof(char*));
593 FieldValue
*newVal
= new FieldValue();
594 strcpy(newVal
->fldName
,"TABLE_TYPE");
595 newVal
->type
= typeString
;
596 newVal
->parsedString
= NULL
;
598 newVal
->length
= AllDataType::size(newVal
->type
, 64);
599 newVal
->value
= AllDataType::alloc(newVal
->type
, newVal
->length
);
600 newVal
->isAllocVal
=true;
602 bindFields
[0] = newVal
;
607 bindFields
= (FieldValue
**) malloc (19 * sizeof(FieldValue
*));
608 bindFieldValues
= (char**) malloc (19 * sizeof(char*));
609 for(int i
=0;i
<19;i
++)
611 FieldValue
*newVal
= new FieldValue();
615 strcpy(newVal
->fldName
,"TYPE_NAME");
616 newVal
->type
= typeString
;
619 newVal
->type
= typeInt
;
620 strcpy(newVal
->fldName
,"DATA_TYPE");
623 strcpy(newVal
->fldName
,"PRECISION");
624 newVal
->type
= typeInt
;
627 strcpy(newVal
->fldName
,"LITERAL_PREFIX");
628 newVal
->type
= typeString
;
631 strcpy(newVal
->fldName
,"LITERAL_SUFFIX");
632 newVal
->type
= typeString
;
635 strcpy(newVal
->fldName
,"CREATE_PARAMS");
636 newVal
->type
= typeString
;
639 strcpy(newVal
->fldName
,"NULLABLE");
640 newVal
->type
= typeShort
;
643 strcpy(newVal
->fldName
,"CASE_SENSITIVE");
644 newVal
->type
= typeInt
;
647 strcpy(newVal
->fldName
,"SEARCHABLE");
648 newVal
->type
= typeShort
;
651 strcpy(newVal
->fldName
,"UNSIGNED_ATTRIBUTE");
652 newVal
->type
= typeInt
;
655 strcpy(newVal
->fldName
,"FIXED_PREC_SCALE");
656 newVal
->type
= typeInt
;
659 strcpy(newVal
->fldName
,"AUTO_INCREMENT");
660 newVal
->type
= typeInt
;
663 strcpy(newVal
->fldName
,"LOCAL_TYPE_NAME");
664 newVal
->type
= typeString
;
667 strcpy(newVal
->fldName
,"MINIMUM_SCALE");
668 newVal
->type
= typeShort
;
671 strcpy(newVal
->fldName
,"MAXIMUM_SCALE");
672 newVal
->type
= typeShort
;
675 strcpy(newVal
->fldName
,"SQL_DATA_TYPE");
676 newVal
->type
= typeInt
;
679 strcpy(newVal
->fldName
,"SQL_DATETIME_SUB");
680 newVal
->type
= typeInt
;
683 strcpy(newVal
->fldName
,"NUM_PREC_RADIX");
684 newVal
->type
= typeInt
;
687 strcpy(newVal
->fldName
,"INTERVAL_PRECISION");
688 newVal
->type
= typeShort
;
693 newVal
->parsedString
= NULL
;
695 newVal
->length
= AllDataType::size(newVal
->type
, 64);
696 newVal
->value
= AllDataType::alloc(newVal
->type
,newVal
->length
);
697 newVal
->isAllocVal
= true;
699 bindFields
[i
] = newVal
;
707 if (rv
!= OK
) break; //return rv;
708 bindFields
= (FieldValue
**) malloc (14 * sizeof(FieldValue
*));
709 bindFieldValues
= (char**) malloc (14 * sizeof(char*));
710 for(int i
=0;i
<14;i
++){
711 FieldValue
*newVal
= new FieldValue();
714 strcpy(newVal
->fldName
,"PKTABLE_CAT");
715 newVal
->type
= typeString
;
718 newVal
->type
= typeString
;
719 strcpy(newVal
->fldName
,"PKTABLE_SCHEM");
722 newVal
->type
= typeString
;
723 strcpy(newVal
->fldName
,"PKTABLE_NAME");
726 newVal
->type
= typeString
;
727 strcpy(newVal
->fldName
,"PKCOLUMN_NAME");
730 newVal
->type
= typeString
;
731 strcpy(newVal
->fldName
,"FKTABLE_CAT");
734 newVal
->type
= typeString
;
735 strcpy(newVal
->fldName
,"FKTABLE_SCHEM");
738 newVal
->type
= typeString
;
739 strcpy(newVal
->fldName
,"FKTABLE_NAME");
742 newVal
->type
= typeString
;
743 strcpy(newVal
->fldName
,"FKCOLUMN_NAME");
746 newVal
->type
= typeShort
;
747 strcpy(newVal
->fldName
,"KEY_SEQ");
750 newVal
->type
= typeShort
;
751 strcpy(newVal
->fldName
,"UPDATE_RULE");
754 newVal
->type
= typeShort
;
755 strcpy(newVal
->fldName
,"DELETE_RULE");
758 newVal
->type
= typeString
;
759 strcpy(newVal
->fldName
,"FK_NAME");
762 newVal
->type
= typeString
;
763 strcpy(newVal
->fldName
,"PK_NAME");
766 newVal
->type
= typeShort
;
767 strcpy(newVal
->fldName
,"DEFERRABILITY");
769 newVal
->type
= typeString
;
772 newVal
->parsedString
= NULL
;
774 newVal
->length
= AllDataType::size(newVal
->type
, 64);
775 newVal
->value
= AllDataType::alloc(newVal
->type
,newVal
->length
);
776 if(typeString
== newVal
->type
) strcpy((char*)newVal
->value
,(char*)"");
777 if(i
==0||i
==1||i
== 4 || i
==5) strcpy((char*)newVal
->value
,(char*)"csql");
778 newVal
->isAllocVal
=true;
780 bindFields
[i
] = newVal
;
790 void* MetadataStatement::fetch()
794 tuple
= fetchMetaData();
795 if (NULL
== tuple
) return NULL
;
797 for (int i
= 0; i
< totalFields
; i
++)
799 value
= bindFields
[i
];
800 if (bindFieldValues
[i
] == NULL
)
804 AllDataType::copyVal(bindFieldValues
[i
], value
->value
, value
->type
, value
->length
);
809 void* MetadataStatement::fetch(DbRetVal
&rv
)
812 tuple
= fetchMetaData();
813 if (NULL
== tuple
) return NULL
;
815 for (int i
= 0; i
< totalFields
; i
++)
817 value
= bindFields
[i
];
818 if (bindFieldValues
[i
] == NULL
)
822 AllDataType::copyVal(bindFieldValues
[i
], value
->value
, value
->type
, value
->length
);
827 void MetadataStatement::freeMetadata()
829 if(isPlanFreed
) return;
830 dataListIter
.reset();
831 ListNode
*head
= (ListNode
*)dataListIter
.getCurrentListNode();
832 if(head
&& (plan
!= GetTableType
&& plan
!= GetCatalogs
)){
833 List
*list
= new List(head
);
841 FieldValue
*newVal
= NULL
;
843 for(int i
=0;i
<5;i
++){
844 newVal
=bindFields
[i
];
845 if (newVal
->isAllocVal
) free(newVal
->value
);
855 for(int i
=0;i
<23;i
++){
856 newVal
=bindFields
[i
];
857 if ( newVal
->isAllocVal
) free(newVal
->value
);
867 for(int i
=0;i
<13;i
++){
868 newVal
=bindFields
[i
];
869 if ( newVal
->isAllocVal
) free(newVal
->value
);
879 for(int i
=0;i
<6;i
++){
880 newVal
=bindFields
[i
];
881 if ( newVal
->isAllocVal
) free(newVal
->value
);
891 for(int i
=0;i
<1;i
++){
892 newVal
=bindFields
[i
];
893 // if ( newVal->isAllocVal) free(newVal->value);
903 for(int i
=0;i
<1;i
++){
904 newVal
=bindFields
[i
];
905 // if ( newVal->isAllocVal) free(newVal->value);
915 for(int i
=0;i
<18;i
++){
916 newVal
=bindFields
[i
];
917 if ( newVal
->isAllocVal
) free(newVal
->value
);
927 for(int i
=0;i
<14;i
++){
928 newVal
=bindFields
[i
];
929 if ( newVal
->isAllocVal
) free(newVal
->value
);
939 for(int i
=0;i
<14;i
++){
940 newVal
=bindFields
[i
];
941 if ( newVal
->isAllocVal
) free(newVal
->value
);
952 DbRetVal
MetadataStatement::close()
954 if(plan
!=Normal
){ freeMetadata(); }
955 if (table
) return table
->closeScan();
960 char* MetadataStatement::getFieldName ( int pos
)
962 ListIterator iter
= parsedData
->getFieldNameList().getIterator();
964 while (iter
.hasElement())
966 if (position
== pos
) {
967 FieldName
*name
= (FieldName
*) iter
.nextElement();
970 printError(ErrSysFatal
, "Should never happen. Field Name list has NULL");
973 return name
->fldName
;
980 DataType
MetadataStatement::getFieldType( int pos
)
982 FieldValue
*v
= bindFields
[pos
];
983 return ( (DataType
) v
->type
);
986 int MetadataStatement::getFieldLength( int pos
)
988 FieldValue
*v
= bindFields
[pos
];
989 return ( (int) v
->type
);
992 void* MetadataStatement::fetchAndPrint(bool SQL
)
998 void* MetadataStatement::next()
1000 return fetchMetaData();
1003 void* MetadataStatement::getFieldValuePtr( int pos
)
1005 FieldValue
*v
= bindFields
[pos
];
1006 return ( (void*) v
->value
);
1009 void* MetadataStatement::getFieldValuePtr( char *name
)
1012 char fName
[IDENTIFIER_LENGTH
];
1013 for (int i
= 0; i
< totalFields
; i
++)
1015 value
= bindFields
[i
];
1016 table
->getFieldNameAlone(value
->fldName
,fName
);
1017 if (strcmp(fName
,name
)==0)
1019 return ( (void*) value
->value
);
1026 void MetadataStatement::getProjFieldType(int *data
)
1029 for (int i
= 0; i
< totalFields
; i
++)
1031 value
= bindFields
[i
];
1032 data
[i
+1] = value
->type
;
1036 DbRetVal
MetadataStatement::setBindField(int colNo
, void *value
)
1038 if (colNo
<=0) return ErrBadArg
;
1039 if (NULL
== value
) return ErrBadArg
;
1040 bindFieldValues
[colNo
-1] = (char*) value
;
1045 int MetadataStatement::noOfProjFields()
1050 DbRetVal
MetadataStatement::getProjFldInfo (int projpos
, FieldInfo
*&fInfo
)
1056 FieldValue
*v
= bindFields
[projpos
-1];
1057 strcpy(fInfo
->fldName
, v
->fldName
);
1058 fInfo
->type
= v
->type
;
1059 fInfo
->length
= v
->length
;
1062 ListIterator iter
= parsedData
->getFieldNameList().getIterator();
1063 FieldName
*name
= NULL
;
1065 while (iter
.hasElement())
1067 name
= (FieldName
*)iter
.nextElement();
1070 printError(ErrSysFatal
, "Should never happen. Field Name list has NULL");
1073 if (position
== (projpos
-1)) break;
1077 rv
= table
->getFieldInfo(name
->fldName
, fInfo
);
1080 //get back the qualified name(tablename.fldname)
1081 char qualName
[IDENTIFIER_LENGTH
];
1082 strcpy(qualName
, name
->fldName
);
1086 sprintf(fInfo
->fldName
, "COUNT(%s)", qualName
);
1087 fInfo
->type
= typeInt
;
1088 fInfo
->length
= sizeof(int);
1091 sprintf(fInfo
->fldName
, "MIN(%s)", qualName
);
1094 sprintf(fInfo
->fldName
, "MAX(%s)", qualName
);
1097 sprintf(fInfo
->fldName
, "SUM(%s)", qualName
);
1100 sprintf(fInfo
->fldName
, "AVG(%s)", qualName
);
1101 fInfo
->type
= typeDouble
;
1102 fInfo
->length
= sizeof(double);
1105 strcpy(fInfo
->fldName
, qualName
);
1111 int MetadataStatement::getFldPos(char *name
)
1113 return table
->getFldPos(name
);
1116 void *MetadataStatement::fetchMetaData()
1122 Identifier
*elem
= NULL
;
1123 if(dataListIter
.hasElement())
1125 FieldValue
*v
= bindFields
[2];
1126 elem
= (Identifier
*) dataListIter
.nextElement();
1127 AllDataType::copyVal(v
->value
, elem
->name
, v
->type
, v
->length
);
1134 FieldInfo
*info
= NULL
;
1135 if(dataListIter
.hasElement())
1137 info
= (FieldInfo
*) dataListIter
.nextElement();
1139 for(int i
=0;i
<23;i
++)
1146 AllDataType::copyVal(v
->value
, info
->fldName
, v
->type
, v
->length
);
1153 type
= AllDataType::convertToCSQLSQLType(info
->type
);
1154 AllDataType::copyVal(v
->value
,&type
,v
->type
, v
->length
);
1160 AllDataType::copyVal(v
->value
,AllDataType::getSQLString(info
->type
),v
->type
, v
->length
);
1167 AllDataType::copyVal(v
->value
,&info
->length
,v
->type
, v
->length
);
1174 (*(short*)v
->value
)=0;
1176 (*(short*)v
->value
)=1;
1182 AllDataType::copyVal(v
->value
,info
->defaultValueBuf
,v
->type
, v
->length
);
1188 (*(int*)v
->value
) = table
->getFldPos(info
->fldName
);
1195 AllDataType::copyVal(v
->value
,(void *)"NO",v
->type
, v
->length
);
1197 AllDataType::copyVal(v
->value
,(void *)"YES",v
->type
, v
->length
);
1202 if(info
->isAutoIncrement
)
1203 AllDataType::copyVal(v
->value
,(void *)"YES",v
->type
, v
->length
);
1205 AllDataType::copyVal(v
->value
,(void *)"NO",v
->type
, v
->length
);
1217 IndexInfoForDriver
*info
=NULL
;
1218 if(dataListIter
.hasElement())
1220 info
= (IndexInfoForDriver
*) dataListIter
.nextElement();
1222 for(int i
=0;i
<22;i
++)
1229 AllDataType::copyVal(v
->value
, info
->tableName
, v
->type
, v
->length
);
1235 if(info
->isUnique
) { ( *(int*) v
->value
) = 1; }
1236 else (*(int*) v
->value
) = 0;
1242 AllDataType::copyVal(v
->value
,info
->indexName
, v
->type
, v
->length
);
1248 if(info
->type
==0) (*(short *) v
->value
) = SQL_INDEX_HASHED
;
1249 else (*(short *) v
->value
) = SQL_INDEX_OTHER
;
1255 (*(short *) v
->value
) = table
->getFldPos(info
->fieldName
) ;
1261 AllDataType::copyVal(v
->value
, info
->fieldName
, v
->type
, v
->length
);
1274 IndexInfoForDriver
*info
=NULL
;
1275 char name
[IDENTIFIER_LENGTH
];
1276 while(dataListIter
.hasElement())
1278 info
= (IndexInfoForDriver
*) dataListIter
.nextElement();
1279 FieldValue
*v
= NULL
;
1280 //sprintf(name, "%s_idx1_Primary",info->tableName);
1281 //if(strcmp(name, info->indexName) != 0){ continue; }
1282 if( !info
->isPrimary
){ continue; }
1283 for(int i
=0;i
<6;i
++)
1290 AllDataType::copyVal(v
->value
, table
->getName(), v
->type
, v
->length
);
1296 AllDataType::copyVal(v
->value
, info
->fieldName
, v
->type
, v
->length
);
1302 (*(short *) v
->value
) = table
->getFldPos(info
->fieldName
) ;
1308 AllDataType::copyVal(v
->value
,info
->indexName
, v
->type
, v
->length
);
1309 // printf("Index name %s\n",info->indexName);
1323 FieldValue
*v
= NULL
;
1327 strcpy((char*)v
->value
,"csql");
1336 FieldValue
*v
= NULL
;
1340 strcpy((char*)v
->value
,"TABLE");
1350 ForeignKeyMetadata
*info
=NULL
;
1351 char name
[IDENTIFIER_LENGTH
];
1352 while(dataListIter
.hasElement())
1354 info
= (ForeignKeyMetadata
*) dataListIter
.nextElement();
1355 FieldValue
*v
= NULL
;
1356 for(int i
=0;i
<14;i
++)
1363 AllDataType::copyVal(v
->value
, info
->pkTableName
, v
->type
, v
->length
);
1369 AllDataType::copyVal(v
->value
, info
->pkColName
, v
->type
, v
->length
);
1375 AllDataType::copyVal(v
->value
, info
->fkTableName
, v
->type
, v
->length
);
1381 AllDataType::copyVal(v
->value
, info
->fkColName
, v
->type
, v
->length
);
1387 (*(short *) v
->value
) = info
->keySeq
;
1393 (*(short *) v
->value
) = info
->updateRule
;
1399 (*(short *) v
->value
) = info
->deleteRule
;
1413 DataTypeInfo
*info
=NULL
;
1414 char name
[IDENTIFIER_LENGTH
];
1415 while(dataListIter
.hasElement())
1417 info
= (DataTypeInfo
*) dataListIter
.nextElement();
1418 FieldValue
*v
= NULL
;
1419 for(int i
=0;i
<19;i
++)
1426 AllDataType::copyVal(v
->value
, info
->name
, v
->type
, v
->length
);
1433 type
= AllDataType::convertToCSQLSQLType((DataType
)info
->type
);
1434 AllDataType::copyVal(v
->value
,&type
,v
->type
, v
->length
);
1440 AllDataType::copyVal(v
->value
, &info
->precision
, v
->type
, v
->length
);
1446 if( info
->type
== typeString
|| info
->type
== typeDate
|| info
->type
== typeTime
|| info
->type
== typeTimeStamp
)
1447 AllDataType::copyVal(v
->value
, (void *)"'", v
->type
, v
->length
);
1449 AllDataType::copyVal(v
->value
, (void *)"", v
->type
, v
->length
);
1455 if( info
->type
== typeString
|| info
->type
== typeDate
|| info
->type
== typeTime
|| info
->type
== typeTimeStamp
)
1456 AllDataType::copyVal(v
->value
, (void *)"'", v
->type
, v
->length
);
1458 AllDataType::copyVal(v
->value
, (void *)"", v
->type
, v
->length
);
1464 AllDataType::copyVal(v
->value
, (void *)"", v
->type
, v
->length
);
1470 (*(short *) v
->value
) = 1;
1476 (*(short *) v
->value
) = 0;
1482 (*(short *) v
->value
) = 3;
1488 (*(short *) v
->value
) = 0;
1494 (*(short *) v
->value
) = 0;
1500 if(info
->autoIncrement
)
1501 (*(short *) v
->value
) = 1;
1503 (*(short *) v
->value
) = 0;
1509 AllDataType::copyVal(v
->value
, info
->name
, v
->type
, v
->length
);
1515 if(info
->type
== typeFloat
)
1516 (*(short *) v
->value
) = -38;
1517 else if(info
->type
== typeDouble
)
1518 (*(short *) v
->value
) = -308;
1520 (*(short *) v
->value
) = 0;
1526 if(info
->type
== typeFloat
)
1527 (*(short *) v
->value
) = 38;
1528 else if(info
->type
== typeDouble
)
1529 (*(short *) v
->value
) = 308;
1531 (*(short *) v
->value
) = 0;
1537 (*(short *) v
->value
) =0; //TODO
1543 (*(short *) v
->value
) = 0;//TODO
1549 (*(int *) v
->value
) = 10;
1555 (*(short *) v
->value
) = 0;
1573 ListIterator
MetadataStatement::getDataTypeInfoIterator()
1576 for(int i
=0; i
<10; i
++)
1578 DataTypeInfo
*typeInfo
= new DataTypeInfo();
1579 datalist
.append(typeInfo
);
1581 DataTypeInfo
*info
= (DataTypeInfo
*)datalist
.get(1);
1582 strcpy(info
->name
,"TINYINT");
1584 info
->precision
= 3;
1585 info
->autoIncrement
= true;
1586 info
= (DataTypeInfo
*)datalist
.get(2);
1587 strcpy(info
->name
,"SMALLINT");
1589 info
->precision
= 5;
1590 info
->autoIncrement
= true;
1591 info
=(DataTypeInfo
*) datalist
.get(3);
1592 strcpy(info
->name
,"INT");
1594 info
->precision
= 10 ;
1595 info
->autoIncrement
= true;
1596 info
=(DataTypeInfo
*) datalist
.get(4);
1597 strcpy(info
->name
,"BIGINT");
1599 info
->precision
= 19;
1600 info
->autoIncrement
= true;
1601 info
=(DataTypeInfo
*) datalist
.get(5);
1602 strcpy(info
->name
,"FLOAT");
1604 info
->precision
= 10;
1605 info
->autoIncrement
= false;
1606 info
=(DataTypeInfo
*) datalist
.get(6);
1607 strcpy(info
->name
,"DOUBLE");
1609 info
->precision
= 17;
1610 info
->autoIncrement
= false;
1611 info
=(DataTypeInfo
*) datalist
.get(7);
1612 strcpy(info
->name
,"CHAR");
1614 info
->precision
= 255;
1615 info
->autoIncrement
= false;
1616 info
=(DataTypeInfo
*) datalist
.get(8);
1617 strcpy(info
->name
,"DATE");
1619 info
->precision
= 0;
1620 info
->autoIncrement
= false;
1621 info
=(DataTypeInfo
*) datalist
.get(9);
1622 strcpy(info
->name
,"TIME");
1624 info
->precision
= 0;
1625 info
->autoIncrement
= false;
1626 info
=(DataTypeInfo
*) datalist
.get(10);
1627 strcpy(info
->name
,"TIMESTAMP");
1629 info
->precision
= 0;
1630 info
->autoIncrement
= false;
1631 return datalist
.getIterator();