Skip to content

Commit 6239fa8

Browse files
committed
feat: added support for query execute
1 parent bc630d5 commit 6239fa8

File tree

11 files changed

+216
-45
lines changed

11 files changed

+216
-45
lines changed

expo-example/android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,4 @@ allprojects {
3939
maven { url 'https://www.jitpack.io' }
4040
}
4141
}
42-
apply from: "../../android/build.gradle"apply from: "../../android/build.gradle"apply from: "../../android/build.gradle"apply from: "../../android/build.gradle"apply from: "../../android/build.gradle"apply from: "../../android/build.gradle"
42+
apply from: "../../android/build.gradle"
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import React, { useState } from 'react';
2+
import { Database } from 'cbl-reactnative';
3+
import execute from '@/service/query/execute';
4+
import CBLDatabaseActionContainer from '@/components/CBLDatabaseActionContainer';
5+
import { useStyleScheme } from '@/components/Themed';
6+
import { StyledTextInput } from '@/components/StyledTextInput';
7+
import HeaderView from '@/components/HeaderView';
8+
9+
export default function QuerySqlPlusPlusScreen() {
10+
const [query, setQuery] = useState<string>('');
11+
const styles = useStyleScheme();
12+
13+
function reset() {
14+
setQuery('');
15+
}
16+
17+
async function update(database: Database): Promise<string[]> {
18+
try {
19+
const date = new Date().toISOString();
20+
const results = await execute(query, null, database);
21+
const dict: string[] = [];
22+
for (const result of results) {
23+
dict.push(`${date}::<<${JSON.stringify(result)}>>`);
24+
}
25+
return dict;
26+
} catch (error) {
27+
// @ts-ignore
28+
return [error.message];
29+
}
30+
}
31+
32+
return (
33+
<CBLDatabaseActionContainer
34+
screenTitle={'Query Workbench'}
35+
handleUpdatePressed={update}
36+
handleResetPressed={reset}
37+
>
38+
<HeaderView name="Query Editor" iconName="database-search" />
39+
<StyledTextInput
40+
autoCapitalize="none"
41+
style={[
42+
styles.textInput,
43+
{ height: undefined, minHeight: 120, marginTop: 5, marginBottom: 15 },
44+
]}
45+
placeholder="SQL++ Query"
46+
onChangeText={(newText) => setQuery(newText)}
47+
defaultValue={query}
48+
multiline={true}
49+
/>
50+
</CBLDatabaseActionContainer>
51+
);
52+
}

expo-example/components/ResultsListView.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,20 @@ import React from 'react';
33
import { ScrollView } from 'react-native';
44
import { Text } from '@/components/Themed';
55
import { ResultsListViewProps } from '@/types/resultsListViewProps.type';
6+
import { Divider } from '@gluestack-ui/themed';
67

78
export default function ResultListView({ messages }: ResultsListViewProps) {
89
return (
910
<>
1011
<HeaderView name={'Results'} iconName={'information'} />
1112
<ScrollView style={{ marginLeft: 16 }}>
1213
{messages?.map((message, index) => (
13-
<Text key={`message-${index}`}>{message}</Text>
14+
<>
15+
<Text key={`message-${index}`}>{message}</Text>
16+
<Divider
17+
style={{ marginTop: 5, marginBottom: 10, marginLeft: 2 }}
18+
/>
19+
</>
1420
))}
1521
</ScrollView>
1622
</>

expo-example/ios/expoexample.xcodeproj/project.pbxproj

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
1212
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
1313
3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; };
14+
54E95176AF2545EA8B3EA692 /* noop-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 812BDA730ED9445083B424A2 /* noop-file.swift */; };
1415
96905EF65AED1B983A6B3ABC /* libPods-expoexample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-expoexample.a */; };
1516
B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */; };
1617
BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; };
17-
D54B062A43A347749A9A6B90 /* noop-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21B9DE8A68D41DC9D4C6EF7 /* noop-file.swift */; };
18-
EC1D923A906AE958E8C08BEA /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 8938667065399711C3753AEA /* PrivacyInfo.xcprivacy */; };
18+
DF81746DCC72DD690EFF9FD1 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = DD595584059DD6DC2D219353 /* PrivacyInfo.xcprivacy */; };
1919
/* End PBXBuildFile section */
2020

