On 8/8/06, Lijia Jin <[EMAIL PROTECTED]> wrote:

select string from string where ... limit 1 offset ? ;

and replace this offset value with the row number user supplied. This
solution can work but it requires modifying the SQL query and calling
sqlite3_reset for each get-row request.

This works very well, but your point is also correct.
The code is pretty trivial though:

bool function( int ImageIndex )
           {
              int i;
              char* sql = "SELECT Path FROM Display ORDER BY
SortOrder LIMIT 1 OFFSET";
              char sz[290];
              i = sprintf( sz, "%s %d", sql, ImageIndex );
              //Debug( sz );

              sqlite3_stmt* pStmt;
              if ( sqlite3_prepare( db, sz, i, &pStmt, NULL ) != SQLITE_OK )
                 return false;

              bool Result = false;
              for ( i = 0; i < 8; ++i )
                 {
                    // execute select
                    int rc = sqlite3_step( pStmt );

                    // got a result?
                    if ( rc == SQLITE_ROW )
                       {
                          const unsigned char* p =
sqlite3_column_text( pStmt, 0 );
                          // nulls changed to blank string
                          p = p ? p : (const unsigned char*)"";
                          ImagePath = (char*) p;
                          Result = true;
                          break;
                       }

                    // nothing returned
                    if ( rc == SQLITE_DONE )
                       {
                          ImageIndex = 0;
                          break;
                       }

                    // retry errors
                 }

              // clean up when finished
              sqlite3_finalize( pStmt );

              return Result;
           }



Essentially what we needed is a random access iterator because the
sqlite3_step is just a one direction, single step iterator. I did search the
mailing list but can't find anything I am looking for. Did I miss something
and there is already a simple solution for this?

SQL is designed to operate on sets. That's what it does most efficiently.

It's much better to write
  update mytable set flag = 0 where index < 1000;
than to write
 for ( i = 0; i < 1000; i++ )
    update mytable set flag = 0 where index = i;

A random iterator is useful for some problems, but keep in mind the
right way to use it.

Reply via email to