Hi there,
I am a huge fan of SQLIte and have recently done some code that I am
debugging with TotalView and MemoryScape (http://www.roguewave.com) -
VERY VERY nice debugger, I have used GDB as well alot but Totalview is
simply awesome....
NOTE: C coding is NOT my day job ;-)
I am using MemoryScape (I suppose the same as Valgrind) to detect Memory
leaks in my code.....when I look at the leak detection I can see I have
some small leaks in my SQLIte code....and would love someone to tell me
how I can fix them?
For example is moans about the following 2 lines below:
- idx = sqlite3_bind_parameter_index( stmt, ":tid" );
- rc = sqlite3_step(stmt);
Here is more of the code context....
int queue_peekByTID(const char *tid, message *msg){
char *peekText = "SELECT * FROM queue WHERE tid = :tid;";
const char *value = NULL;
int idx;
int len;
sqlite3_prepare_v2(handle,peekText,-1,&stmt,0 );
idx = sqlite3_bind_parameter_index( stmt, ":tid" );
sqlite3_bind_text( stmt, idx, tid, -1, SQLITE_STATIC );
rc = sqlite3_step(stmt);
if(rc == SQLITE_ROW){
....
....
}
What is wrong with my code above? Must I FREE the char*? Why would
something say it was a "leak"?
I am also getting it complaining when I do a "sqlite3_finalize(stmt);"
I another piece of code I am using SQLite to log certain events for
me....and complains about the following 3 lines below:
- rc = sqlite3_open_v2(eventLogName,&handle, SQLITE_OPEN_READWRITE |
SQLITE_OPEN_SHAREDCACHE | SQLITE_OPEN_CREATE, NULL);
- rc = sqlite3_exec(handle,journalMode,0,0,0);
- rc = sqlite3_exec(handle,trigger,0,0,0);
Here is the code context....
int eventLogOpen(char *eventLogName, unsigned int eventLogRetentionPeriod){
char *eventLogTable = "CREATE TABLE IF NOT EXISTS [log] ( "
"[idx] INTEGER NOT NULL PRIMARY KEY
AUTOINCREMENT, "
"[timestamp] CHAR(25), "
"[timestamp_secs] CHAR(10), "
"[event_cat] CHAR(10), "
"[event_tid] CHAR(50), "
"[event_bus_ref] CHAR(50), "
"[event_msg] TEXT);";
char trigger[2024];
if(eventLogRetentionPeriod > 0){
sprintf(trigger, "DROP TRIGGER IF EXISTS [log_retention]; "
"CREATE TRIGGER [log_retention] "
"AFTER INSERT ON log "
"FOR EACH ROW BEGIN "
"DELETE FROM log "
"WHERE timestamp_secs < (strftime('%%s',
'now') - %i); "
"END;", eventLogRetentionPeriod);
}
char *journalMode = "PRAGMA journal_mode=wal;";
int successFlag = ERROR;
rc = sqlite3_open_v2(eventLogName,&handle, SQLITE_OPEN_READWRITE |
SQLITE_OPEN_SHAREDCACHE | SQLITE_OPEN_CREATE, NULL);
if (rc == OK){
successFlag = OK;
p = sqlite3_malloc(256);
sqlite3_busy_handler(handle, &eventLoggerBusyHandler, p);
sqlite3_free(p);
sqlite3_exec(handle,"PRAGMA default_cache_size = 50;",0,0,0);
rc = sqlite3_exec(handle,journalMode,0,0,0);
if(rc == OK){
rc = sqlite3_exec(handle,eventLogTable,0,0,0);
if(rc == OK){
rc = sqlite3_exec(handle,trigger,0,0,0);
}
}
}
return successFlag;
}
Is there anything I can do to prevent these "leaks"? Maybe I need to
clean up using some other SQLite functions I am not aware of etc?
Thanks for the help ;-)
Lynton
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users