2121
/* Begin PBXFileReference section */
@@ -28,11 +28,11 @@
2828
58EEBF8E8E6FB1BC6CAF49B5 /* libPods-expoexample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-expoexample.a"; sourceTree = BUILT_PRODUCTS_DIR; };
2929
6C2E3173556A471DD304B334 /* Pods-expoexample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-expoexample.debug.xcconfig"; path = "Target Support Files/Pods-expoexample/Pods-expoexample.debug.xcconfig"; sourceTree = "<group>"; };
3030
7A4D352CD337FB3A3BF06240 /* Pods-expoexample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-expoexample.release.xcconfig"; path = "Target Support Files/Pods-expoexample/Pods-expoexample.release.xcconfig"; sourceTree = "<group>"; };
31-
8938667065399711C3753AEA /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = expoexample/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
31+
812BDA730ED9445083B424A2 /* noop-file.swift */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "noop-file.swift"; path = "expoexample/noop-file.swift"; sourceTree = "<group>"; };
3232
AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = expoexample/SplashScreen.storyboard; sourceTree = "<group>"; };
33-
AD2CE394E724421C8BA88719 /* expoexample-Bridging-Header.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = "expoexample-Bridging-Header.h"; path = "expoexample/expoexample-Bridging-Header.h"; sourceTree = "<group>"; };
3433
BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = "<group>"; };
35-
D21B9DE8A68D41DC9D4C6EF7 /* noop-file.swift */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "noop-file.swift"; path = "expoexample/noop-file.swift"; sourceTree = "<group>"; };
34+
DA8DBA27B15B4D46A9CBADE9 /* expoexample-Bridging-Header.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = "expoexample-Bridging-Header.h"; path = "expoexample/expoexample-Bridging-Header.h"; sourceTree = "<group>"; };
35+
DD595584059DD6DC2D219353 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = expoexample/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
3636
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
3737
FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-expoexample/ExpoModulesProvider.swift"; sourceTree = "<group>"; };
3838
/* End PBXFileReference section */
@@ -59,9 +59,9 @@
5959
13B07FB61A68108700A75B9A /* Info.plist */,
6060
13B07FB71A68108700A75B9A /* main.m */,
6161
AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */,
62-
D21B9DE8A68D41DC9D4C6EF7 /* noop-file.swift */,
63-
AD2CE394E724421C8BA88719 /* expoexample-Bridging-Header.h */,
64-
8938667065399711C3753AEA /* PrivacyInfo.xcprivacy */,
62+
812BDA730ED9445083B424A2 /* noop-file.swift */,
63+
DA8DBA27B15B4D46A9CBADE9 /* expoexample-Bridging-Header.h */,
64+
DD595584059DD6DC2D219353 /* PrivacyInfo.xcprivacy */,
6565
);
6666
name = expoexample;
6767
sourceTree = "<group>";
@@ -147,13 +147,13 @@
147147
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "expoexample" */;
148148
buildPhases = (
149149
08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */,
150-
DAECB2F152FA70A3C091CD39 /* [Expo] Configure project */,
150+
AFAA9126224107F0275B5D76 /* [Expo] Configure project */,
151151
13B07F871A680F5B00A75B9A /* Sources */,
152152
13B07F8C1A680F5B00A75B9A /* Frameworks */,
153153
13B07F8E1A680F5B00A75B9A /* Resources */,
154154
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
155155
800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */,
156-
81F92B66582731597075F546 /* [CP] Embed Pods Frameworks */,
156+
662020EEF1CD2A9B11BCA9E0 /* [CP] Embed Pods Frameworks */,
157157
);
158158
buildRules = (
159159
);
@@ -203,7 +203,7 @@
203203
BB2F792D24A3F905000567C9 /* Expo.plist in Resources */,
204204
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
205205
3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */,
206-
EC1D923A906AE958E8C08BEA /* PrivacyInfo.xcprivacy in Resources */,
206+
DF81746DCC72DD690EFF9FD1 /* PrivacyInfo.xcprivacy in Resources */,
207207
);
208208
runOnlyForDeploymentPostprocessing = 0;
209209
};
@@ -247,6 +247,26 @@
247247
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
248248
showEnvVarsInLog = 0;
249249
};
250+
662020EEF1CD2A9B11BCA9E0 /* [CP] Embed Pods Frameworks */ = {
251+
isa = PBXShellScriptBuildPhase;
252+
buildActionMask = 2147483647;
253+
files = (
254+
);
255+
inputPaths = (
256+
"${PODS_ROOT}/Target Support Files/Pods-expoexample/Pods-expoexample-frameworks.sh",
257+
"${PODS_XCFRAMEWORKS_BUILD_DIR}/CouchbaseLite-Swift-Enterprise/CouchbaseLiteSwift.framework/CouchbaseLiteSwift",
258+
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
259+
);
260+
name = "[CP] Embed Pods Frameworks";
261+
outputPaths = (
262+
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CouchbaseLiteSwift.framework",
263+
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
264+
);
265+
runOnlyForDeploymentPostprocessing = 0;
266+
shellPath = /bin/sh;
267+
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-expoexample/Pods-expoexample-frameworks.sh\"\n";
268+
showEnvVarsInLog = 0;
269+
};
250270
800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = {
251271
isa = PBXShellScriptBuildPhase;
252272
buildActionMask = 2147483647;
@@ -277,27 +297,7 @@
277297
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-expoexample/Pods-expoexample-resources.sh\"\n";
278298
showEnvVarsInLog = 0;
279299
};
280-
81F92B66582731597075F546 /* [CP] Embed Pods Frameworks */ = {
281-
isa = PBXShellScriptBuildPhase;
282-
buildActionMask = 2147483647;
283-
files = (
284-
);
285-
inputPaths = (
286-
"${PODS_ROOT}/Target Support Files/Pods-expoexample/Pods-expoexample-frameworks.sh",
287-
"${PODS_XCFRAMEWORKS_BUILD_DIR}/CouchbaseLite-Swift-Enterprise/CouchbaseLiteSwift.framework/CouchbaseLiteSwift",
288-
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
289-
);
290-
name = "[CP] Embed Pods Frameworks";
291-
outputPaths = (
292-
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CouchbaseLiteSwift.framework",
293-
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
294-
);
295-
runOnlyForDeploymentPostprocessing = 0;
296-
shellPath = /bin/sh;
297-
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-expoexample/Pods-expoexample-frameworks.sh\"\n";
298-
showEnvVarsInLog = 0;
299-
};
300-
DAECB2F152FA70A3C091CD39 /* [Expo] Configure project */ = {
300+
AFAA9126224107F0275B5D76 /* [Expo] Configure project */ = {
301301
isa = PBXShellScriptBuildPhase;
302302
alwaysOutOfDate = 1;
303303
buildActionMask = 2147483647;
@@ -326,7 +326,7 @@
326326
13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */,
327327
13B07FC11A68108700A75B9A /* main.m in Sources */,
328328
B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */,
329-
D54B062A43A347749A9A6B90 /* noop-file.swift in Sources */,
329+
54E95176AF2545EA8B3EA692 /* noop-file.swift in Sources */,
330330
);
331331
runOnlyForDeploymentPostprocessing = 0;
332332
};
@@ -357,7 +357,7 @@
357357
);
358358
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG";
359359
PRODUCT_BUNDLE_IDENTIFIER = "com.couchbase.rn.expo-example";
360-
PRODUCT_NAME = "expoexample";
360+
PRODUCT_NAME = expoexample;
361361
SWIFT_OBJC_BRIDGING_HEADER = "expoexample/expoexample-Bridging-Header.h";
362362
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
363363
SWIFT_VERSION = 5.0;
@@ -385,7 +385,7 @@
385385
);
386386
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE";
387387
PRODUCT_BUNDLE_IDENTIFIER = "com.couchbase.rn.expo-example";
388-
PRODUCT_NAME = "expoexample";
388+
PRODUCT_NAME = expoexample;
389389
SWIFT_OBJC_BRIDGING_HEADER = "expoexample/expoexample-Bridging-Header.h";
390390
SWIFT_VERSION = 5.0;
391391
TARGETED_DEVICE_FAMILY = "1,2";

