⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shell.c

📁 sqlite最新源码
💻 C
📖 第 1 页 / 共 5 页
字号:
    for(i=0; z[i] && z[i]!='<' && z[i]!='&'; i++){}    if( i>0 ){      fprintf(out,"%.*s",i,z);    }    if( z[i]=='<' ){      fprintf(out,"&lt;");    }else if( z[i]=='&' ){      fprintf(out,"&amp;");    }else{      break;    }    z += i + 1;  }}/*** If a field contains any character identified by a 1 in the following** array, then the string must be quoted for CSV.*/static const char needCsvQuote[] = {  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,     1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,     1, 0, 1, 0, 0, 0, 0, 1,   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 1,   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,     1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,     1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,     1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,     1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,     1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,     1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,     1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,   };/*** Output a single term of CSV.  Actually, p->separator is used for** the separator, which may or may not be a comma.  p->nullvalue is** the null value.  Strings are quoted using ANSI-C rules.  Numbers** appear outside of quotes.*/static void output_csv(struct callback_data *p, const char *z, int bSep){  FILE *out = p->out;  if( z==0 ){    fprintf(out,"%s",p->nullvalue);  }else{    int i;    int nSep = strlen30(p->separator);    for(i=0; z[i]; i++){      if( needCsvQuote[((unsigned char*)z)[i]]          || (z[i]==p->separator[0] &&              (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){        i = 0;        break;      }    }    if( i==0 ){      putc('"', out);      for(i=0; z[i]; i++){        if( z[i]=='"' ) putc('"', out);        putc(z[i], out);      }      putc('"', out);    }else{      fprintf(out, "%s", z);    }  }  if( bSep ){    fprintf(p->out, "%s", p->separator);  }}#ifdef SIGINT/*** This routine runs when the user presses Ctrl-C*/static void interrupt_handler(int NotUsed){  UNUSED_PARAMETER(NotUsed);  seenInterrupt = 1;  if( db ) sqlite3_interrupt(db);}#endif/*** 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;  struct callback_data *p = (struct callback_data*)pArg;  switch( p->mode ){    case MODE_Line: {      int w = 5;      if( azArg==0 ) break;      for(i=0; i<nArg; i++){        int len = strlen30(azCol[i] ? azCol[i] : "");        if( len>w ) w = len;      }      if( p->cnt++>0 ) fprintf(p->out,"\n");      for(i=0; i<nArg; i++){        fprintf(p->out,"%*s = %s\n", w, azCol[i],                azArg[i] ? azArg[i] : p->nullvalue);      }      break;    }    case MODE_Explain:    case MODE_Column: {      if( p->cnt++==0 ){        for(i=0; i<nArg; i++){          int w, n;          if( i<ArraySize(p->colWidth) ){            w = p->colWidth[i];          }else{            w = 0;          }          if( w<=0 ){            w = strlen30(azCol[i] ? azCol[i] : "");            if( w<10 ) w = 10;            n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);            if( w<n ) w = n;          }          if( i<ArraySize(p->actualWidth) ){            p->actualWidth[i] = w;          }          if( p->showHeader ){            fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": "  ");          }        }        if( p->showHeader ){          for(i=0; i<nArg; i++){            int w;            if( i<ArraySize(p->actualWidth) ){               w = p->actualWidth[i];            }else{               w = 10;            }            fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"                   "----------------------------------------------------------",                    i==nArg-1 ? "\n": "  ");          }        }      }      if( azArg==0 ) break;      for(i=0; i<nArg; i++){        int w;        if( i<ArraySize(p->actualWidth) ){           w = p->actualWidth[i];        }else{           w = 10;        }        if( p->mode==MODE_Explain && azArg[i] &&            strlen30(azArg[i])>w ){          w = strlen30(azArg[i]);        }        fprintf(p->out,"%-*.*s%s",w,w,            azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": "  ");      }      break;    }    case MODE_Semi:    case MODE_List: {      if( p->cnt++==0 && p->showHeader ){        for(i=0; i<nArg; i++){          fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);        }      }      if( azArg==0 ) break;      for(i=0; i<nArg; i++){        char *z = azArg[i];        if( z==0 ) z = p->nullvalue;        fprintf(p->out, "%s", z);        if( i<nArg-1 ){          fprintf(p->out, "%s", p->separator);        }else if( p->mode==MODE_Semi ){          fprintf(p->out, ";\n");        }else{          fprintf(p->out, "\n");        }      }      break;    }    case MODE_Html: {      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");      }      if( azArg==0 ) break;      fprintf(p->out,"<TR>");      for(i=0; i<nArg; i++){        fprintf(p->out,"<TD>");        output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);        fprintf(p->out,"</TD>\n");      }      fprintf(p->out,"</TR>\n");      break;    }    case MODE_Tcl: {      if( p->cnt++==0 && p->showHeader ){        for(i=0; i<nArg; i++){          output_c_string(p->out,azCol[i] ? azCol[i] : "");          fprintf(p->out, "%s", p->separator);        }        fprintf(p->out,"\n");      }      if( azArg==0 ) break;      for(i=0; i<nArg; i++){        output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);        fprintf(p->out, "%s", p->separator);      }      fprintf(p->out,"\n");      break;    }    case MODE_Csv: {      if( p->cnt++==0 && p->showHeader ){        for(i=0; i<nArg; i++){          output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);        }        fprintf(p->out,"\n");      }      if( azArg==0 ) break;      for(i=0; i<nArg; i++){        output_csv(p, azArg[i], i<nArg-1);      }      fprintf(p->out,"\n");      break;    }    case MODE_Insert: {      if( azArg==0 ) break;      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( isNumber(azArg[i], 0) ){          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");      break;    }  }  return 0;}/*** Set the destination table field of the callback_data structure to** the name of the table given.  Escape any quote characters in the** table name.*/static void set_table_name(struct callback_data *p, const char *zName){  int i, n;  int needQuote;  char *z;  if( p->zDestTable ){    free(p->zDestTable);    p->zDestTable = 0;  }  if( zName==0 ) return;  needQuote = !isalpha((unsigned char)*zName) && *zName!='_';  for(i=n=0; zName[i]; i++, n++){    if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){      needQuote = 1;      if( zName[i]=='\'' ) n++;    }  }  if( needQuote ) n += 2;  z = p->zDestTable = malloc( n+1 );  if( z==0 ){    fprintf(stderr,"Out of memory!\n");    exit(1);  }  n = 0;  if( needQuote ) z[n++] = '\'';  for(i=0; zName[i]; i++){    z[n++] = zName[i];    if( zName[i]=='\'' ) z[n++] = '\'';  }  if( needQuote ) z[n++] = '\'';  z[n] = 0;}/* zIn is either a pointer to a NULL-terminated string in memory obtained** from malloc(), or a NULL pointer. The string pointed to by zAppend is** added to zIn, and the result returned in memory obtained from malloc().** zIn, if it was not NULL, is freed.**** If the third argument, quote, is not '\0', then it is used as a ** quote character for zAppend.*/static char *appendText(char *zIn, char const *zAppend, char quote){  int len;  int i;  int nAppend = strlen30(zAppend);  int nIn = (zIn?strlen30(zIn):0);  len = nAppend+nIn+1;  if( quote ){    len += 2;    for(i=0; i<nAppend; i++){      if( zAppend[i]==quote ) len++;    }  }  zIn = (char *)realloc(zIn, len);  if( !zIn ){    return 0;  }  if( quote ){    char *zCsr = &zIn[nIn];    *zCsr++ = quote;    for(i=0; i<nAppend; i++){      *zCsr++ = zAppend[i];      if( zAppend[i]==quote ) *zCsr++ = quote;    }    *zCsr++ = quote;    *zCsr++ = '\0';    assert( (zCsr-zIn)==len );  }else{    memcpy(&zIn[nIn], zAppend, nAppend);    zIn[len-1] = '\0';  }  return zIn;}/*** Execute a query statement that has a single result column.  Print** that result column on a line by itself with a semicolon terminator.**** This is used, for example, to show the schema of the database by** querying the SQLITE_MASTER table.*/static int run_table_dump_query(FILE *out, sqlite3 *db, const char *zSelect){  sqlite3_stmt *pSelect;  int rc;  rc = sqlite3_prepare(db, zSelect, -1, &pSelect, 0);  if( rc!=SQLITE_OK || !pSelect ){    return rc;  }  rc = sqlite3_step(pSelect);  while( rc==SQLITE_ROW ){    fprintf(out, "%s;\n", sqlite3_column_text(pSelect, 0));    rc = sqlite3_step(pSelect);  }  return sqlite3_finalize(pSelect);}/*** This is a different callback routine used for dumping the database.** Each row received by this callback consists of a table name,** the table type ("index" or "table") and SQL to create the table.** This routine should print text sufficient to recreate the table.*/static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){  int rc;  const char *zTable;  const char *zType;  const char *zSql;  struct callback_data *p = (struct callback_data *)pArg;  UNUSED_PARAMETER(azCol);  if( nArg!=3 ) return 1;  zTable = azArg[0];  zType = azArg[1];  zSql = azArg[2];    if( strcmp(zTable, "sqlite_sequence")==0 ){    fprintf(p->out, "DELETE FROM sqlite_sequence;\n");  }else if( strcmp(zTable, "sqlite_stat1")==0 ){    fprintf(p->out, "ANALYZE sqlite_master;\n");  }else if( strncmp(zTable, "sqlite_", 7)==0 ){    return 0;  }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){    char *zIns;    if( !p->writableSchema ){      fprintf(p->out, "PRAGMA writable_schema=ON;\n");      p->writableSchema = 1;    }    zIns = sqlite3_mprintf(       "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"       "VALUES('table','%q','%q',0,'%q');",       zTable, zTable, zSql);    fprintf(p->out, "%s\n", zIns);    sqlite3_free(zIns);    return 0;  }else{    fprintf(p->out, "%s;\n", zSql);  }  if( strcmp(zType, "table")==0 ){    sqlite3_stmt *pTableInfo = 0;    char *zSelect = 0;    char *zTableInfo = 0;    char *zTmp = 0;       zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);    zTableInfo = appendText(zTableInfo, zTable, '"');    zTableInfo = appendText(zTableInfo, ");", 0);    rc = sqlite3_prepare(p->db, zTableInfo, -1, &pTableInfo, 0);    if( zTableInfo ) free(zTableInfo);    if( rc!=SQLITE_OK || !pTableInfo ){      return 1;    }    zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);    zTmp = appendText(zTmp, zTable, '"');    if( zTmp ){      zSelect = appendText(zSelect, zTmp, '\'');    }    zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);    rc = sqlite3_step(pTableInfo);    while( rc==SQLITE_ROW ){      const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);      zSelect = appendText(zSelect, "quote(", 0);      zSelect = appendText(zSelect, zText, '"');      rc = sqlite3_step(pTableInfo);      if( rc==SQLITE_ROW ){        zSelect = appendText(zSelect, ") || ',' || ", 0);      }else{        zSelect = appendText(zSelect, ") ", 0);      }    }    rc = sqlite3_finalize(pTableInfo);    if( rc!=SQLITE_OK ){      if( zSelect ) free(zSelect);      return 1;    }    zSelect = appendText(zSelect, "|| ')' FROM  ", 0);    zSelect = appendText(zSelect, zTable, '"');    rc = run_table_dump_query(p->out, p->db, zSelect);    if( rc==SQLITE_CORRUPT ){      zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -