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

Reply via email to