@@ -33,7 +33,7 @@ use crate::column::{
33
33
writer:: { get_column_writer, ColumnWriter } ,
34
34
} ;
35
35
use crate :: data_type:: DataType ;
36
- use crate :: encryption:: ciphers :: RingGcmBlockEncryptor ;
36
+ # [ cfg ( feature = " encryption" ) ]
37
37
use crate :: encryption:: encryption:: FileEncryptor ;
38
38
use crate :: errors:: { ParquetError , Result } ;
39
39
use crate :: file:: properties:: { BloomFilterPosition , WriterPropertiesPtr } ;
@@ -155,6 +155,8 @@ pub struct SerializedFileWriter<W: Write> {
155
155
// kv_metadatas will be appended to `props` when `write_metadata`
156
156
kv_metadatas : Vec < KeyValue > ,
157
157
finished : bool ,
158
+ #[ cfg( feature = "encryption" ) ]
159
+ file_encryptor : Option < FileEncryptor > ,
158
160
}
159
161
160
162
impl < W : Write > Debug for SerializedFileWriter < W > {
@@ -173,19 +175,45 @@ impl<W: Write + Send> SerializedFileWriter<W> {
173
175
/// Creates new file writer.
174
176
pub fn new ( buf : W , schema : TypePtr , properties : WriterPropertiesPtr ) -> Result < Self > {
175
177
let mut buf = TrackedWrite :: new ( buf) ;
178
+ #[ cfg( feature = "encryption" ) ]
179
+ let file_encryptor = if properties. file_encryption_properties . is_some ( ) {
180
+ Some ( FileEncryptor :: new (
181
+ properties
182
+ . file_encryption_properties
183
+ . as_ref ( )
184
+ . unwrap ( )
185
+ . clone ( ) ,
186
+ vec ! [ ] ,
187
+ ) )
188
+ } else {
189
+ None
190
+ } ;
191
+
192
+ #[ cfg( feature = "encryption" ) ]
193
+ if properties. file_encryption_properties . is_some ( ) {
194
+ // todo: check if all columns in properties.file_encryption_properties.column_keys
195
+ // are present in the schema
196
+ let _fep = properties. file_encryption_properties . clone ( ) . unwrap ( ) ;
197
+ Self :: start_encrypted_file ( & mut buf) ?;
198
+ } else {
199
+ Self :: start_file ( & mut buf) ?;
200
+ }
201
+ #[ cfg( not( feature = "encryption" ) ) ]
176
202
Self :: start_file ( & mut buf) ?;
177
203
Ok ( Self {
178
204
buf,
179
205
schema : schema. clone ( ) ,
180
206
descr : Arc :: new ( SchemaDescriptor :: new ( schema) ) ,
181
- props : properties,
207
+ props : properties. clone ( ) ,
182
208
row_groups : vec ! [ ] ,
183
209
bloom_filters : vec ! [ ] ,
184
210
column_indexes : Vec :: new ( ) ,
185
211
offset_indexes : Vec :: new ( ) ,
186
212
row_group_index : 0 ,
187
213
kv_metadatas : Vec :: new ( ) ,
188
214
finished : false ,
215
+ #[ cfg( feature = "encryption" ) ]
216
+ file_encryptor,
189
217
} )
190
218
}
191
219
@@ -274,6 +302,11 @@ impl<W: Write + Send> SerializedFileWriter<W> {
274
302
Ok ( ( ) )
275
303
}
276
304
305
+ fn start_encrypted_file ( buf : & mut TrackedWrite < W > ) -> Result < ( ) > {
306
+ buf. write_all ( & PARQUET_MAGIC ) ?;
307
+ Ok ( ( ) )
308
+ }
309
+
277
310
/// Assembles and writes metadata at the end of the file.
278
311
fn write_metadata ( & mut self ) -> Result < parquet:: FileMetaData > {
279
312
self . finished = true ;
@@ -525,9 +558,16 @@ impl<'a, W: Write + Send> SerializedRowGroupWriter<'a, W> {
525
558
) -> Result < C > ,
526
559
{
527
560
self . assert_previous_writer_closed ( ) ?;
528
- let file_encryption_properties = self . props . file_encryption_properties ( ) ;
529
- let file_encryptor =
530
- FileEncryptor :: new ( file_encryption_properties. unwrap ( ) . clone ( ) , vec ! [ ] , vec ! [ ] ) ;
561
+ #[ cfg( feature = "encryption" ) ]
562
+ let file_encryptor = FileEncryptor :: new (
563
+ self . props
564
+ . file_encryption_properties
565
+ . as_ref ( )
566
+ . unwrap ( )
567
+ . clone ( ) ,
568
+ vec ! [ ] ,
569
+ ) ;
570
+
531
571
Ok ( match self . next_column_desc ( ) {
532
572
Some ( column) => {
533
573
let props = self . props . clone ( ) ;
0 commit comments