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

📄 test1.c

📁 sqlite数据库源码
💻 C
📖 第 1 页 / 共 3 页
字号:
  return 0;}/*** Implementation of the x_sqlite_exec() function.  This function takes** a single argument and attempts to execute that argument as SQL code.** This is illegal and should set the SQLITE_MISUSE flag on the database.**** 2004-Jan-07:  We have changed this to make it legal to call sqlite_exec()** from within a function call.  ** ** This routine simulates the effect of having two threads attempt to** use the same database at the same time.*/static void sqliteExecFunc(sqlite_func *context, int argc, const char **argv){  struct dstr x;  memset(&x, 0, sizeof(x));  sqlite_exec((sqlite*)sqlite_user_data(context), argv[0],       execFuncCallback, &x, 0);  sqlite_set_result_string(context, x.z, x.nUsed);  sqliteFree(x.z);}/*** Usage:  sqlite_test_create_function DB**** Call the sqlite_create_function API on the given database in order** to create a function named "x_coalesce".  This function does the same thing** as the "coalesce" function.  This function also registers an SQL function** named "x_sqlite_exec" that invokes sqlite_exec().  Invoking sqlite_exec()** in this way is illegal recursion and should raise an SQLITE_MISUSE error.** The effect is similar to trying to use the same database connection from** two threads at the same time.**** The original motivation for this routine was to be able to call the** sqlite_create_function function while a query is in progress in order** to test the SQLITE_MISUSE detection logic.*/static int test_create_function(  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;  extern void Md5_Register(sqlite*);  if( argc!=2 ){    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],       " FILENAME\"", 0);    return TCL_ERROR;  }  if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR;  sqlite_create_function(db, "x_coalesce", -1, ifnullFunc, 0);  sqlite_create_function(db, "x_sqlite_exec", 1, sqliteExecFunc, db);  return TCL_OK;}/*** Routines to implement the x_count() aggregate function.*/typedef struct CountCtx CountCtx;struct CountCtx {  int n;};static void countStep(sqlite_func *context, int argc, const char **argv){  CountCtx *p;  p = sqlite_aggregate_context(context, sizeof(*p));  if( (argc==0 || argv[0]) && p ){    p->n++;  }}   static void countFinalize(sqlite_func *context){  CountCtx *p;  p = sqlite_aggregate_context(context, sizeof(*p));  sqlite_set_result_int(context, p ? p->n : 0);}/*** Usage:  sqlite_test_create_aggregate DB**** Call the sqlite_create_function API on the given database in order** to create a function named "x_count".  This function does the same thing** as the "md5sum" function.**** The original motivation for this routine was to be able to call the** sqlite_create_aggregate function while a query is in progress in order** to test the SQLITE_MISUSE detection logic.*/static int test_create_aggregate(  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;  if( argc!=2 ){    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],       " FILENAME\"", 0);    return TCL_ERROR;  }  if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR;  sqlite_create_aggregate(db, "x_count", 0, countStep, countFinalize, 0);  sqlite_create_aggregate(db, "x_count", 1, countStep, countFinalize, 0);  return TCL_OK;}/*** Usage:  sqlite_mprintf_int FORMAT INTEGER INTEGER INTEGER**** Call mprintf with three integer arguments*/static int sqlite_mprintf_int(  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!=5 ){    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],       " FORMAT INT INT INT\"", 0);    return TCL_ERROR;  }  for(i=2; i<5; i++){    if( Tcl_GetInt(interp, argv[i], &a[i-2]) ) return TCL_ERROR;  }  z = sqlite_mprintf(argv[1], a[0], a[1], a[2]);  Tcl_AppendResult(interp, z, 0);  sqlite_freemem(z);  return TCL_OK;}/*** Usage:  sqlite_mprintf_str FORMAT INTEGER INTEGER STRING**** 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_mprintf_str FORMAT DOUBLE DOUBLE**** Call mprintf with a single double argument which is the product of the** two arguments given above.  This is used to generate overflow and underflow** doubles to test that they are converted properly.*/static int sqlite_mprintf_scaled(  void *NotUsed,  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */  int argc,              /* Number of arguments */  char **argv            /* Text of each argument */){  int i;  double r[2];  char *z;  if( argc!=4 ){    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],       " FORMAT DOUBLE DOUBLE\"", 0);    return TCL_ERROR;  }  for(i=2; i<4; i++){    if( Tcl_GetDouble(interp, argv[i], &r[i-2]) ) return TCL_ERROR;  }  z = sqlite_mprintf(argv[1], r[0]*r[1]);  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, sqliteAtoF(argv[1], 0));    }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.

⌨️ 快捷键说明

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