Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | :-) (CVS 98) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
f26d0cdf45221a8fc97253c2a1939e79 |
User & Date: | drh 2000-06-15 15:57:23.000 |
Context
2000-06-15
| ||
16:49 | :-) (CVS 99) (check-in: ac38f460c8 user: drh tags: trunk) | |
15:57 | :-) (CVS 98) (check-in: f26d0cdf45 user: drh tags: trunk) | |
11:32 | :-) (CVS 97) (check-in: 3b9689cc35 user: drh tags: trunk) | |
Changes
Changes to src/shell.c.
︙ | ︙ | |||
20 21 22 23 24 25 26 | ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ************************************************************************* ** This file contains code to implement the "sqlite" command line ** utility for accessing SQLite databases. ** | | | 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ************************************************************************* ** This file contains code to implement the "sqlite" command line ** utility for accessing SQLite databases. ** ** $Id: shell.c,v 1.13 2000/06/15 15:57:23 drh Exp $ */ #include <stdlib.h> #include <string.h> #include <stdio.h> #include "sqlite.h" #include <unistd.h> #include <ctype.h> |
︙ | ︙ | |||
118 119 120 121 122 123 124 | /* ** 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 { | | | | | | | > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 | /* ** 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 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 */ int escape; /* Escape this character when in MODE_List */ char zDestTable[250]; /* Name of destination table when MODE_Insert */ char separator[20]; /* Separator character for MODE_List */ int colWidth[30]; /* Width of each column when in column mode */ }; /* ** These are the allowed modes. */ #define MODE_Line 0 /* One field 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_Html 3 /* Generate an XHTML table */ #define MODE_Insert 4 /* Generate SQL "insert" statements */ /* ** Number of elements in an array */ #define ArraySize(X) (sizeof(X)/sizeof(X[0])) /* ** Return TRUE if the string supplied is a number of some kinds. */ static int is_numeric(const char *z){ int seen_digit = 0; if( *z=='-' || *z=='+' ){ z++; } while( isdigit(*z) ){ seen_digit = 1; z++; } if( seen_digit && *z=='.' ){ z++; while( isdigit(*z) ){ z++; } } if( seen_digit && (*z=='e' || *z=='E') && (isdigit(z[1]) || ((z[1]=='-' || z[1]=='+') && isdigit(z[2]))) ){ z+=2; while( isdigit(*z) ){ z++; } } return seen_digit && *z==0; } /* ** Output the given string as a quoted string using SQL quoting conventions. */ static void output_quoted_string(FILE *out, const char *z){ int i; int nSingle = 0; int nDouble = 0; for(i=0; z[i]; i++){ if( z[i]=='\'' ) nSingle++; else if( z[i]=='"' ) nDouble++; } if( nSingle==0 ){ fprintf(out,"'%s'",z); }else if( nDouble==0 ){ fprintf(out,"\"%s\"",z); }else{ fprintf(out,"'"); while( *z ){ for(i=0; z[i] && z[i]!='\''; i++){} if( i==0 ){ fprintf(out,"''"); z++; }else if( z[i]=='\'' ){ fprintf(out,"%.*s''",i,z); z += i+1; }else{ fprintf(out,"%s'",z); break; } } } } /* ** This is the callback routine that the SQLite library ** invokes for each row of a query result. */ static int callback(void *pArg, int nArg, char **azArg, char **azCol){ int i; |
︙ | ︙ | |||
224 225 226 227 228 229 230 | if( p->cnt++==0 && p->showHeader ){ fprintf(p->out,"<TR>"); for(i=0; i<nArg; i++){ fprintf(p->out,"<TH>%s</TH>",azCol[i]); } fprintf(p->out,"</TR>\n"); } | < | | | | | > | > > > > > > > > | > > | > > > | 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 315 316 317 318 319 | if( p->cnt++==0 && p->showHeader ){ fprintf(p->out,"<TR>"); for(i=0; i<nArg; i++){ fprintf(p->out,"<TH>%s</TH>",azCol[i]); } fprintf(p->out,"</TR>\n"); } fprintf(p->out,"<TR>"); for(i=0; i<nArg; i++){ fprintf(p->out,"<TD>%s</TD>",azArg[i] ? azArg[i] : ""); } fprintf(p->out,"</TD></TR>\n"); break; } case MODE_Insert: { fprintf(p->out,"INSERT INTO '%s' VALUES(",p->zDestTable); for(i=0; i<nArg; i++){ char *zSep = i>0 ? ",": ""; if( azArg[i]==0 ){ fprintf(p->out,"%sNULL",zSep); }else if( is_numeric(azArg[i]) ){ fprintf(p->out,"%s%s",zSep, azArg[i]); }else{ if( zSep[0] ) fprintf(p->out,"%s",zSep); output_quoted_string(p->out, azArg[i]); } } fprintf(p->out,");\n"); } } return 0; } /* ** This is a different callback routine used for dumping the database. ** Each row received by this callback consists of a table name, |
︙ | ︙ | |||
390 391 392 393 394 395 396 | sqlite_exec(db, zSql, callback, &data, &zErrMsg); if( zErrMsg ){ fprintf(stderr,"Error: %s\n", zErrMsg); free(zErrMsg); } }else | | > > > > > > > | 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 | sqlite_exec(db, zSql, callback, &data, &zErrMsg); if( zErrMsg ){ 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 ){ p->mode = MODE_Line; }else if( strncmp(azArg[1],"column",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 ){ sprintf(p->zDestTable,"%.*s", (int)(sizeof(p->zDestTable)-1), azArg[2]); }else{ sprintf(p->zDestTable,"table"); } } }else if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){ if( p->out!=stdout ){ fclose(p->out); } |
︙ | ︙ |