** File control method. For custom operations on an vfstrace-file. */
| 16370 | ** File control method. For custom operations on an vfstrace-file. |
| 16371 | */ |
| 16372 | static int vfstraceFileControl(sqlite3_file *pFile, int op, void *pArg){ |
| 16373 | vfstrace_file *p = (vfstrace_file *)pFile; |
| 16374 | vfstrace_info *pInfo = p->pInfo; |
| 16375 | int rc; |
| 16376 | char zBuf[100]; |
| 16377 | char zBuf2[100]; |
| 16378 | char *zOp; |
| 16379 | char *zRVal = 0; |
| 16380 | vfstraceOnOff(pInfo, VTR_FCTRL); |
| 16381 | switch( op ){ |
| 16382 | case SQLITE_FCNTL_LOCKSTATE: zOp = "LOCKSTATE"; break; |
| 16383 | case SQLITE_GET_LOCKPROXYFILE: zOp = "GET_LOCKPROXYFILE"; break; |
| 16384 | case SQLITE_SET_LOCKPROXYFILE: zOp = "SET_LOCKPROXYFILE"; break; |
| 16385 | case SQLITE_LAST_ERRNO: zOp = "LAST_ERRNO"; break; |
| 16386 | case SQLITE_FCNTL_SIZE_HINT: { |
| 16387 | sqlite3_snprintf(sizeof(zBuf), zBuf, "SIZE_HINT,%lld", |
| 16388 | *(sqlite3_int64*)pArg); |
| 16389 | zOp = zBuf; |
| 16390 | break; |
| 16391 | } |
| 16392 | case SQLITE_FCNTL_CHUNK_SIZE: { |
| 16393 | sqlite3_snprintf(sizeof(zBuf), zBuf, "CHUNK_SIZE,%d", *(int*)pArg); |
| 16394 | zOp = zBuf; |
| 16395 | break; |
| 16396 | } |
| 16397 | case SQLITE_FCNTL_FILE_POINTER: zOp = "FILE_POINTER"; break; |
| 16398 | case SQLITE_FCNTL_WIN32_AV_RETRY: zOp = "WIN32_AV_RETRY"; break; |
| 16399 | case SQLITE_FCNTL_PERSIST_WAL: { |
| 16400 | sqlite3_snprintf(sizeof(zBuf), zBuf, "PERSIST_WAL,%d", *(int*)pArg); |
| 16401 | zOp = zBuf; |
| 16402 | break; |
| 16403 | } |
| 16404 | case SQLITE_FCNTL_OVERWRITE: zOp = "OVERWRITE"; break; |
| 16405 | case SQLITE_FCNTL_VFSNAME: zOp = "VFSNAME"; break; |
| 16406 | case SQLITE_FCNTL_POWERSAFE_OVERWRITE: zOp = "POWERSAFE_OVERWRITE"; break; |
| 16407 | case SQLITE_FCNTL_PRAGMA: { |
| 16408 | const char *const* a = (const char*const*)pArg; |
| 16409 | if( a[1] && strcmp(a[1],"vfstrace")==0 && a[2] ){ |
| 16410 | const u8 *zArg = (const u8*)a[2]; |
| 16411 | if( zArg[0]>='0' && zArg[0]<='9' ){ |
| 16412 | pInfo->mTrace = (sqlite3_uint64)strtoll(a[2], 0, 0); |
| 16413 | }else{ |
| 16414 | static const struct { |
| 16415 | const char *z; |
| 16416 | unsigned int m; |
| 16417 | } aKw[] = { |
| 16418 | { "all", 0xffffffff }, |
| 16419 | { "close", VTR_CLOSE }, |
| 16420 | { "read", VTR_READ }, |
| 16421 | { "write", VTR_WRITE }, |
| 16422 | { "truncate", VTR_TRUNC }, |
| 16423 | { "sync", VTR_SYNC }, |
| 16424 | { "filesize", VTR_FSIZE }, |
| 16425 | { "lock", VTR_LOCK }, |
| 16426 | { "unlock", VTR_UNLOCK }, |
| 16427 | { "checkreservedlock", VTR_CRL }, |
| 16428 | { "filecontrol", VTR_FCTRL }, |
| 16429 | { "sectorsize", VTR_SECSZ }, |
nothing calls this directly
no test coverage detected