From fef6f3cbb758980a0ce38f5774ae4cd842c7cb77 Mon Sep 17 00:00:00 2001 From: kishoramballi Date: Sun, 8 Feb 2009 16:36:03 +0000 Subject: [PATCH] getParamInfo and getProjInfo implemented. --- include/AbsSqlStatement.h | 13 +++ include/Network.h | 12 ++- include/SqlNwStatement.h | 2 + src/network/NetworkPacket.cxx | 183 +++++++++++++++++++++++++++++++------- src/network/SqlNetworkHandler.cxx | 16 +++- src/sqlnetwork/SqlNwStatement.cxx | 95 +++++++++++++++----- 6 files changed, 258 insertions(+), 63 deletions(-) diff --git a/include/AbsSqlStatement.h b/include/AbsSqlStatement.h index 6e86f7cd..4fc646d5 100644 --- a/include/AbsSqlStatement.h +++ b/include/AbsSqlStatement.h @@ -240,8 +240,15 @@ class AbsSqlStatement class BindSqlField { public: + char fName[IDENTIFIER_LENGTH]; DataType type; int length; + int offset; + char defaultValueBuf[DEFAULT_VALUE_BUF_LENGTH]; + bool isNull; + bool isPrimary; + bool isDefault; + bool isUnique; void *value; void *targetvalue; BindSqlField(){ value = NULL; targetvalue = NULL; } @@ -253,6 +260,12 @@ class BindSqlProjectField char fName[IDENTIFIER_LENGTH]; DataType type; int length; + int offset; + char defaultValueBuf[DEFAULT_VALUE_BUF_LENGTH]; + bool isNull; + bool isPrimary; + bool isDefault; + bool isUnique; void *value; void *targetvalue; BindSqlProjectField(){ value = NULL; targetvalue = NULL; } diff --git a/include/Network.h b/include/Network.h index c36d097f..834924ab 100644 --- a/include/Network.h +++ b/include/Network.h @@ -312,13 +312,12 @@ class SqlPacketParamMetadata : public BasePacket { public: SqlPacketParamMetadata() - { buffer=NULL; bufferSize =0; noParams = 0; - type = NULL; length = NULL; pktType = SQL_NW_PKT_PARAM_METADATA;} + { buffer=NULL; bufferSize =0; noParams = 0; + data = NULL; pktType = SQL_NW_PKT_PARAM_METADATA;} ~SqlPacketParamMetadata() { free(buffer); bufferSize = 0; buffer = NULL; } int stmtID; int noParams; - int *type; - int *length; + void *data; DbRetVal marshall(); DbRetVal unmarshall(); }; @@ -327,12 +326,11 @@ class SqlPacketProjMetadata : public BasePacket { public: SqlPacketProjMetadata() { buffer=NULL; bufferSize =0; noProjs = 0; - type = NULL; length = NULL; pktType = SQL_NW_PKT_PROJ_METADATA; } + data = NULL; pktType = SQL_NW_PKT_PROJ_METADATA; } ~SqlPacketProjMetadata() { free(buffer); bufferSize = 0; buffer = NULL; } int stmtID; int noProjs; - int *type; - int *length; + void *data; DbRetVal marshall(); DbRetVal unmarshall(); }; diff --git a/include/SqlNwStatement.h b/include/SqlNwStatement.h index 8efc7126..0a527aee 100644 --- a/include/SqlNwStatement.h +++ b/include/SqlNwStatement.h @@ -81,7 +81,9 @@ class SqlNwStatement: public AbsSqlStatement bool isSel; int stmtID; List paramList; + int noOfParams; List bindList; + int noOfProjs; friend class SqlFactory; }; diff --git a/src/network/NetworkPacket.cxx b/src/network/NetworkPacket.cxx index 0e131df6..764be08d 100644 --- a/src/network/NetworkPacket.cxx +++ b/src/network/NetworkPacket.cxx @@ -393,7 +393,7 @@ DbRetVal SqlPacketParamMetadata::marshall() printDebug(DM_Network, "NOOFPARAMS %d buffer size %d\n", noParams, bufferSize); printDebug(DM_Network, "noParams is %d\n", noParams); if (noParams >0) - bufferSize = bufferSize + 2 * sizeof(int) * noParams; + bufferSize = bufferSize + sizeof(FieldInfo) * noParams; buffer = (char*) malloc(bufferSize); *(int*)buffer = stmtID; char *bufIter = buffer + sizeof(int); @@ -406,16 +406,22 @@ DbRetVal SqlPacketParamMetadata::marshall() stmt = (NetworkStmt*) stmtIter.nextElement(); if (stmt->stmtID == stmtID ) break; } + FieldInfo *fldInfo = new FieldInfo(); for (int i=0; i paramList.get(i+1); - *(int *) bufIter = bindField->type; - bufIter = bufIter + sizeof(int); - } - for (int i=0; i paramList.get(i+1); - *(int *) bufIter = bindField->length; - bufIter = bufIter + sizeof(int); - } + strcpy(fldInfo->fldName, bindField->fName); + fldInfo->type = bindField->type; + fldInfo->length = bindField->length; + fldInfo->offset = bindField->offset; + fldInfo->isNull = bindField->isNull; + fldInfo->isPrimary = bindField->isPrimary; + fldInfo->isDefault = bindField->isDefault; + fldInfo->isUnique = bindField->isUnique; + strcpy(fldInfo->defaultValueBuf, bindField->defaultValueBuf); + *(FieldInfo *) bufIter = *fldInfo; + bufIter += sizeof(FieldInfo); + } + delete fldInfo; printDebug(DM_Network, "SqlPacketParamMetadata::marshall ended\n"); return OK; } @@ -428,12 +434,7 @@ DbRetVal SqlPacketParamMetadata::unmarshall() char *bufIter = buffer + sizeof (int); noParams = *(int*)bufIter; bufIter = bufIter + sizeof(int); - if(noParams > 0) { - type = (int*) bufIter; - bufIter = bufIter + sizeof(int) * noParams; - length = (int*) bufIter; - bufIter = bufIter + sizeof(int) * noParams; - } + if(noParams > 0) data = bufIter; printDebug(DM_Network, "SqlPacketParamMetadata::unmarshall ended\n"); return OK; } @@ -445,7 +446,7 @@ DbRetVal SqlPacketProjMetadata::marshall() printDebug(DM_Network, "NOOFPROJS %d buffer size %d\n", noProjs, bufferSize); printDebug(DM_Network, "noParams is %d\n", noProjs); if (noProjs >0) - bufferSize = bufferSize + 2 * sizeof(int) * noProjs; + bufferSize = bufferSize + sizeof(FieldInfo) * noProjs; buffer = (char*) malloc(bufferSize); *(int*)buffer = stmtID; char *bufIter = buffer + sizeof(int); @@ -458,17 +459,23 @@ DbRetVal SqlPacketProjMetadata::marshall() stmt = (NetworkStmt*) stmtIter.nextElement(); if (stmt->stmtID == stmtID ) break; } - for (int i=0; i projList.get(i+1); - *(int *) bufIter = prjFld->type; - bufIter = bufIter + sizeof(int); + FieldInfo *fldInfo = new FieldInfo(); + for (int i=0; i < noProjs; i++) { + BindSqlProjectField *bindField = (BindSqlProjectField*) stmt->projList.get(i+1); + strcpy(fldInfo->fldName, bindField->fName); + fldInfo->type = bindField->type; + fldInfo->length = bindField->length; + fldInfo->offset = bindField->offset; + fldInfo->isNull = bindField->isNull; + fldInfo->isPrimary = bindField->isPrimary; + fldInfo->isDefault = bindField->isDefault; + fldInfo->isUnique = bindField->isUnique; + strcpy(fldInfo->defaultValueBuf, bindField->defaultValueBuf); + *(FieldInfo *) bufIter = *fldInfo; + bufIter += sizeof(FieldInfo); } - for (int i=0; i projList.get(i+1); - *(int *) bufIter = prjFld->length; - bufIter = bufIter + sizeof(int); - } - printDebug(DM_Network, "SqlPacketProjMetadata::marshall ended\n"); + delete fldInfo; + printDebug(DM_Network, "SqlPacketParamMetadata::marshall ended\n"); return OK; } @@ -480,12 +487,7 @@ DbRetVal SqlPacketProjMetadata::unmarshall() char *bufIter = buffer + sizeof (int); noProjs = *(int*)bufIter; bufIter = bufIter + sizeof(int); - if(noProjs > 0) { - type = (int*) bufIter; - bufIter = bufIter + sizeof(int) * noProjs; - length = (int*) bufIter; - bufIter = bufIter + sizeof(int) * noProjs; - } + if(noProjs > 0) data = bufIter; printDebug(DM_Network, "SqlPacketProjMetadata::unmarshall ended\n"); return OK; } @@ -556,3 +558,120 @@ DbRetVal SqlPacketResultSet::unmarshall() } return OK; } + + + + + + +/* + + + + +DbRetVal SqlPacketParamMetadata::marshall() +{ + printDebug(DM_Network, "SqlPacketParamMetadata::marshall called\n"); + bufferSize = sizeof(int) * 2; + printDebug(DM_Network, "NOOFPARAMS %d buffer size %d\n", noParams, bufferSize); + printDebug(DM_Network, "noParams is %d\n", noParams); + if (noParams >0) + bufferSize = bufferSize + 2 * sizeof(int) * noParams; + buffer = (char*) malloc(bufferSize); + *(int*)buffer = stmtID; + char *bufIter = buffer + sizeof(int); + *(int*)bufIter = noParams; + bufIter = bufIter + sizeof(int); + ListIterator stmtIter = SqlNetworkHandler::stmtList.getIterator(); + NetworkStmt *stmt; + while (stmtIter.hasElement()) + { + stmt = (NetworkStmt*) stmtIter.nextElement(); + if (stmt->stmtID == stmtID ) break; + } + for (int i=0; i paramList.get(i+1); + *(int *) bufIter = bindField->type; + bufIter = bufIter + sizeof(int); + } + for (int i=0; i paramList.get(i+1); + *(int *) bufIter = bindField->length; + bufIter = bufIter + sizeof(int); + } + printDebug(DM_Network, "SqlPacketParamMetadata::marshall ended\n"); + return OK; +} + +DbRetVal SqlPacketParamMetadata::unmarshall() +{ + printDebug(DM_Network, "SqlPacketParamMetadata::unmarshall called\n"); + stmtID = *(int*)buffer; + printDebug(DM_Network, "start of the buffer is %x\n", buffer); + char *bufIter = buffer + sizeof (int); + noParams = *(int*)bufIter; + bufIter = bufIter + sizeof(int); + if(noParams > 0) { + type = (int*) bufIter; + bufIter = bufIter + sizeof(int) * noParams; + length = (int*) bufIter; + bufIter = bufIter + sizeof(int) * noParams; + } + printDebug(DM_Network, "SqlPacketParamMetadata::unmarshall ended\n"); + return OK; +} + +DbRetVal SqlPacketProjMetadata::marshall() +{ + printDebug(DM_Network, "SqlPacketParamMetadata::marshall called\n"); + bufferSize = sizeof(int) * 2; + printDebug(DM_Network, "NOOFPROJS %d buffer size %d\n", noProjs, bufferSize); + printDebug(DM_Network, "noParams is %d\n", noProjs); + if (noProjs >0) + bufferSize = bufferSize + 2 * sizeof(int) * noProjs; + buffer = (char*) malloc(bufferSize); + *(int*)buffer = stmtID; + char *bufIter = buffer + sizeof(int); + *(int*)bufIter = noProjs; + bufIter = bufIter + sizeof(int); + ListIterator stmtIter = SqlNetworkHandler::stmtList.getIterator(); + NetworkStmt *stmt; + while (stmtIter.hasElement()) + { + stmt = (NetworkStmt*) stmtIter.nextElement(); + if (stmt->stmtID == stmtID ) break; + } + for (int i=0; i projList.get(i+1); + *(int *) bufIter = prjFld->type; + bufIter = bufIter + sizeof(int); + } + for (int i=0; i projList.get(i+1); + *(int *) bufIter = prjFld->length; + bufIter = bufIter + sizeof(int); + } + printDebug(DM_Network, "SqlPacketProjMetadata::marshall ended\n"); + return OK; +} + +DbRetVal SqlPacketProjMetadata::unmarshall() +{ + printDebug(DM_Network, "SqlPacketProjMetadata::unmarshall called\n"); + stmtID = *(int*)buffer; + printDebug(DM_Network, "start of the buffer is %x\n", buffer); + char *bufIter = buffer + sizeof (int); + noProjs = *(int*)bufIter; + bufIter = bufIter + sizeof(int); + if(noProjs > 0) { + type = (int*) bufIter; + bufIter = bufIter + sizeof(int) * noProjs; + length = (int*) bufIter; + bufIter = bufIter + sizeof(int) * noProjs; + } + printDebug(DM_Network, "SqlPacketProjMetadata::unmarshall ended\n"); + return OK; +} + + +*/ diff --git a/src/network/SqlNetworkHandler.cxx b/src/network/SqlNetworkHandler.cxx index 6f05a900..cae3e308 100644 --- a/src/network/SqlNetworkHandler.cxx +++ b/src/network/SqlNetworkHandler.cxx @@ -89,7 +89,7 @@ void * SqlNetworkHandler::processSqlConnect(PacketHeader &header, char *buffer) DbRetVal rv=conn->connect(pkt->userName, pkt->passWord); if (rv != OK) { *ptr = 0; - strcpy(rpkt->errorString, "Error:Connect failure"); + strcpy(rpkt->errorString, "User Authentication Failure"); return rpkt; printf("connection failure\n"); } @@ -133,8 +133,15 @@ void* SqlNetworkHandler::processSqlPrepare(PacketHeader &header, char *buffer) for (int i = 0; i < param; i++) { bindField = new BindSqlField(); sqlstmt->getParamFldInfo(i + 1, fInfo); + strcpy(bindField->fName, fInfo->fldName); bindField->type = fInfo->type; bindField->length = fInfo->length; + bindField->offset = fInfo->offset; + strcpy(bindField->defaultValueBuf, fInfo->defaultValueBuf); + bindField->isNull = fInfo->isNull; + bindField->isPrimary = fInfo->isPrimary; + bindField->isDefault = fInfo->isDefault; + bindField->isUnique = fInfo->isUnique; bindField->value = AllDataType::alloc(bindField->type, bindField->length); nwStmt->paramList.append(bindField); } @@ -143,8 +150,15 @@ void* SqlNetworkHandler::processSqlPrepare(PacketHeader &header, char *buffer) for (int i = 0; i < proj; i++) { projField = new BindSqlProjectField(); sqlstmt->getProjFldInfo(i + 1, fldInfo); + strcpy(projField->fName, fInfo->fldName); projField->type = fldInfo->type; projField->length = fldInfo->length; + projField->offset = fldInfo->offset; + strcpy(projField->defaultValueBuf, fldInfo->defaultValueBuf); + projField->isNull = fldInfo->isNull; + projField->isPrimary = fldInfo->isPrimary; + projField->isDefault = fldInfo->isDefault; + projField->isUnique = fldInfo->isUnique; projField->value = AllDataType::alloc(projField->type, projField->length); nwStmt->projList.append(projField); } diff --git a/src/sqlnetwork/SqlNwStatement.cxx b/src/sqlnetwork/SqlNwStatement.cxx index 99b06c65..130fc7ea 100644 --- a/src/sqlnetwork/SqlNwStatement.cxx +++ b/src/sqlnetwork/SqlNwStatement.cxx @@ -61,7 +61,7 @@ DbRetVal SqlNwStatement::prepare(char *stmtstr) printError(ErrOS, "Error reading from socket\n"); return ErrOS; } - printf("HEADER says packet type is %d\n", header.packetType); +// printf("HEADER says packet type is %d\n", header.packetType); buffer = (char*) malloc(header.packetLength); numbytes = os::recv(fd,buffer,header.packetLength,0); if (numbytes == -1) { @@ -71,15 +71,27 @@ DbRetVal SqlNwStatement::prepare(char *stmtstr) SqlPacketParamMetadata *mdpkt = new SqlPacketParamMetadata(); mdpkt->setBuffer(buffer); mdpkt->unmarshall(); + noOfParams = mdpkt->noParams; BindSqlField *bindField=NULL; - for (int i=0; i < mdpkt->noParams; i++) { + FieldInfo *fldInfo = new FieldInfo(); + char *ptr = (char *) mdpkt->data; + for (int i=0; i < noOfParams; i++) { + *fldInfo = *(FieldInfo *) ptr; bindField = new BindSqlField(); - bindField->type = (DataType) mdpkt->type[i]; - bindField->length = mdpkt->length[i]; - if (mdpkt->type[i] == typeBinary) + strcpy(bindField->fName, fldInfo->fldName); + bindField->type = fldInfo->type; + bindField->length = fldInfo->length; + bindField->offset = fldInfo->offset; + strcpy(bindField->defaultValueBuf, fldInfo->defaultValueBuf); + bindField->isNull = fldInfo->isNull; + bindField->isPrimary = fldInfo->isPrimary; + bindField->isDefault = fldInfo->isDefault; + bindField->isUnique = fldInfo->isUnique; + if (bindField->type == typeBinary) bindField->value = AllDataType::alloc(bindField->type, 2 * bindField->length); else bindField->value = AllDataType::alloc(bindField->type, bindField->length); paramList.append(bindField); + ptr += sizeof (FieldInfo); } delete mdpkt; } @@ -91,7 +103,7 @@ DbRetVal SqlNwStatement::prepare(char *stmtstr) printError(ErrOS, "Error reading from socket\n"); return ErrOS; } - printf("HEADER says packet type is %d\n", header.packetType); +// printf("HEADER says packet type is %d\n", header.packetType); buffer = (char*) malloc(header.packetLength); numbytes = os::recv(fd,buffer,header.packetLength,0); if (numbytes == -1) { @@ -101,13 +113,27 @@ DbRetVal SqlNwStatement::prepare(char *stmtstr) SqlPacketProjMetadata *prjmdpkt = new SqlPacketProjMetadata(); prjmdpkt->setBuffer(buffer); prjmdpkt->unmarshall(); + noOfProjs = prjmdpkt->noProjs; BindSqlProjectField *prjFld=NULL; - for (int i=0; i < prjmdpkt->noProjs; i++) { + FieldInfo *fldInfo = new FieldInfo(); + char *ptr = (char *) prjmdpkt->data; + for (int i=0; i < noOfProjs; i++) { + *fldInfo = *(FieldInfo *) ptr; prjFld = new BindSqlProjectField(); - prjFld->type = (DataType) prjmdpkt->type[i]; - prjFld->length = prjmdpkt->length[i]; - prjFld->value = AllDataType::alloc(prjFld->type, prjFld->length); + strcpy(prjFld->fName, fldInfo->fldName); + prjFld->type = fldInfo->type; + prjFld->length = fldInfo->length; + prjFld->offset = fldInfo->offset; + strcpy(prjFld->defaultValueBuf, fldInfo->defaultValueBuf); + prjFld->isNull = fldInfo->isNull; + prjFld->isPrimary = fldInfo->isPrimary; + prjFld->isDefault = fldInfo->isDefault; + prjFld->isUnique = fldInfo->isUnique; + if (prjFld->type == typeBinary) + prjFld->value = AllDataType::alloc(prjFld->type, 2 * prjFld->length); + else prjFld->value = AllDataType::alloc(prjFld->type, prjFld->length); bindList.append(prjFld); + ptr += sizeof (FieldInfo); } delete prjmdpkt; } @@ -194,7 +220,7 @@ void* SqlNwStatement::fetch() printError(ErrOS, "Error reading from socket\n"); return NULL; } - printf("HEADER says packet type is %d\n", header.packetType); +// printf("HEADER says packet type is %d\n", header.packetType); char *buffer = (char*) malloc(header.packetLength); numbytes = os::recv(fd,buffer,header.packetLength,0); if (numbytes == -1) { @@ -249,7 +275,7 @@ void* SqlNwStatement::fetch(DbRetVal &ret) printError(ErrOS, "Error reading from socket\n"); return NULL; } - printf("HEADER says packet type is %d\n", header.packetType); +// printf("HEADER says packet type is %d\n", header.packetType); char *buffer = (char*) malloc(header.packetLength); numbytes = os::recv(fd,buffer,header.packetLength,0); if (numbytes == -1) { @@ -272,9 +298,16 @@ void* SqlNwStatement::fetch(DbRetVal &ret) void* SqlNwStatement::fetchAndPrint(bool SQL) { if (!isPrepared) return NULL; - void *ptrToFirstField = NULL; - //TODO - return ptrToFirstField; + void *tuple = NULL; + BindSqlProjectField *fld = NULL; + tuple = fetch(); + if (NULL == tuple) return NULL; + for(int i = 0; i < noOfProjs; i++) { + fld = (BindSqlProjectField *) bindList.get(i + 1); + AllDataType::printVal(fld->value, fld->type, fld->length); + printf("\t"); + } + return tuple; } void* SqlNwStatement::next() @@ -298,27 +331,43 @@ void* SqlNwStatement::getFieldValuePtr( int pos ) int SqlNwStatement::noOfProjFields() { if (!isPrepared) return 0; - //TODO - return 0; + return noOfProjs; } int SqlNwStatement::noOfParamFields() { if (!isPrepared) return 0; - //TODO - return 0; + return noOfParams; } DbRetVal SqlNwStatement::getProjFldInfo (int projpos, FieldInfo *&fInfo) { - //TODO - return ErrNotFound; + BindSqlProjectField *prjFld = (BindSqlProjectField *) bindList.get(projpos); + strcpy(fInfo->fldName, prjFld->fName); + fInfo->type = prjFld->type; + fInfo->length = prjFld->length; + fInfo->offset = prjFld->offset; + strcpy(fInfo->defaultValueBuf, prjFld->defaultValueBuf); + fInfo->isNull = prjFld->isNull; + fInfo->isPrimary = prjFld->isPrimary; + fInfo->isDefault = prjFld->isDefault; + fInfo->isUnique = prjFld->isUnique; + return OK; } DbRetVal SqlNwStatement::getParamFldInfo (int parampos, FieldInfo *&fInfo) { - //TODO - return ErrNotFound; + BindSqlField *bindField = (BindSqlField *) paramList.get(parampos); + strcpy(fInfo->fldName, bindField->fName); + fInfo->type = bindField->type; + fInfo->length = bindField->length; + fInfo->offset = bindField->offset; + strcpy(fInfo->defaultValueBuf, bindField->defaultValueBuf); + fInfo->isNull = bindField->isNull; + fInfo->isPrimary = bindField->isPrimary; + fInfo->isDefault = bindField->isDefault; + fInfo->isUnique = bindField->isUnique; + return OK; } DbRetVal SqlNwStatement::free() -- 2.11.4.GIT