From 27487476f45fa237a4aa7bbdd7783e589b2bad56 Mon Sep 17 00:00:00 2001 From: prabatuty Date: Sat, 24 Jan 2009 07:20:48 +0000 Subject: [PATCH] Fixing leaks and JDBCTest performance improvement --- src/jdbc/JdbcSqlStatement.java | 17 ++++++++------ src/jdbc/buildJdbcDriver.ksh | 2 +- src/odbc/Makefile | 18 +++++++------- src/sql/ParsedData.cxx | 3 ++- src/storage/DatabaseManagerImpl.cxx | 1 + src/storage/HashIndex.cxx | 47 ++++++++++++++++++++++++++++++++++--- 6 files changed, 67 insertions(+), 21 deletions(-) diff --git a/src/jdbc/JdbcSqlStatement.java b/src/jdbc/JdbcSqlStatement.java index 45c7b192..2b569495 100644 --- a/src/jdbc/JdbcSqlStatement.java +++ b/src/jdbc/JdbcSqlStatement.java @@ -13,6 +13,7 @@ public class JdbcSqlStatement extends JSqlError implements Statement, JSqlErrorT public JSqlStatement jniStmt; public JdbcSqlConnection conn; public JdbcSqlResultSet rs; + public boolean isSelect; JdbcSqlStatement( Connection con ) { @@ -23,6 +24,7 @@ public class JdbcSqlStatement extends JSqlError implements Statement, JSqlErrorT closedFlag = false; isPrepared = false; rowsAffect = 0; + isSelect = false; rs = new JdbcSqlResultSet(); } protected void finalize () @@ -43,21 +45,22 @@ public class JdbcSqlStatement extends JSqlError implements Statement, JSqlErrorT int rv = 0; if(isPrepared) { - if(jniStmt.isSelect()) rs.close(); + if(isSelect) rs.close(); jniStmt.freeStmt(); isPrepared = false; + isSelect = false; } rv = jniStmt.prepare(query); if( rv != 0 ) // 0 ->OK { throw getException(CSQL_PREPARE_ERR); } + isSelect = jniStmt.isSelect(); isPrepared = true; } public boolean executeInt() throws SQLException { if (!isPrepared) throw getException(CSQL_NOT_PREPARED); - boolean isSelect = jniStmt.isSelect(); rowsAffect = jniStmt.execute(); if( rowsAffect < 0 ) throw getException(CSQL_EXECUTE_ERR); @@ -72,7 +75,7 @@ public class JdbcSqlStatement extends JSqlError implements Statement, JSqlErrorT if(closedFlag) return; if(isPrepared) { - if(jniStmt.isSelect() ) rs.close(); + if(isSelect) rs.close(); jniStmt.freeStmt(); //jniStmt.free(); Praba. this makes the stmt unusable after close } @@ -82,7 +85,7 @@ public class JdbcSqlStatement extends JSqlError implements Statement, JSqlErrorT public void closeScan() throws SQLException { - if( jniStmt.isSelect()) jniStmt.close(); + if(isSelect) jniStmt.close(); } public boolean execute (String query) throws SQLException @@ -94,7 +97,7 @@ public class JdbcSqlStatement extends JSqlError implements Statement, JSqlErrorT public ResultSet executeQuery(String query) throws SQLException { prepareInt(query); - if( !jniStmt.isSelect() ) { + if( !isSelect ) { jniStmt.freeStmt(); isPrepared = false; throw getException(CSQL_NOT_QUERY); @@ -124,7 +127,7 @@ public class JdbcSqlStatement extends JSqlError implements Statement, JSqlErrorT } public ResultSet getResultSet() throws SQLException { - if(!jniStmt.isSelect()) + if(isSelect) return (null); if(closedFlag) throw getException( CSQL_INVALID_STATE ); //praba:;changed this @@ -145,7 +148,7 @@ public class JdbcSqlStatement extends JSqlError implements Statement, JSqlErrorT } public int getUpdateCount() throws SQLException { - if(jniStmt.isSelect()) + if(isSelect) return -1; return rowsAffect; } diff --git a/src/jdbc/buildJdbcDriver.ksh b/src/jdbc/buildJdbcDriver.ksh index 69874181..cb6d63ca 100755 --- a/src/jdbc/buildJdbcDriver.ksh +++ b/src/jdbc/buildJdbcDriver.ksh @@ -1,6 +1,6 @@ rm -rf classtmp mkdir classtmp -javac -d classtmp -nowarn *.java +javac -g:none -d classtmp -nowarn *.java cd classtmp jar cvf CSqlJdbcDriver.jar * mv CSqlJdbcDriver.jar .. diff --git a/src/odbc/Makefile b/src/odbc/Makefile index 68361251..b3921a52 100644 --- a/src/odbc/Makefile +++ b/src/odbc/Makefile @@ -77,14 +77,14 @@ HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = ${SHELL} /home/praba/csql/latest/jan/csql/missing --run aclocal-1.9 +ACLOCAL = ${SHELL} /home/praba/csql/latest/jan/jan24/csql/missing --run aclocal-1.9 AMDEP_FALSE = # AMDEP_TRUE = -AMTAR = ${SHELL} /home/praba/csql/latest/jan/csql/missing --run tar +AMTAR = ${SHELL} /home/praba/csql/latest/jan/jan24/csql/missing --run tar AR = ar -AUTOCONF = ${SHELL} /home/praba/csql/latest/jan/csql/missing --run autoconf -AUTOHEADER = ${SHELL} /home/praba/csql/latest/jan/csql/missing --run autoheader -AUTOMAKE = ${SHELL} /home/praba/csql/latest/jan/csql/missing --run automake-1.9 +AUTOCONF = ${SHELL} /home/praba/csql/latest/jan/jan24/csql/missing --run autoconf +AUTOHEADER = ${SHELL} /home/praba/csql/latest/jan/jan24/csql/missing --run autoheader +AUTOMAKE = ${SHELL} /home/praba/csql/latest/jan/jan24/csql/missing --run automake-1.9 AWK = gawk CC = gcc CCDEPMODE = depmode=gcc3 @@ -94,7 +94,7 @@ CPPFLAGS = CXX = g++ CXXCPP = g++ -E CXXDEPMODE = depmode=gcc3 -CXXFLAGS = -g -I/home/praba/csql/jdk1.6.0_06/include -I/home/praba/csql/jdk1.6.0_06/include/linux +CXXFLAGS = -O2 -I/home/praba/csql/jdk1.6.0_06/include -I/home/praba/csql/jdk1.6.0_06/include/linux CYGPATH_W = echo DEFS = -DHAVE_CONFIG_H DEPDIR = .deps @@ -120,7 +120,7 @@ LIBS = LIBTOOL = $(SHELL) $(top_builddir)/libtool LN_S = ln -s LTLIBOBJS = -MAKEINFO = ${SHELL} /home/praba/csql/latest/jan/csql/missing --run makeinfo +MAKEINFO = ${SHELL} /home/praba/csql/latest/jan/jan24/csql/missing --run makeinfo OBJEXT = o PACKAGE = csql PACKAGE_BUGREPORT = @@ -167,7 +167,7 @@ host_vendor = pc htmldir = ${docdir} includedir = ${prefix}/include infodir = ${datarootdir}/info -install_sh = /home/praba/csql/latest/jan/csql/install-sh +install_sh = /home/praba/csql/latest/jan/jan24/csql/install-sh libdir = ${exec_prefix}/lib libexecdir = ${exec_prefix}/libexec localedir = ${datarootdir}/locale @@ -176,7 +176,7 @@ mandir = ${datarootdir}/man mkdir_p = mkdir -p -- oldincludedir = /usr/include pdfdir = ${docdir} -prefix = /home/praba/csql/latest/jan/csql/install +prefix = /home/praba/csql/latest/jan/jan24/csql/install program_transform_name = s,x,x, psdir = ${docdir} sbindir = ${exec_prefix}/sbin diff --git a/src/sql/ParsedData.cxx b/src/sql/ParsedData.cxx index 3211754d..200b8e9a 100644 --- a/src/sql/ParsedData.cxx +++ b/src/sql/ParsedData.cxx @@ -127,7 +127,7 @@ void ParsedData::reset() ListIterator fNameIter = fieldNameList.getIterator(); fNameIter.reset(); while (fNameIter.hasElement()) - delete (Identifier *) fNameIter.nextElement(); + delete ((FieldName *) fNameIter.nextElement()); fieldNameList.reset(); ListIterator iter = fieldValueList.getIterator(); FieldValue *value; @@ -167,6 +167,7 @@ void ParsedData::reset() } updFldValList.reset(); groupFieldNameList.reset(); + iter = tableNameList.getIterator(); TableName *tname; while (iter.hasElement()) diff --git a/src/storage/DatabaseManagerImpl.cxx b/src/storage/DatabaseManagerImpl.cxx index 1eee7c1a..d537b0ad 100644 --- a/src/storage/DatabaseManagerImpl.cxx +++ b/src/storage/DatabaseManagerImpl.cxx @@ -930,6 +930,7 @@ DbRetVal DatabaseManagerImpl::createHashIndex(const char *indName, const char *t if (! tbl->numTuples()) { printDebug(DM_Database, "Creating Hash Index Name:%s tblname:%s buckets:%x", indName, tblName, buckets); logFinest(logger, "Creating HashIndex %s on %s with bucket size %d", indName, tblName, buckets); + closeTable(tbl); return OK; } HashIndexInfo *indxInfo = NULL; diff --git a/src/storage/HashIndex.cxx b/src/storage/HashIndex.cxx index 34c872b0..10bd596d 100644 --- a/src/storage/HashIndex.cxx +++ b/src/storage/HashIndex.cxx @@ -197,6 +197,8 @@ DbRetVal HashIndex::insert(TableImpl *tbl, Transaction *tr, void *indexPtr, Inde int ret = bucket->mutex_.getLock(tbl->db_->procSlot); if (ret != 0) { + delete hInfo; + free(keyStartBuffer); printError(ErrLockTimeOut,"Unable to acquire bucket Mutex for bucket %d",bucketNo); return ErrLockTimeOut; } @@ -225,6 +227,8 @@ DbRetVal HashIndex::insert(TableImpl *tbl, Transaction *tr, void *indexPtr, Inde else res = AllDataType::compareVal((void*)((char*)bucketTuple +offset), (void*)((char*)tuple +offset), OpEquals,type, info->compLength); if (res) { + delete hInfo; + free(keyStartBuffer); printError(ErrUnique, "Unique key violation"); bucket->mutex_.releaseLock(tbl->db_->procSlot); return ErrUnique; @@ -241,6 +245,8 @@ DbRetVal HashIndex::insert(TableImpl *tbl, Transaction *tr, void *indexPtr, Inde if (firstNode == NULL) { bucket->mutex_.releaseLock(tbl->db_->procSlot); + delete hInfo; + free(keyStartBuffer); return rv; } firstNode->ptrToKey_ = keyPtr; @@ -255,6 +261,8 @@ DbRetVal HashIndex::insert(TableImpl *tbl, Transaction *tr, void *indexPtr, Inde rc = list.insert((Chunk*)iptr->hashNodeChunk_, tbl->db_, keyPtr, tuple); if (rc !=OK) { bucket->mutex_.releaseLock(tbl->db_->procSlot); + delete hInfo; + free(keyStartBuffer); return rc; } @@ -269,6 +277,7 @@ DbRetVal HashIndex::insert(TableImpl *tbl, Transaction *tr, void *indexPtr, Inde bucket->bucketList_ = list.getBucketListHead(); } } + free(keyStartBuffer); delete hInfo; hInfo = NULL; bucket->mutex_.releaseLock(tbl->db_->procSlot); return rc; @@ -315,6 +324,8 @@ DbRetVal HashIndex::remove(TableImpl *tbl, Transaction *tr, void *indexPtr, Inde int ret = bucket1->mutex_.getLock(tbl->db_->procSlot); if (ret != 0) { + delete hInfo; + free(keyStartBuffer); printError(ErrLockTimeOut,"Unable to acquire bucket Mutex for bucket %d",bucket); return ErrLockTimeOut; } @@ -322,6 +333,8 @@ DbRetVal HashIndex::remove(TableImpl *tbl, Transaction *tr, void *indexPtr, Inde if (!head) { printError(ErrNotExists, "Hash index does not exist:should never happen\n"); bucket1->mutex_.releaseLock(tbl->db_->procSlot); + delete hInfo; + free(keyStartBuffer); return ErrNotExists; } BucketList list(head); @@ -344,7 +357,8 @@ DbRetVal HashIndex::remove(TableImpl *tbl, Transaction *tr, void *indexPtr, Inde } } bucket1->mutex_.releaseLock(tbl->db_->procSlot); - + delete hInfo; + free(keyStartBuffer); return rc; } @@ -412,6 +426,7 @@ DbRetVal HashIndex::update(TableImpl *tbl, Transaction *tr, void *indexPtr, Inde if (!keyUpdated) { //printf("PRABA::key not updated\n"); free(keyStartBuffer); + free(oldKeyStartBuffer); return OK; } //printf("PRABA::it is wrong coming here\n"); @@ -421,7 +436,11 @@ DbRetVal HashIndex::update(TableImpl *tbl, Transaction *tr, void *indexPtr, Inde OpEquals, info->type, info->compLength); else result = AllDataType::compareVal(keyPtr, keyStartBuffer, OpEquals, info->type, info->compLength); - if (result) return OK; + if (result) { + free(keyStartBuffer); + free(oldKeyStartBuffer); + return OK; + } printDebug(DM_HashIndex, "Updating hash index node: Key value is updated"); ChunkIterator citer = CatalogTableINDEX::getIterator(indexPtr); @@ -449,6 +468,9 @@ DbRetVal HashIndex::update(TableImpl *tbl, Transaction *tr, void *indexPtr, Inde int ret = bucket->mutex_.getLock(tbl->db_->procSlot); if (ret != 0) { + delete hInfo1; + free(keyStartBuffer); + free(oldKeyStartBuffer); printError(ErrLockTimeOut,"Unable to acquire bucket Mutex for bucket %d",bucketNo); return ErrLockTimeOut; } @@ -467,6 +489,10 @@ DbRetVal HashIndex::update(TableImpl *tbl, Transaction *tr, void *indexPtr, Inde bucket1->mutex_.getLock(tbl->db_->procSlot); if (ret != 0) { + delete hInfo1; + delete hInfo2; + free(keyStartBuffer); + free(oldKeyStartBuffer); printError(ErrLockTimeOut,"Unable to acquire bucket Mutex for bucket %d",newBucketNo); return ErrLockTimeOut; } @@ -484,6 +510,10 @@ DbRetVal HashIndex::update(TableImpl *tbl, Transaction *tr, void *indexPtr, Inde printError(ErrSysInternal,"Update: Bucket list is null"); bucket1->mutex_.releaseLock(tbl->db_->procSlot); bucket->mutex_.releaseLock(tbl->db_->procSlot); + delete hInfo1; + delete hInfo2; + free(keyStartBuffer); + free(oldKeyStartBuffer); return ErrSysInternal; } DbRetVal rc = OK; @@ -497,6 +527,10 @@ DbRetVal HashIndex::update(TableImpl *tbl, Transaction *tr, void *indexPtr, Inde bucket->bucketList_ = list.getBucketListHead(); bucket1->mutex_.releaseLock(tbl->db_->procSlot); bucket->mutex_.releaseLock(tbl->db_->procSlot); + delete hInfo1; + delete hInfo2; + free(keyStartBuffer); + free(oldKeyStartBuffer); return rc; } } @@ -514,6 +548,10 @@ DbRetVal HashIndex::update(TableImpl *tbl, Transaction *tr, void *indexPtr, Inde printError(rv, "Error in allocating hash node"); bucket1->mutex_.releaseLock(tbl->db_->procSlot); bucket->mutex_.releaseLock(tbl->db_->procSlot); + delete hInfo1; + delete hInfo2; + free(keyStartBuffer); + free(oldKeyStartBuffer); return rv; } firstNode->ptrToKey_ = keyPtr; @@ -549,7 +587,10 @@ DbRetVal HashIndex::update(TableImpl *tbl, Transaction *tr, void *indexPtr, Inde } bucket1->mutex_.releaseLock(tbl->db_->procSlot); bucket->mutex_.releaseLock(tbl->db_->procSlot); - + delete hInfo1; + delete hInfo2; + free(keyStartBuffer); + free(oldKeyStartBuffer); return rc; } -- 2.11.4.GIT