Skip to content

refactor(transaction): replace sentinel head node with is_default flag (v14) #554

Description

@satwareAG-ironMike

Background

The tr_list sentinel head node pattern (documented in PR #553, issues #523/#541) is a design debt that should be refactored in v14.

Currently, index 0 of tr_list is reserved for the default transaction via a placeholder node (trans=NULL). The destruction path (_php_fbird_commit_link) uses positional i==0 logic to distinguish default vs explicit transactions.

This is fragile because:

Proposed refactor: Option B

Add an explicit is_default flag to fbird_tr_list:

typedef struct tr_list {
    fbird_transaction *trans;
    bool is_default;   /* replaces the positional i==0 convention */
    struct tr_list *next;
} fbird_tr_list;

Then:

  • Remove all 5 placeholder allocations
  • _php_fbird_commit_link(): replace if (i == 0) with if (p->is_default)
  • _php_fbird_def_trans(): walk list looking for is_default == true (or allocate new default node)
  • _php_fbird_trans_end(): replace tr_list->trans == NULL with "no node with is_default == true"
  • fbird_inspection.c: replace *l == tr_list (first node) with (*l)->is_default

Files to touch

File Lines Change
php_fbird_includes.h:133-136 struct definition Add is_default field
fbird_connection.c:86-128 _php_fbird_commit_link Replace i==0 with is_default
fbird_inspection.c:236-245 transaction cleanup Replace first-node check with is_default
fbird_transaction.c:954-1018 _php_fbird_def_trans Walk list for is_default
fbird_transaction.c:1037,1070,1079 _php_fbird_trans_end Update default-tx check
fbird_query_prepare.c:235-236 autocommit cleanup Replace tr_list->trans == ... with is_default check
firebird.c:1500-1504 fbird_reconnect_transaction Remove placeholder
fbird_transaction.c:367-372 fbird_trans_start Remove placeholder
fbird_transaction.c:937-941 fbird_trans multi-link Remove placeholder
fbird_transaction.c:963-966 _php_fbird_def_trans Remove placeholder
fbird_query_exec.c:190-194 _php_fbird_exec Remove placeholder

Acceptance criteria

  • All 5 placeholder allocations removed
  • is_default flag added to fbird_tr_list struct
  • All 6 dependent sites updated to use is_default instead of positional logic
  • tests/transaction_default_slot.phpt still passes (regression check)
  • tests/issue119.phpt still passes
  • tests/issue307_trans_start_nullable_options.phpt still passes
  • CI green on all 12 jobs (PHP 8.2-8.5 x FB 3/4/5)
  • No new ASan/LSan/TSan warnings

References

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions