1 /***************************************************************************
2 * Copyright (C) 2007 by www.databasecache.com *
3 * Contact: praba_tuty@databasecache.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 ***************************************************************************/
20 #include <AbsSqlStatement.h>
31 enum NetworkPacketType
39 SQL_NW_PKT_EXECDIRECT
=100,
40 SQL_NW_PKT_CONNECT
=101,
41 SQL_NW_PKT_PREPARE
=102,
42 SQL_NW_PKT_PARAM_METADATA
=103,
43 SQL_NW_PKT_PROJ_METADATA
=104,
44 SQL_NW_PKT_EXECUTE
=105,
46 SQL_NW_PKT_RESULT_SET
=107,
47 SQL_NW_PKT_COMMIT
=108,
48 SQL_NW_PKT_ROLLBACK
=109,
50 SQL_NW_PKT_DISCONNECT
=111,
51 SQL_NW_PKT_SHOWTABLES
=112,
52 SQL_NW_PKT_ISTABLEPRESENT
=113,
53 SQL_NW_PKT_GETRECORDS
=114,
54 SQL_NW_PKT_LOADRECORDS
=115,
55 SQL_NW_PKT_LASTAIVAL
=116,
63 stmtID
= 0; retVal
= 0; errRetVal
= OK
; isSelect
= false; rows
=0;
64 lastAutoIncVal
=0; errorString
[0] = '\0';
67 int retVal
; // will include for fetch end flag, params flag, proj flag
72 char errorString
[ERROR_STRING_LENGTH
];
74 long lastAutoIncVal1
; //Added for VC Windows to work. For long long , it pads another 4 bytes to structure
76 DbRetVal
unmarshall();
81 char hostName
[IDENTIFIER_LENGTH
];
85 int responseTimeout
; //in secs
91 virtual DbRetVal
send( NetworkPacketType type
) =0;
92 virtual DbRetVal
send( NetworkPacketType type
, int stmtid
)=0;
93 virtual DbRetVal
send( NetworkPacketType type
, char *buf
, int len
)=0;
94 virtual DbRetVal
receive()=0;
95 virtual DbRetVal
connect()=0;
96 virtual DbRetVal
disconnect()=0;
97 virtual void * getResponsePacket()=0;
98 virtual ~NetworkClient(){}
99 void setHost(char *host
, int portno
, int nwid
)
101 strcpy(hostName
, host
);
105 int getNetworkID() { return networkid
; }
106 void setConnectionTimeout(int timeout
) { connectTimeout
=timeout
;}
107 void setResponseTimeout(int timeout
) { responseTimeout
=timeout
;}
108 void setEntryption(bool encr
) { encrypt
=encr
;}
109 void setConnectFlag(bool flag
) { isConnectedFlag
=flag
;}
110 bool isConnected() { return isConnectedFlag
; }
111 void setIsConnectedFlag(bool fl
) { isConnectedFlag
= fl
; }
112 void setCacheClient() { cacheClient
= true; }
113 bool isCacheClient() { return cacheClient
; }
115 class UDPClient
: public NetworkClient
{
118 struct sockaddr_in srvAddr
;
119 struct sockaddr_in fromAddr
;
120 UDPClient(){ isConnectedFlag
=false; cacheClient
= false;}
121 DbRetVal
send(NetworkPacketType type
);
122 DbRetVal
send(NetworkPacketType type
,int stmtid
);
123 DbRetVal
send(NetworkPacketType type
, char *buf
, int len
);
126 DbRetVal
disconnect();
127 void * getResponsePacket() { return NULL
; }
131 class TCPClient
: public NetworkClient
{
137 struct sockaddr_in srvAddr
;
138 ResponsePacket
*respPkt
;
139 PacketHeader
*pktHdr
;
141 DbRetVal
send(NetworkPacketType type
);
142 DbRetVal
send(NetworkPacketType type
, int stmtid
);
143 DbRetVal
send(NetworkPacketType type
, char *buf
, int len
);
146 DbRetVal
disconnect();
147 void * getResponsePacket() { return respPkt
; }
157 NetworkClient
* nwClient
;
159 NetworkTable() { nwClient
= NULL
; }
161 DbRetVal
initialize();
163 DbRetVal
readNetworkConfig();
164 NetworkClient
* getetworkClient() { return nwClient
; }
166 DbRetVal
disconnect();
167 DbRetVal
connectIfNotConnected();
172 static NetworkClient
* createClient(NetworkMode mode
)
174 NetworkClient
* client
= NULL
;
178 client
= new UDPClient();
181 client
= new TCPClient();
196 /*class SqlPacketHeader
204 //TOTOD:: bool encrypt;
207 NetworkPacketType pktType
;
209 //should be called after successful marshall call
210 char* getMarshalledBuffer(){ return buffer
; }
211 int getBufferSize() { return bufferSize
; }
212 void setBuffer(char *buf
) { buffer
= buf
; }
213 void setBufferSize(int bufSize
) { bufferSize
= bufSize
; }
215 virtual DbRetVal
marshall()=0;
216 virtual DbRetVal
unmarshall()=0;
217 virtual ~BasePacket(){};
219 class PacketPrepare
:public BasePacket
222 PacketPrepare() { buffer
=NULL
; bufferSize
=0; noParams
= 0; stmtString
= NULL
;
223 stmtID
= 0; stmtLength
= 0; type
= NULL
; length
= NULL
;
224 pktType
= NW_PKT_PREPARE
;}
225 ~PacketPrepare() { free(buffer
); bufferSize
= 0; buffer
= NULL
; }
234 DbRetVal
unmarshall();
236 class PacketFree
: public BasePacket
239 PacketFree() { buffer
=NULL
; bufferSize
=0; stmtID
= 0; pktType
= NW_PKT_FREE
;}
240 ~PacketFree() { free(buffer
); bufferSize
= 0; buffer
= NULL
; }
243 DbRetVal
unmarshall();
246 class PacketExecute
: public BasePacket
249 PacketExecute() { buffer
=NULL
; bufferSize
=0;
250 stmtID
= 0; noParams
= 0; paramValues
= NULL
;
251 pktType
= NW_PKT_EXECUTE
;}
252 ~PacketExecute() { free(buffer
); bufferSize
= 0; buffer
= NULL
; }
253 //TODO::need to free paramvalues based on marshall or unmarshall
262 void setStatementList(List stmtlist
);
263 void setParams(List list
);
266 DbRetVal
unmarshall();
268 class PacketCommit
: public BasePacket
271 PacketCommit() { txnID
=0; noOfStmts
= 0; stmtBufSize
= NULL
; stmtBuffer
= NULL
;
272 buffer
= NULL
; bufferSize
= 0; pktType
= NW_PKT_COMMIT
; }
273 ~PacketCommit() { free(buffer
); bufferSize
= 0; buffer
= NULL
; }
278 void setExecPackets(int tid
, List list
);
279 void getExecPacketList(List stmtList
, List
&list
);
281 DbRetVal
unmarshall();
284 class SqlPacketConnect
: public BasePacket
289 strcpy(userName
, "");
290 strcpy(passWord
, "");
293 pktType
= SQL_NW_PKT_CONNECT
;
295 ~SqlPacketConnect() { free(buffer
); bufferSize
= 0; buffer
= NULL
;
297 char userName
[IDENTIFIER_LENGTH
];
298 char passWord
[IDENTIFIER_LENGTH
];
300 void setConnParam(char *user
, char *pass
, char tp
)
302 strcpy(userName
, user
);
303 strcpy(passWord
, pass
);
307 DbRetVal
unmarshall();
310 class SqlPacketPrepare
: public BasePacket
314 { buffer
=NULL
; bufferSize
=0;
315 stmtString
= NULL
; stmtLength
= 0; pktType
= SQL_NW_PKT_PREPARE
; }
316 ~SqlPacketPrepare() { free(buffer
); bufferSize
= 0; buffer
= NULL
; }
320 DbRetVal
unmarshall();
323 class SqlPacketExecute
: public BasePacket
328 //TODO::need to free paramvalues based on marshall or unmarshall
337 char *localBuf
[10]; //to store paramValues if noParams <10
339 void setStatementList(List stmtlist
);
340 void setParams(List list
);
341 void setNullInfo(char *nInfo
) { nullInfo
= nInfo
; }
342 char *getNullInfo() { return nullInfo
; }
344 DbRetVal
unmarshall();
347 class SqlPacketParamMetadata
: public BasePacket
350 SqlPacketParamMetadata()
351 { buffer
=NULL
; bufferSize
=0; noParams
= 0;
352 stmtID
= 0; data
= NULL
; pktType
= SQL_NW_PKT_PARAM_METADATA
;}
353 ~SqlPacketParamMetadata() { free(buffer
); bufferSize
= 0; buffer
= NULL
; }
358 DbRetVal
unmarshall();
361 class SqlPacketProjMetadata
: public BasePacket
364 SqlPacketProjMetadata() { buffer
=NULL
; bufferSize
=0; noProjs
= 0;
365 data
= NULL
; stmtID
= 0; pktType
= SQL_NW_PKT_PROJ_METADATA
; }
366 ~SqlPacketProjMetadata() { free(buffer
); bufferSize
= 0; buffer
= NULL
; }
371 DbRetVal
unmarshall();
374 class SqlPacketFetch
: public BasePacket
377 SqlPacketFetch() { buffer
=NULL
; bufferSize
= 0;
378 stmtID
= 0; pktType
= SQL_NW_PKT_FETCH
; }
379 ~SqlPacketFetch() { free(buffer
); bufferSize
= 0; buffer
= NULL
; }
382 DbRetVal
unmarshall();
385 class SqlPacketFree
: public BasePacket
388 SqlPacketFree() { buffer
=NULL
; stmtID
=0;bufferSize
= 0;
389 pktType
= SQL_NW_PKT_FREE
; }
390 ~SqlPacketFree() { free(buffer
); bufferSize
= 0; buffer
= NULL
; }
393 DbRetVal
unmarshall();
396 class SqlPacketResultSet
: public BasePacket
399 SqlPacketResultSet() { buffer
=NULL
; bufferSize
= 0; noProjs
= 0;
400 nullInfo
= NULL
; projValues
=NULL
;
401 hasData
=0; nullInfoLen
=0;
402 pktType
= SQL_NW_PKT_RESULT_SET
; }
403 ~SqlPacketResultSet() { free(buffer
);
404 bufferSize
= 0; buffer
= NULL
;
405 if (projValues
) delete[] projValues
;
413 void setNullInfo(char *info
){ nullInfo
= info
; }
414 void setProjList(List list
);
416 DbRetVal
unmarshall();
419 class SqlPacketShowTables
: public BasePacket
422 SqlPacketShowTables() { buffer
= NULL
; bufferSize
= 0; data
= NULL
;
423 numOfTables
=0; pktType
= SQL_NW_PKT_SHOWTABLES
; }
424 ~SqlPacketShowTables() { free(buffer
); bufferSize
= 0; buffer
= NULL
; }
428 DbRetVal
unmarshall();
431 class SqlPacketIsTablePresent
: public BasePacket
434 SqlPacketIsTablePresent() { buffer
= NULL
; bufferSize
= 0;
435 tblName
[0] = '\0'; pktType
= SQL_NW_PKT_ISTABLEPRESENT
; }
436 ~SqlPacketIsTablePresent() { free(buffer
); bufferSize
= 0; buffer
= NULL
; }
437 char tblName
[IDENTIFIER_LENGTH
];
438 void setTableName(char *tName
) { strcpy(tblName
, tName
); }
440 DbRetVal
unmarshall();
443 class SqlPacketGetRecords
: public BasePacket
446 SqlPacketGetRecords() { buffer
= NULL
; bufferSize
= 0; pages
=0;
447 tblName
[0] = '\0'; pktType
= SQL_NW_PKT_GETRECORDS
; }
448 ~SqlPacketGetRecords() { free(buffer
); bufferSize
= 0; buffer
= NULL
; }
449 char tblName
[IDENTIFIER_LENGTH
];
451 void setTableName(char *tName
) { strcpy(tblName
, tName
); }
452 void setPages(int pgs
) { pages
= pgs
; }
454 DbRetVal
unmarshall();
457 class SqlPacketLoadRecords
: public BasePacket
460 SqlPacketLoadRecords() { buffer
= NULL
; bufferSize
= 0; pages
= 0;
461 pktType
= SQL_NW_PKT_LOADRECORDS
; }
462 ~SqlPacketLoadRecords() { free(buffer
); bufferSize
= 0; buffer
= NULL
; }
464 void setPages(int pgs
) { pages
= pgs
; }
466 DbRetVal
unmarshall();
475 AbsSqlStatement
*stmt
;
478 List tableNamesList
; // will be populated only for show tables query
479 NetworkStmt() { srcNetworkID
=0; stmtID
=0; stmt
=NULL
; type
= UnknownStatement
; }
488 NetworkServer() { port
=0; sockfd
= -1;}
489 void setServerPort(int p
) { port
= p
; }
490 int getSocket(){ return sockfd
; }
491 virtual DbRetVal
start()=0;
492 virtual DbRetVal
stop()=0;
493 virtual DbRetVal
handleClient()=0;
496 class UDPServer
: public NetworkServer
498 struct sockaddr_in clientAddress
;
500 UDPServer() { port
= 0; sockfd
= -1; }
503 DbRetVal
handleClient();
506 class TCPServer
: public NetworkServer
509 struct sockaddr_in clientAddress
;
511 TCPServer() { port
= 0; sockfd
= -1; clientfd
= -1;}
514 DbRetVal
handleClient();