source: trunk/src/3rdparty/sqlite/shell.c

Last change on this file was 2, checked in by Dmitry A. Kuminov, 16 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 58.7 KB
Line 
1/*
2** 2001 September 15
3**
4** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
6**
7** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
10**
11*************************************************************************
12** This file contains code to implement the "sqlite" command line
13** utility for accessing SQLite databases.
14**
15** $Id: shell.c,v 1.178 2008/05/05 16:27:24 drh Exp $
16*/
17#include <stdlib.h>
18#include <string.h>
19#include <stdio.h>
20#include <assert.h>
21#include "sqlite3.h"
22#include <ctype.h>
23#include <stdarg.h>
24
25#if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__)
26# include <signal.h>
27# include <pwd.h>
28# include <unistd.h>
29# include <sys/types.h>
30#endif
31
32#ifdef __OS2__
33# include <unistd.h>
34#endif
35
36#if defined(HAVE_READLINE) && HAVE_READLINE==1
37# include <readline/readline.h>
38# include <readline/history.h>
39#else
40# define readline(p) local_getline(p,stdin)
41# define add_history(X)
42# define read_history(X)
43# define write_history(X)
44# define stifle_history(X)
45#endif
46
47#if defined(_WIN32) || defined(WIN32)
48# include <io.h>
49#else
50/* Make sure isatty() has a prototype.
51*/
52extern int isatty();
53#endif
54
55#if defined(_WIN32_WCE)
56/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
57 * thus we always assume that we have a console. That can be
58 * overridden with the -batch command line option.
59 */
60#define isatty(x) 1
61#endif
62
63#if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__)
64#include <sys/time.h>
65#include <sys/resource.h>
66
67/* Saved resource information for the beginning of an operation */
68static struct rusage sBegin;
69
70/* True if the timer is enabled */
71static int enableTimer = 0;
72
73/*
74** Begin timing an operation
75*/
76static void beginTimer(void){
77 if( enableTimer ){
78 getrusage(RUSAGE_SELF, &sBegin);
79 }
80}
81
82/* Return the difference of two time_structs in microseconds */
83static int timeDiff(struct timeval *pStart, struct timeval *pEnd){
84 return (pEnd->tv_usec - pStart->tv_usec) +
85 1000000*(pEnd->tv_sec - pStart->tv_sec);
86}
87
88/*
89** Print the timing results.
90*/
91static void endTimer(void){
92 if( enableTimer ){
93 struct rusage sEnd;
94 getrusage(RUSAGE_SELF, &sEnd);
95 printf("CPU Time: user %f sys %f\n",
96 0.000001*timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
97 0.000001*timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
98 }
99}
100#define BEGIN_TIMER beginTimer()
101#define END_TIMER endTimer()
102#define HAS_TIMER 1
103#else
104#define BEGIN_TIMER
105#define END_TIMER
106#define HAS_TIMER 0
107#endif
108
109
110/*
111** If the following flag is set, then command execution stops
112** at an error if we are not interactive.
113*/
114static int bail_on_error = 0;
115
116/*
117** Threat stdin as an interactive input if the following variable
118** is true. Otherwise, assume stdin is connected to a file or pipe.
119*/
120static int stdin_is_interactive = 1;
121
122/*
123** The following is the open SQLite database. We make a pointer
124** to this database a static variable so that it can be accessed
125** by the SIGINT handler to interrupt database processing.
126*/
127static sqlite3 *db = 0;
128
129/*
130** True if an interrupt (Control-C) has been received.
131*/
132static volatile int seenInterrupt = 0;
133
134/*
135** This is the name of our program. It is set in main(), used
136** in a number of other places, mostly for error messages.
137*/
138static char *Argv0;
139
140/*
141** Prompt strings. Initialized in main. Settable with
142** .prompt main continue
143*/
144static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
145static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
146
147/*
148** Write I/O traces to the following stream.
149*/
150#ifdef SQLITE_ENABLE_IOTRACE
151static FILE *iotrace = 0;
152#endif
153
154/*
155** This routine works like printf in that its first argument is a
156** format string and subsequent arguments are values to be substituted
157** in place of % fields. The result of formatting this string
158** is written to iotrace.
159*/
160#ifdef SQLITE_ENABLE_IOTRACE
161static void iotracePrintf(const char *zFormat, ...){
162 va_list ap;
163 char *z;
164 if( iotrace==0 ) return;
165 va_start(ap, zFormat);
166 z = sqlite3_vmprintf(zFormat, ap);
167 va_end(ap);
168 fprintf(iotrace, "%s", z);
169 sqlite3_free(z);
170}
171#endif
172
173
174/*
175** Determines if a string is a number of not.
176*/
177static int isNumber(const char *z, int *realnum){
178 if( *z=='-' || *z=='+' ) z++;
179 if( !isdigit(*z) ){
180 return 0;
181 }
182 z++;
183 if( realnum ) *realnum = 0;
184 while( isdigit(*z) ){ z++; }
185 if( *z=='.' ){
186 z++;
187 if( !isdigit(*z) ) return 0;
188 while( isdigit(*z) ){ z++; }
189 if( realnum ) *realnum = 1;
190 }
191 if( *z=='e' || *z=='E' ){
192 z++;
193 if( *z=='+' || *z=='-' ) z++;
194 if( !isdigit(*z) ) return 0;
195 while( isdigit(*z) ){ z++; }
196 if( realnum ) *realnum = 1;
197 }
198 return *z==0;
199}
200
201/*
202** A global char* and an SQL function to access its current value
203** from within an SQL statement. This program used to use the
204** sqlite_exec_printf() API to substitue a string into an SQL statement.
205** The correct way to do this with sqlite3 is to use the bind API, but
206** since the shell is built around the callback paradigm it would be a lot
207** of work. Instead just use this hack, which is quite harmless.
208*/
209static const char *zShellStatic = 0;
210static void shellstaticFunc(
211 sqlite3_context *context,
212 int argc,
213 sqlite3_value **argv
214){
215 assert( 0==argc );
216 assert( zShellStatic );
217 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
218}
219
220
221/*
222** This routine reads a line of text from FILE in, stores
223** the text in memory obtained from malloc() and returns a pointer
224** to the text. NULL is returned at end of file, or if malloc()
225** fails.
226**
227** The interface is like "readline" but no command-line editing
228** is done.
229*/
230static char *local_getline(char *zPrompt, FILE *in){
231 char *zLine;
232 int nLine;
233 int n;
234 int eol;
235
236 if( zPrompt && *zPrompt ){
237 printf("%s",zPrompt);
238 fflush(stdout);
239 }
240 nLine = 100;
241 zLine = malloc( nLine );
242 if( zLine==0 ) return 0;
243 n = 0;
244 eol = 0;
245 while( !eol ){
246 if( n+100>nLine ){
247 nLine = nLine*2 + 100;
248 zLine = realloc(zLine, nLine);
249 if( zLine==0 ) return 0;
250 }
251 if( fgets(&zLine[n], nLine - n, in)==0 ){
252 if( n==0 ){
253 free(zLine);
254 return 0;
255 }
256 zLine[n] = 0;
257 eol = 1;
258 break;
259 }
260 while( zLine[n] ){ n++; }
261 if( n>0 && zLine[n-1]=='\n' ){
262 n--;
263 zLine[n] = 0;
264 eol = 1;
265 }
266 }
267 zLine = realloc( zLine, n+1 );
268 return zLine;
269}
270
271/*
272** Retrieve a single line of input text.
273**
274** zPrior is a string of prior text retrieved. If not the empty
275** string, then issue a continuation prompt.
276*/
277static char *one_input_line(const char *zPrior, FILE *in){
278 char *zPrompt;
279 char *zResult;
280 if( in!=0 ){
281 return local_getline(0, in);
282 }
283 if( zPrior && zPrior[0] ){
284 zPrompt = continuePrompt;
285 }else{
286 zPrompt = mainPrompt;
287 }
288 zResult = readline(zPrompt);
289#if defined(HAVE_READLINE) && HAVE_READLINE==1
290 if( zResult && *zResult ) add_history(zResult);
291#endif
292 return zResult;
293}
294
295struct previous_mode_data {
296 int valid; /* Is there legit data in here? */
297 int mode;
298 int showHeader;
299 int colWidth[100];
300};
301
302/*
303** An pointer to an instance of this structure is passed from
304** the main program to the callback. This is used to communicate
305** state and mode information.
306*/
307struct callback_data {
308 sqlite3 *db; /* The database */
309 int echoOn; /* True to echo input commands */
310 int cnt; /* Number of records displayed so far */
311 FILE *out; /* Write results here */
312 int mode; /* An output mode setting */
313 int writableSchema; /* True if PRAGMA writable_schema=ON */
314 int showHeader; /* True to show column names in List or Column mode */
315 char *zDestTable; /* Name of destination table when MODE_Insert */
316 char separator[20]; /* Separator character for MODE_List */
317 int colWidth[100]; /* Requested width of each column when in column mode*/
318 int actualWidth[100]; /* Actual width of each column */
319 char nullvalue[20]; /* The text to print when a NULL comes back from
320 ** the database */
321 struct previous_mode_data explainPrev;
322 /* Holds the mode information just before
323 ** .explain ON */
324 char outfile[FILENAME_MAX]; /* Filename for *out */
325 const char *zDbFilename; /* name of the database file */
326};
327
328/*
329** These are the allowed modes.
330*/
331#define MODE_Line 0 /* One column per line. Blank line between records */
332#define MODE_Column 1 /* One record per line in neat columns */
333#define MODE_List 2 /* One record per line with a separator */
334#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
335#define MODE_Html 4 /* Generate an XHTML table */
336#define MODE_Insert 5 /* Generate SQL "insert" statements */
337#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
338#define MODE_Csv 7 /* Quote strings, numbers are plain */
339#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
340
341static const char *modeDescr[] = {
342 "line",
343 "column",
344 "list",
345 "semi",
346 "html",
347 "insert",
348 "tcl",
349 "csv",
350 "explain",
351};
352
353/*
354** Number of elements in an array
355*/
356#define ArraySize(X) (sizeof(X)/sizeof(X[0]))
357
358/*
359** Output the given string as a quoted string using SQL quoting conventions.
360*/
361static void output_quoted_string(FILE *out, const char *z){
362 int i;
363 int nSingle = 0;
364 for(i=0; z[i]; i++){
365 if( z[i]=='\'' ) nSingle++;
366 }
367 if( nSingle==0 ){
368 fprintf(out,"'%s'",z);
369 }else{
370 fprintf(out,"'");
371 while( *z ){
372 for(i=0; z[i] && z[i]!='\''; i++){}
373 if( i==0 ){
374 fprintf(out,"''");
375 z++;
376 }else if( z[i]=='\'' ){
377 fprintf(out,"%.*s''",i,z);
378 z += i+1;
379 }else{
380 fprintf(out,"%s",z);
381 break;
382 }
383 }
384 fprintf(out,"'");
385 }
386}
387
388/*
389** Output the given string as a quoted according to C or TCL quoting rules.
390*/
391static void output_c_string(FILE *out, const char *z){
392 unsigned int c;
393 fputc('"', out);
394 while( (c = *(z++))!=0 ){
395 if( c=='\\' ){
396 fputc(c, out);
397 fputc(c, out);
398 }else if( c=='\t' ){
399 fputc('\\', out);
400 fputc('t', out);
401 }else if( c=='\n' ){
402 fputc('\\', out);
403 fputc('n', out);
404 }else if( c=='\r' ){
405 fputc('\\', out);
406 fputc('r', out);
407 }else if( !isprint(c) ){
408 fprintf(out, "\\%03o", c&0xff);
409 }else{
410 fputc(c, out);
411 }
412 }
413 fputc('"', out);
414}
415
416/*
417** Output the given string with characters that are special to
418** HTML escaped.
419*/
420static void output_html_string(FILE *out, const char *z){
421 int i;
422 while( *z ){
423 for(i=0; z[i] && z[i]!='<' && z[i]!='&'; i++){}
424 if( i>0 ){
425 fprintf(out,"%.*s",i,z);
426 }
427 if( z[i]=='<' ){
428 fprintf(out,"&lt;");
429 }else if( z[i]=='&' ){
430 fprintf(out,"&amp;");
431 }else{
432 break;
433 }
434 z += i + 1;
435 }
436}
437
438/*
439** If a field contains any character identified by a 1 in the following
440** array, then the string must be quoted for CSV.
441*/
442static const char needCsvQuote[] = {
443 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
444 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
445 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
446 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
447 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
448 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
449 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
450 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
451 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
452 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
453 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
454 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
455 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
456 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
457 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
458 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
459};
460
461/*
462** Output a single term of CSV. Actually, p->separator is used for
463** the separator, which may or may not be a comma. p->nullvalue is
464** the null value. Strings are quoted using ANSI-C rules. Numbers
465** appear outside of quotes.
466*/
467static void output_csv(struct callback_data *p, const char *z, int bSep){
468 FILE *out = p->out;
469 if( z==0 ){
470 fprintf(out,"%s",p->nullvalue);
471 }else{
472 int i;
473 int nSep = strlen(p->separator);
474 for(i=0; z[i]; i++){
475 if( needCsvQuote[((unsigned char*)z)[i]]
476 || (z[i]==p->separator[0] &&
477 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
478 i = 0;
479 break;
480 }
481 }
482 if( i==0 ){
483 putc('"', out);
484 for(i=0; z[i]; i++){
485 if( z[i]=='"' ) putc('"', out);
486 putc(z[i], out);
487 }
488 putc('"', out);
489 }else{
490 fprintf(out, "%s", z);
491 }
492 }
493 if( bSep ){
494 fprintf(p->out, "%s", p->separator);
495 }
496}
497
498#ifdef SIGINT
499/*
500** This routine runs when the user presses Ctrl-C
501*/
502static void interrupt_handler(int NotUsed){
503 seenInterrupt = 1;
504 if( db ) sqlite3_interrupt(db);
505}
506#endif
507
508/*
509** This is the callback routine that the SQLite library
510** invokes for each row of a query result.
511*/
512static int callback(void *pArg, int nArg, char **azArg, char **azCol){
513 int i;
514 struct callback_data *p = (struct callback_data*)pArg;
515 switch( p->mode ){
516 case MODE_Line: {
517 int w = 5;
518 if( azArg==0 ) break;
519 for(i=0; i<nArg; i++){
520 int len = strlen(azCol[i] ? azCol[i] : "");
521 if( len>w ) w = len;
522 }
523 if( p->cnt++>0 ) fprintf(p->out,"\n");
524 for(i=0; i<nArg; i++){
525 fprintf(p->out,"%*s = %s\n", w, azCol[i],
526 azArg[i] ? azArg[i] : p->nullvalue);
527 }
528 break;
529 }
530 case MODE_Explain:
531 case MODE_Column: {
532 if( p->cnt++==0 ){
533 for(i=0; i<nArg; i++){
534 int w, n;
535 if( i<ArraySize(p->colWidth) ){
536 w = p->colWidth[i];
537 }else{
538 w = 0;
539 }
540 if( w<=0 ){
541 w = strlen(azCol[i] ? azCol[i] : "");
542 if( w<10 ) w = 10;
543 n = strlen(azArg && azArg[i] ? azArg[i] : p->nullvalue);
544 if( w<n ) w = n;
545 }
546 if( i<ArraySize(p->actualWidth) ){
547 p->actualWidth[i] = w;
548 }
549 if( p->showHeader ){
550 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
551 }
552 }
553 if( p->showHeader ){
554 for(i=0; i<nArg; i++){
555 int w;
556 if( i<ArraySize(p->actualWidth) ){
557 w = p->actualWidth[i];
558 }else{
559 w = 10;
560 }
561 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
562 "----------------------------------------------------------",
563 i==nArg-1 ? "\n": " ");
564 }
565 }
566 }
567 if( azArg==0 ) break;
568 for(i=0; i<nArg; i++){
569 int w;
570 if( i<ArraySize(p->actualWidth) ){
571 w = p->actualWidth[i];
572 }else{
573 w = 10;
574 }
575 if( p->mode==MODE_Explain && azArg[i] && strlen(azArg[i])>w ){
576 w = strlen(azArg[i]);
577 }
578 fprintf(p->out,"%-*.*s%s",w,w,
579 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
580 }
581 break;
582 }
583 case MODE_Semi:
584 case MODE_List: {
585 if( p->cnt++==0 && p->showHeader ){
586 for(i=0; i<nArg; i++){
587 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
588 }
589 }
590 if( azArg==0 ) break;
591 for(i=0; i<nArg; i++){
592 char *z = azArg[i];
593 if( z==0 ) z = p->nullvalue;
594 fprintf(p->out, "%s", z);
595 if( i<nArg-1 ){
596 fprintf(p->out, "%s", p->separator);
597 }else if( p->mode==MODE_Semi ){
598 fprintf(p->out, ";\n");
599 }else{
600 fprintf(p->out, "\n");
601 }
602 }
603 break;
604 }
605 case MODE_Html: {
606 if( p->cnt++==0 && p->showHeader ){
607 fprintf(p->out,"<TR>");
608 for(i=0; i<nArg; i++){
609 fprintf(p->out,"<TH>%s</TH>",azCol[i]);
610 }
611 fprintf(p->out,"</TR>\n");
612 }
613 if( azArg==0 ) break;
614 fprintf(p->out,"<TR>");
615 for(i=0; i<nArg; i++){
616 fprintf(p->out,"<TD>");
617 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
618 fprintf(p->out,"</TD>\n");
619 }
620 fprintf(p->out,"</TR>\n");
621 break;
622 }
623 case MODE_Tcl: {
624 if( p->cnt++==0 && p->showHeader ){
625 for(i=0; i<nArg; i++){
626 output_c_string(p->out,azCol[i] ? azCol[i] : "");
627 fprintf(p->out, "%s", p->separator);
628 }
629 fprintf(p->out,"\n");
630 }
631 if( azArg==0 ) break;
632 for(i=0; i<nArg; i++){
633 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
634 fprintf(p->out, "%s", p->separator);
635 }
636 fprintf(p->out,"\n");
637 break;
638 }
639 case MODE_Csv: {
640 if( p->cnt++==0 && p->showHeader ){
641 for(i=0; i<nArg; i++){
642 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
643 }
644 fprintf(p->out,"\n");
645 }
646 if( azArg==0 ) break;
647 for(i=0; i<nArg; i++){
648 output_csv(p, azArg[i], i<nArg-1);
649 }
650 fprintf(p->out,"\n");
651 break;
652 }
653 case MODE_Insert: {
654 if( azArg==0 ) break;
655 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
656 for(i=0; i<nArg; i++){
657 char *zSep = i>0 ? ",": "";
658 if( azArg[i]==0 ){
659 fprintf(p->out,"%sNULL",zSep);
660 }else if( isNumber(azArg[i], 0) ){
661 fprintf(p->out,"%s%s",zSep, azArg[i]);
662 }else{
663 if( zSep[0] ) fprintf(p->out,"%s",zSep);
664 output_quoted_string(p->out, azArg[i]);
665 }
666 }
667 fprintf(p->out,");\n");
668 break;
669 }
670 }
671 return 0;
672}
673
674/*
675** Set the destination table field of the callback_data structure to
676** the name of the table given. Escape any quote characters in the
677** table name.
678*/
679static void set_table_name(struct callback_data *p, const char *zName){
680 int i, n;
681 int needQuote;
682 char *z;
683
684 if( p->zDestTable ){
685 free(p->zDestTable);
686 p->zDestTable = 0;
687 }
688 if( zName==0 ) return;
689 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
690 for(i=n=0; zName[i]; i++, n++){
691 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
692 needQuote = 1;
693 if( zName[i]=='\'' ) n++;
694 }
695 }
696 if( needQuote ) n += 2;
697 z = p->zDestTable = malloc( n+1 );
698 if( z==0 ){
699 fprintf(stderr,"Out of memory!\n");
700 exit(1);
701 }
702 n = 0;
703 if( needQuote ) z[n++] = '\'';
704 for(i=0; zName[i]; i++){
705 z[n++] = zName[i];
706 if( zName[i]=='\'' ) z[n++] = '\'';
707 }
708 if( needQuote ) z[n++] = '\'';
709 z[n] = 0;
710}
711
712/* zIn is either a pointer to a NULL-terminated string in memory obtained
713** from malloc(), or a NULL pointer. The string pointed to by zAppend is
714** added to zIn, and the result returned in memory obtained from malloc().
715** zIn, if it was not NULL, is freed.
716**
717** If the third argument, quote, is not '\0', then it is used as a
718** quote character for zAppend.
719*/
720static char *appendText(char *zIn, char const *zAppend, char quote){
721 int len;
722 int i;
723 int nAppend = strlen(zAppend);
724 int nIn = (zIn?strlen(zIn):0);
725
726 len = nAppend+nIn+1;
727 if( quote ){
728 len += 2;
729 for(i=0; i<nAppend; i++){
730 if( zAppend[i]==quote ) len++;
731 }
732 }
733
734 zIn = (char *)realloc(zIn, len);
735 if( !zIn ){
736 return 0;
737 }
738
739 if( quote ){
740 char *zCsr = &zIn[nIn];
741 *zCsr++ = quote;
742 for(i=0; i<nAppend; i++){
743 *zCsr++ = zAppend[i];
744 if( zAppend[i]==quote ) *zCsr++ = quote;
745 }
746 *zCsr++ = quote;
747 *zCsr++ = '\0';
748 assert( (zCsr-zIn)==len );
749 }else{
750 memcpy(&zIn[nIn], zAppend, nAppend);
751 zIn[len-1] = '\0';
752 }
753
754 return zIn;
755}
756
757
758/*
759** Execute a query statement that has a single result column. Print
760** that result column on a line by itself with a semicolon terminator.
761**
762** This is used, for example, to show the schema of the database by
763** querying the SQLITE_MASTER table.
764*/
765static int run_table_dump_query(FILE *out, sqlite3 *db, const char *zSelect){
766 sqlite3_stmt *pSelect;
767 int rc;
768 rc = sqlite3_prepare(db, zSelect, -1, &pSelect, 0);
769 if( rc!=SQLITE_OK || !pSelect ){
770 return rc;
771 }
772 rc = sqlite3_step(pSelect);
773 while( rc==SQLITE_ROW ){
774 fprintf(out, "%s;\n", sqlite3_column_text(pSelect, 0));
775 rc = sqlite3_step(pSelect);
776 }
777 return sqlite3_finalize(pSelect);
778}
779
780
781/*
782** This is a different callback routine used for dumping the database.
783** Each row received by this callback consists of a table name,
784** the table type ("index" or "table") and SQL to create the table.
785** This routine should print text sufficient to recreate the table.
786*/
787static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
788 int rc;
789 const char *zTable;
790 const char *zType;
791 const char *zSql;
792 struct callback_data *p = (struct callback_data *)pArg;
793
794 if( nArg!=3 ) return 1;
795 zTable = azArg[0];
796 zType = azArg[1];
797 zSql = azArg[2];
798
799 if( strcmp(zTable, "sqlite_sequence")==0 ){
800 fprintf(p->out, "DELETE FROM sqlite_sequence;\n");
801 }else if( strcmp(zTable, "sqlite_stat1")==0 ){
802 fprintf(p->out, "ANALYZE sqlite_master;\n");
803 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
804 return 0;
805 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
806 char *zIns;
807 if( !p->writableSchema ){
808 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
809 p->writableSchema = 1;
810 }
811 zIns = sqlite3_mprintf(
812 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
813 "VALUES('table','%q','%q',0,'%q');",
814 zTable, zTable, zSql);
815 fprintf(p->out, "%s\n", zIns);
816 sqlite3_free(zIns);
817 return 0;
818 }else{
819 fprintf(p->out, "%s;\n", zSql);
820 }
821
822 if( strcmp(zType, "table")==0 ){
823 sqlite3_stmt *pTableInfo = 0;
824 char *zSelect = 0;
825 char *zTableInfo = 0;
826 char *zTmp = 0;
827
828 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
829 zTableInfo = appendText(zTableInfo, zTable, '"');
830 zTableInfo = appendText(zTableInfo, ");", 0);
831
832 rc = sqlite3_prepare(p->db, zTableInfo, -1, &pTableInfo, 0);
833 if( zTableInfo ) free(zTableInfo);
834 if( rc!=SQLITE_OK || !pTableInfo ){
835 return 1;
836 }
837
838 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
839 zTmp = appendText(zTmp, zTable, '"');
840 if( zTmp ){
841 zSelect = appendText(zSelect, zTmp, '\'');
842 }
843 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
844 rc = sqlite3_step(pTableInfo);
845 while( rc==SQLITE_ROW ){
846 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
847 zSelect = appendText(zSelect, "quote(", 0);
848 zSelect = appendText(zSelect, zText, '"');
849 rc = sqlite3_step(pTableInfo);
850 if( rc==SQLITE_ROW ){
851 zSelect = appendText(zSelect, ") || ',' || ", 0);
852 }else{
853 zSelect = appendText(zSelect, ") ", 0);
854 }
855 }
856 rc = sqlite3_finalize(pTableInfo);
857 if( rc!=SQLITE_OK ){
858 if( zSelect ) free(zSelect);
859 return 1;
860 }
861 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
862 zSelect = appendText(zSelect, zTable, '"');
863
864 rc = run_table_dump_query(p->out, p->db, zSelect);
865 if( rc==SQLITE_CORRUPT ){
866 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
867 rc = run_table_dump_query(p->out, p->db, zSelect);
868 }
869 if( zSelect ) free(zSelect);
870 }
871 return 0;
872}
873
874/*
875** Run zQuery. Use dump_callback() as the callback routine so that
876** the contents of the query are output as SQL statements.
877**
878** If we get a SQLITE_CORRUPT error, rerun the query after appending
879** "ORDER BY rowid DESC" to the end.
880*/
881static int run_schema_dump_query(
882 struct callback_data *p,
883 const char *zQuery,
884 char **pzErrMsg
885){
886 int rc;
887 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, pzErrMsg);
888 if( rc==SQLITE_CORRUPT ){
889 char *zQ2;
890 int len = strlen(zQuery);
891 if( pzErrMsg ) sqlite3_free(*pzErrMsg);
892 zQ2 = malloc( len+100 );
893 if( zQ2==0 ) return rc;
894 sqlite3_snprintf(sizeof(zQ2), zQ2, "%s ORDER BY rowid DESC", zQuery);
895 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, pzErrMsg);
896 free(zQ2);
897 }
898 return rc;
899}
900
901/*
902** Text of a help message
903*/
904static char zHelp[] =
905 ".bail ON|OFF Stop after hitting an error. Default OFF\n"
906 ".databases List names and files of attached databases\n"
907 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
908 ".echo ON|OFF Turn command echo on or off\n"
909 ".exit Exit this program\n"
910 ".explain ON|OFF Turn output mode suitable for EXPLAIN on or off.\n"
911 ".header(s) ON|OFF Turn display of headers on or off\n"
912 ".help Show this message\n"
913 ".import FILE TABLE Import data from FILE into TABLE\n"
914 ".indices TABLE Show names of all indices on TABLE\n"
915#ifdef SQLITE_ENABLE_IOTRACE
916 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
917#endif
918#ifndef SQLITE_OMIT_LOAD_EXTENSION
919 ".load FILE ?ENTRY? Load an extension library\n"
920#endif
921 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
922 " csv Comma-separated values\n"
923 " column Left-aligned columns. (See .width)\n"
924 " html HTML <table> code\n"
925 " insert SQL insert statements for TABLE\n"
926 " line One value per line\n"
927 " list Values delimited by .separator string\n"
928 " tabs Tab-separated values\n"
929 " tcl TCL list elements\n"
930 ".nullvalue STRING Print STRING in place of NULL values\n"
931 ".output FILENAME Send output to FILENAME\n"
932 ".output stdout Send output to the screen\n"
933 ".prompt MAIN CONTINUE Replace the standard prompts\n"
934 ".quit Exit this program\n"
935 ".read FILENAME Execute SQL in FILENAME\n"
936 ".schema ?TABLE? Show the CREATE statements\n"
937 ".separator STRING Change separator used by output mode and .import\n"
938 ".show Show the current values for various settings\n"
939 ".tables ?PATTERN? List names of tables matching a LIKE pattern\n"
940 ".timeout MS Try opening locked tables for MS milliseconds\n"
941#if HAS_TIMER
942 ".timer ON|OFF Turn the CPU timer measurement on or off\n"
943#endif
944 ".width NUM NUM ... Set column widths for \"column\" mode\n"
945;
946
947/* Forward reference */
948static int process_input(struct callback_data *p, FILE *in);
949
950/*
951** Make sure the database is open. If it is not, then open it. If
952** the database fails to open, print an error message and exit.
953*/
954static void open_db(struct callback_data *p){
955 if( p->db==0 ){
956 sqlite3_open(p->zDbFilename, &p->db);
957 db = p->db;
958 if( db && sqlite3_errcode(db)==SQLITE_OK ){
959 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
960 shellstaticFunc, 0, 0);
961 }
962 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
963 fprintf(stderr,"Unable to open database \"%s\": %s\n",
964 p->zDbFilename, sqlite3_errmsg(db));
965 exit(1);
966 }
967#ifndef SQLITE_OMIT_LOAD_EXTENSION
968 sqlite3_enable_load_extension(p->db, 1);
969#endif
970 }
971}
972
973/*
974** Do C-language style dequoting.
975**
976** \t -> tab
977** \n -> newline
978** \r -> carriage return
979** \NNN -> ascii character NNN in octal
980** \\ -> backslash
981*/
982static void resolve_backslashes(char *z){
983 int i, j, c;
984 for(i=j=0; (c = z[i])!=0; i++, j++){
985 if( c=='\\' ){
986 c = z[++i];
987 if( c=='n' ){
988 c = '\n';
989 }else if( c=='t' ){
990 c = '\t';
991 }else if( c=='r' ){
992 c = '\r';
993 }else if( c>='0' && c<='7' ){
994 c -= '0';
995 if( z[i+1]>='0' && z[i+1]<='7' ){
996 i++;
997 c = (c<<3) + z[i] - '0';
998 if( z[i+1]>='0' && z[i+1]<='7' ){
999 i++;
1000 c = (c<<3) + z[i] - '0';
1001 }
1002 }
1003 }
1004 }
1005 z[j] = c;
1006 }
1007 z[j] = 0;
1008}
1009
1010/*
1011** Interpret zArg as a boolean value. Return either 0 or 1.
1012*/
1013static int booleanValue(char *zArg){
1014 int val = atoi(zArg);
1015 int j;
1016 for(j=0; zArg[j]; j++){
1017 zArg[j] = tolower(zArg[j]);
1018 }
1019 if( strcmp(zArg,"on")==0 ){
1020 val = 1;
1021 }else if( strcmp(zArg,"yes")==0 ){
1022 val = 1;
1023 }
1024 return val;
1025}
1026
1027/*
1028** If an input line begins with "." then invoke this routine to
1029** process that line.
1030**
1031** Return 1 on error, 2 to exit, and 0 otherwise.
1032*/
1033static int do_meta_command(char *zLine, struct callback_data *p){
1034 int i = 1;
1035 int nArg = 0;
1036 int n, c;
1037 int rc = 0;
1038 char *azArg[50];
1039
1040 /* Parse the input line into tokens.
1041 */
1042 while( zLine[i] && nArg<ArraySize(azArg) ){
1043 while( isspace((unsigned char)zLine[i]) ){ i++; }
1044 if( zLine[i]==0 ) break;
1045 if( zLine[i]=='\'' || zLine[i]=='"' ){
1046 int delim = zLine[i++];
1047 azArg[nArg++] = &zLine[i];
1048 while( zLine[i] && zLine[i]!=delim ){ i++; }
1049 if( zLine[i]==delim ){
1050 zLine[i++] = 0;
1051 }
1052 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
1053 }else{
1054 azArg[nArg++] = &zLine[i];
1055 while( zLine[i] && !isspace((unsigned char)zLine[i]) ){ i++; }
1056 if( zLine[i] ) zLine[i++] = 0;
1057 resolve_backslashes(azArg[nArg-1]);
1058 }
1059 }
1060
1061 /* Process the input line.
1062 */
1063 if( nArg==0 ) return rc;
1064 n = strlen(azArg[0]);
1065 c = azArg[0][0];
1066 if( c=='b' && n>1 && strncmp(azArg[0], "bail", n)==0 && nArg>1 ){
1067 bail_on_error = booleanValue(azArg[1]);
1068 }else
1069
1070 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
1071 struct callback_data data;
1072 char *zErrMsg = 0;
1073 open_db(p);
1074 memcpy(&data, p, sizeof(data));
1075 data.showHeader = 1;
1076 data.mode = MODE_Column;
1077 data.colWidth[0] = 3;
1078 data.colWidth[1] = 15;
1079 data.colWidth[2] = 58;
1080 data.cnt = 0;
1081 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
1082 if( zErrMsg ){
1083 fprintf(stderr,"Error: %s\n", zErrMsg);
1084 sqlite3_free(zErrMsg);
1085 }
1086 }else
1087
1088 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
1089 char *zErrMsg = 0;
1090 open_db(p);
1091 fprintf(p->out, "BEGIN TRANSACTION;\n");
1092 p->writableSchema = 0;
1093 if( nArg==1 ){
1094 run_schema_dump_query(p,
1095 "SELECT name, type, sql FROM sqlite_master "
1096 "WHERE sql NOT NULL AND type=='table'", 0
1097 );
1098 run_table_dump_query(p->out, p->db,
1099 "SELECT sql FROM sqlite_master "
1100 "WHERE sql NOT NULL AND type IN ('index','trigger','view')"
1101 );
1102 }else{
1103 int i;
1104 for(i=1; i<nArg; i++){
1105 zShellStatic = azArg[i];
1106 run_schema_dump_query(p,
1107 "SELECT name, type, sql FROM sqlite_master "
1108 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
1109 " AND sql NOT NULL", 0);
1110 run_table_dump_query(p->out, p->db,
1111 "SELECT sql FROM sqlite_master "
1112 "WHERE sql NOT NULL"
1113 " AND type IN ('index','trigger','view')"
1114 " AND tbl_name LIKE shellstatic()"
1115 );
1116 zShellStatic = 0;
1117 }
1118 }
1119 if( p->writableSchema ){
1120 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
1121 p->writableSchema = 0;
1122 }
1123 if( zErrMsg ){
1124 fprintf(stderr,"Error: %s\n", zErrMsg);
1125 sqlite3_free(zErrMsg);
1126 }else{
1127 fprintf(p->out, "COMMIT;\n");
1128 }
1129 }else
1130
1131 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 ){
1132 p->echoOn = booleanValue(azArg[1]);
1133 }else
1134
1135 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
1136 rc = 2;
1137 }else
1138
1139 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
1140 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
1141 if(val == 1) {
1142 if(!p->explainPrev.valid) {
1143 p->explainPrev.valid = 1;
1144 p->explainPrev.mode = p->mode;
1145 p->explainPrev.showHeader = p->showHeader;
1146 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
1147 }
1148 /* We could put this code under the !p->explainValid
1149 ** condition so that it does not execute if we are already in
1150 ** explain mode. However, always executing it allows us an easy
1151 ** was to reset to explain mode in case the user previously
1152 ** did an .explain followed by a .width, .mode or .header
1153 ** command.
1154 */
1155 p->mode = MODE_Explain;
1156 p->showHeader = 1;
1157 memset(p->colWidth,0,ArraySize(p->colWidth));
1158 p->colWidth[0] = 4; /* addr */
1159 p->colWidth[1] = 13; /* opcode */
1160 p->colWidth[2] = 4; /* P1 */
1161 p->colWidth[3] = 4; /* P2 */
1162 p->colWidth[4] = 4; /* P3 */
1163 p->colWidth[5] = 13; /* P4 */
1164 p->colWidth[6] = 2; /* P5 */
1165 p->colWidth[7] = 13; /* Comment */
1166 }else if (p->explainPrev.valid) {
1167 p->explainPrev.valid = 0;
1168 p->mode = p->explainPrev.mode;
1169 p->showHeader = p->explainPrev.showHeader;
1170 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
1171 }
1172 }else
1173
1174 if( c=='h' && (strncmp(azArg[0], "header", n)==0 ||
1175 strncmp(azArg[0], "headers", n)==0 )&& nArg>1 ){
1176 p->showHeader = booleanValue(azArg[1]);
1177 }else
1178
1179 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
1180 fprintf(stderr,zHelp);
1181 }else
1182
1183 if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg>=3 ){
1184 char *zTable = azArg[2]; /* Insert data into this table */
1185 char *zFile = azArg[1]; /* The file from which to extract data */
1186 sqlite3_stmt *pStmt; /* A statement */
1187 int rc; /* Result code */
1188 int nCol; /* Number of columns in the table */
1189 int nByte; /* Number of bytes in an SQL string */
1190 int i, j; /* Loop counters */
1191 int nSep; /* Number of bytes in p->separator[] */
1192 char *zSql; /* An SQL statement */
1193 char *zLine; /* A single line of input from the file */
1194 char **azCol; /* zLine[] broken up into columns */
1195 char *zCommit; /* How to commit changes */
1196 FILE *in; /* The input file */
1197 int lineno = 0; /* Line number of input file */
1198
1199 open_db(p);
1200 nSep = strlen(p->separator);
1201 if( nSep==0 ){
1202 fprintf(stderr, "non-null separator required for import\n");
1203 return 0;
1204 }
1205 zSql = sqlite3_mprintf("SELECT * FROM '%q'", zTable);
1206 if( zSql==0 ) return 0;
1207 nByte = strlen(zSql);
1208 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
1209 sqlite3_free(zSql);
1210 if( rc ){
1211 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
1212 nCol = 0;
1213 rc = 1;
1214 }else{
1215 nCol = sqlite3_column_count(pStmt);
1216 }
1217 sqlite3_finalize(pStmt);
1218 if( nCol==0 ) return 0;
1219 zSql = malloc( nByte + 20 + nCol*2 );
1220 if( zSql==0 ) return 0;
1221 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO '%q' VALUES(?", zTable);
1222 j = strlen(zSql);
1223 for(i=1; i<nCol; i++){
1224 zSql[j++] = ',';
1225 zSql[j++] = '?';
1226 }
1227 zSql[j++] = ')';
1228 zSql[j] = 0;
1229 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
1230 free(zSql);
1231 if( rc ){
1232 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
1233 sqlite3_finalize(pStmt);
1234 return 1;
1235 }
1236 in = fopen(zFile, "rb");
1237 if( in==0 ){
1238 fprintf(stderr, "cannot open file: %s\n", zFile);
1239 sqlite3_finalize(pStmt);
1240 return 0;
1241 }
1242 azCol = malloc( sizeof(azCol[0])*(nCol+1) );
1243 if( azCol==0 ){
1244 fclose(in);
1245 return 0;
1246 }
1247 sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
1248 zCommit = "COMMIT";
1249 while( (zLine = local_getline(0, in))!=0 ){
1250 char *z;
1251 i = 0;
1252 lineno++;
1253 azCol[0] = zLine;
1254 for(i=0, z=zLine; *z && *z!='\n' && *z!='\r'; z++){
1255 if( *z==p->separator[0] && strncmp(z, p->separator, nSep)==0 ){
1256 *z = 0;
1257 i++;
1258 if( i<nCol ){
1259 azCol[i] = &z[nSep];
1260 z += nSep-1;
1261 }
1262 }
1263 }
1264 *z = 0;
1265 if( i+1!=nCol ){
1266 fprintf(stderr,"%s line %d: expected %d columns of data but found %d\n",
1267 zFile, lineno, nCol, i+1);
1268 zCommit = "ROLLBACK";
1269 break;
1270 }
1271 for(i=0; i<nCol; i++){
1272 sqlite3_bind_text(pStmt, i+1, azCol[i], -1, SQLITE_STATIC);
1273 }
1274 sqlite3_step(pStmt);
1275 rc = sqlite3_reset(pStmt);
1276 free(zLine);
1277 if( rc!=SQLITE_OK ){
1278 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
1279 zCommit = "ROLLBACK";
1280 rc = 1;
1281 break;
1282 }
1283 }
1284 free(azCol);
1285 fclose(in);
1286 sqlite3_finalize(pStmt);
1287 sqlite3_exec(p->db, zCommit, 0, 0, 0);
1288 }else
1289
1290 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg>1 ){
1291 struct callback_data data;
1292 char *zErrMsg = 0;
1293 open_db(p);
1294 memcpy(&data, p, sizeof(data));
1295 data.showHeader = 0;
1296 data.mode = MODE_List;
1297 zShellStatic = azArg[1];
1298 sqlite3_exec(p->db,
1299 "SELECT name FROM sqlite_master "
1300 "WHERE type='index' AND tbl_name LIKE shellstatic() "
1301 "UNION ALL "
1302 "SELECT name FROM sqlite_temp_master "
1303 "WHERE type='index' AND tbl_name LIKE shellstatic() "
1304 "ORDER BY 1",
1305 callback, &data, &zErrMsg
1306 );
1307 zShellStatic = 0;
1308 if( zErrMsg ){
1309 fprintf(stderr,"Error: %s\n", zErrMsg);
1310 sqlite3_free(zErrMsg);
1311 }
1312 }else
1313
1314#ifdef SQLITE_ENABLE_IOTRACE
1315 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
1316 extern void (*sqlite3IoTrace)(const char*, ...);
1317 if( iotrace && iotrace!=stdout ) fclose(iotrace);
1318 iotrace = 0;
1319 if( nArg<2 ){
1320 sqlite3IoTrace = 0;
1321 }else if( strcmp(azArg[1], "-")==0 ){
1322 sqlite3IoTrace = iotracePrintf;
1323 iotrace = stdout;
1324 }else{
1325 iotrace = fopen(azArg[1], "w");
1326 if( iotrace==0 ){
1327 fprintf(stderr, "cannot open \"%s\"\n", azArg[1]);
1328 sqlite3IoTrace = 0;
1329 }else{
1330 sqlite3IoTrace = iotracePrintf;
1331 }
1332 }
1333 }else
1334#endif
1335
1336#ifndef SQLITE_OMIT_LOAD_EXTENSION
1337 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){
1338 const char *zFile, *zProc;
1339 char *zErrMsg = 0;
1340 int rc;
1341 zFile = azArg[1];
1342 zProc = nArg>=3 ? azArg[2] : 0;
1343 open_db(p);
1344 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
1345 if( rc!=SQLITE_OK ){
1346 fprintf(stderr, "%s\n", zErrMsg);
1347 sqlite3_free(zErrMsg);
1348 rc = 1;
1349 }
1350 }else
1351#endif
1352
1353 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg>=2 ){
1354 int n2 = strlen(azArg[1]);
1355 if( strncmp(azArg[1],"line",n2)==0
1356 ||
1357 strncmp(azArg[1],"lines",n2)==0 ){
1358 p->mode = MODE_Line;
1359 }else if( strncmp(azArg[1],"column",n2)==0
1360 ||
1361 strncmp(azArg[1],"columns",n2)==0 ){
1362 p->mode = MODE_Column;
1363 }else if( strncmp(azArg[1],"list",n2)==0 ){
1364 p->mode = MODE_List;
1365 }else if( strncmp(azArg[1],"html",n2)==0 ){
1366 p->mode = MODE_Html;
1367 }else if( strncmp(azArg[1],"tcl",n2)==0 ){
1368 p->mode = MODE_Tcl;
1369 }else if( strncmp(azArg[1],"csv",n2)==0 ){
1370 p->mode = MODE_Csv;
1371 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
1372 }else if( strncmp(azArg[1],"tabs",n2)==0 ){
1373 p->mode = MODE_List;
1374 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
1375 }else if( strncmp(azArg[1],"insert",n2)==0 ){
1376 p->mode = MODE_Insert;
1377 if( nArg>=3 ){
1378 set_table_name(p, azArg[2]);
1379 }else{
1380 set_table_name(p, "table");
1381 }
1382 }else {
1383 fprintf(stderr,"mode should be one of: "
1384 "column csv html insert line list tabs tcl\n");
1385 }
1386 }else
1387
1388 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
1389 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
1390 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
1391 }else
1392
1393 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
1394 if( p->out!=stdout ){
1395 fclose(p->out);
1396 }
1397 if( strcmp(azArg[1],"stdout")==0 ){
1398 p->out = stdout;
1399 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "stdout");
1400 }else{
1401 p->out = fopen(azArg[1], "wb");
1402 if( p->out==0 ){
1403 fprintf(stderr,"can't write to \"%s\"\n", azArg[1]);
1404 p->out = stdout;
1405 } else {
1406 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
1407 }
1408 }
1409 }else
1410
1411 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
1412 if( nArg >= 2) {
1413 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
1414 }
1415 if( nArg >= 3) {
1416 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
1417 }
1418 }else
1419
1420 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
1421 rc = 2;
1422 }else
1423
1424 if( c=='r' && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
1425 FILE *alt = fopen(azArg[1], "rb");
1426 if( alt==0 ){
1427 fprintf(stderr,"can't open \"%s\"\n", azArg[1]);
1428 }else{
1429 process_input(p, alt);
1430 fclose(alt);
1431 }
1432 }else
1433
1434 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
1435 struct callback_data data;
1436 char *zErrMsg = 0;
1437 open_db(p);
1438 memcpy(&data, p, sizeof(data));
1439 data.showHeader = 0;
1440 data.mode = MODE_Semi;
1441 if( nArg>1 ){
1442 int i;
1443 for(i=0; azArg[1][i]; i++) azArg[1][i] = tolower(azArg[1][i]);
1444 if( strcmp(azArg[1],"sqlite_master")==0 ){
1445 char *new_argv[2], *new_colv[2];
1446 new_argv[0] = "CREATE TABLE sqlite_master (\n"
1447 " type text,\n"
1448 " name text,\n"
1449 " tbl_name text,\n"
1450 " rootpage integer,\n"
1451 " sql text\n"
1452 ")";
1453 new_argv[1] = 0;
1454 new_colv[0] = "sql";
1455 new_colv[1] = 0;
1456 callback(&data, 1, new_argv, new_colv);
1457 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
1458 char *new_argv[2], *new_colv[2];
1459 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
1460 " type text,\n"
1461 " name text,\n"
1462 " tbl_name text,\n"
1463 " rootpage integer,\n"
1464 " sql text\n"
1465 ")";
1466 new_argv[1] = 0;
1467 new_colv[0] = "sql";
1468 new_colv[1] = 0;
1469 callback(&data, 1, new_argv, new_colv);
1470 }else{
1471 zShellStatic = azArg[1];
1472 sqlite3_exec(p->db,
1473 "SELECT sql FROM "
1474 " (SELECT * FROM sqlite_master UNION ALL"
1475 " SELECT * FROM sqlite_temp_master) "
1476 "WHERE tbl_name LIKE shellstatic() AND type!='meta' AND sql NOTNULL "
1477 "ORDER BY substr(type,2,1), name",
1478 callback, &data, &zErrMsg);
1479 zShellStatic = 0;
1480 }
1481 }else{
1482 sqlite3_exec(p->db,
1483 "SELECT sql FROM "
1484 " (SELECT * FROM sqlite_master UNION ALL"
1485 " SELECT * FROM sqlite_temp_master) "
1486 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
1487 "ORDER BY substr(type,2,1), name",
1488 callback, &data, &zErrMsg
1489 );
1490 }
1491 if( zErrMsg ){
1492 fprintf(stderr,"Error: %s\n", zErrMsg);
1493 sqlite3_free(zErrMsg);
1494 }
1495 }else
1496
1497 if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
1498 sqlite3_snprintf(sizeof(p->separator), p->separator,
1499 "%.*s", (int)sizeof(p->separator)-1, azArg[1]);
1500 }else
1501
1502 if( c=='s' && strncmp(azArg[0], "show", n)==0){
1503 int i;
1504 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
1505 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
1506 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
1507 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
1508 fprintf(p->out,"%9.9s: ", "nullvalue");
1509 output_c_string(p->out, p->nullvalue);
1510 fprintf(p->out, "\n");
1511 fprintf(p->out,"%9.9s: %s\n","output",
1512 strlen(p->outfile) ? p->outfile : "stdout");
1513 fprintf(p->out,"%9.9s: ", "separator");
1514 output_c_string(p->out, p->separator);
1515 fprintf(p->out, "\n");
1516 fprintf(p->out,"%9.9s: ","width");
1517 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
1518 fprintf(p->out,"%d ",p->colWidth[i]);
1519 }
1520 fprintf(p->out,"\n");
1521 }else
1522
1523 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
1524 char **azResult;
1525 int nRow, rc;
1526 char *zErrMsg;
1527 open_db(p);
1528 if( nArg==1 ){
1529 rc = sqlite3_get_table(p->db,
1530 "SELECT name FROM sqlite_master "
1531 "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'"
1532 "UNION ALL "
1533 "SELECT name FROM sqlite_temp_master "
1534 "WHERE type IN ('table','view') "
1535 "ORDER BY 1",
1536 &azResult, &nRow, 0, &zErrMsg
1537 );
1538 }else{
1539 zShellStatic = azArg[1];
1540 rc = sqlite3_get_table(p->db,
1541 "SELECT name FROM sqlite_master "
1542 "WHERE type IN ('table','view') AND name LIKE '%'||shellstatic()||'%' "
1543 "UNION ALL "
1544 "SELECT name FROM sqlite_temp_master "
1545 "WHERE type IN ('table','view') AND name LIKE '%'||shellstatic()||'%' "
1546 "ORDER BY 1",
1547 &azResult, &nRow, 0, &zErrMsg
1548 );
1549 zShellStatic = 0;
1550 }
1551 if( zErrMsg ){
1552 fprintf(stderr,"Error: %s\n", zErrMsg);
1553 sqlite3_free(zErrMsg);
1554 }
1555 if( rc==SQLITE_OK ){
1556 int len, maxlen = 0;
1557 int i, j;
1558 int nPrintCol, nPrintRow;
1559 for(i=1; i<=nRow; i++){
1560 if( azResult[i]==0 ) continue;
1561 len = strlen(azResult[i]);
1562 if( len>maxlen ) maxlen = len;
1563 }
1564 nPrintCol = 80/(maxlen+2);
1565 if( nPrintCol<1 ) nPrintCol = 1;
1566 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
1567 for(i=0; i<nPrintRow; i++){
1568 for(j=i+1; j<=nRow; j+=nPrintRow){
1569 char *zSp = j<=nPrintRow ? "" : " ";
1570 printf("%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
1571 }
1572 printf("\n");
1573 }
1574 }else{
1575 rc = 1;
1576 }
1577 sqlite3_free_table(azResult);
1578 }else
1579
1580 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg>=2 ){
1581 open_db(p);
1582 sqlite3_busy_timeout(p->db, atoi(azArg[1]));
1583 }else
1584
1585#if HAS_TIMER
1586 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 && nArg>1 ){
1587 enableTimer = booleanValue(azArg[1]);
1588 }else
1589#endif
1590
1591 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
1592 int j;
1593 assert( nArg<=ArraySize(azArg) );
1594 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
1595 p->colWidth[j-1] = atoi(azArg[j]);
1596 }
1597 }else
1598
1599
1600 {
1601 fprintf(stderr, "unknown command or invalid arguments: "
1602 " \"%s\". Enter \".help\" for help\n", azArg[0]);
1603 }
1604
1605 return rc;
1606}
1607
1608/*
1609** Return TRUE if a semicolon occurs anywhere in the first N characters
1610** of string z[].
1611*/
1612static int _contains_semicolon(const char *z, int N){
1613 int i;
1614 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
1615 return 0;
1616}
1617
1618/*
1619** Test to see if a line consists entirely of whitespace.
1620*/
1621static int _all_whitespace(const char *z){
1622 for(; *z; z++){
1623 if( isspace(*(unsigned char*)z) ) continue;
1624 if( *z=='/' && z[1]=='*' ){
1625 z += 2;
1626 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
1627 if( *z==0 ) return 0;
1628 z++;
1629 continue;
1630 }
1631 if( *z=='-' && z[1]=='-' ){
1632 z += 2;
1633 while( *z && *z!='\n' ){ z++; }
1634 if( *z==0 ) return 1;
1635 continue;
1636 }
1637 return 0;
1638 }
1639 return 1;
1640}
1641
1642/*
1643** Return TRUE if the line typed in is an SQL command terminator other
1644** than a semi-colon. The SQL Server style "go" command is understood
1645** as is the Oracle "/".
1646*/
1647static int _is_command_terminator(const char *zLine){
1648 while( isspace(*(unsigned char*)zLine) ){ zLine++; };
1649 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ) return 1; /* Oracle */
1650 if( tolower(zLine[0])=='g' && tolower(zLine[1])=='o'
1651 && _all_whitespace(&zLine[2]) ){
1652 return 1; /* SQL Server */
1653 }
1654 return 0;
1655}
1656
1657/*
1658** Read input from *in and process it. If *in==0 then input
1659** is interactive - the user is typing it it. Otherwise, input
1660** is coming from a file or device. A prompt is issued and history
1661** is saved only if input is interactive. An interrupt signal will
1662** cause this routine to exit immediately, unless input is interactive.
1663**
1664** Return the number of errors.
1665*/
1666static int process_input(struct callback_data *p, FILE *in){
1667 char *zLine = 0;
1668 char *zSql = 0;
1669 int nSql = 0;
1670 int nSqlPrior = 0;
1671 char *zErrMsg;
1672 int rc;
1673 int errCnt = 0;
1674 int lineno = 0;
1675 int startline = 0;
1676
1677 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
1678 fflush(p->out);
1679 free(zLine);
1680 zLine = one_input_line(zSql, in);
1681 if( zLine==0 ){
1682 break; /* We have reached EOF */
1683 }
1684 if( seenInterrupt ){
1685 if( in!=0 ) break;
1686 seenInterrupt = 0;
1687 }
1688 lineno++;
1689 if( p->echoOn ) printf("%s\n", zLine);
1690 if( (zSql==0 || zSql[0]==0) && _all_whitespace(zLine) ) continue;
1691 if( zLine && zLine[0]=='.' && nSql==0 ){
1692 rc = do_meta_command(zLine, p);
1693 if( rc==2 ){
1694 break;
1695 }else if( rc ){
1696 errCnt++;
1697 }
1698 continue;
1699 }
1700 if( _is_command_terminator(zLine) ){
1701 memcpy(zLine,";",2);
1702 }
1703 nSqlPrior = nSql;
1704 if( zSql==0 ){
1705 int i;
1706 for(i=0; zLine[i] && isspace((unsigned char)zLine[i]); i++){}
1707 if( zLine[i]!=0 ){
1708 nSql = strlen(zLine);
1709 zSql = malloc( nSql+1 );
1710 if( zSql==0 ){
1711 fprintf(stderr, "out of memory\n");
1712 exit(1);
1713 }
1714 memcpy(zSql, zLine, nSql+1);
1715 startline = lineno;
1716 }
1717 }else{
1718 int len = strlen(zLine);
1719 zSql = realloc( zSql, nSql + len + 2 );
1720 if( zSql==0 ){
1721 fprintf(stderr,"%s: out of memory!\n", Argv0);
1722 exit(1);
1723 }
1724 zSql[nSql++] = '\n';
1725 memcpy(&zSql[nSql], zLine, len+1);
1726 nSql += len;
1727 }
1728 if( zSql && _contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
1729 && sqlite3_complete(zSql) ){
1730 p->cnt = 0;
1731 open_db(p);
1732 BEGIN_TIMER;
1733 rc = sqlite3_exec(p->db, zSql, callback, p, &zErrMsg);
1734 END_TIMER;
1735 if( rc || zErrMsg ){
1736 char zPrefix[100];
1737 if( in!=0 || !stdin_is_interactive ){
1738 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
1739 "SQL error near line %d:", startline);
1740 }else{
1741 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "SQL error:");
1742 }
1743 if( zErrMsg!=0 ){
1744 printf("%s %s\n", zPrefix, zErrMsg);
1745 sqlite3_free(zErrMsg);
1746 zErrMsg = 0;
1747 }else{
1748 printf("%s %s\n", zPrefix, sqlite3_errmsg(p->db));
1749 }
1750 errCnt++;
1751 }
1752 free(zSql);
1753 zSql = 0;
1754 nSql = 0;
1755 }
1756 }
1757 if( zSql ){
1758 if( !_all_whitespace(zSql) ) printf("Incomplete SQL: %s\n", zSql);
1759 free(zSql);
1760 }
1761 free(zLine);
1762 return errCnt;
1763}
1764
1765/*
1766** Return a pathname which is the user's home directory. A
1767** 0 return indicates an error of some kind. Space to hold the
1768** resulting string is obtained from malloc(). The calling
1769** function should free the result.
1770*/
1771static char *find_home_dir(void){
1772 char *home_dir = NULL;
1773
1774#if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) && !defined(_WIN32_WCE)
1775 struct passwd *pwent;
1776 uid_t uid = getuid();
1777 if( (pwent=getpwuid(uid)) != NULL) {
1778 home_dir = pwent->pw_dir;
1779 }
1780#endif
1781
1782#if defined(_WIN32_WCE)
1783 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
1784 */
1785 home_dir = strdup("/");
1786#else
1787
1788#if defined(_WIN32) || defined(WIN32) || defined(__OS2__)
1789 if (!home_dir) {
1790 home_dir = getenv("USERPROFILE");
1791 }
1792#endif
1793
1794 if (!home_dir) {
1795 home_dir = getenv("HOME");
1796 }
1797
1798#if defined(_WIN32) || defined(WIN32) || defined(__OS2__)
1799 if (!home_dir) {
1800 char *zDrive, *zPath;
1801 int n;
1802 zDrive = getenv("HOMEDRIVE");
1803 zPath = getenv("HOMEPATH");
1804 if( zDrive && zPath ){
1805 n = strlen(zDrive) + strlen(zPath) + 1;
1806 home_dir = malloc( n );
1807 if( home_dir==0 ) return 0;
1808 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
1809 return home_dir;
1810 }
1811 home_dir = "c:\\";
1812 }
1813#endif
1814
1815#endif /* !_WIN32_WCE */
1816
1817 if( home_dir ){
1818 int n = strlen(home_dir) + 1;
1819 char *z = malloc( n );
1820 if( z ) memcpy(z, home_dir, n);
1821 home_dir = z;
1822 }
1823
1824 return home_dir;
1825}
1826
1827/*
1828** Read input from the file given by sqliterc_override. Or if that
1829** parameter is NULL, take input from ~/.sqliterc
1830*/
1831static void process_sqliterc(
1832 struct callback_data *p, /* Configuration data */
1833 const char *sqliterc_override /* Name of config file. NULL to use default */
1834){
1835 char *home_dir = NULL;
1836 const char *sqliterc = sqliterc_override;
1837 char *zBuf = 0;
1838 FILE *in = NULL;
1839 int nBuf;
1840
1841 if (sqliterc == NULL) {
1842 home_dir = find_home_dir();
1843 if( home_dir==0 ){
1844 fprintf(stderr,"%s: cannot locate your home directory!\n", Argv0);
1845 return;
1846 }
1847 nBuf = strlen(home_dir) + 16;
1848 zBuf = malloc( nBuf );
1849 if( zBuf==0 ){
1850 fprintf(stderr,"%s: out of memory!\n", Argv0);
1851 exit(1);
1852 }
1853 sqlite3_snprintf(nBuf, zBuf,"%s/.sqliterc",home_dir);
1854 free(home_dir);
1855 sqliterc = (const char*)zBuf;
1856 }
1857 in = fopen(sqliterc,"rb");
1858 if( in ){
1859 if( stdin_is_interactive ){
1860 printf("-- Loading resources from %s\n",sqliterc);
1861 }
1862 process_input(p,in);
1863 fclose(in);
1864 }
1865 free(zBuf);
1866 return;
1867}
1868
1869/*
1870** Show available command line options
1871*/
1872static const char zOptions[] =
1873 " -init filename read/process named file\n"
1874 " -echo print commands before execution\n"
1875 " -[no]header turn headers on or off\n"
1876 " -bail stop after hitting an error\n"
1877 " -interactive force interactive I/O\n"
1878 " -batch force batch I/O\n"
1879 " -column set output mode to 'column'\n"
1880 " -csv set output mode to 'csv'\n"
1881 " -html set output mode to HTML\n"
1882 " -line set output mode to 'line'\n"
1883 " -list set output mode to 'list'\n"
1884 " -separator 'x' set output field separator (|)\n"
1885 " -nullvalue 'text' set text string for NULL values\n"
1886 " -version show SQLite version\n"
1887;
1888static void usage(int showDetail){
1889 fprintf(stderr,
1890 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
1891 "FILENAME is the name of an SQLite database. A new database is created\n"
1892 "if the file does not previously exist.\n", Argv0);
1893 if( showDetail ){
1894 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
1895 }else{
1896 fprintf(stderr, "Use the -help option for additional information\n");
1897 }
1898 exit(1);
1899}
1900
1901/*
1902** Initialize the state information in data
1903*/
1904static void main_init(struct callback_data *data) {
1905 memset(data, 0, sizeof(*data));
1906 data->mode = MODE_List;
1907 memcpy(data->separator,"|", 2);
1908 data->showHeader = 0;
1909 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
1910 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
1911}
1912
1913int main(int argc, char **argv){
1914 char *zErrMsg = 0;
1915 struct callback_data data;
1916 const char *zInitFile = 0;
1917 char *zFirstCmd = 0;
1918 int i;
1919 int rc = 0;
1920
1921 Argv0 = argv[0];
1922 main_init(&data);
1923 stdin_is_interactive = isatty(0);
1924
1925 /* Make sure we have a valid signal handler early, before anything
1926 ** else is done.
1927 */
1928#ifdef SIGINT
1929 signal(SIGINT, interrupt_handler);
1930#endif
1931
1932 /* Do an initial pass through the command-line argument to locate
1933 ** the name of the database file, the name of the initialization file,
1934 ** and the first command to execute.
1935 */
1936 for(i=1; i<argc-1; i++){
1937 char *z;
1938 if( argv[i][0]!='-' ) break;
1939 z = argv[i];
1940 if( z[0]=='-' && z[1]=='-' ) z++;
1941 if( strcmp(argv[i],"-separator")==0 || strcmp(argv[i],"-nullvalue")==0 ){
1942 i++;
1943 }else if( strcmp(argv[i],"-init")==0 ){
1944 i++;
1945 zInitFile = argv[i];
1946 }
1947 }
1948 if( i<argc ){
1949#ifdef OS_OS2
1950 data.zDbFilename = (const char *)convertCpPathToUtf8( argv[i++] );
1951#else
1952 data.zDbFilename = argv[i++];
1953#endif
1954 }else{
1955#ifndef SQLITE_OMIT_MEMORYDB
1956 data.zDbFilename = ":memory:";
1957#else
1958 data.zDbFilename = 0;
1959#endif
1960 }
1961 if( i<argc ){
1962 zFirstCmd = argv[i++];
1963 }
1964 data.out = stdout;
1965
1966#ifdef SQLITE_OMIT_MEMORYDB
1967 if( data.zDbFilename==0 ){
1968 fprintf(stderr,"%s: no database filename specified\n", argv[0]);
1969 exit(1);
1970 }
1971#endif
1972
1973 /* Go ahead and open the database file if it already exists. If the
1974 ** file does not exist, delay opening it. This prevents empty database
1975 ** files from being created if a user mistypes the database name argument
1976 ** to the sqlite command-line tool.
1977 */
1978 if( access(data.zDbFilename, 0)==0 ){
1979 open_db(&data);
1980 }
1981
1982 /* Process the initialization file if there is one. If no -init option
1983 ** is given on the command line, look for a file named ~/.sqliterc and
1984 ** try to process it.
1985 */
1986 process_sqliterc(&data,zInitFile);
1987
1988 /* Make a second pass through the command-line argument and set
1989 ** options. This second pass is delayed until after the initialization
1990 ** file is processed so that the command-line arguments will override
1991 ** settings in the initialization file.
1992 */
1993 for(i=1; i<argc && argv[i][0]=='-'; i++){
1994 char *z = argv[i];
1995 if( z[1]=='-' ){ z++; }
1996 if( strcmp(z,"-init")==0 ){
1997 i++;
1998 }else if( strcmp(z,"-html")==0 ){
1999 data.mode = MODE_Html;
2000 }else if( strcmp(z,"-list")==0 ){
2001 data.mode = MODE_List;
2002 }else if( strcmp(z,"-line")==0 ){
2003 data.mode = MODE_Line;
2004 }else if( strcmp(z,"-column")==0 ){
2005 data.mode = MODE_Column;
2006 }else if( strcmp(z,"-csv")==0 ){
2007 data.mode = MODE_Csv;
2008 memcpy(data.separator,",",2);
2009 }else if( strcmp(z,"-separator")==0 ){
2010 i++;
2011 sqlite3_snprintf(sizeof(data.separator), data.separator,
2012 "%.*s",(int)sizeof(data.separator)-1,argv[i]);
2013 }else if( strcmp(z,"-nullvalue")==0 ){
2014 i++;
2015 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
2016 "%.*s",(int)sizeof(data.nullvalue)-1,argv[i]);
2017 }else if( strcmp(z,"-header")==0 ){
2018 data.showHeader = 1;
2019 }else if( strcmp(z,"-noheader")==0 ){
2020 data.showHeader = 0;
2021 }else if( strcmp(z,"-echo")==0 ){
2022 data.echoOn = 1;
2023 }else if( strcmp(z,"-bail")==0 ){
2024 bail_on_error = 1;
2025 }else if( strcmp(z,"-version")==0 ){
2026 printf("%s\n", sqlite3_libversion());
2027 return 0;
2028 }else if( strcmp(z,"-interactive")==0 ){
2029 stdin_is_interactive = 1;
2030 }else if( strcmp(z,"-batch")==0 ){
2031 stdin_is_interactive = 0;
2032 }else if( strcmp(z,"-help")==0 || strcmp(z, "--help")==0 ){
2033 usage(1);
2034 }else{
2035 fprintf(stderr,"%s: unknown option: %s\n", Argv0, z);
2036 fprintf(stderr,"Use -help for a list of options.\n");
2037 return 1;
2038 }
2039 }
2040
2041 if( zFirstCmd ){
2042 /* Run just the command that follows the database name
2043 */
2044 if( zFirstCmd[0]=='.' ){
2045 do_meta_command(zFirstCmd, &data);
2046 exit(0);
2047 }else{
2048 int rc;
2049 open_db(&data);
2050 rc = sqlite3_exec(data.db, zFirstCmd, callback, &data, &zErrMsg);
2051 if( rc!=0 && zErrMsg!=0 ){
2052 fprintf(stderr,"SQL error: %s\n", zErrMsg);
2053 exit(1);
2054 }
2055 }
2056 }else{
2057 /* Run commands received from standard input
2058 */
2059 if( stdin_is_interactive ){
2060 char *zHome;
2061 char *zHistory = 0;
2062 int nHistory;
2063 printf(
2064 "SQLite version %s\n"
2065 "Enter \".help\" for instructions\n",
2066 sqlite3_libversion()
2067 );
2068 zHome = find_home_dir();
2069 if( zHome && (zHistory = malloc(nHistory = strlen(zHome)+20))!=0 ){
2070 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
2071 }
2072#if defined(HAVE_READLINE) && HAVE_READLINE==1
2073 if( zHistory ) read_history(zHistory);
2074#endif
2075 rc = process_input(&data, 0);
2076 if( zHistory ){
2077 stifle_history(100);
2078 write_history(zHistory);
2079 free(zHistory);
2080 }
2081 free(zHome);
2082 }else{
2083 rc = process_input(&data, stdin);
2084 }
2085 }
2086 set_table_name(&data, 0);
2087 if( db ){
2088 if( sqlite3_close(db)!=SQLITE_OK ){
2089 fprintf(stderr,"error closing database: %s\n", sqlite3_errmsg(db));
2090 }
2091 }
2092 return rc;
2093}
Note: See TracBrowser for help on using the repository browser.