allocator fixes
[csql.git] / src / sql / CopyTblStatement.cxx
blob0602bb67e8e15885db8ac017c641862331dda61a
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 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 strcpy(tblName,parsedData->getPKTableName());
54 SelStatement *sStmt = new SelStatement();
55 innerSelStmt = ( Statement *) sStmt;
56 innerSelStmt->setDbMgr(dbMgr);
57 innerSelStmt->setParsedData(parsedData);
58 innerSelStmt->resolve();
59 if(parsedData->getCreateTbl())
60 rv = resolveForCreate();
61 else
62 rv = resolveForInsert();
63 return rv;
66 DbRetVal CopyTblStatement::resolveForInsert()
68 table = dbMgr->openTable(tblName);
69 if (table == NULL)
71 printError(ErrNotExists, "Unable to open the table:Table not exists");
72 return ErrNotExists;
74 table->setLoading(true);
75 //bind field
76 List fNameList = table->getFieldNameList();
77 ListIterator fNameIter = fNameList.getIterator();
78 FieldInfo *info = new FieldInfo();
79 int fcount = 1; void *valBuf; int fieldsize=0;
80 Identifier *elem = NULL;
81 totalFields = fNameList.size();
82 bindFieldValues = (void**) malloc( totalFields * sizeof(char*));
83 memset(bindFieldValues, 0, totalFields * sizeof(char*));
84 SelStatement *selStmt = (SelStatement*) innerSelStmt;
85 while (fNameIter.hasElement())
87 elem = (Identifier*) fNameIter.nextElement();
88 table->getFieldInfo((const char*)elem->name, info);
89 //TODO :: Should free
90 valBuf = AllDataType::alloc(info->type, info->length);
91 table->bindFld(elem->name, valBuf);
92 fieldsize=0;
93 selStmt->setBindField(fcount, valBuf);
94 bindFieldValues[fcount-1] = valBuf;
95 fcount++;
97 delete info;
98 fNameIter.reset();
99 while (fNameIter.hasElement())
101 delete (Identifier*) fNameIter.nextElement();
103 fNameList.reset();
104 return OK;
107 DbRetVal CopyTblStatement::resolveForCreate()
109 DbRetVal rv = OK;
110 int nop = 0;
111 SelStatement *stmt = (SelStatement*) innerSelStmt;
112 nop = stmt->noOfProjFields();
113 FieldInfo *field = new FieldInfo();
114 TableDef tabDef;
115 char name[IDENTIFIER_LENGTH];
116 for(int i=0; i<nop; i++)
118 rv = stmt->getProjFldInfo(i+1,field);
119 Table::getFieldNameAlone(field->fldName, name);
120 tabDef.addField(name,field->type, field->length, field->defaultValueBuf, field->isNull);
122 delete field;
123 rv = dbMgr->createTable(tblName, tabDef);
124 if(rv!=OK){
125 return rv;
127 rv = resolveForInsert();
128 return rv;
131 DbRetVal CopyTblStatement::execute(int &rowsAffected)
133 DbRetVal rv = OK;
134 SelStatement *selStmt = (SelStatement*) innerSelStmt;
135 selStmt->execute(rowsAffected);
136 while(selStmt->fetch())
138 rv = table->insertTuple();
139 if(rv!=OK) break;
141 if( (rv!=OK) && ( !parsedData->getCreateTbl()))
143 dbMgr->dropTable(tblName);
145 return rv;
148 DbRetVal CopyTblStatement::setShortParam(int paramNo, short value)
150 SelStatement *stmt = (SelStatement*) innerSelStmt;
151 return stmt->setShortParam(paramNo,value);
154 DbRetVal CopyTblStatement::setIntParam(int paramNo, int value)
156 SelStatement *stmt = (SelStatement*) innerSelStmt;
157 return stmt->setIntParam(paramNo,value);
160 DbRetVal CopyTblStatement::setLongParam(int paramNo, long value)
162 SelStatement *stmt = (SelStatement*) innerSelStmt;
163 return stmt->setLongParam(paramNo,value);
166 DbRetVal CopyTblStatement::setLongLongParam(int paramNo, long long value)
168 SelStatement *stmt = (SelStatement*) innerSelStmt;
169 return stmt->setLongLongParam(paramNo,value);
172 DbRetVal CopyTblStatement::setByteIntParam(int paramNo, ByteInt value)
174 SelStatement *stmt = (SelStatement*) innerSelStmt;
175 return stmt->setByteIntParam(paramNo,value);
178 DbRetVal CopyTblStatement::setFloatParam(int paramNo, float value)
180 SelStatement *stmt = (SelStatement*) innerSelStmt;
181 return stmt->setFloatParam(paramNo,value);
184 DbRetVal CopyTblStatement::setDoubleParam(int paramNo, double value)
186 SelStatement *stmt = (SelStatement*) innerSelStmt;
187 return stmt->setDoubleParam(paramNo,value);
190 DbRetVal CopyTblStatement::setStringParam(int paramNo, char *value)
192 SelStatement *stmt = (SelStatement*) innerSelStmt;
193 return stmt->setStringParam(paramNo,value);
196 DbRetVal CopyTblStatement::setDateParam(int paramNo, Date value)
198 SelStatement *stmt = (SelStatement*) innerSelStmt;
199 return stmt->setDateParam(paramNo,value);
202 DbRetVal CopyTblStatement::setTimeParam(int paramNo, Time value)
204 SelStatement *stmt = (SelStatement*) innerSelStmt;
205 return stmt->setTimeParam(paramNo,value);
208 DbRetVal CopyTblStatement::setTimeStampParam(int paramNo, TimeStamp value)
210 SelStatement *stmt = (SelStatement*) innerSelStmt;
211 return stmt->setTimeStampParam(paramNo,value);
214 DbRetVal CopyTblStatement::setBinaryParam(int paramNo, void *value, int length)
216 SelStatement *stmt = (SelStatement*) innerSelStmt;
217 return stmt->setBinaryParam(paramNo,value,length);
220 void* CopyTblStatement::getParamValuePtr(int pos)
222 SelStatement *stmt = (SelStatement*) innerSelStmt;
223 return stmt->getParamValuePtr(pos);
226 int CopyTblStatement::getFldPos(char *name)
228 return 0;
231 DbRetVal CopyTblStatement::getParamFldInfo(int paramPos, FieldInfo *&info)
233 DbRetVal rv = OK;
234 SelStatement *stmt = (SelStatement*) innerSelStmt;
235 rv = stmt->getParamFldInfo(paramPos, info);
236 return rv;
238 DbRetVal CopyTblStatement::setParam(int paramNo, void *value)
240 DbRetVal rv = OK;
241 SelStatement *stmt = (SelStatement*) innerSelStmt;
242 rv = stmt->setParam(paramNo,value);
243 return rv;