hi all,
first of all,thank to everyone who read this mail.
i use the 3.3.12 version of sqlite in my program base flash fs and OS20 os in
my DYV terminate.
the first questuin about memory usage in my memory db is that,previously i do
sqlite3_open(:memory:) and sqlite_exec(CREATE TABLE ) and insert about 20000
records in the db,after that ,each time i use sqlite_exec(SELECT xxx ,xxx FROM
xxx WHERE xxx AND xxx ORDER BY xxx),the memory take by sqlite increas about
135K BYTE. I think that's because when sqlite do sqlite_exec(SELECT xxx ,xxx
FROM xxx WHERE xxx AND xxx ORDER BY xxx) ,it take some memory as cache for data
pulled from DB,but it not free these memory after retrun from
sqlite_exec(SELECT xxx ,xxx FROM xxx WHERE xxx AND xxx ORDER BY xxx), just want
to speed up the next sqlite_exec(SELECT xxx ,xxx FROM xxx WHERE xxx AND xxx
ORDER BY xxx) call. that's right? if that's right,is there are any way to limit
the cache sqlite taked? i read PRAGMA cache_size = Number-of-pages in PRAGMA
document,it's the answer?
the next question is i use precompiled sqlite_stmt as follow code, is there
something wrong in it? in my test program i haven't find the bug, but i'm not
sure about it.
static sqlite3_stmt *stmt_insert_schedule=NULL;
static int Eit_Insert_ScheduleEvent_IntoTable( SQLITE_EVENT *sqlite_event)
{
int result=0;
int rc=0;
if(OS_MutSemTake ( mutexForDB))
printf("OS_MutSemTake ( mutexForDB) 8 error\n");
if(stmt_insert_schedule==NULL)
{
rc = sqlite3_prepare_v2( db, "INSERT INTO " EIT_SCHEDULE" ( " TABLE_ID_DB
","SECTION_NUMBER ","VERSION_NUMBER","
SERVICE_ID","TS_ID","ON_ID","CRC_32","EVENT_ID","START_TIME_UTC_M","
START_TIME_UTC_L","DURATION_3 ","CONTENT_NIBBLE_LEVEL","
PARRENT_RATE_COUNTRY_CODE_3","PARRENT_RATE_RATE","
TSE_DES_REFERENCE_SERVICE_ID","TSE_DES_REFERENCE_EVENT_ID","
ISO_639_LANGUAGE_CODE_SHORT_3","NAME_LENGTH","EVENT_NAME","SHORT_LENGTH","
SHORT_EVENT","DESCRIPTOR_NUMBER","LAST_DESCRIPTOR_NUMBER","
ISO_639_LANGUAGE_CODE_EXTEND_3","LENTH_OF_ITEM","ITEM","
TEXT_LENGTH","TEXT_EVENT
")VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);", -1,
&stmt_insert_schedule, NULL);
if ((rc != SQLITE_OK) && (rc != SQLITE_ROW) && (rc != SQLITE_DONE))
{
printf( "%s(%d): Failed with error code 0x%x =
%s\n",__FILE__,__LINE__, rc, sqlite3_errmsg(db));
if (stmt_insert_schedule)
{
rc = sqlite3_finalize(stmt_insert_schedule);
stmt_insert_schedule=NULL;
}
if(OS_MutSemGive ( mutexForDB))
printf("OS_MutSemGive ( mutexForDB) 9 error\n");
return 1;
}
}
rc=sqlite3_bind_int(stmt_insert_schedule, 1, sqlite_event->table_id);
rc|=sqlite3_bind_int(stmt_insert_schedule, 2, sqlite_event->section_number);
rc|=sqlite3_bind_int(stmt_insert_schedule, 3, sqlite_event->version_number);
rc|=sqlite3_bind_int(stmt_insert_schedule, 4, sqlite_event->service_id);
rc|=sqlite3_bind_int(stmt_insert_schedule, 5, sqlite_event->ts_id);
rc|=sqlite3_bind_int(stmt_insert_schedule, 6, sqlite_event->on_id);
rc|=sqlite3_bind_int(stmt_insert_schedule, 7, sqlite_event->crc_32);
rc|=sqlite3_bind_int(stmt_insert_schedule, 8, sqlite_event->event_id);
rc|=sqlite3_bind_int(stmt_insert_schedule, 9, sqlite_event->utc_m);
rc|=sqlite3_bind_int(stmt_insert_schedule, 10, sqlite_event->utc_l);
rc|=sqlite3_bind_int(stmt_insert_schedule, 11,
(sqlite_event->duration[0]<<16)|(sqlite_event->duration[1]<<8)|
(sqlite_event->duration[2]));
rc|=sqlite3_bind_int(stmt_insert_schedule, 12,
sqlite_event->content_nibble_level);
rc|=sqlite3_bind_int(stmt_insert_schedule, 13,
(sqlite_event->country_code[0]<<16)|
(sqlite_event->country_code[1]<<8)|(sqlite_event->country_code[2]));
rc|=sqlite3_bind_int(stmt_insert_schedule, 14, sqlite_event->rate);
rc|=sqlite3_bind_int(stmt_insert_schedule, 15,
sqlite_event->reference_service_id);
rc|=sqlite3_bind_int(stmt_insert_schedule, 16,
sqlite_event->reference_event_id);
rc|=sqlite3_bind_int(stmt_insert_schedule, 17,
(sqlite_event->ISO_639_language_code_short[0]<<16)|
(sqlite_event->ISO_639_language_code_short[1]<<8)|(sqlite_event->ISO_639_language_code_short[2]));
rc|=sqlite3_bind_int(stmt_insert_schedule, 18, sqlite_event->name_length);
rc|=sqlite3_bind_text(stmt_insert_schedule, 19, sqlite_event->event_name,
sqlite_event->name_length, SQLITE_STATIC );
rc|=sqlite3_bind_int(stmt_insert_schedule, 20, sqlite_event->short_length);
rc|=sqlite3_bind_text(stmt_insert_schedule, 21, sqlite_event->short_event,
sqlite_event->short_length, SQLITE_STATIC );
rc|=sqlite3_bind_int(stmt_insert_schedule, 22,
sqlite_event->descriptor_number);
rc|=sqlite3_bind_int(stmt_insert_schedule, 23,
sqlite_event->last_descriptor_number);
rc|=sqlite3_bind_int(stmt_insert_schedule, 24,
(sqlite_event->ISO_639_language_code_extend[0]<<16)|
(sqlite_event->ISO_639_language_code_extend[1]<<8)|(sqlite_event->ISO_639_language_code_extend[2]));
rc|=sqlite3_bind_int(stmt_insert_schedule, 25, sqlite_event->length_of_items);
rc|=sqlite3_bind_text(stmt_insert_schedule, 26, sqlite_event->item,
sqlite_event->length_of_items, SQLITE_STATIC );
rc|=sqlite3_bind_int(stmt_insert_schedule, 27, sqlite_event->text_length);
rc|=sqlite3_bind_text(stmt_insert_schedule, 28, sqlite_event->text,
sqlite_event->text_length, SQLITE_STATIC );
if(rc!=SQLITE_OK)
{
printf("qlite3_bind_text error 2 \n");
result=1;
}
else
{
rc = sqlite3_step(stmt_insert_schedule);
if (rc == SQLITE_DONE)
{
result=0;
}
else
{
printf("rc != SQLITE_DONE 2 \n");
result=1;
}
}
if(sqlite3_reset(stmt_insert_schedule)!=SQLITE_OK)
{
rc = sqlite3_finalize(stmt_insert_schedule);
if(rc!=SQLITE_OK)
{
printf("STATEMENT_FINALIZE 2 error\n");
}
else
stmt_insert_schedule=NULL;
}
if(OS_MutSemGive ( mutexForDB))
printf("OS_MutSemGive ( mutexForDB) 10 error\n");
return result;
}