code reorg and moving files to csql base directory
[csql.git] / src / sql / CopyTblStatement.cxx
blob91962702d7b7df4c41982b628bfa6cf7f823fdec
1 /***************************************************************************
2 * Copyright (C) 2007 by Prabakaran Thirumalai *
3 * praba_tuty@yahoo.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 <os.h>
17 #include <Statement.h>
18 #include <TableImpl.h>
19 #include <OrderTableImpl.h>
21 CopyTblStatement::CopyTblStatement()
23 innerSelStmt = NULL;
24 totalFields = 0;
25 bindFieldValues= NULL;
26 parsedData = NULL;
27 dbMgr = NULL;
28 table = NULL;
29 params = NULL;
30 paramValues = NULL;
31 totalParams = 0;
34 CopyTblStatement::~CopyTblStatement()
36 if (table) { table->close(); table = NULL; }
37 SelStatement *stmt= (SelStatement *)innerSelStmt;
38 if (stmt) stmt->close();
39 if(totalFields){
40 for(int i=0;i<totalFields;i++)
42 free(bindFieldValues[i]);
44 free(bindFieldValues); bindFieldValues = NULL;
46 totalFields =0;
47 delete innerSelStmt;
50 DbRetVal CopyTblStatement::resolve()
52 DbRetVal rv = OK;
53 ListIterator titer = parsedData->getTableNameList().getIterator();
54 while (titer.hasElement()) {
55 TableName *t = (TableName*)titer.nextElement();
56 if (strcmp(t->tblName, parsedData->getPKTableName())==0) {
57 printError(ErrBadArg,
58 "Source and Target table Names cannot be same.");
59 return ErrBadArg;
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();
71 else
72 rv = resolveForInsert();
73 return rv;
76 DbRetVal CopyTblStatement::resolveForInsert()
78 table = dbMgr->openTable(tblName);
79 if (table == NULL)
81 printError(ErrNotExists, "Unable to open the table:Table not exists");
82 return ErrNotExists;
84 table->setLoading(true);
85 //bind field
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);
99 //TODO :: Should free
100 valBuf = AllDataType::alloc(info->type, info->length);
101 table->bindFld(elem->name, valBuf);
102 fieldsize=0;
103 selStmt->setBindField(fcount, valBuf);
104 bindFieldValues[fcount-1] = valBuf;
105 fcount++;
107 delete info;
108 fNameIter.reset();
109 while (fNameIter.hasElement())
111 delete (Identifier*) fNameIter.nextElement();
113 fNameList.reset();
114 return OK;
117 DbRetVal CopyTblStatement::resolveForCreate()
119 DbRetVal rv = OK;
120 int nop = 0;
121 SelStatement *stmt = (SelStatement*) innerSelStmt;
122 nop = stmt->noOfProjFields();
123 FieldInfo *field = new FieldInfo();
124 TableDef tabDef;
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);
132 delete field;
133 rv = dbMgr->createTable(tblName, tabDef);
134 if(rv!=OK){
135 return rv;
137 rv = resolveForInsert();
138 return rv;
141 DbRetVal CopyTblStatement::execute(int &rowsAffected)
143 DbRetVal rv = OK;
144 SelStatement *selStmt = (SelStatement*) innerSelStmt;
145 selStmt->execute(rowsAffected);
146 while(selStmt->fetch())
148 rv = table->insertTuple();
149 if(rv!=OK) break;
151 if( (rv!=OK) && ( !parsedData->getCreateTbl()))
153 dbMgr->dropTable(tblName);
155 return rv;
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)
238 return 0;
241 DbRetVal CopyTblStatement::getParamFldInfo(int paramPos, FieldInfo *&info)
243 DbRetVal rv = OK;
244 SelStatement *stmt = (SelStatement*) innerSelStmt;
245 rv = stmt->getParamFldInfo(paramPos, info);
246 return rv;
248 DbRetVal CopyTblStatement::setParam(int paramNo, void *value)
250 DbRetVal rv = OK;
251 SelStatement *stmt = (SelStatement*) innerSelStmt;
252 rv = stmt->setParam(paramNo,value);
253 return rv;