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>
21 CopyTblStatement::CopyTblStatement()
25 bindFieldValues
= NULL
;
34 CopyTblStatement::~CopyTblStatement()
36 if (table
) { table
->close(); table
= NULL
; }
37 SelStatement
*stmt
= (SelStatement
*)innerSelStmt
;
38 if (stmt
) stmt
->close();
40 for(int i
=0;i
<totalFields
;i
++)
42 free(bindFieldValues
[i
]);
44 free(bindFieldValues
); bindFieldValues
= NULL
;
50 DbRetVal
CopyTblStatement::resolve()
53 ListIterator titer
= parsedData
->getTableNameList().getIterator();
54 while (titer
.hasElement()) {
55 TableName
*t
= (TableName
*)titer
.nextElement();
56 if (strcmp(t
->tblName
, parsedData
->getPKTableName())==0) {
58 "Source and Target table Names cannot be same.");
62 strcpy(tblName
,parsedData
->getPKTableName());
63 SelStatement
*sStmt
= new SelStatement();
64 innerSelStmt
= ( Statement
*) sStmt
;
65 innerSelStmt
->setDbMgr(dbMgr
);
66 innerSelStmt
->setParsedData(parsedData
);
67 rv
= innerSelStmt
->resolve();
68 if (rv
!= OK
) return rv
;
69 if(parsedData
->getCreateTbl())
70 rv
= resolveForCreate();
72 rv
= resolveForInsert();
76 DbRetVal
CopyTblStatement::resolveForInsert()
78 table
= dbMgr
->openTable(tblName
);
81 printError(ErrNotExists
, "Unable to open the table:Table not exists");
84 table
->setLoading(true);
86 List fNameList
= table
->getFieldNameList();
87 ListIterator fNameIter
= fNameList
.getIterator();
88 FieldInfo
*info
= new FieldInfo();
89 int fcount
= 1; void *valBuf
; int fieldsize
=0;
90 Identifier
*elem
= NULL
;
91 totalFields
= fNameList
.size();
92 bindFieldValues
= (void**) malloc( totalFields
* sizeof(char*));
93 memset(bindFieldValues
, 0, totalFields
* sizeof(char*));
94 SelStatement
*selStmt
= (SelStatement
*) innerSelStmt
;
95 while (fNameIter
.hasElement())
97 elem
= (Identifier
*) fNameIter
.nextElement();
98 table
->getFieldInfo((const char*)elem
->name
, info
);
100 valBuf
= AllDataType::alloc(info
->type
, info
->length
);
101 table
->bindFld(elem
->name
, valBuf
);
103 selStmt
->setBindField(fcount
, valBuf
);
104 bindFieldValues
[fcount
-1] = valBuf
;
109 while (fNameIter
.hasElement())
111 delete (Identifier
*) fNameIter
.nextElement();
117 DbRetVal
CopyTblStatement::resolveForCreate()
121 SelStatement
*stmt
= (SelStatement
*) innerSelStmt
;
122 nop
= stmt
->noOfProjFields();
123 FieldInfo
*field
= new FieldInfo();
125 char name
[IDENTIFIER_LENGTH
];
126 for(int i
=0; i
<nop
; i
++)
128 rv
= stmt
->getProjFldInfo(i
+1,field
);
129 Table::getFieldNameAlone(field
->fldName
, name
);
130 tabDef
.addField(name
,field
->type
, field
->length
, field
->defaultValueBuf
, field
->isNull
);
133 rv
= dbMgr
->createTable(tblName
, tabDef
);
137 rv
= resolveForInsert();
141 DbRetVal
CopyTblStatement::execute(int &rowsAffected
)
144 SelStatement
*selStmt
= (SelStatement
*) innerSelStmt
;
145 selStmt
->execute(rowsAffected
);
146 while(selStmt
->fetch())
148 rv
= table
->insertTuple();
151 if( (rv
!=OK
) && ( !parsedData
->getCreateTbl()))
153 dbMgr
->dropTable(tblName
);
158 DbRetVal
CopyTblStatement::setShortParam(int paramNo
, short value
)
160 SelStatement
*stmt
= (SelStatement
*) innerSelStmt
;
161 return stmt
->setShortParam(paramNo
,value
);
164 DbRetVal
CopyTblStatement::setIntParam(int paramNo
, int value
)
166 SelStatement
*stmt
= (SelStatement
*) innerSelStmt
;
167 return stmt
->setIntParam(paramNo
,value
);
170 DbRetVal
CopyTblStatement::setLongParam(int paramNo
, long value
)
172 SelStatement
*stmt
= (SelStatement
*) innerSelStmt
;
173 return stmt
->setLongParam(paramNo
,value
);
176 DbRetVal
CopyTblStatement::setLongLongParam(int paramNo
, long long value
)
178 SelStatement
*stmt
= (SelStatement
*) innerSelStmt
;
179 return stmt
->setLongLongParam(paramNo
,value
);
182 DbRetVal
CopyTblStatement::setByteIntParam(int paramNo
, ByteInt value
)
184 SelStatement
*stmt
= (SelStatement
*) innerSelStmt
;
185 return stmt
->setByteIntParam(paramNo
,value
);
188 DbRetVal
CopyTblStatement::setFloatParam(int paramNo
, float value
)
190 SelStatement
*stmt
= (SelStatement
*) innerSelStmt
;
191 return stmt
->setFloatParam(paramNo
,value
);
194 DbRetVal
CopyTblStatement::setDoubleParam(int paramNo
, double value
)
196 SelStatement
*stmt
= (SelStatement
*) innerSelStmt
;
197 return stmt
->setDoubleParam(paramNo
,value
);
200 DbRetVal
CopyTblStatement::setStringParam(int paramNo
, char *value
)
202 SelStatement
*stmt
= (SelStatement
*) innerSelStmt
;
203 return stmt
->setStringParam(paramNo
,value
);
206 DbRetVal
CopyTblStatement::setDateParam(int paramNo
, Date value
)
208 SelStatement
*stmt
= (SelStatement
*) innerSelStmt
;
209 return stmt
->setDateParam(paramNo
,value
);
212 DbRetVal
CopyTblStatement::setTimeParam(int paramNo
, Time value
)
214 SelStatement
*stmt
= (SelStatement
*) innerSelStmt
;
215 return stmt
->setTimeParam(paramNo
,value
);
218 DbRetVal
CopyTblStatement::setTimeStampParam(int paramNo
, TimeStamp value
)
220 SelStatement
*stmt
= (SelStatement
*) innerSelStmt
;
221 return stmt
->setTimeStampParam(paramNo
,value
);
224 DbRetVal
CopyTblStatement::setBinaryParam(int paramNo
, void *value
, int length
)
226 SelStatement
*stmt
= (SelStatement
*) innerSelStmt
;
227 return stmt
->setBinaryParam(paramNo
,value
,length
);
230 void* CopyTblStatement::getParamValuePtr(int pos
)
232 SelStatement
*stmt
= (SelStatement
*) innerSelStmt
;
233 return stmt
->getParamValuePtr(pos
);
236 int CopyTblStatement::getFldPos(char *name
)
241 DbRetVal
CopyTblStatement::getParamFldInfo(int paramPos
, FieldInfo
*&info
)
244 SelStatement
*stmt
= (SelStatement
*) innerSelStmt
;
245 rv
= stmt
->getParamFldInfo(paramPos
, info
);
248 DbRetVal
CopyTblStatement::setParam(int paramNo
, void *value
)
251 SelStatement
*stmt
= (SelStatement
*) innerSelStmt
;
252 rv
= stmt
->setParam(paramNo
,value
);