@@ -107,6 +107,9 @@ impl From<crate::records::files::FileError> for QueryError {
107
107
108
108
type FileMetadataContents = Vec < ( FileUpload , Vec < u8 > ) > ;
109
109
110
+ // JSON type use to represent rows. Note that we use a map to represent rows sparsely.
111
+ pub type JsonRow = serde_json:: Map < String , serde_json:: Value > ;
112
+
110
113
#[ derive( Default ) ]
111
114
pub struct Params {
112
115
table_name : String ,
@@ -149,19 +152,15 @@ impl Params {
149
152
/// value itself in contrast to when the original request was an actual JSON request.
150
153
pub fn from (
151
154
metadata : & TableMetadata ,
152
- json : serde_json :: Value ,
155
+ json : JsonRow ,
153
156
multipart_files : Option < Vec < FileUploadInput > > ,
154
157
) -> Result < Self , ParamsError > {
155
- let serde_json:: Value :: Object ( map) = json else {
156
- return Err ( ParamsError :: NotAnObject ) ;
157
- } ;
158
-
159
158
let mut params = Params {
160
159
table_name : metadata. name ( ) . to_string ( ) ,
161
160
..Default :: default ( )
162
161
} ;
163
162
164
- for ( key, value) in map {
163
+ for ( key, value) in json {
165
164
// We simply skip unknown columns, this could simply be malformed input or version skew. This
166
165
// is similar in spirit to protobuf's unknown fields behavior.
167
166
let Some ( ( col, col_meta) ) = Self :: column_by_name ( metadata, & key) else {
@@ -836,7 +835,7 @@ fn extract_params_and_files_from_json(
836
835
/// streams at all.
837
836
pub struct LazyParams < ' a > {
838
837
// Input
839
- request : serde_json :: Value ,
838
+ json_row : JsonRow ,
840
839
metadata : & ' a TableMetadata ,
841
840
multipart_files : Option < Vec < FileUploadInput > > ,
842
841
@@ -847,11 +846,11 @@ pub struct LazyParams<'a> {
847
846
impl < ' a > LazyParams < ' a > {
848
847
pub fn new (
849
848
metadata : & ' a TableMetadata ,
850
- request : serde_json :: Value ,
849
+ json_row : JsonRow ,
851
850
multipart_files : Option < Vec < FileUploadInput > > ,
852
851
) -> Self {
853
852
LazyParams {
854
- request ,
853
+ json_row ,
855
854
metadata,
856
855
multipart_files,
857
856
params : None ,
@@ -863,20 +862,20 @@ impl<'a> LazyParams<'a> {
863
862
return params. as_ref ( ) . map_err ( |err| err. clone ( ) ) ;
864
863
}
865
864
866
- let request = std:: mem:: take ( & mut self . request ) ;
865
+ let json_row = std:: mem:: take ( & mut self . json_row ) ;
867
866
let multipart_files = std:: mem:: take ( & mut self . multipart_files ) ;
868
867
869
868
let params = self
870
869
. params
871
- . insert ( Params :: from ( self . metadata , request , multipart_files) ) ;
870
+ . insert ( Params :: from ( self . metadata , json_row , multipart_files) ) ;
872
871
return params. as_ref ( ) . map_err ( |err| err. clone ( ) ) ;
873
872
}
874
873
875
874
pub fn consume ( self ) -> Result < Params , ParamsError > {
876
875
if let Some ( params) = self . params {
877
876
return params;
878
877
}
879
- return Params :: from ( self . metadata , self . request , self . multipart_files ) ;
878
+ return Params :: from ( self . metadata , self . json_row , self . multipart_files ) ;
880
879
}
881
880
}
882
881
@@ -887,6 +886,7 @@ mod tests {
887
886
use serde_json:: json;
888
887
889
888
use super :: * ;
889
+ use crate :: records:: test_utils:: json_row_from_value;
890
890
use crate :: schema:: Table ;
891
891
use crate :: table_metadata:: { sqlite3_parse_into_statement, TableMetadata } ;
892
892
use crate :: util:: id_to_b64;
@@ -980,7 +980,11 @@ mod tests {
980
980
"real" : real,
981
981
} ) ;
982
982
983
- assert_params ( Params :: from ( & metadata, value, None ) ?) ;
983
+ assert_params ( Params :: from (
984
+ & metadata,
985
+ json_row_from_value ( value) . unwrap ( ) ,
986
+ None ,
987
+ ) ?) ;
984
988
}
985
989
986
990
{
@@ -993,7 +997,11 @@ mod tests {
993
997
"real" : "3" ,
994
998
} ) ;
995
999
996
- assert_params ( Params :: from ( & metadata, value, None ) ?) ;
1000
+ assert_params ( Params :: from (
1001
+ & metadata,
1002
+ json_row_from_value ( value) . unwrap ( ) ,
1003
+ None ,
1004
+ ) ?) ;
997
1005
}
998
1006
999
1007
{
@@ -1007,7 +1015,7 @@ mod tests {
1007
1015
"real" : "3" ,
1008
1016
} ) ;
1009
1017
1010
- assert ! ( Params :: from( & metadata, value, None ) . is_err( ) ) ;
1018
+ assert ! ( Params :: from( & metadata, json_row_from_value ( value) . unwrap ( ) , None ) . is_err( ) ) ;
1011
1019
1012
1020
// Test that nested JSON object can be passed.
1013
1021
let value = json ! ( {
@@ -1021,7 +1029,7 @@ mod tests {
1021
1029
"real" : "3" ,
1022
1030
} ) ;
1023
1031
1024
- let params = Params :: from ( & metadata, value, None ) . unwrap ( ) ;
1032
+ let params = Params :: from ( & metadata, json_row_from_value ( value) . unwrap ( ) , None ) . unwrap ( ) ;
1025
1033
assert_params ( params) ;
1026
1034
}
1027
1035
@@ -1034,7 +1042,7 @@ mod tests {
1034
1042
"real" : "3" ,
1035
1043
} ) ;
1036
1044
1037
- assert ! ( Params :: from( & metadata, value, None ) . is_err( ) ) ;
1045
+ assert ! ( Params :: from( & metadata, json_row_from_value ( value) . unwrap ( ) , None ) . is_err( ) ) ;
1038
1046
1039
1047
// Test that nested JSON array can be passed.
1040
1048
let nested_json_blob: Vec < u8 > = vec ! [ 65 , 66 , 67 , 68 ] ;
@@ -1051,7 +1059,7 @@ mod tests {
1051
1059
"real" : "3" ,
1052
1060
} ) ;
1053
1061
1054
- let params = Params :: from ( & metadata, value, None ) . unwrap ( ) ;
1062
+ let params = Params :: from ( & metadata, json_row_from_value ( value) . unwrap ( ) , None ) . unwrap ( ) ;
1055
1063
1056
1064
let json_col: Vec < libsql:: Value > = params
1057
1065
. params
0 commit comments