From dc7b365de3eac61b99803c84a3e8266d3dc8c96c Mon Sep 17 00:00:00 2001 From: bijaya Date: Thu, 11 Dec 2008 12:08:27 +0000 Subject: [PATCH] Bug Id: 2413136 Error in setting null at the time insertion in through jdbc --- include/AbsSqlStatement.h | 1 + include/SqlGwStatement.h | 5 +++-- include/SqlLogStatement.h | 1 + include/SqlNwStatement.h | 1 + include/SqlOdbcStatement.h | 1 + include/SqlStatement.h | 1 + include/Statement.h | 26 +++++++++++++++++++------- src/adapter/SqlOdbcStatement.cxx | 5 ++++- src/gateway/SqlGwStatement.cxx | 11 +++++++++++ src/jdbc/JSqlStatement.cxx | 17 ++++++++++++++++- src/sql/InsStatement.cxx | 15 +++++++++++++++ src/sql/SqlStatement.cxx | 4 ++++ src/sql/Statement.h | 7 +++++++ 13 files changed, 84 insertions(+), 11 deletions(-) diff --git a/include/AbsSqlStatement.h b/include/AbsSqlStatement.h index 7a1ff554..6e86f7cd 100644 --- a/include/AbsSqlStatement.h +++ b/include/AbsSqlStatement.h @@ -230,6 +230,7 @@ class AbsSqlStatement virtual bool isSelect() = 0; virtual bool isFldNull(int pos)=0; + virtual void setNull(int pos)=0; virtual int getFldPos(char *name)=0; virtual ~AbsSqlStatement(){} }; diff --git a/include/SqlGwStatement.h b/include/SqlGwStatement.h index 1b1f619d..2dbc7321 100644 --- a/include/SqlGwStatement.h +++ b/include/SqlGwStatement.h @@ -78,8 +78,9 @@ class SqlGwStatement: public AbsSqlStatement void setTimeParam(int paramPos, Time value); void setTimeStampParam(int paramPos, TimeStamp value); void setBinaryParam(int paramPos, void *value); - bool isSelect(); - bool isFldNull(int pos){} + bool isSelect(); + bool isFldNull(int pos); + void setNull(int pos); int getFldPos(char *name){} private: bool shouldAdapterHandle(); diff --git a/include/SqlLogStatement.h b/include/SqlLogStatement.h index e1f2fe77..94b9a0cc 100644 --- a/include/SqlLogStatement.h +++ b/include/SqlLogStatement.h @@ -76,6 +76,7 @@ class SqlLogStatement: public AbsSqlStatement void setBinaryParam(int paramPos, void *value); bool isSelect(); bool isFldNull(int pos){} + void setNull(int pos){} int getFldPos(char *name){} bool isCached; TableSyncMode mode; diff --git a/include/SqlNwStatement.h b/include/SqlNwStatement.h index 6bbac454..ce1919d4 100644 --- a/include/SqlNwStatement.h +++ b/include/SqlNwStatement.h @@ -73,6 +73,7 @@ class SqlNwStatement: public AbsSqlStatement void getPrimaryKeyFieldName(char *tablename, char *pkfieldname); int getStmtID() { return stmtID; } bool isFldNull(int pos){} + void setNull(int pos){} void setStmtID(int id) { stmtID = id; } int getFldPos(char *name){} private: diff --git a/include/SqlOdbcStatement.h b/include/SqlOdbcStatement.h index 268832e6..9fe17b84 100644 --- a/include/SqlOdbcStatement.h +++ b/include/SqlOdbcStatement.h @@ -79,6 +79,7 @@ class SqlOdbcStatement: public AbsSqlStatement void setNullInfo(Table *table); bool isFldNull(int pos); bool chechStmtType(char *stmtstr); + void setNull(int pos); int getFldPos(char *name){} private: bool isSelStmt; diff --git a/include/SqlStatement.h b/include/SqlStatement.h index 3f32e584..691b90f6 100644 --- a/include/SqlStatement.h +++ b/include/SqlStatement.h @@ -236,6 +236,7 @@ class SqlStatement: public AbsSqlStatement bool isPrepared(); StatementType getStmtType() { return pData.getStmtType(); } bool isFldNull(int pos); + void setNull(int pos); int getFldPos(char *name); private: SqlConnection *sqlCon; diff --git a/include/Statement.h b/include/Statement.h index f35999e2..04cbf6cd 100644 --- a/include/Statement.h +++ b/include/Statement.h @@ -48,8 +48,10 @@ class Statement virtual DbRetVal setTimeParam(int paramNo, Time value)=0; virtual DbRetVal setTimeStampParam(int paramNo, TimeStamp value)=0; virtual DbRetVal setBinaryParam(int paramNo, void *value)=0; - //virtual bool isFldNull(int pos)=0; virtual DbRetVal resolve()=0; + virtual bool isFldNull(int pos)=0; + virtual int getFldPos(char *name)=0; + virtual DbRetVal setNull(int pos)=0; virtual ~Statement(){} }; @@ -84,8 +86,10 @@ class DmlStatement : public Statement virtual DbRetVal setTimeStampParam(int paramNo, TimeStamp value)=0; virtual DbRetVal setBinaryParam(int paramNo, void *value)=0; virtual bool isFldNull(int pos)=0; + virtual DbRetVal setNull(int pos)=0; virtual DbRetVal resolve()=0; virtual void* getParamValuePtr( int pos )=0; + virtual int getFldPos(char *name)=0; virtual ~DmlStatement(){} }; @@ -109,8 +113,10 @@ class InsStatement : public DmlStatement DbRetVal setTimeParam(int paramNo, Time value); DbRetVal setTimeStampParam(int paramNo, TimeStamp value); DbRetVal setBinaryParam(int paramNo, void *value); - bool isFldNull(int pos){} + bool isFldNull(int pos){return table->isFldNull(pos);} void* getParamValuePtr( int ); + int getFldPos(char *name); + DbRetVal setNull(int pos); DbRetVal resolve(); InsStatement(); ~InsStatement(); @@ -148,7 +154,8 @@ class SelStatement : public DmlStatement DbRetVal replaceStarWithFirstFldName(FieldName *name); DbRetVal resolveGroupFld(AggTableImpl *impl); bool isFldNull(int pos){return table->isFldNull(pos);} - + int getFldPos(char *name); + DbRetVal setNull(int pos){} DbRetVal close(); DbRetVal resolve(); SelStatement(); @@ -194,8 +201,9 @@ class UpdStatement : public DmlStatement DbRetVal setBinaryParam(int paramNo, void *value); void* getParamValuePtr(int); DbRetVal getParamFldInfo(int paramPos, FieldInfo *&info); - bool isFldNull(int pos){} - + bool isFldNull(int pos){return table->isFldNull(pos);} + int getFldPos(char *name); + DbRetVal setNull(int pos){} DbRetVal resolve(); UpdStatement(); ~UpdStatement(); @@ -222,13 +230,14 @@ class DelStatement : public DmlStatement DbRetVal setTimeParam(int paramNo, Time value); DbRetVal setTimeStampParam(int paramNo, TimeStamp value); DbRetVal setBinaryParam(int paramNo, void *value); - bool isFldNull(int pos){} + bool isFldNull(int pos){return table->isFldNull(pos);} DbRetVal getParamFldInfo(int paramPos, FieldInfo *&info); void* getParamValuePtr(int); + DbRetVal setNull(int pos){} DbRetVal resolve(); DelStatement(); ~DelStatement(); - + int getFldPos(char *name); DbRetVal resolveForCondition(); //TODO::put this is Statement class, duplicated from SelStatement. }; @@ -253,6 +262,9 @@ class DdlStatement : public Statement DbRetVal setTimeParam(int paramNo, Time value) { } DbRetVal setTimeStampParam(int paramNo, TimeStamp value) { } DbRetVal setBinaryParam(int paramNo, void *value) { } + bool isFldNull(int pos){ } + int getFldPos(char *name){} + DbRetVal setNull(int pos){} }; class CreateTblStatement : public DdlStatement diff --git a/src/adapter/SqlOdbcStatement.cxx b/src/adapter/SqlOdbcStatement.cxx index 769be28d..4470dd7a 100644 --- a/src/adapter/SqlOdbcStatement.cxx +++ b/src/adapter/SqlOdbcStatement.cxx @@ -612,4 +612,7 @@ bool SqlOdbcStatement::isFldNull(int pos) else return false; } - +void SqlOdbcStatement::setNull(int pos) +{ + len[pos] == SQL_NULL_DATA ; +} diff --git a/src/gateway/SqlGwStatement.cxx b/src/gateway/SqlGwStatement.cxx index 0c0f7ca0..947c918d 100644 --- a/src/gateway/SqlGwStatement.cxx +++ b/src/gateway/SqlGwStatement.cxx @@ -272,4 +272,15 @@ void SqlGwStatement::setBinaryParam(int paramPos, void *value) if (adapter && shouldAdapterHandle()) adapter->setBinaryParam(paramPos, value); if (innerStmt && shouldCSqlHandle()) innerStmt->setBinaryParam(paramPos,value); } +bool SqlGwStatement::isFldNull(int pos) +{ + if (adapter && shouldAdapterHandle()) adapter->isFldNull(pos); + if (innerStmt && shouldCSqlHandle()) innerStmt->isFldNull(pos); + +} +void SqlGwStatement::setNull(int pos) +{ + if (adapter && shouldAdapterHandle()) adapter->setNull(pos); + if (innerStmt && shouldCSqlHandle()) innerStmt-> setNull(pos); +} diff --git a/src/jdbc/JSqlStatement.cxx b/src/jdbc/JSqlStatement.cxx index a73ff294..f74def7e 100644 --- a/src/jdbc/JSqlStatement.cxx +++ b/src/jdbc/JSqlStatement.cxx @@ -576,8 +576,23 @@ JNIEXPORT jshort JNICALL Java_csql_jdbc_JSqlStatement_getShort * Signature: (I)V */ JNIEXPORT void JNICALL Java_csql_jdbc_JSqlStatement_setNull - (JNIEnv *, jobject, jint); + (JNIEnv *env, jobject obj, jint pos) +{ + jclass cls; + jfieldID fid; + cls = env->GetObjectClass(obj); + fid = env->GetFieldID( cls, "sqlStmtPtr", "J"); + if (fid == 0) + { + jclass Exception = env->FindClass("java/lang/Exception"); + env->ThrowNew(Exception,"JNI: GetFieldID failed.\n"); + return; + } + AbsSqlStatement *s = (AbsSqlStatement*) env->GetLongField( obj, fid ); + s->setNull(pos); + return; +} diff --git a/src/sql/InsStatement.cxx b/src/sql/InsStatement.cxx index a489ade1..52b3c97f 100644 --- a/src/sql/InsStatement.cxx +++ b/src/sql/InsStatement.cxx @@ -74,6 +74,7 @@ DbRetVal InsStatement::execute(int &rowsAffected) } rv = table->insertTuple(); if (rv ==OK) rowsAffected = 1; + table-> resetNullinfo(); return rv; } @@ -111,6 +112,20 @@ DbRetVal InsStatement::setIntParam(int paramNo, int value) *(int*)cValue->value = value; return OK; } +DbRetVal InsStatement::setNull(int paramNo) +{ + if (paramNo <=0 || paramNo > totalParams) return ErrBadArg; + FieldValue *cValue = (FieldValue*) params [paramNo-1]; + if (NULL == cValue) + { + printError(ErrSysFatal, "FieldValue is null. Should never happen"); + return ErrSysFatal; + } + char name[IDENTIFIER_LENGTH]; + table->getFieldNameAlone(cValue->fldName,name); + table->markFldNull(name); + return OK; +} DbRetVal InsStatement::setLongParam(int paramNo, long value) { if (paramNo <=0 || paramNo > totalParams) return ErrBadArg; diff --git a/src/sql/SqlStatement.cxx b/src/sql/SqlStatement.cxx index 1cea044d..d39cc4ec 100644 --- a/src/sql/SqlStatement.cxx +++ b/src/sql/SqlStatement.cxx @@ -264,6 +264,10 @@ DbRetVal SqlStatement::free() return OK; } +void SqlStatement::setNull(int pos) +{ + stmt->setNull(pos); +} void SqlStatement::setShortParam(int paramPos, short value) { stmt->setShortParam(paramPos, value); diff --git a/src/sql/Statement.h b/src/sql/Statement.h index 40d5d8c9..04cbf6cd 100644 --- a/src/sql/Statement.h +++ b/src/sql/Statement.h @@ -51,6 +51,7 @@ class Statement virtual DbRetVal resolve()=0; virtual bool isFldNull(int pos)=0; virtual int getFldPos(char *name)=0; + virtual DbRetVal setNull(int pos)=0; virtual ~Statement(){} }; @@ -85,6 +86,7 @@ class DmlStatement : public Statement virtual DbRetVal setTimeStampParam(int paramNo, TimeStamp value)=0; virtual DbRetVal setBinaryParam(int paramNo, void *value)=0; virtual bool isFldNull(int pos)=0; + virtual DbRetVal setNull(int pos)=0; virtual DbRetVal resolve()=0; virtual void* getParamValuePtr( int pos )=0; virtual int getFldPos(char *name)=0; @@ -114,6 +116,7 @@ class InsStatement : public DmlStatement bool isFldNull(int pos){return table->isFldNull(pos);} void* getParamValuePtr( int ); int getFldPos(char *name); + DbRetVal setNull(int pos); DbRetVal resolve(); InsStatement(); ~InsStatement(); @@ -152,6 +155,7 @@ class SelStatement : public DmlStatement DbRetVal resolveGroupFld(AggTableImpl *impl); bool isFldNull(int pos){return table->isFldNull(pos);} int getFldPos(char *name); + DbRetVal setNull(int pos){} DbRetVal close(); DbRetVal resolve(); SelStatement(); @@ -199,6 +203,7 @@ class UpdStatement : public DmlStatement DbRetVal getParamFldInfo(int paramPos, FieldInfo *&info); bool isFldNull(int pos){return table->isFldNull(pos);} int getFldPos(char *name); + DbRetVal setNull(int pos){} DbRetVal resolve(); UpdStatement(); ~UpdStatement(); @@ -228,6 +233,7 @@ class DelStatement : public DmlStatement bool isFldNull(int pos){return table->isFldNull(pos);} DbRetVal getParamFldInfo(int paramPos, FieldInfo *&info); void* getParamValuePtr(int); + DbRetVal setNull(int pos){} DbRetVal resolve(); DelStatement(); ~DelStatement(); @@ -258,6 +264,7 @@ class DdlStatement : public Statement DbRetVal setBinaryParam(int paramNo, void *value) { } bool isFldNull(int pos){ } int getFldPos(char *name){} + DbRetVal setNull(int pos){} }; class CreateTblStatement : public DdlStatement -- 2.11.4.GIT