示例#1
0
int Transfer::getNumberOfTransfers ( int accountid )
  {
    char **results;
    sqlite_get_table_printf ( db, "select count() from transfers where fromaccount = %i;", &results, 0, 0, 0, accountid );
    int transfers = atoi ( results [ 1 ] );
    sqlite_get_table_printf ( db, "select count() from transfers where toaccount = %i;", &results, 0, 0, 0, accountid );
    transfers = transfers + atoi ( results [ 1 ] );
    return transfers;
  }
示例#2
0
int Budget::getNumberOfLineItems ( int budgetid )
  {
    QString tablename = "table";
    tablename.append ( QString::number ( budgetid ) );
    char **results;
    sqlite_get_table_printf ( bdb, "select count() from '%q';", &results, NULL, NULL, NULL, ( const char * ) tablename );
    return atoi ( results [ 1 ] );
  }
示例#3
0
float Budget::getLineItemAmount ( int budgetid, int lineitemid )
  {
    QString tablename = "table";
    tablename.append ( QString::number ( budgetid ) );
    char **results;
    sqlite_get_table_printf ( bdb, "select lineitemamount from '%q' where lineitemid= %i;", &results, NULL, NULL, NULL, ( const char* ) tablename, lineitemid );
    return strtod ( results [ 1 ], 0 );
  }
示例#4
0
int Budget::getLineItemTime ( int budgetid, int lineitemid )
  {
    QString tablename = "table";
    tablename.append ( QString::number ( budgetid ) );
    char **results;
    sqlite_get_table_printf ( bdb, "select type from '%q' where lineitemid= %i;", &results, NULL, NULL, NULL, ( const char * ) tablename, lineitemid );
    return atoi ( results [ 1 ] );
  }
示例#5
0
int Budget::addLineItem ( int budgetid, QString lineitemname, float lineitemamount, int lineitemtype )
  {
    QString tablename = "table";
    tablename.append ( QString::number ( budgetid ) );
    sqlite_exec_printf ( bdb, "insert into '%q' values ( '%q', %.2f, %i, NULL );", 0, 0, 0, ( const char* ) tablename, ( const char* ) lineitemname, lineitemamount, lineitemtype );
    char **results;
    sqlite_get_table_printf ( bdb, "select last_insert_rowid() from '%q';", &results, NULL, NULL, NULL, ( const char* ) tablename );
    return atoi ( results [ 1 ] );
  }
示例#6
0
QStringList Budget::getLineItemIDs ( int budgetid )
  {
    QString tablename = "table";
    tablename.append ( QString::number ( budgetid ) );
    QStringList lineitemids;
    char **results;
    int rows, counter;
    sqlite_get_table_printf ( bdb, "select lineitemid from '%q';", &results, &rows, NULL, NULL, (const char*) tablename );
    for ( counter = 0; counter < rows; counter++ )
      lineitemids.append ( results [ counter + 1 ] );
    return lineitemids;
  }
示例#7
0
QString Budget::getBudgetTotal ( int budgetid, int viewtype )
  {
    QString tablename = "table";
    tablename.append ( QString::number ( budgetid ) );
    // determine if we are viewing a years, months, or days budget
    // we have to pick a different sum for each
    char **results;
    sqlite_get_table_printf ( bdb, "select sum ( lineitemamount ) from '%q';", &results, NULL, NULL, NULL, ( const char * ) tablename );
    QString amount = results [ 1 ];
    float total  = amount.toFloat();
    if ( viewtype == 0 )
      total = total / 12;
    amount.setNum ( total, 'f', 2 );
    return amount;
  }
