Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Comment: | Mistake in help text. Spurious trailing whitespace removed. (CVS 532) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
4bdd040e4810565c91bcbb5f06558052 |
User & Date: | persicom 2002-04-18 02:53:05.000 |
2002-04-18
| ||
02:53 | Updated to match new shell.c functionality. (CVS 533) (check-in: ff67ad4010 user: persicom tags: trunk) | |
02:53 | Mistake in help text. Spurious trailing whitespace removed. (CVS 532) (check-in: 4bdd040e48 user: persicom tags: trunk) | |
02:46 |
General:
o Added global static chars mainPrompt and continuePrompt.
o Moved Argv0 declaration to head of file. Needed in do_meta_command,
previously found below that.
o Added struct previous_mode_data to support new .explain toggle
functionality.
o Added nullvalue, explainPrev and outfile members to
struct callback_data.
o Added modeDescr array for number/text translation ofdisplay modes.
o Modified zHelp to match new functionality.
callback(): o Added support for .nullvalue do_meta_command(): o Output filename is now saved to callback struct. If using stdout, then the string "stdout" is saved. o Explain is now a toggle. When it is turned on, the current values of mode, header and colWidth are saved if not already in explain mode. When turned off, those values are restored. o Allow .mode plurals columns and lines and dot command plural .headers. o Added processing for new keywords .quit, .nullvalue, .show, .prompt. main(): o Added -init as an option to override .sqliterc. o Added -nullvalue as a command line option. o Processes .sqliterc. main_init(): o Genesis. Moved some initialization code here from inside main() so that it can be called initially by main and again if -init is specified. one_input_line(): o Now takes prompts from settable values. process_sqliterc(): o Genesis. Read .sqliterc from user's home directory and pass it to process_input(). File should contain meta commands for setups. (CVS 531) (check-in: e751338c46 user: persicom tags: trunk) | |
︙ | ︙ | |||
8 9 10 11 12 13 14 | ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** This file contains code to implement the "sqlite" command line ** utility for accessing SQLite databases. ** | | | | 8 9 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 | ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** This file contains code to implement the "sqlite" command line ** utility for accessing SQLite databases. ** ** $Id: shell.c,v 1.52 2002/04/18 02:53:05 persicom Exp $ */ #include <stdlib.h> #include <string.h> #include <stdio.h> #include "sqlite.h" #include <ctype.h> #include <pwd.h> #include <sys/types.h> #if !defined(_WIN32) && !defined(WIN32) # include <signal.h> #endif #if defined(HAVE_READLINE) && HAVE_READLINE==1 # include <readline/readline.h> # include <readline/history.h> #else # define readline(p) getline(p,stdin) # define add_history(X) #endif /* ** The following is the open SQLite database. We make a pointer ** to this database a static variable so that it can be accessed ** by the SIGINT handler to interrupt database processing. */ |
︙ | ︙ | |||
187 188 189 190 191 192 193 | ** Return TRUE if the string supplied is a number of some kinds. */ static int is_numeric(const char *z){ int seen_digit = 0; if( *z=='-' || *z=='+' ){ z++; } | | | 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 | ** Return TRUE if the string supplied is a number of some kinds. */ static int is_numeric(const char *z){ int seen_digit = 0; if( *z=='-' || *z=='+' ){ z++; } while( isdigit(*z) ){ seen_digit = 1; z++; } if( seen_digit && *z=='.' ){ z++; while( isdigit(*z) ){ z++; } } |
︙ | ︙ | |||
304 305 306 307 308 309 310 | if( w<=0 ){ w = strlen(azCol[i] ? azCol[i] : ""); if( w<10 ) w = 10; n = strlen(azArg && azArg[i] ? azArg[i] : p->nullvalue); if( w<n ) w = n; } if( i<ArraySize(p->actualWidth) ){ | | | 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 | if( w<=0 ){ w = strlen(azCol[i] ? azCol[i] : ""); if( w<10 ) w = 10; n = strlen(azArg && azArg[i] ? azArg[i] : p->nullvalue); if( w<n ) w = n; } if( i<ArraySize(p->actualWidth) ){ p->actualWidth[i] = w; } if( p->showHeader ){ fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " "); } } if( p->showHeader ){ for(i=0; i<nArg; i++){ |
︙ | ︙ | |||
394 395 396 397 398 399 400 | if( zSep[0] ) fprintf(p->out,"%s",zSep); output_quoted_string(p->out, azArg[i]); } } fprintf(p->out,");\n"); break; } | | | 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 | if( zSep[0] ) fprintf(p->out,"%s",zSep); output_quoted_string(p->out, azArg[i]); } } fprintf(p->out,");\n"); break; } } return 0; } /* ** Set the destination table field of the callback_data structure to ** the name of the table given. Escape any quote characters in the ** table name. |
︙ | ︙ | |||
452 453 454 455 456 457 458 | fprintf(p->out, "%s;\n", azArg[2]); if( strcmp(azArg[1],"table")==0 ){ struct callback_data d2; d2 = *p; d2.mode = MODE_Insert; d2.zDestTable = 0; set_table_name(&d2, azArg[0]); | | | < | 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 | fprintf(p->out, "%s;\n", azArg[2]); if( strcmp(azArg[1],"table")==0 ){ struct callback_data d2; d2 = *p; d2.mode = MODE_Insert; d2.zDestTable = 0; set_table_name(&d2, azArg[0]); sqlite_exec_printf(p->db, "SELECT * FROM '%q'", callback, &d2, 0, azArg[0] ); set_table_name(&d2, 0); } return 0; } /* ** Text of a help message */ static char zHelp[] = ".dump ?TABLE? ... Dump the database in an text format\n" ".echo ON|OFF Turn command echo on or off\n" ".exit Exit this program\n" ".explain ON|OFF Turn output mode suitable for EXPLAIN on or off.\n" " \"off\" will revert to the output mode that was\n" " previously in effect\n" ".header(s) ON|OFF Turn display of headers on or off\n" ".help Show this message\n" ".indices TABLE Show names of all indices on TABLE\n" ".mode MODE Set mode to one of \"line(s)\", \"column(s)\", \n" " \"insert\", \"list\", or \"html\"\n" ".mode insert TABLE Generate SQL insert statements for TABLE\n" ".nullvalue STRING Print STRING instead of nothing for NULL data\n" ".output FILENAME Send output to FILENAME\n" ".output stdout Send output to the screen\n" ".prompt MAIN CONTINUE Replace the standard prompts\n" " \"sqlite > \" and \" ...> \"\n" " with the strings MAIN and CONTINUE\n" " CONTINUE is optional.\n" ".quit Exit this program\n" ".read FILENAME Execute SQL in FILENAME\n" ".reindex ?TABLE? Rebuild indices\n" /* ".rename OLD NEW Change the name of a table or index\n" */ ".schema ?TABLE? Show the CREATE statements\n" ".separator STRING Change separator string for \"list\" mode\n" ".show Show the current values for the following:\n" |
︙ | ︙ | |||
553 554 555 556 557 558 559 | "WHERE type!='meta' AND sql NOT NULL " "ORDER BY substr(type,2,1), name", dump_callback, p, &zErrMsg ); }else{ int i; for(i=1; i<nArg && zErrMsg==0; i++){ | | | 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 | "WHERE type!='meta' AND sql NOT NULL " "ORDER BY substr(type,2,1), name", dump_callback, p, &zErrMsg ); }else{ int i; for(i=1; i<nArg && zErrMsg==0; i++){ sqlite_exec_printf(db, "SELECT name, type, sql FROM sqlite_master " "WHERE tbl_name LIKE '%q' AND type!='meta' AND sql NOT NULL " "ORDER BY substr(type,2,1), name", dump_callback, p, &zErrMsg, azArg[i] ); } } |
︙ | ︙ | |||
580 581 582 583 584 585 586 | for(j=0; z[j]; j++){ if( isupper(z[j]) ) z[j] = tolower(z[j]); } if( strcmp(z,"on")==0 ){ val = 1; }else if( strcmp(z,"yes")==0 ){ val = 1; | | | 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 | for(j=0; z[j]; j++){ if( isupper(z[j]) ) z[j] = tolower(z[j]); } if( strcmp(z,"on")==0 ){ val = 1; }else if( strcmp(z,"yes")==0 ){ val = 1; } p->echoOn = val; }else if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){ sqlite_close(db); exit(0); }else |
︙ | ︙ | |||
644 645 646 647 648 649 650 | for(j=0; z[j]; j++){ if( isupper(z[j]) ) z[j] = tolower(z[j]); } if( strcmp(z,"on")==0 ){ val = 1; }else if( strcmp(z,"yes")==0 ){ val = 1; | | | | 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 | for(j=0; z[j]; j++){ if( isupper(z[j]) ) z[j] = tolower(z[j]); } if( strcmp(z,"on")==0 ){ val = 1; }else if( strcmp(z,"yes")==0 ){ val = 1; } p->showHeader = val; }else if( c=='h' && strncmp(azArg[0], "help", n)==0 ){ fprintf(stderr,zHelp); }else if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg>1 ){ struct callback_data data; char *zErrMsg = 0; memcpy(&data, p, sizeof(data)); data.showHeader = 0; data.mode = MODE_List; sqlite_exec_printf(db, "SELECT name FROM sqlite_master " "WHERE type='index' AND tbl_name LIKE '%q' " "ORDER BY name", callback, &data, &zErrMsg, azArg[1] ); if( zErrMsg ){ fprintf(stderr,"Error: %s\n", zErrMsg); |
︙ | ︙ | |||
934 935 936 937 938 939 940 | strcpy(&zSql[nSql++], "\n"); strcpy(&zSql[nSql], zLine); nSql += len; } free(zLine); if( zSql && sqlite_complete(zSql) ){ p->cnt = 0; | | | 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 | strcpy(&zSql[nSql++], "\n"); strcpy(&zSql[nSql], zLine); nSql += len; } free(zLine); if( zSql && sqlite_complete(zSql) ){ p->cnt = 0; if( sqlite_exec(db, zSql, callback, p, &zErrMsg)!=0 && zErrMsg!=0 ){ if( in!=0 && !p->echoOn ) printf("%s\n",zSql); printf("SQL error: %s\n", zErrMsg); free(zErrMsg); zErrMsg = 0; } free(zSql); |
︙ | ︙ |