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

📄 test1.c

📁 SQLite 2.8.6 源代码,用来在Linux/Unix/Windows上编译安装.它是一个小型的数据库,但是非常好用,速度也快,一般的数据库查询之类的操作据统计比MySQL,PostgreSQL
💻 C
📖 第 1 页 / 共 2 页
字号:
**** Call mprintf with two integer arguments and one string argument*/static int sqlite_mprintf_str(  void *NotUsed,  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */  int argc,              /* Number of arguments */  char **argv            /* Text of each argument */){  int a[3], i;  char *z;  if( argc<4 || argc>5 ){    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],       " FORMAT INT INT ?STRING?\"", 0);    return TCL_ERROR;  }  for(i=2; i<4; i++){    if( Tcl_GetInt(interp, argv[i], &a[i-2]) ) return TCL_ERROR;  }  z = sqlite_mprintf(argv[1], a[0], a[1], argc>4 ? argv[4] : NULL);  Tcl_AppendResult(interp, z, 0);  sqlite_freemem(z);  return TCL_OK;}/*** Usage:  sqlite_mprintf_str FORMAT INTEGER INTEGER DOUBLE**** Call mprintf with two integer arguments and one double argument*/static int sqlite_mprintf_double(  void *NotUsed,  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */  int argc,              /* Number of arguments */  char **argv            /* Text of each argument */){  int a[3], i;  double r;  char *z;  if( argc!=5 ){    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],       " FORMAT INT INT STRING\"", 0);    return TCL_ERROR;  }  for(i=2; i<4; i++){    if( Tcl_GetInt(interp, argv[i], &a[i-2]) ) return TCL_ERROR;  }  if( Tcl_GetDouble(interp, argv[4], &r) ) return TCL_ERROR;  z = sqlite_mprintf(argv[1], a[0], a[1], r);  Tcl_AppendResult(interp, z, 0);  sqlite_freemem(z);  return TCL_OK;}/*** Usage: sqlite_malloc_fail N**** Rig sqliteMalloc() to fail on the N-th call.  Turn off this mechanism** and reset the sqlite_malloc_failed variable is N==0.*/#ifdef MEMORY_DEBUGstatic int sqlite_malloc_fail(  void *NotUsed,  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */  int argc,              /* Number of arguments */  char **argv            /* Text of each argument */){  int n;  if( argc!=2 ){    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " N\"", 0);    return TCL_ERROR;  }  if( Tcl_GetInt(interp, argv[1], &n) ) return TCL_ERROR;  sqlite_iMallocFail = n;  sqlite_malloc_failed = 0;  return TCL_OK;}#endif/*** Usage: sqlite_malloc_stat**** Return the number of prior calls to sqliteMalloc() and sqliteFree().*/#ifdef MEMORY_DEBUGstatic int sqlite_malloc_stat(  void *NotUsed,  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */  int argc,              /* Number of arguments */  char **argv            /* Text of each argument */){  char zBuf[200];  sprintf(zBuf, "%d %d %d", sqlite_nMalloc, sqlite_nFree, sqlite_iMallocFail);  Tcl_AppendResult(interp, zBuf, 0);  return TCL_OK;}#endif/*** Usage:  sqlite_abort**** Shutdown the process immediately.  This is not a clean shutdown.** This command is used to test the recoverability of a database in** the event of a program crash.*/static int sqlite_abort(  void *NotUsed,  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */  int argc,              /* Number of arguments */  char **argv            /* Text of each argument */){  assert( interp==0 );   /* This will always fail */  return TCL_OK;}/*** The following routine is a user-defined SQL function whose purpose** is to test the sqlite_set_result() API.*/static void testFunc(sqlite_func *context, int argc, const char **argv){  while( argc>=2 ){    if( argv[0]==0 ){      sqlite_set_result_error(context, "first argument to test function "         "may not be NULL", -1);    }else if( sqliteStrICmp(argv[0],"string")==0 ){      sqlite_set_result_string(context, argv[1], -1);    }else if( argv[1]==0 ){      sqlite_set_result_error(context, "2nd argument may not be NULL if the "         "first argument is not \"string\"", -1);    }else if( sqliteStrICmp(argv[0],"int")==0 ){      sqlite_set_result_int(context, atoi(argv[1]));    }else if( sqliteStrICmp(argv[0],"double")==0 ){      sqlite_set_result_double(context, atof(argv[1]));    }else{      sqlite_set_result_error(context,"first argument should be one of: "          "string int double", -1);    }    argc -= 2;    argv += 2;  }}/*** Usage:   sqlite_register_test_function  DB  NAME**** Register the test SQL function on the database DB under the name NAME.*/static int test_register_func(  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;  int rc;  if( argc!=3 ){    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],        " DB FUNCTION-NAME", 0);    return TCL_ERROR;  }  if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR;  rc = sqlite_create_function(db, argv[2], -1, testFunc, 0);  if( rc!=0 ){    Tcl_AppendResult(interp, sqlite_error_string(rc), 0);    return TCL_ERROR;  }  return TCL_OK;}/*** This SQLite callback records the datatype of all columns.**** The pArg argument is really a pointer to a TCL interpreter.  The** column names are inserted as the result of this interpreter.**** This routine returns non-zero which causes the query to abort.*/static int rememberDataTypes(void *pArg, int nCol, char **argv, char **colv){  int i;  Tcl_Interp *interp = (Tcl_Interp*)pArg;  Tcl_Obj *pList, *pElem;  if( colv[nCol+1]==0 ){    return 1;  }  pList = Tcl_NewObj();  for(i=0; i<nCol; i++){    pElem = Tcl_NewStringObj(colv[i+nCol] ? colv[i+nCol] : "NULL", -1);    Tcl_ListObjAppendElement(interp, pList, pElem);  }  Tcl_SetObjResult(interp, pList);  return 1;}/*** Invoke an SQL statement but ignore all the data in the result.  Instead,** return a list that consists of the datatypes of the various columns.**** This only works if "PRAGMA show_datatypes=on" has been executed against** the database connection.*/static int sqlite_datatypes(  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;  int rc;  if( argc!=3 ){    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],        " DB SQL", 0);    return TCL_ERROR;  }  if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR;  rc = sqlite_exec(db, argv[2], rememberDataTypes, interp, 0);  if( rc!=0 && rc!=SQLITE_ABORT ){    Tcl_AppendResult(interp, sqlite_error_string(rc), 0);    return TCL_ERROR;  }  return TCL_OK;}/*** Usage:  sqlite_compile  DB  SQL  ?TAILVAR?**** Attempt to compile an SQL statement.  Return a pointer to the virtual** machine used to execute that statement.  Unprocessed SQL is written** into TAILVAR.*/static int test_compile(  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;  sqlite_vm *vm;  int rc;  char *zErr = 0;  const char *zTail;  char zBuf[50];  if( argc!=3 && argc!=4 ){    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],        " DB SQL TAILVAR", 0);    return TCL_ERROR;  }  if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR;  rc = sqlite_compile(db, argv[2], argc==4 ? &zTail : 0, &vm, &zErr);  if( argc==4 ) Tcl_SetVar(interp, argv[3], zTail, 0);  if( rc ){    assert( vm==0 );    sprintf(zBuf, "(%d) ", rc);    Tcl_AppendResult(interp, zBuf, zErr, 0);    sqlite_freemem(zErr);    return TCL_ERROR;  }  if( vm ){    if( makePointerStr(interp, zBuf, vm) ) return TCL_ERROR;    Tcl_AppendResult(interp, zBuf, 0);  }  return TCL_OK;}/*** Usage:  sqlite_step  VM  ?NVAR?  ?VALUEVAR?  ?COLNAMEVAR?**** Step a virtual machine.  Return a the result code as a string.** Column results are written into three variables.*/static int test_step(  void *NotUsed,  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */  int argc,              /* Number of arguments */  char **argv            /* Text of each argument */){  sqlite_vm *vm;  int rc, i;  const char **azValue = 0;  const char **azColName = 0;  int N = 0;  char *zRc;  char zBuf[50];  if( argc<2 || argc>5 ){    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],        " VM NVAR VALUEVAR COLNAMEVAR", 0);    return TCL_ERROR;  }  if( getVmPointer(interp, argv[1], &vm) ) return TCL_ERROR;  rc = sqlite_step(vm, argc>=3?&N:0, argc>=4?&azValue:0, argc==5?&azColName:0);  if( argc>=3 ){    sprintf(zBuf, "%d", N);    Tcl_SetVar(interp, argv[2], zBuf, 0);  }  if( argc>=4 ){    Tcl_SetVar(interp, argv[3], "", 0);    if( azValue ){      for(i=0; i<N; i++){        Tcl_SetVar(interp, argv[3], azValue[i] ? azValue[i] : "",            TCL_APPEND_VALUE | TCL_LIST_ELEMENT);      }    }  }  if( argc==5 ){    Tcl_SetVar(interp, argv[4], "", 0);    if( azColName ){      for(i=0; i<N*2; i++){        Tcl_SetVar(interp, argv[4], azColName[i] ? azColName[i] : "",            TCL_APPEND_VALUE | TCL_LIST_ELEMENT);      }    }  }  switch( rc ){    case SQLITE_DONE:   zRc = "SQLITE_DONE";    break;    case SQLITE_BUSY:   zRc = "SQLITE_BUSY";    break;    case SQLITE_ROW:    zRc = "SQLITE_ROW";     break;    case SQLITE_ERROR:  zRc = "SQLITE_ERROR";   break;    case SQLITE_MISUSE: zRc = "SQLITE_MISUSE";  break;    default:            zRc = "unknown";        break;  }  Tcl_AppendResult(interp, zRc, 0);  return TCL_OK;}/*** Usage:  sqlite_finalize  VM **** Shutdown a virtual machine.*/static int test_finalize(  void *NotUsed,  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */  int argc,              /* Number of arguments */  char **argv            /* Text of each argument */){  sqlite_vm *vm;  int rc;  char *zErrMsg = 0;  if( argc!=2 ){    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],        " VM\"", 0);    return TCL_ERROR;  }  if( getVmPointer(interp, argv[1], &vm) ) return TCL_ERROR;  rc = sqlite_finalize(vm, &zErrMsg);  if( rc ){    char zBuf[50];    sprintf(zBuf, "(%d) ", rc);    Tcl_AppendResult(interp, zBuf, zErrMsg, 0);    sqlite_freemem(zErrMsg);    return TCL_ERROR;  }  return TCL_OK;}/*** Usage:    breakpoint**** This routine exists for one purpose - to provide a place to put a** breakpoint with GDB that can be triggered using TCL code.  The use** for this is when a particular test fails on (say) the 1485th iteration.** In the TCL test script, we can add code like this:****     if {$i==1485} breakpoint**** Then run testfixture in the debugger and wait for the breakpoint to** fire.  Then additional breakpoints can be set to trace down the bug.*/static int test_breakpoint(  void *NotUsed,  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */  int argc,              /* Number of arguments */  char **argv            /* Text of each argument */){  return TCL_OK;         /* Do nothing */}/*** Register commands with the TCL interpreter.*/int Sqlitetest1_Init(Tcl_Interp *interp){  extern int sqlite_search_count;  extern int sqlite_open_file_count;  static struct {     char *zName;     Tcl_CmdProc *xProc;  } aCmd[] = {     { "sqlite_mprintf_int",             (Tcl_CmdProc*)sqlite_mprintf_int    },     { "sqlite_mprintf_str",             (Tcl_CmdProc*)sqlite_mprintf_str    },     { "sqlite_mprintf_double",          (Tcl_CmdProc*)sqlite_mprintf_double },     { "sqlite_mprintf_z_test",          (Tcl_CmdProc*)test_mprintf_z        },     { "sqlite_open",                    (Tcl_CmdProc*)sqlite_test_open      },     { "sqlite_last_insert_rowid",       (Tcl_CmdProc*)test_last_rowid       },     { "sqlite_exec_printf",             (Tcl_CmdProc*)test_exec_printf      },     { "sqlite_get_table_printf",        (Tcl_CmdProc*)test_get_table_printf },     { "sqlite_close",                   (Tcl_CmdProc*)sqlite_test_close     },     { "sqlite_create_function",         (Tcl_CmdProc*)test_create_function  },     { "sqlite_create_aggregate",        (Tcl_CmdProc*)test_create_aggregate },     { "sqlite_register_test_function",  (Tcl_CmdProc*)test_register_func    },     { "sqlite_abort",                   (Tcl_CmdProc*)sqlite_abort          },     { "sqlite_datatypes",               (Tcl_CmdProc*)sqlite_datatypes      },#ifdef MEMORY_DEBUG     { "sqlite_malloc_fail",             (Tcl_CmdProc*)sqlite_malloc_fail    },     { "sqlite_malloc_stat",             (Tcl_CmdProc*)sqlite_malloc_stat    },#endif     { "sqlite_compile",                 (Tcl_CmdProc*)test_compile          },     { "sqlite_step",                    (Tcl_CmdProc*)test_step             },     { "sqlite_finalize",                (Tcl_CmdProc*)test_finalize         },     { "breakpoint",                     (Tcl_CmdProc*)test_breakpoint       },  };  int i;  for(i=0; i<sizeof(aCmd)/sizeof(aCmd[0]); i++){    Tcl_CreateCommand(interp, aCmd[i].zName, aCmd[i].xProc, 0, 0);  }  Tcl_LinkVar(interp, "sqlite_search_count",       (char*)&sqlite_search_count, TCL_LINK_INT);  Tcl_LinkVar(interp, "sqlite_open_file_count",       (char*)&sqlite_open_file_count, TCL_LINK_INT);  return TCL_OK;}

⌨️ 快捷键说明

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