1905243 cachetable tool
[csql.git] / src / network / SqlNetworkHandler.cxx
blobd4377b23c5da23aedb1324d15d93a4f6a33ee366
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 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
20 #include <SqlNetworkHandler.h>
21 #include <AbsSqlConnection.h>
22 #include <SqlConnection.h>
23 #include <SqlOdbcConnection.h>
24 #include <AbsSqlStatement.h>
25 #include <SqlStatement.h>
26 #include <SqlOdbcStatement.h>
28 #include <SqlLogStatement.h>
30 List SqlNetworkHandler::stmtList;
31 AbsSqlConnection* SqlNetworkHandler::conn;
32 SqlApiImplType SqlNetworkHandler::type;
34 int SqlNetworkHandler::process(PacketHeader &header, char *buffer)
36 switch(header.packetType)
38 case NW_PKT_PREPARE:
39 processPrepare(header, buffer);
40 break;
41 case NW_PKT_COMMIT:
42 processCommit(header, buffer);
43 break;
47 int SqlNetworkHandler::processCommit(PacketHeader &header, char *buffer)
49 printf("COMMIT \n");
50 PacketCommit *pkt = new PacketCommit();
51 pkt->setBuffer(buffer);
52 pkt->setBufferSize(header.packetLength);
53 pkt->unmarshall();
54 List pktList;
55 pkt->getExecPacketList(stmtList, pktList);
56 DbRetVal rv = applyExecPackets(stmtList, pktList);
57 int response = 1;
58 if (rv != OK)
60 printf("Unable to apply the exec packets\n");
61 response =0;
63 return response;
66 int SqlNetworkHandler::processFree(PacketHeader &header, char *buffer)
68 PacketFree *pkt = new PacketFree();
69 pkt->setBuffer(buffer);
70 pkt->setBufferSize(header.packetLength);
71 pkt->unmarshall();
72 printf("FREE %d \n", pkt->stmtID);
73 int response =1;
74 //This wont work for two statement executed in same transaction using same SqlStatement object using free.
75 //so do not delete now and put a flag 'readyfordelete' in NetworkStmt object and delete it during execute
77 ListIterator iter = stmtList.getIterator();
78 NetworkStmt *stmt, *removeStmt = NULL;
79 while (iter.hasElement())
81 stmt = (NetworkStmt*)iter.nextElement();
82 if (stmt->srcNetworkID == header.srcNetworkID
83 && stmt->stmtID == pkt->stmtID)
85 removeStmt = stmt;
86 break;
89 if (removeStmt) stmtList.remove(removeStmt);
90 else printf("Statement id %d not found in list \n", pkt->stmtID);
92 return response;
94 int SqlNetworkHandler::processPrepare(PacketHeader &header, char *buffer)
96 PacketPrepare *pkt = new PacketPrepare();
97 pkt->setBuffer(buffer);
98 pkt->setBufferSize(header.packetLength);
99 pkt->unmarshall();
100 printf("PREPARE %d %s\n", pkt->stmtID, pkt->stmtString);
101 for (int i =0 ; i < pkt->noParams; i++)
102 printf("PREPARE type %d length %d \n", pkt->type[i], pkt->length[i]);
103 int response =1;
104 //TODO::add it to the SqlStatement list
105 AbsSqlStatement *sqlstmt = SqlFactory::createStatement(type);
106 sqlstmt->setConnection(conn);
107 NetworkStmt *nwStmt = new NetworkStmt();
108 printf("nwstmt in prepare %x %x\n", nwStmt, sqlstmt);
109 printf("Statement string %s\n", pkt->stmtString);
110 nwStmt->srcNetworkID = header.srcNetworkID;
111 nwStmt->stmtID = pkt->stmtID;
112 nwStmt->stmt = sqlstmt;
113 DbRetVal rv = sqlstmt->prepare(pkt->stmtString);
114 if (rv != OK)
116 printError(ErrSysInit, "statement prepare failed\n");
117 response = 0;
119 BindSqlField *bindField = NULL;
120 //populate paramList
121 for (int i = 0; i < pkt->noParams; i++)
123 bindField = new BindSqlField();
124 bindField->type = (DataType) pkt->type[i];
125 bindField->length = pkt->length[i];
126 bindField->value = AllDataType::alloc(bindField->type,
127 bindField->length);
128 nwStmt->paramList.append(bindField);
129 printf("Adding element to paramList for type %d\n",bindField->type);
131 stmtList.append(nwStmt);
132 return response;
136 DbRetVal SqlNetworkHandler::applyExecPackets(List sList, List pList)
138 ListIterator stmtIter = sList.getIterator();
139 NetworkStmt *nwstmt;
140 conn->beginTrans();
141 ListIterator pktIter = pList.getIterator();
142 PacketExecute *pkt;
143 int i = 0;
144 BindSqlField *bindField;
145 while (pktIter.hasElement())
147 pkt = (PacketExecute*) pktIter.nextElement();
148 printf("EXEC packt ptr %x in apply \n", pkt);
149 stmtIter.reset();
150 bool found = false;
151 while (stmtIter.hasElement())
153 nwstmt = (NetworkStmt*) stmtIter.nextElement();
154 if (nwstmt->stmtID == pkt->stmtID) {found = true ; break;}
156 if (!found) { printError(ErrSysFatal, "Element not found\n"); conn->rollback();
157 return ErrSysFatal;}
158 printf("nwstmt ptr in apply %x\n", nwstmt);
159 ListIterator paramIter = nwstmt->paramList.getIterator();
160 i = 0;
161 while (paramIter.hasElement()) {
162 bindField = (BindSqlField*) paramIter.nextElement();
163 setParamValues(nwstmt->stmt, i+1, bindField->type, bindField->length, pkt->paramValues[i]);
164 printf("setting %d parameter of type %d\n", i, bindField->type);
165 i++;
167 int rows;
168 DbRetVal rv = nwstmt->stmt->execute(rows);
169 if (rv != OK)
171 printf("sql execute failed with rv %d\n", rv);
172 //TODO::log all things like SQL statements to a file
175 SqlNetworkHandler::conn->commit();
176 printf("Transaction committed\n");
177 return OK;
180 void SqlNetworkHandler::setParamValues(AbsSqlStatement *stmt, int parampos, DataType type,
181 int length, char *value)
183 switch(type)
185 case typeInt:
186 stmt->setIntParam(parampos, *(int*)value);
187 break;
188 case typeLong:
189 stmt->setLongParam(parampos, *(long*)value);
190 break;
191 case typeLongLong:
192 stmt->setLongLongParam(parampos, *(long long*)value);
193 break;
194 case typeShort:
195 stmt->setShortParam(parampos, *(short*)value);
196 break;
197 case typeByteInt:
198 stmt->setByteIntParam(parampos, *(char*)value);
199 break;
200 case typeDouble:
201 stmt->setDoubleParam(parampos, *(double*)value);
202 break;
203 case typeFloat:
204 stmt->setFloatParam(parampos, *(float*)value);
205 break;
206 case typeDate:
207 stmt->setDateParam(parampos, *(Date*)value);
208 break;
209 case typeTime:
210 stmt->setTimeParam(parampos, *(Time*)value);
211 break;
212 case typeTimeStamp:
213 stmt->setTimeStampParam(parampos, *(TimeStamp*)value);
214 break;
215 case typeString:
217 char *d =(char*)value;
218 d[length-1] = '\0';
219 stmt->setStringParam(parampos, (char*)value);
220 break;
223 return;