expo-example/ios/expoexample/Info.plist

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,6 @@
5252
<key>NSUserActivityTypes</key>
5353
<array>
5454
<string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string>
55-
<string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string>
56-
<string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string>
57-
<string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string>
58-
<string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string>
59-
<string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string>
6055
</array>
6156
<key>UILaunchStoryboardName</key>
6257
<string>SplashScreen</string>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { Database, Parameters, ResultSet } from 'cbl-reactnative';
2+
3+
export default async function execute(
4+
queryString: string,
5+
parameters: Parameters | null | undefined,
6+
database: Database
7+
): Promise<ResultSet> {
8+
const query = database.createQuery(queryString);
9+
if (parameters instanceof Parameters) {
10+
query.addParameter(parameters);
11+
}
12+
const resultSet = await query.execute();
13+
return resultSet;
14+
}

ios/CblReactnative.mm

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,17 @@ @interface RCT_EXTERN_MODULE(CblReactnative, NSObject)
184184

185185
// MARK: - SQL++ Query Functions
186186

187-
RCT_EXTERN_METHOD(database_GetPath:(NSString *)name
187+
RCT_EXTERN_METHOD(query_Execute:
188+
(NSString *)query
189+
withParameters: (NSDictionary *)parameters
190+
fromDatabaseWithName:(NSString *)name
191+
withResolver:(RCTPromiseResolveBlock)resolve
192+
withRejecter:(RCTPromiseRejectBlock)reject)
193+
194+
RCT_EXTERN_METHOD(query_Explain:
195+
(NSString *)query
196+
withParameters: (NSDictionary *)parameters
197+
fromDatabaseWithName:(NSString *)name
188198
withResolver:(RCTPromiseResolveBlock)resolve
189199
withRejecter:(RCTPromiseRejectBlock)reject)
190200

ios/CblReactnative.swift

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -908,6 +908,54 @@ class CblReactnative: NSObject {
908908
}
909909
}
910910

