Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Better comments on the bindvtab.c implementation. All the two-argument version of the .set command. All bindings from .set and -D are still string. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | shell-bindings |
Files: | files | file ages | folders |
SHA3-256: |
7b2a65a65475b80669af4ff5ac7adb6b |
User & Date: | drh 2018-04-27 20:49:13.739 |
Context
2018-04-27
| ||
20:49 | Better comments on the bindvtab.c implementation. All the two-argument version of the .set command. All bindings from .set and -D are still string. (Leaf check-in: 7b2a65a654 user: drh tags: shell-bindings) | |
17:39 | Add the ability to use bind parameters in the CLI. The new ".set KEY=VALUE" dot-command works to set bindings. Or use the "-Dkey=value" command-line option. Or use the built-in shell_bindings(k,v) virtual table to set, delete, or changing bindings. (check-in: 1f2944d1d6 user: drh tags: shell-bindings) | |
Changes
Changes to ext/misc/bindvtab.c.
︙ | ︙ | |||
10 11 12 13 14 15 16 17 18 19 20 21 22 23 | ** ************************************************************************* ** ** This file implements a simple key/value store used to hold bind ** parameters for SQLite. The key/value store is a singleton - there ** is exactly one per process. The store can be accessed and controlled ** from SQLite using an eponymous virtual table. */ #if !defined(SQLITEINT_H) #include "sqlite3ext.h" #endif SQLITE_EXTENSION_INIT1 #include <string.h> #include <assert.h> | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | ** ************************************************************************* ** ** This file implements a simple key/value store used to hold bind ** parameters for SQLite. The key/value store is a singleton - there ** is exactly one per process. The store can be accessed and controlled ** from SQLite using an eponymous virtual table. ** ** This is used to do parameter binding in the command-line shell. ** ** The ".set key=value" command and the "-Dkey=value" command-line option ** invoke shell_bindings_new_text() on the argument ("key=value") in order ** to create entries in the store. The CLI then invokes ** shell_bindings_apply() on each prepared statement just prior to ** running it. ** ** All bindings are accessible through an eponymous-only virtual table ** named shell_bindings. Ex: ** ** INSERT INTO shell_bindings(k,v) VALUES('p1',12345); ** SELECT $p1, typeof($p1); ** ** The above results in an answer of 12345,'integer'. Bindings generated ** using the virtual table can have any type other than NULL. But bindings ** generated by the .set command and the -D command-line option are always ** text. ** ** The CLI is single-threaded, so there is no attempt to make this code ** threadsafe. ** ** The key/value store is kept in a global list, and uses malloc/free rather ** than sqlite3_malloc64/sqlite3_free so that it can be completely independent ** of SQLite, can exist both before sqlite3_initialize() and after ** sqlite3_shutdown(), and so that it will persist across multiple ** connections created using ".open". ** ** The number of parameters is expected to be small, so they are stored ** on a simple linked list. If this proves to be too inefficient, some other ** algorithm can be substituted in the future without changing the interface. */ #if !defined(SQLITEINT_H) #include "sqlite3ext.h" #endif SQLITE_EXTENSION_INIT1 #include <string.h> #include <assert.h> |
︙ | ︙ |
Changes to src/shell.c.in.
︙ | ︙ | |||
7150 7151 7152 7153 7154 7155 7156 | sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]); } }else if( c=='s' && n==3 && strncmp(azArg[0],"set",3)==0 ){ int x; | > > | > > > > | > > > | | > | 7150 7151 7152 7153 7154 7155 7156 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168 7169 7170 7171 7172 7173 7174 7175 7176 7177 7178 7179 7180 7181 7182 | sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]); } }else if( c=='s' && n==3 && strncmp(azArg[0],"set",3)==0 ){ int x; char *zKey = 0; char *zToFree = 0; if( nArg==2 ){ zKey = azArg[1]; }else if( nArg==3 ){ zKey = zToFree = sqlite3_mprintf("%s=%s",azArg[1],azArg[2]); }else{ raw_printf(stderr, "Usage: .set KEY VALUE\n Or: .set KEY=VALUE\n" "Use SQL on the \"shell_bindings\" table to query or delete keys.\n" ); rc = 1; goto meta_command_exit; } x = shell_bindings_new_text(zKey); if( x ){ utf8_printf(stderr, "Error: bad setting: %s\n", zKey); } sqlite3_free(zToFree); }else if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){ const char *zLike = 0; /* Which table to checksum. 0 means everything */ int i; /* Loop counter */ int bSchema = 0; /* Also hash the schema */ |
︙ | ︙ |