From 9c28e6bb935831b43b57f263ccd918744ed82ad1 Mon Sep 17 00:00:00 2001 From: Ammar Ahmed Date: Tue, 19 Nov 2024 16:11:47 +0500 Subject: [PATCH] mobile: fix build errors --- .../editor/tiptap/use-editor-events.tsx | 2 +- .../settings/editor/toolbar-definition.ts | 4 +- .../app/screens/settings/picker/pickers.jsx | 2 +- apps/mobile/native/android/app/build.gradle | 5 +- .../main/jniLibs/arm64-v8a/better-trigram.so | Bin 19616 -> 0 bytes .../jniLibs/armeabi-v7a/better-trigram.so | Bin 17972 -> 0 bytes .../src/main/jniLibs/x86/better-trigram.so | Bin 17248 -> 0 bytes .../src/main/jniLibs/x86_64/better-trigram.so | Bin 18752 -> 0 bytes apps/mobile/native/android/gradle.properties | 2 +- .../ios/BetterTrigram.xcframework/Info.plist | 40 - .../ios-arm64/better-trigram.dylib | Bin 50280 -> 0 bytes .../better-trigram.dylib | Bin 83608 -> 0 bytes .../ios/Notesnook.xcodeproj/project.pbxproj | 15 - apps/mobile/native/ios/Podfile | 2 +- apps/mobile/native/ios/Podfile.lock | 28 +- apps/mobile/native/package.json | 6 +- apps/mobile/native/polyfills/console-time.js | 2 +- apps/mobile/native/webpack.config.js | 1 + apps/mobile/package-lock.json | 30 +- apps/mobile/package.json | 3 +- .../react-native-quick-sqlite+8.0.6.patch | 3099 ++++++++++++++++- .../react-native-zip-archive+6.0.9.patch | 18 + 22 files changed, 3144 insertions(+), 115 deletions(-) delete mode 100644 apps/mobile/native/android/app/src/main/jniLibs/arm64-v8a/better-trigram.so delete mode 100644 apps/mobile/native/android/app/src/main/jniLibs/armeabi-v7a/better-trigram.so delete mode 100644 apps/mobile/native/android/app/src/main/jniLibs/x86/better-trigram.so delete mode 100644 apps/mobile/native/android/app/src/main/jniLibs/x86_64/better-trigram.so delete mode 100644 apps/mobile/native/ios/BetterTrigram.xcframework/Info.plist delete mode 100644 apps/mobile/native/ios/BetterTrigram.xcframework/ios-arm64/better-trigram.dylib delete mode 100644 apps/mobile/native/ios/BetterTrigram.xcframework/ios-arm64_x86_64-simulator/better-trigram.dylib create mode 100644 apps/mobile/patches/react-native-zip-archive+6.0.9.patch diff --git a/apps/mobile/app/screens/editor/tiptap/use-editor-events.tsx b/apps/mobile/app/screens/editor/tiptap/use-editor-events.tsx index bbead289a..fc098c3e5 100644 --- a/apps/mobile/app/screens/editor/tiptap/use-editor-events.tsx +++ b/apps/mobile/app/screens/editor/tiptap/use-editor-events.tsx @@ -21,7 +21,7 @@ along with this program. If not, see . /* eslint-disable @typescript-eslint/no-var-requires */ import { ItemReference } from "@notesnook/core"; import type { Attachment } from "@notesnook/editor"; -import { getDefaultPresets } from "@notesnook/editor/dist/esm/toolbar/tool-definitions"; +import { getDefaultPresets } from "@notesnook/editor/dist/cjs/toolbar/tool-definitions"; import Clipboard from "@react-native-clipboard/clipboard"; import React, { useCallback, useEffect, useRef } from "react"; import { diff --git a/apps/mobile/app/screens/settings/editor/toolbar-definition.ts b/apps/mobile/app/screens/settings/editor/toolbar-definition.ts index 724679f24..48fb8e2bc 100644 --- a/apps/mobile/app/screens/settings/editor/toolbar-definition.ts +++ b/apps/mobile/app/screens/settings/editor/toolbar-definition.ts @@ -17,12 +17,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -import { Icons } from "@notesnook/editor/dist/esm/toolbar/icons"; +import { Icons } from "@notesnook/editor/dist/cjs/toolbar/icons"; import { ToolbarGroupDefinition } from "@notesnook/editor"; import { getAllTools, getDefaultPresets -} from "@notesnook/editor/dist/esm/toolbar/tool-definitions"; +} from "@notesnook/editor/dist/cjs/toolbar/tool-definitions"; import { ToolId } from "@notesnook/editor"; export const tools = getAllTools() as any; diff --git a/apps/mobile/app/screens/settings/picker/pickers.jsx b/apps/mobile/app/screens/settings/picker/pickers.jsx index c65a18248..acc4b4bb1 100644 --- a/apps/mobile/app/screens/settings/picker/pickers.jsx +++ b/apps/mobile/app/screens/settings/picker/pickers.jsx @@ -18,7 +18,7 @@ along with this program. If not, see . */ import { DATE_FORMATS, TIME_FORMATS } from "@notesnook/core"; -import { getFontById, getFonts } from "@notesnook/editor/dist/esm/utils/font"; +import { getFontById, getFonts } from "@notesnook/editor/dist/cjs/utils/font"; import dayjs from "dayjs"; import { createSettingsPicker } from "."; import { db } from "../../../common/database"; diff --git a/apps/mobile/native/android/app/build.gradle b/apps/mobile/native/android/app/build.gradle index 031784277..85c8d0c98 100644 --- a/apps/mobile/native/android/app/build.gradle +++ b/apps/mobile/native/android/app/build.gradle @@ -164,10 +164,7 @@ android { } packagingOptions { - pickFirst 'lib/x86/libc++_shared.so' - pickFirst 'lib/x86_64/libc++_shared.so' - pickFirst 'lib/armeabi-v7a/libc++_shared.so' - pickFirst 'lib/arm64-v8a/libc++_shared.so' + pickFirst '**/libc++_shared.so' jniLibs { useLegacyPackaging isBuildingAAB == false } diff --git a/apps/mobile/native/android/app/src/main/jniLibs/arm64-v8a/better-trigram.so b/apps/mobile/native/android/app/src/main/jniLibs/arm64-v8a/better-trigram.so deleted file mode 100644 index 3c34d813296b781ee8d4eadd152e646d97cfc711..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19616 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 Y#pll>$v)+N@^hxSIga-;uD|^M1NWQKG5`Po diff --git a/apps/mobile/native/android/app/src/main/jniLibs/armeabi-v7a/better-trigram.so b/apps/mobile/native/android/app/src/main/jniLibs/armeabi-v7a/better-trigram.so deleted file mode 100644 index 95c37924e59b281801a29398d06249b04e2ea8e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17972 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 diff --git a/apps/mobile/native/android/app/src/main/jniLibs/x86_64/better-trigram.so b/apps/mobile/native/android/app/src/main/jniLibs/x86_64/better-trigram.so deleted file mode 100644 index fdc9641c81c6aef6fec74377ad66faecdd5b038d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18752 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 diff --git a/apps/mobile/native/android/gradle.properties b/apps/mobile/native/android/gradle.properties index 882bfa98f..3337a6405 100644 --- a/apps/mobile/native/android/gradle.properties +++ b/apps/mobile/native/android/gradle.properties @@ -16,7 +16,7 @@ org.gradle.jvmargs=-Xmx4096m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -org.gradle.configuration-cache=true +# org.gradle.configuration-cache=true # AndroidX package structure to make it clearer which packages are bundled with the # Android operating system, and which are packaged with your app's APK diff --git a/apps/mobile/native/ios/BetterTrigram.xcframework/Info.plist b/apps/mobile/native/ios/BetterTrigram.xcframework/Info.plist deleted file mode 100644 index 0a0fcf4cb..000000000 --- a/apps/mobile/native/ios/BetterTrigram.xcframework/Info.plist +++ /dev/null @@ -1,40 +0,0 @@ - - - - - AvailableLibraries - - - LibraryIdentifier - ios-arm64 - LibraryPath - better-trigram.dylib - SupportedArchitectures - - arm64 - - SupportedPlatform - ios - - - LibraryIdentifier - ios-arm64_x86_64-simulator - LibraryPath - better-trigram.dylib - SupportedArchitectures - - arm64 - x86_64 - - SupportedPlatform - ios - SupportedPlatformVariant - simulator - - - CFBundlePackageType - XFWK - XCFrameworkFormatVersion - 1.0 - - diff --git a/apps/mobile/native/ios/BetterTrigram.xcframework/ios-arm64/better-trigram.dylib b/apps/mobile/native/ios/BetterTrigram.xcframework/ios-arm64/better-trigram.dylib deleted file mode 100644 index 312cc5b892c261374fdac30481ed7bff1530a633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50280 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 m- 5.11.1) - - react-native-share-extension (3.0.0): + - react-native-share-extension (2.6.0): - React - - react-native-sodium (1.5.4): + - react-native-sodium (1.5.6): - React - react-native-theme-switch-animation (0.6.0): - DoubleConversion @@ -1305,7 +1303,7 @@ PODS: - React-Core - RNCMaskedView (0.2.9): - React-Core - - RNDateTimePicker (6.6.0): + - RNDateTimePicker (8.2.0): - React-Core - RNDeviceInfo (8.7.1): - React-Core @@ -1488,7 +1486,6 @@ DEPENDENCIES: - React-Mapbuffer (from `../../node_modules/react-native/ReactCommon`) - react-native-actions-shortcuts (from `../../node_modules/react-native-actions-shortcuts`) - react-native-background-actions (from `../../node_modules/react-native-background-actions`) - - react-native-begin-background-task (from `../../node_modules/react-native-begin-background-task`) - react-native-blob-util (from `../../node_modules/react-native-blob-util`) - react-native-config (from `../../node_modules/react-native-config`) - react-native-date-picker (from `../../node_modules/react-native-date-picker`) @@ -1645,8 +1642,6 @@ EXTERNAL SOURCES: :path: "../../node_modules/react-native-actions-shortcuts" react-native-background-actions: :path: "../../node_modules/react-native-background-actions" - react-native-begin-background-task: - :path: "../../node_modules/react-native-begin-background-task" react-native-blob-util: :path: "../../node_modules/react-native-blob-util" react-native-config: @@ -1838,12 +1833,11 @@ SPEC CHECKSUMS: React-Mapbuffer: 6c1cacdbf40b531f549eba249e531a7d0bfd8e7f react-native-actions-shortcuts: 5d9cf0c9c308333dfcc1e05c3f9afa8c428e2533 react-native-background-actions: 2c251c986f23347f9c1722f05fd296938f60edb1 - react-native-begin-background-task: 3b889e07458afc5822a7277cf9cbc7cd077e39ee react-native-blob-util: 2d36383bb52c15c5451be81cb7ddf22bc34a12a6 react-native-config: 86038147314e2e6d10ea9972022aa171e6b1d4d8 react-native-date-picker: 93e43b3084cea595b4d68b1405d6d99849663bd6 react-native-document-picker: ec07866a30707f23660c0f3ae591d669d3e89096 - react-native-fingerprint-scanner: be63e626b31fb951780a5fac5328b065a61a3d6e + react-native-fingerprint-scanner: 3e8c46641b5751a31f45e66789d4b6f342be5e6d react-native-get-random-values: dee677497c6a740b71e5612e8dbd83e7539ed5bb react-native-gzip: c5e87ee9e359f02350e3a2ee52eb35eddc398868 react-native-html-to-pdf-lite: 21bfb169bf4cbcd7bec9f736975ee1b3f5292d4a @@ -1855,11 +1849,11 @@ SPEC CHECKSUMS: react-native-notification-sounds: da78c828fe1bcbb92d8b505d5261890ed315ff39 react-native-orientation: f1caf84d65f1a4fd4511a18f2b924e634ad7a628 react-native-pdf: 33c622cbdf776a649929e8b9d1ce2d313347c4fa - react-native-quick-sqlite: e0e23b749382a85e4b57146f753de737a6c3a9e1 + react-native-quick-sqlite: 18e1367c34faac90e37f6eb3e78c196e9b674b5d react-native-safe-area-context: b7daa1a8df36095a032dff095a1ea8963cb48371 react-native-screenguard: 8b36a3df84c76cd2b82c477f71c26fa1c8cc14a0 - react-native-share-extension: faed334b1ddf165f1e576fcabd3dc1c9e748bfa9 - react-native-sodium: 955bb0dc3ea05f8ea06d5e96cb89d1be7b5d7681 + react-native-share-extension: 25437eb1039f7409be6e80a7edf8d02b42e1dc99 + react-native-sodium: 605c1523ec8ff5fbff5e9e7769bbacceb571a3c6 react-native-theme-switch-animation: d3eb50365a3829ce5572628888fa514752703f61 react-native-webview: 553abd09f58e340fdc7746c9e2ae096839e99911 React-nativeconfig: ba9a2e54e2f0882cf7882698825052793ed4c851 @@ -1890,7 +1884,7 @@ SPEC CHECKSUMS: RNCCheckbox: 43bcc6493611468af0e19f19f029dab3da8561c4 RNCClipboard: 3f0451a8100393908bea5c5c5b16f96d45f30bfc RNCMaskedView: 949696f25ec596bfc697fc88e6f95cf0c79669b6 - RNDateTimePicker: 818672afa85519722533d017b832ed09539d9ddb + RNDateTimePicker: 40ffda97d071a98a10fdca4fa97e3977102ccd14 RNDeviceInfo: aad3c663b25752a52bf8fce93f2354001dd185aa RNExitApp: c4e052df2568b43bec8a37c7cd61194d4cfee2c3 RNFileViewer: ce7ca3ac370e18554d35d6355cffd7c30437c592 @@ -1907,7 +1901,7 @@ SPEC CHECKSUMS: RNShare: a5dc3b9c53ddc73e155b8cd9a94c70c91913c43c RNSVG: d7d7bc8229af3842c9cfc3a723c815a52cdd1105 RNTooltips: 5424d4bf0b3d441104127943b1115cc7f0616b1f - RNZipArchive: 68a0c6db4b1c103f846f1559622050df254a3ade + RNZipArchive: 9d90367b1573903b5561a8c0b911e5cc12626e74 SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d SexyTooltip: 5c9b4dec52bfb317938cb0488efd9da3717bb6fd SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d @@ -1917,6 +1911,6 @@ SPEC CHECKSUMS: toolbar-android: 2a73856e98b750d7e71ce4644d3f41cc98211719 Yoga: 2246eea72aaf1b816a68a35e6e4b74563653ae09 -PODFILE CHECKSUM: 98f600b3236e314680588e77819982573fb4d9f7 +PODFILE CHECKSUM: aa07aca16c1d92394d8ce12f2c5fcaa8a3ae4997 COCOAPODS: 1.15.2 diff --git a/apps/mobile/native/package.json b/apps/mobile/native/package.json index 9dacbbe0b..70ed11886 100644 --- a/apps/mobile/native/package.json +++ b/apps/mobile/native/package.json @@ -14,7 +14,6 @@ "@callstack/repack": "^4.1.1", "@react-native-clipboard/clipboard": "^1.9.0", "@react-native-community/checkbox": "^0.5.8", - "@react-native-community/datetimepicker": "6.6.0", "@react-native-community/netinfo": "^9.3.7", "@react-native-community/toolbar-android": "^0.2.1", "@react-native-masked-view/masked-view": "^0.2.6", @@ -50,7 +49,6 @@ "react-native-iap": "12.15.1", "react-native-in-app-review": "4.3.3", "react-native-keychain": "4.0.5", - "react-native-mmkv-storage": "^0.10.2", "react-native-modal-datetime-picker": "14.0.0", "react-native-navigation-bar-color": "2.0.2", "react-native-notification-sounds": "0.5.5", @@ -74,7 +72,9 @@ "@formatjs/intl-pluralrules": "5.2.14", "detox": "^20.27.6", "@ammarahmed/react-native-share-extension": "^2.6.0", - "@ammarahmed/react-native-sodium": "1.5.6" + "@ammarahmed/react-native-sodium": "1.5.6", + "react-native-mmkv-storage": "^0.10.2", + "@react-native-community/datetimepicker": "^8.2.0" }, "devDependencies": { "@babel/core": "^7.20.0", diff --git a/apps/mobile/native/polyfills/console-time.js b/apps/mobile/native/polyfills/console-time.js index 864983bf9..6d52e08cb 100644 --- a/apps/mobile/native/polyfills/console-time.js +++ b/apps/mobile/native/polyfills/console-time.js @@ -2,7 +2,7 @@ const PerformanceNow = (global.performance && global.performance.now) || global.performanceNow || global.nativePerformanceNow || (() => { try { - var now = require('fbjs/lib/performanceNow') + var now = __DEV__ ? require('fbjs/lib/performanceNow') : () => Date.now() } finally { return now }})(); const DEFAULT_LABEL = 'default'; diff --git a/apps/mobile/native/webpack.config.js b/apps/mobile/native/webpack.config.js index 5c7d08ac9..3f64d3568 100644 --- a/apps/mobile/native/webpack.config.js +++ b/apps/mobile/native/webpack.config.js @@ -217,6 +217,7 @@ module.exports = (env) => { /node_modules(.*[/\\])+@tanstack[/\\]react-query/, /node_modules(.*[/\\])+@trpc[/\\]react-query/, /node_modules(.*[/\\])+katex/, + /node_modules(.*[/\\])+mime/, /node_modules(.*[/\\])+@notesnook[/\\]core/, /node_modules(.*[/\\])+whatwg-url-without-unicode/, /node_modules(.*[/\\])+whatwg-url/, diff --git a/apps/mobile/package-lock.json b/apps/mobile/package-lock.json index d9ca94cc9..10dceb429 100644 --- a/apps/mobile/package-lock.json +++ b/apps/mobile/package-lock.json @@ -1,12 +1,12 @@ { "name": "@notesnook/mobile", - "version": "3.0.18", + "version": "3.0.21", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@notesnook/mobile", - "version": "3.0.18", + "version": "3.0.21", "hasInstallScript": true, "license": "GPL-3.0-or-later", "workspaces": [ @@ -22,6 +22,7 @@ "@notesnook/logger": "file:../../packages/logger", "@notesnook/theme": "file:../../packages/theme", "@notesnook/themes-server": "file:../../servers/themes", + "@react-native-community/datetimepicker": "^8.2.0", "diffblazer": "^1.0.1", "react": "18.2.0", "react-native": "0.74.5", @@ -29010,7 +29011,6 @@ "@formatjs/intl-pluralrules": "5.2.14", "@react-native-clipboard/clipboard": "^1.9.0", "@react-native-community/checkbox": "^0.5.8", - "@react-native-community/datetimepicker": "6.6.0", "@react-native-community/netinfo": "^9.3.7", "@react-native-community/toolbar-android": "^0.2.1", "@react-native-masked-view/masked-view": "^0.2.6", @@ -33296,10 +33296,25 @@ } }, "node_modules/@react-native-community/datetimepicker": { - "version": "6.6.0", - "license": "MIT", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@react-native-community/datetimepicker/-/datetimepicker-8.2.0.tgz", + "integrity": "sha512-qrUPhiBvKGuG9Y+vOqsc56RPFcHa1SU2qbAMT0hfGkoFIj3FodE0VuPVrEa8fgy7kcD5NQmkZIKgHOBLV0+hWg==", "dependencies": { "invariant": "^2.2.4" + }, + "peerDependencies": { + "expo": ">=50.0.0", + "react": "*", + "react-native": "*", + "react-native-windows": "*" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + }, + "react-native-windows": { + "optional": true + } } }, "node_modules/@react-native-community/netinfo": { @@ -40217,11 +40232,6 @@ "regenerator-runtime": "^0.13.3" } }, - "node_modules/jimp/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, "node_modules/joi": { "version": "17.9.2", "license": "BSD-3-Clause", diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 45c8d3278..d9eeaf9dd 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -46,7 +46,6 @@ "diffblazer": "^1.0.1", "react": "18.2.0", "react-native": "0.74.5", - "react-native-actions-sheet": "^0.9.7", - "react-native-mmkv-storage": "^0.10.2" + "react-native-actions-sheet": "^0.9.7" } } diff --git a/apps/mobile/patches/react-native-quick-sqlite+8.0.6.patch b/apps/mobile/patches/react-native-quick-sqlite+8.0.6.patch index 0c3a45581..a4b951e0f 100644 --- a/apps/mobile/patches/react-native-quick-sqlite+8.0.6.patch +++ b/apps/mobile/patches/react-native-quick-sqlite+8.0.6.patch @@ -1,6 +1,7 @@ diff --git a/node_modules/react-native-quick-sqlite/.DS_Store b/node_modules/react-native-quick-sqlite/.DS_Store new file mode 100644 -index 0000000..e69de29 +index 0000000..027f75e +Binary files /dev/null and b/node_modules/react-native-quick-sqlite/.DS_Store differ diff --git a/node_modules/react-native-quick-sqlite/android/.settings/org.eclipse.buildship.core.prefs b/node_modules/react-native-quick-sqlite/android/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index 8c253d6..0000000 @@ -20,6 +21,49 @@ index 8c253d6..0000000 -override.workspace.settings=true -show.console.view=true -show.executions.view=true +diff --git a/node_modules/react-native-quick-sqlite/android/CMakeLists.txt b/node_modules/react-native-quick-sqlite/android/CMakeLists.txt +index 6013234..e902969 100644 +--- a/node_modules/react-native-quick-sqlite/android/CMakeLists.txt ++++ b/node_modules/react-native-quick-sqlite/android/CMakeLists.txt +@@ -1,17 +1,17 @@ + project(ReactNativeQuickSQLite) + cmake_minimum_required(VERSION 3.9.0) + +-set (PACKAGE_NAME "react-native-quick-sqlite") +-set (CMAKE_VERBOSE_MAKEFILE ON) +-set (CMAKE_CXX_STANDARD 17) +-set (BUILD_DIR ${CMAKE_SOURCE_DIR}/build) ++set(PACKAGE_NAME "react-native-quick-sqlite") ++set(CMAKE_VERBOSE_MAKEFILE ON) ++set(CMAKE_CXX_STANDARD 17) ++set(BUILD_DIR ${CMAKE_SOURCE_DIR}/build) + + include_directories( + ../cpp + ) + + add_definitions( +- ${SQLITE_FLAGS} ++ ${SQLITE_FLAGS} -DSQLITE_CORE + ) + + add_library( +@@ -32,6 +32,7 @@ add_library( + ../cpp/sqlbatchexecutor.h + ../cpp/sqlbatchexecutor.cpp + ../cpp/macros.h ++ ../better-trigram/better-trigram.c + cpp-adapter.cpp + ) + +@@ -46,7 +47,6 @@ find_package(ReactAndroid REQUIRED CONFIG) + find_package(fbjni REQUIRED CONFIG) + find_library(LOG_LIB log) + +- + target_link_libraries( + ${PACKAGE_NAME} + ${LOG_LIB} diff --git a/node_modules/react-native-quick-sqlite/android/build.gradle b/node_modules/react-native-quick-sqlite/android/build.gradle index 96d2a74..c26e678 100644 --- a/node_modules/react-native-quick-sqlite/android/build.gradle @@ -33,6 +77,2610 @@ index 96d2a74..c26e678 100644 targetSdkVersion safeExtGet('targetSdkVersion', 28) versionCode 1 versionName "1.0" +diff --git a/node_modules/react-native-quick-sqlite/better-trigram/.github/workflows/release.yml b/node_modules/react-native-quick-sqlite/better-trigram/.github/workflows/release.yml +new file mode 100644 +index 0000000..e070b8f +--- /dev/null ++++ b/node_modules/react-native-quick-sqlite/better-trigram/.github/workflows/release.yml +@@ -0,0 +1,252 @@ ++name: "Release" ++on: ++ release: ++ types: [published] ++permissions: ++ contents: read ++ ++jobs: ++ build-linux-x86_64-extension: ++ runs-on: ubuntu-20.04 ++ steps: ++ - uses: actions/checkout@v4 ++ - run: make loadable ++ - uses: actions/upload-artifact@v4 ++ with: ++ name: sqlite-better-trigram-linux-x86_64-extension ++ path: dist/* ++ build-linux-aarch64-extension: ++ runs-on: ubuntu-20.04 ++ steps: ++ - uses: actions/checkout@v4 ++ - uses: korandoru/setup-zig@v1 ++ with: ++ zig-version: 0.13.0 # released versions or master ++ - run: make CC="zig cc -target aarch64-linux-gnu" loadable ++ - uses: actions/upload-artifact@v4 ++ with: ++ name: sqlite-better-trigram-linux-aarch64-extension ++ path: dist/* ++ build-macos-x86_64-extension: ++ runs-on: macos-12 ++ steps: ++ - uses: actions/checkout@v4 ++ - run: make loadable ++ - uses: actions/upload-artifact@v4 ++ with: ++ name: sqlite-better-trigram-macos-x86_64-extension ++ path: dist/* ++ build-macos-aarch64-extension: ++ runs-on: macos-14 ++ steps: ++ - uses: actions/checkout@v4 ++ - run: make loadable ++ - uses: actions/upload-artifact@v4 ++ with: ++ name: sqlite-better-trigram-macos-aarch64-extension ++ path: dist/* ++ build-windows-x86_64-extension: ++ runs-on: windows-2019 ++ permissions: ++ contents: write ++ steps: ++ - uses: actions/checkout@v4 ++ - uses: ilammy/msvc-dev-cmd@v1 ++ - run: nmake /f Makefile.vc loadable ++ - uses: actions/upload-artifact@v4 ++ with: ++ name: sqlite-better-trigram-windows-x86_64-extension ++ path: dist/* ++ build-windows-aarch64-extension: ++ runs-on: windows-2019 ++ permissions: ++ contents: write ++ steps: ++ - uses: actions/checkout@v4 ++ - uses: ilammy/msvc-dev-cmd@v1 ++ with: ++ arch: amd64_arm64 ++ - run: nmake /f Makefile.vc loadable ++ - uses: actions/upload-artifact@v4 ++ with: ++ name: sqlite-better-trigram-windows-aarch64-extension ++ path: dist/* ++ build-android-extensions: ++ runs-on: ubuntu-latest ++ strategy: ++ matrix: ++ platforms: ++ [ ++ { name: android-aarch64, cc: aarch64-linux-android21-clang }, ++ { name: android-i686, cc: i686-linux-android21-clang }, ++ { name: android-x86_64, cc: x86_64-linux-android21-clang }, ++ { name: android-armv7a, cc: armv7a-linux-androideabi21-clang }, ++ ] ++ steps: ++ - uses: actions/checkout@v4 ++ - uses: actions/setup-java@v4 ++ with: ++ java-version: "17" ++ distribution: "temurin" ++ - uses: android-actions/setup-android@v3 ++ - run: | ++ sdkmanager --install "ndk;27.0.12077973" ++ echo "ANDROID_NDK_HOME=$ANDROID_SDK_ROOT/ndk/27.0.12077973" >> $GITHUB_ENV ++ - run: | ++ ls $ANDROID_NDK_HOME/toolchains/llvm/prebuilt/ ++ ls $ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin ++ - run: | ++ export PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH ++ make CC=${{ matrix.platforms.cc }} \ ++ AR=llvm-ar \ ++ RANLIB=llvm-ranlib \ ++ STRIP=llvm-strip loadable ++ - uses: actions/upload-artifact@v4 ++ with: ++ name: sqlite-better-trigram-${{ matrix.platforms.name }}-extension ++ path: dist/*.so ++ build-ios-extensions: ++ runs-on: ${{ matrix.platforms.runner }} ++ strategy: ++ fail-fast: false ++ matrix: ++ platforms: [ ++ { ++ name: ios-aarch64, ++ target: arm64-apple-ios, ++ sdk: iphoneos, ++ runner: macos-14, ++ }, ++ #{ ++ # name: ios-x86_64, ++ # target: x86_64-apple-ios, ++ # sdk: iphoneos, ++ # runner: macos-12, ++ #}, ++ { ++ name: iossimulator-aarch64, ++ target: arm64-apple-ios-simulator, ++ sdk: iphonesimulator, ++ runner: macos-14, ++ }, ++ { ++ name: iossimulator-x86_64, ++ target: x86_64-apple-ios-simulator, ++ sdk: iphonesimulator, ++ runner: macos-14, ++ }, ++ ] ++ steps: ++ - uses: actions/checkout@v4 ++ - uses: maxim-lobanov/setup-xcode@v1 ++ with: ++ xcode-version: latest-stable ++ ++ - run: make CFLAGS="-target ${{ matrix.platforms.target }} -isysroot $(xcrun -sdk ${{ matrix.platforms.sdk }} --show-sdk-path) -fembed-bitcode -DNDEBUG=1" loadable ++ - uses: actions/upload-artifact@v4 ++ with: ++ name: sqlite-better-trigram-${{ matrix.platforms.name }}-extension ++ path: dist/* ++ ++ dist: ++ runs-on: ubuntu-latest ++ needs: ++ [ ++ build-linux-x86_64-extension, ++ build-linux-aarch64-extension, ++ build-macos-x86_64-extension, ++ build-macos-aarch64-extension, ++ build-windows-x86_64-extension, ++ build-windows-aarch64-extension, ++ build-android-extensions, ++ build-ios-extensions, ++ ] ++ permissions: ++ contents: write ++ steps: ++ - uses: actions/checkout@v4 ++ ++ - uses: actions/download-artifact@v4 ++ with: ++ name: sqlite-better-trigram-linux-x86_64-extension ++ path: dist/linux-x86_64 ++ - uses: actions/download-artifact@v4 ++ with: ++ name: sqlite-better-trigram-linux-aarch64-extension ++ path: dist/linux-aarch64 ++ - uses: actions/download-artifact@v4 ++ with: ++ name: sqlite-better-trigram-macos-x86_64-extension ++ path: dist/macos-x86_64 ++ - uses: actions/download-artifact@v4 ++ with: ++ name: sqlite-better-trigram-macos-aarch64-extension ++ path: dist/macos-aarch64 ++ - uses: actions/download-artifact@v4 ++ with: ++ name: sqlite-better-trigram-windows-x86_64-extension ++ path: dist/windows-x86_64 ++ - uses: actions/download-artifact@v4 ++ with: ++ name: sqlite-better-trigram-windows-aarch64-extension ++ path: dist/windows-aarch64 ++ - uses: actions/download-artifact@v4 ++ with: ++ name: sqlite-better-trigram-android-aarch64-extension ++ path: dist/android-aarch64 ++ - uses: actions/download-artifact@v4 ++ with: ++ name: sqlite-better-trigram-android-i686-extension ++ path: dist/android-i686 ++ - uses: actions/download-artifact@v4 ++ with: ++ name: sqlite-better-trigram-android-x86_64-extension ++ path: dist/android-x86_64 ++ - uses: actions/download-artifact@v4 ++ with: ++ name: sqlite-better-trigram-android-armv7a-extension ++ path: dist/android-armv7a ++ - uses: actions/download-artifact@v4 ++ with: ++ name: sqlite-better-trigram-android-armv7a-extension ++ path: dist/android-armv7a ++ - uses: actions/download-artifact@v4 ++ with: ++ name: sqlite-better-trigram-ios-aarch64-extension ++ path: dist/ios-aarch64 ++ - uses: actions/download-artifact@v4 ++ with: ++ name: sqlite-better-trigram-iossimulator-aarch64-extension ++ path: dist/iossimulator-aarch64 ++ - uses: actions/download-artifact@v4 ++ with: ++ name: sqlite-better-trigram-iossimulator-x86_64-extension ++ path: dist/iossimulator-x86_64 ++ - run: | ++ curl -L https://github.com/asg017/sqlite-dist/releases/download/v0.0.1-alpha.17/sqlite-dist-x86_64-unknown-linux-gnu.tar.xz \ ++ | tar xfJ - --strip-components 1 ++ - run: ./sqlite-dist ./sqlite-dist.toml --input dist/ --output distx/ --version $(cat VERSION) ++ - run: | ++ gh release upload --clobber ${{ github.ref_name }} \ ++ distx/amalgamation/* \ ++ distx/github_releases/* \ ++ distx/checksums.txt \ ++ distx/sqlite-dist-manifest.json \ ++ distx/install.sh ++ env: ++ GH_TOKEN: ${{ github.token }} ++ - name: Install node ++ uses: actions/setup-node@v3 ++ with: ++ node-version: "16" ++ registry-url: "https://registry.npmjs.org" ++ - run: | ++ npm publish --access public distx/npm/sqlite-better-trigram-darwin-arm64.tar.gz ++ npm publish --access public distx/npm/sqlite-better-trigram-darwin-x64.tar.gz ++ npm publish --access public distx/npm/sqlite-better-trigram-linux-x64.tar.gz ++ npm publish --access public distx/npm/sqlite-better-trigram-linux-arm64.tar.gz ++ npm publish --access public distx/npm/sqlite-better-trigram-windows-x64.tar.gz ++ npm publish --access public distx/npm/sqlite-better-trigram-windows-arm64.tar.gz ++ npm publish --access public distx/npm/sqlite-better-trigram.tar.gz ++ env: ++ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} +diff --git a/node_modules/react-native-quick-sqlite/better-trigram/.github/workflows/test.yml b/node_modules/react-native-quick-sqlite/better-trigram/.github/workflows/test.yml +new file mode 100644 +index 0000000..84ee7c1 +--- /dev/null ++++ b/node_modules/react-native-quick-sqlite/better-trigram/.github/workflows/test.yml +@@ -0,0 +1,68 @@ ++name: Test ++ ++on: ++ workflow_dispatch: ++ push: ++ branch: "master" ++ pull_request: ++ types: ++ - "ready_for_review" ++ - "opened" ++ - "synchronize" ++ - "reopened" ++ ++jobs: ++ test-linux: ++ name: Test Linux ++ runs-on: ubuntu-latest ++ steps: ++ - name: Checkout ++ uses: actions/checkout@v3 ++ ++ - name: Install dependencies ++ run: | ++ sudo apt install lemon tcl ++ ++ - name: Install bun ++ uses: oven-sh/setup-bun@v2 ++ ++ - name: Run tests ++ run: make test ++ ++ test-windows: ++ name: Test Windows ++ runs-on: windows-latest ++ steps: ++ - name: Checkout ++ uses: actions/checkout@v3 ++ ++ - name: Install bun ++ uses: oven-sh/setup-bun@v2 ++ ++ - uses: ilammy/msvc-dev-cmd@v1 ++ ++ - name: Run tests ++ run: nmake /f Makefile.vc test ++ ++ test-macos: ++ name: Test macOS ++ runs-on: macos-latest ++ steps: ++ - name: Checkout ++ uses: actions/checkout@v3 ++ ++ - name: Install dependencies ++ run: | ++ brew install lemon ++ brew install tcl-tk ++ brew tap-new $USER/local-sqlite ++ brew extract --version=3.46.1 sqlite $USER/local-sqlite ++ brew install sqlite@3.46.1 ++ ++ - name: Install bun ++ uses: oven-sh/setup-bun@v2 ++ ++ - name: Run tests ++ run: | ++ export SQLITE_LIB_PATH=/opt/homebrew/Cellar/sqlite@3.46.1/3.46.1/lib/libsqlite3.dylib ++ make test +diff --git a/node_modules/react-native-quick-sqlite/better-trigram/.gitignore b/node_modules/react-native-quick-sqlite/better-trigram/.gitignore +new file mode 100644 +index 0000000..0029ea5 +--- /dev/null ++++ b/node_modules/react-native-quick-sqlite/better-trigram/.gitignore +@@ -0,0 +1,10 @@ ++*.so ++deps/ ++cache/ ++*.dll ++*.obj ++*.exp ++*.lib ++*.exe ++lempar.c ++dist/ +\ No newline at end of file +diff --git a/node_modules/react-native-quick-sqlite/better-trigram/Makefile b/node_modules/react-native-quick-sqlite/better-trigram/Makefile +new file mode 100644 +index 0000000..9999050 +--- /dev/null ++++ b/node_modules/react-native-quick-sqlite/better-trigram/Makefile +@@ -0,0 +1,57 @@ ++EXT = .so ++SQLITE_VERSION ?= version-3.46.1 ++ ++SQLITE_TARBALL_URL = https://www.sqlite.org/src/tarball/sqlite.tar.gz?r=${SQLITE_VERSION} ++SQLITE_SRC = deps/$(SQLITE_VERSION)/src ++SQLITE_AMALGAMATION_URL = https://sqlite.org/2024/sqlite-amalgamation-3460100.zip ++SQLITE_AMALGAMATION_PATH = deps/sqlite-amalgamation-3460100 ++ ++override CFLAGS += -Ideps/$(SQLITE_VERSION)/ext/fts5 -I$(SQLITE_AMALGAMATION_PATH) -Os -Wall -Wextra ++CONDITIONAL_CFLAGS = -lm ++ ++UNAME_S := $(shell uname -s) ++ifeq ($(UNAME_S),Darwin) ++ EXT = .dylib ++endif ++ ++.PHONY: all clean test ++ ++prefix=dist ++$(prefix): ++ mkdir -p $(prefix) ++ ++TARGET_LOADABLE=$(prefix)/better-trigram$(EXT) ++TARGET_FTS5=$(prefix)/fts5$(EXT) ++ ++all: test loadable ++loadable: $(TARGET_LOADABLE) ++ ++clean: ++ rm -rf deps ++ rm -rf $(prefix) ++ ++$(SQLITE_SRC): ++ mkdir -p deps/$(SQLITE_VERSION) ++ curl -LsS $(SQLITE_TARBALL_URL) | tar -xzf - -C deps/$(SQLITE_VERSION)/ --strip-components=1 ++ ++$(SQLITE_AMALGAMATION_PATH): ++ @echo Downloading SQLite amalgamation... ++ wget -q $(SQLITE_AMALGAMATION_URL) -O sqlite.zip ++ @echo Extracting SQLite amalgamation... ++ unzip sqlite.zip -d deps/ ++ rm -f sqlite.zip ++ ++$(TARGET_LOADABLE): $(SQLITE_SRC) $(SQLITE_AMALGAMATION_PATH) $(prefix) ++ $(CC) $(CFLAGS) $(CONDITIONAL_CFLAGS) -shared -fPIC -o $@ better-trigram.c ++ ++$(TARGET_FTS5): $(SQLITE_SRC) $(SQLITE_AMALGAMATION_PATH) $(prefix) ++ dir=deps/$(SQLITE_VERSION) \ ++ cwd=$$(pwd); \ ++ lemon $$dir/ext/fts5/fts5parse.y; \ ++ cd $$dir/ext/fts5; \ ++ tclsh $$cwd/$$dir/ext/fts5/tool/mkfts5c.tcl; \ ++ cd $$cwd; \ ++ $(CC) $(CFLAGS) $(CONDITIONAL_CFLAGS) -DSQLITE_TEST -shared -fPIC -o $@ $$dir/ext/fts5/fts5.c; \ ++ ++test: $(TARGET_FTS5) $(TARGET_LOADABLE) ++ bun test +diff --git a/node_modules/react-native-quick-sqlite/better-trigram/Makefile.vc b/node_modules/react-native-quick-sqlite/better-trigram/Makefile.vc +new file mode 100644 +index 0000000..7e54140 +--- /dev/null ++++ b/node_modules/react-native-quick-sqlite/better-trigram/Makefile.vc +@@ -0,0 +1,62 @@ ++EXT = .dll ++SQLITE_VERSION = version-3.46.1 ++ ++SQLITE_TARBALL_URL = https://www.sqlite.org/src/tarball/sqlite.tar.gz?r=$(SQLITE_VERSION) ++SQLITE_SRC = deps\$(SQLITE_VERSION)\src ++SQLITE_AMALGAMATION_URL = https://sqlite.org/2024/sqlite-amalgamation-3460100.zip ++SQLITE_AMALGAMATION_PATH = deps/sqlite-amalgamation-3460100 ++ ++TCL_DOWNLOAD_URL = https://www.irontcl.com/downloads/irontcl-amd64-8.6.7.zip ++TCLSH_PATH = deps\IronTcl\bin\tclsh86t.exe ++ ++CFLAGS = -I$(SQLITE_AMALGAMATION_PATH) -Ideps\$(SQLITE_VERSION)\src -Ideps\$(SQLITE_VERSION)\ext\fts5 -Os -Wall ++ ++prefix=dist ++$(prefix): ++ if not exist $(prefix) mkdir $(prefix) ++ ++TARGET_LOADABLE=$(prefix)\better-trigram$(EXT) ++TARGET_FTS5=$(prefix)\fts5$(EXT) ++TARGET_LEMON=$(prefix)\lemon.exe ++ ++all: test loadable ++loadable: $(TARGET_LOADABLE) ++ ++clean: ++ if exist deps rmdir /S /Q deps ++ if exist $(prefix) rmdir /S /Q $(prefix) ++ if exist *.obj del *.obj ++ ++$(SQLITE_SRC): ++ if not exist deps\$(SQLITE_VERSION) git clone --depth=1 --branch=$(SQLITE_VERSION) https://github.com/sqlite/sqlite.git deps\$(SQLITE_VERSION) ++ REM curl -LsS $(SQLITE_TARBALL_URL) | tar -xzf - -C deps\$(SQLITE_VERSION)\ --strip-components=1 ++ ++$(SQLITE_AMALGAMATION_PATH): ++ @echo Downloading SQLite amalgamation... ++ powershell -Command "iwr -Uri $(SQLITE_AMALGAMATION_URL) -OutFile sqlite.zip" ++ @echo Extracting SQLite amalgamation... ++ powershell -Command "Expand-Archive -Path sqlite.zip -DestinationPath deps/" ++ del sqlite.zip ++ ++$(TCLSH_PATH): ++ @echo Downloading Tcl/Tk... ++ powershell -Command "iwr -Uri $(TCL_DOWNLOAD_URL) -OutFile tcl.zip" ++ @echo Extracting Tcl/Tk... ++ powershell -Command "Expand-Archive -Path tcl.zip -DestinationPath deps/" ++ del tcl.zip ++ ++$(TARGET_LOADABLE): $(SQLITE_AMALGAMATION_PATH) $(SQLITE_SRC) $(prefix) ++ cl $(CFLAGS) /LD /Fe$@ better-trigram.c ++ ++$(TARGET_LEMON): $(SQLITE_SRC) $(prefix) ++ cl deps\$(SQLITE_VERSION)\tool\lemon.c /Fe$@ ++ copy deps\$(SQLITE_VERSION)\tool\lempar.c $(prefix)\lempar.c ++ ++$(TARGET_FTS5): $(TARGET_LEMON) $(TCLSH_PATH) $(SQLITE_SRC) $(SQLITE_AMALGAMATION_PATH) $(prefix) ++ $(TARGET_LEMON) deps\$(SQLITE_VERSION)\ext\fts5\fts5parse.y ++ ++ powershell -Command "$$CWD = pwd; cd deps\$(SQLITE_VERSION)\ext\fts5; & $$CWD\$(TCLSH_PATH) $$CWD\deps\$(SQLITE_VERSION)\ext\fts5\tool\mkfts5c.tcl" ++ cl /DSQLITE_TEST -I$(SQLITE_AMALGAMATION_PATH) /LD /Fe$(TARGET_FTS5) deps\$(SQLITE_VERSION)\ext\fts5\fts5.c ++ ++test: $(TARGET_FTS5) $(TARGET_LOADABLE) ++ bun test +diff --git a/node_modules/react-native-quick-sqlite/better-trigram/README.md b/node_modules/react-native-quick-sqlite/better-trigram/README.md +new file mode 100644 +index 0000000..dec011f +--- /dev/null ++++ b/node_modules/react-native-quick-sqlite/better-trigram/README.md +@@ -0,0 +1,78 @@ ++

better-trigram

++ ++

A (better) trigram tokenizer for SQLite3 FTS5

++ ++While SQLite3 already has a built-in trigram tokenizer, it does not have any kind of word segmentation support. For example, `i am a bird` gets tokenized as `['i a', ' am', 'm a', ' a ', ' bi', 'bir', 'ird']` which isn't too bad but in real-world use cases users usually type queries as `SELECT * FROM fts_table WHERE title MATCH 'a bird'` which returns no results. ++ ++This tokenizer fixes this by treating spaces as a word boundary. The result is that `i am a bird` gets tokenized as `['i', 'am', 'a', 'bir', 'ird']` and `SELECT * FROM fts_table WHERE title MATCH 'a bird'` correctly returns the expected results. You get all the benefits for substring matching just with a wider range of queries. ++ ++## Compatibility with `trigram` ++ ++`better-trigram` is 99% compatible with `trigram`. This means it has full UTF-8 support, handles all the same edge cases etc. To ensure `better-trigram` remains compatible, it passes all the `trigram` tokenizer tests. Yay! ++ ++With that being said, `better-trigram` doesn't support `LIKE` & `GLOB` patterns. This is a limitation in FTS5 because it doesn't allow custom tokenizers to opt-in to this behavior. (You _could_ technically compile a custom version of FTS5 that enables support for this but I haven't looked into it.) Using `LIKE` & `GLOB` will fallback to full table scans (not recommended). ++ ++## Usage ++ ++You can use this tokenizer like any other custom tokenizer: ++ ++```sh ++make ++``` ++ ++Load the `better-trigram.so` file as a loadable SQLite extension (e.g. `.load better-trigram.so`). ++ ++Then specify it when creating your FTS5 virtual table: ++ ++```sql ++CREATE VIRTUAL TABLE t1 USING fts5(y, tokenize='better_trigram') ++``` ++ ++### Options ++ ++`better-trigram` supports exactly the same options as `trigram` and copies the exact behavior of the original tokenizer when specifying invalid options. This means setting `case_sensitive 1` and `remove_diacritics 1` will throw an error. ++ ++Refer to [FTS5 documentation for the Trigram tokenizer](https://sqlite.org/fts5.html#the_trigram_tokenizer) for more details on what each options does and how you can use it. ++ ++## Performance ++ ++`better-trigram` is significantly faster than `trigram`. Here are the benchmarks: ++ ++``` ++Text length: 289091 ++clk: ~4.09 GHz ++cpu: AMD Ryzen 5 PRO 5650U with Radeon Graphics ++runtime: bun 1.1.31 (x64-linux) ++ ++benchmark avg (min … max) p75 p99 (min … top 1%) ++-------------------------------------- ------------------------------- ++better-trigram 6.37 ms/iter 6.86 ms 7.31 ms ▂▅▃▂▂▃▄▇█▄▂ ++trigram 10.21 ms/iter 11.23 ms 12.75 ms █▄▄▄▃▅▅▇▄▂▂ ++ ++summary ++ better-trigram ++ 1.6x faster than trigram ++``` ++ ++To reproduce on your own machine, run `bun bench.ts`. ++ ++## Contributing ++ ++All kinds of PRs are welcome, of course. Just make sure all the tests pass. You can run the tests like this: ++ ++```sh ++make test ++``` ++ ++## License ++ ++``` ++2024-10-21 ++ ++The author disclaims copyright to this source code. In place of ++a legal notice, here is a blessing: ++ ++ May you do good and not evil. ++ May you find forgiveness for yourself and forgive others. ++ May you share freely, never taking more than you give. ++``` +diff --git a/node_modules/react-native-quick-sqlite/better-trigram/VERSION b/node_modules/react-native-quick-sqlite/better-trigram/VERSION +new file mode 100644 +index 0000000..7bcd0e3 +--- /dev/null ++++ b/node_modules/react-native-quick-sqlite/better-trigram/VERSION +@@ -0,0 +1 @@ ++0.0.2 +\ No newline at end of file +diff --git a/node_modules/react-native-quick-sqlite/better-trigram/bench.ts b/node_modules/react-native-quick-sqlite/better-trigram/bench.ts +new file mode 100644 +index 0000000..e050a3e +--- /dev/null ++++ b/node_modules/react-native-quick-sqlite/better-trigram/bench.ts +@@ -0,0 +1,44 @@ ++import { run, bench, compact, summary } from "mitata"; ++import { Database } from "bun:sqlite"; ++import { LoremIpsum } from "lorem-ipsum"; ++ ++const lorem = new LoremIpsum({ ++ sentencesPerParagraph: { ++ max: 15, ++ min: 10, ++ }, ++ wordsPerSentence: { ++ max: 50, ++ min: 20, ++ }, ++}); ++ ++const text = lorem.generateParagraphs(100); ++function initDatabase() { ++ const db = new Database(":memory:"); ++ db.loadExtension("./better-trigram.so"); ++ return db; ++} ++const db = initDatabase(); ++db.query( ++ `CREATE VIRTUAL TABLE bt1 USING fts5(y, tokenize='better_trigram');` ++).run(); ++db.query(`CREATE VIRTUAL TABLE t1 USING fts5(y, tokenize='trigram');`).run(); ++const btQuery = db.query(`INSERT INTO bt1 VALUES( ? );`); ++const tQuery = db.query(`INSERT INTO t1 VALUES( ? );`); ++ ++console.log("Text length:", text.length); ++ ++compact(() => { ++ summary(() => { ++ bench("better-trigram", () => { ++ btQuery.run(text); ++ }); ++ ++ bench("trigram", () => { ++ tQuery.run(text); ++ }); ++ }); ++}); ++ ++await run(); +diff --git a/node_modules/react-native-quick-sqlite/better-trigram/better-trigram.c b/node_modules/react-native-quick-sqlite/better-trigram/better-trigram.c +new file mode 100644 +index 0000000..010fce1 +--- /dev/null ++++ b/node_modules/react-native-quick-sqlite/better-trigram/better-trigram.c +@@ -0,0 +1,151 @@ ++/* ++** 2024-10-21 ++** ++** The author disclaims copyright to this source code. In place of ++** a legal notice, here is a blessing: ++** ++** May you do good and not evil. ++** May you find forgiveness for yourself and forgive others. ++** May you share freely, never taking more than you give. ++** ++*/ ++ ++#include "better-trigram.h" ++#include "tokenizer.c" ++#include ++#include ++ ++#ifndef SQLITE_CORE ++#include "sqlite3ext.h" ++SQLITE_EXTENSION_INIT1 ++#else ++#include "sqlite3.h" ++#endif ++ ++#define UNUSED_PARAM(x) (void)(x) ++ ++#ifndef SQLITE_PRIVATE ++#define SQLITE_PRIVATE static ++#endif ++ ++static fts5_api *fts5_api_from_db(sqlite3 *db) { ++ fts5_api *pRet = 0; ++ sqlite3_stmt *pStmt = 0; ++ ++ int version = sqlite3_libversion_number(); ++ if (version >= 3020000) { // current api ++ if (SQLITE_OK == sqlite3_prepare(db, "SELECT fts5(?1)", -1, &pStmt, 0)) { ++ sqlite3_bind_pointer(pStmt, 1, (void *)&pRet, "fts5_api_ptr", NULL); ++ sqlite3_step(pStmt); ++ } ++ sqlite3_finalize(pStmt); ++ } else { // before 3.20 ++ int rc = sqlite3_prepare(db, "SELECT fts5()", -1, &pStmt, 0); ++ if (rc == SQLITE_OK) { ++ if (SQLITE_ROW == sqlite3_step(pStmt) && ++ sizeof(fts5_api *) == sqlite3_column_bytes(pStmt, 0)) { ++ memcpy(&pRet, sqlite3_column_blob(pStmt, 0), sizeof(fts5_api *)); ++ } ++ sqlite3_finalize(pStmt); ++ } ++ } ++ return pRet; ++} ++ ++/* Tokenizer structure */ ++typedef struct { ++ int bFold; /* Fold case if 1 */ ++ int iFoldParam; /* Diacritic removal parameter */ ++} BetterTrigramTokenizer; ++ ++/* Free the tokenizer */ ++static void fts5BetterTrigramDelete(Fts5Tokenizer *p) { sqlite3_free(p); } ++ ++/* Create the tokenizer */ ++static int fts5BetterTrigramCreate(void *pUnused, const char **azArg, int nArg, ++ Fts5Tokenizer **ppOut) { ++ BetterTrigramTokenizer *p = ++ (BetterTrigramTokenizer *)sqlite3_malloc(sizeof(BetterTrigramTokenizer)); ++ UNUSED_PARAM(pUnused); ++ if (!p) ++ return SQLITE_NOMEM; ++ ++ int rc = SQLITE_OK; ++ p->bFold = 1; /* Default case folding enabled */ ++ p->iFoldParam = 0; /* Default diacritic removal disabled */ ++ ++ /* Parse options */ ++ for (int i = 0; rc == SQLITE_OK && i < nArg; i += 2) { ++ const char *zArg = azArg[i + 1]; ++ if (0 == sqlite3_stricmp(azArg[i], "case_sensitive")) { ++ if ((zArg[0] != '0' && zArg[0] != '1') || zArg[1]) { ++ rc = SQLITE_ERROR; ++ } else { ++ p->bFold = (zArg[0] == '0'); ++ } ++ } else if (0 == sqlite3_stricmp(azArg[i], "remove_diacritics")) { ++ if ((zArg[0] != '0' && zArg[0] != '1' && zArg[0] != '2') || zArg[1]) { ++ rc = SQLITE_ERROR; ++ } else { ++ p->iFoldParam = (zArg[0] != '0') ? 2 : 0; ++ } ++ } else { ++ rc = SQLITE_ERROR; ++ } ++ ++ if (p->iFoldParam != 0 && p->bFold == 0) { ++ rc = SQLITE_ERROR; ++ } ++ ++ if (rc != SQLITE_OK) { ++ fts5BetterTrigramDelete((Fts5Tokenizer *)p); ++ p = 0; ++ } ++ } ++ ++ *ppOut = (Fts5Tokenizer *)p; ++ return rc; ++} ++ ++static int fts5BetterTrigramTokenize(Fts5Tokenizer *pTokenizer, void *pCtx, ++ int flags, const char *pText, int nText, ++ int (*xToken)(void *, int, const char *, ++ int, int, int)) { ++ UNUSED_PARAM(flags); ++ BetterTrigramTokenizer *p = (BetterTrigramTokenizer *)pTokenizer; ++ tokenize(pText, nText, p->bFold, p->iFoldParam, pCtx, xToken); ++ return SQLITE_OK; ++} ++ ++static int fts5BetterTrigramInit(sqlite3 *db) { ++ fts5_api *ftsApi; ++ ++ fts5_tokenizer tokenizer = {fts5BetterTrigramCreate, fts5BetterTrigramDelete, ++ fts5BetterTrigramTokenize}; ++ ++ ftsApi = fts5_api_from_db(db); ++ ++ if (ftsApi) { ++ ftsApi->xCreateTokenizer(ftsApi, "better_trigram", (void *)ftsApi, ++ &tokenizer, NULL); ++ return SQLITE_OK; ++ } else { ++ // *error = sqlite3_mprintf("Can't find fts5 extension"); ++ return SQLITE_ERROR; ++ } ++} ++ ++#ifdef SQLITE_CORE ++SQLITE_PRIVATE int sqlite3Fts5BetterTrigramInit(sqlite3 *db) { ++ return fts5BetterTrigramInit(db); ++} ++#else ++SQLITE_BETTER_TRIGRAM_API int ++sqlite3_bettertrigram_init(sqlite3 *db, char **error, ++ const sqlite3_api_routines *api) { ++ SQLITE_EXTENSION_INIT2(api); ++ UNUSED_PARAM(error); ++ ++ return fts5BetterTrigramInit(db); ++} ++#endif +diff --git a/node_modules/react-native-quick-sqlite/better-trigram/better-trigram.h b/node_modules/react-native-quick-sqlite/better-trigram/better-trigram.h +new file mode 100644 +index 0000000..ac602bc +--- /dev/null ++++ b/node_modules/react-native-quick-sqlite/better-trigram/better-trigram.h +@@ -0,0 +1,44 @@ ++#ifndef SQLITE_BETTER_TRIGRAM_H ++#define SQLITE_BETTER_TRIGRAM_H ++ ++#ifndef SQLITE_CORE ++#include "sqlite3ext.h" ++#else ++ ++#include "sqlite3.h" ++ ++#endif ++ ++#ifndef SQLITE_PRIVATE ++#define SQLITE_PRIVATE static ++#endif ++ ++#ifdef SQLITE_BETTER_TRIGRAM_STATIC ++#define SQLITE_BETTER_TRIGRAM_API ++#else ++#ifdef _WIN32 ++#define SQLITE_BETTER_TRIGRAM_API __declspec(dllexport) ++#else ++#define SQLITE_BETTER_TRIGRAM_API ++#endif ++#endif ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#ifdef SQLITE_CORE ++SQLITE_PRIVATE int sqlite3Fts5BetterTrigramInit(sqlite3 *db); ++ ++#else ++SQLITE_BETTER_TRIGRAM_API int ++sqlite3_bettertrigram_init(sqlite3 *db, char **pzErrMsg, ++ const sqlite3_api_routines *pApi); ++ ++#endif ++ ++#ifdef __cplusplus ++} /* end of the 'extern "C"' block */ ++#endif ++ ++#endif /* ifndef SQLITE_BETTER_TRIGRAM_H */ +\ No newline at end of file +diff --git a/node_modules/react-native-quick-sqlite/better-trigram/better-trigram.test.ts b/node_modules/react-native-quick-sqlite/better-trigram/better-trigram.test.ts +new file mode 100644 +index 0000000..daa9364 +--- /dev/null ++++ b/node_modules/react-native-quick-sqlite/better-trigram/better-trigram.test.ts +@@ -0,0 +1,796 @@ ++/* ++ ** 2024-10-21 ++ ** ++ ** The author disclaims copyright to this source code. In place of ++ ** a legal notice, here is a blessing: ++ ** ++ ** May you do good and not evil. ++ ** May you find forgiveness for yourself and forgive others. ++ ** May you share freely, never taking more than you give. ++ ** ++ */ ++// to run: bun test ++ ++import { Database } from "bun:sqlite"; ++import { test, describe, expect, afterAll, beforeAll } from "bun:test"; ++ ++const EXT = ++ process.platform === "win32" ++ ? ".dll" ++ : process.platform === "darwin" ++ ? ".dylib" ++ : ".so"; ++ ++if (process.platform === "darwin" && process.env.SQLITE_LIB_PATH) ++ Database.setCustomSQLite(process.env.SQLITE_LIB_PATH); ++ ++function initDatabase() { ++ const db = new Database(":memory:"); ++ db.loadExtension(`./dist/fts5${EXT}`); ++ db.loadExtension(`./dist/better-trigram${EXT}`); ++ return db; ++} ++ ++describe("remove_diacritics", () => { ++ describe("v1", () => { ++ const db = initDatabase(); ++ afterAll(() => db.close()); ++ ++ test("1.0", () => { ++ [ ++ `CREATE VIRTUAL TABLE t1 USING fts5(y, tokenize='better_trigram remove_diacritics 1');`, ++ `INSERT INTO t1 VALUES('abc\u0303defghijklm');`, ++ `INSERT INTO t1 VALUES('a\u0303b\u0303c\u0303defghijklm');`, ++ ].forEach((stmt) => db.query(stmt).run()); ++ }); ++ ++ sqlTest( ++ db, ++ `1.1`, ++ `SELECT highlight(t1, 0, '(', ')') as res FROM t1('abc');`, ++ [], ++ ["(abc\u0303)defghijklm", "(a\u0303b\u0303c\u0303)defghijklm"] ++ ); ++ ++ sqlTest( ++ db, ++ `1.2`, ++ `SELECT highlight(t1, 0, '(', ')') as res FROM t1('bcde');`, ++ [], ++ ["a(bc\u0303de)fghijklm", "a\u0303(b\u0303c\u0303de)fghijklm"] ++ ); ++ ++ sqlTest( ++ db, ++ `1.3`, ++ `SELECT highlight(t1, 0, '(', ')') as res FROM t1('cdef');`, ++ [], ++ ["ab(c\u0303def)ghijklm", "a\u0303b\u0303(c\u0303def)ghijklm"] ++ ); ++ ++ sqlTest( ++ db, ++ `1.4`, ++ `SELECT highlight(t1, 0, '(', ')') as res FROM t1('def');`, ++ [], ++ ["abc\u0303(def)ghijklm", "a\u0303b\u0303c\u0303(def)ghijklm"] ++ ); ++ }); ++ ++ describe("v2", () => { ++ const db = initDatabase(); ++ afterAll(() => db.close()); ++ ++ test("2.0", () => { ++ expect(() => ++ db ++ .query( ++ `CREATE VIRTUAL TABLE t2 USING fts5( ++ z, tokenize='better_trigram case_sensitive 1 remove_diacritics 1' ++);` ++ ) ++ .run() ++ ).toThrowError(/error in tokenizer constructor/g); ++ }); ++ ++ test("2.1", () => { ++ expect(() => ++ db ++ .query( ++ `CREATE VIRTUAL TABLE t2 USING fts5( ++ z, tokenize='better_trigram case_sensitive 0 remove_diacritics 1' ++);` ++ ) ++ .run() ++ ).not.toThrowError(); ++ }); ++ ++ test("2.2", () => { ++ [ ++ `INSERT INTO t2 VALUES('\u00E3bcdef');`, ++ `INSERT INTO t2 VALUES('b\u00E3cdef');`, ++ `INSERT INTO t2 VALUES('bc\u00E3def');`, ++ `INSERT INTO t2 VALUES('bcd\u00E3ef');`, ++ ].forEach((stmt) => ++ expect(db.prepare(stmt).run().changes).toBeGreaterThan(0) ++ ); ++ }); ++ ++ sqlTest( ++ db, ++ "2.3", ++ `SELECT highlight(t2, 0, '(', ')') as res FROM t2('abc');`, ++ [], ++ "(\u00E3bc)def" ++ ); ++ ++ sqlTest( ++ db, ++ "2.4", ++ `SELECT highlight(t2, 0, '(', ')') as res FROM t2('bac');`, ++ [], ++ "(b\u00E3c)def" ++ ); ++ ++ sqlTest( ++ db, ++ "2.5", ++ `SELECT highlight(t2, 0, '(', ')') as res FROM t2('bca');`, ++ [], ++ "(bc\u00E3)def" ++ ); ++ ++ sqlTest( ++ db, ++ "2.6", ++ `SELECT highlight(t2, 0, '(', ')') as res FROM t2('\u00E3bc');`, ++ [], ++ "(\u00E3bc)def" ++ ); ++ }); ++ ++ describe("v3", () => { ++ const db = initDatabase(); ++ afterAll(() => db.close()); ++ ++ test("3.0", () => { ++ expect(() => ++ db ++ .query( ++ `CREATE VIRTUAL TABLE t3 USING fts5( ++ z, tokenize='better_trigram remove_diacritics 1' ++);` ++ ) ++ .run() ++ ).not.toThrowError(); ++ }); ++ ++ test("3.1", () => { ++ expect( ++ db.prepare(`INSERT INTO t3 VALUES ('\u0303abc\u0303');`).run().changes ++ ).toBeGreaterThan(0); ++ }); ++ ++ sqlTest( ++ db, ++ "3.2", ++ `SELECT highlight(t3, 0, '(', ')') as res FROM t3('abc');`, ++ [], ++ "\u0303(abc\u0303)" ++ ); ++ }); ++ ++ describe("v4", () => { ++ const db = initDatabase(); ++ afterAll(() => db.close()); ++ ++ test("4.0", () => { ++ expect(() => ++ db ++ .query( ++ `CREATE VIRTUAL TABLE t4 USING fts5(z, tokenize=better_trigram);` ++ ) ++ .run() ++ ).not.toThrowError(); ++ }); ++ ++ test("4.1", () => { ++ [ ++ `INSERT INTO t4 VALUES('ABCD');`, ++ `INSERT INTO t4 VALUES('DEFG');`, ++ ].forEach((stmt) => ++ expect(db.prepare(stmt).run().changes).toBeGreaterThan(0) ++ ); ++ }); ++ ++ explainQueryPlanTest( ++ db, ++ "4.2", ++ `SELECT rowid FROM t4 WHERE z LIKE '%abc%'`, ++ [], ++ "SCAN t4 VIRTUAL TABLE INDEX 0:" ++ // TODO: "VIRTUAL TABLE INDEX 0:L0" ++ ); ++ ++ sqlTest( ++ db, ++ "4.3", ++ `SELECT rowid as res FROM t4 WHERE z LIKE '%abc%'`, ++ [], ++ 1 ++ ); ++ }); ++ ++ describe("v5", () => { ++ const db = initDatabase(); ++ afterAll(() => db.close()); ++ ++ test("5.0", () => { ++ expect(() => ++ db ++ .query( ++ `CREATE VIRTUAL TABLE t5 USING fts5( ++ c1, tokenize='better_trigram', detail='none' ++ );` ++ ) ++ .run() ++ ).not.toThrowError(); ++ ++ [ ++ `INSERT INTO t5(rowid, c1) VALUES(1, 'abc_____xyx_yxz');`, ++ `INSERT INTO t5(rowid, c1) VALUES(2, 'abc_____xyxz');`, ++ `INSERT INTO t5(rowid, c1) VALUES(3, 'ac_____xyxz');`, ++ ].forEach((stmt) => ++ expect(db.prepare(stmt).run().changes).toBeGreaterThan(0) ++ ); ++ }); ++ ++ sqlTest( ++ db, ++ "5.1", ++ `SELECT rowid as res FROM t5 WHERE c1 LIKE 'abc%xyxz'`, ++ [], ++ 2 ++ ); ++ }); ++}); ++ ++describe("case_sensitive", () => { ++ describe("v1", () => { ++ const db = initDatabase(); ++ ++ test("1.0", () => { ++ [ ++ `CREATE VIRTUAL TABLE t1 USING fts5(y, tokenize = 'better_trigram');`, ++ `INSERT INTO t1 VALUES('abcdefghijklm')`, ++ `INSERT INTO t1 VALUES('กรุงเทพมหานคร');`, ++ ].forEach((stmt) => db.query(stmt).run()); ++ }); ++ ++ [ ++ ["abc", "(abc)defghijklm"], ++ ["defgh", "abc(defgh)ijklm"], ++ ["abcdefghijklm", "(abcdefghijklm)"], ++ ["กรุ", "(กรุ)งเทพมหานคร"], ++ ["งเทพมห", "กรุ(งเทพมห)านคร"], ++ ["กรุงเทพมหานคร", "(กรุงเทพมหานคร)"], ++ ["Abc", "(abc)defghijklm"], ++ ["deFgh", "abc(defgh)ijklm"], ++ ["aBcdefGhijKlm", "(abcdefghijklm)"], ++ ].forEach((testCase, index) => { ++ sqlTest( ++ db, ++ `1.1.${index + 1}`, ++ `SELECT highlight(t1, 0, '(', ')') as res FROM t1(?)`, ++ [testCase[0]], ++ testCase[1] ++ ); ++ }); ++ ++ sqlTest( ++ db, ++ `1.2.0`, ++ `SELECT fts5_expr('ABCD', 'tokenize=better_trigram') as res`, ++ [], ++ `"abc" + "bcd"` ++ ); ++ ++ ( ++ [ ++ ["%cDef%", 1], ++ ["cDef%", undefined], ++ ["%f%", 1], ++ ["%f_h%", 1], ++ ["%f_g%", undefined], ++ ["abc%klm", 1], ++ ["ABCDEFG%", 1], ++ ["%รุงเ%", 2], ++ ["%งเ%", 2], ++ ] as const ++ ).forEach((testCase, index) => { ++ sqlTest( ++ db, ++ `1.3.${index + 1}`, ++ `SELECT rowid as res FROM t1 WHERE y LIKE ?`, ++ [testCase[0]], ++ testCase[1] ++ ); ++ }); ++ }); ++ ++ describe("v2", () => { ++ const db = initDatabase(); ++ ++ test("2.0", () => { ++ [ ++ `CREATE VIRTUAL TABLE t1 USING fts5(y, tokenize = 'better_trigram case_sensitive 1');`, ++ `INSERT INTO t1 VALUES('abcdefghijklm')`, ++ `INSERT INTO t1 VALUES('กรุงเทพมหานคร');`, ++ ].forEach((stmt) => db.query(stmt).run()); ++ }); ++ ++ ( ++ [ ++ ["abc", "(abc)defghijklm"], ++ ["defgh", "abc(defgh)ijklm"], ++ ["abcdefghijklm", "(abcdefghijklm)"], ++ ["กรุ", "(กรุ)งเทพมหานคร"], ++ ["งเทพมห", "กรุ(งเทพมห)านคร"], ++ ["กรุงเทพมหานคร", "(กรุงเทพมหานคร)"], ++ ["Abc", undefined], ++ ["deFgh", undefined], ++ ["aBcdefGhijKlm", undefined], ++ ] as const ++ ).forEach((testCase, index) => { ++ sqlTest( ++ db, ++ `2.1.${index + 1}`, ++ `SELECT highlight(t1, 0, '(', ')') as res FROM t1(?)`, ++ [testCase[0]], ++ testCase[1] ++ ); ++ }); ++ ++ ( ++ [ ++ ["%cDef%", 1], ++ ["cDef%", undefined], ++ ["%f%", 1], ++ ["%f_h%", 1], ++ ["%f_g%", undefined], ++ ["abc%klm", 1], ++ ["ABCDEFG%", 1], ++ ["%รุงเ%", 2], ++ ] as const ++ ).forEach((testCase, index) => { ++ sqlTest( ++ db, ++ `2.2.${index + 1}`, ++ `SELECT rowid as res FROM t1 WHERE y LIKE ?`, ++ [testCase[0]], ++ testCase[1] ++ ); ++ }); ++ ++ ( ++ [ ++ ["*cdef*", 1], ++ ["cdef*", undefined], ++ ["*f*", 1], ++ ["*f?h*", 1], ++ ["*f?g*", undefined], ++ ["abc*klm", 1], ++ ["abcdefg*", 1], ++ ["*รุงเ*", 2], ++ ["abc[d]efg*", 1], ++ ["abc[]d]efg*", 1], ++ ["abc[^]d]efg*", undefined], ++ ["abc[^]XYZ]efg*", 1], ++ ] as const ++ ).forEach((testCase, index) => { ++ sqlTest( ++ db, ++ `2.3.${index + 1}`, ++ `SELECT rowid as res FROM t1 WHERE y GLOB ?`, ++ [testCase[0]], ++ testCase[1] ++ ); ++ }); ++ ++ sqlTest( ++ db, ++ "2.3.null.1", ++ `SELECT rowid FROM t1 WHERE y LIKE NULL`, ++ [], ++ undefined ++ ); ++ }); ++ ++ describe("v3", () => { ++ const db = initDatabase(); ++ ++ test("3.0", () => { ++ expect(() => ++ db ++ .query( ++ `CREATE VIRTUAL TABLE ttt USING fts5(c, tokenize="better_trigram case_sensitive 2")` ++ ) ++ .run() ++ ).toThrow(/error in tokenizer constructor/g); ++ }); ++ ++ test("3.1", () => { ++ expect(() => ++ db ++ .query( ++ `CREATE VIRTUAL TABLE ttt USING fts5(c, tokenize="better_trigram case_sensitive 11")` ++ ) ++ .run() ++ ).toThrow(/error in tokenizer constructor/g); ++ }); ++ ++ test("3.2", () => { ++ expect(() => ++ db ++ .query( ++ `CREATE VIRTUAL TABLE ttt USING fts5(c, tokenize="better_trigram case_sensitive 1")` ++ ) ++ .run() ++ ).not.toThrow(); ++ }); ++ }); ++ ++ describe("v4", () => { ++ const db = initDatabase(); ++ ++ test("4.0", () => { ++ expect( ++ db ++ .query( ++ `CREATE VIRTUAL TABLE t0 USING fts5(b, tokenize = "better_trigram");` ++ ) ++ .run().changes ++ ).toBeGreaterThan(0); ++ }); ++ ++ test("4.1", () => { ++ expect( ++ db.query(`INSERT INTO t0 VALUES (x'000b01');`).run().changes ++ ).toBeGreaterThan(0); ++ }); ++ ++ test("4.2", () => { ++ expect( ++ db.query(`INSERT INTO t0(t0) VALUES('integrity-check');`).run().changes ++ ).toBeGreaterThan(0); ++ }); ++ }); ++ ++ describe("v5", () => { ++ for (const detailMode of ["full", "col", "none"]) { ++ for (const flag of [0, 1]) { ++ const db = initDatabase(); ++ ++ test(`5.cs=${flag}.0.1 (${detailMode})`, () => { ++ expect( ++ db ++ .prepare( ++ `CREATE VIRTUAL TABLE t1 USING fts5( ++ y, tokenize="better_trigram case_sensitive ${flag}", detail=${detailMode} ++ );` ++ ) ++ .run().changes ++ ).toBeGreaterThan(0); ++ }); ++ ++ test(`5.cs=${flag}.0.2 (${detailMode})`, () => { ++ [ ++ `INSERT INTO t1 VALUES('abcdefghijklm');`, ++ `INSERT INTO t1 VALUES('กรุงเทพมหานคร');`, ++ ].forEach((stmt) => { ++ expect(db.prepare(stmt).run().changes).toBeGreaterThan(0); ++ }); ++ }); ++ ++ ( ++ [ ++ ["%cDef%", 1], ++ ["cDef%", undefined], ++ ["%f%", 1], ++ ["%f_h%", 1], ++ ["%f_g%", undefined], ++ ["abc%klm", 1], ++ ["ABCDEFG%", 1], ++ ["%รุงเ%", 2], ++ ] as const ++ ).forEach((testCase, index) => { ++ sqlTest( ++ db, ++ `5.cs=${flag}.1.${index + 1} (${detailMode})`, ++ `SELECT rowid as res FROM t1 WHERE y LIKE ?`, ++ [testCase[0]], ++ testCase[1] ++ ); ++ }); ++ } ++ } ++ }); ++ ++ describe("v6", () => { ++ const db = initDatabase(); ++ ++ test("6.0", () => { ++ [ ++ `CREATE VIRTUAL TABLE ci0 USING fts5(x, tokenize="better_trigram");`, ++ `CREATE VIRTUAL TABLE ci1 USING fts5(x, tokenize="better_trigram case_sensitive 1");`, ++ ].forEach((stmt) => ++ expect(db.prepare(stmt).run().changes).toBeGreaterThan(0) ++ ); ++ }); ++ ++ explainQueryPlanTest( ++ db, ++ "6.1", ++ `SELECT * FROM ci0 WHERE x LIKE '??'`, ++ [], ++ "SCAN ci0 VIRTUAL TABLE INDEX 0:" ++ // TODO: "VIRTUAL TABLE INDEX 0:L0" ++ ); ++ ++ explainQueryPlanTest( ++ db, ++ "6.2", ++ `SELECT * FROM ci0 WHERE x GLOB '??'`, ++ [], ++ "SCAN ci0 VIRTUAL TABLE INDEX 0:" ++ // TODO: "VIRTUAL TABLE INDEX 0:G0" ++ ); ++ ++ explainQueryPlanTest( ++ db, ++ "6.3", ++ `SELECT * FROM ci1 WHERE x LIKE '??'`, ++ [], ++ "SCAN ci1 VIRTUAL TABLE INDEX 0:" ++ ); ++ ++ explainQueryPlanTest( ++ db, ++ "6.4", ++ `SELECT * FROM ci1 WHERE x GLOB '??'`, ++ [], ++ "SCAN ci1 VIRTUAL TABLE INDEX 0:" ++ // TODO: "VIRTUAL TABLE INDEX 0:G0" ++ ); ++ }); ++ ++ describe("v7", () => { ++ const db = initDatabase(); ++ ++ test("7.0", () => { ++ [ ++ `CREATE VIRTUAL TABLE f USING FTS5(filename, tokenize="better_trigram");`, ++ `INSERT INTO f (rowid, filename) VALUES ++ (10, 'giraffe.png'), ++ (20, 'жираф.png'), ++ (30, 'cat.png'), ++ (40, 'кот.png'), ++ (50, 'misic-🎵-.mp3');`, ++ ].forEach((stmt) => ++ expect(db.prepare(stmt).run().changes).toBeGreaterThan(0) ++ ); ++ }); ++ ++ sqlTest( ++ db, ++ "7.1", ++ `SELECT rowid as res FROM f WHERE +filename GLOB '*ир*';`, ++ [], ++ 20 ++ ); ++ ++ sqlTest( ++ db, ++ "7.2", ++ `SELECT rowid as res FROM f WHERE filename GLOB '*ир*';`, ++ [], ++ 20 ++ ); ++ }); ++ ++ describe("v8", () => { ++ const db = initDatabase(); ++ ++ test("8.0", () => { ++ [ ++ `CREATE VIRTUAL TABLE t1 USING fts5(y, tokenize = 'better_trigram');`, ++ `INSERT INTO t1 VALUES('abcdefghijklm')`, ++ ].forEach((stmt) => ++ expect(db.prepare(stmt).run().changes).toBeGreaterThan(0) ++ ); ++ }); ++ ++ [ ++ ["abc ghi", "(abc)def(ghi)jklm"], ++ ["def ghi", "abc(defghi)jklm"], ++ ["efg ghi", "abcd(efghi)jklm"], ++ ["efghi", "abcd(efghi)jklm"], ++ ["abcd jklm", "(abcd)efghi(jklm)"], ++ ["ijkl jklm", "abcdefgh(ijklm)"], ++ ["ijk ijkl hijk", "abcdefg(hijkl)m"], ++ ].forEach((testCase, index) => { ++ sqlTest( ++ db, ++ `8.1.${index + 1}`, ++ `SELECT highlight(t1, 0, '(', ')') as res FROM t1(?)`, ++ [testCase[0]], ++ testCase[1] ++ ); ++ }); ++ ++ test("8.2", () => { ++ [ ++ `CREATE VIRTUAL TABLE ft2 USING fts5(a, tokenize="better_trigram");`, ++ `INSERT INTO ft2 VALUES('abc x cde');`, ++ `INSERT INTO ft2 VALUES('abc cde');`, ++ `INSERT INTO ft2 VALUES('abcde');`, ++ ].forEach((stmt) => ++ expect(db.prepare(stmt).run().changes).toBeGreaterThan(0) ++ ); ++ }); ++ ++ test("8.3", () => { ++ const expected = ["[abc] x [cde]", "[abc] [cde]", "[abcde]"]; ++ db.prepare( ++ `SELECT highlight(ft2, 0, '[', ']') as res FROM ft2 WHERE ft2 MATCH 'abc AND cde';` ++ ) ++ .all() ++ .forEach((result, i) => { ++ expect((result as { res: string }).res).toBe(expected[i]); ++ }); ++ }); ++ }); ++ ++ describe("v9", () => { ++ const db = initDatabase(); ++ ++ test("9.0", () => { ++ [ ++ `CREATE VIRTUAL TABLE t1 USING fts5( ++ a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, ++ tokenize=better_trigram ++ );`, ++ `INSERT INTO t1(rowid, a12) VALUES(111, 'thats a tricky case though');`, ++ `INSERT INTO t1(rowid, a12) VALUES(222, 'the query planner cannot do');`, ++ ].forEach((stmt) => ++ expect(db.prepare(stmt).run().changes).toBeGreaterThan(0) ++ ); ++ }); ++ ++ sqlTest( ++ db, ++ "9.1", ++ `SELECT rowid as res FROM t1 WHERE a12 LIKE '%tricky%'`, ++ [], ++ 111 ++ ); ++ ++ sqlTest( ++ db, ++ "9.2", ++ `SELECT rowid as res FROM t1 WHERE a12 LIKE '%tricky%' AND a12 LIKE '%case%'`, ++ [], ++ 111 ++ ); ++ ++ sqlTest( ++ db, ++ "9.3", ++ `SELECT rowid as res FROM t1 WHERE a12 LIKE NULL`, ++ [], ++ undefined ++ ); ++ }); ++ ++ describe("v10", () => { ++ const db = initDatabase(); ++ ++ test("10.0", () => { ++ [`CREATE VIRTUAL TABLE t1 USING fts5(a, tokenize=trigram);`].forEach( ++ (stmt) => expect(db.prepare(stmt).run().changes).toBeGreaterThan(0) ++ ); ++ }); ++ ++ test("10.1", () => { ++ [ ++ `"abc UFFjklUFF"`, ++ `"abc UFFFjklUFFF"`, ++ `"abc UFFFFjklUFFFF"`, ++ `"abc UFFFFFjklUFFFFF"`, ++ `"UFFjklUFF abc"`, ++ `"UFFFjklUFFF abc"`, ++ `"UFFFFjklUFFFF abc"`, ++ `"UFFFFFjklUFFFFF abc"`, ++ `"U10001jklU10001 abc"`, ++ ].forEach((val) => db.query(`INSERT INTO t1 VALUES( ${val} ) `).run()); ++ }); ++ ++ test("10.2", () => { ++ [ ++ `X'E18000626320646566'`, ++ `X'61EDA0806320646566'`, ++ `X'61EDA0806320646566'`, ++ `X'61EFBFBE6320646566'`, ++ `X'76686920E18000626320646566'`, ++ `X'7668692061EDA0806320646566'`, ++ `X'7668692061EDA0806320646566'`, ++ `X'7668692061EFBFBE6320646566'`, ++ ].forEach((val) => db.query(`INSERT INTO t1 VALUES( ${val} ) `).run()); ++ }); ++ ++ test("10.3", () => { ++ const a = Buffer.from([0x61, 0xf7, 0xbf, 0xbf, 0xbf, 0x62]).toString( ++ "utf-8" ++ ); ++ const b = Buffer.from([ ++ 0x61, 0xf7, 0xbf, 0xbf, 0xbf, 0xbf, 0x62, ++ ]).toString("utf-8"); ++ const c = Buffer.from([ ++ 0x61, 0xf7, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x62, ++ ]).toString("utf-8"); ++ const d = Buffer.from([ ++ 0x61, 0xf7, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x62, ++ ]).toString("utf-8"); ++ ++ [ ++ `INSERT INTO t1 VALUES('${a}');`, ++ `INSERT INTO t1 VALUES('${b}');`, ++ `INSERT INTO t1 VALUES('${c}');`, ++ `INSERT INTO t1 VALUES('${d}');`, ++ ++ `INSERT INTO t1 VALUES('abcd' || '${a}');`, ++ `INSERT INTO t1 VALUES('abcd' || '${b}');`, ++ `INSERT INTO t1 VALUES('abcd' || '${c}');`, ++ `INSERT INTO t1 VALUES('abcd' || '${d}');`, ++ ].forEach((val) => { ++ db.query(val).run(); ++ }); ++ }); ++ }); ++}); ++ ++function sqlTest( ++ db: Database, ++ version: string, ++ query: string, ++ params: string[], ++ expected: string | number | undefined | (string | number | undefined)[] ++) { ++ test(version, () => { ++ const result = db.query(query).all(...params) as { ++ res: string | number; ++ }[]; ++ if (Array.isArray(expected)) { ++ expect(Array.isArray(expected)).toBeTrue(); ++ expect(result.length).toBe(expected.length); ++ result.forEach((result, i) => expect(result.res).toBe(expected[i]!)); ++ } else { ++ expect(result[0]?.res).toBe(expected!); ++ } ++ }); ++} ++ ++function explainQueryPlanTest( ++ db: Database, ++ version: string, ++ query: string, ++ params: string[], ++ expected: string ++) { ++ test(version, () => { ++ const result = db.query(`EXPLAIN QUERY PLAN ${query}`).get(...params) as { ++ detail?: string; ++ }; ++ expect(result?.detail).toInclude(expected); ++ }); ++} +diff --git a/node_modules/react-native-quick-sqlite/better-trigram/fts5_unicode2.c b/node_modules/react-native-quick-sqlite/better-trigram/fts5_unicode2.c +new file mode 100644 +index 0000000..2133d5d +--- /dev/null ++++ b/node_modules/react-native-quick-sqlite/better-trigram/fts5_unicode2.c +@@ -0,0 +1,780 @@ ++/* ++** 2012-05-25 ++** ++** The author disclaims copyright to this source code. In place of ++** a legal notice, here is a blessing: ++** ++** May you do good and not evil. ++** May you find forgiveness for yourself and forgive others. ++** May you share freely, never taking more than you give. ++** ++****************************************************************************** ++*/ ++ ++/* ++** DO NOT EDIT THIS MACHINE GENERATED FILE. ++*/ ++ ++ ++#include ++ ++ ++ ++/* ++** If the argument is a codepoint corresponding to a lowercase letter ++** in the ASCII range with a diacritic added, return the codepoint ++** of the ASCII letter only. For example, if passed 235 - "LATIN ++** SMALL LETTER E WITH DIAERESIS" - return 65 ("LATIN SMALL LETTER ++** E"). The resuls of passing a codepoint that corresponds to an ++** uppercase letter are undefined. ++*/ ++static int fts5_remove_diacritic(int c, int bComplex){ ++ unsigned short aDia[] = { ++ 0, 1797, 1848, 1859, 1891, 1928, 1940, 1995, ++ 2024, 2040, 2060, 2110, 2168, 2206, 2264, 2286, ++ 2344, 2383, 2472, 2488, 2516, 2596, 2668, 2732, ++ 2782, 2842, 2894, 2954, 2984, 3000, 3028, 3336, ++ 3456, 3696, 3712, 3728, 3744, 3766, 3832, 3896, ++ 3912, 3928, 3944, 3968, 4008, 4040, 4056, 4106, ++ 4138, 4170, 4202, 4234, 4266, 4296, 4312, 4344, ++ 4408, 4424, 4442, 4472, 4488, 4504, 6148, 6198, ++ 6264, 6280, 6360, 6429, 6505, 6529, 61448, 61468, ++ 61512, 61534, 61592, 61610, 61642, 61672, 61688, 61704, ++ 61726, 61784, 61800, 61816, 61836, 61880, 61896, 61914, ++ 61948, 61998, 62062, 62122, 62154, 62184, 62200, 62218, ++ 62252, 62302, 62364, 62410, 62442, 62478, 62536, 62554, ++ 62584, 62604, 62640, 62648, 62656, 62664, 62730, 62766, ++ 62830, 62890, 62924, 62974, 63032, 63050, 63082, 63118, ++ 63182, 63242, 63274, 63310, 63368, 63390, ++ }; ++#define HIBIT ((unsigned char)0x80) ++ unsigned char aChar[] = { ++ '\0', 'a', 'c', 'e', 'i', 'n', ++ 'o', 'u', 'y', 'y', 'a', 'c', ++ 'd', 'e', 'e', 'g', 'h', 'i', ++ 'j', 'k', 'l', 'n', 'o', 'r', ++ 's', 't', 'u', 'u', 'w', 'y', ++ 'z', 'o', 'u', 'a', 'i', 'o', ++ 'u', 'u'|HIBIT, 'a'|HIBIT, 'g', 'k', 'o', ++ 'o'|HIBIT, 'j', 'g', 'n', 'a'|HIBIT, 'a', ++ 'e', 'i', 'o', 'r', 'u', 's', ++ 't', 'h', 'a', 'e', 'o'|HIBIT, 'o', ++ 'o'|HIBIT, 'y', '\0', '\0', '\0', '\0', ++ '\0', '\0', '\0', '\0', 'a', 'b', ++ 'c'|HIBIT, 'd', 'd', 'e'|HIBIT, 'e', 'e'|HIBIT, ++ 'f', 'g', 'h', 'h', 'i', 'i'|HIBIT, ++ 'k', 'l', 'l'|HIBIT, 'l', 'm', 'n', ++ 'o'|HIBIT, 'p', 'r', 'r'|HIBIT, 'r', 's', ++ 's'|HIBIT, 't', 'u', 'u'|HIBIT, 'v', 'w', ++ 'w', 'x', 'y', 'z', 'h', 't', ++ 'w', 'y', 'a', 'a'|HIBIT, 'a'|HIBIT, 'a'|HIBIT, ++ 'e', 'e'|HIBIT, 'e'|HIBIT, 'i', 'o', 'o'|HIBIT, ++ 'o'|HIBIT, 'o'|HIBIT, 'u', 'u'|HIBIT, 'u'|HIBIT, 'y', ++ }; ++ ++ unsigned int key = (((unsigned int)c)<<3) | 0x00000007; ++ int iRes = 0; ++ int iHi = sizeof(aDia)/sizeof(aDia[0]) - 1; ++ int iLo = 0; ++ while( iHi>=iLo ){ ++ int iTest = (iHi + iLo) / 2; ++ if( key >= aDia[iTest] ){ ++ iRes = iTest; ++ iLo = iTest+1; ++ }else{ ++ iHi = iTest-1; ++ } ++ } ++ assert( key>=aDia[iRes] ); ++ if( bComplex==0 && (aChar[iRes] & 0x80) ) return c; ++ return (c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : ((int)aChar[iRes] & 0x7F); ++} ++ ++ ++/* ++** Return true if the argument interpreted as a unicode codepoint ++** is a diacritical modifier character. ++*/ ++int sqlite3Fts5UnicodeIsdiacritic(int c){ ++ unsigned int mask0 = 0x08029FDF; ++ unsigned int mask1 = 0x000361F8; ++ if( c<768 || c>817 ) return 0; ++ return (c < 768+32) ? ++ (mask0 & ((unsigned int)1 << (c-768))) : ++ (mask1 & ((unsigned int)1 << (c-768-32))); ++} ++ ++ ++/* ++** Interpret the argument as a unicode codepoint. If the codepoint ++** is an upper case character that has a lower case equivalent, ++** return the codepoint corresponding to the lower case version. ++** Otherwise, return a copy of the argument. ++** ++** The results are undefined if the value passed to this function ++** is less than zero. ++*/ ++int sqlite3Fts5UnicodeFold(int c, int eRemoveDiacritic){ ++ /* Each entry in the following array defines a rule for folding a range ++ ** of codepoints to lower case. The rule applies to a range of nRange ++ ** codepoints starting at codepoint iCode. ++ ** ++ ** If the least significant bit in flags is clear, then the rule applies ++ ** to all nRange codepoints (i.e. all nRange codepoints are upper case and ++ ** need to be folded). Or, if it is set, then the rule only applies to ++ ** every second codepoint in the range, starting with codepoint C. ++ ** ++ ** The 7 most significant bits in flags are an index into the aiOff[] ++ ** array. If a specific codepoint C does require folding, then its lower ++ ** case equivalent is ((C + aiOff[flags>>1]) & 0xFFFF). ++ ** ++ ** The contents of this array are generated by parsing the CaseFolding.txt ++ ** file distributed as part of the "Unicode Character Database". See ++ ** http://www.unicode.org for details. ++ */ ++ static const struct TableEntry { ++ unsigned short iCode; ++ unsigned char flags; ++ unsigned char nRange; ++ } aEntry[] = { ++ {65, 14, 26}, {181, 64, 1}, {192, 14, 23}, ++ {216, 14, 7}, {256, 1, 48}, {306, 1, 6}, ++ {313, 1, 16}, {330, 1, 46}, {376, 116, 1}, ++ {377, 1, 6}, {383, 104, 1}, {385, 50, 1}, ++ {386, 1, 4}, {390, 44, 1}, {391, 0, 1}, ++ {393, 42, 2}, {395, 0, 1}, {398, 32, 1}, ++ {399, 38, 1}, {400, 40, 1}, {401, 0, 1}, ++ {403, 42, 1}, {404, 46, 1}, {406, 52, 1}, ++ {407, 48, 1}, {408, 0, 1}, {412, 52, 1}, ++ {413, 54, 1}, {415, 56, 1}, {416, 1, 6}, ++ {422, 60, 1}, {423, 0, 1}, {425, 60, 1}, ++ {428, 0, 1}, {430, 60, 1}, {431, 0, 1}, ++ {433, 58, 2}, {435, 1, 4}, {439, 62, 1}, ++ {440, 0, 1}, {444, 0, 1}, {452, 2, 1}, ++ {453, 0, 1}, {455, 2, 1}, {456, 0, 1}, ++ {458, 2, 1}, {459, 1, 18}, {478, 1, 18}, ++ {497, 2, 1}, {498, 1, 4}, {502, 122, 1}, ++ {503, 134, 1}, {504, 1, 40}, {544, 110, 1}, ++ {546, 1, 18}, {570, 70, 1}, {571, 0, 1}, ++ {573, 108, 1}, {574, 68, 1}, {577, 0, 1}, ++ {579, 106, 1}, {580, 28, 1}, {581, 30, 1}, ++ {582, 1, 10}, {837, 36, 1}, {880, 1, 4}, ++ {886, 0, 1}, {902, 18, 1}, {904, 16, 3}, ++ {908, 26, 1}, {910, 24, 2}, {913, 14, 17}, ++ {931, 14, 9}, {962, 0, 1}, {975, 4, 1}, ++ {976, 140, 1}, {977, 142, 1}, {981, 146, 1}, ++ {982, 144, 1}, {984, 1, 24}, {1008, 136, 1}, ++ {1009, 138, 1}, {1012, 130, 1}, {1013, 128, 1}, ++ {1015, 0, 1}, {1017, 152, 1}, {1018, 0, 1}, ++ {1021, 110, 3}, {1024, 34, 16}, {1040, 14, 32}, ++ {1120, 1, 34}, {1162, 1, 54}, {1216, 6, 1}, ++ {1217, 1, 14}, {1232, 1, 88}, {1329, 22, 38}, ++ {4256, 66, 38}, {4295, 66, 1}, {4301, 66, 1}, ++ {7680, 1, 150}, {7835, 132, 1}, {7838, 96, 1}, ++ {7840, 1, 96}, {7944, 150, 8}, {7960, 150, 6}, ++ {7976, 150, 8}, {7992, 150, 8}, {8008, 150, 6}, ++ {8025, 151, 8}, {8040, 150, 8}, {8072, 150, 8}, ++ {8088, 150, 8}, {8104, 150, 8}, {8120, 150, 2}, ++ {8122, 126, 2}, {8124, 148, 1}, {8126, 100, 1}, ++ {8136, 124, 4}, {8140, 148, 1}, {8152, 150, 2}, ++ {8154, 120, 2}, {8168, 150, 2}, {8170, 118, 2}, ++ {8172, 152, 1}, {8184, 112, 2}, {8186, 114, 2}, ++ {8188, 148, 1}, {8486, 98, 1}, {8490, 92, 1}, ++ {8491, 94, 1}, {8498, 12, 1}, {8544, 8, 16}, ++ {8579, 0, 1}, {9398, 10, 26}, {11264, 22, 47}, ++ {11360, 0, 1}, {11362, 88, 1}, {11363, 102, 1}, ++ {11364, 90, 1}, {11367, 1, 6}, {11373, 84, 1}, ++ {11374, 86, 1}, {11375, 80, 1}, {11376, 82, 1}, ++ {11378, 0, 1}, {11381, 0, 1}, {11390, 78, 2}, ++ {11392, 1, 100}, {11499, 1, 4}, {11506, 0, 1}, ++ {42560, 1, 46}, {42624, 1, 24}, {42786, 1, 14}, ++ {42802, 1, 62}, {42873, 1, 4}, {42877, 76, 1}, ++ {42878, 1, 10}, {42891, 0, 1}, {42893, 74, 1}, ++ {42896, 1, 4}, {42912, 1, 10}, {42922, 72, 1}, ++ {65313, 14, 26}, ++ }; ++ static const unsigned short aiOff[] = { ++ 1, 2, 8, 15, 16, 26, 28, 32, ++ 37, 38, 40, 48, 63, 64, 69, 71, ++ 79, 80, 116, 202, 203, 205, 206, 207, ++ 209, 210, 211, 213, 214, 217, 218, 219, ++ 775, 7264, 10792, 10795, 23228, 23256, 30204, 54721, ++ 54753, 54754, 54756, 54787, 54793, 54809, 57153, 57274, ++ 57921, 58019, 58363, 61722, 65268, 65341, 65373, 65406, ++ 65408, 65410, 65415, 65424, 65436, 65439, 65450, 65462, ++ 65472, 65476, 65478, 65480, 65482, 65488, 65506, 65511, ++ 65514, 65521, 65527, 65528, 65529, ++ }; ++ ++ int ret = c; ++ ++ assert( sizeof(unsigned short)==2 && sizeof(unsigned char)==1 ); ++ ++ if( c<128 ){ ++ if( c>='A' && c<='Z' ) ret = c + ('a' - 'A'); ++ }else if( c<65536 ){ ++ const struct TableEntry *p; ++ int iHi = sizeof(aEntry)/sizeof(aEntry[0]) - 1; ++ int iLo = 0; ++ int iRes = -1; ++ ++ assert( c>aEntry[0].iCode ); ++ while( iHi>=iLo ){ ++ int iTest = (iHi + iLo) / 2; ++ int cmp = (c - aEntry[iTest].iCode); ++ if( cmp>=0 ){ ++ iRes = iTest; ++ iLo = iTest+1; ++ }else{ ++ iHi = iTest-1; ++ } ++ } ++ ++ assert( iRes>=0 && c>=aEntry[iRes].iCode ); ++ p = &aEntry[iRes]; ++ if( c<(p->iCode + p->nRange) && 0==(0x01 & p->flags & (p->iCode ^ c)) ){ ++ ret = (c + (aiOff[p->flags>>1])) & 0x0000FFFF; ++ assert( ret>0 ); ++ } ++ ++ if( eRemoveDiacritic ){ ++ ret = fts5_remove_diacritic(ret, eRemoveDiacritic==2); ++ } ++ } ++ ++ else if( c>=66560 && c<66600 ){ ++ ret = c + 40; ++ } ++ ++ return ret; ++} ++ ++ ++int sqlite3Fts5UnicodeCatParse(const char *zCat, u8 *aArray){ ++ aArray[0] = 1; ++ switch( zCat[0] ){ ++ case 'C': ++ switch( zCat[1] ){ ++ case 'c': aArray[1] = 1; break; ++ case 'f': aArray[2] = 1; break; ++ case 'n': aArray[3] = 1; break; ++ case 's': aArray[4] = 1; break; ++ case 'o': aArray[31] = 1; break; ++ case '*': ++ aArray[1] = 1; ++ aArray[2] = 1; ++ aArray[3] = 1; ++ aArray[4] = 1; ++ aArray[31] = 1; ++ break; ++ default: return 1; } ++ break; ++ ++ case 'L': ++ switch( zCat[1] ){ ++ case 'l': aArray[5] = 1; break; ++ case 'm': aArray[6] = 1; break; ++ case 'o': aArray[7] = 1; break; ++ case 't': aArray[8] = 1; break; ++ case 'u': aArray[9] = 1; break; ++ case 'C': aArray[30] = 1; break; ++ case '*': ++ aArray[5] = 1; ++ aArray[6] = 1; ++ aArray[7] = 1; ++ aArray[8] = 1; ++ aArray[9] = 1; ++ aArray[30] = 1; ++ break; ++ default: return 1; } ++ break; ++ ++ case 'M': ++ switch( zCat[1] ){ ++ case 'c': aArray[10] = 1; break; ++ case 'e': aArray[11] = 1; break; ++ case 'n': aArray[12] = 1; break; ++ case '*': ++ aArray[10] = 1; ++ aArray[11] = 1; ++ aArray[12] = 1; ++ break; ++ default: return 1; } ++ break; ++ ++ case 'N': ++ switch( zCat[1] ){ ++ case 'd': aArray[13] = 1; break; ++ case 'l': aArray[14] = 1; break; ++ case 'o': aArray[15] = 1; break; ++ case '*': ++ aArray[13] = 1; ++ aArray[14] = 1; ++ aArray[15] = 1; ++ break; ++ default: return 1; } ++ break; ++ ++ case 'P': ++ switch( zCat[1] ){ ++ case 'c': aArray[16] = 1; break; ++ case 'd': aArray[17] = 1; break; ++ case 'e': aArray[18] = 1; break; ++ case 'f': aArray[19] = 1; break; ++ case 'i': aArray[20] = 1; break; ++ case 'o': aArray[21] = 1; break; ++ case 's': aArray[22] = 1; break; ++ case '*': ++ aArray[16] = 1; ++ aArray[17] = 1; ++ aArray[18] = 1; ++ aArray[19] = 1; ++ aArray[20] = 1; ++ aArray[21] = 1; ++ aArray[22] = 1; ++ break; ++ default: return 1; } ++ break; ++ ++ case 'S': ++ switch( zCat[1] ){ ++ case 'c': aArray[23] = 1; break; ++ case 'k': aArray[24] = 1; break; ++ case 'm': aArray[25] = 1; break; ++ case 'o': aArray[26] = 1; break; ++ case '*': ++ aArray[23] = 1; ++ aArray[24] = 1; ++ aArray[25] = 1; ++ aArray[26] = 1; ++ break; ++ default: return 1; } ++ break; ++ ++ case 'Z': ++ switch( zCat[1] ){ ++ case 'l': aArray[27] = 1; break; ++ case 'p': aArray[28] = 1; break; ++ case 's': aArray[29] = 1; break; ++ case '*': ++ aArray[27] = 1; ++ aArray[28] = 1; ++ aArray[29] = 1; ++ break; ++ default: return 1; } ++ break; ++ ++ ++ default: ++ return 1; ++ } ++ return 0; ++} ++ ++static u16 aFts5UnicodeBlock[] = { ++ 0, 1471, 1753, 1760, 1760, 1760, 1760, 1760, 1760, 1760, ++ 1760, 1760, 1760, 1760, 1760, 1763, 1765, ++ }; ++static u16 aFts5UnicodeMap[] = { ++ 0, 32, 33, 36, 37, 40, 41, 42, 43, 44, ++ 45, 46, 48, 58, 60, 63, 65, 91, 92, 93, ++ 94, 95, 96, 97, 123, 124, 125, 126, 127, 160, ++ 161, 162, 166, 167, 168, 169, 170, 171, 172, 173, ++ 174, 175, 176, 177, 178, 180, 181, 182, 184, 185, ++ 186, 187, 188, 191, 192, 215, 216, 223, 247, 248, ++ 256, 312, 313, 329, 330, 377, 383, 385, 387, 388, ++ 391, 394, 396, 398, 402, 403, 405, 406, 409, 412, ++ 414, 415, 417, 418, 423, 427, 428, 431, 434, 436, ++ 437, 440, 442, 443, 444, 446, 448, 452, 453, 454, ++ 455, 456, 457, 458, 459, 460, 461, 477, 478, 496, ++ 497, 498, 499, 500, 503, 505, 506, 564, 570, 572, ++ 573, 575, 577, 580, 583, 584, 592, 660, 661, 688, ++ 706, 710, 722, 736, 741, 748, 749, 750, 751, 768, ++ 880, 884, 885, 886, 890, 891, 894, 900, 902, 903, ++ 904, 908, 910, 912, 913, 931, 940, 975, 977, 978, ++ 981, 984, 1008, 1012, 1014, 1015, 1018, 1020, 1021, 1072, ++ 1120, 1154, 1155, 1160, 1162, 1217, 1231, 1232, 1329, 1369, ++ 1370, 1377, 1417, 1418, 1423, 1425, 1470, 1471, 1472, 1473, ++ 1475, 1476, 1478, 1479, 1488, 1520, 1523, 1536, 1542, 1545, ++ 1547, 1548, 1550, 1552, 1563, 1566, 1568, 1600, 1601, 1611, ++ 1632, 1642, 1646, 1648, 1649, 1748, 1749, 1750, 1757, 1758, ++ 1759, 1765, 1767, 1769, 1770, 1774, 1776, 1786, 1789, 1791, ++ 1792, 1807, 1808, 1809, 1810, 1840, 1869, 1958, 1969, 1984, ++ 1994, 2027, 2036, 2038, 2039, 2042, 2048, 2070, 2074, 2075, ++ 2084, 2085, 2088, 2089, 2096, 2112, 2137, 2142, 2208, 2210, ++ 2276, 2304, 2307, 2308, 2362, 2363, 2364, 2365, 2366, 2369, ++ 2377, 2381, 2382, 2384, 2385, 2392, 2402, 2404, 2406, 2416, ++ 2417, 2418, 2425, 2433, 2434, 2437, 2447, 2451, 2474, 2482, ++ 2486, 2492, 2493, 2494, 2497, 2503, 2507, 2509, 2510, 2519, ++ 2524, 2527, 2530, 2534, 2544, 2546, 2548, 2554, 2555, 2561, ++ 2563, 2565, 2575, 2579, 2602, 2610, 2613, 2616, 2620, 2622, ++ 2625, 2631, 2635, 2641, 2649, 2654, 2662, 2672, 2674, 2677, ++ 2689, 2691, 2693, 2703, 2707, 2730, 2738, 2741, 2748, 2749, ++ 2750, 2753, 2759, 2761, 2763, 2765, 2768, 2784, 2786, 2790, ++ 2800, 2801, 2817, 2818, 2821, 2831, 2835, 2858, 2866, 2869, ++ 2876, 2877, 2878, 2879, 2880, 2881, 2887, 2891, 2893, 2902, ++ 2903, 2908, 2911, 2914, 2918, 2928, 2929, 2930, 2946, 2947, ++ 2949, 2958, 2962, 2969, 2972, 2974, 2979, 2984, 2990, 3006, ++ 3008, 3009, 3014, 3018, 3021, 3024, 3031, 3046, 3056, 3059, ++ 3065, 3066, 3073, 3077, 3086, 3090, 3114, 3125, 3133, 3134, ++ 3137, 3142, 3146, 3157, 3160, 3168, 3170, 3174, 3192, 3199, ++ 3202, 3205, 3214, 3218, 3242, 3253, 3260, 3261, 3262, 3263, ++ 3264, 3270, 3271, 3274, 3276, 3285, 3294, 3296, 3298, 3302, ++ 3313, 3330, 3333, 3342, 3346, 3389, 3390, 3393, 3398, 3402, ++ 3405, 3406, 3415, 3424, 3426, 3430, 3440, 3449, 3450, 3458, ++ 3461, 3482, 3507, 3517, 3520, 3530, 3535, 3538, 3542, 3544, ++ 3570, 3572, 3585, 3633, 3634, 3636, 3647, 3648, 3654, 3655, ++ 3663, 3664, 3674, 3713, 3716, 3719, 3722, 3725, 3732, 3737, ++ 3745, 3749, 3751, 3754, 3757, 3761, 3762, 3764, 3771, 3773, ++ 3776, 3782, 3784, 3792, 3804, 3840, 3841, 3844, 3859, 3860, ++ 3861, 3864, 3866, 3872, 3882, 3892, 3893, 3894, 3895, 3896, ++ 3897, 3898, 3899, 3900, 3901, 3902, 3904, 3913, 3953, 3967, ++ 3968, 3973, 3974, 3976, 3981, 3993, 4030, 4038, 4039, 4046, ++ 4048, 4053, 4057, 4096, 4139, 4141, 4145, 4146, 4152, 4153, ++ 4155, 4157, 4159, 4160, 4170, 4176, 4182, 4184, 4186, 4190, ++ 4193, 4194, 4197, 4199, 4206, 4209, 4213, 4226, 4227, 4229, ++ 4231, 4237, 4238, 4239, 4240, 4250, 4253, 4254, 4256, 4295, ++ 4301, 4304, 4347, 4348, 4349, 4682, 4688, 4696, 4698, 4704, ++ 4746, 4752, 4786, 4792, 4800, 4802, 4808, 4824, 4882, 4888, ++ 4957, 4960, 4969, 4992, 5008, 5024, 5120, 5121, 5741, 5743, ++ 5760, 5761, 5787, 5788, 5792, 5867, 5870, 5888, 5902, 5906, ++ 5920, 5938, 5941, 5952, 5970, 5984, 5998, 6002, 6016, 6068, ++ 6070, 6071, 6078, 6086, 6087, 6089, 6100, 6103, 6104, 6107, ++ 6108, 6109, 6112, 6128, 6144, 6150, 6151, 6155, 6158, 6160, ++ 6176, 6211, 6212, 6272, 6313, 6314, 6320, 6400, 6432, 6435, ++ 6439, 6441, 6448, 6450, 6451, 6457, 6464, 6468, 6470, 6480, ++ 6512, 6528, 6576, 6593, 6600, 6608, 6618, 6622, 6656, 6679, ++ 6681, 6686, 6688, 6741, 6742, 6743, 6744, 6752, 6753, 6754, ++ 6755, 6757, 6765, 6771, 6783, 6784, 6800, 6816, 6823, 6824, ++ 6912, 6916, 6917, 6964, 6965, 6966, 6971, 6972, 6973, 6978, ++ 6979, 6981, 6992, 7002, 7009, 7019, 7028, 7040, 7042, 7043, ++ 7073, 7074, 7078, 7080, 7082, 7083, 7084, 7086, 7088, 7098, ++ 7142, 7143, 7144, 7146, 7149, 7150, 7151, 7154, 7164, 7168, ++ 7204, 7212, 7220, 7222, 7227, 7232, 7245, 7248, 7258, 7288, ++ 7294, 7360, 7376, 7379, 7380, 7393, 7394, 7401, 7405, 7406, ++ 7410, 7412, 7413, 7424, 7468, 7531, 7544, 7545, 7579, 7616, ++ 7676, 7680, 7830, 7838, 7936, 7944, 7952, 7960, 7968, 7976, ++ 7984, 7992, 8000, 8008, 8016, 8025, 8027, 8029, 8031, 8033, ++ 8040, 8048, 8064, 8072, 8080, 8088, 8096, 8104, 8112, 8118, ++ 8120, 8124, 8125, 8126, 8127, 8130, 8134, 8136, 8140, 8141, ++ 8144, 8150, 8152, 8157, 8160, 8168, 8173, 8178, 8182, 8184, ++ 8188, 8189, 8192, 8203, 8208, 8214, 8216, 8217, 8218, 8219, ++ 8221, 8222, 8223, 8224, 8232, 8233, 8234, 8239, 8240, 8249, ++ 8250, 8251, 8255, 8257, 8260, 8261, 8262, 8263, 8274, 8275, ++ 8276, 8277, 8287, 8288, 8298, 8304, 8305, 8308, 8314, 8317, ++ 8318, 8319, 8320, 8330, 8333, 8334, 8336, 8352, 8400, 8413, ++ 8417, 8418, 8421, 8448, 8450, 8451, 8455, 8456, 8458, 8459, ++ 8462, 8464, 8467, 8468, 8469, 8470, 8472, 8473, 8478, 8484, ++ 8485, 8486, 8487, 8488, 8489, 8490, 8494, 8495, 8496, 8500, ++ 8501, 8505, 8506, 8508, 8510, 8512, 8517, 8519, 8522, 8523, ++ 8524, 8526, 8527, 8528, 8544, 8579, 8581, 8585, 8592, 8597, ++ 8602, 8604, 8608, 8609, 8611, 8612, 8614, 8615, 8622, 8623, ++ 8654, 8656, 8658, 8659, 8660, 8661, 8692, 8960, 8968, 8972, ++ 8992, 8994, 9001, 9002, 9003, 9084, 9085, 9115, 9140, 9180, ++ 9186, 9216, 9280, 9312, 9372, 9450, 9472, 9655, 9656, 9665, ++ 9666, 9720, 9728, 9839, 9840, 9985, 10088, 10089, 10090, 10091, ++ 10092, 10093, 10094, 10095, 10096, 10097, 10098, 10099, 10100, 10101, ++ 10102, 10132, 10176, 10181, 10182, 10183, 10214, 10215, 10216, 10217, ++ 10218, 10219, 10220, 10221, 10222, 10223, 10224, 10240, 10496, 10627, ++ 10628, 10629, 10630, 10631, 10632, 10633, 10634, 10635, 10636, 10637, ++ 10638, 10639, 10640, 10641, 10642, 10643, 10644, 10645, 10646, 10647, ++ 10648, 10649, 10712, 10713, 10714, 10715, 10716, 10748, 10749, 10750, ++ 11008, 11056, 11077, 11079, 11088, 11264, 11312, 11360, 11363, 11365, ++ 11367, 11374, 11377, 11378, 11380, 11381, 11383, 11388, 11390, 11393, ++ 11394, 11492, 11493, 11499, 11503, 11506, 11513, 11517, 11518, 11520, ++ 11559, 11565, 11568, 11631, 11632, 11647, 11648, 11680, 11688, 11696, ++ 11704, 11712, 11720, 11728, 11736, 11744, 11776, 11778, 11779, 11780, ++ 11781, 11782, 11785, 11786, 11787, 11788, 11789, 11790, 11799, 11800, ++ 11802, 11803, 11804, 11805, 11806, 11808, 11809, 11810, 11811, 11812, ++ 11813, 11814, 11815, 11816, 11817, 11818, 11823, 11824, 11834, 11904, ++ 11931, 12032, 12272, 12288, 12289, 12292, 12293, 12294, 12295, 12296, ++ 12297, 12298, 12299, 12300, 12301, 12302, 12303, 12304, 12305, 12306, ++ 12308, 12309, 12310, 12311, 12312, 12313, 12314, 12315, 12316, 12317, ++ 12318, 12320, 12321, 12330, 12334, 12336, 12337, 12342, 12344, 12347, ++ 12348, 12349, 12350, 12353, 12441, 12443, 12445, 12447, 12448, 12449, ++ 12539, 12540, 12543, 12549, 12593, 12688, 12690, 12694, 12704, 12736, ++ 12784, 12800, 12832, 12842, 12872, 12880, 12881, 12896, 12928, 12938, ++ 12977, 12992, 13056, 13312, 19893, 19904, 19968, 40908, 40960, 40981, ++ 40982, 42128, 42192, 42232, 42238, 42240, 42508, 42509, 42512, 42528, ++ 42538, 42560, 42606, 42607, 42608, 42611, 42612, 42622, 42623, 42624, ++ 42655, 42656, 42726, 42736, 42738, 42752, 42775, 42784, 42786, 42800, ++ 42802, 42864, 42865, 42873, 42878, 42888, 42889, 42891, 42896, 42912, ++ 43000, 43002, 43003, 43010, 43011, 43014, 43015, 43019, 43020, 43043, ++ 43045, 43047, 43048, 43056, 43062, 43064, 43065, 43072, 43124, 43136, ++ 43138, 43188, 43204, 43214, 43216, 43232, 43250, 43256, 43259, 43264, ++ 43274, 43302, 43310, 43312, 43335, 43346, 43359, 43360, 43392, 43395, ++ 43396, 43443, 43444, 43446, 43450, 43452, 43453, 43457, 43471, 43472, ++ 43486, 43520, 43561, 43567, 43569, 43571, 43573, 43584, 43587, 43588, ++ 43596, 43597, 43600, 43612, 43616, 43632, 43633, 43639, 43642, 43643, ++ 43648, 43696, 43697, 43698, 43701, 43703, 43705, 43710, 43712, 43713, ++ 43714, 43739, 43741, 43742, 43744, 43755, 43756, 43758, 43760, 43762, ++ 43763, 43765, 43766, 43777, 43785, 43793, 43808, 43816, 43968, 44003, ++ 44005, 44006, 44008, 44009, 44011, 44012, 44013, 44016, 44032, 55203, ++ 55216, 55243, 55296, 56191, 56319, 57343, 57344, 63743, 63744, 64112, ++ 64256, 64275, 64285, 64286, 64287, 64297, 64298, 64312, 64318, 64320, ++ 64323, 64326, 64434, 64467, 64830, 64831, 64848, 64914, 65008, 65020, ++ 65021, 65024, 65040, 65047, 65048, 65049, 65056, 65072, 65073, 65075, ++ 65077, 65078, 65079, 65080, 65081, 65082, 65083, 65084, 65085, 65086, ++ 65087, 65088, 65089, 65090, 65091, 65092, 65093, 65095, 65096, 65097, ++ 65101, 65104, 65108, 65112, 65113, 65114, 65115, 65116, 65117, 65118, ++ 65119, 65122, 65123, 65124, 65128, 65129, 65130, 65136, 65142, 65279, ++ 65281, 65284, 65285, 65288, 65289, 65290, 65291, 65292, 65293, 65294, ++ 65296, 65306, 65308, 65311, 65313, 65339, 65340, 65341, 65342, 65343, ++ 65344, 65345, 65371, 65372, 65373, 65374, 65375, 65376, 65377, 65378, ++ 65379, 65380, 65382, 65392, 65393, 65438, 65440, 65474, 65482, 65490, ++ 65498, 65504, 65506, 65507, 65508, 65509, 65512, 65513, 65517, 65529, ++ 65532, 0, 13, 40, 60, 63, 80, 128, 256, 263, ++ 311, 320, 373, 377, 394, 400, 464, 509, 640, 672, ++ 768, 800, 816, 833, 834, 842, 896, 927, 928, 968, ++ 976, 977, 1024, 1064, 1104, 1184, 2048, 2056, 2058, 2103, ++ 2108, 2111, 2135, 2136, 2304, 2326, 2335, 2336, 2367, 2432, ++ 2494, 2560, 2561, 2565, 2572, 2576, 2581, 2585, 2616, 2623, ++ 2624, 2640, 2656, 2685, 2687, 2816, 2873, 2880, 2904, 2912, ++ 2936, 3072, 3680, 4096, 4097, 4098, 4099, 4152, 4167, 4178, ++ 4198, 4224, 4226, 4227, 4272, 4275, 4279, 4281, 4283, 4285, ++ 4286, 4304, 4336, 4352, 4355, 4391, 4396, 4397, 4406, 4416, ++ 4480, 4482, 4483, 4531, 4534, 4543, 4545, 4549, 4560, 5760, ++ 5803, 5804, 5805, 5806, 5808, 5814, 5815, 5824, 8192, 9216, ++ 9328, 12288, 26624, 28416, 28496, 28497, 28559, 28563, 45056, 53248, ++ 53504, 53545, 53605, 53607, 53610, 53613, 53619, 53627, 53635, 53637, ++ 53644, 53674, 53678, 53760, 53826, 53829, 54016, 54112, 54272, 54298, ++ 54324, 54350, 54358, 54376, 54402, 54428, 54430, 54434, 54437, 54441, ++ 54446, 54454, 54459, 54461, 54469, 54480, 54506, 54532, 54535, 54541, ++ 54550, 54558, 54584, 54587, 54592, 54598, 54602, 54610, 54636, 54662, ++ 54688, 54714, 54740, 54766, 54792, 54818, 54844, 54870, 54896, 54922, ++ 54952, 54977, 54978, 55003, 55004, 55010, 55035, 55036, 55061, 55062, ++ 55068, 55093, 55094, 55119, 55120, 55126, 55151, 55152, 55177, 55178, ++ 55184, 55209, 55210, 55235, 55236, 55242, 55246, 60928, 60933, 60961, ++ 60964, 60967, 60969, 60980, 60985, 60987, 60994, 60999, 61001, 61003, ++ 61005, 61009, 61012, 61015, 61017, 61019, 61021, 61023, 61025, 61028, ++ 61031, 61036, 61044, 61049, 61054, 61056, 61067, 61089, 61093, 61099, ++ 61168, 61440, 61488, 61600, 61617, 61633, 61649, 61696, 61712, 61744, ++ 61808, 61926, 61968, 62016, 62032, 62208, 62256, 62263, 62336, 62368, ++ 62406, 62432, 62464, 62528, 62530, 62713, 62720, 62784, 62800, 62971, ++ 63045, 63104, 63232, 0, 42710, 42752, 46900, 46912, 47133, 63488, ++ 1, 32, 256, 0, 65533, ++ }; ++static u16 aFts5UnicodeData[] = { ++ 1025, 61, 117, 55, 117, 54, 50, 53, 57, 53, ++ 49, 85, 333, 85, 121, 85, 841, 54, 53, 50, ++ 56, 48, 56, 837, 54, 57, 50, 57, 1057, 61, ++ 53, 151, 58, 53, 56, 58, 39, 52, 57, 34, ++ 58, 56, 58, 57, 79, 56, 37, 85, 56, 47, ++ 39, 51, 111, 53, 745, 57, 233, 773, 57, 261, ++ 1822, 37, 542, 37, 1534, 222, 69, 73, 37, 126, ++ 126, 73, 69, 137, 37, 73, 37, 105, 101, 73, ++ 37, 73, 37, 190, 158, 37, 126, 126, 73, 37, ++ 126, 94, 37, 39, 94, 69, 135, 41, 40, 37, ++ 41, 40, 37, 41, 40, 37, 542, 37, 606, 37, ++ 41, 40, 37, 126, 73, 37, 1886, 197, 73, 37, ++ 73, 69, 126, 105, 37, 286, 2181, 39, 869, 582, ++ 152, 390, 472, 166, 248, 38, 56, 38, 568, 3596, ++ 158, 38, 56, 94, 38, 101, 53, 88, 41, 53, ++ 105, 41, 73, 37, 553, 297, 1125, 94, 37, 105, ++ 101, 798, 133, 94, 57, 126, 94, 37, 1641, 1541, ++ 1118, 58, 172, 75, 1790, 478, 37, 2846, 1225, 38, ++ 213, 1253, 53, 49, 55, 1452, 49, 44, 53, 76, ++ 53, 76, 53, 44, 871, 103, 85, 162, 121, 85, ++ 55, 85, 90, 364, 53, 85, 1031, 38, 327, 684, ++ 333, 149, 71, 44, 3175, 53, 39, 236, 34, 58, ++ 204, 70, 76, 58, 140, 71, 333, 103, 90, 39, ++ 469, 34, 39, 44, 967, 876, 2855, 364, 39, 333, ++ 1063, 300, 70, 58, 117, 38, 711, 140, 38, 300, ++ 38, 108, 38, 172, 501, 807, 108, 53, 39, 359, ++ 876, 108, 42, 1735, 44, 42, 44, 39, 106, 268, ++ 138, 44, 74, 39, 236, 327, 76, 85, 333, 53, ++ 38, 199, 231, 44, 74, 263, 71, 711, 231, 39, ++ 135, 44, 39, 106, 140, 74, 74, 44, 39, 42, ++ 71, 103, 76, 333, 71, 87, 207, 58, 55, 76, ++ 42, 199, 71, 711, 231, 71, 71, 71, 44, 106, ++ 76, 76, 108, 44, 135, 39, 333, 76, 103, 44, ++ 76, 42, 295, 103, 711, 231, 71, 167, 44, 39, ++ 106, 172, 76, 42, 74, 44, 39, 71, 76, 333, ++ 53, 55, 44, 74, 263, 71, 711, 231, 71, 167, ++ 44, 39, 42, 44, 42, 140, 74, 74, 44, 44, ++ 42, 71, 103, 76, 333, 58, 39, 207, 44, 39, ++ 199, 103, 135, 71, 39, 71, 71, 103, 391, 74, ++ 44, 74, 106, 106, 44, 39, 42, 333, 111, 218, ++ 55, 58, 106, 263, 103, 743, 327, 167, 39, 108, ++ 138, 108, 140, 76, 71, 71, 76, 333, 239, 58, ++ 74, 263, 103, 743, 327, 167, 44, 39, 42, 44, ++ 170, 44, 74, 74, 76, 74, 39, 71, 76, 333, ++ 71, 74, 263, 103, 1319, 39, 106, 140, 106, 106, ++ 44, 39, 42, 71, 76, 333, 207, 58, 199, 74, ++ 583, 775, 295, 39, 231, 44, 106, 108, 44, 266, ++ 74, 53, 1543, 44, 71, 236, 55, 199, 38, 268, ++ 53, 333, 85, 71, 39, 71, 39, 39, 135, 231, ++ 103, 39, 39, 71, 135, 44, 71, 204, 76, 39, ++ 167, 38, 204, 333, 135, 39, 122, 501, 58, 53, ++ 122, 76, 218, 333, 335, 58, 44, 58, 44, 58, ++ 44, 54, 50, 54, 50, 74, 263, 1159, 460, 42, ++ 172, 53, 76, 167, 364, 1164, 282, 44, 218, 90, ++ 181, 154, 85, 1383, 74, 140, 42, 204, 42, 76, ++ 74, 76, 39, 333, 213, 199, 74, 76, 135, 108, ++ 39, 106, 71, 234, 103, 140, 423, 44, 74, 76, ++ 202, 44, 39, 42, 333, 106, 44, 90, 1225, 41, ++ 41, 1383, 53, 38, 10631, 135, 231, 39, 135, 1319, ++ 135, 1063, 135, 231, 39, 135, 487, 1831, 135, 2151, ++ 108, 309, 655, 519, 346, 2727, 49, 19847, 85, 551, ++ 61, 839, 54, 50, 2407, 117, 110, 423, 135, 108, ++ 583, 108, 85, 583, 76, 423, 103, 76, 1671, 76, ++ 42, 236, 266, 44, 74, 364, 117, 38, 117, 55, ++ 39, 44, 333, 335, 213, 49, 149, 108, 61, 333, ++ 1127, 38, 1671, 1319, 44, 39, 2247, 935, 108, 138, ++ 76, 106, 74, 44, 202, 108, 58, 85, 333, 967, ++ 167, 1415, 554, 231, 74, 333, 47, 1114, 743, 76, ++ 106, 85, 1703, 42, 44, 42, 236, 44, 42, 44, ++ 74, 268, 202, 332, 44, 333, 333, 245, 38, 213, ++ 140, 42, 1511, 44, 42, 172, 42, 44, 170, 44, ++ 74, 231, 333, 245, 346, 300, 314, 76, 42, 967, ++ 42, 140, 74, 76, 42, 44, 74, 71, 333, 1415, ++ 44, 42, 76, 106, 44, 42, 108, 74, 149, 1159, ++ 266, 268, 74, 76, 181, 333, 103, 333, 967, 198, ++ 85, 277, 108, 53, 428, 42, 236, 135, 44, 135, ++ 74, 44, 71, 1413, 2022, 421, 38, 1093, 1190, 1260, ++ 140, 4830, 261, 3166, 261, 265, 197, 201, 261, 265, ++ 261, 265, 197, 201, 261, 41, 41, 41, 94, 229, ++ 265, 453, 261, 264, 261, 264, 261, 264, 165, 69, ++ 137, 40, 56, 37, 120, 101, 69, 137, 40, 120, ++ 133, 69, 137, 120, 261, 169, 120, 101, 69, 137, ++ 40, 88, 381, 162, 209, 85, 52, 51, 54, 84, ++ 51, 54, 52, 277, 59, 60, 162, 61, 309, 52, ++ 51, 149, 80, 117, 57, 54, 50, 373, 57, 53, ++ 48, 341, 61, 162, 194, 47, 38, 207, 121, 54, ++ 50, 38, 335, 121, 54, 50, 422, 855, 428, 139, ++ 44, 107, 396, 90, 41, 154, 41, 90, 37, 105, ++ 69, 105, 37, 58, 41, 90, 57, 169, 218, 41, ++ 58, 41, 58, 41, 58, 137, 58, 37, 137, 37, ++ 135, 37, 90, 69, 73, 185, 94, 101, 58, 57, ++ 90, 37, 58, 527, 1134, 94, 142, 47, 185, 186, ++ 89, 154, 57, 90, 57, 90, 57, 250, 57, 1018, ++ 89, 90, 57, 58, 57, 1018, 8601, 282, 153, 666, ++ 89, 250, 54, 50, 2618, 57, 986, 825, 1306, 217, ++ 602, 1274, 378, 1935, 2522, 719, 5882, 57, 314, 57, ++ 1754, 281, 3578, 57, 4634, 3322, 54, 50, 54, 50, ++ 54, 50, 54, 50, 54, 50, 54, 50, 54, 50, ++ 975, 1434, 185, 54, 50, 1017, 54, 50, 54, 50, ++ 54, 50, 54, 50, 54, 50, 537, 8218, 4217, 54, ++ 50, 54, 50, 54, 50, 54, 50, 54, 50, 54, ++ 50, 54, 50, 54, 50, 54, 50, 54, 50, 54, ++ 50, 2041, 54, 50, 54, 50, 1049, 54, 50, 8281, ++ 1562, 697, 90, 217, 346, 1513, 1509, 126, 73, 69, ++ 254, 105, 37, 94, 37, 94, 165, 70, 105, 37, ++ 3166, 37, 218, 158, 108, 94, 149, 47, 85, 1221, ++ 37, 37, 1799, 38, 53, 44, 743, 231, 231, 231, ++ 231, 231, 231, 231, 231, 1036, 85, 52, 51, 52, ++ 51, 117, 52, 51, 53, 52, 51, 309, 49, 85, ++ 49, 53, 52, 51, 85, 52, 51, 54, 50, 54, ++ 50, 54, 50, 54, 50, 181, 38, 341, 81, 858, ++ 2874, 6874, 410, 61, 117, 58, 38, 39, 46, 54, ++ 50, 54, 50, 54, 50, 54, 50, 54, 50, 90, ++ 54, 50, 54, 50, 54, 50, 54, 50, 49, 54, ++ 82, 58, 302, 140, 74, 49, 166, 90, 110, 38, ++ 39, 53, 90, 2759, 76, 88, 70, 39, 49, 2887, ++ 53, 102, 39, 1319, 3015, 90, 143, 346, 871, 1178, ++ 519, 1018, 335, 986, 271, 58, 495, 1050, 335, 1274, ++ 495, 2042, 8218, 39, 39, 2074, 39, 39, 679, 38, ++ 36583, 1786, 1287, 198, 85, 8583, 38, 117, 519, 333, ++ 71, 1502, 39, 44, 107, 53, 332, 53, 38, 798, ++ 44, 2247, 334, 76, 213, 760, 294, 88, 478, 69, ++ 2014, 38, 261, 190, 350, 38, 88, 158, 158, 382, ++ 70, 37, 231, 44, 103, 44, 135, 44, 743, 74, ++ 76, 42, 154, 207, 90, 55, 58, 1671, 149, 74, ++ 1607, 522, 44, 85, 333, 588, 199, 117, 39, 333, ++ 903, 268, 85, 743, 364, 74, 53, 935, 108, 42, ++ 1511, 44, 74, 140, 74, 44, 138, 437, 38, 333, ++ 85, 1319, 204, 74, 76, 74, 76, 103, 44, 263, ++ 44, 42, 333, 149, 519, 38, 199, 122, 39, 42, ++ 1543, 44, 39, 108, 71, 76, 167, 76, 39, 44, ++ 39, 71, 38, 85, 359, 42, 76, 74, 85, 39, ++ 70, 42, 44, 199, 199, 199, 231, 231, 1127, 74, ++ 44, 74, 44, 74, 53, 42, 44, 333, 39, 39, ++ 743, 1575, 36, 68, 68, 36, 63, 63, 11719, 3399, ++ 229, 165, 39, 44, 327, 57, 423, 167, 39, 71, ++ 71, 3463, 536, 11623, 54, 50, 2055, 1735, 391, 55, ++ 58, 524, 245, 54, 50, 53, 236, 53, 81, 80, ++ 54, 50, 54, 50, 54, 50, 54, 50, 54, 50, ++ 54, 50, 54, 50, 54, 50, 85, 54, 50, 149, ++ 112, 117, 149, 49, 54, 50, 54, 50, 54, 50, ++ 117, 57, 49, 121, 53, 55, 85, 167, 4327, 34, ++ 117, 55, 117, 54, 50, 53, 57, 53, 49, 85, ++ 333, 85, 121, 85, 841, 54, 53, 50, 56, 48, ++ 56, 837, 54, 57, 50, 57, 54, 50, 53, 54, ++ 50, 85, 327, 38, 1447, 70, 999, 199, 199, 199, ++ 103, 87, 57, 56, 58, 87, 58, 153, 90, 98, ++ 90, 391, 839, 615, 71, 487, 455, 3943, 117, 1455, ++ 314, 1710, 143, 570, 47, 410, 1466, 44, 935, 1575, ++ 999, 143, 551, 46, 263, 46, 967, 53, 1159, 263, ++ 53, 174, 1289, 1285, 2503, 333, 199, 39, 1415, 71, ++ 39, 743, 53, 271, 711, 207, 53, 839, 53, 1799, ++ 71, 39, 108, 76, 140, 135, 103, 871, 108, 44, ++ 271, 309, 935, 79, 53, 1735, 245, 711, 271, 615, ++ 271, 2343, 1007, 42, 44, 42, 1703, 492, 245, 655, ++ 333, 76, 42, 1447, 106, 140, 74, 76, 85, 34, ++ 149, 807, 333, 108, 1159, 172, 42, 268, 333, 149, ++ 76, 42, 1543, 106, 300, 74, 135, 149, 333, 1383, ++ 44, 42, 44, 74, 204, 42, 44, 333, 28135, 3182, ++ 149, 34279, 18215, 2215, 39, 1482, 140, 422, 71, 7898, ++ 1274, 1946, 74, 108, 122, 202, 258, 268, 90, 236, ++ 986, 140, 1562, 2138, 108, 58, 2810, 591, 841, 837, ++ 841, 229, 581, 841, 837, 41, 73, 41, 73, 137, ++ 265, 133, 37, 229, 357, 841, 837, 73, 137, 265, ++ 233, 837, 73, 137, 169, 41, 233, 837, 841, 837, ++ 841, 837, 841, 837, 841, 837, 841, 837, 841, 901, ++ 809, 57, 805, 57, 197, 809, 57, 805, 57, 197, ++ 809, 57, 805, 57, 197, 809, 57, 805, 57, 197, ++ 809, 57, 805, 57, 197, 94, 1613, 135, 871, 71, ++ 39, 39, 327, 135, 39, 39, 39, 39, 39, 39, ++ 103, 71, 39, 39, 39, 39, 39, 39, 71, 39, ++ 135, 231, 135, 135, 39, 327, 551, 103, 167, 551, ++ 89, 1434, 3226, 506, 474, 506, 506, 367, 1018, 1946, ++ 1402, 954, 1402, 314, 90, 1082, 218, 2266, 666, 1210, ++ 186, 570, 2042, 58, 5850, 154, 2010, 154, 794, 2266, ++ 378, 2266, 3738, 39, 39, 39, 39, 39, 39, 17351, ++ 34, 3074, 7692, 63, 63, ++ }; ++ ++int sqlite3Fts5UnicodeCategory(u32 iCode) { ++ int iRes = -1; ++ int iHi; ++ int iLo; ++ int ret; ++ u16 iKey; ++ ++ if( iCode>=(1<<20) ){ ++ return 0; ++ } ++ iLo = aFts5UnicodeBlock[(iCode>>16)]; ++ iHi = aFts5UnicodeBlock[1+(iCode>>16)]; ++ iKey = (iCode & 0xFFFF); ++ while( iHi>iLo ){ ++ int iTest = (iHi + iLo) / 2; ++ assert( iTest>=iLo && iTest=aFts5UnicodeMap[iTest] ){ ++ iRes = iTest; ++ iLo = iTest+1; ++ }else{ ++ iHi = iTest; ++ } ++ } ++ ++ if( iRes<0 ) return 0; ++ if( iKey>=(aFts5UnicodeMap[iRes]+(aFts5UnicodeData[iRes]>>5)) ) return 0; ++ ret = aFts5UnicodeData[iRes] & 0x1F; ++ if( ret!=30 ) return ret; ++ return ((iKey - aFts5UnicodeMap[iRes]) & 0x01) ? 5 : 9; ++} ++ ++void sqlite3Fts5UnicodeAscii(u8 *aArray, u8 *aAscii){ ++ int i = 0; ++ int iTbl = 0; ++ while( i<128 ){ ++ int bToken = aArray[ aFts5UnicodeData[iTbl] & 0x1F ]; ++ int n = (aFts5UnicodeData[iTbl] >> 5) + i; ++ for(; i<128 && i ++#include ++ ++typedef uint8_t u8; ++typedef uint16_t u16; ++typedef uint16_t u32; ++ ++#include "fts5_unicode2.c" ++ ++/* ++** The following macro - WRITE_UTF8 - have been copied ++** from the sqlite3 source file: ++*https://github.com/sqlite/sqlite/blob/88282af521692b398b0d0cc58a8bdb220a8ff58c/ext/fts5/fts5_tokenize.c. ++*/ ++//#ifndef SQLITE_CORE ++static const unsigned char sqlite3Utf8Trans1[] = { ++ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, ++ 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, ++ 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x00, ++ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, ++ 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, ++ 0x07, 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x00, 0x00, ++}; ++ ++#define READ_UTF8(zIn, zTerm, c) \ ++ c = *(zIn++); \ ++ if (c >= 0xc0) { \ ++ c = sqlite3Utf8Trans1[c - 0xc0]; \ ++ while (zIn < zTerm && (*zIn & 0xc0) == 0x80) { \ ++ c = (c << 6) + (0x3f & *(zIn++)); \ ++ } \ ++ if (c < 0x80 || (c & 0xFFFFF800) == 0xD800 || \ ++ (c & 0xFFFFFFFE) == 0xFFFE) { \ ++ c = 0xFFFD; \ ++ } \ ++ } ++ ++#define WRITE_UTF8(zOut, c) \ ++ { \ ++ if (c < 0x00080) { \ ++ *zOut++ = (unsigned char)(c & 0xFF); \ ++ } else if (c < 0x00800) { \ ++ *zOut++ = 0xC0 + (unsigned char)((c >> 6) & 0x1F); \ ++ *zOut++ = 0x80 + (unsigned char)(c & 0x3F); \ ++ } else if (c < 0x10000) { \ ++ *zOut++ = 0xE0 + (unsigned char)((c >> 12) & 0x0F); \ ++ *zOut++ = 0x80 + (unsigned char)((c >> 6) & 0x3F); \ ++ *zOut++ = 0x80 + (unsigned char)(c & 0x3F); \ ++ } else { \ ++ *zOut++ = 0xF0 + (unsigned char)((c >> 18) & 0x07); \ ++ *zOut++ = 0x80 + (unsigned char)((c >> 12) & 0x3F); \ ++ *zOut++ = 0x80 + (unsigned char)((c >> 6) & 0x3F); \ ++ *zOut++ = 0x80 + (unsigned char)(c & 0x3F); \ ++ } \ ++ } ++ ++#define FTS5_SKIP_UTF8(zIn) \ ++ { \ ++ if (((unsigned char)(*(zIn++))) >= 0xc0) { \ ++ while ((((unsigned char)*zIn) & 0xc0) == 0x80) { \ ++ zIn++; \ ++ } \ ++ } \ ++ } ++//#endif ++ ++/* Function to optionally fold case and remove diacritics */ ++static inline int customFold(int iCode, int foldCase, int removeDiacritics) { ++ if (iCode == 0) ++ return iCode; ++ if (foldCase) ++ return sqlite3Fts5UnicodeFold(iCode, removeDiacritics); ++ return iCode; ++} ++ ++static void tokenize(const char *pText, int nText, int foldCase, ++ int removeDiacritics, void *pCtx, ++ int (*xToken)(void *, int, const char *, int, int, int)) { ++ const unsigned char *zIn = (const unsigned char *)pText; ++ const unsigned char *zEnd = zIn + nText; ++ char aBuf[32]; /* Buffer for trigram tokens */ ++ char *zOut = aBuf; ++ int iCode; ++ int aStart[3]; // offsets for each character in a trigram ++ int i = 0; // index inside the trigram ++ int isPartial = 0; // flag to indicate we are in the middle of a word ++ ++ while (zIn < zEnd) { ++ int start; ++ ++ do { ++ start = zIn - (const unsigned char *)pText; ++ READ_UTF8(zIn, zEnd, iCode); ++ if (iCode == 0) ++ break; ++ iCode = customFold(iCode, foldCase, removeDiacritics); ++ } while (iCode == 0); ++ ++ if (iCode == 0) ++ break; ++ ++ if (i == 3) { ++ int result = xToken(pCtx, 0, aBuf, zOut - aBuf, aStart[0], start); ++ if (result != 0) ++ break; ++ ++ // remove first UTF-8 character from aBuf ++ const char *z1 = aBuf; ++ FTS5_SKIP_UTF8(z1); ++ memmove(aBuf, z1, zOut - z1); ++ // seek zOut back 1 step so we can add the next character ++ // of the trigram ++ zOut = zOut - (z1 - aBuf); ++ ++ // swap the offsets ++ aStart[0] = aStart[1]; ++ aStart[1] = aStart[2]; ++ ++ i--; ++ isPartial = 1; ++ } ++ ++ if (iCode == 32) { ++ // write words smaller than 3 characters directly to output ++ // but make sure we aren't at the end of a word ++ if (!isPartial && i && i < 3) { ++ int result = xToken(pCtx, 0, aBuf, zOut - aBuf, aStart[0], start); ++ if (result != 0) ++ break; ++ } ++ ++ // reset for next word ++ isPartial = 0; ++ i = 0; ++ zOut = aBuf; ++ continue; ++ } ++ ++ aStart[i++] = start; ++ WRITE_UTF8(zOut, iCode); ++ } ++ ++ // write out the remaining tokens if any ++ if (i > 0) { ++ xToken(pCtx, 0, aBuf, zOut - aBuf, aStart[0], ++ zIn - (const unsigned char *)pText); ++ } ++} diff --git a/node_modules/react-native-quick-sqlite/cpp/.DS_Store b/node_modules/react-native-quick-sqlite/cpp/.DS_Store new file mode 100644 index 0000000..e69de29 @@ -106968,31 +109616,448 @@ index 9b284d2..bda794a 100644 + +#endif diff --git a/node_modules/react-native-quick-sqlite/cpp/sqliteBridge.cpp b/node_modules/react-native-quick-sqlite/cpp/sqliteBridge.cpp -index 9ffe010..0655b3a 100644 +index 9ffe010..748a1f6 100644 --- a/node_modules/react-native-quick-sqlite/cpp/sqliteBridge.cpp +++ b/node_modules/react-native-quick-sqlite/cpp/sqliteBridge.cpp -@@ -89,8 +89,14 @@ SQLiteOPResult sqliteOpenDb(string const dbName, string const docPath) - sqlite3 *db; +@@ -20,6 +20,8 @@ + using namespace std; + using namespace facebook; + ++extern "C" int sqlite3Fts5BetterTrigramInit(sqlite3 *db); ++ + map dbMap = map(); + + bool folder_exists(const std::string &foldername) +@@ -90,12 +92,16 @@ SQLiteOPResult sqliteOpenDb(string const dbName, string const docPath) int exit = 0; exit = sqlite3_open_v2(dbPath.c_str(), &db, sqlOpenFlags, nullptr); -+ exit = sqlite3_enable_load_extension(db, 1); -- if (exit != SQLITE_OK) -+ if (exit == SQLITE_OK) { -+ char *errorMessage; -+ exit = sqlite3_load_extension(db, "better-trigram","sqlite3_bettertrigram_init", &errorMessage); ++ if (exit == SQLITE_OK) ++ { ++ sqlite3Fts5BetterTrigramInit(db); + } + -+ if (exit != SQLITE_OK) + if (exit != SQLITE_OK) { return SQLiteOPResult{ - .type = SQLiteError, -@@ -102,6 +108,8 @@ SQLiteOPResult sqliteOpenDb(string const dbName, string const docPath) - dbMap[dbName] = db; +- .type = SQLiteError, +- .errorMessage = sqlite3_errmsg(db) +- }; ++ .type = SQLiteError, ++ .errorMessage = sqlite3_errmsg(db)}; + } + else + { +@@ -103,9 +109,8 @@ SQLiteOPResult sqliteOpenDb(string const dbName, string const docPath) } -+ -+ return SQLiteOPResult{ - .type = SQLiteOk, - .rowsAffected = 0 +- .type = SQLiteOk, +- .rowsAffected = 0 +- }; ++ .type = SQLiteOk, ++ .rowsAffected = 0}; + } + + SQLiteOPResult sqliteCloseDb(string const dbName) +@@ -114,8 +119,8 @@ SQLiteOPResult sqliteCloseDb(string const dbName) + if (dbMap.count(dbName) == 0) + { + return SQLiteOPResult{ +- .type = SQLiteError, +- .errorMessage = dbName + " is not open", ++ .type = SQLiteError, ++ .errorMessage = dbName + " is not open", + }; + } + +@@ -126,12 +131,14 @@ SQLiteOPResult sqliteCloseDb(string const dbName) + dbMap.erase(dbName); + + return SQLiteOPResult{ +- .type = SQLiteOk, ++ .type = SQLiteOk, + }; + } + +-void sqliteCloseAll() { +- for (auto const& x : dbMap) { ++void sqliteCloseAll() ++{ ++ for (auto const &x : dbMap) ++ { + // In certain cases, this will return SQLITE_OK, mark the database connection as an unusable "zombie", + // and deallocate the connection later. + sqlite3_close_v2(x.second); +@@ -150,12 +157,12 @@ SQLiteOPResult sqliteAttachDb(string const mainDBName, string const docPath, str + if (result.type == SQLiteError) + { + return SQLiteOPResult{ +- .type = SQLiteError, +- .errorMessage = mainDBName + " was unable to attach another database: " + string(result.message), ++ .type = SQLiteError, ++ .errorMessage = mainDBName + " was unable to attach another database: " + string(result.message), + }; + } + return SQLiteOPResult{ +- .type = SQLiteOk, ++ .type = SQLiteOk, + }; + } + +@@ -169,12 +176,12 @@ SQLiteOPResult sqliteDetachDb(string const mainDBName, string const alias) + if (result.type == SQLiteError) + { + return SQLiteOPResult{ +- .type = SQLiteError, +- .errorMessage = mainDBName + "was unable to detach database: " + string(result.message), ++ .type = SQLiteError, ++ .errorMessage = mainDBName + "was unable to detach database: " + string(result.message), + }; + } + return SQLiteOPResult{ +- .type = SQLiteOk, ++ .type = SQLiteOk, + }; + } + +@@ -194,15 +201,14 @@ SQLiteOPResult sqliteRemoveDb(string const dbName, string const docPath) + if (!file_exists(dbPath)) + { + return SQLiteOPResult{ +- .type = SQLiteOk, +- .errorMessage = "[react-native-quick-sqlite]: Database file not found" + dbPath +- }; ++ .type = SQLiteOk, ++ .errorMessage = "[react-native-quick-sqlite]: Database file not found" + dbPath}; + } + + remove(dbPath.c_str()); + + return SQLiteOPResult{ +- .type = SQLiteOk, ++ .type = SQLiteOk, + }; + } + +@@ -256,10 +262,9 @@ SQLiteOPResult sqliteExecute(string const dbName, string const &query, vector(); ++ count = sqlite3_column_count(statement); ++ ++ while (i < count) ++ { ++ column_type = sqlite3_column_type(statement, i); ++ column_name = sqlite3_column_name(statement, i); ++ ++ switch (column_type) ++ { ++ ++ case SQLITE_INTEGER: + { ++ /** ++ * It's not possible to send a int64_t in a jsi::Value because JS cannot represent the whole number range. ++ * Instead, we're sending a double, which can represent all integers up to 53 bits long, which is more ++ * than what was there before (a 32-bit int). ++ * ++ * See https://github.com/margelo/react-native-quick-sqlite/issues/16 for more context. ++ */ ++ double column_value = sqlite3_column_double(statement, i); ++ row[column_name] = createIntegerQuickValue(column_value); + break; + } + +- i = 0; +- row = map(); +- count = sqlite3_column_count(statement); ++ case SQLITE_FLOAT: ++ { ++ double column_value = sqlite3_column_double(statement, i); ++ row[column_name] = createDoubleQuickValue(column_value); ++ break; ++ } + +- while (i < count) ++ case SQLITE_TEXT: + { +- column_type = sqlite3_column_type(statement, i); +- column_name = sqlite3_column_name(statement, i); ++ const char *column_value = reinterpret_cast(sqlite3_column_text(statement, i)); ++ int byteLen = sqlite3_column_bytes(statement, i); ++ // Specify length too; in case string contains NULL in the middle (which SQLite supports!) ++ row[column_name] = createTextQuickValue(string(column_value, byteLen)); ++ break; ++ } + +- switch (column_type) +- { +- +- case SQLITE_INTEGER: +- { +- /** +- * It's not possible to send a int64_t in a jsi::Value because JS cannot represent the whole number range. +- * Instead, we're sending a double, which can represent all integers up to 53 bits long, which is more +- * than what was there before (a 32-bit int). +- * +- * See https://github.com/margelo/react-native-quick-sqlite/issues/16 for more context. +- */ +- double column_value = sqlite3_column_double(statement, i); +- row[column_name] = createIntegerQuickValue(column_value); +- break; +- } +- +- case SQLITE_FLOAT: +- { +- double column_value = sqlite3_column_double(statement, i); +- row[column_name] = createDoubleQuickValue(column_value); +- break; +- } +- +- case SQLITE_TEXT: +- { +- const char *column_value = reinterpret_cast(sqlite3_column_text(statement, i)); +- int byteLen = sqlite3_column_bytes(statement, i); +- // Specify length too; in case string contains NULL in the middle (which SQLite supports!) +- row[column_name] = createTextQuickValue(string(column_value, byteLen)); +- break; +- } +- +- case SQLITE_BLOB: +- { +- int blob_size = sqlite3_column_bytes(statement, i); +- const void *blob = sqlite3_column_blob(statement, i); +- uint8_t *data = new uint8_t[blob_size]; +- memcpy(data, blob, blob_size); +- row[column_name] = createArrayBufferQuickValue(data, blob_size); +- break; +- } +- +- case SQLITE_NULL: +- // Intentionally left blank to switch to default case +- default: +- row[column_name] = createNullQuickValue(); +- break; +- } +- i++; ++ case SQLITE_BLOB: ++ { ++ int blob_size = sqlite3_column_bytes(statement, i); ++ const void *blob = sqlite3_column_blob(statement, i); ++ uint8_t *data = new uint8_t[blob_size]; ++ memcpy(data, blob, blob_size); ++ row[column_name] = createArrayBufferQuickValue(data, blob_size); ++ break; + } +- results->push_back(move(row)); +- break; +- case SQLITE_DONE: +- if(metadata != NULL) ++ ++ case SQLITE_NULL: ++ // Intentionally left blank to switch to default case ++ default: ++ row[column_name] = createNullQuickValue(); ++ break; ++ } ++ i++; ++ } ++ results->push_back(move(row)); ++ break; ++ case SQLITE_DONE: ++ if (metadata != NULL) ++ { ++ i = 0; ++ count = sqlite3_column_count(statement); ++ while (i < count) + { +- i = 0; +- count = sqlite3_column_count(statement); +- while (i < count) +- { +- column_name = sqlite3_column_name(statement, i); +- const char *tp = sqlite3_column_decltype(statement, i); +- column_declared_type = tp != NULL ? tp : "UNKNOWN"; +- QuickColumnMetadata meta = { ++ column_name = sqlite3_column_name(statement, i); ++ const char *tp = sqlite3_column_decltype(statement, i); ++ column_declared_type = tp != NULL ? tp : "UNKNOWN"; ++ QuickColumnMetadata meta = { + .colunmName = column_name, + .columnIndex = i, + .columnDeclaredType = column_declared_type, +- }; +- metadata->push_back(meta); +- i++; +- } ++ }; ++ metadata->push_back(meta); ++ i++; + } +- isConsuming = false; +- break; ++ } ++ isConsuming = false; ++ break; + +- default: +- isFailed = true; +- isConsuming = false; ++ default: ++ isFailed = true; ++ isConsuming = false; + } + } + +@@ -396,19 +401,18 @@ SQLiteOPResult sqliteExecute(string const dbName, string const &query, vector(latestInsertRowId)}; ++ .type = SQLiteOk, ++ .rowsAffected = changedRowCount, ++ .insertId = static_cast(latestInsertRowId)}; + } + + SequelLiteralUpdateResult sqliteExecuteLiteral(string const dbName, string const &query) +@@ -417,10 +421,9 @@ SequelLiteralUpdateResult sqliteExecuteLiteral(string const dbName, string const + if (dbMap.count(dbName) == 0) + { + return { +- SQLiteError, +- "[react-native-quick-sqlite] Database not opened: " + dbName, +- 0 +- }; ++ SQLiteError, ++ "[react-native-quick-sqlite] Database not opened: " + dbName, ++ 0}; + } + + sqlite3 *db = dbMap[dbName]; +@@ -435,9 +438,9 @@ SequelLiteralUpdateResult sqliteExecuteLiteral(string const dbName, string const + { + const char *message = sqlite3_errmsg(db); + return { +- SQLiteError, +- "[react-native-quick-sqlite] SQL execution error: " + string(message), +- 0}; ++ SQLiteError, ++ "[react-native-quick-sqlite] SQL execution error: " + string(message), ++ 0}; + } + + bool isConsuming = true; +@@ -452,17 +455,17 @@ SequelLiteralUpdateResult sqliteExecuteLiteral(string const dbName, string const + + switch (result) + { +- case SQLITE_ROW: +- isConsuming = true; +- break; ++ case SQLITE_ROW: ++ isConsuming = true; ++ break; + +- case SQLITE_DONE: +- isConsuming = false; +- break; ++ case SQLITE_DONE: ++ isConsuming = false; ++ break; + +- default: +- isFailed = true; +- isConsuming = false; ++ default: ++ isFailed = true; ++ isConsuming = false; + } + } + +@@ -472,14 +475,14 @@ SequelLiteralUpdateResult sqliteExecuteLiteral(string const dbName, string const + { + const char *message = sqlite3_errmsg(db); + return { +- SQLiteError, +- "[react-native-quick-sqlite] SQL execution error: " + string(message), +- 0}; ++ SQLiteError, ++ "[react-native-quick-sqlite] SQL execution error: " + string(message), ++ 0}; + } + + int changedRowCount = sqlite3_changes(db); + return { +- SQLiteOk, +- "", +- changedRowCount}; ++ SQLiteOk, ++ "", ++ changedRowCount}; + } +diff --git a/node_modules/react-native-quick-sqlite/react-native-quick-sqlite.podspec b/node_modules/react-native-quick-sqlite/react-native-quick-sqlite.podspec +index 2ea7b1d..e354edf 100644 +--- a/node_modules/react-native-quick-sqlite/react-native-quick-sqlite.podspec ++++ b/node_modules/react-native-quick-sqlite/react-native-quick-sqlite.podspec +@@ -20,7 +20,7 @@ Pod::Spec.new do |s| + } + + s.header_mappings_dir = "cpp" +- s.source_files = "ios/**/*.{h,hpp,m,mm}", "cpp/**/*.{h,cpp,c}" ++ s.source_files = "ios/**/*.{h,hpp,m,mm}", "cpp/**/*.{h,cpp,c}", "better-trigram/better-trigram.c" + + s.dependency "React-callinvoker" + s.dependency "React" diff --git a/apps/mobile/patches/react-native-zip-archive+6.0.9.patch b/apps/mobile/patches/react-native-zip-archive+6.0.9.patch new file mode 100644 index 000000000..a18360d9a --- /dev/null +++ b/apps/mobile/patches/react-native-zip-archive+6.0.9.patch @@ -0,0 +1,18 @@ +diff --git a/node_modules/react-native-zip-archive/RNZipArchive.podspec b/node_modules/react-native-zip-archive/RNZipArchive.podspec +index 8eebcdc..81c0ed5 100644 +--- a/node_modules/react-native-zip-archive/RNZipArchive.podspec ++++ b/node_modules/react-native-zip-archive/RNZipArchive.podspec +@@ -10,12 +10,11 @@ Pod::Spec.new do |s| + s.license = package['license'] + s.homepage = 'https://github.com/mockingbot/react-native-zip-archive' + s.source = { :git => 'https://github.com/mockingbot/react-native-zip-archive.git', :tag => "#{s.version}"} +- s.platform = :ios, '9.0' ++ s.platform = :ios, '10.0' + s.preserve_paths = '*.js' + + s.dependency 'React-Core' + s.dependency 'SSZipArchive', '~>2.2' +- s.compiler_flags = '-GCC_PREPROCESSOR_DEFINITIONS="HAVE_INTTYPES_H HAVE_PKCRYPT HAVE_STDINT_H HAVE_WZAES HAVE_ZLIB MZ_ZIP_NO_SIGNING $(inherited)"' + + s.subspec 'Core' do |ss| + ss.source_files = 'ios/*.{h,m}'