Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Update documentation for the destructor parameters on the pointer passing interfaces. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
dd480b4420ec7878cf4ef6e6072cd235 |
User & Date: | drh 2017-07-27 18:20:44.219 |
Context
2017-07-30
| ||
20:28 | Fix a broken link to the A350 on the Well-Known users page. (check-in: aa249826dc user: drh tags: trunk) | |
2017-07-27
| ||
18:20 | Update documentation for the destructor parameters on the pointer passing interfaces. (check-in: dd480b4420 user: drh tags: trunk) | |
2017-07-26
| ||
17:25 | Add a news entry. Fix the release date. Fix typos. (check-in: 9759ba8053 user: drh tags: trunk) | |
Changes
Changes to pages/bindptr.in.
1 2 3 4 | <title>Pointer Passing Interfaces</title> <tcl>hd_keywords {pointer passing interfaces} {pointer passing interface} </tcl> | | | 1 2 3 4 5 6 7 8 9 10 11 12 | <title>Pointer Passing Interfaces</title> <tcl>hd_keywords {pointer passing interfaces} {pointer passing interface} </tcl> <table_of_contents> <h1>Overview</h1> <p> Three new "_pointer()" interfaces were added to SQLite 3.20.0 ([dateof:3.20.0]): <ul> <li> [sqlite3_bind_pointer()], |
︙ | ︙ | |||
197 198 199 200 201 202 203 | <h1>The New Pointer-Passing Interfaces</h1> <p> Allowing extension components to pass private information to one another securely and without introducing pointer leaks requires new interfaces: <ul> | | > | > | 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 | <h1>The New Pointer-Passing Interfaces</h1> <p> Allowing extension components to pass private information to one another securely and without introducing pointer leaks requires new interfaces: <ul> <li><b>[sqlite3_bind_pointer](S,I,P,T,D)</b> → Bind pointer P of type T to the I-th parameter of prepared statement S. D is an optional destructor function for P. <li><b>[sqlite3_result_pointer](C,P,T,D)</b> → Return pointer P of type T as the argument of function C. D is an optional destructor function for P. <li><b>[sqlite3_value_pointer](V,T)</b> → Return the pointer of type T associated with value V, or if V has no associated pointer, or if the pointer on V is of a type different from T, then return NULL. </ul> <p> |
︙ | ︙ | |||
279 280 281 282 283 284 285 286 287 288 289 290 291 292 | Because pointer types must be static strings, and because string values in SQLite are dynamic strings, that means that SQL values cannot be used as a pointer type. This prevents misguided developers from creating a new SQL function that can manufacture pointer values directly from SQL. Such a function, if possible to write, would undermine the security of the pointer-passing APIs. Thus, the requirement that pointer types be static strings helps to prevent misuse of the pointer-passing interfaces. <h1>Restrictions On The Use of Pointer Values</h1> <p> The pointers that piggy-back on SQL NULL values using the [sqlite3_bind_pointer()], [sqlite3_result_pointer()], and [sqlite3_value_pointer()] interface are transient and ephemeral. | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 | Because pointer types must be static strings, and because string values in SQLite are dynamic strings, that means that SQL values cannot be used as a pointer type. This prevents misguided developers from creating a new SQL function that can manufacture pointer values directly from SQL. Such a function, if possible to write, would undermine the security of the pointer-passing APIs. Thus, the requirement that pointer types be static strings helps to prevent misuse of the pointer-passing interfaces. <h2>Destructor Functions</h2> <p> The last parameter to the [sqlite3_bind_pointer()] and [sqlite3_result_pointer()] routines is a pointer to a procedure used to dispose of the P pointer once SQLite has finished with it. This pointer can be NULL, in which case no destructor is called. <p> When the D parameter is not NULL, that means that ownership of the pointer is being transferred to SQLite. SQLite will take responsibility for freeing resources associated with the pointer when it has finished using the pointer. If the D parameter is NULL, that means that ownership of the pointer remains with the caller and the caller is responsible for disposing of the pointer. <p> Note that the destructure function D is for the pointer value P, not for the type string T. The type string T should be a static string with an infinite lifetime. <p> If ownership of the pointer is passed into SQLite by providing a non-NULL D parameter to [sqlite3_bind_pointer()] or [sqlite3_result_pointer()] then the ownership remains with SQLite until the object is destroyed. There is no way to transfer ownership out of SQLite and back into the application again. <p> Note that <h1>Restrictions On The Use of Pointer Values</h1> <p> The pointers that piggy-back on SQL NULL values using the [sqlite3_bind_pointer()], [sqlite3_result_pointer()], and [sqlite3_value_pointer()] interface are transient and ephemeral. |
︙ | ︙ |
Changes to search/fts5ext.c.
︙ | ︙ | |||
31 32 33 34 35 36 37 | ** If an error occurs, return NULL and leave an error in the database ** handle (accessible using sqlite3_errcode()/errmsg()). */ fts5_api *fts5_api_from_db(sqlite3 *db){ fts5_api *pRet = 0; sqlite3_stmt *pStmt = 0; if( SQLITE_OK==sqlite3_prepare(db, "SELECT fts5(?1)", -1, &pStmt, 0) ){ | | | 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | ** If an error occurs, return NULL and leave an error in the database ** handle (accessible using sqlite3_errcode()/errmsg()). */ fts5_api *fts5_api_from_db(sqlite3 *db){ fts5_api *pRet = 0; sqlite3_stmt *pStmt = 0; if( SQLITE_OK==sqlite3_prepare(db, "SELECT fts5(?1)", -1, &pStmt, 0) ){ sqlite3_bind_pointer(pStmt, 1, (void*)&pRet, "fts5_api_ptr", 0); sqlite3_step(pStmt); } sqlite3_finalize(pStmt); return pRet; } /************************************************************************/ |
︙ | ︙ |