@@ -41,8 +41,8 @@ void edge_field_cb(void *field, size_t field_len, void *data)
4141 if (cr -> cur_field == cr -> alloc )
4242 {
4343 cr -> alloc *= 2 ;
44- cr -> fields = realloc (cr -> fields , sizeof (char * ) * cr -> alloc );
45- cr -> fields_len = realloc (cr -> header , sizeof (size_t * ) * cr -> alloc );
44+ cr -> fields = repalloc_check (cr -> fields , sizeof (char * ) * cr -> alloc );
45+ cr -> fields_len = repalloc_check (cr -> header , sizeof (size_t * ) * cr -> alloc );
4646 if (cr -> fields == NULL )
4747 {
4848 cr -> error = 1 ;
@@ -53,7 +53,7 @@ void edge_field_cb(void *field, size_t field_len, void *data)
5353 }
5454 cr -> fields_len [cr -> cur_field ] = field_len ;
5555 cr -> curr_row_length += field_len ;
56- cr -> fields [cr -> cur_field ] = strndup ((char * )field , field_len );
56+ cr -> fields [cr -> cur_field ] = pnstrdup ((char * )field , field_len );
5757 cr -> cur_field += 1 ;
5858}
5959
@@ -83,13 +83,13 @@ void edge_row_cb(int delim __attribute__((unused)), void *data)
8383 {
8484 cr -> header_num = cr -> cur_field ;
8585 cr -> header_row_length = cr -> curr_row_length ;
86- cr -> header_len = (size_t * )malloc (sizeof (size_t * ) * cr -> cur_field );
87- cr -> header = malloc ((sizeof (char * ) * cr -> cur_field ));
86+ cr -> header_len = (size_t * )palloc (sizeof (size_t * ) * cr -> cur_field );
87+ cr -> header = palloc ((sizeof (char * ) * cr -> cur_field ));
8888
8989 for (i = 0 ; i < cr -> cur_field ; i ++ )
9090 {
9191 cr -> header_len [i ] = cr -> fields_len [i ];
92- cr -> header [i ] = strndup (cr -> fields [i ], cr -> header_len [i ]);
92+ cr -> header [i ] = pnstrdup (cr -> fields [i ], cr -> header_len [i ]);
9393 }
9494 }
9595 else
@@ -138,7 +138,7 @@ void edge_row_cb(int delim __attribute__((unused)), void *data)
138138
139139 for (i = 0 ; i < n_fields ; ++ i )
140140 {
141- free (cr -> fields [i ]);
141+ pfree_if_not_null (cr -> fields [i ]);
142142 }
143143
144144 if (cr -> error )
@@ -197,6 +197,10 @@ int create_edges_from_csv_file(char *file_path,
197197 (errmsg ("Failed to initialize csv parser\n" )));
198198 }
199199
200+ p .malloc_func = palloc ;
201+ p .realloc_func = repalloc_check ;
202+ p .free_func = pfree_if_not_null ;
203+
200204 csv_set_space_func (& p , is_space );
201205 csv_set_term_func (& p , is_term );
202206
@@ -207,48 +211,53 @@ int create_edges_from_csv_file(char *file_path,
207211 (errmsg ("Failed to open %s\n" , file_path )));
208212 }
209213
210- label_seq_name = get_label_seq_relation_name (label_name );
211-
212- memset ((void * )& cr , 0 , sizeof (csv_edge_reader ));
213- cr .alloc = 128 ;
214- cr .fields = malloc (sizeof (char * ) * cr .alloc );
215- cr .fields_len = malloc (sizeof (size_t * ) * cr .alloc );
216- cr .header_row_length = 0 ;
217- cr .curr_row_length = 0 ;
218- cr .graph_name = graph_name ;
219- cr .graph_oid = graph_oid ;
220- cr .label_name = label_name ;
221- cr .label_id = label_id ;
222- cr .label_seq_relid = get_relname_relid (label_seq_name , graph_oid );
223- cr .load_as_agtype = load_as_agtype ;
224-
225- /* Initialize the batch insert state */
226- init_edge_batch_insert (& cr .batch_state , label_name , graph_oid );
227-
228- while ((bytes_read = fread (buf , 1 , 1024 , fp )) > 0 )
214+ PG_TRY ();
229215 {
230- if (csv_parse (& p , buf , bytes_read , edge_field_cb ,
231- edge_row_cb , & cr ) != bytes_read )
216+ label_seq_name = get_label_seq_relation_name (label_name );
217+
218+ memset ((void * )& cr , 0 , sizeof (csv_edge_reader ));
219+ cr .alloc = 128 ;
220+ cr .fields = palloc (sizeof (char * ) * cr .alloc );
221+ cr .fields_len = palloc (sizeof (size_t * ) * cr .alloc );
222+ cr .header_row_length = 0 ;
223+ cr .curr_row_length = 0 ;
224+ cr .graph_name = graph_name ;
225+ cr .graph_oid = graph_oid ;
226+ cr .label_name = label_name ;
227+ cr .label_id = label_id ;
228+ cr .label_seq_relid = get_relname_relid (label_seq_name , graph_oid );
229+ cr .load_as_agtype = load_as_agtype ;
230+
231+ /* Initialize the batch insert state */
232+ init_edge_batch_insert (& cr .batch_state , label_name , graph_oid );
233+
234+ while ((bytes_read = fread (buf , 1 , 1024 , fp )) > 0 )
232235 {
233- ereport (ERROR , (errmsg ("Error while parsing file: %s\n" ,
234- csv_strerror (csv_error (& p )))));
236+ if (csv_parse (& p , buf , bytes_read , edge_field_cb ,
237+ edge_row_cb , & cr ) != bytes_read )
238+ {
239+ ereport (ERROR , (errmsg ("Error while parsing file: %s\n" ,
240+ csv_strerror (csv_error (& p )))));
241+ }
235242 }
236- }
237243
238- csv_fini (& p , edge_field_cb , edge_row_cb , & cr );
244+ csv_fini (& p , edge_field_cb , edge_row_cb , & cr );
239245
240- /* Finish any remaining batch inserts */
241- finish_edge_batch_insert (& cr .batch_state , label_name , graph_oid );
246+ /* Finish any remaining batch inserts */
247+ finish_edge_batch_insert (& cr .batch_state , label_name , graph_oid );
242248
243- if (ferror (fp ))
249+ if (ferror (fp ))
250+ {
251+ ereport (ERROR , (errmsg ("Error while reading file %s\n" , file_path )));
252+ }
253+ }
254+ PG_FINALLY ();
244255 {
245- ereport (ERROR , (errmsg ("Error while reading file %s\n" , file_path )));
256+ fclose (fp );
257+ csv_free (& p );
246258 }
259+ PG_END_TRY ();
247260
248- fclose (fp );
249-
250- free (cr .fields );
251- csv_free (& p );
252261 return EXIT_SUCCESS ;
253262}
254263
0 commit comments