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 3c34d8132..000000000
Binary files a/apps/mobile/native/android/app/src/main/jniLibs/arm64-v8a/better-trigram.so and /dev/null differ
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 95c37924e..000000000
Binary files a/apps/mobile/native/android/app/src/main/jniLibs/armeabi-v7a/better-trigram.so and /dev/null differ
diff --git a/apps/mobile/native/android/app/src/main/jniLibs/x86/better-trigram.so b/apps/mobile/native/android/app/src/main/jniLibs/x86/better-trigram.so
deleted file mode 100644
index ebac1a6f7..000000000
Binary files a/apps/mobile/native/android/app/src/main/jniLibs/x86/better-trigram.so and /dev/null differ
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 fdc9641c8..000000000
Binary files a/apps/mobile/native/android/app/src/main/jniLibs/x86_64/better-trigram.so and /dev/null differ
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 312cc5b89..000000000
Binary files a/apps/mobile/native/ios/BetterTrigram.xcframework/ios-arm64/better-trigram.dylib and /dev/null differ
diff --git a/apps/mobile/native/ios/BetterTrigram.xcframework/ios-arm64_x86_64-simulator/better-trigram.dylib b/apps/mobile/native/ios/BetterTrigram.xcframework/ios-arm64_x86_64-simulator/better-trigram.dylib
deleted file mode 100644
index bf5105203..000000000
Binary files a/apps/mobile/native/ios/BetterTrigram.xcframework/ios-arm64_x86_64-simulator/better-trigram.dylib and /dev/null differ
diff --git a/apps/mobile/native/ios/Notesnook.xcodeproj/project.pbxproj b/apps/mobile/native/ios/Notesnook.xcodeproj/project.pbxproj
index 0173b8212..6069946c8 100644
--- a/apps/mobile/native/ios/Notesnook.xcodeproj/project.pbxproj
+++ b/apps/mobile/native/ios/Notesnook.xcodeproj/project.pbxproj
@@ -26,8 +26,6 @@
656992802C5754F10041CD41 /* OpenSans-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6517B7BE2B6838EB0079FF37 /* OpenSans-Regular.ttf */; };
656992812C5754F10041CD41 /* OpenSans-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6517B7BF2B6838EB0079FF37 /* OpenSans-SemiBold.ttf */; };
6593E4A3281C345400492C50 /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6593E4A2281C345400492C50 /* AppDelegate.mm */; };
- 6594DDF32CD8BFE8007F5EC2 /* BetterTrigram.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6594DDF22CD8BFE8007F5EC2 /* BetterTrigram.xcframework */; };
- 6594DDF42CD8BFE9007F5EC2 /* BetterTrigram.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 6594DDF22CD8BFE8007F5EC2 /* BetterTrigram.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
659BE46725E11A5100E05671 /* notesnook-text.png in Resources */ = {isa = PBXBuildFile; fileRef = 659BE46625E11A5100E05671 /* notesnook-text.png */; };
65AA857925E6DDEC00772A01 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65AA857825E6DDEC00772A01 /* WidgetKit.framework */; };
65AA857B25E6DDEC00772A01 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65AA857A25E6DDEC00772A01 /* SwiftUI.framework */; };
@@ -81,17 +79,6 @@
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
- 6594DDF52CD8BFE9007F5EC2 /* Embed Frameworks */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 6594DDF42CD8BFE9007F5EC2 /* BetterTrigram.xcframework in Embed Frameworks */,
- );
- name = "Embed Frameworks";
- runOnlyForDeploymentPostprocessing = 0;
- };
65A7F34B255687E600699170 /* Embed App Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@@ -190,7 +177,6 @@
files = (
2B3F87EC6B2264CD8ABA5DA8 /* libPods-Notesnook.a in Frameworks */,
6515C42F2580AA3000E83E39 /* StoreKit.framework in Frameworks */,
- 6594DDF32CD8BFE8007F5EC2 /* BetterTrigram.xcframework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -414,7 +400,6 @@
240525450DF9ABA0F332B52E /* [CP] Copy Pods Resources */,
65A7F34B255687E600699170 /* Embed App Extensions */,
48C834D962D612F18A0388B3 /* [CP] Embed Pods Frameworks */,
- 6594DDF52CD8BFE9007F5EC2 /* Embed Frameworks */,
);
buildRules = (
);
diff --git a/apps/mobile/native/ios/Podfile b/apps/mobile/native/ios/Podfile
index f36dc9880..43eae6128 100644
--- a/apps/mobile/native/ios/Podfile
+++ b/apps/mobile/native/ios/Podfile
@@ -113,7 +113,7 @@ post_install do |installer|
installer.pods_project.targets.each do |target|
if target.name == "react-native-quick-sqlite" then
target.build_configurations.each do |config|
- config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = 'SQLITE_ENABLE_FTS5=1 SQLITE3MC_OMIT_AES_HARDWARE_SUPPORT=1 HAVE_CIPHER_AES_128_CBC=0 HAVE_CIPHER_AES_256_CBC=0 HAVE_CIPHER_SQLCIPHER=0 HAVE_CIPHER_RC4=0 HAVE_CIPHER_CHACHA20=1 SQLITE_OMIT_PROGRESS_CALLBACK=1 SQLITE_MAX_EXPR_DEPTH=0 SQLITE_OMIT_DEPRECATED=1 SQLITE_LIKE_DOESNT_MATCH_BLOBS=1 SQLITE_DQS=0 SQLITE_DEFAULT_MEMSTATUS=0 SQLITE_USE_ALLOCA=1'
+ config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = 'SQLITE_CORE=1 SQLITE_ENABLE_FTS5=1 SQLITE3MC_OMIT_AES_HARDWARE_SUPPORT=1 HAVE_CIPHER_AES_128_CBC=0 HAVE_CIPHER_AES_256_CBC=0 HAVE_CIPHER_SQLCIPHER=0 HAVE_CIPHER_RC4=0 HAVE_CIPHER_CHACHA20=1 SQLITE_OMIT_PROGRESS_CALLBACK=1 SQLITE_MAX_EXPR_DEPTH=0 SQLITE_OMIT_DEPRECATED=1 SQLITE_LIKE_DOESNT_MATCH_BLOBS=1 SQLITE_DQS=0 SQLITE_DEFAULT_MEMSTATUS=0 SQLITE_USE_ALLOCA=1'
end
end
end
diff --git a/apps/mobile/native/ios/Podfile.lock b/apps/mobile/native/ios/Podfile.lock
index f85a37da7..45696d1b8 100644
--- a/apps/mobile/native/ios/Podfile.lock
+++ b/apps/mobile/native/ios/Podfile.lock
@@ -970,8 +970,6 @@ PODS:
- React
- react-native-background-actions (2.6.7):
- React-Core
- - react-native-begin-background-task (0.1.0):
- - React
- react-native-blob-util (0.18.3):
- React-Core
- react-native-config (1.5.1):
@@ -983,7 +981,7 @@ PODS:
- react-native-document-picker (7.1.3):
- React-Core
- react-native-fingerprint-scanner (5.0.0):
- - React-Core
+ - React
- react-native-get-random-values (1.9.0):
- React-Core
- react-native-gzip (1.1.0):
@@ -1019,9 +1017,9 @@ PODS:
- react-native-screenguard (1.0.0):
- React-Core
- SDWebImage (~> 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}'