Folks, 

My C program creates a in-memory database. It creates a table and a unique 
index on two columns. If the insert fails due to unique index, it prints old 
row and new row. Sometimes it cannot find the old row even though the insert 
failed.

Here is the pseudo code:

CreateStmt = “create table mytable (TimeStamp char[50], col2 [char 10], col3 
int, col4 char[33]”;
sqlite3_exec(CreateStmt)

IndexStmt = “create unique index myidx (col3 asc, col4 asc)”;
sqlite3_exec(IndexStmt);

InsertStmt = “insert into mytable (TimeStamp, col2, col3, col4) values 
(?,?,?,?)”;
sqlite3_prepare_v2(InsertStmt)
sqlite3_bind calls for each column
ReturnCode = sqlite3_step(InsertStmtHandle);
if (ReturnCode != SQLITE_DONE)
{
   sqlite3_reset(InsertStmtHandle);
   if (sqlite3_errcode(DbHandle) == SQLITE_CONSTRAINT)
   {
      /* duplicate row */
      sqlite3_finalize(InsertStmtHandle);
      sqlite3_exec(DbHandle, "COMMIT", NULL, NULL, NULL);


      SelectStmt = “select TimeStamp, col2, col3, col4 from mytable where col4 
= ?”;
      sqlite3_prepare_v2(SelectStmt)
      sqlite3_bind calls
      ReturnCode = sqlite3_step(SelectStmtHandle);
      if (ReturnCode != SQLITE_ROW)
      {
         sqlite3_reset(SelectStmtHandle);
         printf("Row not found. ReturnCode: %d, Error Message:%s, Error Code: 
%d\n", ReturnCode, sqlite3_errmsg(DbHandle), sqlite3_errcode(DbHandle));
      }
      else
      {
         /* print row */
      }
   }
   else
   {
      /* other error
   }
}
 

The program prints ReturnCode as 101 which is SQLITE_DONE and error messages is 
“No error message”, errcode is 0. 

If the insert statement failed because of duplicate row, then why did it not 
find the old row?

This only happens for some of the rows.

I am inserting rows at very high rate (about every 50 microseconds) and only 
keep one minute worth of data in the table.

How do I debug/fix this problem?

Thanks.



Hemant Shah
E-mail: hj...@yahoo.com


      
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to