4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing:
7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give.
11 ******************************************************************************
13 ** This file contains an implementation of two eponymous virtual tables,
14 ** "sqlite_dbdata" and "sqlite_dbptr". Both modules require that the
15 ** "sqlite_dbpage" eponymous virtual table be available.
18 ** sqlite_dbdata is used to extract data directly from a database b-tree
19 ** page and its associated overflow pages, bypassing the b-tree layer.
20 ** The table schema is equivalent to:
22 ** CREATE TABLE sqlite_dbdata(
30 ** IMPORTANT: THE VIRTUAL TABLE SCHEMA ABOVE IS SUBJECT TO CHANGE. IN THE
31 ** FUTURE NEW NON-HIDDEN COLUMNS MAY BE ADDED BETWEEN "value" AND
34 ** Each page of the database is inspected. If it cannot be interpreted as
35 ** a b-tree page, or if it is a b-tree page containing 0 entries, the
36 ** sqlite_dbdata table contains no rows for that page. Otherwise, the
37 ** table contains one row for each field in the record associated with
38 ** each cell on the page. For intkey b-trees, the key value is stored in
41 ** For example, for the database:
43 ** CREATE TABLE t1(a, b); -- root page is page 2
44 ** INSERT INTO t1(rowid, a, b) VALUES(5, 'v', 'five');
45 ** INSERT INTO t1(rowid, a, b) VALUES(10, 'x', 'ten');
47 ** the sqlite_dbdata table contains, as well as from entries related to
48 ** page 1, content equivalent to:
50 ** INSERT INTO sqlite_dbdata(pgno, cell, field, value) VALUES
58 ** If database corruption is encountered, this module does not report an
59 ** error. Instead, it attempts to extract as much data as possible and
60 ** ignores the corruption.
63 ** The sqlite_dbptr table has the following schema:
65 ** CREATE TABLE sqlite_dbptr(
71 ** It contains one entry for each b-tree pointer between a parent and
72 ** child page in the database.
75 #if !defined(SQLITEINT_H)
76 #include "sqlite3ext.h"
78 typedef unsigned char u8
;
79 typedef unsigned int u32
;
82 SQLITE_EXTENSION_INIT1
86 #ifndef SQLITE_OMIT_VIRTUALTABLE
88 #define DBDATA_PADDING_BYTES 100
90 typedef struct DbdataTable DbdataTable
;
91 typedef struct DbdataCursor DbdataCursor
;
95 sqlite3_vtab_cursor base
; /* Base class. Must be first */
96 sqlite3_stmt
*pStmt
; /* For fetching database pages */
98 int iPgno
; /* Current page number */
99 u8
*aPage
; /* Buffer containing page */
100 int nPage
; /* Size of aPage[] in bytes */
101 int nCell
; /* Number of cells on aPage[] */
102 int iCell
; /* Current cell number */
103 int bOnePage
; /* True to stop after one page */
105 sqlite3_int64 iRowid
;
107 /* Only for the sqlite_dbdata table */
108 u8
*pRec
; /* Buffer containing current record */
109 sqlite3_int64 nRec
; /* Size of pRec[] in bytes */
110 sqlite3_int64 nHdr
; /* Size of header in bytes */
111 int iField
; /* Current field number */
114 u32 enc
; /* Text encoding */
116 sqlite3_int64 iIntkey
; /* Integer key value */
121 sqlite3_vtab base
; /* Base class. Must be first */
122 sqlite3
*db
; /* The database connection */
123 sqlite3_stmt
*pStmt
; /* For fetching database pages */
124 int bPtr
; /* True for sqlite3_dbptr table */
127 /* Column and schema definitions for sqlite_dbdata */
128 #define DBDATA_COLUMN_PGNO 0
129 #define DBDATA_COLUMN_CELL 1
130 #define DBDATA_COLUMN_FIELD 2
131 #define DBDATA_COLUMN_VALUE 3
132 #define DBDATA_COLUMN_SCHEMA 4
133 #define DBDATA_SCHEMA \
139 " schema TEXT HIDDEN" \
142 /* Column and schema definitions for sqlite_dbptr */
143 #define DBPTR_COLUMN_PGNO 0
144 #define DBPTR_COLUMN_CHILD 1
145 #define DBPTR_COLUMN_SCHEMA 2
146 #define DBPTR_SCHEMA \
150 " schema TEXT HIDDEN" \
154 ** Connect to an sqlite_dbdata (pAux==0) or sqlite_dbptr (pAux!=0) virtual
157 static int dbdataConnect(
160 int argc
, const char *const*argv
,
161 sqlite3_vtab
**ppVtab
,
164 DbdataTable
*pTab
= 0;
165 int rc
= sqlite3_declare_vtab(db
, pAux
? DBPTR_SCHEMA
: DBDATA_SCHEMA
);
170 sqlite3_vtab_config(db
, SQLITE_VTAB_USES_ALL_SCHEMAS
);
172 pTab
= (DbdataTable
*)sqlite3_malloc64(sizeof(DbdataTable
));
176 memset(pTab
, 0, sizeof(DbdataTable
));
178 pTab
->bPtr
= (pAux
!=0);
182 *ppVtab
= (sqlite3_vtab
*)pTab
;
187 ** Disconnect from or destroy a sqlite_dbdata or sqlite_dbptr virtual table.
189 static int dbdataDisconnect(sqlite3_vtab
*pVtab
){
190 DbdataTable
*pTab
= (DbdataTable
*)pVtab
;
192 sqlite3_finalize(pTab
->pStmt
);
199 ** This function interprets two types of constraints:
204 ** If neither are present, idxNum is set to 0. If schema=? is present,
205 ** the 0x01 bit in idxNum is set. If pgno=? is present, the 0x02 bit
208 ** If both parameters are present, schema is in position 0 and pgno in
211 static int dbdataBestIndex(sqlite3_vtab
*tab
, sqlite3_index_info
*pIdx
){
212 DbdataTable
*pTab
= (DbdataTable
*)tab
;
216 int colSchema
= (pTab
->bPtr
? DBPTR_COLUMN_SCHEMA
: DBDATA_COLUMN_SCHEMA
);
218 for(i
=0; i
<pIdx
->nConstraint
; i
++){
219 struct sqlite3_index_constraint
*p
= &pIdx
->aConstraint
[i
];
220 if( p
->op
==SQLITE_INDEX_CONSTRAINT_EQ
){
221 if( p
->iColumn
==colSchema
){
222 if( p
->usable
==0 ) return SQLITE_CONSTRAINT
;
225 if( p
->iColumn
==DBDATA_COLUMN_PGNO
&& p
->usable
){
232 pIdx
->aConstraintUsage
[iSchema
].argvIndex
= 1;
233 pIdx
->aConstraintUsage
[iSchema
].omit
= 1;
236 pIdx
->aConstraintUsage
[iPgno
].argvIndex
= 1 + (iSchema
>=0);
237 pIdx
->aConstraintUsage
[iPgno
].omit
= 1;
238 pIdx
->estimatedCost
= 100;
239 pIdx
->estimatedRows
= 50;
241 if( pTab
->bPtr
==0 && pIdx
->nOrderBy
&& pIdx
->aOrderBy
[0].desc
==0 ){
242 int iCol
= pIdx
->aOrderBy
[0].iColumn
;
243 if( pIdx
->nOrderBy
==1 ){
244 pIdx
->orderByConsumed
= (iCol
==0 || iCol
==1);
245 }else if( pIdx
->nOrderBy
==2 && pIdx
->aOrderBy
[1].desc
==0 && iCol
==0 ){
246 pIdx
->orderByConsumed
= (pIdx
->aOrderBy
[1].iColumn
==1);
251 pIdx
->estimatedCost
= 100000000;
252 pIdx
->estimatedRows
= 1000000000;
254 pIdx
->idxNum
= (iSchema
>=0 ? 0x01 : 0x00) | (iPgno
>=0 ? 0x02 : 0x00);
259 ** Open a new sqlite_dbdata or sqlite_dbptr cursor.
261 static int dbdataOpen(sqlite3_vtab
*pVTab
, sqlite3_vtab_cursor
**ppCursor
){
264 pCsr
= (DbdataCursor
*)sqlite3_malloc64(sizeof(DbdataCursor
));
268 memset(pCsr
, 0, sizeof(DbdataCursor
));
269 pCsr
->base
.pVtab
= pVTab
;
272 *ppCursor
= (sqlite3_vtab_cursor
*)pCsr
;
277 ** Restore a cursor object to the state it was in when first allocated
280 static void dbdataResetCursor(DbdataCursor
*pCsr
){
281 DbdataTable
*pTab
= (DbdataTable
*)(pCsr
->base
.pVtab
);
282 if( pTab
->pStmt
==0 ){
283 pTab
->pStmt
= pCsr
->pStmt
;
285 sqlite3_finalize(pCsr
->pStmt
);
292 sqlite3_free(pCsr
->aPage
);
293 sqlite3_free(pCsr
->pRec
);
299 ** Close an sqlite_dbdata or sqlite_dbptr cursor.
301 static int dbdataClose(sqlite3_vtab_cursor
*pCursor
){
302 DbdataCursor
*pCsr
= (DbdataCursor
*)pCursor
;
303 dbdataResetCursor(pCsr
);
309 ** Utility methods to decode 16 and 32-bit big-endian unsigned integers.
311 static u32
get_uint16(unsigned char *a
){
312 return (a
[0]<<8)|a
[1];
314 static u32
get_uint32(unsigned char *a
){
315 return ((u32
)a
[0]<<24)
322 ** Load page pgno from the database via the sqlite_dbpage virtual table.
323 ** If successful, set (*ppPage) to point to a buffer containing the page
324 ** data, (*pnPage) to the size of that buffer in bytes and return
325 ** SQLITE_OK. In this case it is the responsibility of the caller to
326 ** eventually free the buffer using sqlite3_free().
328 ** Or, if an error occurs, set both (*ppPage) and (*pnPage) to 0 and
329 ** return an SQLite error code.
331 static int dbdataLoadPage(
332 DbdataCursor
*pCsr
, /* Cursor object */
333 u32 pgno
, /* Page number of page to load */
334 u8
**ppPage
, /* OUT: pointer to page buffer */
335 int *pnPage
/* OUT: Size of (*ppPage) in bytes */
339 sqlite3_stmt
*pStmt
= pCsr
->pStmt
;
344 sqlite3_bind_int64(pStmt
, 2, pgno
);
345 if( SQLITE_ROW
==sqlite3_step(pStmt
) ){
346 int nCopy
= sqlite3_column_bytes(pStmt
, 0);
349 pPage
= (u8
*)sqlite3_malloc64(nCopy
+ DBDATA_PADDING_BYTES
);
353 const u8
*pCopy
= sqlite3_column_blob(pStmt
, 0);
354 memcpy(pPage
, pCopy
, nCopy
);
355 memset(&pPage
[nCopy
], 0, DBDATA_PADDING_BYTES
);
361 rc2
= sqlite3_reset(pStmt
);
362 if( rc
==SQLITE_OK
) rc
= rc2
;
369 ** Read a varint. Put the value in *pVal and return the number of bytes.
371 static int dbdataGetVarint(const u8
*z
, sqlite3_int64
*pVal
){
372 sqlite3_uint64 u
= 0;
375 u
= (u
<<7) + (z
[i
]&0x7f);
376 if( (z
[i
]&0x80)==0 ){ *pVal
= (sqlite3_int64
)u
; return i
+1; }
378 u
= (u
<<8) + (z
[i
]&0xff);
379 *pVal
= (sqlite3_int64
)u
;
384 ** Like dbdataGetVarint(), but set the output to 0 if it is less than 0
385 ** or greater than 0xFFFFFFFF. This can be used for all varints in an
386 ** SQLite database except for key values in intkey tables.
388 static int dbdataGetVarintU32(const u8
*z
, sqlite3_int64
*pVal
){
390 int nRet
= dbdataGetVarint(z
, &val
);
391 if( val
<0 || val
>0xFFFFFFFF ) val
= 0;
397 ** Return the number of bytes of space used by an SQLite value of type
400 static int dbdataValueBytes(int eType
){
402 case 0: case 8: case 9:
420 return ((eType
-12) / 2);
427 ** Load a value of type eType from buffer pData and use it to set the
428 ** result of context object pCtx.
430 static void dbdataValue(
431 sqlite3_context
*pCtx
,
437 if( eType
>=0 && dbdataValueBytes(eType
)<=nData
){
442 sqlite3_result_null(pCtx
);
446 sqlite3_result_int(pCtx
, 0);
449 sqlite3_result_int(pCtx
, 1);
452 case 1: case 2: case 3: case 4: case 5: case 6: case 7: {
453 sqlite3_uint64 v
= (signed char)pData
[0];
457 case 6: v
= (v
<<16) + (pData
[0]<<8) + pData
[1]; pData
+= 2;
458 case 5: v
= (v
<<16) + (pData
[0]<<8) + pData
[1]; pData
+= 2;
459 case 4: v
= (v
<<8) + pData
[0]; pData
++;
460 case 3: v
= (v
<<8) + pData
[0]; pData
++;
461 case 2: v
= (v
<<8) + pData
[0]; pData
++;
466 memcpy(&r
, &v
, sizeof(r
));
467 sqlite3_result_double(pCtx
, r
);
469 sqlite3_result_int64(pCtx
, (sqlite3_int64
)v
);
475 int n
= ((eType
-12) / 2);
478 #ifndef SQLITE_OMIT_UTF16
480 sqlite3_result_text16be(pCtx
, (void*)pData
, n
, SQLITE_TRANSIENT
);
483 sqlite3_result_text16le(pCtx
, (void*)pData
, n
, SQLITE_TRANSIENT
);
487 sqlite3_result_text(pCtx
, (char*)pData
, n
, SQLITE_TRANSIENT
);
491 sqlite3_result_blob(pCtx
, pData
, n
, SQLITE_TRANSIENT
);
499 ** Move an sqlite_dbdata or sqlite_dbptr cursor to the next entry.
501 static int dbdataNext(sqlite3_vtab_cursor
*pCursor
){
502 DbdataCursor
*pCsr
= (DbdataCursor
*)pCursor
;
503 DbdataTable
*pTab
= (DbdataTable
*)pCursor
->pVtab
;
508 int iOff
= (pCsr
->iPgno
==1 ? 100 : 0);
511 if( pCsr
->aPage
==0 ){
513 if( pCsr
->bOnePage
==0 && pCsr
->iPgno
>pCsr
->szDb
) return SQLITE_OK
;
514 rc
= dbdataLoadPage(pCsr
, pCsr
->iPgno
, &pCsr
->aPage
, &pCsr
->nPage
);
515 if( rc
!=SQLITE_OK
) return rc
;
516 if( pCsr
->aPage
&& pCsr
->nPage
>=256 ) break;
517 sqlite3_free(pCsr
->aPage
);
519 if( pCsr
->bOnePage
) return SQLITE_OK
;
523 assert( iOff
+3+2<=pCsr
->nPage
);
524 pCsr
->iCell
= pTab
->bPtr
? -2 : 0;
525 pCsr
->nCell
= get_uint16(&pCsr
->aPage
[iOff
+3]);
529 if( pCsr
->aPage
[iOff
]!=0x02 && pCsr
->aPage
[iOff
]!=0x05 ){
530 pCsr
->iCell
= pCsr
->nCell
;
533 if( pCsr
->iCell
>=pCsr
->nCell
){
534 sqlite3_free(pCsr
->aPage
);
536 if( pCsr
->bOnePage
) return SQLITE_OK
;
542 /* If there is no record loaded, load it now. */
546 sqlite3_int64 nPayload
= 0;
547 sqlite3_int64 nHdr
= 0;
552 switch( pCsr
->aPage
[iOff
] ){
562 /* This is not a b-tree page with records on it. Continue. */
563 pCsr
->iCell
= pCsr
->nCell
;
567 if( pCsr
->iCell
>=pCsr
->nCell
){
571 iOff
+= 8 + nPointer
+ pCsr
->iCell
*2;
572 if( iOff
>pCsr
->nPage
){
575 iOff
= get_uint16(&pCsr
->aPage
[iOff
]);
578 /* For an interior node cell, skip past the child-page number */
581 /* Load the "byte of payload including overflow" field */
582 if( bNextPage
|| iOff
>pCsr
->nPage
){
585 iOff
+= dbdataGetVarintU32(&pCsr
->aPage
[iOff
], &nPayload
);
588 /* If this is a leaf intkey cell, load the rowid */
589 if( bHasRowid
&& !bNextPage
&& iOff
<pCsr
->nPage
){
590 iOff
+= dbdataGetVarint(&pCsr
->aPage
[iOff
], &pCsr
->iIntkey
);
593 /* Figure out how much data to read from the local page */
598 X
= ((U
-12)*64/255)-23;
604 M
= ((U
-12)*32/255)-23;
605 K
= M
+((nPayload
-M
)%(U
-4));
613 if( bNextPage
|| nLocal
+iOff
>pCsr
->nPage
){
617 /* Allocate space for payload. And a bit more to catch small buffer
618 ** overruns caused by attempting to read a varint or similar from
619 ** near the end of a corrupt record. */
620 pCsr
->pRec
= (u8
*)sqlite3_malloc64(nPayload
+DBDATA_PADDING_BYTES
);
621 if( pCsr
->pRec
==0 ) return SQLITE_NOMEM
;
622 memset(pCsr
->pRec
, 0, nPayload
+DBDATA_PADDING_BYTES
);
623 pCsr
->nRec
= nPayload
;
625 /* Load the nLocal bytes of payload */
626 memcpy(pCsr
->pRec
, &pCsr
->aPage
[iOff
], nLocal
);
629 /* Load content from overflow pages */
630 if( nPayload
>nLocal
){
631 sqlite3_int64 nRem
= nPayload
- nLocal
;
632 u32 pgnoOvfl
= get_uint32(&pCsr
->aPage
[iOff
]);
637 rc
= dbdataLoadPage(pCsr
, pgnoOvfl
, &aOvfl
, &nOvfl
);
638 assert( rc
!=SQLITE_OK
|| aOvfl
==0 || nOvfl
==pCsr
->nPage
);
639 if( rc
!=SQLITE_OK
) return rc
;
640 if( aOvfl
==0 ) break;
643 if( nCopy
>nRem
) nCopy
= nRem
;
644 memcpy(&pCsr
->pRec
[nPayload
-nRem
], &aOvfl
[4], nCopy
);
647 pgnoOvfl
= get_uint32(aOvfl
);
652 iHdr
= dbdataGetVarintU32(pCsr
->pRec
, &nHdr
);
653 if( nHdr
>nPayload
) nHdr
= 0;
655 pCsr
->pHdrPtr
= &pCsr
->pRec
[iHdr
];
656 pCsr
->pPtr
= &pCsr
->pRec
[pCsr
->nHdr
];
657 pCsr
->iField
= (bHasRowid
? -1 : 0);
662 if( pCsr
->iField
>0 ){
664 if( pCsr
->pHdrPtr
>&pCsr
->pRec
[pCsr
->nRec
] ){
667 pCsr
->pHdrPtr
+= dbdataGetVarintU32(pCsr
->pHdrPtr
, &iType
);
668 pCsr
->pPtr
+= dbdataValueBytes(iType
);
674 sqlite3_free(pCsr
->aPage
);
675 sqlite3_free(pCsr
->pRec
);
678 if( pCsr
->bOnePage
) return SQLITE_OK
;
681 if( pCsr
->iField
<0 || pCsr
->pHdrPtr
<&pCsr
->pRec
[pCsr
->nHdr
] ){
685 /* Advance to the next cell. The next iteration of the loop will load
686 ** the record and so on. */
687 sqlite3_free(pCsr
->pRec
);
694 assert( !"can't get here" );
699 ** Return true if the cursor is at EOF.
701 static int dbdataEof(sqlite3_vtab_cursor
*pCursor
){
702 DbdataCursor
*pCsr
= (DbdataCursor
*)pCursor
;
703 return pCsr
->aPage
==0;
707 ** Return true if nul-terminated string zSchema ends in "()". Or false
710 static int dbdataIsFunction(const char *zSchema
){
711 size_t n
= strlen(zSchema
);
712 if( n
>2 && zSchema
[n
-2]=='(' && zSchema
[n
-1]==')' ){
719 ** Determine the size in pages of database zSchema (where zSchema is
720 ** "main", "temp" or the name of an attached database) and set
721 ** pCsr->szDb accordingly. If successful, return SQLITE_OK. Otherwise,
722 ** an SQLite error code.
724 static int dbdataDbsize(DbdataCursor
*pCsr
, const char *zSchema
){
725 DbdataTable
*pTab
= (DbdataTable
*)pCsr
->base
.pVtab
;
729 sqlite3_stmt
*pStmt
= 0;
731 if( (nFunc
= dbdataIsFunction(zSchema
))>0 ){
732 zSql
= sqlite3_mprintf("SELECT %.*s(0)", nFunc
, zSchema
);
734 zSql
= sqlite3_mprintf("PRAGMA %Q.page_count", zSchema
);
736 if( zSql
==0 ) return SQLITE_NOMEM
;
738 rc
= sqlite3_prepare_v2(pTab
->db
, zSql
, -1, &pStmt
, 0);
740 if( rc
==SQLITE_OK
&& sqlite3_step(pStmt
)==SQLITE_ROW
){
741 pCsr
->szDb
= sqlite3_column_int(pStmt
, 0);
743 rc2
= sqlite3_finalize(pStmt
);
744 if( rc
==SQLITE_OK
) rc
= rc2
;
749 ** Attempt to figure out the encoding of the database by retrieving page 1
750 ** and inspecting the header field. If successful, set the pCsr->enc variable
751 ** and return SQLITE_OK. Otherwise, return an SQLite error code.
753 static int dbdataGetEncoding(DbdataCursor
*pCsr
){
757 rc
= dbdataLoadPage(pCsr
, 1, &aPg1
, &nPg1
);
758 if( rc
==SQLITE_OK
&& nPg1
>=(56+4) ){
759 pCsr
->enc
= get_uint32(&aPg1
[56]);
767 ** xFilter method for sqlite_dbdata and sqlite_dbptr.
769 static int dbdataFilter(
770 sqlite3_vtab_cursor
*pCursor
,
771 int idxNum
, const char *idxStr
,
772 int argc
, sqlite3_value
**argv
774 DbdataCursor
*pCsr
= (DbdataCursor
*)pCursor
;
775 DbdataTable
*pTab
= (DbdataTable
*)pCursor
->pVtab
;
777 const char *zSchema
= "main";
781 dbdataResetCursor(pCsr
);
782 assert( pCsr
->iPgno
==1 );
784 zSchema
= (const char*)sqlite3_value_text(argv
[0]);
785 if( zSchema
==0 ) zSchema
= "";
788 pCsr
->iPgno
= sqlite3_value_int(argv
[(idxNum
& 0x01)]);
791 rc
= dbdataDbsize(pCsr
, zSchema
);
797 pCsr
->pStmt
= pTab
->pStmt
;
799 }else if( (nFunc
= dbdataIsFunction(zSchema
))>0 ){
800 char *zSql
= sqlite3_mprintf("SELECT %.*s(?2)", nFunc
, zSchema
);
804 rc
= sqlite3_prepare_v2(pTab
->db
, zSql
, -1, &pCsr
->pStmt
, 0);
808 rc
= sqlite3_prepare_v2(pTab
->db
,
809 "SELECT data FROM sqlite_dbpage(?) WHERE pgno=?", -1,
815 rc
= sqlite3_bind_text(pCsr
->pStmt
, 1, zSchema
, -1, SQLITE_TRANSIENT
);
818 /* Try to determine the encoding of the db by inspecting the header
819 ** field on page 1. */
821 rc
= dbdataGetEncoding(pCsr
);
825 pTab
->base
.zErrMsg
= sqlite3_mprintf("%s", sqlite3_errmsg(pTab
->db
));
829 rc
= dbdataNext(pCursor
);
835 ** Return a column for the sqlite_dbdata or sqlite_dbptr table.
837 static int dbdataColumn(
838 sqlite3_vtab_cursor
*pCursor
,
839 sqlite3_context
*ctx
,
842 DbdataCursor
*pCsr
= (DbdataCursor
*)pCursor
;
843 DbdataTable
*pTab
= (DbdataTable
*)pCursor
->pVtab
;
846 case DBPTR_COLUMN_PGNO
:
847 sqlite3_result_int64(ctx
, pCsr
->iPgno
);
849 case DBPTR_COLUMN_CHILD
: {
850 int iOff
= pCsr
->iPgno
==1 ? 100 : 0;
854 iOff
+= 12 + pCsr
->iCell
*2;
855 if( iOff
>pCsr
->nPage
) return SQLITE_OK
;
856 iOff
= get_uint16(&pCsr
->aPage
[iOff
]);
858 if( iOff
<=pCsr
->nPage
){
859 sqlite3_result_int64(ctx
, get_uint32(&pCsr
->aPage
[iOff
]));
866 case DBDATA_COLUMN_PGNO
:
867 sqlite3_result_int64(ctx
, pCsr
->iPgno
);
869 case DBDATA_COLUMN_CELL
:
870 sqlite3_result_int(ctx
, pCsr
->iCell
);
872 case DBDATA_COLUMN_FIELD
:
873 sqlite3_result_int(ctx
, pCsr
->iField
);
875 case DBDATA_COLUMN_VALUE
: {
876 if( pCsr
->iField
<0 ){
877 sqlite3_result_int64(ctx
, pCsr
->iIntkey
);
878 }else if( &pCsr
->pRec
[pCsr
->nRec
] >= pCsr
->pPtr
){
880 dbdataGetVarintU32(pCsr
->pHdrPtr
, &iType
);
882 ctx
, pCsr
->enc
, iType
, pCsr
->pPtr
,
883 &pCsr
->pRec
[pCsr
->nRec
] - pCsr
->pPtr
894 ** Return the rowid for an sqlite_dbdata or sqlite_dptr table.
896 static int dbdataRowid(sqlite3_vtab_cursor
*pCursor
, sqlite_int64
*pRowid
){
897 DbdataCursor
*pCsr
= (DbdataCursor
*)pCursor
;
898 *pRowid
= pCsr
->iRowid
;
904 ** Invoke this routine to register the "sqlite_dbdata" virtual table module
906 static int sqlite3DbdataRegister(sqlite3
*db
){
907 static sqlite3_module dbdata_module
= {
910 dbdataConnect
, /* xConnect */
911 dbdataBestIndex
, /* xBestIndex */
912 dbdataDisconnect
, /* xDisconnect */
914 dbdataOpen
, /* xOpen - open a cursor */
915 dbdataClose
, /* xClose - close a cursor */
916 dbdataFilter
, /* xFilter - configure scan constraints */
917 dbdataNext
, /* xNext - advance a cursor */
918 dbdataEof
, /* xEof - check for end of scan */
919 dbdataColumn
, /* xColumn - read data */
920 dbdataRowid
, /* xRowid - read data */
934 int rc
= sqlite3_create_module(db
, "sqlite_dbdata", &dbdata_module
, 0);
936 rc
= sqlite3_create_module(db
, "sqlite_dbptr", &dbdata_module
, (void*)1);
942 __declspec(dllexport
)
944 int sqlite3_dbdata_init(
947 const sqlite3_api_routines
*pApi
949 SQLITE_EXTENSION_INIT2(pApi
);
951 return sqlite3DbdataRegister(db
);
954 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */