@@ -4036,14 +4036,16 @@
4036 4036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
4037 4037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int main(int argc, char **argv){
4038 4038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zErrMsg = 0;
4039 4039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ShellState data;
4040 4040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zInitFile = 0;
4041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *zFirstCmd = 0;
4042 4041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
4043 4042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = 0;
4044 4043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int warnInmemoryDb = 0;
4044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int readStdin = 1;
4045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nCmd = 0;
4046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char **azCmd = 0;
4045 4047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
4046 4048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if USE_SYSTEM_SQLITE+0!=1
4047 4049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
4048 4050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
4049 4051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_sourceid(), SQLITE_SOURCE_ID);
@@ -4058,10 +4060,22 @@
4058 4060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** else is done.
4059 4061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
4060 4062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SIGINT
4061 4063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
signal(SIGINT, interrupt_handler);
4062 4064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
4065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
4066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_SHELL_DBNAME_PROC
4067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {
4068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
4069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of a C-function that will provide the name of the database file. Use
4070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this compile-time option to embed this shell program in larger
4071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** applications. */
4072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ extern void SQLITE_SHELL_DBNAME_PROC(const char**);
4073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
4074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ warnInmemoryDb = 0;
4075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
4076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
4063 4077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
4064 4078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Do an initial pass through the command-line argument to locate
4065 4079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the name of the database file, the name of the initialization file,
4066 4080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the size of the alternative malloc heap,
4067 4081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** and the first command to execute.
@@ -4070,19 +4084,22 @@
4070 4084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *z;
4071 4085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
z = argv[i];
4072 4086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( z[0]!='-' ){
4073 4087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( data.zDbFilename==0 ){
4074 4088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
data.zDbFilename = z;
4075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- continue;
4076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
4077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zFirstCmd==0 ){
4078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zFirstCmd = z;
4079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- continue;
4080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
4081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
4082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fprintf(stderr,"Use -help for a list of options.\n");
4083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return 1;
4089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
4090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Excesss arguments are interpreted as SQL (or dot-commands) and
4091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** mean that nothing is read from stdin */
4092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ readStdin = 0;
4093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nCmd++;
4094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
4095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( azCmd==0 ){
4096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fprintf(stderr, "out of memory\n");
4097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ exit(1);
4098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
4099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azCmd[nCmd-1] = z;
4100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
4084 4101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
4085 4102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( z[1]=='-' ) z++;
4086 4103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strcmp(z,"-separator")==0
4087 4104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| strcmp(z,"-nullvalue")==0
4088 4105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| strcmp(z,"-newline")==0
@@ -4169,15 +4186,10 @@
4169 4186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
warnInmemoryDb = argc==1;
4170 4187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
4171 4188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
4172 4189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
4173 4190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
4174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_SHELL_DBNAME_PROC
4175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { extern void SQLITE_SHELL_DBNAME_PROC(const char**);
4176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
4177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- warnInmemoryDb = 0; }
4178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
4179 4191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
4180 4192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
data.out = stdout;
4181 4193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
4182 4194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Go ahead and open the database file if it already exists. If the
4183 4195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** file does not exist, delay opening it. This prevents empty database
@@ -4194,10 +4206,22 @@
4194 4206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
4195 4207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = process_sqliterc(&data,zInitFile);
4196 4208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc>0 ){
4197 4209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
4198 4210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
4211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
4212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_SHELL_INIT_PROC
4213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {
4214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The SQLITE_SHELL_INIT_PROC is an application-defined function
4215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that can do additional initialization on the database connection
4216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** after it has opened.
4217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
4218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ extern int SQLITE_SHELL_INIT_PROC(sqlite3*);
4219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_SHELL_INIT_PROC(data.db);
4220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc ) return rc;
4221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
4222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
4199 4223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
4200 4224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Make a second pass through the command-line argument and set
4201 4225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** options. This second pass is delayed until after the initialization
4202 4226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** file is processed so that the command-line arguments will override
4203 4227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** settings in the initialization file.
@@ -4270,10 +4294,14 @@
4270 4294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i++;
4271 4295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
4272 4296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( strcmp(z,"-help")==0 ){
4273 4297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
usage(1);
4274 4298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( strcmp(z,"-cmd")==0 ){
4299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Run commands that follow -cmd first and separately from commands
4300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that simply appear on the command-line. This seems goofy. It would
4301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** be better if all commands ran in the order that they appear. But
4302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** we retain the goofy behavior for historical compatibility. */
4275 4303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( i==argc-1 ) break;
4276 4304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
z = cmdline_option_value(argc,argv,++i);
4277 4305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( z[0]=='.' ){
4278 4306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = do_meta_command(z, &data);
4279 4307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc && bail_on_error ) return rc==2 ? 0 : rc;
@@ -4293,27 +4321,32 @@
4293 4321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fprintf(stderr,"Use -help for a list of options.\n");
4294 4322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
4295 4323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
4296 4324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
4297 4325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
4298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zFirstCmd ){
4299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Run just the command that follows the database name
4300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
4301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zFirstCmd[0]=='.' ){
4302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = do_meta_command(zFirstCmd, &data);
4303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==2 ) rc = 0;
4304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
4305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- open_db(&data, 0);
4306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
4307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zErrMsg!=0 ){
4308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fprintf(stderr,"Error: %s\n", zErrMsg);
4309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc!=0 ? rc : 1;
4310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( rc!=0 ){
4311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
4312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
4313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
4314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
4326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !readStdin ){
4327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Run all arguments that do not begin with '-' as if they were separate
4328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** command-line inputs, except for the argToSkip argument which contains
4329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the database filename.
4330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
4331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<nCmd; i++){
4332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( azCmd[i][0]=='.' ){
4333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = do_meta_command(azCmd[i], &data);
4334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc ) return rc==2 ? 0 : rc;
4335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
4336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ open_db(&data, 0);
4337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg);
4338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zErrMsg!=0 ){
4339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fprintf(stderr,"Error: %s\n", zErrMsg);
4340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc!=0 ? rc : 1;
4341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( rc!=0 ){
4342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fprintf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
4343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
4344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
4345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
4346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
4347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(azCmd);
4315 4348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
4316 4349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Run commands received from standard input
4317 4350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
4318 4351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( stdin_is_interactive ){
4319 4352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zHome;
4320 4353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!