4
** The author disclaims copyright to this source code. In place of
5
** a legal notice, here is a blessing:
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.
11
*************************************************************************
12
** This file contains code to implement the "sqlite" command line
13
** utility for accessing SQLite databases.
15
** $Id: shell.c 326789 2004-07-07 21:25:56Z pahlibar $
23
#if !defined(_WIN32) && !defined(WIN32) && !defined(__MACOS__)
27
# include <sys/types.h>
39
#if defined(HAVE_READLINE) && HAVE_READLINE==1
40
# include <readline/readline.h>
41
# include <readline/history.h>
43
# define readline(p) local_getline(p,stdin)
44
# define add_history(X)
45
# define read_history(X)
46
# define write_history(X)
47
# define stifle_history(X)
50
/* Make sure isatty() has a prototype.
55
** The following is the open SQLite database. We make a pointer
56
** to this database a static variable so that it can be accessed
57
** by the SIGINT handler to interrupt database processing.
59
static sqlite *db = 0;
62
** True if an interrupt (Control-C) has been received.
64
static int seenInterrupt = 0;
67
** This is the name of our program. It is set in main(), used
68
** in a number of other places, mostly for error messages.
73
** Prompt strings. Initialized in main. Settable with
74
** .prompt main continue
76
static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
77
static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
81
** Determines if a string is a number of not.
83
extern int sqliteIsNumber(const char*);
86
** This routine reads a line of text from standard input, stores
87
** the text in memory obtained from malloc() and returns a pointer
88
** to the text. NULL is returned at end of file, or if malloc()
91
** The interface is like "readline" but no command-line editing
94
static char *local_getline(char *zPrompt, FILE *in){
100
if( zPrompt && *zPrompt ){
101
printf("%s",zPrompt);
105
zLine = malloc( nLine );
106
if( zLine==0 ) return 0;
111
nLine = nLine*2 + 100;
112
zLine = realloc(zLine, nLine);
113
if( zLine==0 ) return 0;
115
if( fgets(&zLine[n], nLine - n, in)==0 ){
124
while( zLine[n] ){ n++; }
125
if( n>0 && zLine[n-1]=='\n' ){
131
zLine = realloc( zLine, n+1 );
136
** Retrieve a single line of input text. "isatty" is true if text
137
** is coming from a terminal. In that case, we issue a prompt and
138
** attempt to use "readline" for command-line editing. If "isatty"
139
** is false, use "local_getline" instead of "readline" and issue no prompt.
141
** zPrior is a string of prior text retrieved. If not the empty
142
** string, then issue a continuation prompt.
144
static char *one_input_line(const char *zPrior, FILE *in){
148
return local_getline(0, in);
150
if( zPrior && zPrior[0] ){
151
zPrompt = continuePrompt;
153
zPrompt = mainPrompt;
155
zResult = readline(zPrompt);
156
if( zResult ) add_history(zResult);
160
struct previous_mode_data {
161
int valid; /* Is there legit data in here? */
167
** An pointer to an instance of this structure is passed from
168
** the main program to the callback. This is used to communicate
169
** state and mode information.
171
struct callback_data {
172
sqlite *db; /* The database */
173
int echoOn; /* True to echo input commands */
174
int cnt; /* Number of records displayed so far */
175
FILE *out; /* Write results here */
176
int mode; /* An output mode setting */
177
int showHeader; /* True to show column names in List or Column mode */
178
char *zDestTable; /* Name of destination table when MODE_Insert */
179
char separator[20]; /* Separator character for MODE_List */
180
int colWidth[100]; /* Requested width of each column when in column mode*/
181
int actualWidth[100]; /* Actual width of each column */
182
char nullvalue[20]; /* The text to print when a NULL comes back from
184
struct previous_mode_data explainPrev;
185
/* Holds the mode information just before
187
char outfile[FILENAME_MAX]; /* Filename for *out */
188
const char *zDbFilename; /* name of the database file */
189
char *zKey; /* Encryption key */
193
** These are the allowed modes.
195
#define MODE_Line 0 /* One column per line. Blank line between records */
196
#define MODE_Column 1 /* One record per line in neat columns */
197
#define MODE_List 2 /* One record per line with a separator */
198
#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
199
#define MODE_Html 4 /* Generate an XHTML table */
200
#define MODE_Insert 5 /* Generate SQL "insert" statements */
201
#define MODE_NUM_OF 6 /* The number of modes (not a mode itself) */
203
char *modeDescr[MODE_NUM_OF] = {
213
** Number of elements in an array
215
#define ArraySize(X) (sizeof(X)/sizeof(X[0]))
218
** Output the given string as a quoted string using SQL quoting conventions.
220
static void output_quoted_string(FILE *out, const char *z){
224
if( z[i]=='\'' ) nSingle++;
227
fprintf(out,"'%s'",z);
231
for(i=0; z[i] && z[i]!='\''; i++){}
235
}else if( z[i]=='\'' ){
236
fprintf(out,"%.*s''",i,z);
248
** Output the given string with characters that are special to
251
static void output_html_string(FILE *out, const char *z){
254
for(i=0; z[i] && z[i]!='<' && z[i]!='&'; i++){}
256
fprintf(out,"%.*s",i,z);
260
}else if( z[i]=='&' ){
261
fprintf(out,"&");
270
** This routine runs when the user presses Ctrl-C
272
static void interrupt_handler(int NotUsed){
274
if( db ) sqlite_interrupt(db);
278
** This is the callback routine that the SQLite library
279
** invokes for each row of a query result.
281
static int callback(void *pArg, int nArg, char **azArg, char **azCol){
283
struct callback_data *p = (struct callback_data*)pArg;
287
if( azArg==0 ) break;
288
for(i=0; i<nArg; i++){
289
int len = strlen(azCol[i]);
292
if( p->cnt++>0 ) fprintf(p->out,"\n");
293
for(i=0; i<nArg; i++){
294
fprintf(p->out,"%*s = %s\n", w, azCol[i],
295
azArg[i] ? azArg[i] : p->nullvalue);
301
for(i=0; i<nArg; i++){
303
if( i<ArraySize(p->colWidth) ){
309
w = strlen(azCol[i] ? azCol[i] : "");
311
n = strlen(azArg && azArg[i] ? azArg[i] : p->nullvalue);
314
if( i<ArraySize(p->actualWidth) ){
315
p->actualWidth[i] = w;
318
fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
322
for(i=0; i<nArg; i++){
324
if( i<ArraySize(p->actualWidth) ){
325
w = p->actualWidth[i];
329
fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
330
"----------------------------------------------------------",
331
i==nArg-1 ? "\n": " ");
335
if( azArg==0 ) break;
336
for(i=0; i<nArg; i++){
338
if( i<ArraySize(p->actualWidth) ){
339
w = p->actualWidth[i];
343
fprintf(p->out,"%-*.*s%s",w,w,
344
azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
350
if( p->cnt++==0 && p->showHeader ){
351
for(i=0; i<nArg; i++){
352
fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
355
if( azArg==0 ) break;
356
for(i=0; i<nArg; i++){
358
if( z==0 ) z = p->nullvalue;
359
fprintf(p->out, "%s", z);
361
fprintf(p->out, "%s", p->separator);
362
}else if( p->mode==MODE_Semi ){
363
fprintf(p->out, ";\n");
365
fprintf(p->out, "\n");
371
if( p->cnt++==0 && p->showHeader ){
372
fprintf(p->out,"<TR>");
373
for(i=0; i<nArg; i++){
374
fprintf(p->out,"<TH>%s</TH>",azCol[i]);
376
fprintf(p->out,"</TR>\n");
378
if( azArg==0 ) break;
379
fprintf(p->out,"<TR>");
380
for(i=0; i<nArg; i++){
381
fprintf(p->out,"<TD>");
382
output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
383
fprintf(p->out,"</TD>\n");
385
fprintf(p->out,"</TR>\n");
389
if( azArg==0 ) break;
390
fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
391
for(i=0; i<nArg; i++){
392
char *zSep = i>0 ? ",": "";
394
fprintf(p->out,"%sNULL",zSep);
395
}else if( sqliteIsNumber(azArg[i]) ){
396
fprintf(p->out,"%s%s",zSep, azArg[i]);
398
if( zSep[0] ) fprintf(p->out,"%s",zSep);
399
output_quoted_string(p->out, azArg[i]);
402
fprintf(p->out,");\n");
410
** Set the destination table field of the callback_data structure to
411
** the name of the table given. Escape any quote characters in the
414
static void set_table_name(struct callback_data *p, const char *zName){
423
if( zName==0 ) return;
424
needQuote = !isalpha(*zName) && *zName!='_';
425
for(i=n=0; zName[i]; i++, n++){
426
if( !isalnum(zName[i]) && zName[i]!='_' ){
428
if( zName[i]=='\'' ) n++;
431
if( needQuote ) n += 2;
432
z = p->zDestTable = malloc( n+1 );
434
fprintf(stderr,"Out of memory!\n");
438
if( needQuote ) z[n++] = '\'';
439
for(i=0; zName[i]; i++){
441
if( zName[i]=='\'' ) z[n++] = '\'';
443
if( needQuote ) z[n++] = '\'';
448
** This is a different callback routine used for dumping the database.
449
** Each row received by this callback consists of a table name,
450
** the table type ("index" or "table") and SQL to create the table.
451
** This routine should print text sufficient to recreate the table.
453
static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
454
struct callback_data *p = (struct callback_data *)pArg;
455
if( nArg!=3 ) return 1;
456
fprintf(p->out, "%s;\n", azArg[2]);
457
if( strcmp(azArg[1],"table")==0 ){
458
struct callback_data d2;
460
d2.mode = MODE_Insert;
462
set_table_name(&d2, azArg[0]);
463
sqlite_exec_printf(p->db,
464
"SELECT * FROM '%q'",
465
callback, &d2, 0, azArg[0]
467
set_table_name(&d2, 0);
473
** Text of a help message
475
static char zHelp[] =
476
".databases List names and files of attached databases\n"
477
".dump ?TABLE? ... Dump the database in a text format\n"
478
".echo ON|OFF Turn command echo on or off\n"
479
".exit Exit this program\n"
480
".explain ON|OFF Turn output mode suitable for EXPLAIN on or off.\n"
481
".header(s) ON|OFF Turn display of headers on or off\n"
482
".help Show this message\n"
483
".indices TABLE Show names of all indices on TABLE\n"
484
".mode MODE Set mode to one of \"line(s)\", \"column(s)\", \n"
485
" \"insert\", \"list\", or \"html\"\n"
486
".mode insert TABLE Generate SQL insert statements for TABLE\n"
487
".nullvalue STRING Print STRING instead of nothing for NULL data\n"
488
".output FILENAME Send output to FILENAME\n"
489
".output stdout Send output to the screen\n"
490
".prompt MAIN CONTINUE Replace the standard prompts\n"
491
".quit Exit this program\n"
492
".read FILENAME Execute SQL in FILENAME\n"
493
#ifdef SQLITE_HAS_CODEC
494
".rekey OLD NEW NEW Change the encryption key\n"
496
".schema ?TABLE? Show the CREATE statements\n"
497
".separator STRING Change separator string for \"list\" mode\n"
498
".show Show the current values for various settings\n"
499
".tables ?PATTERN? List names of tables matching a pattern\n"
500
".timeout MS Try opening locked tables for MS milliseconds\n"
501
".width NUM NUM ... Set column widths for \"column\" mode\n"
504
/* Forward reference */
505
static void process_input(struct callback_data *p, FILE *in);
508
** Make sure the database is open. If it is not, then open it. If
509
** the database fails to open, print an error message and exit.
511
static void open_db(struct callback_data *p){
514
#ifdef SQLITE_HAS_CODEC
515
int n = p->zKey ? strlen(p->zKey) : 0;
516
db = p->db = sqlite_open_encrypted(p->zDbFilename, p->zKey, n, 0, &zErrMsg);
518
db = p->db = sqlite_open(p->zDbFilename, 0, &zErrMsg);
522
fprintf(stderr,"Unable to open database \"%s\": %s\n",
523
p->zDbFilename, zErrMsg);
525
fprintf(stderr,"Unable to open database %s\n", p->zDbFilename);
533
** If an input line begins with "." then invoke this routine to
534
** process that line.
536
** Return 1 to exit and 0 to continue.
538
static int do_meta_command(char *zLine, struct callback_data *p){
545
/* Parse the input line into tokens.
547
while( zLine[i] && nArg<ArraySize(azArg) ){
548
while( isspace(zLine[i]) ){ i++; }
549
if( zLine[i]==0 ) break;
550
if( zLine[i]=='\'' || zLine[i]=='"' ){
551
int delim = zLine[i++];
552
azArg[nArg++] = &zLine[i];
553
while( zLine[i] && zLine[i]!=delim ){ i++; }
554
if( zLine[i]==delim ){
558
azArg[nArg++] = &zLine[i];
559
while( zLine[i] && !isspace(zLine[i]) ){ i++; }
560
if( zLine[i] ) zLine[i++] = 0;
564
/* Process the input line.
566
if( nArg==0 ) return rc;
567
n = strlen(azArg[0]);
569
if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
570
struct callback_data data;
573
memcpy(&data, p, sizeof(data));
575
data.mode = MODE_Column;
576
data.colWidth[0] = 3;
577
data.colWidth[1] = 15;
578
data.colWidth[2] = 58;
579
sqlite_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
581
fprintf(stderr,"Error: %s\n", zErrMsg);
582
sqlite_freemem(zErrMsg);
586
if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
589
fprintf(p->out, "BEGIN TRANSACTION;\n");
592
"SELECT name, type, sql FROM sqlite_master "
593
"WHERE type!='meta' AND sql NOT NULL "
594
"ORDER BY substr(type,2,1), name",
595
dump_callback, p, &zErrMsg
599
for(i=1; i<nArg && zErrMsg==0; i++){
600
sqlite_exec_printf(p->db,
601
"SELECT name, type, sql FROM sqlite_master "
602
"WHERE tbl_name LIKE '%q' AND type!='meta' AND sql NOT NULL "
603
"ORDER BY substr(type,2,1), name",
604
dump_callback, p, &zErrMsg, azArg[i]
609
fprintf(stderr,"Error: %s\n", zErrMsg);
610
sqlite_freemem(zErrMsg);
612
fprintf(p->out, "COMMIT;\n");
616
if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 ){
619
int val = atoi(azArg[1]);
621
if( isupper(z[j]) ) z[j] = tolower(z[j]);
623
if( strcmp(z,"on")==0 ){
625
}else if( strcmp(z,"yes")==0 ){
631
if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
635
if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
637
char *z = nArg>=2 ? azArg[1] : "1";
640
if( isupper(z[j]) ) z[j] = tolower(z[j]);
642
if( strcmp(z,"on")==0 ){
644
}else if( strcmp(z,"yes")==0 ){
648
if(!p->explainPrev.valid) {
649
p->explainPrev.valid = 1;
650
p->explainPrev.mode = p->mode;
651
p->explainPrev.showHeader = p->showHeader;
652
memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
654
/* We could put this code under the !p->explainValid
655
** condition so that it does not execute if we are already in
656
** explain mode. However, always executing it allows us an easy
657
** was to reset to explain mode in case the user previously
658
** did an .explain followed by a .width, .mode or .header
661
p->mode = MODE_Column;
663
memset(p->colWidth,0,ArraySize(p->colWidth));
669
}else if (p->explainPrev.valid) {
670
p->explainPrev.valid = 0;
671
p->mode = p->explainPrev.mode;
672
p->showHeader = p->explainPrev.showHeader;
673
memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
677
if( c=='h' && (strncmp(azArg[0], "header", n)==0
679
strncmp(azArg[0], "headers", n)==0 )&& nArg>1 ){
682
int val = atoi(azArg[1]);
684
if( isupper(z[j]) ) z[j] = tolower(z[j]);
686
if( strcmp(z,"on")==0 ){
688
}else if( strcmp(z,"yes")==0 ){
694
if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
695
fprintf(stderr,zHelp);
698
if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg>1 ){
699
struct callback_data data;
702
memcpy(&data, p, sizeof(data));
704
data.mode = MODE_List;
705
sqlite_exec_printf(p->db,
706
"SELECT name FROM sqlite_master "
707
"WHERE type='index' AND tbl_name LIKE '%q' "
709
"SELECT name FROM sqlite_temp_master "
710
"WHERE type='index' AND tbl_name LIKE '%q' "
712
callback, &data, &zErrMsg, azArg[1], azArg[1]
715
fprintf(stderr,"Error: %s\n", zErrMsg);
716
sqlite_freemem(zErrMsg);
720
if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg>=2 ){
721
int n2 = strlen(azArg[1]);
722
if( strncmp(azArg[1],"line",n2)==0
724
strncmp(azArg[1],"lines",n2)==0 ){
726
}else if( strncmp(azArg[1],"column",n2)==0
728
strncmp(azArg[1],"columns",n2)==0 ){
729
p->mode = MODE_Column;
730
}else if( strncmp(azArg[1],"list",n2)==0 ){
732
}else if( strncmp(azArg[1],"html",n2)==0 ){
734
}else if( strncmp(azArg[1],"insert",n2)==0 ){
735
p->mode = MODE_Insert;
737
set_table_name(p, azArg[2]);
739
set_table_name(p, "table");
742
fprintf(stderr,"mode should be on of: column html insert line list\n");
746
if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
747
sprintf(p->nullvalue, "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
750
if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
751
if( p->out!=stdout ){
754
if( strcmp(azArg[1],"stdout")==0 ){
756
strcpy(p->outfile,"stdout");
758
p->out = fopen(azArg[1], "wb");
760
fprintf(stderr,"can't write to \"%s\"\n", azArg[1]);
763
strcpy(p->outfile,azArg[1]);
768
if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
770
strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
773
strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
777
if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
781
if( c=='r' && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
782
FILE *alt = fopen(azArg[1], "rb");
784
fprintf(stderr,"can't open \"%s\"\n", azArg[1]);
786
process_input(p, alt);
791
#ifdef SQLITE_HAS_CODEC
792
if( c=='r' && strncmp(azArg[0],"rekey", n)==0 && nArg==4 ){
793
char *zOld = p->zKey;
794
if( zOld==0 ) zOld = "";
795
if( strcmp(azArg[1],zOld) ){
796
fprintf(stderr,"old key is incorrect\n");
797
}else if( strcmp(azArg[2], azArg[3]) ){
798
fprintf(stderr,"2nd copy of new key does not match the 1st\n");
800
sqlite_freemem(p->zKey);
801
p->zKey = sqlite_mprintf("%s", azArg[2]);
802
sqlite_rekey(p->db, p->zKey, strlen(p->zKey));
807
if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
808
struct callback_data data;
811
memcpy(&data, p, sizeof(data));
813
data.mode = MODE_Semi;
815
extern int sqliteStrICmp(const char*,const char*);
816
if( sqliteStrICmp(azArg[1],"sqlite_master")==0 ){
817
char *new_argv[2], *new_colv[2];
818
new_argv[0] = "CREATE TABLE sqlite_master (\n"
822
" rootpage integer,\n"
828
callback(&data, 1, new_argv, new_colv);
829
}else if( sqliteStrICmp(azArg[1],"sqlite_temp_master")==0 ){
830
char *new_argv[2], *new_colv[2];
831
new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
835
" rootpage integer,\n"
841
callback(&data, 1, new_argv, new_colv);
843
sqlite_exec_printf(p->db,
845
" (SELECT * FROM sqlite_master UNION ALL"
846
" SELECT * FROM sqlite_temp_master) "
847
"WHERE tbl_name LIKE '%q' AND type!='meta' AND sql NOTNULL "
848
"ORDER BY substr(type,2,1), name",
849
callback, &data, &zErrMsg, azArg[1]);
854
" (SELECT * FROM sqlite_master UNION ALL"
855
" SELECT * FROM sqlite_temp_master) "
856
"WHERE type!='meta' AND sql NOTNULL "
857
"ORDER BY substr(type,2,1), name",
858
callback, &data, &zErrMsg
862
fprintf(stderr,"Error: %s\n", zErrMsg);
863
sqlite_freemem(zErrMsg);
867
if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
868
sprintf(p->separator, "%.*s", (int)ArraySize(p->separator)-1, azArg[1]);
871
if( c=='s' && strncmp(azArg[0], "show", n)==0){
873
fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
874
fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
875
fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
876
fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
877
fprintf(p->out,"%9.9s: %s\n","nullvalue", p->nullvalue);
878
fprintf(p->out,"%9.9s: %s\n","output",
879
strlen(p->outfile) ? p->outfile : "stdout");
880
fprintf(p->out,"%9.9s: %s\n","separator", p->separator);
881
fprintf(p->out,"%9.9s: ","width");
882
for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
883
fprintf(p->out,"%d ",p->colWidth[i]);
885
fprintf(p->out,"\n\n");
888
if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
894
rc = sqlite_get_table(p->db,
895
"SELECT name FROM sqlite_master "
896
"WHERE type IN ('table','view') "
898
"SELECT name FROM sqlite_temp_master "
899
"WHERE type IN ('table','view') "
901
&azResult, &nRow, 0, &zErrMsg
904
rc = sqlite_get_table_printf(p->db,
905
"SELECT name FROM sqlite_master "
906
"WHERE type IN ('table','view') AND name LIKE '%%%q%%' "
908
"SELECT name FROM sqlite_temp_master "
909
"WHERE type IN ('table','view') AND name LIKE '%%%q%%' "
911
&azResult, &nRow, 0, &zErrMsg, azArg[1], azArg[1]
915
fprintf(stderr,"Error: %s\n", zErrMsg);
916
sqlite_freemem(zErrMsg);
921
int nPrintCol, nPrintRow;
922
for(i=1; i<=nRow; i++){
923
if( azResult[i]==0 ) continue;
924
len = strlen(azResult[i]);
925
if( len>maxlen ) maxlen = len;
927
nPrintCol = 80/(maxlen+2);
928
if( nPrintCol<1 ) nPrintCol = 1;
929
nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
930
for(i=0; i<nPrintRow; i++){
931
for(j=i+1; j<=nRow; j+=nPrintRow){
932
char *zSp = j<=nPrintRow ? "" : " ";
933
printf("%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
938
sqlite_free_table(azResult);
941
if( c=='t' && n>1 && strncmp(azArg[0], "timeout", n)==0 && nArg>=2 ){
943
sqlite_busy_timeout(p->db, atoi(azArg[1]));
946
if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
948
for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
949
p->colWidth[j-1] = atoi(azArg[j]);
954
fprintf(stderr, "unknown command or invalid arguments: "
955
" \"%s\". Enter \".help\" for help\n", azArg[0]);
962
** Return TRUE if the last non-whitespace character in z[] is a semicolon.
963
** z[] is N characters long.
965
static int _ends_with_semicolon(const char *z, int N){
966
while( N>0 && isspace(z[N-1]) ){ N--; }
967
return N>0 && z[N-1]==';';
971
** Test to see if a line consists entirely of whitespace.
973
static int _all_whitespace(const char *z){
975
if( isspace(*z) ) continue;
976
if( *z=='/' && z[1]=='*' ){
978
while( *z && (*z!='*' || z[1]!='/') ){ z++; }
979
if( *z==0 ) return 0;
983
if( *z=='-' && z[1]=='-' ){
985
while( *z && *z!='\n' ){ z++; }
986
if( *z==0 ) return 1;
995
** Return TRUE if the line typed in is an SQL command terminator other
996
** than a semi-colon. The SQL Server style "go" command is understood
997
** as is the Oracle "/".
999
static int _is_command_terminator(const char *zLine){
1000
extern int sqliteStrNICmp(const char*,const char*,int);
1001
while( isspace(*zLine) ){ zLine++; };
1002
if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ) return 1; /* Oracle */
1003
if( sqliteStrNICmp(zLine,"go",2)==0 && _all_whitespace(&zLine[2]) ){
1004
return 1; /* SQL Server */
1010
** Read input from *in and process it. If *in==0 then input
1011
** is interactive - the user is typing it it. Otherwise, input
1012
** is coming from a file or device. A prompt is issued and history
1013
** is saved only if input is interactive. An interrupt signal will
1014
** cause this routine to exit immediately, unless input is interactive.
1016
static void process_input(struct callback_data *p, FILE *in){
1022
while( fflush(p->out), (zLine = one_input_line(zSql, in))!=0 ){
1023
if( seenInterrupt ){
1027
if( p->echoOn ) printf("%s\n", zLine);
1028
if( (zSql==0 || zSql[0]==0) && _all_whitespace(zLine) ) continue;
1029
if( zLine && zLine[0]=='.' && nSql==0 ){
1030
int rc = do_meta_command(zLine, p);
1035
if( _is_command_terminator(zLine) ){
1040
for(i=0; zLine[i] && isspace(zLine[i]); i++){}
1042
nSql = strlen(zLine);
1043
zSql = malloc( nSql+1 );
1044
strcpy(zSql, zLine);
1047
int len = strlen(zLine);
1048
zSql = realloc( zSql, nSql + len + 2 );
1050
fprintf(stderr,"%s: out of memory!\n", Argv0);
1053
strcpy(&zSql[nSql++], "\n");
1054
strcpy(&zSql[nSql], zLine);
1058
if( zSql && _ends_with_semicolon(zSql, nSql) && sqlite_complete(zSql) ){
1061
rc = sqlite_exec(p->db, zSql, callback, p, &zErrMsg);
1062
if( rc || zErrMsg ){
1063
if( in!=0 && !p->echoOn ) printf("%s\n",zSql);
1065
printf("SQL error: %s\n", zErrMsg);
1066
sqlite_freemem(zErrMsg);
1069
printf("SQL error: %s\n", sqlite_error_string(rc));
1078
if( !_all_whitespace(zSql) ) printf("Incomplete SQL: %s\n", zSql);
1084
** Return a pathname which is the user's home directory. A
1085
** 0 return indicates an error of some kind. Space to hold the
1086
** resulting string is obtained from malloc(). The calling
1087
** function should free the result.
1089
static char *find_home_dir(void){
1090
char *home_dir = NULL;
1092
#if !defined(_WIN32) && !defined(WIN32) && !defined(__MACOS__)
1093
struct passwd *pwent;
1094
uid_t uid = getuid();
1095
if( (pwent=getpwuid(uid)) != NULL) {
1096
home_dir = pwent->pw_dir;
1101
char home_path[_MAX_PATH+1];
1102
home_dir = getcwd(home_path, _MAX_PATH);
1106
home_dir = getenv("HOME");
1108
home_dir = getenv("HOMEPATH"); /* Windows? */
1112
#if defined(_WIN32) || defined(WIN32)
1119
char *z = malloc( strlen(home_dir)+1 );
1120
if( z ) strcpy(z, home_dir);
1128
** Read input from the file given by sqliterc_override. Or if that
1129
** parameter is NULL, take input from ~/.sqliterc
1131
static void process_sqliterc(
1132
struct callback_data *p, /* Configuration data */
1133
const char *sqliterc_override /* Name of config file. NULL to use default */
1135
char *home_dir = NULL;
1136
const char *sqliterc = sqliterc_override;
1140
if (sqliterc == NULL) {
1141
home_dir = find_home_dir();
1143
fprintf(stderr,"%s: cannot locate your home directory!\n", Argv0);
1146
zBuf = malloc(strlen(home_dir) + 15);
1148
fprintf(stderr,"%s: out of memory!\n", Argv0);
1151
sprintf(zBuf,"%s/.sqliterc",home_dir);
1153
sqliterc = (const char*)zBuf;
1155
in = fopen(sqliterc,"rb");
1157
if( isatty(fileno(stdout)) ){
1158
printf("Loading resources from %s\n",sqliterc);
1160
process_input(p,in);
1167
** Show available command line options
1169
static const char zOptions[] =
1170
" -init filename read/process named file\n"
1171
" -echo print commands before execution\n"
1172
" -[no]header turn headers on or off\n"
1173
" -column set output mode to 'column'\n"
1174
" -html set output mode to HTML\n"
1175
#ifdef SQLITE_HAS_CODEC
1176
" -key KEY encryption key\n"
1178
" -line set output mode to 'line'\n"
1179
" -list set output mode to 'list'\n"
1180
" -separator 'x' set output field separator (|)\n"
1181
" -nullvalue 'text' set text string for NULL values\n"
1182
" -version show SQLite version\n"
1183
" -help show this text, also show dot-commands\n"
1185
static void usage(int showDetail){
1186
fprintf(stderr, "Usage: %s [OPTIONS] FILENAME [SQL]\n", Argv0);
1188
fprintf(stderr, "Options are:\n%s", zOptions);
1190
fprintf(stderr, "Use the -help option for additional information\n");
1196
** Initialize the state information in data
1198
void main_init(struct callback_data *data) {
1199
memset(data, 0, sizeof(*data));
1200
data->mode = MODE_List;
1201
strcpy(data->separator,"|");
1202
data->showHeader = 0;
1203
strcpy(mainPrompt,"sqlite> ");
1204
strcpy(continuePrompt," ...> ");
1207
int main(int argc, char **argv){
1209
struct callback_data data;
1210
const char *zInitFile = 0;
1211
char *zFirstCmd = 0;
1213
extern int sqliteOsFileExists(const char*);
1216
argc = ccommand(&argv);
1222
/* Make sure we have a valid signal handler early, before anything
1226
signal(SIGINT, interrupt_handler);
1229
/* Do an initial pass through the command-line argument to locate
1230
** the name of the database file, the name of the initialization file,
1231
** and the first command to execute.
1233
for(i=1; i<argc-1; i++){
1234
if( argv[i][0]!='-' ) break;
1235
if( strcmp(argv[i],"-separator")==0 || strcmp(argv[i],"-nullvalue")==0 ){
1237
}else if( strcmp(argv[i],"-init")==0 ){
1239
zInitFile = argv[i];
1240
}else if( strcmp(argv[i],"-key")==0 ){
1242
data.zKey = sqlite_mprintf("%s",argv[i]);
1246
data.zDbFilename = argv[i++];
1248
data.zDbFilename = ":memory:";
1251
zFirstCmd = argv[i++];
1255
/* Go ahead and open the database file if it already exists. If the
1256
** file does not exist, delay opening it. This prevents empty database
1257
** files from being created if a user mistypes the database name argument
1258
** to the sqlite command-line tool.
1260
if( sqliteOsFileExists(data.zDbFilename) ){
1264
/* Process the initialization file if there is one. If no -init option
1265
** is given on the command line, look for a file named ~/.sqliterc and
1266
** try to process it.
1268
process_sqliterc(&data,zInitFile);
1270
/* Make a second pass through the command-line argument and set
1271
** options. This second pass is delayed until after the initialization
1272
** file is processed so that the command-line arguments will override
1273
** settings in the initialization file.
1275
for(i=1; i<argc && argv[i][0]=='-'; i++){
1277
if( strcmp(z,"-init")==0 || strcmp(z,"-key")==0 ){
1279
}else if( strcmp(z,"-html")==0 ){
1280
data.mode = MODE_Html;
1281
}else if( strcmp(z,"-list")==0 ){
1282
data.mode = MODE_List;
1283
}else if( strcmp(z,"-line")==0 ){
1284
data.mode = MODE_Line;
1285
}else if( strcmp(z,"-column")==0 ){
1286
data.mode = MODE_Column;
1287
}else if( strcmp(z,"-separator")==0 ){
1289
sprintf(data.separator,"%.*s",(int)sizeof(data.separator)-1,argv[i]);
1290
}else if( strcmp(z,"-nullvalue")==0 ){
1292
sprintf(data.nullvalue,"%.*s",(int)sizeof(data.nullvalue)-1,argv[i]);
1293
}else if( strcmp(z,"-header")==0 ){
1294
data.showHeader = 1;
1295
}else if( strcmp(z,"-noheader")==0 ){
1296
data.showHeader = 0;
1297
}else if( strcmp(z,"-echo")==0 ){
1299
}else if( strcmp(z,"-version")==0 ){
1300
printf("%s\n", sqlite_version);
1302
}else if( strcmp(z,"-help")==0 ){
1305
fprintf(stderr,"%s: unknown option: %s\n", Argv0, z);
1306
fprintf(stderr,"Use -help for a list of options.\n");
1312
/* Run just the command that follows the database name
1314
if( zFirstCmd[0]=='.' ){
1315
do_meta_command(zFirstCmd, &data);
1320
rc = sqlite_exec(data.db, zFirstCmd, callback, &data, &zErrMsg);
1321
if( rc!=0 && zErrMsg!=0 ){
1322
fprintf(stderr,"SQL error: %s\n", zErrMsg);
1327
/* Run commands received from standard input
1329
if( isatty(fileno(stdout)) && isatty(fileno(stdin)) ){
1333
"SQLite version %s\n"
1334
"Enter \".help\" for instructions\n",
1337
zHome = find_home_dir();
1338
if( zHome && (zHistory = malloc(strlen(zHome)+20))!=0 ){
1339
sprintf(zHistory,"%s/.sqlite_history", zHome);
1341
if( zHistory ) read_history(zHistory);
1342
process_input(&data, 0);
1344
stifle_history(100);
1345
write_history(zHistory);
1348
process_input(&data, stdin);
1351
set_table_name(&data, 0);
1352
if( db ) sqlite_close(db);