1 /**************************************************************************
2 * Copyright (C) 2007 by Prabakaran Thirumalai *
3 * praba_tuty@yahoo.com *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
21 #include <Statement.h>
22 #include <SqlStatement.h>
26 extern ParsedData
*parsedData
;
29 bool SqlConnection::isInit
= false;
30 #if (defined MMDB && defined EMBED)
31 bool SqlConnection::firstThread
= false;
32 GlobalUniqueID
SqlConnection::UID
;
34 List
SqlConnection::connList
;
36 SqlStatement::~SqlStatement()
38 if (sqlStmtString
) { ::free(sqlStmtString
); sqlStmtString
=NULL
;}
39 if (isPrepd
) { free(); isPrepd
= false; }
42 void SqlStatement::setParamValues(AbsSqlStatement
*sqlStmt
, int parampos
, DataType type
, int length
, void *value
)
47 sqlStmt
->setIntParam(parampos
, *(int*)value
);
50 sqlStmt
->setLongParam(parampos
, *(long*)value
);
53 sqlStmt
->setLongLongParam(parampos
, *(long long*)value
);
56 sqlStmt
->setShortParam(parampos
, *(short*)value
);
59 sqlStmt
->setByteIntParam(parampos
, *(char*)value
);
62 sqlStmt
->setDoubleParam(parampos
, *(double*)value
);
65 sqlStmt
->setFloatParam(parampos
, *(float*)value
);
68 sqlStmt
->setDateParam(parampos
, *(Date
*)value
);
71 sqlStmt
->setTimeParam(parampos
, *(Time
*)value
);
74 sqlStmt
->setTimeStampParam(parampos
, *(TimeStamp
*)value
);
79 sqlStmt
->setStringParam(parampos
, (char*)value
);
83 sqlStmt
->setBinaryParam(parampos
, (char *) value
, length
);
86 printf("unknown type\n");
92 void *SqlStatement::fillBindBuffer(TDBInfo tdbName
, DataType type
, void *&valBuf
, int length
, int nRecords
)
94 BindBuffer
*bBuf
= NULL
;
98 bBuf
= new BindBuffer();
100 bBuf
->type
= typeDate
;
101 bBuf
->length
= sizeof(DATE_STRUCT
);
102 bBuf
->targetdb
= malloc(nRecords
* bBuf
->length
);
103 memset(bBuf
->targetdb
, 0, nRecords
* bBuf
->length
);
104 valBuf
= bBuf
->targetdb
;
107 bBuf
= new BindBuffer();
109 bBuf
->type
= typeTime
;
110 bBuf
->length
= sizeof(TIME_STRUCT
);
111 bBuf
->targetdb
= malloc(nRecords
* bBuf
->length
);
112 memset(bBuf
->targetdb
, 0, nRecords
* bBuf
->length
);
113 valBuf
= bBuf
->targetdb
;
116 bBuf
= new BindBuffer();
118 bBuf
->type
= typeTimeStamp
;
119 bBuf
->length
= sizeof(TIMESTAMP_STRUCT
);
120 bBuf
->targetdb
= malloc(nRecords
* bBuf
->length
);
121 memset(bBuf
->targetdb
, 0, nRecords
* bBuf
->length
);
122 valBuf
= bBuf
->targetdb
;
126 if( tdbName
== postgres
)
128 bBuf
= new BindBuffer();
129 bBuf
->type
= typeLongLong
;
132 int size
= nRecords
*AllDataType::size(typeString
,bBuf
->length
);
133 bBuf
->targetdb
= malloc(size
);
134 memset(bBuf
->targetdb
, 0, size
);
135 valBuf
= bBuf
->targetdb
;
139 bBuf
= new BindBuffer();
142 bBuf
->length
= length
;
149 bBuf
= new BindBuffer();
150 bBuf
->type
= typeString
;
152 bBuf
->length
= length
;
156 bBuf
= new BindBuffer();
159 bBuf
->length
= length
;
162 bBuf
->nullData
= (SQLLEN
*) malloc(nRecords
* sizeof(SQLLEN
));
163 for (int i
= 0; i
< nRecords
; i
++) bBuf
->nullData
[i
] = SQL_NTS
;
167 void SqlStatement::addToHashTable(int stmtID
, AbsSqlStatement
* sHdl
,
168 void *stmtBuckets
, char *stmtstr
)
170 int bucketNo
= stmtID
% STMT_BUCKET_SIZE
;
171 StmtBucket
*buck
= (StmtBucket
*) stmtBuckets
;
172 StmtBucket
*stmtBucket
= &buck
[bucketNo
];
173 StmtNode
*node
= new StmtNode();
174 node
->stmtId
= stmtID
;
176 strcpy(node
->stmtstr
, stmtstr
);
177 stmtBucket
->bucketList
.append(node
);
181 void SqlStatement::removeFromHashTable(int stmtID
, void *stmtBuckets
)
183 int bucketNo
= stmtID
% STMT_BUCKET_SIZE
;
184 StmtBucket
*buck
= (StmtBucket
*) stmtBuckets
;
185 StmtBucket
*stmtBucket
= &buck
[bucketNo
];
186 StmtNode
*node
= NULL
, *delNode
= NULL
;
187 ListIterator it
= stmtBucket
->bucketList
.getIterator();
188 while(it
.hasElement()) {
189 node
= (StmtNode
*) it
.nextElement();
190 if(stmtID
== node
->stmtId
) { delNode
= node
; break; }
193 if (delNode
!= NULL
) {
194 stmtBucket
->bucketList
.remove(delNode
);
200 AbsSqlStatement
*SqlStatement::getStmtFromHashTable(int stmtId
,
203 int bucketNo
= stmtId
% STMT_BUCKET_SIZE
;
204 StmtBucket
*buck
= (StmtBucket
*) stmtBuckets
;
205 StmtBucket
*stmtBucket
= &buck
[bucketNo
];
206 if (stmtBucket
== NULL
) return NULL
;
207 StmtNode
*node
= NULL
;
208 ListIterator it
= stmtBucket
->bucketList
.getIterator();
209 while(it
.hasElement()) {
210 node
= (StmtNode
*) it
.nextElement();
211 if(stmtId
== node
->stmtId
) {
212 SqlStatement
*sqlStmt
= (SqlStatement
*)node
->stmt
;
213 if (!sqlStmt
->isPrepared()) sqlStmt
->prepare(node
->stmtstr
);
220 bool SqlStatement::isStmtInHashTable(int stmtId
, void *stmtBuckets
)
222 int bucketNo
= stmtId
% STMT_BUCKET_SIZE
;
223 StmtBucket
*buck
= (StmtBucket
*) stmtBuckets
;
224 StmtBucket
*stmtBucket
= &buck
[bucketNo
];
225 if (stmtBucket
== NULL
) return false;
226 StmtNode
*node
= NULL
;
227 ListIterator it
= stmtBucket
->bucketList
.getIterator();
228 while(it
.hasElement()) {
229 node
= (StmtNode
*) it
.nextElement();
230 if(stmtId
== node
->stmtId
) {
231 SqlStatement
*sqlStmt
= (SqlStatement
*)node
->stmt
;
232 if (sqlStmt
->isPrepared()) return true;
239 void SqlStatement::freeAllStmtHandles(void *stmtBuckets
)
241 if (NULL
== stmtBuckets
) return;
242 StmtBucket
*buck
= (StmtBucket
*) stmtBuckets
;
243 StmtNode
*node
= NULL
;
244 for (int i
=0; i
<STMT_BUCKET_SIZE
; i
++)
246 StmtBucket
*stmtBucket
= &buck
[i
];
247 if (stmtBucket
== NULL
) continue;
248 ListIterator it
= stmtBucket
->bucketList
.getIterator();
249 while(it
.hasElement()) {
250 node
= (StmtNode
*) it
.nextElement();
258 List
SqlStatement::getTableNameList()
260 return pData
.getTableNameList();
262 SqlStatement::SqlStatement()
269 isMgmtStatement
= false;
270 sqlStmtString
= NULL
;
273 void SqlStatement::setConnection(AbsSqlConnection
*conn
)
275 sqlCon
= (SqlConnection
*)conn
;
279 void SqlStatement::setSqlConnection(SqlConnection
*conn
)
284 DbRetVal
SqlStatement::executeDirect(char *str
)
289 if (rv
!= OK
) return rv
;
291 if (rv
!= OK
) return rv
;
295 void SqlStatement::setStmtString(char *ststr
)
297 if (sqlStmtString
) { ::free(sqlStmtString
); sqlStmtString
=NULL
; }
298 sqlStmtString
= (char*) malloc(strlen(ststr
)+1);
299 strcpy(sqlStmtString
, ststr
);
302 DbRetVal
SqlStatement::prepare()
304 return prepareInt(sqlStmtString
);
307 DbRetVal
SqlStatement::prepare(char *stmtstr
)
309 if (sqlStmtString
) { ::free(sqlStmtString
); sqlStmtString
=NULL
;}
310 sqlStmtString
= (char*) malloc(strlen(stmtstr
)+1);
311 strcpy(sqlStmtString
, stmtstr
);
312 return prepareInt(stmtstr
);
315 DbRetVal
SqlStatement::prepareInt(char *stmtstr
)
318 if (! sqlCon
->isConnectionOpen()) {
319 printError(ErrNotOpen
, "Connection not open");
322 SqlStatement
*cachedStmt
= sqlCon
->findInCache(stmtstr
);
326 this->stmt
->setParsedData(&this->pData
);
328 logFine(Conf::logger
,"GOT STMT FROM CACHE: %s %x", stmtstr
, cachedStmt
);
332 int ret
= ProcessManager::prepareMutex
.tryLock(10, 1000);
335 printError(ErrLockTimeOut
, "Unable to get prepare mutex");
336 return ErrLockTimeOut
;
339 DatabaseManager
*dbMgr
= sqlCon
->getConnObject().getDatabaseManager();
340 if (isPrepared()) free();
344 yy_buffer_state
*yy_buffer
= yy_scan_string(stmtstr
);
346 if (yy_buffer
) yy_delete_buffer(yy_buffer
);
351 ProcessManager::prepareMutex
.releaseLock(-1, false);
352 return ErrSyntaxError
;
354 if( parsedData
->getStmtType() == MgmtStatement
)
358 isMgmtStatement
= true;
359 ProcessManager::prepareMutex
.releaseLock(-1, false);
360 logFine(Conf::logger
,"PREPARE: %s %x", stmtstr
, stmt
);
363 stmt
= StatementFactory::getStatement(parsedData
);
364 stmt
->setDbMgr(dbMgr
);
365 if( parsedData
->getStmtType() == UserStatement
)
367 UserManager
* userMgr
= sqlCon
->getConnObject().getUserManager();
368 UserTblStatement
*ustmt
= (UserTblStatement
*)stmt
;
369 ustmt
->setUserManager(userMgr
,sqlCon
->getConnObject().getUserName());
371 rv
= stmt
->resolve();
376 ProcessManager::prepareMutex
.releaseLock(-1, false);
380 if (!isCachedStmt
&& Conf::config
.getStmtCacheSize() && !getDontCache()) {
381 if (stmt
->noOfParamFields() > 0) {
383 sqlCon
->addToCache(this, stmtstr
);
384 } else if (Conf::config
.useCacheNoParam()) {
385 if (parsedData
->getCacheWorthy()) {
387 sqlCon
->addToCache(this, stmtstr
);
390 } else { printf("stmtstring '%s' not cached\n", stmtstr
); }
392 ProcessManager::prepareMutex
.releaseLock(-1, false);
396 char* SqlStatement::getTableName()
398 return pData
.getTableName();
401 bool SqlStatement::isSelect()
403 if ((pData
.getStmtType() == SelectStatement
) || (pData
.getStmtType() == MetaStatement
)) return true;
407 bool SqlStatement::isPrepared() { return isPrepd
; }
409 DbRetVal
SqlStatement::execute(int &rowsAffected
)
412 if (! sqlCon
->isConnectionOpen()) {
413 printError(ErrNotOpen
, "Connection not open");
416 if (! isPrepared()) {
417 printError(ErrNotPrepared
, "Statement Not Prepared");
418 return ErrNotPrepared
;
420 if( isMgmtStatement
)
423 logFiner(Conf::logger
,"EXECUTE: %x", stmt
);
426 rv
= stmt
->execute(rowsAffected
);
427 if (rv
== ErrAlready
&& pData
.getStmtType() == SelectStatement
)
428 { //if previous scan is not closed, close it
429 SelStatement
*selStmt
= (SelStatement
*) stmt
;
431 rv
= stmt
->execute(rowsAffected
);
433 logFiner(Conf::logger
,"EXECUTE: %x", stmt
);
437 void* SqlStatement::fetch()
439 if (! sqlCon
->isConnectionOpen()) {
440 printError(ErrNotOpen
, "Connection not open");
443 if (! isPrepared()) {
444 printError(ErrNotPrepared
, "Statement Not Prepared");
447 if (pData
.getStmtType() == SelectStatement
) {
448 SelStatement
*selStmt
= (SelStatement
*) stmt
;
449 return selStmt
->fetch();
451 else if(pData
.getStmtType() == MetaStatement
){
452 MetadataStatement
*metaStmt
= (MetadataStatement
*) stmt
;
453 return metaStmt
->fetch();
458 void* SqlStatement::fetch(DbRetVal
&rv
)
460 if (! sqlCon
->isConnectionOpen()) {
461 printError(ErrNotOpen
, "Connection not open");
462 rv
= ErrNoConnection
;
465 if (! isPrepared()) {
466 printError(ErrNotPrepared
, "Statement Not Prepared");
469 if (pData
.getStmtType() == SelectStatement
) {
470 SelStatement
*selStmt
= (SelStatement
*) stmt
;
471 return selStmt
->fetch(rv
);
473 else if(pData
.getStmtType() == MetaStatement
){
474 MetadataStatement
*metaStmt
= (MetadataStatement
*) stmt
;
475 return metaStmt
->fetch(rv
);
480 void* SqlStatement::fetchAndPrint(bool SQL
)
482 if (! sqlCon
->isConnectionOpen()) {
483 printError(ErrNotOpen
, "Connection not open");
486 if (! isPrepared()) {
487 printError(ErrNotPrepared
, "Statement Not Prepared");
490 if (pData
.getStmtType() != SelectStatement
) return NULL
;
491 SelStatement
*selStmt
= (SelStatement
*) stmt
;
492 return selStmt
->fetchAndPrint(SQL
);
495 DbRetVal
SqlStatement::bindParam(int pos
, void* value
)
498 rv
= stmt
->setParam(pos
, value
);
502 DbRetVal
SqlStatement::bindField(int pos
, void* value
)
505 if (pData
.getStmtType() == SelectStatement
) {
506 SelStatement
*selStmt
= (SelStatement
*) stmt
;
507 return selStmt
->setBindField(pos
, value
);
509 else if(pData
.getStmtType() == MetaStatement
){
510 MetadataStatement
*metaStmt
= (MetadataStatement
*) stmt
;
511 return metaStmt
->setBindField(pos
, value
);
513 else { return ErrBadCall
;}
515 void* SqlStatement::next()
517 if (pData
.getStmtType() == SelectStatement
) {
518 SelStatement
*selStmt
= (SelStatement
*) stmt
;
519 return( (void*) selStmt
->next() );
521 else if(pData
.getStmtType() == MetaStatement
){
522 MetadataStatement
*metaStmt
= (MetadataStatement
*) stmt
;
523 return( (void*) metaStmt
->next() );
528 bool SqlStatement::isFldNull(int pos
)
530 if (pData
.getStmtType() != SelectStatement
) return 0;
531 SelStatement
*selStmt
= (SelStatement
*) stmt
;
532 return (selStmt
->isFldNull(pos
));
534 bool SqlStatement::isFldNull(char *name
)
536 if (pData
.getStmtType() != SelectStatement
) return 0;
537 SelStatement
*selStmt
= (SelStatement
*) stmt
;
538 return (selStmt
->isFldNull(name
));
540 DbRetVal
SqlStatement::close()
542 if (pData
.getStmtType() == SelectStatement
) {
543 SelStatement
*selStmt
= (SelStatement
*) stmt
;
544 logFinest(Conf::logger
,"CLOSE: %x", stmt
);
545 return selStmt
->close();
547 else if(pData
.getStmtType() == MetaStatement
){
548 MetadataStatement
*selStmt
= (MetadataStatement
*) stmt
;
549 logFinest(Conf::logger
,"CLOSE: %x", stmt
);
550 return selStmt
->close();
555 void* SqlStatement::getParamValuePtr( int pos
)
557 //if (pData.getStmtType() != SelectStatement) return 0;
558 DmlStatement
*dmlStmt
= (DmlStatement
*) stmt
;
559 return( (void*) dmlStmt
->getParamValuePtr( pos
) );
562 char* SqlStatement::getFieldName( int pos
)
564 if (pData
.getStmtType() == SelectStatement
) {
565 SelStatement
*selStmt
= (SelStatement
*) stmt
;
566 return( (char*) selStmt
->getFieldName( pos
) );
568 else if(pData
.getStmtType() == MetaStatement
){
569 MetadataStatement
*selStmt
= (MetadataStatement
*) stmt
;
570 return( (char*) selStmt
->getFieldName( pos
) );
575 DataType
SqlStatement::getFieldType( int pos
)
577 if (pData
.getStmtType() == SelectStatement
) {
578 SelStatement
*selStmt
= (SelStatement
*) stmt
;
579 return( (DataType
) selStmt
->getFieldType( pos
) );
581 else if(pData
.getStmtType() == MetaStatement
){
582 MetadataStatement
*selStmt
= (MetadataStatement
*) stmt
;
583 return( (DataType
) selStmt
->getFieldType( pos
) );
585 else { return typeUnknown
;}
587 int SqlStatement::getFieldLength( int pos
)
589 if (pData
.getStmtType() == SelectStatement
) {
590 SelStatement
*selStmt
= (SelStatement
*) stmt
;
591 return( (int) selStmt
->getFieldLength( pos
) );
593 else if(pData
.getStmtType() == MetaStatement
){
594 MetadataStatement
*selStmt
= (MetadataStatement
*) stmt
;
595 return( (int) selStmt
->getFieldLength( pos
) );
600 void* SqlStatement::getFieldValuePtr( int pos
)
602 if (pData
.getStmtType() == SelectStatement
) {
603 SelStatement
*selStmt
= (SelStatement
*) stmt
;
604 return( (void*) selStmt
->getFieldValuePtr( pos
) );
606 else if(pData
.getStmtType() == MetaStatement
){
607 MetadataStatement
*selStmt
= (MetadataStatement
*) stmt
;
608 return( (void*) selStmt
->getFieldValuePtr( pos
) );
612 void* SqlStatement::getFieldValuePtr( char *name
)
614 if (pData
.getStmtType() == SelectStatement
) {
615 SelStatement
*selStmt
= (SelStatement
*) stmt
;
616 return( (void*) selStmt
->getFieldValuePtr( name
) );
618 else if(pData
.getStmtType() == MetaStatement
){
619 MetadataStatement
*selStmt
= (MetadataStatement
*) stmt
;
620 return( (void*) selStmt
->getFieldValuePtr( name
) );
625 int SqlStatement::noOfProjFields()
627 if (pData
.getStmtType() == SelectStatement
) {
628 SelStatement
*selStmt
= (SelStatement
*) stmt
;
629 return selStmt
->noOfProjFields();
631 else if(pData
.getStmtType() == MetaStatement
){
632 MetadataStatement
*selStmt
= (MetadataStatement
*) stmt
;
633 return selStmt
->noOfProjFields();
638 void SqlStatement::getProjFieldType(int *data
)
640 if (pData
.getStmtType() == SelectStatement
) {
641 SelStatement
*selStmt
= (SelStatement
*) stmt
;
642 return( selStmt
->getProjFieldType(data
) );
644 else if(pData
.getStmtType() == MetaStatement
){
645 MetadataStatement
*selStmt
= (MetadataStatement
*) stmt
;
646 return( selStmt
->getProjFieldType(data
) );
652 int SqlStatement::noOfParamFields()
654 if (NULL
== stmt
) return 0;
655 else return stmt
->noOfParamFields();
658 DbRetVal
SqlStatement::getProjFldInfo (int projpos
, FieldInfo
*&fInfo
)
661 if (pData
.getStmtType() == SelectStatement
) {
662 SelStatement
*selStmt
= (SelStatement
*) stmt
;
663 rv
= selStmt
->getProjFldInfo(projpos
, fInfo
);
665 else if(pData
.getStmtType() == MetaStatement
){
666 MetadataStatement
*selStmt
= (MetadataStatement
*) stmt
;
667 rv
= selStmt
->getProjFldInfo(projpos
, fInfo
);
668 } else { return ErrBadCall
;}
672 DbRetVal
SqlStatement::getParamFldInfo (int parampos
, FieldInfo
*&fInfo
)
675 if (pData
.getStmtType() ==SelectStatement
||
676 pData
.getStmtType() ==InsertStatement
||
677 pData
.getStmtType() ==UpdateStatement
||
678 pData
.getStmtType() ==DeleteStatement
)
681 DmlStatement
*dmlStmt
= (DmlStatement
*) stmt
;
682 rv
= dmlStmt
->getParamFldInfo(parampos
, fInfo
);
687 DbRetVal
SqlStatement::free()
689 logFinest(Conf::logger
,"FREE: %x", stmt
);
695 sqlCon
->setStmtNotInUse(sqlStmtString
);
696 ::free(sqlStmtString
); sqlStmtString
=NULL
;
698 isCachedStmt
= false;
701 if(stmt
) delete stmt
;
704 isMgmtStatement
= false;
706 isCachedStmt
= false;
707 if (sqlStmtString
) { ::free(sqlStmtString
); sqlStmtString
=NULL
; }
711 void SqlStatement::setNull(int pos
)
715 void SqlStatement::setShortParam(int paramPos
, short value
)
717 stmt
->setShortParam(paramPos
, value
);
719 void SqlStatement::setIntParam(int paramPos
, int value
)
721 stmt
->setIntParam(paramPos
, value
);
723 void SqlStatement::setLongParam(int paramPos
, long value
)
725 stmt
->setLongParam(paramPos
, value
);
727 void SqlStatement::setLongLongParam(int paramPos
, long long value
)
729 stmt
->setLongLongParam(paramPos
, value
);
731 void SqlStatement::setByteIntParam(int paramPos
, ByteInt value
)
733 stmt
->setByteIntParam(paramPos
, value
);
735 void SqlStatement::setFloatParam(int paramPos
, float value
)
737 stmt
->setFloatParam(paramPos
, value
);
739 void SqlStatement::setDoubleParam(int paramPos
, double value
)
741 stmt
->setDoubleParam(paramPos
, value
);
743 void SqlStatement::setStringParam(int paramPos
, char *value
)
745 stmt
->setStringParam(paramPos
, value
);
747 void SqlStatement::setDateParam(int paramPos
, Date value
)
749 stmt
->setDateParam(paramPos
, value
);
751 void SqlStatement::setTimeParam(int paramPos
, Time value
)
753 stmt
->setTimeParam(paramPos
, value
);
755 void SqlStatement::setTimeStampParam(int paramPos
, TimeStamp value
)
757 stmt
->setTimeStampParam(paramPos
, value
);
759 void SqlStatement::setBinaryParam(int paramPos
, void *value
, int length
)
761 stmt
->setBinaryParam(paramPos
, value
, length
);
763 int SqlStatement::getFldPos(char *name
)
765 return stmt
->getFldPos(name
);
767 long long SqlStatement::getLastInsertedVal(DbRetVal
&rv
)
769 return stmt
->getLastInsertedVal(rv
);
771 List
SqlStatement::getAllTableNames(DbRetVal
&ret
)
773 DatabaseManager
*dbMgr
= NULL
;
775 dbMgr
=sqlCon
->getConnObject().getDatabaseManager();
777 if(dbMgr
!= NULL
) tbNmList
= dbMgr
->getAllTableNames(&rv
);
782 List
SqlStatement::getAllUserNames(DbRetVal
&ret
)
784 UserManager
*urMgr
= NULL
;
786 urMgr
=sqlCon
->getConnObject().getUserManager();
789 urNmList
= urMgr
->getAllUserNames(&rv
);
793 List
SqlStatement::getFieldNameList(const char *tblName
, DbRetVal
&rv
)
797 fldNameList
= stmt
->getFieldNameList(tblName
, rv
);
800 DatabaseManager
*dbMgr
= sqlCon
->getConnObject().getDatabaseManager();
801 Table
*table
= dbMgr
->openTable(tblName
);
804 printError(ErrLockTimeOut
, "Unable to open table %s", tblName
);
807 fldNameList
= table
->getFieldNameList();
808 dbMgr
->closeTable(table
);
811 DbRetVal
SqlStatement::getFieldInfo(const char *tblName
, const char *fldName
, FieldInfo
*&info
)
815 rv
= stmt
->getFieldInfo(tblName
, fldName
, info
);
818 DatabaseManager
*dbMgr
= sqlCon
->getConnObject().getDatabaseManager();
819 Table
*table
= dbMgr
->openTable(tblName
);
821 printError(ErrLockTimeOut
, "Unable to open table %s", tblName
);
822 return ErrLockTimeOut
;
824 rv
= table
->getFieldInfo(fldName
, info
);
825 dbMgr
->closeTable(table
);
828 void SqlStatement::setLoading(bool flag
)
830 if (pData
.getStmtType() == InsertStatement
||
831 pData
.getStmtType() == UpdateStatement
||
832 pData
.getStmtType() == DeleteStatement
)
834 DmlStatement
*dmlStmt
= (DmlStatement
*) stmt
;
835 dmlStmt
->setLoading(flag
);
840 int SqlStatement::getNoOfPagesForTable(char *tblName
)
842 DatabaseManager
*dbMgr
= sqlCon
->getConnObject().getDatabaseManager();
843 DatabaseManagerImpl
*dbMgrImpl
= (DatabaseManagerImpl
*)dbMgr
;
844 return dbMgrImpl
->getNoOfPagesForTable(tblName
);
847 DbRetVal
SqlStatement::loadRecords(char *tblName
, void *buf
)
849 DatabaseManager
*dbMgr
= sqlCon
->getConnObject().getDatabaseManager();
850 DatabaseManagerImpl
*dbMgrImpl
= (DatabaseManagerImpl
*)dbMgr
;
851 return dbMgrImpl
->loadRecords(tblName
, (char *) buf
);
854 DbRetVal
SqlStatement::pasteRecords(char *tblName
, void *buffer
)
856 DatabaseManager
*dbMgr
= sqlCon
->getConnObject().getDatabaseManager();
857 DatabaseManagerImpl
*dbMgrImpl
= (DatabaseManagerImpl
*)dbMgr
;
858 return dbMgrImpl
->pasteRecords(tblName
, buffer
);
860 void SqlStatement::flushCacheStmt()
862 return sqlCon
->flushCacheStmt();
865 void SqlStatement::resetStmtString() {
868 //-------------------------------------------------------------------
870 static void sigTermHandler(int sig
)
872 ListIterator iter
= SqlConnection::connList
.getIterator();
873 SqlConnection
*conn
= NULL
;
874 while (iter
.hasElement())
876 conn
= (SqlConnection
*) iter
.nextElement();
877 conn
->flushCacheStmt();
878 if (conn
->isConnectionOpen()) conn
->disconnect();
883 DbRetVal
SqlConnection::connect (char *user
, char * pass
)
885 DbRetVal ret
= conn
.open(user
, pass
);
886 if (ret
!= OK
) return ret
;
887 if (ret
== OK
) isConnOpen
= true;
888 if (!isInit
) initialize();
889 connList
.append(this);
891 #if (defined MMDB && EMBED)
892 os::signal(SIGINT
, sigTermHandler
);
893 os::signal(SIGTERM
, sigTermHandler
);
894 if (Conf::config
.useDurability() && !firstThread
) {
895 rv
= recoverCsqlDB();
897 printError(ErrSysInternal
, "Recovery Failed");
902 rollback(); //for drop table execute in redo log
907 void SqlConnection::flushCacheStmt()
909 ListIterator iter
= cachedStmts
.getIterator();
910 while (iter
.hasElement()) {
911 CachedStmtNode
* node
= (CachedStmtNode
*) iter
.nextElement();
912 //do not delete when the statement is currently in use.
913 //otherwise it leads to illegal memory access when application
914 //calls any method on this statement
915 //if (node->inUse) continue;
916 if (node
->inUse
) node
->inUse
= 0;
917 free(node
->sqlString
);
918 node
->sqlStmt
->setCachedStmt(false);
919 node
->sqlStmt
->free();
920 delete node
->sqlStmt
;
927 void SqlConnection::setStmtNotInUse(char *stmtstr
)
929 ListIterator iter
= cachedStmts
.getIterator();
930 int inputStmtLen
= strlen(stmtstr
);
931 CachedStmtNode
*node
= NULL
;
932 while ((node
= (CachedStmtNode
*)iter
.nextElement()) != NULL
)
934 if (node
->stmtLength
== inputStmtLen
)
936 if (0 == strcmp(node
->sqlString
, stmtstr
))
945 SqlStatement
* SqlConnection::findInCache(char *stmtstr
)
947 ListIterator iter
= cachedStmts
.getIterator();
948 int inputStmtLen
= strlen(stmtstr
);
949 CachedStmtNode
*node
= NULL
;
950 while ((node
= (CachedStmtNode
*)iter
.nextElement()) != NULL
)
952 if (node
->stmtLength
== inputStmtLen
)
954 if (0 == strcmp(node
->sqlString
, stmtstr
))
956 logFiner(Conf::logger
, "Statement Retrieved From Cache %x\n",
960 return node
->sqlStmt
;
967 void SqlConnection::addToCache(SqlStatement
*sqlStmt
, char* stmtString
)
969 SqlStatement
*stmt
= new SqlStatement();
971 CachedStmtNode
*node
= new CachedStmtNode();
972 node
->sqlStmt
= stmt
;
973 node
->stmtLength
= strlen(stmtString
);
974 node
->sqlString
= (char*)malloc(node
->stmtLength
+1);
976 strcpy(node
->sqlString
, stmtString
);
977 if (cachedStmts
.size() >= Conf::config
.getStmtCacheSize())
981 node
->sqlStmt
->resetStmtString();
982 cachedStmts
.append(node
);
983 logFiner(Conf::logger
, "Statement added To Cache %x\n", node
->sqlStmt
);
984 logFinest(Conf::logger
, "Statement added To Cache %s\n", node
->sqlString
);
988 void SqlConnection::removeLeastUsed()
990 ListIterator iter
= cachedStmts
.getIterator();
991 CachedStmtNode
*node
= NULL
, *toRemove
=NULL
;
993 bool firstCall
= true;
994 while((node
= (CachedStmtNode
*) iter
.nextElement()) != NULL
)
998 lowHits
= node
->hits
;
999 toRemove
= node
; //if cache size is 1
1002 if (lowHits
>= node
->hits
) toRemove
= node
;
1004 cachedStmts
.remove(toRemove
);
1005 //TODO::check whether there is memory leak for list elements
1006 logFiner(Conf::logger
, "Statement removed from Cache %x\n", toRemove
->sqlStmt
);
1007 logFinest(Conf::logger
, "Statement removed from Cache %s\n", toRemove
->sqlString
);
1008 delete toRemove
; toRemove
= NULL
;
1012 SqlConnection::~SqlConnection()
1015 if (isConnOpen
) disconnect();
1019 static void sigUsr1Handler(int sig
)
1021 ListIterator iter
= SqlConnection::connList
.getIterator();
1022 SqlConnection
*conn
= NULL
;
1023 while (iter
.hasElement())
1025 conn
= (SqlConnection
*) iter
.nextElement();
1026 conn
->flushCacheStmt();
1028 os::signal(SIGCSQL1
, sigUsr1Handler
);
1032 static void exithandler(void)
1034 ListIterator iter
= SqlConnection::connList
.getIterator();
1035 SqlConnection
*conn
= NULL
;
1036 while (iter
.hasElement())
1038 conn
= (SqlConnection
*) iter
.nextElement();
1039 conn
->flushCacheStmt();
1043 void SqlConnection::displayStmtCache()
1045 ListIterator iter
= cachedStmts
.getIterator();
1046 CachedStmtNode
*node
= NULL
;
1047 printf("STATEMENT CACHE START \n");
1048 while ((node
= (CachedStmtNode
*)iter
.nextElement()) != NULL
)
1052 printf("STATEMENT CACHE END\n");
1055 void SqlConnection::initialize()
1057 os::signal(SIGCSQL1
, sigUsr1Handler
);
1058 #if (defined MMDB && defined EMBED)
1059 os::atexit(exithandler
);
1064 DbRetVal
SqlStatement::filterAndWriteStmtLogs(void *stmtBuckets
)
1067 char fName
[MAX_FILE_LEN
];
1068 sprintf(fName
, "%s/csql.db.stmt", Conf::config
.getDbFile());
1069 file_desc fdRead
= os::openFile(fName
, fileOpenReadOnly
,0);
1070 if ((file_desc
)-1 == fdRead
) { return OK
; }
1071 if (::stat(fName
, &st
) == -1) {
1072 printError(ErrSysInternal
, "Unable to retrieve stmt log file size");
1073 os::closeFile(fdRead
);
1074 return ErrSysInternal
;
1076 if (st
.st_size
==0) {
1077 os::closeFile(fdRead
);
1080 void *startAddr
= os::mmap(NULL
, st
.st_size
, mapProtRead
, mapPrivate
, fdRead
, 0);
1081 if ((void*)MAP_FAILED
== startAddr
) {
1082 printError(ErrSysInternal
, "Unable to mmap stmt log file\n");
1083 return ErrSysInternal
;
1085 sprintf(fName
, "%s/csql.db.stmt1", Conf::config
.getDbFile());
1086 int fd
= os::openFileForAppend(fName
, O_CREAT
|O_TRUNC
);
1087 char *iter
= (char*)startAddr
;
1088 char *logStart
= NULL
, *logEnd
= NULL
;
1094 if (iter
- (char*)startAddr
>= st
.st_size
) break;
1095 logType
= *(int*)iter
;
1097 if (logType
== -1) { //prepare
1098 iter
= iter
+ sizeof(int);
1100 iter
= iter
+ 2 * sizeof(int);
1101 stmtID
= *(int*)iter
;
1102 iter
= logStart
+ len
;
1104 if (isStmtInHashTable(stmtID
,stmtBuckets
))
1105 ret
= os::write(fd
, logStart
, len
);
1107 printError(ErrSysInternal
, "Unable to write statement logs");
1110 else if(logType
== -3) { //free
1111 iter
= logStart
+ 4 *sizeof(int);
1113 printError(ErrSysInternal
, "Stmt Redo log file corrupted: logType:%d", logType
);
1114 rv
= ErrSysInternal
;
1119 os::munmap((char*)startAddr
, st
.st_size
);
1120 os::closeFile(fdRead
);
1121 char cmd
[MAX_FILE_LEN
*2];
1122 sprintf(cmd
, "mv %s/csql.db.stmt1 %s/csql.db.stmt",
1123 Conf::config
.getDbFile(), Conf::config
.getDbFile());
1124 ret
= ::system(cmd
);
1128 DbRetVal
SqlStatement::readAndPopulateStmts(AbsSqlConnection
*conn
, void *&stmtBuckets
, bool list
, bool interactive
)
1131 char fName
[MAX_FILE_LEN
];
1132 sprintf(fName
, "%s/csql.db.stmt", Conf::config
.getDbFile());
1133 printf("Statement Redo log filename is :%s\n", fName
);
1134 file_desc fd
= os::openFile(fName
, fileOpenReadOnly
, 0);
1135 if ((file_desc
)-1 == fd
) { return OK
; }
1136 if (::stat(fName
, &st
) == -1) {
1137 printError(ErrSysInternal
, "Unable to retrieve stmt log file size");
1139 return ErrSysInternal
;
1141 if (NULL
!= stmtBuckets
)
1143 printError(ErrSysInternal
, "stmtBuckets already populated");
1145 return ErrSysInternal
;
1147 stmtBuckets
= malloc (STMT_BUCKET_SIZE
* sizeof(StmtBucket
));
1148 memset(stmtBuckets
, 0, STMT_BUCKET_SIZE
* sizeof(StmtBucket
));
1149 if (st
.st_size
==0) {
1150 printError(ErrNote
, "No Statement logs found during recovery");
1151 ::free(stmtBuckets
);
1156 void *startAddr
= os::mmap(NULL
, st
.st_size
, mapProtRead
, mapPrivate
, fd
, 0);
1157 if ((void*)MAP_FAILED
== startAddr
) {
1158 printError(ErrSysInternal
, "Unable to mmap stmt log file\n");
1159 ::free(stmtBuckets
);
1162 return ErrSysInternal
;
1164 DbRetVal rv
= iterateStmtLogs(conn
, startAddr
, st
.st_size
, stmtBuckets
, list
, interactive
);
1165 os::munmap((char*)startAddr
, st
.st_size
);
1170 DbRetVal
SqlStatement::iterateStmtLogs(AbsSqlConnection
*conn
, void *startAddr
, int size
, void *stmtBuckets
, bool list
, bool interactive
)
1172 char *iter
= (char*)startAddr
;
1177 int len
, ret
, retVal
=0;
1179 char stmtString
[SQL_STMT_LEN
];
1182 if (iter
- (char*)startAddr
>= size
) break;
1183 logType
= *(int*)iter
;
1184 if (logType
== -1) { //prepare
1185 iter
= iter
+ sizeof(int);
1186 txnID
= *(int*) iter
; iter
+= sizeof(int);
1187 loglen
= *(int*) iter
; iter
+= sizeof(int);
1188 stmtID
= *(int*)iter
;
1189 iter
= iter
+ sizeof(int);
1191 iter
= iter
+ sizeof(int);
1192 strncpy(stmtString
, iter
, len
);
1195 printf("PREPARE: SID:%d %s\n", stmtID
, stmtString
);
1198 if (interactive
) printf("STMTLOG PREPARE SID:%d %s\n", stmtID
, stmtString
);
1199 AbsSqlStatement
*csqlStmt
= SqlFactory::createStatement(CSqlDirect
);
1200 csqlStmt
->setConnection(conn
);
1201 SqlStatement
*sqlStmt
= (SqlStatement
*)csqlStmt
;
1202 sqlStmt
->setStmtString(stmtString
);
1203 addToHashTable(stmtID
, csqlStmt
, stmtBuckets
, stmtString
);
1205 else if(logType
== -3) { //free
1206 iter
= iter
+ sizeof(int);
1207 txnID
= *(int*) iter
; iter
+= sizeof(int);
1208 loglen
= *(int*) iter
; iter
+= sizeof(int);
1209 stmtID
= *(int*)iter
;
1210 iter
= iter
+ sizeof(int);
1212 printf("FREE: SID:%d TID:%d \n", stmtID
, txnID
);
1216 printError(ErrSysInternal
, "Stmt Redo log file corrupted: logType:%d", logType
);
1217 rv
= ErrSysInternal
;
1224 #if (defined MMDB && defined EMBED)
1226 DbRetVal
SqlConnection::recoverCsqlDB()
1229 char dbRedoFileName
[MAX_FILE_LEN
];
1230 char dbChkptSchema
[MAX_FILE_LEN
];
1231 char dbChkptMap
[MAX_FILE_LEN
];
1232 char dbChkptData
[MAX_FILE_LEN
];
1233 char dbBackupFile
[MAX_FILE_LEN
];
1234 char cmd
[IDENTIFIER_LENGTH
];
1235 //check for check point file if present recover
1236 sprintf(dbChkptSchema
, "%s/db.chkpt.schema1", Conf::config
.getDbFile());
1237 if (FILE *file
= fopen(dbChkptSchema
, "r")) {
1239 sprintf(cmd
, "cp -f %s %s/db.chkpt.schema", dbChkptSchema
,
1240 Conf::config
.getDbFile());
1241 int ret
= system(cmd
);
1242 if (ret
!= 0) return ErrOS
;
1244 sprintf(dbChkptMap
, "%s/db.chkpt.map1", Conf::config
.getDbFile());
1245 if (FILE *file
= fopen(dbChkptMap
, "r")) {
1247 sprintf(cmd
, "cp -f %s %s/db.chkpt.map", dbChkptMap
,
1248 Conf::config
.getDbFile());
1249 int ret
= system(cmd
);
1250 if (ret
!= 0) return ErrOS
;
1252 int chkptID
= Database::getCheckpointID();
1253 sprintf(dbChkptData
, "%s/db.chkpt.data%d", Conf::config
.getDbFile(),
1255 sprintf(dbBackupFile
, "%s/db.chkpt.data1", Conf::config
.getDbFile());
1257 if (!Conf::config
.useMmap() && (fl
= fopen(dbBackupFile
, "r"))) {
1259 sprintf(cmd
, "cp %s/db.chkpt.data1 %s", Conf::config
.getDbFile(),
1261 int ret
= system(cmd
);
1262 if (ret
!= 0) return ErrOS
;
1264 if (FILE *file
= fopen(dbChkptData
, "r")) {
1266 rv
= recoverSystemAndUserDB();
1267 if (rv
!= OK
) return rv
;
1270 //check for redo log file if present apply redo logs
1271 sprintf(dbRedoFileName
, "%s/csql.db.cur", Conf::config
.getDbFile());
1272 if (FILE *file
= fopen(dbRedoFileName
, "r"))
1275 rv
= (DbRetVal
) applyRedoLogs(dbRedoFileName
);
1276 if (rv
!= OK
) return rv
;
1277 DatabaseManager
*dbMgr
= getConnObject().getDatabaseManager();
1278 rv
= dbMgr
->checkPoint();
1281 printError(ErrSysInternal
, "checkpoint failed after redo log apply");
1288 DbRetVal
SqlConnection::recoverSystemAndUserDB()
1292 sprintf(schFile
, "%s/db.chkpt.schema", Conf::config
.getDbFile());
1293 if (FILE *file
= fopen(schFile
, "r")) {
1294 rv
= applySchemaFile(file
);
1295 if (rv
!= OK
) { fclose(file
); return rv
; }
1297 DatabaseManager
*dbMgr
= getConnObject().getDatabaseManager();
1298 rv
= dbMgr
->recover();
1302 DbRetVal
SqlConnection::applySchemaFile(FILE *fp
)
1307 SqlStatement
*stmt
= new SqlStatement();
1308 while ((eof
= getQueryFromSchemaFile(fp
,buf
)) != EOF
) {
1309 stmt
->setConnection(this);
1310 rv
= stmt
->prepare(buf
);
1311 if (rv
!= OK
) { delete stmt
; return rv
; }
1313 stmt
->execute(rows
);
1314 if (rv
!= OK
) { stmt
->free(); delete stmt
; return rv
; }
1320 char SqlConnection::getQueryFromSchemaFile(FILE *fp
, char *buf
)
1322 char c
, *bufBegin
=buf
;
1324 while( (c
=(char ) fgetc(fp
)) != EOF
&& c
!= ';')
1326 *buf
++ = c
; charCnt
++;
1327 if( charCnt
== SQL_STMT_LEN
) {
1328 printf("SQL Statement length is greater than %d. "
1329 "Ignoring the statement.\n", SQL_STMT_LEN
);
1340 int SqlConnection::applyRedoLogs(char *redoFile
)
1344 int fd
= open(redoFile
, O_RDONLY
);
1345 if (-1 == fd
) { return OK
; }
1346 if (fstat(fd
, &st
) == -1) {
1347 printError(ErrSysInternal
, "Unable to retrieve undo log file size");
1351 if (st
.st_size
==0) {
1352 printError(ErrNote
, "No Redo logs found during recovery");
1353 SqlStatement::readAndPopulateStmts(this, stmtBuckets
);
1357 void *startAddr
= mmap(NULL
, st
.st_size
, PROT_READ
, MAP_PRIVATE
, fd
, 0);
1358 if (MAP_FAILED
== startAddr
) {
1359 printf("Unable to read undo log file:mmap failed.\n");
1363 rv
= SqlStatement::readAndPopulateStmts(this, stmtBuckets
);
1366 printf("Unable to read stmt log file\n");
1370 char *iter
= (char*)startAddr
;
1375 int len
, ret
, retVal
=0;
1377 char stmtString
[SQL_STMT_LEN
];
1379 if (iter
- (char*)startAddr
>= st
.st_size
) break;
1380 logType
= *(int*)iter
;
1381 if (logType
== -1) { //prepare
1382 iter
= iter
+ sizeof(int);
1383 txnID
= *(int*) iter
; iter
+= sizeof(int);
1384 loglen
= *(int*) iter
; iter
+= sizeof(int);
1385 stmtID
= *(int*)iter
;
1386 iter
= iter
+ sizeof(int);
1388 iter
= iter
+ sizeof(int);
1389 strncpy(stmtString
, iter
, len
);
1391 AbsSqlStatement
*stmt
= SqlFactory::createStatement(CSqlDirect
);
1392 SqlStatement
*sqlStmt
= (SqlStatement
*)stmt
;
1393 stmt
->setConnection(this);
1394 rv
= stmt
->prepare(stmtString
);
1396 printError(ErrSysInternal
, "unable to prepare stmt:%s", stmtString
);
1400 sqlStmt
->setLoading(true);
1401 SqlStatement::addToHashTable(stmtID
, stmt
, stmtBuckets
, stmtString
);
1403 else if(logType
== -2) { //commit
1405 iter
= iter
+ sizeof(int);
1406 txnID
= *(int*) iter
; iter
+= sizeof(int);
1407 loglen
= *(int*) iter
; iter
+= sizeof(int);
1408 char *curPtr
= iter
;
1410 if (iter
- (char*)startAddr
>= st
.st_size
) {
1415 stmtID
= *(int*)iter
;
1416 iter
= iter
+ sizeof(int);
1417 eType
= *(int*)iter
;
1418 AbsSqlStatement
*stmt
=
1419 SqlStatement::getStmtFromHashTable(stmtID
,stmtBuckets
);
1421 printError(ErrSysInternal
,
1422 "Unable to find in stmt hashtable");
1426 if (0 == eType
) { //execute type
1427 iter
= iter
+ sizeof(int);
1428 rv
= stmt
->execute(ret
);
1430 printError(ErrSysInternal
, "unable to execute");
1434 if (*(int*)iter
<0) break;
1435 } else if ( 1 == eType
) { //set type
1436 iter
=iter
+sizeof(int);
1437 int pos
= *(int*) iter
;
1438 iter
=iter
+sizeof(int);
1439 int isNull
= *(int *)iter
;
1440 iter
= iter
+ sizeof(int);
1442 DataType type
= (DataType
)(*(int*)iter
);
1443 iter
=iter
+sizeof(int);
1444 int len
= *(int*) iter
;
1445 iter
=iter
+sizeof(int);
1448 SqlStatement::setParamValues(stmt
, pos
,
1450 } else stmt
->setNull(pos
);
1451 if (*(int*)iter
<0) break;
1456 else if(logType
== -3) { //free
1457 iter
= iter
+ sizeof(int);
1458 txnID
= *(int*) iter
; iter
+= sizeof(int);
1459 loglen
= *(int*) iter
; iter
+= sizeof(int);
1460 stmtID
= *(int*)iter
;
1461 iter
= iter
+ sizeof(int);
1462 AbsSqlStatement
*stmt
= SqlStatement::getStmtFromHashTable(stmtID
,
1466 SqlStatement::removeFromHashTable(stmtID
,stmtBuckets
);
1467 } else { printError(ErrSysInternal
, "statement not found for %d\n",stmtID
);}
1469 else if(logType
== -4) { //prepare and execute
1470 iter
= iter
+ sizeof(int);
1471 txnID
= *(int*) iter
; iter
+= sizeof(int);
1472 loglen
= *(int*) iter
; iter
+= sizeof(int);
1473 stmtID
= *(int*)iter
;
1474 iter
= iter
+ sizeof(int);
1476 iter
= iter
+ sizeof(int);
1477 strncpy(stmtString
, iter
, len
);
1478 stmtString
[len
+1] ='\0';
1480 AbsSqlStatement
*stmt
= SqlFactory::createStatement(CSqlDirect
);
1481 if ( NULL
== stmt
) {
1482 printError(ErrSysInternal
, "unable to prepare:%s", stmtString
);
1486 stmt
->setConnection(this);
1487 rv
= stmt
->prepare(stmtString
);
1489 printError(ErrSysInternal
, "unable to prepare:%s", stmtString
);
1493 rv
= stmt
->execute(ret
);
1495 if (strlen(stmtString
) > 6 &&
1496 ( (strncasecmp(stmtString
,"CREATE", 6) == 0) ||
1497 (strncasecmp(stmtString
,"DROP", 4) == 0) ||
1498 (strncasecmp(stmtString
,"RENAME", 6) == 0) ||
1499 (strncasecmp(stmtString
,"ALTER", 5) == 0) )) {
1502 printError(ErrSysInternal
, "unable to execute %s", stmtString
);
1508 printError(ErrSysInternal
, "Redo log file corrupted: logType:%d", logType
);
1513 munmap((char*)startAddr
, st
.st_size
);
1515 SqlStatement::filterAndWriteStmtLogs(stmtBuckets
);
1516 SqlStatement::freeAllStmtHandles(stmtBuckets
);