@@ -3,19 +3,34 @@ extern crate alloc;
3
3
use alloc:: string:: { String , ToString } ;
4
4
use core:: ffi:: c_int;
5
5
6
+ use crate :: constants:: SUBTYPE_JSON ;
7
+ use crate :: create_sqlite_text_fn;
8
+ use crate :: error:: PowerSyncError ;
6
9
use sqlite:: ResultCode ;
7
10
use sqlite_nostd as sqlite;
11
+ use sqlite_nostd:: bindings:: { SQLITE_RESULT_SUBTYPE , SQLITE_SUBTYPE } ;
8
12
use sqlite_nostd:: { Connection , Context , Value } ;
9
13
10
- use crate :: create_sqlite_text_fn;
11
- use crate :: error:: PowerSyncError ;
14
+ extern "C" fn powersync_strip_subtype (
15
+ ctx : * mut sqlite:: context ,
16
+ argc : c_int ,
17
+ argv : * mut * mut sqlite:: value ,
18
+ ) {
19
+ if argc != 1 {
20
+ return ;
21
+ }
22
+
23
+ let arg = unsafe { * argv } ;
24
+ ctx. result_value ( arg) ;
25
+ ctx. result_subtype ( 0 ) ;
26
+ }
12
27
13
28
/// Given any number of JSON TEXT arguments, merge them into a single JSON object.
14
29
///
15
30
/// This assumes each argument is a valid JSON object, with no duplicate keys.
16
31
/// No JSON parsing or validation is performed - this performs simple string concatenation.
17
32
fn powersync_json_merge_impl (
18
- _ctx : * mut sqlite:: context ,
33
+ ctx : * mut sqlite:: context ,
19
34
args : & [ * mut sqlite:: value ] ,
20
35
) -> Result < String , PowerSyncError > {
21
36
if args. is_empty ( ) {
@@ -42,6 +57,7 @@ fn powersync_json_merge_impl(
42
57
43
58
// Close the outer brace
44
59
result. push ( '}' ) ;
60
+ ctx. result_subtype ( SUBTYPE_JSON ) ;
45
61
Ok ( result)
46
62
}
47
63
@@ -55,13 +71,24 @@ pub fn register(db: *mut sqlite::sqlite3) -> Result<(), ResultCode> {
55
71
db. create_function_v2 (
56
72
"powersync_json_merge" ,
57
73
-1 ,
58
- sqlite:: UTF8 | sqlite:: DETERMINISTIC ,
74
+ sqlite:: UTF8 | sqlite:: DETERMINISTIC | SQLITE_RESULT_SUBTYPE ,
59
75
None ,
60
76
Some ( powersync_json_merge) ,
61
77
None ,
62
78
None ,
63
79
None ,
64
80
) ?;
65
81
82
+ db. create_function_v2 (
83
+ "powersync_strip_subtype" ,
84
+ -1 ,
85
+ sqlite:: UTF8 | sqlite:: DETERMINISTIC | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE ,
86
+ None ,
87
+ Some ( powersync_strip_subtype) ,
88
+ None ,
89
+ None ,
90
+ None ,
91
+ ) ?;
92
+
66
93
Ok ( ( ) )
67
94
}
0 commit comments