Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Comment: | 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) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
e751338c468cdad79efcc5cd5b924eb2 |
User & Date: | persicom 2002-04-18 02:46:52.000 |
2002-04-18
| ||
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) | |
01:56 | Fix for ticket #19: Do not call sqliteOsSync() if the only changes were changes to TEMP tables. (CVS 530) (check-in: 33da20b9c1 user: drh 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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | ** 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.51 2002/04/18 02:46:52 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. */ static sqlite *db = 0; /* ** This is the name of our program. It is set in main(), used ** in a number of other places, mostly for error messages. */ static char *Argv0; /* ** Prompt strings. Initialized in main. Settable with ** .prompt main continue */ static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/ static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */ /* ** This routine reads a line of text from standard input, stores ** the text in memory obtained from malloc() and returns a pointer ** to the text. NULL is returned at end of file, or if malloc() ** fails. ** ** The interface is like "readline" but no command-line editing |
︙ | ︙ | |||
100 101 102 103 104 105 106 | static char *one_input_line(const char *zPrior, FILE *in){ char *zPrompt; char *zResult; if( in!=0 ){ return getline(0, in); } if( zPrior && zPrior[0] ){ | | | > > > > > > > > > > > > > > > > > > > > > | 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 | static char *one_input_line(const char *zPrior, FILE *in){ char *zPrompt; char *zResult; if( in!=0 ){ return getline(0, in); } if( zPrior && zPrior[0] ){ zPrompt = continuePrompt; }else{ zPrompt = mainPrompt; } zResult = readline(zPrompt); if( zResult ) add_history(zResult); return zResult; } struct previous_mode_data { int valid; /* Is there legit data in here? */ int mode; int showHeader; int colWidth[100]; }; /* ** An pointer to an instance of this structure is passed from ** the main program to the callback. This is used to communicate ** state and mode information. */ struct callback_data { sqlite *db; /* The database */ int echoOn; /* True to echo input commands */ int cnt; /* Number of records displayed so far */ FILE *out; /* Write results here */ int mode; /* An output mode setting */ int showHeader; /* True to show column names in List or Column mode */ char *zDestTable; /* Name of destination table when MODE_Insert */ char separator[20]; /* Separator character for MODE_List */ int colWidth[100]; /* Requested width of each column when in column mode*/ int actualWidth[100]; /* Actual width of each column */ char nullvalue[20]; /* The text to print when a NULL comes back from the database */ struct previous_mode_data explainPrev; /* Holds the mode information just before .explain ON */ char outfile[FILENAME_MAX]; /* Filename for *out */ }; /* ** These are the allowed modes. */ #define MODE_Line 0 /* One column per line. Blank line between records */ #define MODE_Column 1 /* One record per line in neat columns */ #define MODE_List 2 /* One record per line with a separator */ #define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */ #define MODE_Html 4 /* Generate an XHTML table */ #define MODE_Insert 5 /* Generate SQL "insert" statements */ #define MODE_NUM_OF 6 char *modeDescr[MODE_NUM_OF] = { "line", "column", "list", "semi", "html", "insert" }; /* ** Number of elements in an array */ #define ArraySize(X) (sizeof(X)/sizeof(X[0])) /* |
︙ | ︙ | |||
247 248 249 250 251 252 253 | if( azArg==0 ) break; for(i=0; i<nArg; i++){ int len = strlen(azCol[i]); if( len>w ) w = len; } if( p->cnt++>0 ) fprintf(p->out,"\n"); for(i=0; i<nArg; i++){ | | | | 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 | if( azArg==0 ) break; for(i=0; i<nArg; i++){ int len = strlen(azCol[i]); if( len>w ) w = len; } if( p->cnt++>0 ) fprintf(p->out,"\n"); for(i=0; i<nArg; i++){ fprintf(p->out,"%*s = %s\n", w, azCol[i], azArg[i] ? azArg[i] : p->nullvalue); } break; } case MODE_Column: { if( p->cnt++==0 ){ for(i=0; i<nArg; i++){ int w, n; if( i<ArraySize(p->colWidth) ){ w = p->colWidth[i]; }else{ w = 0; } 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": " "); |
︙ | ︙ | |||
296 297 298 299 300 301 302 | int w; if( i<ArraySize(p->actualWidth) ){ w = p->actualWidth[i]; }else{ w = 10; } fprintf(p->out,"%-*.*s%s",w,w, | | | | 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 | int w; if( i<ArraySize(p->actualWidth) ){ w = p->actualWidth[i]; }else{ w = 10; } fprintf(p->out,"%-*.*s%s",w,w, azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " "); } break; } case MODE_Semi: case MODE_List: { if( p->cnt++==0 && p->showHeader ){ for(i=0; i<nArg; i++){ fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator); } } if( azArg==0 ) break; for(i=0; i<nArg; i++){ char *z = azArg[i]; if( z==0 ) z = p->nullvalue; fprintf(p->out, "%s", z); if( i<nArg-1 ){ fprintf(p->out, "%s", p->separator); }else if( p->mode==MODE_Semi ){ fprintf(p->out, ";\n"); }else{ fprintf(p->out, "\n"); |
︙ | ︙ | |||
334 335 336 337 338 339 340 | } fprintf(p->out,"</TR>\n"); } if( azArg==0 ) break; fprintf(p->out,"<TR>"); for(i=0; i<nArg; i++){ fprintf(p->out,"<TD>"); | | | 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 | } fprintf(p->out,"</TR>\n"); } if( azArg==0 ) break; fprintf(p->out,"<TR>"); for(i=0; i<nArg; i++){ fprintf(p->out,"<TD>"); output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue); fprintf(p->out,"</TD>\n"); } fprintf(p->out,"</TD></TR>\n"); break; } case MODE_Insert: { if( azArg==0 ) break; |
︙ | ︙ | |||
431 432 433 434 435 436 437 | /* ** 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" | | > > | | > > > > > > > > > > > > > > > | 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 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 | /* ** 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" " Special characters are:\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" " .echo\n" " .explain\n" " .mode\n" " .nullvalue\n" " .output\n" " .separator\n" " .width\n" ".tables ?PATTERN? List names of tables matching a pattern\n" ".timeout MS Try opening locked tables for MS milliseconds\n" ".width NUM NUM ... Set column widths for \"column\" mode\n" ; /* Forward reference */ static void process_input(struct callback_data *p, FILE *in); |
︙ | ︙ | |||
535 536 537 538 539 540 541 | }else if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){ sqlite_close(db); exit(0); }else | | > > > > > > > > > > > > > > > > > > > > > > > > > | | > | | | | | > > > > > > | > > | 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 | }else if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){ sqlite_close(db); exit(0); }else if( c=='e' && strncmp(azArg[0], "explain", n)==0 && nArg>1){ int j; char *z = azArg[1]; int val = atoi(azArg[1]); 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; } if(val == 1) { if(!p->explainPrev.valid) { p->explainPrev.valid = 1; p->explainPrev.mode = p->mode; p->explainPrev.showHeader = p->showHeader; memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth)); } /* We could put this code under the !p->explainValid ** condition so that it does not execute if we are already in ** explain mode. However, always executing it allows us an easy ** was to reset to explain mode in case the user previously ** did an .explain followed by a .width, .mode or .header ** command. */ p->mode = MODE_Column; p->showHeader = 1; memset(p->colWidth,0,ArraySize(p->colWidth)); p->colWidth[0] = 4; p->colWidth[1] = 12; p->colWidth[2] = 10; p->colWidth[3] = 10; p->colWidth[4] = 35; }else if (p->explainPrev.valid) { p->explainPrev.valid = 0; p->mode = p->explainPrev.mode; p->showHeader = p->explainPrev.showHeader; memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth)); } }else if( c=='h' && (strncmp(azArg[0], "header", n)==0 || strncmp(azArg[0], "headers", n)==0 )&& nArg>1 ){ int j; char *z = azArg[1]; int val = atoi(azArg[1]); for(j=0; z[j]; j++){ if( isupper(z[j]) ) z[j] = tolower(z[j]); } if( strcmp(z,"on")==0 ){ |
︙ | ︙ | |||
584 585 586 587 588 589 590 | fprintf(stderr,"Error: %s\n", zErrMsg); free(zErrMsg); } }else if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg>=2 ){ int n2 = strlen(azArg[1]); | | > > | > > > > > > > > > > > > > > > > > > > > > > > | 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 | fprintf(stderr,"Error: %s\n", zErrMsg); free(zErrMsg); } }else if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg>=2 ){ int n2 = strlen(azArg[1]); if( strncmp(azArg[1],"line",n2)==0 || strncmp(azArg[1],"lines",n2)==0 ){ p->mode = MODE_Line; }else if( strncmp(azArg[1],"column",n2)==0 || strncmp(azArg[1],"columns",n2)==0 ){ p->mode = MODE_Column; }else if( strncmp(azArg[1],"list",n2)==0 ){ p->mode = MODE_List; }else if( strncmp(azArg[1],"html",n2)==0 ){ p->mode = MODE_Html; }else if( strncmp(azArg[1],"insert",n2)==0 ){ p->mode = MODE_Insert; if( nArg>=3 ){ set_table_name(p, azArg[2]); }else{ set_table_name(p, "table"); } }else { fprintf(stderr,"mode should be on of: column html insert line list\n"); } }else if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) { sprintf(p->nullvalue, "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]); }else if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){ if( p->out!=stdout ){ fclose(p->out); } if( strcmp(azArg[1],"stdout")==0 ){ p->out = stdout; strcpy(p->outfile,"stdout"); }else{ p->out = fopen(azArg[1], "w"); if( p->out==0 ){ fprintf(stderr,"can't write to \"%s\"\n", azArg[1]); p->out = stdout; } else { strcpy(p->outfile,azArg[1]); } } }else if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && nArg==2 || nArg==3){ if( nArg >= 2) { strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); } if( nArg >= 3) { strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1); } }else if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){ sqlite_close(db); exit(0); }else if( c=='r' && strncmp(azArg[0], "read", n)==0 && nArg==2 ){ FILE *alt = fopen(azArg[1], "r"); if( alt==0 ){ fprintf(stderr,"can't open \"%s\"\n", azArg[1]); }else{ process_input(p, alt); |
︙ | ︙ | |||
708 709 710 711 712 713 714 715 716 717 718 719 720 721 | free(zErrMsg); } }else if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){ sprintf(p->separator, "%.*s", (int)ArraySize(p->separator)-1, azArg[1]); }else if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){ char **azResult; int nRow, rc; char *zErrMsg; if( nArg==1 ){ rc = sqlite_get_table(db, | > > > > > > > > > > > > > > > | 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 | free(zErrMsg); } }else if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){ sprintf(p->separator, "%.*s", (int)ArraySize(p->separator)-1, azArg[1]); }else if( c=='s' && strncmp(azArg[0], "show", n)==0){ int i; fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off"); fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" : "off"); fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]); fprintf(p->out,"%9.9s: %s\n","nullvalue", p->nullvalue); fprintf(p->out,"%9.9s: %s\n","output", strlen(p->outfile) ? p->outfile : "stdout"); fprintf(p->out,"%9.9s: %s\n","separator", p->separator); fprintf(p->out,"%9.9s: ","width"); for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) { fprintf(p->out,"%d ",p->colWidth[i]); } fprintf(p->out,"\n\n"); }else if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){ char **azResult; int nRow, rc; char *zErrMsg; if( nArg==1 ){ rc = sqlite_get_table(db, |
︙ | ︙ | |||
767 768 769 770 771 772 773 | int j; for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){ p->colWidth[j-1] = atoi(azArg[j]); } }else { | | < | 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 | int j; for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){ p->colWidth[j-1] = atoi(azArg[j]); } }else { fprintf(stderr, "unknown command or invalid arguments: \"%s\". Enter \".help\" for help\n", azArg[0]); } } static void process_input(struct callback_data *p, FILE *in){ char *zLine; char *zSql = 0; int nSql = 0; char *zErrMsg; while( fflush(p->out), (zLine = one_input_line(zSql, in))!=0 ){ if( p->echoOn ) printf("%s\n", zLine); |
︙ | ︙ | |||
824 825 826 827 828 829 830 831 832 833 834 835 836 | } } if( zSql ){ printf("Incomplete SQL: %s\n", zSql); free(zSql); } } int main(int argc, char **argv){ char *zErrMsg = 0; struct callback_data data; Argv0 = argv[0]; | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | < > > > > > > > > > > > > > > > > > > > > > > > | > > > > | 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 | } } if( zSql ){ printf("Incomplete SQL: %s\n", zSql); free(zSql); } } static void process_sqliterc(struct callback_data *p, char *sqliterc_override){ char *home_dir = NULL; char *sqliterc = sqliterc_override; struct passwd *pwent; uid_t uid = getuid(); FILE *in = NULL; if (sqliterc == NULL) { /* Figure out the user's home directory */ while( (pwent=getpwent()) != NULL) { if(pwent->pw_uid == uid) { home_dir = pwent->pw_dir; break; } } if (!home_dir) { home_dir = getenv("HOME"); if (!home_dir) { home_dir = getenv("HOMEPATH"); /* Windows? */ } if (!home_dir) { printf("Cannot find home directory from which to load .sqliterc\n"); return; } } /* With the home directory, open the init file and process */ sqliterc = (char *)calloc(strlen(home_dir) + strlen("/.sqliterc") + 1, sizeof(char)); if( sqliterc==0 ){ fprintf(stderr,"%s: out of memory!\n", Argv0); exit(1); } sprintf(sqliterc,"%s/.sqliterc",home_dir); } in = fopen(sqliterc,"r"); if(!in) { /* File either had an error or was not found. Since I cannot * tell, I cannot bark. */ return; } else { printf("Loading resources from %s\n",sqliterc); process_input(p,in); close (in); } return; } void main_init(struct callback_data *data) { memset(data, 0, sizeof(*data)); data->mode = MODE_List; strcpy(data->separator,"|"); data->showHeader = 0; strcpy(mainPrompt,"sqlite> "); strcpy(continuePrompt," ...> "); } int main(int argc, char **argv){ char *zErrMsg = 0; struct callback_data data; int origArgc = argc; char **origArgv = argv; Argv0 = argv[0]; main_init(&data); process_sqliterc(&data,NULL); #ifdef SIGINT signal(SIGINT, interrupt_handler); #endif while( argc>=2 && argv[1][0]=='-' ){ if( argc>=3 && strcmp(argv[1],"-init")==0 ){ /* If we get a -init to do, we have to pretend that ** it replaced the .sqliterc file. Soooo, in order to ** do that we need to start from scratch...*/ main_init(&data); /* treat this file as the sqliterc... */ process_sqliterc(&data,argv[2]); /* fix up the command line so we do not re-read ** the option next time around... */ { int i = 1; for(i=1;i<=argc-2;i++) { argv[i] = argv[i+2]; } } origArgc-=2; /* and reset the command line options to be re-read.*/ argv = origArgv; argc = origArgc; }else if( strcmp(argv[1],"-html")==0 ){ data.mode = MODE_Html; argc--; argv++; }else if( strcmp(argv[1],"-list")==0 ){ data.mode = MODE_List; argc--; argv++; }else if( strcmp(argv[1],"-line")==0 ){ data.mode = MODE_Line; argc--; argv++; }else if( strcmp(argv[1],"-column")==0 ){ data.mode = MODE_Column; argc--; argv++; }else if( argc>=3 && strcmp(argv[1],"-separator")==0 ){ sprintf(data.separator,"%.*s",(int)sizeof(data.separator)-1,argv[2]); argc -= 2; argv += 2; }else if( argc>=3 && strcmp(argv[1],"-nullvalue")==0 ){ sprintf(data.nullvalue,"%.*s",(int)sizeof(data.nullvalue)-1,argv[2]); argc -= 2; argv += 2; }else if( strcmp(argv[1],"-header")==0 ){ data.showHeader = 1; argc--; argv++; }else if( strcmp(argv[1],"-noheader")==0 ){ data.showHeader = 0; |
︙ | ︙ |