示例#8
0
文件: test1.c 项目: ErikGartner/ardb
/*
** Usage:  sqlite_get_table_printf  DB  FORMAT  STRING
**
** Invoke the sqlite_get_table_printf() interface using the open database
** DB.  The SQL is the string FORMAT.  The format string should contain
** one %s or %q.  STRING is the value inserted into %s or %q.
*/
static int test_get_table_printf(
  void *NotUsed,
  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
  int argc,              /* Number of arguments */
  char **argv            /* Text of each argument */
){
  sqlite *db;
  Tcl_DString str;
  int rc;
  char *zErr = 0;
  int nRow, nCol;
  char **aResult;
  int i;
  char zBuf[30];
  if( argc!=4 ){
    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 
       " DB FORMAT STRING", 0);
    return TCL_ERROR;
  }
  if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR;
  Tcl_DStringInit(&str);
  rc = sqlite_get_table_printf(db, argv[2], &aResult, &nRow, &nCol, 
               &zErr, argv[3]);
  sprintf(zBuf, "%d", rc);
  Tcl_AppendElement(interp, zBuf);
  if( rc==SQLITE_OK ){
    sprintf(zBuf, "%d", nRow);
    Tcl_AppendElement(interp, zBuf);
    sprintf(zBuf, "%d", nCol);
    Tcl_AppendElement(interp, zBuf);
    for(i=0; i<(nRow+1)*nCol; i++){
      Tcl_AppendElement(interp, aResult[i] ? aResult[i] : "NULL");
    }
  }else{
    Tcl_AppendElement(interp, zErr);
  }
  sqlite_free_table(aResult);
  if( zErr ) free(zErr);
  return TCL_OK;
}
示例#9
0
void Budget::displayLineItems ( int budgetid, QListView *listview, int month, int year, int viewtype )
  {
    QString tablename = "table";
    tablename.append ( QString::number ( budgetid ) );
    char **results;
    int rows, columns, counter;
    sqlite_get_table_printf ( bdb, "select name, lineitemamount, lineitemid from '%q';", &results, &rows, &columns, NULL, ( const char * ) tablename );
    int total = ( ( rows + 1 ) * columns );
    for ( counter = 3; counter < total; counter = counter + 3 )
      {
        float amount = 0;
        if ( viewtype == 0 )
          {
            QString lineitemamount = results [ counter + 1 ];
            amount = lineitemamount.toFloat() / 12;
          }
        else
          {
            QString lineitemamount = results [ counter + 1 ];
            amount = lineitemamount.toFloat();
          }
        QListViewItem *item = new QListViewItem ( listview, results [ counter ], QString::number ( amount, 'f', 2 ), transaction->getBudgetTotal ( budgetid, atoi ( results [ counter + 2 ] ), year, month, viewtype ), results [ counter + 2 ] );
      }
  }
示例#10
0
QString Transfer::getAmount ( int id )
  {
    char **results;
    sqlite_get_table_printf ( db, "select amount from transfers where transferid= %i;", &results, 0, 0, 0, id );
    return results [ 1 ];
  }
示例#11
0
int Transfer::getYear ( int id )
  {
    char **results;
    sqlite_get_table_printf ( db, "select year from transfers where transferid= %i;", &results, 0, 0, 0, id );
    return atoi ( results [ 1 ] );
  }
示例#12
0
int Transfer::getToAccountID ( int id )
  {
    char **results;
    sqlite_get_table_printf ( db, "select toaccount from transfers where transferid= %i;", &results, 0, 0, 0, id );
    return atoi ( results [ 1 ] );
  }
示例#13
0
QString Budget::getCurrency ( int budgetid )
  {
    char **results;
    sqlite_get_table_printf ( bdb, "select currency from budgets where budgetid= %i;", &results, NULL, NULL, NULL, budgetid );
    return ( QString ) results [ 1 ];
  }
