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

📄 test6.c

📁 最新的sqlite3.6.2源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    pCrash->iSize = size;  }  return writeListAppend(pFile, size, 0, 0);}/*** Sync a crash-file.*/static int cfSync(sqlite3_file *pFile, int flags){  CrashFile *pCrash = (CrashFile *)pFile;  int isCrash = 0;  const char *zName = pCrash->zName;  const char *zCrashFile = g.zCrashFile;  int nName = strlen(zName);  int nCrashFile = strlen(zCrashFile);  if( nCrashFile>0 && zCrashFile[nCrashFile-1]=='*' ){    nCrashFile--;    if( nName>nCrashFile ) nName = nCrashFile;  }  if( nName==nCrashFile && 0==memcmp(zName, zCrashFile, nName) ){    if( (--g.iCrash)==0 ) isCrash = 1;  }  return writeListSync(pCrash, isCrash);}/*** Return the current file-size of the crash-file.*/static int cfFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){  CrashFile *pCrash = (CrashFile *)pFile;  *pSize = (i64)pCrash->iSize;  return SQLITE_OK;}/*** Calls related to file-locks are passed on to the real file handle.*/static int cfLock(sqlite3_file *pFile, int eLock){  return sqlite3OsLock(((CrashFile *)pFile)->pRealFile, eLock);}static int cfUnlock(sqlite3_file *pFile, int eLock){  return sqlite3OsUnlock(((CrashFile *)pFile)->pRealFile, eLock);}static int cfCheckReservedLock(sqlite3_file *pFile, int *pResOut){  return sqlite3OsCheckReservedLock(((CrashFile *)pFile)->pRealFile, pResOut);}static int cfFileControl(sqlite3_file *pFile, int op, void *pArg){  return sqlite3OsFileControl(((CrashFile *)pFile)->pRealFile, op, pArg);}/*** The xSectorSize() and xDeviceCharacteristics() functions return** the global values configured by the [sqlite_crashparams] tcl*  interface.*/static int cfSectorSize(sqlite3_file *pFile){  return g.iSectorSize;}static int cfDeviceCharacteristics(sqlite3_file *pFile){  return g.iDeviceCharacteristics;}static const sqlite3_io_methods CrashFileVtab = {  1,                            /* iVersion */  cfClose,                      /* xClose */  cfRead,                       /* xRead */  cfWrite,                      /* xWrite */  cfTruncate,                   /* xTruncate */  cfSync,                       /* xSync */  cfFileSize,                   /* xFileSize */  cfLock,                       /* xLock */  cfUnlock,                     /* xUnlock */  cfCheckReservedLock,          /* xCheckReservedLock */  cfFileControl,                /* xFileControl */  cfSectorSize,                 /* xSectorSize */  cfDeviceCharacteristics       /* xDeviceCharacteristics */};/*** Application data for the crash VFS*/struct crashAppData {  sqlite3_vfs *pOrig;                   /* Wrapped vfs structure */};/*** Open a crash-file file handle.**** The caller will have allocated pVfs->szOsFile bytes of space** at pFile. This file uses this space for the CrashFile structure** and allocates space for the "real" file structure using ** sqlite3_malloc(). The assumption here is (pVfs->szOsFile) is** equal or greater than sizeof(CrashFile).*/static int cfOpen(  sqlite3_vfs *pCfVfs,  const char *zName,  sqlite3_file *pFile,  int flags,  int *pOutFlags){  sqlite3_vfs *pVfs = (sqlite3_vfs *)pCfVfs->pAppData;  int rc;  CrashFile *pWrapper = (CrashFile *)pFile;  sqlite3_file *pReal = (sqlite3_file*)&pWrapper[1];  memset(pWrapper, 0, sizeof(CrashFile));  rc = sqlite3OsOpen(pVfs, zName, pReal, flags, pOutFlags);  if( rc==SQLITE_OK ){    i64 iSize;    pWrapper->pMethod = &CrashFileVtab;    pWrapper->zName = (char *)zName;    pWrapper->pRealFile = pReal;    rc = sqlite3OsFileSize(pReal, &iSize);    pWrapper->iSize = (int)iSize;  }  if( rc==SQLITE_OK ){    pWrapper->nData = (4096 + pWrapper->iSize);    pWrapper->zData = crash_malloc(pWrapper->nData);    if( pWrapper->zData ){      memset(pWrapper->zData, 0, pWrapper->nData);      rc = sqlite3OsRead(pReal, pWrapper->zData, pWrapper->iSize, 0);     }else{      rc = SQLITE_NOMEM;    }  }  if( rc!=SQLITE_OK && pWrapper->pMethod ){    sqlite3OsClose(pFile);  }  return rc;}static int cfDelete(sqlite3_vfs *pCfVfs, const char *zPath, int dirSync){  sqlite3_vfs *pVfs = (sqlite3_vfs *)pCfVfs->pAppData;  return pVfs->xDelete(pVfs, zPath, dirSync);}static int cfAccess(  sqlite3_vfs *pCfVfs,   const char *zPath,   int flags,   int *pResOut){  sqlite3_vfs *pVfs = (sqlite3_vfs *)pCfVfs->pAppData;  return pVfs->xAccess(pVfs, zPath, flags, pResOut);}static int cfFullPathname(  sqlite3_vfs *pCfVfs,   const char *zPath,   int nPathOut,  char *zPathOut){  sqlite3_vfs *pVfs = (sqlite3_vfs *)pCfVfs->pAppData;  return pVfs->xFullPathname(pVfs, zPath, nPathOut, zPathOut);}static void *cfDlOpen(sqlite3_vfs *pCfVfs, const char *zPath){  sqlite3_vfs *pVfs = (sqlite3_vfs *)pCfVfs->pAppData;  return pVfs->xDlOpen(pVfs, zPath);}static void cfDlError(sqlite3_vfs *pCfVfs, int nByte, char *zErrMsg){  sqlite3_vfs *pVfs = (sqlite3_vfs *)pCfVfs->pAppData;  pVfs->xDlError(pVfs, nByte, zErrMsg);}static void *cfDlSym(sqlite3_vfs *pCfVfs, void *pHandle, const char *zSymbol){  sqlite3_vfs *pVfs = (sqlite3_vfs *)pCfVfs->pAppData;  return pVfs->xDlSym(pVfs, pHandle, zSymbol);}static void cfDlClose(sqlite3_vfs *pCfVfs, void *pHandle){  sqlite3_vfs *pVfs = (sqlite3_vfs *)pCfVfs->pAppData;  pVfs->xDlClose(pVfs, pHandle);}static int cfRandomness(sqlite3_vfs *pCfVfs, int nByte, char *zBufOut){  sqlite3_vfs *pVfs = (sqlite3_vfs *)pCfVfs->pAppData;  return pVfs->xRandomness(pVfs, nByte, zBufOut);}static int cfSleep(sqlite3_vfs *pCfVfs, int nMicro){  sqlite3_vfs *pVfs = (sqlite3_vfs *)pCfVfs->pAppData;  return pVfs->xSleep(pVfs, nMicro);}static int cfCurrentTime(sqlite3_vfs *pCfVfs, double *pTimeOut){  sqlite3_vfs *pVfs = (sqlite3_vfs *)pCfVfs->pAppData;  return pVfs->xCurrentTime(pVfs, pTimeOut);}static int processDevSymArgs(  Tcl_Interp *interp,  int objc,  Tcl_Obj *CONST objv[],  int *piDeviceChar,  int *piSectorSize){  struct DeviceFlag {    char *zName;    int iValue;  } aFlag[] = {    { "atomic",      SQLITE_IOCAP_ATOMIC      },    { "atomic512",   SQLITE_IOCAP_ATOMIC512   },    { "atomic1k",    SQLITE_IOCAP_ATOMIC1K    },    { "atomic2k",    SQLITE_IOCAP_ATOMIC2K    },    { "atomic4k",    SQLITE_IOCAP_ATOMIC4K    },    { "atomic8k",    SQLITE_IOCAP_ATOMIC8K    },    { "atomic16k",   SQLITE_IOCAP_ATOMIC16K   },    { "atomic32k",   SQLITE_IOCAP_ATOMIC32K   },    { "atomic64k",   SQLITE_IOCAP_ATOMIC64K   },    { "sequential",  SQLITE_IOCAP_SEQUENTIAL  },    { "safe_append", SQLITE_IOCAP_SAFE_APPEND },    { 0, 0 }  };  int i;  int iDc = 0;  int iSectorSize = 0;  int setSectorsize = 0;  int setDeviceChar = 0;  for(i=0; i<objc; i+=2){    int nOpt;    char *zOpt = Tcl_GetStringFromObj(objv[i], &nOpt);    if( (nOpt>11 || nOpt<2 || strncmp("-sectorsize", zOpt, nOpt))      && (nOpt>16 || nOpt<2 || strncmp("-characteristics", zOpt, nOpt))    ){      Tcl_AppendResult(interp,         "Bad option: \"", zOpt,         "\" - must be \"-characteristics\" or \"-sectorsize\"", 0      );      return TCL_ERROR;    }    if( i==objc-1 ){      Tcl_AppendResult(interp, "Option requires an argument: \"", zOpt, "\"",0);      return TCL_ERROR;    }    if( zOpt[1]=='s' ){      if( Tcl_GetIntFromObj(interp, objv[i+1], &iSectorSize) ){        return TCL_ERROR;      }      setSectorsize = 1;    }else{      int j;      Tcl_Obj **apObj;      int nObj;      if( Tcl_ListObjGetElements(interp, objv[i+1], &nObj, &apObj) ){        return TCL_ERROR;      }      for(j=0; j<nObj; j++){        int rc;        int iChoice;        Tcl_Obj *pFlag = Tcl_DuplicateObj(apObj[j]);        Tcl_IncrRefCount(pFlag);        Tcl_UtfToLower(Tcl_GetString(pFlag));         rc = Tcl_GetIndexFromObjStruct(            interp, pFlag, aFlag, sizeof(aFlag[0]), "no such flag", 0, &iChoice        );        Tcl_DecrRefCount(pFlag);        if( rc ){          return TCL_ERROR;        }        iDc |= aFlag[iChoice].iValue;      }      setDeviceChar = 1;    }  }  if( setDeviceChar ){    *piDeviceChar = iDc;  }  if( setSectorsize ){    *piSectorSize = iSectorSize;  }  return TCL_OK;}/*** tclcmd:   sqlite_crash_enable ENABLE**** Parameter ENABLE must be a boolean value. If true, then the "crash"** vfs is added to the system. If false, it is removed.*/static int crashEnableCmd(  void * clientData,  Tcl_Interp *interp,  int objc,  Tcl_Obj *CONST objv[]){  int isEnable;  static sqlite3_vfs crashVfs = {    1,                  /* iVersion */    0,                  /* szOsFile */    0,                  /* mxPathname */    0,                  /* pNext */    "crash",            /* zName */    0,                  /* pAppData */      cfOpen,               /* xOpen */    cfDelete,             /* xDelete */    cfAccess,             /* xAccess */    cfFullPathname,       /* xFullPathname */    cfDlOpen,             /* xDlOpen */    cfDlError,            /* xDlError */    cfDlSym,              /* xDlSym */    cfDlClose,            /* xDlClose */    cfRandomness,         /* xRandomness */    cfSleep,              /* xSleep */    cfCurrentTime         /* xCurrentTime */  };  if( objc!=2 ){    Tcl_WrongNumArgs(interp, 1, objv, "ENABLE");    return TCL_ERROR;  }  if( Tcl_GetBooleanFromObj(interp, objv[1], &isEnable) ){    return TCL_ERROR;  }  if( (isEnable && crashVfs.pAppData) || (!isEnable && !crashVfs.pAppData) ){    return TCL_OK;  }  if( crashVfs.pAppData==0 ){    sqlite3_vfs *pOriginalVfs = sqlite3_vfs_find(0);    crashVfs.mxPathname = pOriginalVfs->mxPathname;    crashVfs.pAppData = (void *)pOriginalVfs;    crashVfs.szOsFile = sizeof(CrashFile) + pOriginalVfs->szOsFile;    sqlite3_vfs_register(&crashVfs, 0);  }else{    crashVfs.pAppData = 0;    sqlite3_vfs_unregister(&crashVfs);  }  return TCL_OK;}/*** tclcmd:   sqlite_crashparams ?OPTIONS? DELAY CRASHFILE**** This procedure implements a TCL command that enables crash testing** in testfixture.  Once enabled, crash testing cannot be disabled.**** Available options are "-characteristics" and "-sectorsize". Both require** an argument. For -sectorsize, this is the simulated sector size in** bytes. For -characteristics, the argument must be a list of io-capability** flags to simulate. Valid flags are "atomic", "atomic512", "atomic1K",** "atomic2K", "atomic4K", "atomic8K", "atomic16K", "atomic32K", ** "atomic64K", "sequential" and "safe_append".**** Example:****   sqlite_crashparams -sect 1024 -char {atomic sequential} ./test.db 1***/static int crashParamsObjCmd(  void * clientData,  Tcl_Interp *interp,  int objc,  Tcl_Obj *CONST objv[]){  int iDelay;  const char *zCrashFile;  int nCrashFile, iDc, iSectorSize;  iDc = -1;  iSectorSize = -1;  if( objc<3 ){    Tcl_WrongNumArgs(interp, 1, objv, "?OPTIONS? DELAY CRASHFILE");    goto error;  }  zCrashFile = Tcl_GetStringFromObj(objv[objc-1], &nCrashFile);  if( nCrashFile>=sizeof(g.zCrashFile) ){    Tcl_AppendResult(interp, "Filename is too long: \"", zCrashFile, "\"", 0);    goto error;  }  if( Tcl_GetIntFromObj(interp, objv[objc-2], &iDelay) ){    goto error;  }  if( processDevSymArgs(interp, objc-3, &objv[1], &iDc, &iSectorSize) ){    return TCL_ERROR;  }  if( iDc>=0 ){    g.iDeviceCharacteristics = iDc;  }  if( iSectorSize>=0 ){    g.iSectorSize = iSectorSize;  }  g.iCrash = iDelay;  memcpy(g.zCrashFile, zCrashFile, nCrashFile+1);  sqlite3CrashTestEnable = 1;  return TCL_OK;error:  return TCL_ERROR;}static int devSymObjCmd(  void * clientData,  Tcl_Interp *interp,  int objc,  Tcl_Obj *CONST objv[]){  void devsym_register(int iDeviceChar, int iSectorSize);  int iDc = -1;  int iSectorSize = -1;  if( processDevSymArgs(interp, objc-1, &objv[1], &iDc, &iSectorSize) ){    return TCL_ERROR;  }  devsym_register(iDc, iSectorSize);  return TCL_OK;}#endif /* SQLITE_OMIT_DISKIO *//*** This procedure registers the TCL procedures defined in this file.*/int Sqlitetest6_Init(Tcl_Interp *interp){#ifndef SQLITE_OMIT_DISKIO  Tcl_CreateObjCommand(interp, "sqlite3_crash_enable", crashEnableCmd, 0, 0);  Tcl_CreateObjCommand(interp, "sqlite3_crashparams", crashParamsObjCmd, 0, 0);  Tcl_CreateObjCommand(interp, "sqlite3_simulate_device", devSymObjCmd, 0, 0);#endif  return TCL_OK;}#endif /* SQLITE_TEST */

⌨️ 快捷键说明

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