From: drh Date: Fri, 27 Apr 2018 20:49:13 +0000 (+0000) Subject: Better comments on the bindvtab.c implementation. All the two-argument X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c81e84534036afcb48268759a6f2015ae94e492a;p=thirdparty%2Fsqlite.git 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. FossilOrigin-Name: 7b2a65a65475b80669af4ff5ac7adb6b310cd8275a36e672a3f5c88a259693c0 --- diff --git a/ext/misc/bindvtab.c b/ext/misc/bindvtab.c index b031ddfdc8..a7ce8bec43 100644 --- a/ext/misc/bindvtab.c +++ b/ext/misc/bindvtab.c @@ -14,6 +14,38 @@ ** 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" diff --git a/manifest b/manifest index 241aefa036..021219d8a2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sability\sto\suse\sbind\sparameters\sin\sthe\sCLI.\s\sThe\snew\s".set\sKEY=VALUE"\ndot-command\sworks\sto\sset\sbindings.\s\sOr\suse\sthe\s"-Dkey=value"\scommand-line\noption.\s\sOr\suse\sthe\sbuilt-in\sshell_bindings(k,v)\svirtual\stable\sto\sset,\ndelete,\sor\schanging\sbindings. -D 2018-04-27T17:39:22.740 +C Better\scomments\son\sthe\sbindvtab.c\simplementation.\s\sAll\sthe\stwo-argument\nversion\sof\sthe\s.set\scommand.\s\sAll\sbindings\sfrom\s.set\sand\s-D\sare\sstill\nstring. +D 2018-04-27T20:49:13.739 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in da02d4d3544992af522b4ece652debef3255a5d45377ebb1b5ab8a9a5cd16859 @@ -269,7 +269,7 @@ F ext/misc/README.md d6dd0fe1d8af77040216798a6a2b0c46c73054d2f0ea544fbbcdccf6f23 F ext/misc/amatch.c 6db4607cb17c54b853a2d7c7c36046d004853f65b9b733e6f019d543d5dfae87 F ext/misc/anycollseq.c 5ffdfde9829eeac52219136ad6aa7cd9a4edb3b15f4f2532de52f4a22525eddb F ext/misc/appendvfs.c 3777f22ec1057dc4e5fd89f2fbddcc7a29fbeef1ad038c736c54411bb1967af7 -F ext/misc/bindvtab.c e21871461a0bb4646da111a7f32f709946f76a4013d523dc183192f0879c0cb3 +F ext/misc/bindvtab.c 70ca40ff9bec3cc6da53e09bf13e0af858dc210e68e41b7915d4ff71c363819c F ext/misc/btreeinfo.c 78c8c57d325185ccc04b7679e5b020e34a4d9c87453e6b7ac943d0a26cee3256 F ext/misc/carray.c ed96c218ea940b85c9a274c4d9c59fe9491c299147a38a8bba537687bd6c6005 F ext/misc/closure.c 0d2a038df8fbae7f19de42e7c7d71f2e4dc88704 @@ -494,7 +494,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 6415381a0e9d22c0e7cba33ca4a53f81474190862f5d4838190f5eb5b0b47bc9 F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac F src/select.c daf07d8defce3311f9e69f1280a874d78bc1d16c305f6aa689640f7afa02842f -F src/shell.c.in 3bac9ab3c0ec1b8641b9ed25c0e2cf242b8bb186202d577b56fb16408dcacf24 +F src/shell.c.in d751c9e8aa9c73a700d4033d2bfcfccad90c476b1fcb0d406e3f6b140e0f02c0 F src/sqlite.h.in 8e70752a57597c08f64f3d49fc1fc46926b862d2e23b038b0d23b9cc748d88ea F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 83a3c4ce93d650bedfd1aa558cb85a516bd6d094445ee989740827d0d944368d @@ -1726,10 +1726,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 05f6278a02e5cde89f76ced5af7d508e26576d7291dad7ee9e06b1a3be516cb0 -R 2fe85036f0f3b01feae669c6ee5a9387 -T *branch * shell-bindings -T *sym-shell-bindings * -T -sym-trunk * +P 1f2944d1d64d36b729450685974c260295cf1e32c204b71e27d20ebc4d65f9e8 +R 8b8e4c122ecc932439216f69c14e3e66 U drh -Z 275e393030ab15b790049a2a3b9245cb +Z 42c91d81ee6385ae52b3a143c0c973f3 diff --git a/manifest.uuid b/manifest.uuid index 487874bf11..ce3af55349 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1f2944d1d64d36b729450685974c260295cf1e32c204b71e27d20ebc4d65f9e8 \ No newline at end of file +7b2a65a65475b80669af4ff5ac7adb6b310cd8275a36e672a3f5c88a259693c0 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index c6ab3fd18c..0483dac046 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -7154,15 +7154,25 @@ static int do_meta_command(char *zLine, ShellState *p){ if( c=='s' && n==3 && strncmp(azArg[0],"set",3)==0 ){ int x; - if( nArg<2 ){ - raw_printf(stderr, "Usage: .set KEY=VALUE\n"); + 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(azArg[1]); + x = shell_bindings_new_text(zKey); if( x ){ - utf8_printf(stderr, "Error: bad setting: %s\n", azArg[1]); + utf8_printf(stderr, "Error: bad setting: %s\n", zKey); } + sqlite3_free(zToFree); }else