示例#14
0
void Transfer::displayTransfers ( QListView *listview, int accountid, bool children, QDate displaydate )
  {
    int showcleared = preferences->getPreference ( 3 );

    // select the from transfers to display
    char **results;
    int rows, columns;
    if ( account->getParentAccountID ( accountid ) == -1 && children == TRUE )
      {
        if ( showcleared == 0 )
          sqlite_get_table_printf ( db, "select day, month, year, amount, transferid, fromaccount, toaccount from transfers where cleared = 0 and toparent = %i;", &results, &rows, &columns, 0, accountid );
        else
          sqlite_get_table_printf ( db, "select day, month, year, amount, transferid, fromaccount, toaccount from transfers where toparent = %i;", &results, &rows, &columns, 0, accountid );
      }
    else
      {
        if ( showcleared == 0 )
          sqlite_get_table_printf ( db, "select day, month, year, amount, transferid, fromaccount, toaccount from transfers where cleared = 0 and toaccount = %i;", &results, &rows, &columns, 0, accountid );
        else
          sqlite_get_table_printf ( db, "select day, month, year, amount, transferid, fromaccount, toaccount from transfers where toaccount = %i;", &results, &rows, &columns, 0, accountid );
      }

    // iterate through the list and display the from items
    int counter = 7;
    int position = 0;
    while ( counter < ( ( rows + 1 ) * columns ) )
      {
        // construct the date
	QString daystring = results [ counter ];
	int day = daystring.toInt ();
	QString monthstring = results [ counter + 1 ];
	int month = monthstring.toInt ();
	QString yearstring = results [ counter + 2 ];
	int year = yearstring.toInt ();
	QString date = preferences->getDate ( year, month, day );
        QDate testdate ( year, month, day );

        //construct the amount and id strings
        QString amount = results [ counter + 3 ];
        QString id = results [ counter + 4 ];

        // construct the transaction name
        QString transactionname = "FROM: ";
        QString temp1 = results [ counter + 5 ];
        transactionname.append ( account->getAccountName ( temp1.toInt() ) );

        QString toaccount = account->getAccountName ( atol ( results [ counter + 6 ] ) );

        if ( testdate >= displaydate || showcleared == 0 )
          {
            // display this transfer
            if ( account->getParentAccountID ( accountid ) == -1 )
              {
                if ( showcleared == 1 && getCleared ( id.toInt() ) == 1 )
                  ColorListItem *item = new ColorListItem ( listview, date, transactionname, amount, id, toaccount );
                else
                  QListViewItem *item = new QListViewItem ( listview, date, transactionname, amount, id, toaccount );
              }
            else
              {
                if ( showcleared == 1 && getCleared ( id.toInt() ) == 1 )
                  ColorListItem *item = new ColorListItem ( listview, date, transactionname, amount, id );
                else
                  QListViewItem *item = new QListViewItem ( listview, date, transactionname, amount, id );
              }
          }
        counter = counter + 7;
      }

    // select the to transfers to display
    char **toresults;
    rows = 0;
    columns = 0;
    if ( account->getParentAccountID ( accountid ) == -1 && children == TRUE )
      {
        if ( showcleared == 0 )
          sqlite_get_table_printf ( db, "select day, month, year, amount, transferid, fromaccount, toaccount from transfers where cleared = 0 and fromparent = %i;", &toresults, &rows, &columns, 0, accountid );
        else
          sqlite_get_table_printf ( db, "select day, month, year, amount, transferid, fromaccount, toaccount from transfers where fromparent = %i;", &toresults, &rows, &columns, 0, accountid );
      }
    else
      {
        if ( showcleared == 0 )
          sqlite_get_table_printf ( db, "select day, month, year, amount, transferid, fromaccount, toaccount from transfers where cleared = 0 and fromaccount = %i;", &toresults, &rows, &columns, 0, accountid );
        else
          sqlite_get_table_printf ( db, "select day, month, year, amount, transferid, fromaccount, toaccount from transfers where fromaccount = %i;", &toresults, &rows, &columns, 0, accountid );
      }

    // iterate through the list and display the from items
    counter = 7;
    position = 0;
    while ( counter < ( ( rows + 1 ) * columns ) )
      {
        // construct the date
	QString daystring = toresults [ counter ];
	int day = daystring.toInt ();
	QString monthstring = toresults [ counter + 1 ];
	int month = monthstring.toInt ();
	QString yearstring = toresults [ counter + 2 ];
	int year = yearstring.toInt ();
	QString date = preferences->getDate ( year, month, day );
        QDate testdate ( year, month, day );

        //construct the amount and id strings
        QString amount = toresults [ counter + 3 ];
        amount.prepend ( "-" );
        QString id = toresults [ counter + 4 ];

        // construct the transaction name
        QString transactionname = "TO: ";
        QString temp1 = toresults [ counter + 6 ];
        transactionname.append ( account->getAccountName ( temp1.toInt() ) );

        QString fromaccount = account->getAccountName ( atol ( toresults [ counter + 5 ] ) );

         if ( testdate >= displaydate || showcleared == 0 )
           {
             // display this transfer
             if ( account->getParentAccountID ( accountid ) == -1 )
              {
                if ( showcleared == 1 && getCleared ( id.toInt() ) == 1 )
                  ColorListItem *item = new ColorListItem ( listview, date, transactionname, amount, id, fromaccount );
                else
                  QListViewItem *item = new QListViewItem ( listview, date, transactionname, amount, id, fromaccount );
              }
            else
              {
                if ( showcleared == 1 && getCleared ( id.toInt() ) == 1 )
                  ColorListItem *item = new ColorListItem ( listview, date, transactionname, amount, id );
                else
                  QListViewItem *item = new QListViewItem ( listview, date, transactionname, amount, id );
              }
          }

        counter = counter + 7;
      }
  }
