| 470 | } |
| 471 | |
| 472 | void cbm_gbuf_free(cbm_gbuf_t *gb) { |
| 473 | if (!gb) { |
| 474 | return; |
| 475 | } |
| 476 | |
| 477 | /* Free each individually-allocated node */ |
| 478 | for (int i = 0; i < gb->nodes.count; i++) { |
| 479 | cbm_gbuf_node_t *n = gb->nodes.items[i]; |
| 480 | free_node_strings(n); |
| 481 | free(n); |
| 482 | } |
| 483 | cbm_da_free(&gb->nodes); |
| 484 | |
| 485 | /* Free each individually-allocated edge */ |
| 486 | for (int i = 0; i < gb->edges.count; i++) { |
| 487 | cbm_gbuf_edge_t *e = gb->edges.items[i]; |
| 488 | free_edge_strings(e); |
| 489 | free(e); |
| 490 | } |
| 491 | cbm_da_free(&gb->edges); |
| 492 | |
| 493 | /* Free hash tables — may be NULL if already released by dump_to_sqlite */ |
| 494 | if (gb->node_by_qn) { |
| 495 | cbm_ht_free(gb->node_by_qn); |
| 496 | } |
| 497 | free(gb->by_id); |
| 498 | if (gb->nodes_by_label) { |
| 499 | cbm_ht_foreach(gb->nodes_by_label, free_node_array, NULL); |
| 500 | cbm_ht_free(gb->nodes_by_label); |
| 501 | } |
| 502 | if (gb->nodes_by_name) { |
| 503 | cbm_ht_foreach(gb->nodes_by_name, free_node_array, NULL); |
| 504 | cbm_ht_free(gb->nodes_by_name); |
| 505 | } |
| 506 | if (gb->edge_by_key) { |
| 507 | cbm_ht_foreach(gb->edge_by_key, free_key_only, NULL); |
| 508 | cbm_ht_free(gb->edge_by_key); |
| 509 | } |
| 510 | if (gb->edges_by_source_type) { |
| 511 | cbm_ht_foreach(gb->edges_by_source_type, free_edge_array, NULL); |
| 512 | cbm_ht_free(gb->edges_by_source_type); |
| 513 | } |
| 514 | if (gb->edges_by_target_type) { |
| 515 | cbm_ht_foreach(gb->edges_by_target_type, free_edge_array, NULL); |
| 516 | cbm_ht_free(gb->edges_by_target_type); |
| 517 | } |
| 518 | if (gb->edges_by_type) { |
| 519 | cbm_ht_foreach(gb->edges_by_type, free_edge_array, NULL); |
| 520 | cbm_ht_free(gb->edges_by_type); |
| 521 | } |
| 522 | |
| 523 | /* Free vector storage */ |
| 524 | for (int i = 0; i < gb->dump_vector_count; i++) { |
| 525 | free((void *)gb->dump_vectors[i].vector); |
| 526 | } |
| 527 | free(gb->dump_vectors); |
| 528 | |
| 529 | /* Free token vector storage */ |