@@ -36,8 +36,8 @@ void edge_field_cb(void *field, size_t field_len, void *data)
3636 if (cr -> cur_field == cr -> alloc )
3737 {
3838 cr -> alloc *= 2 ;
39- cr -> fields = realloc (cr -> fields , sizeof (char * ) * cr -> alloc );
40- cr -> fields_len = realloc (cr -> header , sizeof (size_t * ) * cr -> alloc );
39+ cr -> fields = repalloc_check (cr -> fields , sizeof (char * ) * cr -> alloc );
40+ cr -> fields_len = repalloc_check (cr -> header , sizeof (size_t * ) * cr -> alloc );
4141 if (cr -> fields == NULL )
4242 {
4343 cr -> error = 1 ;
@@ -48,7 +48,7 @@ void edge_field_cb(void *field, size_t field_len, void *data)
4848 }
4949 cr -> fields_len [cr -> cur_field ] = field_len ;
5050 cr -> curr_row_length += field_len ;
51- cr -> fields [cr -> cur_field ] = strndup ((char * )field , field_len );
51+ cr -> fields [cr -> cur_field ] = pnstrdup ((char * )field , field_len );
5252 cr -> cur_field += 1 ;
5353}
5454
@@ -78,13 +78,13 @@ void edge_row_cb(int delim __attribute__((unused)), void *data)
7878 {
7979 cr -> header_num = cr -> cur_field ;
8080 cr -> header_row_length = cr -> curr_row_length ;
81- cr -> header_len = (size_t * )malloc (sizeof (size_t * ) * cr -> cur_field );
82- cr -> header = malloc ((sizeof (char * ) * cr -> cur_field ));
81+ cr -> header_len = (size_t * )palloc (sizeof (size_t * ) * cr -> cur_field );
82+ cr -> header = palloc ((sizeof (char * ) * cr -> cur_field ));
8383
8484 for (i = 0 ; i < cr -> cur_field ; i ++ )
8585 {
8686 cr -> header_len [i ] = cr -> fields_len [i ];
87- cr -> header [i ] = strndup (cr -> fields [i ], cr -> header_len [i ]);
87+ cr -> header [i ] = pnstrdup (cr -> fields [i ], cr -> header_len [i ]);
8888 }
8989 }
9090 else
@@ -133,7 +133,7 @@ void edge_row_cb(int delim __attribute__((unused)), void *data)
133133
134134 for (i = 0 ; i < n_fields ; ++ i )
135135 {
136- free (cr -> fields [i ]);
136+ pfree_if_not_null (cr -> fields [i ]);
137137 }
138138
139139 if (cr -> error )
@@ -192,6 +192,10 @@ int create_edges_from_csv_file(char *file_path,
192192 (errmsg ("Failed to initialize csv parser\n" )));
193193 }
194194
195+ p .malloc_func = palloc ;
196+ p .realloc_func = repalloc_check ;
197+ p .free_func = pfree_if_not_null ;
198+
195199 csv_set_space_func (& p , is_space );
196200 csv_set_term_func (& p , is_term );
197201
@@ -202,47 +206,52 @@ int create_edges_from_csv_file(char *file_path,
202206 (errmsg ("Failed to open %s\n" , file_path )));
203207 }
204208
205- label_seq_name = get_label_seq_relation_name (label_name );
206-
207- memset ((void * )& cr , 0 , sizeof (csv_edge_reader ));
208- cr .alloc = 128 ;
209- cr .fields = malloc (sizeof (char * ) * cr .alloc );
210- cr .fields_len = malloc (sizeof (size_t * ) * cr .alloc );
211- cr .header_row_length = 0 ;
212- cr .curr_row_length = 0 ;
213- cr .graph_name = graph_name ;
214- cr .graph_oid = graph_oid ;
215- cr .label_name = label_name ;
216- cr .label_id = label_id ;
217- cr .label_seq_relid = get_relname_relid (label_seq_name , graph_oid );
218- cr .load_as_agtype = load_as_agtype ;
219-
220- /* Initialize the batch insert state */
221- init_batch_insert (& cr .batch_state , label_name , graph_oid );
222-
223- while ((bytes_read = fread (buf , 1 , 1024 , fp )) > 0 )
209+ PG_TRY ();
224210 {
225- if (csv_parse (& p , buf , bytes_read , edge_field_cb ,
226- edge_row_cb , & cr ) != bytes_read )
211+ label_seq_name = get_label_seq_relation_name (label_name );
212+
213+ memset ((void * )& cr , 0 , sizeof (csv_edge_reader ));
214+ cr .alloc = 128 ;
215+ cr .fields = palloc (sizeof (char * ) * cr .alloc );
216+ cr .fields_len = palloc (sizeof (size_t * ) * cr .alloc );
217+ cr .header_row_length = 0 ;
218+ cr .curr_row_length = 0 ;
219+ cr .graph_name = graph_name ;
220+ cr .graph_oid = graph_oid ;
221+ cr .label_name = label_name ;
222+ cr .label_id = label_id ;
223+ cr .label_seq_relid = get_relname_relid (label_seq_name , graph_oid );
224+ cr .load_as_agtype = load_as_agtype ;
225+
226+ /* Initialize the batch insert state */
227+ init_batch_insert (& cr .batch_state , label_name , graph_oid );
228+
229+ while ((bytes_read = fread (buf , 1 , 1024 , fp )) > 0 )
227230 {
228- ereport (ERROR , (errmsg ("Error while parsing file: %s\n" ,
229- csv_strerror (csv_error (& p )))));
231+ if (csv_parse (& p , buf , bytes_read , edge_field_cb ,
232+ edge_row_cb , & cr ) != bytes_read )
233+ {
234+ ereport (ERROR , (errmsg ("Error while parsing file: %s\n" ,
235+ csv_strerror (csv_error (& p )))));
236+ }
230237 }
231- }
232238
233- csv_fini (& p , edge_field_cb , edge_row_cb , & cr );
239+ csv_fini (& p , edge_field_cb , edge_row_cb , & cr );
234240
235- /* Finish any remaining batch inserts */
236- finish_batch_insert (& cr .batch_state );
241+ /* Finish any remaining batch inserts */
242+ finish_batch_insert (& cr .batch_state );
237243
238- if (ferror (fp ))
244+ if (ferror (fp ))
245+ {
246+ ereport (ERROR , (errmsg ("Error while reading file %s\n" , file_path )));
247+ }
248+ }
249+ PG_FINALLY ();
239250 {
240- ereport (ERROR , (errmsg ("Error while reading file %s\n" , file_path )));
251+ fclose (fp );
252+ csv_free (& p );
241253 }
254+ PG_END_TRY ();
242255
243- fclose (fp );
244-
245- free (cr .fields );
246- csv_free (& p );
247256 return EXIT_SUCCESS ;
248- }
257+ }
0 commit comments