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 * 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
)
39 processPrepare(header
, buffer
);
42 processCommit(header
, buffer
);
47 int SqlNetworkHandler::processCommit(PacketHeader
&header
, char *buffer
)
50 PacketCommit
*pkt
= new PacketCommit();
51 pkt
->setBuffer(buffer
);
52 pkt
->setBufferSize(header
.packetLength
);
55 pkt
->getExecPacketList(stmtList
, pktList
);
56 DbRetVal rv
= applyExecPackets(stmtList
, pktList
);
60 printf("Unable to apply the exec packets\n");
66 int SqlNetworkHandler::processFree(PacketHeader
&header
, char *buffer
)
68 PacketFree
*pkt
= new PacketFree();
69 pkt
->setBuffer(buffer
);
70 pkt
->setBufferSize(header
.packetLength
);
72 printf("FREE %d \n", pkt
->stmtID
);
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)
89 if (removeStmt) stmtList.remove(removeStmt);
90 else printf("Statement id %d not found in list \n", pkt->stmtID);
94 int SqlNetworkHandler::processPrepare(PacketHeader
&header
, char *buffer
)
96 PacketPrepare
*pkt
= new PacketPrepare();
97 pkt
->setBuffer(buffer
);
98 pkt
->setBufferSize(header
.packetLength
);
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
]);
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
);
116 printError(ErrSysInit
, "statement prepare failed\n");
119 BindSqlField
*bindField
= NULL
;
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
,
128 nwStmt
->paramList
.append(bindField
);
129 printf("Adding element to paramList for type %d\n",bindField
->type
);
131 stmtList
.append(nwStmt
);
136 DbRetVal
SqlNetworkHandler::applyExecPackets(List sList
, List pList
)
138 ListIterator stmtIter
= sList
.getIterator();
141 ListIterator pktIter
= pList
.getIterator();
144 BindSqlField
*bindField
;
145 while (pktIter
.hasElement())
147 pkt
= (PacketExecute
*) pktIter
.nextElement();
148 printf("EXEC packt ptr %x in apply \n", pkt
);
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();
158 printf("nwstmt ptr in apply %x\n", nwstmt
);
159 ListIterator paramIter
= nwstmt
->paramList
.getIterator();
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
);
168 DbRetVal rv
= nwstmt
->stmt
->execute(rows
);
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");
180 void SqlNetworkHandler::setParamValues(AbsSqlStatement
*stmt
, int parampos
, DataType type
,
181 int length
, char *value
)
186 stmt
->setIntParam(parampos
, *(int*)value
);
189 stmt
->setLongParam(parampos
, *(long*)value
);
192 stmt
->setLongLongParam(parampos
, *(long long*)value
);
195 stmt
->setShortParam(parampos
, *(short*)value
);
198 stmt
->setByteIntParam(parampos
, *(char*)value
);
201 stmt
->setDoubleParam(parampos
, *(double*)value
);
204 stmt
->setFloatParam(parampos
, *(float*)value
);
207 stmt
->setDateParam(parampos
, *(Date
*)value
);
210 stmt
->setTimeParam(parampos
, *(Time
*)value
);
213 stmt
->setTimeStampParam(parampos
, *(TimeStamp
*)value
);
217 char *d
=(char*)value
;
219 stmt
->setStringParam(parampos
, (char*)value
);