911+
// MARK: - SQL++ Query Functions
912+
@objc(query_Execute:
913+
withParameters:
914+
fromDatabaseWithName:
915+
withResolver:
916+
withRejecter:)
917+
func query_Execute(
918+
query: NSString,
919+
parameters: NSDictionary,
920+
name: NSString,
921+
resolve: @escaping RCTPromiseResolveBlock,
922+
reject: @escaping RCTPromiseRejectBlock)
923+
{
924+
backgroundQueue.async {
925+
do {
926+
let (isError, databaseName) = DataAdapter.shared.adaptDatabaseName(name: name, reject: reject)
927+
let (isQueryArgsError, queryArgs) =
928+
DataAdapter.shared.adaptQueryParameter(query: query, parameters: parameters, reject: reject)
929+
if isError || isQueryArgsError {
930+
return
931+
}
932+
var results = ""
933+
if let queryParams = queryArgs.parameters {
934+
results = try DatabaseManager.shared.executeQuery(queryArgs.query, parameters: queryParams, databaseName: databaseName)
935+
936+
} else {
937+
results = try DatabaseManager.shared.executeQuery(queryArgs.query, databaseName: databaseName)
938+
}
939+
let dict:NSDictionary = [
940+
"data": results]
941+
DispatchQueue.main.async {
942+
resolve(dict)
943+
}
944+
945+
} catch let error as NSError {
946+
DispatchQueue.main.async {
947+
reject("DATABASE_ERROR", error.localizedDescription, nil)
948+
}
949+
} catch {
950+
DispatchQueue.main.async {
951+
reject("DATABASE_ERROR", error.localizedDescription, nil)
952+
}
953+
}
954+
955+
}
956+
}
957+
958+
911959
// MARK: - Scope Functions
912960

913961
@objc(scope_GetDefault:withResolver:withRejecter:)

ios/DataAdapter.swift

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,26 @@ public class DataAdapter {
153153
return (isError, databaseName)
154154
}
155155

156+
public func adaptQueryParameter(
157+
query: NSString,
158+
parameters: NSDictionary,
159+
reject: @escaping RCTPromiseRejectBlock) ->
160+
(Bool, QueryArgs)
161+
{
162+
var isError = false
163+
let args = QueryArgs()
164+
let strQuery = String(query)
165+
// Check the query
166+
let errorMessageQuery = self.checkStringValue(value: strQuery, propertyName: "Query")
167+
if !errorMessageQuery.isEmpty {
168+
isError = true
169+
reject("QUERY_ERROR", errorMessageQuery, nil)
170+
}
171+
args.query = strQuery
172+
args.parameters = (parameters as? [String: Any])
173+
return (isError, args)
174+
}
175+
156176
public func adaptNonEmptyString(value: NSString, propertyName: String, reject: @escaping RCTPromiseRejectBlock) -> (Bool, String) {
157177
var isError = false
158178
let strValue = String(value)
@@ -167,7 +187,7 @@ public class DataAdapter {
167187

168188
public func checkStringValue(value: String, propertyName: String) -> String {
169189
if (value.isEmpty){
170-
return "Error: \(propertyName) must be provided"
190+
return "Error: \(propertyName) must be provided"
171191
} else {
172192
return ""
173193
}

ios/QueryArgs.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//
2+
// QueryArgs.swift
3+
// cbl-reactnative
4+
//
5+
// Created by Aaron LaBeau on 7/31/24.
6+
//
7+
8+
import Foundation
9+
10+
public class QueryArgs {
11+
public var query: String = ""
12+
public var parameters: [String: Any]? = nil
13+
}

0 commit comments

Comments
 (0)