> -----Original Message-----
> From: Igor Tandetnik [mailto:[EMAIL PROTECTED]
> Sent: Tuesday, November 07, 2006 8:15 AM
> To: SQLite
> Subject: [sqlite] Re: Q about new SQLite API
>
> Marco Bambini <[EMAIL PROTECTED]> wrote:
> > 2. maybe with the new sqlite3_compile routine there should also be a
> > way to retrieve the rowid of the current row (NULL is no valid rowid
> > is found), a possible API could be sqlite3_rowid to call after each
> > sqlite3_step only if it returns an SQLITE_ROW is returned.
>
> In general, there is no rowid associated with a row returned
> by select.
> A row may be constructed out of data taken from multiple rows of
> multiple tables, or be manufactured without reference to any table at
> all. If you want a rowid from a particular table, why not
> just retrieve
> it explicitly, as a column in select statement?
I had actually written some add-on funcs to do something similar, but the
code is experimental:
// Exclude btree.c from the project and include this file instead
#include "src/btree.c"
#include "src/vdbeint.h"
// Before using these two API calls, you must do these steps:
// Step 1: Prepare any SQL statement
// Step 2: Get the metadata for each column returned in the statement
// Step 3: For each column, get the database and table (if any) for that
column.
// Step 4: For each database, record the rowid (database index) of the
database
// Step 5: For each table referenced, get the root page of that table
// Given a statement, an index of the database and the table's root page,
return (if any) the index of the cursor the
// statement is using on that table
__declspec(dllexport) int WINAPI sqlite3_table_cursor(sqlite3_stmt *pstmt,
int iDb, Pgno tableRootPage)
{
Vdbe *p = (Vdbe *)pstmt;
int n;
for (n = 0; n < p->nCursor && p->apCsr[n] != NULL; n++)
{
if (p->apCsr[n]->isTable == FALSE) continue;
if (p->apCsr[n]->iDb != iDb) continue;
if (p->apCsr[n]->pCursor->pgnoRoot == tableRootPage)
return n;
}
return -1;
}
// Try and fetch the rowid for a given cursor. The cursor is obtained from
sqlite3_table_cursor()
__declspec(dllexport) int WINAPI sqlite3_cursor_rowid(sqlite3_stmt *pstmt,
int cursor, sqlite_int64 *prowid)
{
Vdbe *p = (Vdbe *)pstmt;
int rc = 0;
Cursor *pC;
if (cursor < 0 || cursor >= p->nCursor) return SQLITE_ERROR;
if (p->apCsr[cursor] == NULL) return SQLITE_ERROR;
pC = p->apCsr[cursor];
rc = sqlite3VdbeCursorMoveto(pC);
if( rc ) return rc;
if( pC->rowidIsValid )
{
*prowid = pC->lastRowid;
}
else if(pC->pseudoTable )
{
*prowid = keyToInt(pC->iKey);
}
else if(pC->nullRow || pC->pCursor==0)
{
return SQLITE_ERROR;
}
else
{
if (pC->pCursor == NULL) return SQLITE_ERROR;
sqlite3BtreeKeySize(pC->pCursor, prowid);
*prowid = keyToInt(*prowid);
}
return 0;
}
-----------------------------------------------------------------------------
To unsubscribe, send email to [EMAIL PROTECTED]
-----------------------------------------------------------------------------