示例#15
0
QString Budget::getBudgetDescription ( int budgetid )
  {
    char **results;
    sqlite_get_table_printf ( bdb, "select description from budgets where budgetid= %i;", &results, NULL, NULL, NULL, budgetid );
    return ( QString ) results [ 1 ];
  }
示例#16
0
/*
** If an input line begins with "." then invoke this routine to
** process that line.
**
** Return 1 to exit and 0 to continue.
*/
static int do_meta_command(char *zLine, struct callback_data *p){
  int i = 1;
  int nArg = 0;
  int n, c;
  int rc = 0;
  char *azArg[50];

  /* Parse the input line into tokens.
  */
  while( zLine[i] && nArg<ArraySize(azArg) ){
    while( isspace(zLine[i]) ){ i++; }
    if( zLine[i]==0 ) break;
    if( zLine[i]=='\'' || zLine[i]=='"' ){
      int delim = zLine[i++];
      azArg[nArg++] = &zLine[i];
      while( zLine[i] && zLine[i]!=delim ){ i++; }
      if( zLine[i]==delim ){
        zLine[i++] = 0;
      }
    }else{
      azArg[nArg++] = &zLine[i];
      while( zLine[i] && !isspace(zLine[i]) ){ i++; }
      if( zLine[i] ) zLine[i++] = 0;
    }
  }

  /* Process the input line.
  */
  if( nArg==0 ) return rc;
  n = strlen(azArg[0]);
  c = azArg[0][0];
  if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
    struct callback_data data;
    char *zErrMsg = 0;
    open_db(p);
    memcpy(&data, p, sizeof(data));
    data.showHeader = 1;
    data.mode = MODE_Column;
    data.colWidth[0] = 3;
    data.colWidth[1] = 15;
    data.colWidth[2] = 58;
    sqlite_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
    if( zErrMsg ){
      fprintf(stderr,"Error: %s\n", zErrMsg);
      sqlite_freemem(zErrMsg);
    }
  }else

  if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
    char *zErrMsg = 0;
    open_db(p);
    fprintf(p->out, "BEGIN TRANSACTION;\n");
    if( nArg==1 ){
      sqlite_exec(p->db,
        "SELECT name, type, sql FROM sqlite_master "
        "WHERE type!='meta' AND sql NOT NULL "
        "ORDER BY substr(type,2,1), name",
        dump_callback, p, &zErrMsg
      );
    }else{
      int i;
      for(i=1; i<nArg && zErrMsg==0; i++){
        sqlite_exec_printf(p->db,
          "SELECT name, type, sql FROM sqlite_master "
          "WHERE tbl_name LIKE '%q' AND type!='meta' AND sql NOT NULL "
          "ORDER BY substr(type,2,1), name",
          dump_callback, p, &zErrMsg, azArg[i]
        );
      }
    }
    if( zErrMsg ){
      fprintf(stderr,"Error: %s\n", zErrMsg);
      sqlite_freemem(zErrMsg);
    }else{
      fprintf(p->out, "COMMIT;\n");
    }
  }else

  if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 ){
    int j;
    char *z = azArg[1];
    int val = atoi(azArg[1]);
    for(j=0; z[j]; j++){
      if( isupper(z[j]) ) z[j] = tolower(z[j]);
    }
    if( strcmp(z,"on")==0 ){
      val = 1;
    }else if( strcmp(z,"yes")==0 ){
      val = 1;
    }
    p->echoOn = val;
  }else

  if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
    rc = 1;
  }else

  if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
    int j;
    char *z = nArg>=2 ? azArg[1] : "1";
    int val = atoi(z);
    for(j=0; z[j]; j++){
      if( isupper(z[j]) ) z[j] = tolower(z[j]);
    }
    if( strcmp(z,"on")==0 ){
      val = 1;
    }else if( strcmp(z,"yes")==0 ){
      val = 1;
    }
    if(val == 1) {
      if(!p->explainPrev.valid) {
        p->explainPrev.valid = 1;
        p->explainPrev.mode = p->mode;
        p->explainPrev.showHeader = p->showHeader;
        memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
      }
      /* We could put this code under the !p->explainValid
      ** condition so that it does not execute if we are already in
      ** explain mode. However, always executing it allows us an easy
      ** was to reset to explain mode in case the user previously
      ** did an .explain followed by a .width, .mode or .header
      ** command.
      */
      p->mode = MODE_Column;
      p->showHeader = 1;
      memset(p->colWidth,0,ArraySize(p->colWidth));
      p->colWidth[0] = 4;
      p->colWidth[1] = 12;
      p->colWidth[2] = 10;
      p->colWidth[3] = 10;
      p->colWidth[4] = 35;
    }else if (p->explainPrev.valid) {
      p->explainPrev.valid = 0;
      p->mode = p->explainPrev.mode;
      p->showHeader = p->explainPrev.showHeader;
      memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
    }
  }else

  if( c=='h' && (strncmp(azArg[0], "header", n)==0
                 ||
                 strncmp(azArg[0], "headers", n)==0 )&& nArg>1 ){
    int j;
    char *z = azArg[1];
    int val = atoi(azArg[1]);
    for(j=0; z[j]; j++){
      if( isupper(z[j]) ) z[j] = tolower(z[j]);
    }
    if( strcmp(z,"on")==0 ){
      val = 1;
    }else if( strcmp(z,"yes")==0 ){
      val = 1;
    }
    p->showHeader = val;
  }else

  if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
    fprintf(stderr,zHelp);
  }else

  if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg>1 ){
    struct callback_data data;
    char *zErrMsg = 0;
    open_db(p);
    memcpy(&data, p, sizeof(data));
    data.showHeader = 0;
    data.mode = MODE_List;
    sqlite_exec_printf(p->db,
      "SELECT name FROM sqlite_master "
      "WHERE type='index' AND tbl_name LIKE '%q' "
      "UNION ALL "
      "SELECT name FROM sqlite_temp_master "
      "WHERE type='index' AND tbl_name LIKE '%q' "
      "ORDER BY 1",
      callback, &data, &zErrMsg, azArg[1], azArg[1]
    );
    if( zErrMsg ){
      fprintf(stderr,"Error: %s\n", zErrMsg);
      sqlite_freemem(zErrMsg);
    }
  }else

  if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg>=2 ){
    int n2 = strlen(azArg[1]);
    if( strncmp(azArg[1],"line",n2)==0
        ||
        strncmp(azArg[1],"lines",n2)==0 ){
      p->mode = MODE_Line;
    }else if( strncmp(azArg[1],"column",n2)==0
              ||
              strncmp(azArg[1],"columns",n2)==0 ){
      p->mode = MODE_Column;
    }else if( strncmp(azArg[1],"list",n2)==0 ){
      p->mode = MODE_List;
    }else if( strncmp(azArg[1],"html",n2)==0 ){
      p->mode = MODE_Html;
    }else if( strncmp(azArg[1],"insert",n2)==0 ){
      p->mode = MODE_Insert;
      if( nArg>=3 ){
        set_table_name(p, azArg[2]);
      }else{
        set_table_name(p, "table");
      }
    }else {
      fprintf(stderr,"mode should be on of: column html insert line list\n");
    }
  }else

  if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
    sprintf(p->nullvalue, "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
  }else

  if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
    if( p->out!=stdout ){
      fclose(p->out);
    }
    if( strcmp(azArg[1],"stdout")==0 ){
      p->out = stdout;
      strcpy(p->outfile,"stdout");
    }else{
      p->out = fopen(azArg[1], "wb");
      if( p->out==0 ){
        fprintf(stderr,"can't write to \"%s\"\n", azArg[1]);
        p->out = stdout;
      } else {
         strcpy(p->outfile,azArg[1]);
      }
    }
  }else

  if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
    if( nArg >= 2) {
      strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
    }
    if( nArg >= 3) {
      strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
    }
  }else

  if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
    rc = 1;
  }else

  if( c=='r' && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
    FILE *alt = fopen(azArg[1], "rb");
    if( alt==0 ){
      fprintf(stderr,"can't open \"%s\"\n", azArg[1]);
    }else{
      process_input(p, alt);
      fclose(alt);
    }
  }else

