From 035ca1a4a4b3226aa32a45e00a79cd5b434dbf1f Mon Sep 17 00:00:00 2001 From: kishoramballi Date: Wed, 28 Jan 2009 08:55:59 +0000 Subject: [PATCH] stmt->close calls table->closeScan not close as earlier. and closeScan will reset the tupleIterator to start from the first record satisfying the condition appropriately. Earlier the iterator was deleted during stmt->close call which was calling table->close that deleted the iterator. --- include/Index.h | 8 ++++++-- include/SqlStatement.h | 1 + include/Statement.h | 1 + include/TableImpl.h | 1 + src/sql/SelStatement.cxx | 9 ++++++++- src/sql/SqlStatement.cxx | 9 +++++++++ src/sql/Statement.h | 1 + src/storage/TableImpl.cxx | 6 +++--- src/storage/TupleIterator.cxx | 8 ++++++++ 9 files changed, 38 insertions(+), 6 deletions(-) diff --git a/include/Index.h b/include/Index.h index db18d920..30d41416 100644 --- a/include/Index.h +++ b/include/Index.h @@ -64,10 +64,12 @@ class TreeNode class BucketIter { HashIndexNode *iter; + HashIndexNode *head; public: BucketIter(){} - BucketIter(HashIndexNode *head) { iter = head;} + BucketIter(HashIndexNode *head) { iter = head = head;} HashIndexNode* next(); + void reset() { iter = head; } friend class BucketList; }; class BucketList @@ -138,6 +140,7 @@ class TreeIndex : public Index class TreeIter { TreeNode *iter; + TreeNode *head; int fldOffset; DataType type; int length; @@ -153,7 +156,7 @@ class TreeIter public: TreeIter(){} - TreeIter(TreeNode *head) { iter = head; firstCall = true; recordsOver=false;} + TreeIter(TreeNode *head) { iter = head = head; firstCall = true; recordsOver=false;} void setSearchKey(void *key, ComparisionOp cop, bool ascending = true) { searchKey = key; op = cop; asc =ascending; @@ -163,6 +166,7 @@ class TreeIter void* prev(); void* next(); void nextNode(); + void reset() { iter = head; firstCall = true; recordsOver=false; } }; enum IndexIntType diff --git a/include/SqlStatement.h b/include/SqlStatement.h index 691b90f6..e5eacba8 100644 --- a/include/SqlStatement.h +++ b/include/SqlStatement.h @@ -109,6 +109,7 @@ class SqlStatement: public AbsSqlStatement * @returns DbRetVal */ DbRetVal close(); + DbRetVal freeScan(); /** get FieldValue->value ptr after fetch is done. * @returns address void* diff --git a/include/Statement.h b/include/Statement.h index 94e2675a..6c46adcb 100644 --- a/include/Statement.h +++ b/include/Statement.h @@ -157,6 +157,7 @@ class SelStatement : public DmlStatement int getFldPos(char *name); DbRetVal setNull(int pos){} DbRetVal close(); + DbRetVal freeScan(); DbRetVal resolve(); SelStatement(); ~SelStatement(); diff --git a/include/TableImpl.h b/include/TableImpl.h index 4d8bd7b5..1cd33de8 100644 --- a/include/TableImpl.h +++ b/include/TableImpl.h @@ -69,6 +69,7 @@ class TupleIterator DbRetVal open(); void* next(); void* prev();//used only for tree iter during deleteTuple + void reset(); DbRetVal close(); }; diff --git a/src/sql/SelStatement.cxx b/src/sql/SelStatement.cxx index c4b6883c..660ad064 100644 --- a/src/sql/SelStatement.cxx +++ b/src/sql/SelStatement.cxx @@ -642,8 +642,15 @@ void* SelStatement::fetch(DbRetVal &rv) DbRetVal SelStatement::close() { - return table->close(); + return table->closeScan(); } + +DbRetVal SelStatement::freeScan() +{ + if (table) return table->close(); + else return OK; +} + void* SelStatement::getParamValuePtr( int pos ) { ConditionValue *p = (ConditionValue*) params [pos-1]; diff --git a/src/sql/SqlStatement.cxx b/src/sql/SqlStatement.cxx index d39cc4ec..f0e60f6f 100644 --- a/src/sql/SqlStatement.cxx +++ b/src/sql/SqlStatement.cxx @@ -185,6 +185,14 @@ DbRetVal SqlStatement::close() SelStatement *selStmt = (SelStatement*) stmt; return selStmt->close(); } +DbRetVal SqlStatement::freeScan() +{ + if (pData.getStmtType() != SelectStatement) return OK; + SelStatement *selStmt = (SelStatement*) stmt; + if (stmt) return selStmt->freeScan(); + return OK; + +} void* SqlStatement::getParamValuePtr( int pos ) { //if (pData.getStmtType() != SelectStatement) return 0; @@ -257,6 +265,7 @@ DbRetVal SqlStatement::getParamFldInfo (int parampos, FieldInfo *&fInfo) DbRetVal SqlStatement::free() { + freeScan(); delete stmt; stmt = NULL; pData.reset(); diff --git a/src/sql/Statement.h b/src/sql/Statement.h index fd65b465..1163f3ce 100644 --- a/src/sql/Statement.h +++ b/src/sql/Statement.h @@ -157,6 +157,7 @@ class SelStatement : public DmlStatement int getFldPos(char *name); DbRetVal setNull(int pos){} DbRetVal close(); + DbRetVal freeScan(); DbRetVal resolve(); SelStatement(); ~SelStatement(); diff --git a/src/storage/TableImpl.cxx b/src/storage/TableImpl.cxx index ff39c4c9..83e968c2 100644 --- a/src/storage/TableImpl.cxx +++ b/src/storage/TableImpl.cxx @@ -878,9 +878,9 @@ DbRetVal TableImpl::closeScan() //do not throw scan not open error //this function will be called by table handle if (iter) { - iter->close(); - delete iter; - iter = NULL; + iter->reset(); + // delete iter; + // iter = NULL; } return OK; } diff --git a/src/storage/TupleIterator.cxx b/src/storage/TupleIterator.cxx index bddd7840..9090f7b9 100644 --- a/src/storage/TupleIterator.cxx +++ b/src/storage/TupleIterator.cxx @@ -206,3 +206,11 @@ DbRetVal TupleIterator::close() scanType_ = unknownScan; return OK; } + +void TupleIterator::reset() +{ + DbRetVal rv = OK; + if (scanType_ == fullTableScan) *cIter = ((Chunk*)chunkPtr_)->getIterator(); + else if (scanType_ == hashIndexScan) if(bIter) bIter->reset(); + else if (scanType_ == treeIndexScan) if(tIter) tIter->reset(); +} -- 2.11.4.GIT