diff --git a/BUILD.gn b/BUILD.gn index 18d9f048764d46e2e274ce4a3fdc8de4c250e2f8..ff13f50f96c042d6935836f836d6a5736c10b1e4 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -65,6 +65,7 @@ ohos_shared_library("sqlite") { "OPENSSL_SUPPRESS_DEPRECATED", "LOG_DUMP", "FDSAN_ENABLE", + "HARMONY_OS", ] cflags_c = [ "-fvisibility=hidden", @@ -127,6 +128,7 @@ ohos_executable("sqlite3") { "OPENSSL_SUPPRESS_DEPRECATED", "LOG_DUMP", "FDSAN_ENABLE", + "HARMONY_OS", ] cflags = [ diff --git a/src/sqlite3.c b/src/sqlite3.c index 35ee1bd614a47cb39253fcf405ed94a52bfe26c9..21c0bea6e6e749db5e9d649fbc3346754700c45a 100644 --- a/src/sqlite3.c +++ b/src/sqlite3.c @@ -37128,6 +37128,30 @@ static pid_t randomnessPid = 0; #define F2FS_FEATURE_ATOMIC_WRITE 0x0004 #endif /* __linux__ */ +#ifdef HARMONY_OS +#define HMFS_MONITOR_FL 0x00000002 +#define HMFS_IOCTL_HW_GET_FLAGS _IOR(0xf5, 70, unsigned int) +#define HMFS_IOCTL_HW_SET_FLAGS _IOR(0xf5, 71, unsigned int) + +static void enableDbFileDelMonitor(int32_t fd) +{ + unsigned int flags = 0; + int ret = ioctl(fd, HMFS_IOCTL_HW_GET_FLAGS, &flags); + if (ret < 0) { + sqlite3_log(SQLITE_WARNING, "Not support fd %d enable del monitor errno = %d", fd, errno); + return; + } + if (flags & HMFS_MONITOR_FL) { + return; + } + flags |= HMFS_MONITOR_FL; + ret = ioctl(fd, HMFS_IOCTL_HW_SET_FLAGS, &flags); + if (ret < 0) { + sqlite3_log(SQLITE_WARNING, "Fd %d enable del monitor go wrong, errno = %d", fd, errno); + } +} + +#endif /* __HARMONY_OS__ */ /* ** Different Unix systems declare open() in different ways. Same use @@ -37143,6 +37167,9 @@ static int posixOpen(const char *zFile, int flags, int mode){ if ( fd > 0 && fdsan_get_owner_tag(fd) == 0 ) { fdsan_exchange_owner_tag(fd, 0, fdsan_create_owner_tag(FDSAN_OWNER_TYPE_FILE, SQLITE_FDSAN_TAG)); } +#endif +#ifdef HARMONY_OS + enableDbFileDelMonitor(fd); #endif return fd; } @@ -67178,6 +67205,8 @@ SQLITE_PRIVATE int sqlite3WalFrames( return rc; } +static sqlite3_int64 g_lastCkptTime = 0; + /* ** This routine is called to implement sqlite3_wal_checkpoint() and ** related interfaces. @@ -67302,13 +67331,10 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( pWal->ckptLock = 0; } #ifdef LOG_DUMP - sqlite3_log(SQLITE_NOTICE, - "checkpoint res[%d], szPage[%u], minFrame[%u], readOnly[%u], exclusiveMode[%d]", - rc, - pWal->szPage, - pWal->minFrame, - pWal->readOnly, - pWal->exclusiveMode); + if( rc ){ + sqlite3_log(SQLITE_NOTICE, "ckpt rc[%d]", rc); + } + sqlite3OsCurrentTimeInt64(db->pVfs, &g_lastCkptTime); #endif WALTRACE(("WAL%p: checkpoint %s\n", pWal, rc ? "failed" : "ok")); #ifdef SQLITE_ENABLE_SETLK_TIMEOUT @@ -70543,7 +70569,7 @@ static int decodeFlags(MemPage *pPage, int flagByte){ #ifdef LOG_DUMP sqlite3_log(SQLITE_CORRUPT, "database corruption at page[%u], flagByte[%x], isInit[%u], intKey[%u], intKeyLeaf[%u], leaf[%u], " - "childPtrSize[%u], cellOffset[%u], nCell[%u], hdrOffset[%u], minLocal, maxLocal[%u]", + "childPtrSize[%u], cellOffset[%u], nCell[%u], hdrOffset[%u], minLocal[%u], maxLocal[%u], last ckpt time[%lld]", pPage->pgno, flagByte, pPage->isInit, @@ -70555,7 +70581,8 @@ static int decodeFlags(MemPage *pPage, int flagByte){ pPage->nCell, pPage->hdrOffset, pPage->minLocal, - pPage->maxLocal); + pPage->maxLocal, + g_lastCkptTime); #endif return SQLITE_CORRUPT_PAGE(pPage); }