Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Improve error and usage messages output by the shell ".ar" command. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | sqlar-shell-support |
Files: | files | file ages | folders |
SHA3-256: |
b9d2d5d97291bf3d1392232e3705cca8 |
User & Date: | dan 2017-12-14 15:40:42.931 |
Context
2017-12-14
| ||
19:15 | Have the writefile() function optionally set the modification-time of the files it writes or creates. And many small fixes to the new code on this branch. (check-in: 7b51269cae user: dan tags: sqlar-shell-support) | |
15:40 | Improve error and usage messages output by the shell ".ar" command. (check-in: b9d2d5d972 user: dan tags: sqlar-shell-support) | |
13:55 | Merge latest trunk changes into this branch. (check-in: 803156cba8 user: dan tags: sqlar-shell-support) | |
Changes
Changes to src/shell.c.in.
︙ | ︙ | |||
4148 4149 4150 4151 4152 4153 4154 | int nArg; /* Number of command arguments */ char **azArg; /* Array of command arguments */ }; /* ** Print a usage message for the .ar command to stderr and return SQLITE_ERROR. */ | | > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > | > > | | | > | > > | 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 | int nArg; /* Number of command arguments */ char **azArg; /* Array of command arguments */ }; /* ** Print a usage message for the .ar command to stderr and return SQLITE_ERROR. */ static int arUsage(FILE *f){ raw_printf(f, "\n" "Usage: .ar [OPTION...] [FILE...]\n" "The .ar command manages sqlar archives.\n" "\n" "Examples:\n" " .ar -cf archive.sar foo bar # Create archive.sar from files foo and bar\n" " .ar -tf archive.sar # List members of archive.sar\n" " .ar -xvf archive.sar # Verbosely extract files from archive.sar\n" "\n" "Each command line must feature exactly one command option:\n" " -c, --create Create a new archive\n" " -u, --update Update or add files to an existing archive\n" " -t, --list List contents of archive\n" " -x, --extract Extract files from archive\n" "\n" "And zero or more optional options:\n" " -v, --verbose Print each filename as it is processed\n" " -f FILE, --file FILE Operate on archive FILE (default is current db)\n" " -C DIR, --directory DIR Change to directory DIR to read/extract files\n" "\n" "See also: http://sqlite.org/cli.html#sqlar_archive_support\n" "\n" ); return SQLITE_ERROR; } /* ** Print an error message for the .ar command to stderr and return ** SQLITE_ERROR. */ static int arErrorMsg(const char *zFmt, ...){ va_list ap; char *z; va_start(ap, zFmt); z = sqlite3_vmprintf(zFmt, ap); va_end(ap); raw_printf(stderr, "Error: %s (try \".ar --help\")\n", z); sqlite3_free(z); return SQLITE_ERROR; } /* ** Values for ArCommand.eCmd. */ #define AR_CMD_CREATE 1 #define AR_CMD_EXTRACT 2 #define AR_CMD_LIST 3 #define AR_CMD_UPDATE 4 #define AR_CMD_HELP 5 /* ** Other (non-command) switches. */ #define AR_SWITCH_VERBOSE 6 #define AR_SWITCH_FILE 7 #define AR_SWITCH_DIRECTORY 8 static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){ switch( eSwitch ){ case AR_CMD_CREATE: case AR_CMD_EXTRACT: case AR_CMD_LIST: case AR_CMD_UPDATE: case AR_CMD_HELP: if( pAr->eCmd ){ return arErrorMsg("multiple command options"); } pAr->eCmd = eSwitch; break; case AR_SWITCH_VERBOSE: pAr->bVerbose = 1; break; |
︙ | ︙ | |||
4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 | int eSwitch; int bArg; } aSwitch[] = { { 'c', "create", AR_CMD_CREATE, 0 }, { 'x', "extract", AR_CMD_EXTRACT, 0 }, { 't', "list", AR_CMD_LIST, 0 }, { 'u', "update", AR_CMD_UPDATE, 0 }, { 'v', "verbose", AR_SWITCH_VERBOSE, 0 }, { 'f', "file", AR_SWITCH_FILE, 1 }, { 'C', "directory", AR_SWITCH_DIRECTORY, 1 } }; int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch); struct ArSwitch *pEnd = &aSwitch[nSwitch]; if( nArg<=1 ){ | > | | > > | > > | 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 | int eSwitch; int bArg; } aSwitch[] = { { 'c', "create", AR_CMD_CREATE, 0 }, { 'x', "extract", AR_CMD_EXTRACT, 0 }, { 't', "list", AR_CMD_LIST, 0 }, { 'u', "update", AR_CMD_UPDATE, 0 }, { 'h', "help", AR_CMD_HELP, 0 }, { 'v', "verbose", AR_SWITCH_VERBOSE, 0 }, { 'f', "file", AR_SWITCH_FILE, 1 }, { 'C', "directory", AR_SWITCH_DIRECTORY, 1 } }; int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch); struct ArSwitch *pEnd = &aSwitch[nSwitch]; if( nArg<=1 ){ return arUsage(stderr); }else{ char *z = azArg[1]; memset(pAr, 0, sizeof(ArCommand)); if( z[0]!='-' ){ /* Traditional style [tar] invocation */ int i; int iArg = 2; for(i=0; z[i]; i++){ const char *zArg = 0; struct ArSwitch *pOpt; for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ if( z[i]==pOpt->cShort ) break; } if( pOpt==pEnd ){ return arErrorMsg("unrecognized option: %c", z[i]); } if( pOpt->bArg ){ if( iArg>=nArg ){ return arErrorMsg("option requires an argument: %c",z[i]); } zArg = azArg[iArg++]; } if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; } pAr->nArg = nArg-iArg; if( pAr->nArg>0 ){ pAr->azArg = &azArg[iArg]; |
︙ | ︙ | |||
4272 4273 4274 4275 4276 4277 4278 | /* One or more short options */ for(i=1; i<n; i++){ const char *zArg = 0; struct ArSwitch *pOpt; for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ if( z[i]==pOpt->cShort ) break; } | | > > | > > | < < | | > > | 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 | /* One or more short options */ for(i=1; i<n; i++){ const char *zArg = 0; struct ArSwitch *pOpt; for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ if( z[i]==pOpt->cShort ) break; } if( pOpt==pEnd ){ return arErrorMsg("unrecognized option: %c\n", z[i]); } if( pOpt->bArg ){ if( i<(n-1) ){ zArg = &z[i+1]; i = n; }else{ if( iArg>=(nArg-1) ){ return arErrorMsg("option requires an argument: %c\n",z[i]); } zArg = azArg[++iArg]; } } if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; } }else if( z[2]=='\0' ){ /* A -- option, indicating that all remaining command line words ** are command arguments. */ pAr->azArg = &azArg[iArg+1]; pAr->nArg = nArg-iArg-1; break; }else{ /* A long option */ const char *zArg = 0; /* Argument for option, if any */ struct ArSwitch *pMatch = 0; /* Matching option */ struct ArSwitch *pOpt; /* Iterator */ for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ const char *zLong = pOpt->zLong; if( (n-2)<=strlen(zLong) && 0==memcmp(&z[2], zLong, n-2) ){ if( pMatch ){ return arErrorMsg("ambiguous option: %s",z); }else{ pMatch = pOpt; } } } if( pMatch==0 ){ return arErrorMsg("unrecognized option: %s", z); } if( pMatch->bArg ){ if( iArg>=(nArg-1) ){ return arErrorMsg("option requires an argument: %s", z); } zArg = azArg[++iArg]; } if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR; } } } } |
︙ | ︙ | |||
4461 4462 4463 4464 4465 4466 4467 | shellPrepare2(db, &rc, zSql1, zWhere, &pSql); if( rc==SQLITE_OK ){ sqlite3_bind_text(pSql, 1, zDir, -1, SQLITE_STATIC); } while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ if( pAr->bVerbose ){ | | | 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 | shellPrepare2(db, &rc, zSql1, zWhere, &pSql); if( rc==SQLITE_OK ){ sqlite3_bind_text(pSql, 1, zDir, -1, SQLITE_STATIC); } while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ if( pAr->bVerbose ){ raw_printf(p->out, "%s\n", sqlite3_column_text(pSql, 0)); } } shellFinalize(&rc, pSql); shellPrepare2(db, &rc, zSql2, zWhere, &pSql); if( rc==SQLITE_OK ){ sqlite3_bind_text(pSql, 1, zDir, -1, SQLITE_STATIC); |
︙ | ︙ | |||
4546 4547 4548 4549 4550 4551 4552 | while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ int sz; const char *zName = (const char*)sqlite3_column_text(pStmt, 0); int mode = sqlite3_column_int(pStmt, 1); unsigned int mtime = sqlite3_column_int(pStmt, 2); if( pAr->bVerbose ){ | | | 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 | while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ int sz; const char *zName = (const char*)sqlite3_column_text(pStmt, 0); int mode = sqlite3_column_int(pStmt, 1); unsigned int mtime = sqlite3_column_int(pStmt, 2); if( pAr->bVerbose ){ raw_printf(p->out, "%s\n", zName); } sqlite3_bind_text(pInsert, 1, zName, -1, SQLITE_STATIC); sqlite3_bind_int(pInsert, 2, mode); sqlite3_bind_int64(pInsert, 3, (sqlite3_int64)mtime); if( S_ISDIR(mode) ){ |
︙ | ︙ | |||
4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 | case AR_CMD_EXTRACT: rc = arExtractCommand(pState, db, &cmd); break; case AR_CMD_LIST: rc = arListCommand(pState, db, &cmd); break; default: assert( cmd.eCmd==AR_CMD_UPDATE ); rc = arUpdateCmd(pState, db, &cmd); break; } | > > > > | 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 | case AR_CMD_EXTRACT: rc = arExtractCommand(pState, db, &cmd); break; case AR_CMD_LIST: rc = arListCommand(pState, db, &cmd); break; case AR_CMD_HELP: arUsage(pState->out); break; default: assert( cmd.eCmd==AR_CMD_UPDATE ); rc = arUpdateCmd(pState, db, &cmd); break; } |
︙ | ︙ |