From f107ae923577a4bc792f765d1f3bfac51274547c Mon Sep 17 00:00:00 2001 From: kishoramballi Date: Sat, 22 Nov 2008 21:34:25 +0000 Subject: [PATCH] free Packet added. Select works for integers. There are some bugs regarding other datatypes. --- include/Network.h | 14 +++++++++- include/SqlNetworkHandler.h | 1 + src/network/NetworkPacket.cxx | 19 +++++++++++-- src/network/SqlNetworkHandler.cxx | 57 ++++++++++++++++++++++++++++++++++----- src/network/TCPServer.cxx | 2 +- src/sqlnetwork/SqlNwStatement.cxx | 48 ++++++++++++++++++++++++++++----- 6 files changed, 123 insertions(+), 18 deletions(-) diff --git a/include/Network.h b/include/Network.h index 5d8b3f42..5e1ff30e 100644 --- a/include/Network.h +++ b/include/Network.h @@ -48,7 +48,8 @@ enum NetworkPacketType SQL_NW_PKT_RESULT_SET=107, SQL_NW_PKT_COMMIT=108, SQL_NW_PKT_ROLLBACK=109, - SQL_NW_PKT_DISCONNECT=110, + SQL_NW_PKT_FREE=110, + SQL_NW_PKT_DISCONNECT=111, }; class ResponsePacket @@ -345,6 +346,17 @@ class SqlPacketFetch : public BasePacket DbRetVal unmarshall(); }; +class SqlPacketFree : public BasePacket +{ + public: + SqlPacketFree() { buffer=NULL; bufferSize = 0; + pktType = SQL_NW_PKT_FREE; } + ~SqlPacketFree() { free(buffer); bufferSize = 0; buffer = NULL; } + int stmtID; + DbRetVal marshall(); + DbRetVal unmarshall(); +}; + class SqlPacketResultSet : public BasePacket { public: diff --git a/include/SqlNetworkHandler.h b/include/SqlNetworkHandler.h index ec4d2e4a..552b4618 100644 --- a/include/SqlNetworkHandler.h +++ b/include/SqlNetworkHandler.h @@ -40,6 +40,7 @@ class SqlNetworkHandler void * processSqlPrepare(PacketHeader &header, char *buffer); void * processSqlExecute(PacketHeader &header, char *buffer); void * processSqlFetch(PacketHeader &header, char *buffer); + void * processSqlFree(PacketHeader &header, char *buffer); void * processSqlCommit(PacketHeader &header, char *buffer); void * processSqlRollback(PacketHeader &header, char *buffer); void * processPrepare(PacketHeader &header, char *buffer); diff --git a/src/network/NetworkPacket.cxx b/src/network/NetworkPacket.cxx index d01e3e49..3ccfa446 100644 --- a/src/network/NetworkPacket.cxx +++ b/src/network/NetworkPacket.cxx @@ -288,7 +288,7 @@ DbRetVal SqlPacketPrepare::marshall() printDebug(DM_Network, "Buffer size %d\n", bufferSize); printDebug(DM_Network, "stmt %s size %d\n", stmtString, strlen(stmtString)); buffer = (char*) malloc(bufferSize); - *(int*)buffer = strlen(stmtString); + *(int*)buffer = strlen(stmtString) + 1; char *bufIter = buffer + sizeof(int); strcpy(bufIter, stmtString); printDebug(DM_Network, "PacketPrepare::marshall ended\n"); @@ -303,7 +303,7 @@ DbRetVal SqlPacketPrepare::unmarshall() char *bufIter = buffer + sizeof(int); stmtString = bufIter; printDebug(DM_Network, "stmtString ptr is %x\n", stmtString); - stmtString[stmtLength+1] = '\0'; + stmtString[stmtLength] = '\0'; printDebug(DM_Network, "PacketPrepare::unmarshall ended\n"); return OK; } @@ -476,6 +476,19 @@ DbRetVal SqlPacketFetch::unmarshall() stmtID = *(int *)buffer; } +DbRetVal SqlPacketFree::marshall() +{ + bufferSize = sizeof(int); + buffer = (char*) malloc(bufferSize); + *(int*)buffer = stmtID; + return OK; +} + +DbRetVal SqlPacketFree::unmarshall() +{ + stmtID = *(int *)buffer; +} + DbRetVal SqlPacketResultSet::marshall() { bufferSize = sizeof(int)+ sizeof(int); @@ -495,6 +508,7 @@ DbRetVal SqlPacketResultSet::marshall() prjFld = (BindSqlProjectField*) projList.get(i+1); AllDataType::copyVal(bufIter, prjFld->value, prjFld->type, prjFld->length); bufIter = bufIter + AllDataType::size(prjFld->type, prjFld->length); + } return OK; } @@ -514,6 +528,7 @@ DbRetVal SqlPacketResultSet::unmarshall() prjFld = (BindSqlProjectField*) projList.get(i+1); AllDataType::copyVal(prjFld->value, projValues[i], prjFld->type, prjFld->length); bufIter = bufIter + AllDataType::size(prjFld->type, prjFld->length); + } return OK; } diff --git a/src/network/SqlNetworkHandler.cxx b/src/network/SqlNetworkHandler.cxx index 352b44e0..6a2a22c4 100644 --- a/src/network/SqlNetworkHandler.cxx +++ b/src/network/SqlNetworkHandler.cxx @@ -34,6 +34,9 @@ int SqlNetworkHandler::stmtID; void *SqlNetworkHandler::process(PacketHeader &header, char *buffer) { + DbRetVal rv = OK; + char *ptr = NULL; + ResponsePacket *rpkt = NULL; switch(header.packetType) { // case NW_PKT_PREPARE: @@ -62,12 +65,15 @@ void *SqlNetworkHandler::process(PacketHeader &header, char *buffer) break; case SQL_NW_PKT_DISCONNECT: conn->rollback(); - DbRetVal rv = conn->disconnect(); - ResponsePacket *rpkt = new ResponsePacket(); - char * ptr = (char *) &rpkt->retVal; + rv = conn->disconnect(); + rpkt = new ResponsePacket(); + ptr = (char *) &rpkt->retVal; *ptr = 1; strcpy(rpkt->errorString, "Success"); return rpkt; + case SQL_NW_PKT_FREE: + return processSqlFree(header, buffer); + break; } } @@ -130,7 +136,7 @@ void* SqlNetworkHandler::processSqlPrepare(PacketHeader &header, char *buffer) bindField->type = fInfo->type; bindField->length = fInfo->length; bindField->value = AllDataType::alloc(bindField->type, bindField->length); - nwStmt->paramList.append(bindField); + nwStmt->paramList.append(bindField); } delete fInfo; fInfo = new FieldInfo(); @@ -168,7 +174,7 @@ void * SqlNetworkHandler::processSqlExecute(PacketHeader &header, char *buffer) while (stmtIter.hasElement()) { stmt = (NetworkStmt*) stmtIter.nextElement(); - //TODO::Also check teh srcNetworkID + //TODO::Also check the srcNetworkID if (stmt->stmtID == pkt->stmtID ) break; } AbsSqlStatement *sqlstmt = stmt->stmt; @@ -187,6 +193,7 @@ void * SqlNetworkHandler::processSqlExecute(PacketHeader &header, char *buffer) strcpy(rpkt->errorString, "Success"); return rpkt; } + void * SqlNetworkHandler::processSqlFetch(PacketHeader &header, char *buffer) { ResponsePacket *rpkt = new ResponsePacket(); @@ -212,7 +219,7 @@ void * SqlNetworkHandler::processSqlFetch(PacketHeader &header, char *buffer) } void *data=NULL; DbRetVal rv = OK; - if ((data = sqlstmt->fetch(rv)) != NULL) { + if ((data = sqlstmt->fetch(rv)) != NULL && rv == OK) { *retval = 1; strcpy(rpkt->errorString, "Success"); return rpkt; @@ -220,7 +227,7 @@ void * SqlNetworkHandler::processSqlFetch(PacketHeader &header, char *buffer) if (data == NULL && rv == OK) { *retval = 1; *(retval + 1) = 1; - strcpy(rpkt->errorString, "Success"); + strcpy(rpkt->errorString, "Success fetch completed"); return rpkt; } else { @@ -230,6 +237,42 @@ void * SqlNetworkHandler::processSqlFetch(PacketHeader &header, char *buffer) } } +void * SqlNetworkHandler::processSqlFree(PacketHeader &header, char *buffer) +{ + ResponsePacket *rpkt = new ResponsePacket(); + char *retval = (char *) &rpkt->retVal; + SqlPacketFetch *pkt = new SqlPacketFetch(); + pkt->setBuffer(buffer); + pkt->unmarshall(); + rpkt->stmtID = pkt->stmtID; + ListIterator stmtIter = stmtList.getIterator(); + NetworkStmt *stmt; + while (stmtIter.hasElement()) + { + stmt = (NetworkStmt*) stmtIter.nextElement(); + //TODO::Also check teh srcNetworkID + if (stmt->stmtID == pkt->stmtID ) break; + } + AbsSqlStatement *sqlstmt = stmt->stmt; + sqlstmt->free(); + ListIterator itprm = stmt->paramList.getIterator(); + BindSqlField *fld = NULL; + while((fld = (BindSqlField *) itprm.nextElement()) != NULL) delete fld; + stmt->paramList.reset(); + ListIterator itprj = stmt->projList.getIterator(); + BindSqlProjectField *pfld = NULL; + while((pfld = (BindSqlProjectField *) itprj.nextElement()) != NULL) { + if(pfld->value) { free(pfld->value); } + delete pfld; + } + stmt->projList.reset(); + stmtList.remove(stmt); + *retval = 1; + strcpy(rpkt->errorString, "Success"); + return rpkt; +} + + void * SqlNetworkHandler::processSqlCommit(PacketHeader &header, char *buffer) { ResponsePacket *rpkt = new ResponsePacket(); diff --git a/src/network/TCPServer.cxx b/src/network/TCPServer.cxx index 586c9a33..5479f69e 100644 --- a/src/network/TCPServer.cxx +++ b/src/network/TCPServer.cxx @@ -132,7 +132,7 @@ DbRetVal TCPServer::handleClient() stmt = (NetworkStmt*) stmtIter.nextElement(); if (stmt->stmtID == prmpkt->stmtID) break; } - prmpkt->noParams = params; + prmpkt->noParams = stmt->paramList.size(); rv = prmpkt->marshall(); if (rv != OK) { printf("marshall failed\n"); diff --git a/src/sqlnetwork/SqlNwStatement.cxx b/src/sqlnetwork/SqlNwStatement.cxx index 79ff7d19..d615e983 100644 --- a/src/sqlnetwork/SqlNwStatement.cxx +++ b/src/sqlnetwork/SqlNwStatement.cxx @@ -28,6 +28,7 @@ DbRetVal SqlNwStatement::prepare(char *stmtstr) printError(ErrNoConnection, "No connection present"); return ErrNoConnection; } + //if (isPrepared) free(); SqlPacketPrepare *pkt = new SqlPacketPrepare(); pkt->stmtString = stmtstr; pkt->stmtLength = strlen(stmtstr) + 1; @@ -236,10 +237,9 @@ void* SqlNwStatement::fetch(DbRetVal &ret) } ResponsePacket *rpkt = (ResponsePacket *) ((TCPClient *)conn->nwClient)->respPkt; char *ptr = (char *) &rpkt->retVal; - if (*(ptr+1) == 1) { - ret = OK; - return NULL; - } + if (*ptr == 0) { ret = ErrPeerResponse; return NULL; } + if (*(ptr+1) == 1) { ret = OK; return NULL; } + PacketHeader header; int fd = ((TCPClient *)(conn->nwClient))->sockfd; int numbytes = os::recv(fd, &header, sizeof(PacketHeader), 0); @@ -317,13 +317,47 @@ DbRetVal SqlNwStatement::getParamFldInfo (int parampos, FieldInfo *&fInfo) DbRetVal SqlNwStatement::free() { - //TODO - return OK; + DbRetVal rv = OK; + SqlNwConnection *conn = (SqlNwConnection*)con; + if (! conn->isConOpen()) { + printError(ErrNoConnection, "No connection present"); + return ErrNoConnection; + } + if (!isPrepared) return OK; + SqlPacketFree *pkt = new SqlPacketFree(); + pkt->stmtID = getStmtID(); + pkt->marshall(); + rv = conn->send(SQL_NW_PKT_FREE, pkt->getMarshalledBuffer(), pkt->getBufferSize()); + if (rv != OK) { + printError(rv, "Data could not be sent"); + return rv; + } + rv = conn->receive(); + if (rv != OK) return rv; + ResponsePacket *rpkt = (ResponsePacket *) ((TCPClient *)conn->nwClient)->respPkt; + char *ptr = (char *) &rpkt->retVal; + if (*ptr != 1) { + printf("there is some error\n"); + return ErrPeerResponse; + } + ListIterator itprm = paramList.getIterator(); + BindSqlField *fld = NULL; + while((fld = (BindSqlField *) itprm.nextElement()) != NULL) { + delete fld; + } + paramList.reset(); + ListIterator itprj = bindList.getIterator(); + BindSqlProjectField *pfld = NULL; + while((pfld = (BindSqlProjectField *) itprj.nextElement()) != NULL) { + delete pfld; + } + bindList.reset(); + return rv; } void SqlNwStatement::setShortParam(int paramPos, short value) { - if (!isPrepared) return ; + if (!isPrepared) return; if (paramPos <= 0) return; BindSqlField *bindField = (BindSqlField *) paramList.get(paramPos); *(short *) bindField->value = value; -- 2.11.4.GIT