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 <SqlNwStatement.h>
23 DbRetVal
SqlNwStatement::prepare(char *stmtstr
)
27 SqlNwConnection
*conn
= (SqlNwConnection
*)con
;
28 if (! conn
->isConOpen()) {
29 printError(ErrNoConnection
, "No connection present");
30 return ErrNoConnection
;
32 if (isPrepared
) free();
33 SqlPacketPrepare
*pkt
= new SqlPacketPrepare();
34 pkt
->stmtString
= stmtstr
;
35 pkt
->stmtLength
= strlen(stmtstr
) + 1;
37 rv
= conn
->send(SQL_NW_PKT_PREPARE
, pkt
->getMarshalledBuffer(), pkt
->getBufferSize());
39 printError(rv
, "Data could not be sent");
45 printError(rv
, "Unable to Receive from peer");
48 ResponsePacket
*rpkt
= (ResponsePacket
*) ((TCPClient
*)conn
->nwClient
)->respPkt
;
49 char *ptr
= (char *) &rpkt
->retVal
;
50 if (*ptr
== 0) { delete pkt
; return ErrPeerResponse
; }
51 if (rpkt
->isSelect
) isSel
= true; else isSel
= false;
52 int params
= *(ptr
+ 2);
53 int proj
= *(ptr
+ 3);
54 stmtID
= rpkt
->stmtID
;
58 int fd
= ((TCPClient
*)(conn
->nwClient
))->sockfd
;
59 int numbytes
= os::recv(fd
, &header
, sizeof(PacketHeader
), 0);
61 printError(ErrOS
, "Error reading from socket\n");
64 printf("HEADER says packet type is %d\n", header
.packetType
);
65 buffer
= (char*) malloc(header
.packetLength
);
66 numbytes
= os::recv(fd
,buffer
,header
.packetLength
,0);
68 printError(ErrOS
, "Error reading from socket\n");
71 SqlPacketParamMetadata
*mdpkt
= new SqlPacketParamMetadata();
72 mdpkt
->setBuffer(buffer
);
74 BindSqlField
*bindField
=NULL
;
75 for (int i
=0; i
< mdpkt
->noParams
; i
++) {
76 bindField
= new BindSqlField();
77 bindField
->type
= (DataType
) mdpkt
->type
[i
];
78 bindField
->length
= mdpkt
->length
[i
];
79 if (mdpkt
->type
[i
] == typeBinary
)
80 bindField
->value
= AllDataType::alloc(bindField
->type
, 2 * bindField
->length
);
81 else bindField
->value
= AllDataType::alloc(bindField
->type
, bindField
->length
);
82 paramList
.append(bindField
);
88 int fd
= ((TCPClient
*)(conn
->nwClient
))->sockfd
;
89 int numbytes
= os::recv(fd
, &header
, sizeof(PacketHeader
), 0);
91 printError(ErrOS
, "Error reading from socket\n");
94 printf("HEADER says packet type is %d\n", header
.packetType
);
95 buffer
= (char*) malloc(header
.packetLength
);
96 numbytes
= os::recv(fd
,buffer
,header
.packetLength
,0);
98 printError(ErrOS
, "Error reading from socket\n");
101 SqlPacketProjMetadata
*prjmdpkt
= new SqlPacketProjMetadata();
102 prjmdpkt
->setBuffer(buffer
);
103 prjmdpkt
->unmarshall();
104 BindSqlProjectField
*prjFld
=NULL
;
105 for (int i
=0; i
< prjmdpkt
->noProjs
; i
++) {
106 prjFld
= new BindSqlProjectField();
107 prjFld
->type
= (DataType
) prjmdpkt
->type
[i
];
108 prjFld
->length
= prjmdpkt
->length
[i
];
109 prjFld
->value
= AllDataType::alloc(prjFld
->type
, prjFld
->length
);
110 bindList
.append(prjFld
);
119 DbRetVal
SqlNwStatement::execute(int &rowsAffected
)
122 SqlNwConnection
*conn
= (SqlNwConnection
*)con
;
123 if (! conn
->isConOpen()) {
124 printError(ErrNoConnection
, "No connection present");
125 return ErrNoConnection
;
127 if (!isPrepared
) return ErrNotPrepared
;
128 SqlPacketExecute
*pkt
= new SqlPacketExecute();
129 pkt
->stmtID
= getStmtID();
130 pkt
->noParams
=paramList
.size();
131 pkt
->setParams(paramList
);
133 rv
= conn
->send(SQL_NW_PKT_EXECUTE
, pkt
->getMarshalledBuffer(), pkt
->getBufferSize());
135 printError(rv
, "Data could not be sent");
138 rv
= conn
->receive();
139 if (rv
!= OK
) return rv
;
140 if(pkt
->noParams
) delete [] pkt
->paramValues
;
142 ResponsePacket
*rpkt
= (ResponsePacket
*) ((TCPClient
*)conn
->nwClient
)->respPkt
;
143 char *ptr
= (char *) &rpkt
->retVal
;
144 rowsAffected
= rpkt
->rows
;
145 if (*ptr
!= 1) return ErrPeerResponse
;
149 DbRetVal
SqlNwStatement::bindParam(int pos
, void* value
)
152 printError(ErrWarning
, "Deprecated. Use setParamXXX instead\n");
156 DbRetVal
SqlNwStatement::bindField(int pos
, void* value
)
158 if (!isPrepared
) return OK
;
159 BindSqlProjectField
*prjFld
= (BindSqlProjectField
*) bindList
.get(pos
);
160 prjFld
->value
= value
;
163 void* SqlNwStatement::fetch()
166 SqlNwConnection
*conn
= (SqlNwConnection
*)con
;
167 if (! conn
->isConOpen()) {
168 printError(ErrNoConnection
, "No connection present");
171 if (!isPrepared
) return NULL
;
172 void *ptrToFirstField
= NULL
;
173 SqlPacketFetch
*pkt
= new SqlPacketFetch();
174 pkt
->stmtID
= getStmtID();
176 rv
= conn
->send(SQL_NW_PKT_FETCH
, pkt
->getMarshalledBuffer(), pkt
->getBufferSize());
178 printError(rv
, "Data could not be sent");
181 rv
= conn
->receive();
183 printError(rv
, "Unable to receive from Network");
186 ResponsePacket
*rpkt
= (ResponsePacket
*) ((TCPClient
*)conn
->nwClient
)->respPkt
;
187 char *ptr
= (char *) &rpkt
->retVal
;
188 if (*ptr
== 0) { delete pkt
; return NULL
; }
189 if (*(ptr
+1) == 1) { delete pkt
; rv
= OK
; return NULL
; }
191 int fd
= ((TCPClient
*)(conn
->nwClient
))->sockfd
;
192 int numbytes
= os::recv(fd
, &header
, sizeof(PacketHeader
), 0);
193 if (numbytes
== -1) {
194 printError(ErrOS
, "Error reading from socket\n");
197 printf("HEADER says packet type is %d\n", header
.packetType
);
198 char *buffer
= (char*) malloc(header
.packetLength
);
199 numbytes
= os::recv(fd
,buffer
,header
.packetLength
,0);
200 if (numbytes
== -1) {
201 printError(ErrOS
, "Error reading from socket\n");
205 SqlPacketResultSet
*rspkt
= new SqlPacketResultSet();
206 rspkt
->setBuffer(buffer
);
207 rspkt
->setProjList(bindList
);
208 rspkt
->noProjs
= bindList
.size();
210 delete [] rspkt
->projValues
;
211 ptrToFirstField
= bindList
.get(1);
214 return ptrToFirstField
;
217 void* SqlNwStatement::fetch(DbRetVal
&ret
)
219 SqlNwConnection
*conn
= (SqlNwConnection
*)con
;
220 if (! conn
->isConOpen()) {
221 printError(ErrNoConnection
, "No connection present");
222 ret
= ErrNoConnection
;
225 if (!isPrepared
) return NULL
;
226 void *ptrToFirstField
= NULL
;
227 SqlPacketFetch
*pkt
= new SqlPacketFetch();
228 pkt
->stmtID
= getStmtID();
230 DbRetVal rv
= conn
->send(SQL_NW_PKT_FETCH
, pkt
->getMarshalledBuffer(), pkt
->getBufferSize());
232 printError(rv
, "Data could not be sent");
235 rv
= conn
->receive();
237 printError(rv
, "Unable to receive from Network");
240 ResponsePacket
*rpkt
= (ResponsePacket
*) ((TCPClient
*)conn
->nwClient
)->respPkt
;
241 char *ptr
= (char *) &rpkt
->retVal
;
242 if (*ptr
== 0) { delete pkt
; ret
= ErrPeerResponse
; return NULL
; }
243 if (*(ptr
+1) == 1) { delete pkt
; ret
= OK
; return NULL
; }
246 int fd
= ((TCPClient
*)(conn
->nwClient
))->sockfd
;
247 int numbytes
= os::recv(fd
, &header
, sizeof(PacketHeader
), 0);
248 if (numbytes
== -1) {
249 printError(ErrOS
, "Error reading from socket\n");
252 printf("HEADER says packet type is %d\n", header
.packetType
);
253 char *buffer
= (char*) malloc(header
.packetLength
);
254 numbytes
= os::recv(fd
,buffer
,header
.packetLength
,0);
255 if (numbytes
== -1) {
256 printError(ErrOS
, "Error reading from socket\n");
259 SqlPacketResultSet
*rspkt
= new SqlPacketResultSet();
260 rspkt
->setBuffer(buffer
);
261 rspkt
->setProjList(bindList
);
262 rspkt
->noProjs
= bindList
.size();
264 delete [] rspkt
->projValues
;
265 ptrToFirstField
= bindList
.get(1);
268 return ptrToFirstField
;
272 void* SqlNwStatement::fetchAndPrint(bool SQL
)
274 if (!isPrepared
) return NULL
;
275 void *ptrToFirstField
= NULL
;
277 return ptrToFirstField
;
280 void* SqlNwStatement::next()
285 DbRetVal
SqlNwStatement::close()
287 if (!isPrepared
) return OK
;
292 void* SqlNwStatement::getFieldValuePtr( int pos
)
294 BindSqlProjectField
*fld
=(BindSqlProjectField
*) bindList
.get(pos
+1);
298 int SqlNwStatement::noOfProjFields()
300 if (!isPrepared
) return 0;
305 int SqlNwStatement::noOfParamFields()
307 if (!isPrepared
) return 0;
312 DbRetVal
SqlNwStatement::getProjFldInfo (int projpos
, FieldInfo
*&fInfo
)
318 DbRetVal
SqlNwStatement::getParamFldInfo (int parampos
, FieldInfo
*&fInfo
)
324 DbRetVal
SqlNwStatement::free()
327 SqlNwConnection
*conn
= (SqlNwConnection
*)con
;
328 if (! conn
->isConOpen()) {
329 printError(ErrNoConnection
, "No connection present");
330 return ErrNoConnection
;
332 if (!isPrepared
) return OK
;
333 SqlPacketFree
*pkt
= new SqlPacketFree();
334 pkt
->stmtID
= getStmtID();
336 rv
= conn
->send(SQL_NW_PKT_FREE
, pkt
->getMarshalledBuffer(), pkt
->getBufferSize());
338 printError(rv
, "Data could not be sent");
341 rv
= conn
->receive();
342 if (rv
!= OK
) return rv
;
343 ResponsePacket
*rpkt
= (ResponsePacket
*) ((TCPClient
*)conn
->nwClient
)->respPkt
;
344 char *ptr
= (char *) &rpkt
->retVal
;
346 printf("there is some error\n");
347 return ErrPeerResponse
;
349 ListIterator itprm
= paramList
.getIterator();
350 BindSqlField
*fld
= NULL
;
351 while((fld
= (BindSqlField
*) itprm
.nextElement()) != NULL
) {
352 if (fld
->value
) ::free(fld
->value
); delete fld
;
355 ListIterator itprj
= bindList
.getIterator();
356 BindSqlProjectField
*pfld
= NULL
;
357 while((pfld
= (BindSqlProjectField
*) itprj
.nextElement()) != NULL
) {
366 // In all the following setXXXParam functions type and length fields are
367 // reinitialized to accommodate fix for MySQL bug #1382
368 // SQLDescribeParam returns the same type information
370 void SqlNwStatement::setShortParam(int paramPos
, short value
)
372 if (!isPrepared
) return;
373 if (paramPos
<= 0) return;
374 BindSqlField
*bindField
= (BindSqlField
*) paramList
.get(paramPos
);
375 bindField
->type
= typeShort
;
376 bindField
->length
= AllDataType::size(typeShort
);
377 *(short *) bindField
->value
= value
;
381 void SqlNwStatement::setIntParam(int paramPos
, int value
)
383 if (!isPrepared
) return ;
384 if (paramPos
<= 0) return;
385 BindSqlField
*bindField
= (BindSqlField
*) paramList
.get(paramPos
);
386 bindField
->type
= typeInt
;
387 bindField
->length
= AllDataType::size(typeInt
);
388 *(int *) bindField
->value
= value
;
392 void SqlNwStatement::setLongParam(int paramPos
, long value
)
394 if (!isPrepared
) return ;
395 if (paramPos
<= 0) return;
396 BindSqlField
*bindField
= (BindSqlField
*) paramList
.get(paramPos
);
397 bindField
->type
= typeLong
;
398 bindField
->length
= AllDataType::size(typeLong
);
399 *(long *) bindField
->value
= value
;
404 void SqlNwStatement::setLongLongParam(int paramPos
, long long value
)
406 if (!isPrepared
) return ;
407 if (paramPos
<= 0) return;
408 BindSqlField
*bindField
= (BindSqlField
*) paramList
.get(paramPos
);
409 bindField
->type
= typeLongLong
;
410 bindField
->length
= AllDataType::size(typeLongLong
);
411 *(long long *) bindField
->value
= value
;
415 void SqlNwStatement::setByteIntParam(int paramPos
, ByteInt value
)
417 if (!isPrepared
) return ;
418 if (paramPos
<= 0) return;
419 BindSqlField
*bindField
= (BindSqlField
*) paramList
.get(paramPos
);
420 bindField
->type
= typeByteInt
;
421 bindField
->length
= AllDataType::size(typeByteInt
);
422 *(ByteInt
*) bindField
->value
= value
;
426 void SqlNwStatement::setFloatParam(int paramPos
, float value
)
428 if (!isPrepared
) return ;
429 if (paramPos
<= 0) return;
430 BindSqlField
*bindField
= (BindSqlField
*) paramList
.get(paramPos
);
431 bindField
->type
= typeFloat
;
432 bindField
->length
= AllDataType::size(typeFloat
);
433 *(float *) bindField
->value
= value
;
437 void SqlNwStatement::setDoubleParam(int paramPos
, double value
)
439 if (!isPrepared
) return ;
440 if (paramPos
<= 0) return;
441 BindSqlField
*bindField
= (BindSqlField
*) paramList
.get(paramPos
);
442 bindField
->type
= typeDouble
;
443 bindField
->length
= AllDataType::size(typeDouble
);
444 *(double *) bindField
->value
= value
;
448 void SqlNwStatement::setStringParam(int paramPos
, char *value
)
450 if (!isPrepared
) return ;
451 if (paramPos
<= 0) return;
452 BindSqlField
*bindField
= (BindSqlField
*) paramList
.get(paramPos
);
453 bindField
->type
= typeString
;
454 strcpy((char *) bindField
->value
, value
);
458 void SqlNwStatement::setDateParam(int paramPos
, Date value
)
460 if (!isPrepared
) return ;
461 if (paramPos
<= 0) return;
462 BindSqlField
*bindField
= (BindSqlField
*) paramList
.get(paramPos
);
463 bindField
->type
= typeDate
;
464 bindField
->length
= AllDataType::size(typeDate
);
465 *(Date
*)bindField
->value
= value
;
469 void SqlNwStatement::setTimeParam(int paramPos
, Time value
)
471 if (!isPrepared
) return ;
472 if (paramPos
<= 0) return;
473 BindSqlField
*bindField
= (BindSqlField
*) paramList
.get(paramPos
);
474 bindField
->type
= typeTime
;
475 bindField
->length
= AllDataType::size(typeTime
);
476 * (Time
*) bindField
->value
= value
;
480 void SqlNwStatement::setTimeStampParam(int paramPos
, TimeStamp value
)
482 if (!isPrepared
) return ;
483 if (paramPos
<= 0) return;
484 BindSqlField
*bindField
= (BindSqlField
*) paramList
.get(paramPos
);
485 bindField
->type
= typeTimeStamp
;
486 bindField
->length
= AllDataType::size(typeTimeStamp
);
487 *(TimeStamp
*) bindField
->value
= value
;
491 void SqlNwStatement::setBinaryParam(int paramPos
, void *value
)
493 if (!isPrepared
) return;
494 if (paramPos
<= 0) return;
495 BindSqlField
*bindField
= (BindSqlField
*) paramList
.get(paramPos
);
496 bindField
->type
= typeBinary
;
497 memcpy(bindField
->value
, value
, 2 * bindField
->length
);
501 void SqlNwStatement::getPrimaryKeyFieldName(char *tablename
, char *pkfieldname
)
503 if (pkfieldname
== NULL
) return;