#ifdef SQLITE_HAS_CODEC
  if( c=='r' && strncmp(azArg[0],"rekey", n)==0 && nArg==4 ){
    char *zOld = p->zKey;
    if( zOld==0 ) zOld = "";
    if( strcmp(azArg[1],zOld) ){
      fprintf(stderr,"old key is incorrect\n");
    }else if( strcmp(azArg[2], azArg[3]) ){
      fprintf(stderr,"2nd copy of new key does not match the 1st\n");
    }else{
      sqlite_freemem(p->zKey);
      p->zKey = sqlite_mprintf("%s", azArg[2]);
      sqlite_rekey(p->db, p->zKey, strlen(p->zKey));
    }
  }else
#endif

  if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
    struct callback_data data;
    char *zErrMsg = 0;
    open_db(p);
    memcpy(&data, p, sizeof(data));
    data.showHeader = 0;
    data.mode = MODE_Semi;
    if( nArg>1 ){
      extern int sqliteStrICmp(const char*,const char*);
      if( sqliteStrICmp(azArg[1],"sqlite_master")==0 ){
        char *new_argv[2], *new_colv[2];
        new_argv[0] = "CREATE TABLE sqlite_master (\n"
                      "  type text,\n"
                      "  name text,\n"
                      "  tbl_name text,\n"
                      "  rootpage integer,\n"
                      "  sql text\n"
                      ")";
        new_argv[1] = 0;
        new_colv[0] = "sql";
        new_colv[1] = 0;
        callback(&data, 1, new_argv, new_colv);
      }else if( sqliteStrICmp(azArg[1],"sqlite_temp_master")==0 ){
        char *new_argv[2], *new_colv[2];
        new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
                      "  type text,\n"
                      "  name text,\n"
                      "  tbl_name text,\n"
                      "  rootpage integer,\n"
                      "  sql text\n"
                      ")";
        new_argv[1] = 0;
        new_colv[0] = "sql";
        new_colv[1] = 0;
        callback(&data, 1, new_argv, new_colv);
      }else{
        sqlite_exec_printf(p->db,
          "SELECT sql FROM "
          "  (SELECT * FROM sqlite_master UNION ALL"
          "   SELECT * FROM sqlite_temp_master) "
          "WHERE tbl_name LIKE '%q' AND type!='meta' AND sql NOTNULL "
          "ORDER BY substr(type,2,1), name",
          callback, &data, &zErrMsg, azArg[1]);
      }
    }else{
      sqlite_exec(p->db,
         "SELECT sql FROM "
         "  (SELECT * FROM sqlite_master UNION ALL"
         "   SELECT * FROM sqlite_temp_master) "
         "WHERE type!='meta' AND sql NOTNULL "
         "ORDER BY substr(type,2,1), name",
         callback, &data, &zErrMsg
      );
    }
    if( zErrMsg ){
      fprintf(stderr,"Error: %s\n", zErrMsg);
      sqlite_freemem(zErrMsg);
    }
  }else

  if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
    sprintf(p->separator, "%.*s", (int)ArraySize(p->separator)-1, azArg[1]);
  }else

  if( c=='s' && strncmp(azArg[0], "show", n)==0){
    int i;
    fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
    fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
    fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
    fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
    fprintf(p->out,"%9.9s: %s\n","nullvalue", p->nullvalue);
    fprintf(p->out,"%9.9s: %s\n","output",
                                 strlen(p->outfile) ? p->outfile : "stdout");
    fprintf(p->out,"%9.9s: %s\n","separator", p->separator);
    fprintf(p->out,"%9.9s: ","width");
    for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
        fprintf(p->out,"%d ",p->colWidth[i]);
    }
    fprintf(p->out,"\n\n");
  }else

  if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
    char **azResult;
    int nRow, rc;
    char *zErrMsg;
    open_db(p);
    if( nArg==1 ){
      rc = sqlite_get_table(p->db,
        "SELECT name FROM sqlite_master "
        "WHERE type IN ('table','view') "
        "UNION ALL "
        "SELECT name FROM sqlite_temp_master "
        "WHERE type IN ('table','view') "
        "ORDER BY 1",
        &azResult, &nRow, 0, &zErrMsg
      );
    }else{
      rc = sqlite_get_table_printf(p->db,
        "SELECT name FROM sqlite_master "
        "WHERE type IN ('table','view') AND name LIKE '%%%q%%' "
        "UNION ALL "
        "SELECT name FROM sqlite_temp_master "
        "WHERE type IN ('table','view') AND name LIKE '%%%q%%' "
        "ORDER BY 1",
        &azResult, &nRow, 0, &zErrMsg, azArg[1], azArg[1]
      );
    }
    if( zErrMsg ){
      fprintf(stderr,"Error: %s\n", zErrMsg);
      sqlite_freemem(zErrMsg);
    }
    if( rc==SQLITE_OK ){
      int len, maxlen = 0;
      int i, j;
      int nPrintCol, nPrintRow;
      for(i=1; i<=nRow; i++){
        if( azResult[i]==0 ) continue;
        len = strlen(azResult[i]);
        if( len>maxlen ) maxlen = len;
      }
      nPrintCol = 80/(maxlen+2);
      if( nPrintCol<1 ) nPrintCol = 1;
      nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
      for(i=0; i<nPrintRow; i++){
        for(j=i+1; j<=nRow; j+=nPrintRow){
          char *zSp = j<=nPrintRow ? "" : "  ";
          printf("%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
        }
        printf("\n");
      }
    }
    sqlite_free_table(azResult);
  }else

  if( c=='t' && n>1 && strncmp(azArg[0], "timeout", n)==0 && nArg>=2 ){
    open_db(p);
    sqlite_busy_timeout(p->db, atoi(azArg[1]));
  }else

  if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
    int j;
    for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
      p->colWidth[j-1] = atoi(azArg[j]);
    }
  }else

  {
    fprintf(stderr, "unknown command or invalid arguments: "
      " \"%s\". Enter \".help\" for help\n", azArg[0]);
  }

  return rc;
}
示例#17
0
int
main(int argc, char **argv)
{
	int rc, nrow, ncol;
	sqlite *dbname;
	char *errmsg = NULL, **result = NULL;
	struct in_addr in_ip;
	FILE *fp1, *fp2;
	char line[256];

/* get program name */
	progname = cli_get_progname(argv[0]);

/* print version information */
	cli_print_version();

/* initialize */
	cli_dns_init();

/* open configuration database */
	if((dbname = sqlite_open(DB_CONF, 0, &errmsg)) == NULL)
	{
		cli_print_debug_msg("Error: %s\n", errmsg);
		exit(3);
	}

/* parse command line */
	if(argc < 2)
	{
		cli_dns_usage();
		cli_dns_exit(1);
	}
	
	if(!strcmp(argv[1], "set") && (argc == 4 || argc == 5) && !strcmp(argv[2], "ip"))
	{
		if(cli_check_keyword("<single_ip>", argv[3]))
		{
			cli_get_user_msg("public", 1, cli_user_msg);
			printf(cli_user_msg, argv[3]);
			printf("\n");
			cli_dns_exit(1);
		}
		inet_aton(argv[3], &in_ip);
		strcpy(dns.dnssrv, inet_ntoa(in_ip));
		
		if(argc == 5)
		{
			if(cli_check_keyword("<single_ip>", argv[4]))
			{
				cli_get_user_msg("public", 1, cli_user_msg);
				printf(cli_user_msg, argv[4]);
				printf("\n");
				cli_dns_exit(1);
			}
			inet_aton(argv[4], &in_ip);
			strcpy(dns.dnssrv2, inet_ntoa(in_ip));
		}
		
		if((fp1 = fopen(FILE_RESOLV_CONF, "r")) == NULL)
		{
			cli_print_debug_msg("Error: open file \"%s\"\n", FILE_RESOLV_CONF);
			cli_dns_exit(3);
		}
		flock(fileno(fp1), LOCK_EX);
		if((fp2 = fopen(FILE_RESOLV_CONF_TEMP, "w+")) == NULL)
		{
			cli_print_debug_msg("Error: open file \"%s\"\n", FILE_RESOLV_CONF_TEMP);
			cli_dns_exit(3);
		}
		flock(fileno(fp2), LOCK_EX);
		while(fgets(line, 256, fp1) != NULL)
		{
			if(strstr(line, "domain") == line)
			{
				fputs(line, fp2);
			}
		}
		if(strlen(dns.dnssrv))
		{
			sprintf(line, "nameserver\t%s\n", dns.dnssrv);
			fputs(line, fp2);
		}
		if(strlen(dns.dnssrv2))
		{
			sprintf(line, "nameserver\t%s\n", dns.dnssrv2);
			fputs(line, fp2);
		}
		flock(fileno(fp1), LOCK_UN);
		fclose(fp1);
		flock(fileno(fp2), LOCK_UN);
		fclose(fp2);
		remove(FILE_RESOLV_CONF);
		rename(FILE_RESOLV_CONF_TEMP, FILE_RESOLV_CONF);
		
		rc = sqlite_exec_printf(dbname, "update %s set dnssrv = %Q, dnssrv2 = %Q", 0, 0, 0, TABLE_DNS, dns.dnssrv, dns.dnssrv2);
		if(rc != SQLITE_OK)
		{
			cli_dns_exit(3);
		}
		
		if(strlen(dns.dnssrv2))
		{
			fw_log_write(FWLOG_DEV_MNG, LOG_NOTICE, "mod=%s act=set ip=\"%s %s\" result=0", progname, dns.dnssrv, dns.dnssrv2);
		}
		else
		{
			fw_log_write(FWLOG_DEV_MNG, LOG_NOTICE, "mod=%s act=set ip=%s result=0", progname, dns.dnssrv);
		}
	}

	else if(!strcmp(argv[1], "unset") && argc == 2)
	{
		if((fp1 = fopen(FILE_RESOLV_CONF, "w+")) == NULL)
		{
			cli_print_debug_msg("Error: open file \"%s\"\n", FILE_RESOLV_CONF);
			cli_dns_exit(3);
		}
		fclose(fp1);
		
		
		rc = sqlite_exec_printf(dbname, "update %s set dnssrv = '', dnssrv2 = ''", 0, 0, 0, TABLE_DNS);
		if(rc != SQLITE_OK)
		{
			cli_dns_exit(3);
		}
		
		fw_log_write(FWLOG_DEV_MNG, LOG_NOTICE, "mod=%s act=unset result=0", progname);
	}
	else if(!strcmp(argv[1], "show") && argc == 2)
	{
		rc = sqlite_get_table_printf(dbname, "select * from %s", &result, &nrow, &ncol, &errmsg, TABLE_DNS);
		if(rc != SQLITE_OK)
		{
			cli_dns_exit(3);
		}
		if(nrow > 0)
		{
			if(strlen(result[ncol]) || strlen(result[ncol + 1]))
			{
				printf("DNS 1: %s\n", result[ncol]);
				printf("DNS 2: %s\n", result[ncol + 1]);
			}
			else
			{
				printf("DNS are not set\n");
			}			
		}
	}

	else if(!strcmp(argv[1], "startup") && argc == 2)
	{
		rc = sqlite_get_table_printf(dbname, "select * from %s", &result, &nrow, &ncol, &errmsg, TABLE_DNS);
		if(rc != SQLITE_OK)
		{
			cli_dns_exit(3);
		}
		if(nrow > 0)
		{
			strcpy(dns.dnssrv, result[ncol]);
			strcpy(dns.dnssrv2, result[ncol + 1]);
		}
		
		if(strlen(dns.dnssrv))
		{
			if((fp1 = fopen(FILE_RESOLV_CONF, "r")) == NULL)
			{
				cli_print_debug_msg("Error: open file \"%s\"\n", FILE_RESOLV_CONF);
				cli_dns_exit(3);
			}
			flock(fileno(fp1), LOCK_EX);
			if((fp2 = fopen(FILE_RESOLV_CONF_TEMP, "w+")) == NULL)
			{
				cli_print_debug_msg("Error: open file \"%s\"\n", FILE_RESOLV_CONF_TEMP);
				cli_dns_exit(3);
			}
			flock(fileno(fp2), LOCK_EX);
			while(fgets(line, 256, fp1) != NULL)
			{
				if(strstr(line, "domain") == line)
				{
					fputs(line, fp2);
				}
			}
			if(strlen(dns.dnssrv))
			{
				sprintf(line, "nameserver\t%s\n", dns.dnssrv);
				fputs(line, fp2);
			}
			if(strlen(dns.dnssrv2))
			{
				sprintf(line, "nameserver\t%s\n", dns.dnssrv2);
				fputs(line, fp2);
			}
			flock(fileno(fp1), LOCK_UN);
			fclose(fp1);
			flock(fileno(fp2), LOCK_UN);
			fclose(fp2);
			remove(FILE_RESOLV_CONF);
			rename(FILE_RESOLV_CONF_TEMP, FILE_RESOLV_CONF);
		}
		

	}
	else
	{
		cli_dns_usage();
		cli_dns_exit(1);
	}
	sqlite_close(dbname);
	cli_dns_exit(0);
	exit(0);
}